Chi-Tech
sldfe_sq.h
Go to the documentation of this file.
1#ifndef QUADRATURE_SLDFESQ_H
2#define QUADRATURE_SLDFESQ_H
3
4#include "mesh/chi_mesh.h"
5
6#include "math/chi_math.h"
10#include "math/dynamic_matrix.h"
11
12#include <vector>
13#include <array>
14
15namespace chi_math
16{
17 namespace SimplifiedLDFESQ
18 {
21 class Quadrature;
22
23 //####################################################### Util Func
24 /**Base Functor to inherit from to change the function
25 * to integrate in one of the integration utilities.*/
27 {virtual double operator()(double mu, double eta, double xi)
28 {return 0.0;}};
29 }
30}
31
32//################################################################### Util Func
33/**Serves as a general data structure for a
34 * spherical quadrilateral (SQ).*/
36{
37 std::array<chi_mesh::Vertex,4> vertices_xy_tilde; ///< On square
38 std::array<chi_mesh::Vertex,4> vertices_xyz_prime; ///< On cube face
39 std::array<chi_mesh::Vertex,4> vertices_xyz; ///< On unit sphere
41
44
45 std::array<chi_mesh::Vector3,4> sub_sqr_points;
46 std::array<double,4> sub_sqr_weights;
47
48 double area = 0.0;
49
51};
52
53//################################################################### Class def
54/** Piecewise-linear Finite element quadrature using quadrilaterals.*/
56{
57public:
59 {
60 CENTROID,
61 EMPIRICAL,
62 ISOLATED,
63// MULTI_VARIATE_SECANT
64 };
68
69private:
70 static constexpr double a = 0.57735026919; ///< Inscribed cude side length
72 std::vector<chi_mesh::Vector3> diagonal_vertices_;
73 std::vector<SphericalQuadrilateral> initial_octant_SQs_;
74public:
75 std::vector<SphericalQuadrilateral> deployed_SQs_;
76private:
77 std::vector<std::vector<SphericalQuadrilateral>> deployed_SQs_history_;
78public:
82 {}
83
84 virtual ~Quadrature()
85 {}
86
87 //01
88 void GenerateInitialRefinement(int level);
89
90private:
91 //01a
92 void GenerateDiagonalSpacings(int level);
93
94 //01b
95 void
97 const chi_mesh::Matrix3x3& rotation_matrix,
98 const chi_mesh::Vector3& translation,
99 int level);
100
101 //01c
104
105 //01c_a
109 chi_mesh::Vertex& sq_xy_tilde_centroid,
110 std::array<chi_mesh::Vector3, 4>& radii_vectors_xy_tilde,
111 std::array<double,4>& sub_sub_sqr_areas);
112
113 //01c_b
117 chi_mesh::Vertex& sq_xy_tilde_centroid,
118 std::array<chi_mesh::Vector3, 4>& radii_vectors_xy_tilde,
119 std::array<double,4>& sub_sub_sqr_areas);
120
121 //01d utilities
123 std::array<chi_mesh::Vertex,4>& vertices_xyz);
124
125 static std::array<double,4> IntegrateLDFEShapeFunctions(
126 const SphericalQuadrilateral& sq,
127 std::array<chi_math::DynamicVector<double>,4> &shape_coeffs,
128 const std::vector<chi_math::QuadraturePointXYZ>& legendre_qpoints,
129 const std::vector<double>& legendre_qweights);
130
131 void CopyToAllOctants();
132
134
135 //02
136private:
137 double RiemannIntegral(BaseFunctor* F,int Ni=20000);
139
140public:
141 void TestIntegration(int test_case,double ref_solution,int RiemannN=0);
142
143 //03
144public:
146
147 //04
148public:
149 void LocallyRefine(const chi_mesh::Vector3& ref_dir,
150 const double cone_size,
151 const bool dir_as_plane_normal=false);
152
153private:
154 std::array<SphericalQuadrilateral,4>
157};
158
159//################################################################### Util Func
160/**This is a utility function that encapsulates
161 * all the necessary functionality to determine shape
162 * function coefficients and integrate accross a
163 * spherical quadrilateral.*/
165{
168 std::array<chi_mesh::Vector3,4>& radii_vectors_xy_tilde;
170
171 std::array<chi_math::DynamicVector<double>,4> rhs;
174 std::array<chi_math::DynamicVector<double>, 4> c_coeffs;
175 std::vector<chi_math::QuadraturePointXYZ>& lqp; //Legendre quadrature points
176 std::vector<double>& lqw; //Legendre quadrature weights
177
180 chi_mesh::Vertex& in_centroid_xy_tilde,
181 std::array<chi_mesh::Vector3, 4>& in_radii_vectors_xy_tilde,
183 chi_math::QuadratureGaussLegendre& in_legendre_quadrature) :
184 sldfesq(in_sldfesq),
185 centroid_xy_tilde(in_centroid_xy_tilde),
186 radii_vectors_xy_tilde(in_radii_vectors_xy_tilde),
187 sq(in_sq),
188 A(4,4),
189 A_inv(4,4),
190 lqp(in_legendre_quadrature.qpoints_),
191 lqw(in_legendre_quadrature.weights_)
192 {
193 //============================ Init RHS
194 for (int i=0;i<4;++i)
195 {
196 rhs[i] = std::vector<double>(4);
197 c_coeffs[i] = std::vector<double>(4);
198 for (int j=0;j<4;++j)
199 rhs[i][i] = 1.0;
200 }
201 }
202
203 //###########################################
204 /**Computes the quadrature point locations
205 * from rho, followed by the shape-function coefficients and
206 * then the integral of the shape function to get the weights.*/
207 std::array<double,4> operator()(const chi_math::DynamicVector<double>& rho)
208 {
209 //=============================== Determine qpoints from rho
210 std::array<chi_mesh::Vector3,4> qpoints;
211 for (int i=0; i<4; ++i)
212 {
213 auto xy_tilde = centroid_xy_tilde + rho[i]*radii_vectors_xy_tilde[i];
214 auto xyz_prime = sq.rotation_matrix*xy_tilde + sq.translation_vector;
215 qpoints[i] = xyz_prime.Normalized();
216 }
217
218 //=============================== Assemble A
219 for (int i=0;i<4;++i)
220 A[i] = {1.0,qpoints[i][0],qpoints[i][1],qpoints[i][2]};
221
222 //=============================== Compute A-inverse
224
225 //=============================== Compute coefficients
226 for (int i=0;i<4;++i)
227 c_coeffs[i] = A_inv*rhs[i];
228
230 }
231};
232
233
234#endif
std::vector< std::vector< NumberFormat > > elements_
std::vector< SphericalQuadrilateral > initial_octant_SQs_
Definition: sldfe_sq.h:73
void DevelopSQLDFEValues(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre)
void LocallyRefine(const chi_mesh::Vector3 &ref_dir, const double cone_size, const bool dir_as_plane_normal=false)
static double ComputeSphericalQuadrilateralArea(std::array< chi_mesh::Vertex, 4 > &vertices_xyz)
std::vector< std::vector< SphericalQuadrilateral > > deployed_SQs_history_
Definition: sldfe_sq.h:77
void GenerateReferenceFaceVertices(const chi_mesh::Matrix3x3 &rotation_matrix, const chi_mesh::Vector3 &translation, int level)
std::array< SphericalQuadrilateral, 4 > SplitSQ(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre)
QuadraturePointOptimization qp_optimization_type_
Definition: sldfe_sq.h:65
void EmpiricalQPOptimization(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre, chi_mesh::Vertex &sq_xy_tilde_centroid, std::array< chi_mesh::Vector3, 4 > &radii_vectors_xy_tilde, std::array< double, 4 > &sub_sub_sqr_areas)
double RiemannIntegral(BaseFunctor *F, int Ni=20000)
std::vector< SphericalQuadrilateral > deployed_SQs_
Definition: sldfe_sq.h:75
std::vector< chi_mesh::Vector3 > diagonal_vertices_
Definition: sldfe_sq.h:72
static std::array< double, 4 > IntegrateLDFEShapeFunctions(const SphericalQuadrilateral &sq, std::array< chi_math::DynamicVector< double >, 4 > &shape_coeffs, const std::vector< chi_math::QuadraturePointXYZ > &legendre_qpoints, const std::vector< double > &legendre_qweights)
void TestIntegration(int test_case, double ref_solution, int RiemannN=0)
void IsolatedQPOptimization(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre, chi_mesh::Vertex &sq_xy_tilde_centroid, std::array< chi_mesh::Vector3, 4 > &radii_vectors_xy_tilde, std::array< double, 4 > &sub_sub_sqr_areas)
static constexpr double a
Inscribed cude side length.
Definition: sldfe_sq.h:70
MatDbl Inverse(const MatDbl &A)
virtual double operator()(double mu, double eta, double xi)
Definition: sldfe_sq.h:27
std::array< chi_math::DynamicVector< double >, 4 > rhs
Definition: sldfe_sq.h:171
chi_math::DynamicMatrix< double > A_inv
Definition: sldfe_sq.h:173
std::array< chi_mesh::Vector3, 4 > & radii_vectors_xy_tilde
Definition: sldfe_sq.h:168
std::vector< chi_math::QuadraturePointXYZ > & lqp
Definition: sldfe_sq.h:175
chi_math::DynamicMatrix< double > A
Definition: sldfe_sq.h:172
FUNCTION_WEIGHT_FROM_RHO(chi_math::SimplifiedLDFESQ::Quadrature &in_sldfesq, chi_mesh::Vertex &in_centroid_xy_tilde, std::array< chi_mesh::Vector3, 4 > &in_radii_vectors_xy_tilde, SphericalQuadrilateral &in_sq, chi_math::QuadratureGaussLegendre &in_legendre_quadrature)
Definition: sldfe_sq.h:178
std::array< chi_math::DynamicVector< double >, 4 > c_coeffs
Definition: sldfe_sq.h:174
std::array< double, 4 > operator()(const chi_math::DynamicVector< double > &rho)
Definition: sldfe_sq.h:207
std::array< chi_mesh::Vertex, 4 > vertices_xyz_prime
On cube face.
Definition: sldfe_sq.h:38
std::array< chi_mesh::Vertex, 4 > vertices_xy_tilde
On square.
Definition: sldfe_sq.h:37
std::array< chi_mesh::Vector3, 4 > sub_sqr_points
Definition: sldfe_sq.h:45
std::array< chi_mesh::Vertex, 4 > vertices_xyz
On unit sphere.
Definition: sldfe_sq.h:39
Vector3 Normalized() const