Chi-Tech
sldfe_sq_01c_develop_ldfe.cc
Go to the documentation of this file.
1#include "sldfe_sq.h"
2
3#include <map>
4
5//###################################################################
6/**Develops LDFE quantities.*/
10{
11 //============================================= Determine sq tilde center
12 chi_mesh::Vertex sq_tilde_center;
13 for (const auto& v : sq.vertices_xy_tilde)
14 sq_tilde_center += v;
15 sq_tilde_center/=4;
16
17 //============================================= Determine off-set vectors
18 auto& vc = sq_tilde_center;
19 std::array<chi_mesh::Vector3,4> vctoi;
20 for (int v=0;v<4;++v)
21 vctoi[v] = sq.vertices_xy_tilde[v] - vc;
22
23 //============================================= Determine sub-sub-squares
24 std::array<std::array<chi_mesh::Vertex,4>,4> sub_sub_square_xy_tilde;
25 std::map<std::string,chi_mesh::Vertex> vm;
26
27 for (int v=0;v<4;++v) vm[std::to_string(v)] = sq.vertices_xy_tilde[v];
28
29 vm["01"] = 0.5*(sq.vertices_xy_tilde[0]+sq.vertices_xy_tilde[1]);
30 vm["12"] = 0.5*(sq.vertices_xy_tilde[1]+sq.vertices_xy_tilde[2]);
31 vm["23"] = 0.5*(sq.vertices_xy_tilde[2]+sq.vertices_xy_tilde[3]);
32 vm["03"] = 0.5*(sq.vertices_xy_tilde[0]+sq.vertices_xy_tilde[3]);
33 vm["c"] = sq_tilde_center;
34
35 auto& sst = sub_sub_square_xy_tilde;
36 sst[0] = {vm["0"],vm["01"],vm["c"],vm["03"]};
37 sst[1] = {vm["01"],vm["1"],vm["12"],vm["c"]};
38 sst[2] = {vm["c"],vm["12"],vm["2"],vm["23"]};
39 sst[3] = {vm["03"],vm["c"],vm["23"],vm["3"]};
40
41 //============================================= Determine sub-sub-square
42 // xyz
43 std::array<std::array<chi_mesh::Vertex,4>,4> sub_sub_square_xyz;
44 for (int i=0; i<4; ++i)
45 for (int j=0; j<4; ++j)
46 sub_sub_square_xyz[i][j] =
47 (sq.rotation_matrix*sub_sub_square_xy_tilde[i][j] +
49
50 //============================================= Compute sub-sub-square area
51 std::array<double,4> SA_i = {0.0,0.0,0.0,0.0};
52 for (int i=0; i<4; ++i)
53 SA_i[i] = ComputeSphericalQuadrilateralArea(sub_sub_square_xyz[i]);
54
55 //============================================= Apply optimization
57 for (int i=0; i<4; ++i)
58 {
59 for (int j=0; j<4; ++j)
60 sq.sub_sqr_points[i] += sub_sub_square_xyz[i][j];
61 sq.sub_sqr_points[i] /= 4.0;
62 sq.sub_sqr_points[i].Normalize();
63
64 sq.sub_sqr_weights[i] = SA_i[i];
65 }//for i
67 EmpiricalQPOptimization(sq,legendre,vc,vctoi,SA_i);
69 IsolatedQPOptimization(sq,legendre,vc,vctoi,SA_i);
70
71}
72
void DevelopSQLDFEValues(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre)
static double ComputeSphericalQuadrilateralArea(std::array< chi_mesh::Vertex, 4 > &vertices_xyz)
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)
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)
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
Vector3 Normalized() const