Chi-Tech
sldfe_sq_01b_ref_face.cc
Go to the documentation of this file.
1#include "sldfe_sq.h"
2
3#include <algorithm>
4
5//###################################################################
6/**Generates the standard points on the reference face.*/
9 const chi_mesh::Matrix3x3& rotation_matrix,
10 const chi_mesh::Vector3& translation,
11 int level)
12{
13 typedef std::vector<chi_mesh::Vertex> VertList;
14
15 int Ns = (level + 1); //Number of subdivisions
16 int Np = Ns + 1; //Number of diagonal points
17
19
20 //============================================= Generate xy_tilde values
21 std::vector<VertList> vertices_xy_tilde_ij;
22 vertices_xy_tilde_ij.resize(Np, VertList(Np));
23 for (int i=0; i<Np; ++i)
24 for (int j=0; j<Np; ++j)
25 vertices_xy_tilde_ij[i][j] = chi_mesh::Vertex(diagonal_vertices_[i].x,
27 0.0);
28
29 //============================================= Generate SQs
30 for (int i=0; i<Ns; ++i)
31 {
32 for (int j=0; j<Ns; ++j)
33 {
35
36 sq.rotation_matrix = rotation_matrix;
37 sq.translation_vector = translation;
38
39 //==================================== Set xy-tilde vertices
40 sq.vertices_xy_tilde[0] = vertices_xy_tilde_ij[i ][j ];
41 sq.vertices_xy_tilde[1] = vertices_xy_tilde_ij[i + 1][j ];
42 sq.vertices_xy_tilde[2] = vertices_xy_tilde_ij[i + 1][j + 1];
43 sq.vertices_xy_tilde[3] = vertices_xy_tilde_ij[i ][j + 1];
44 auto& vxy = sq.vertices_xy_tilde;
45
46 //==================================== Set xyz_prime vertices
47 for (int v=0; v<4; ++v)
48 sq.vertices_xyz_prime[v] = rotation_matrix*vxy[v] + translation;
49
50 //==================================== Set xyz vertices
51 for (int v=0; v<4; ++v)
52 sq.vertices_xyz[v] = sq.vertices_xyz_prime[v].Normalized();
53
54 //==================================== Compute SQ xyz-centroid
55 for (auto& vertex : sq.vertices_xyz)
56 sq.centroid_xyz += vertex;
57 sq.centroid_xyz /= 4;
59
60 auto v0 = sq.centroid_xyz.Normalized();
61 auto v1 = sq.vertices_xyz[0];
62 auto v2 = sq.vertices_xyz[1];
63
64 //==================================== Correction orientation
65 if ((v1-v0).Cross(v2-v0).Dot(v0) < 0.0)
66 {
67 std::reverse(sq.vertices_xy_tilde.begin(),sq.vertices_xy_tilde.end());
68 std::reverse(sq.vertices_xyz_prime.begin(),sq.vertices_xyz_prime.end());
69 std::reverse(sq.vertices_xyz.begin(),sq.vertices_xyz.end());
70 }
71
72 //==================================== Compute area
74
75 //==================================== Set octant modifier
76 sq.octant_modifier = chi_mesh::Vector3(1.0,1.0,1.0);
77
78 //==================================== Develop LDFE values
79 DevelopSQLDFEValues(sq,legendre);
80
81 initial_octant_SQs_.push_back(sq);
82 }//for j
83 }//for i
84}
std::vector< SphericalQuadrilateral > initial_octant_SQs_
Definition: sldfe_sq.h:73
void DevelopSQLDFEValues(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre)
static double ComputeSphericalQuadrilateralArea(std::array< chi_mesh::Vertex, 4 > &vertices_xyz)
void GenerateReferenceFaceVertices(const chi_mesh::Matrix3x3 &rotation_matrix, const chi_mesh::Vector3 &translation, int level)
std::vector< chi_mesh::Vector3 > diagonal_vertices_
Definition: sldfe_sq.h:72
double Dot(const VecDbl &x, const VecDbl &y)
VectorN< 3 > Vector3
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::Vertex, 4 > vertices_xyz
On unit sphere.
Definition: sldfe_sq.h:39
Vector3 Normalized() const