Chi-Tech
sldfe_sq_04_locally_refine.cc
Go to the documentation of this file.
1#include "sldfe_sq.h"
2
3#include <map>
4#include "chi_runtime.h"
5#include "chi_log.h"
6
8
9//###################################################################
10/**Split a SQ.*/
11std::array<chi_math::SimplifiedLDFESQ::SphericalQuadrilateral,4>
15{
16 std::array<SphericalQuadrilateral,4> new_sqs;
17
18 //============================================= Determine sq tilde center
19 chi_mesh::Vertex sq_tilde_center;
20 for (const auto& v : sq.vertices_xy_tilde)
21 sq_tilde_center += v;
22 sq_tilde_center/=4;
23
24 //============================================= Determine sub-sub-squares
25 // Tilde coordinates
26 std::array<std::array<chi_mesh::Vertex,4>,4> sub_sub_square_xy_tilde;
27 std::map<std::string,chi_mesh::Vertex> vm;
28
29 for (int v=0;v<4;++v) vm[std::to_string(v)] = sq.vertices_xy_tilde[v];
30
31 vm["01"] = 0.5*(sq.vertices_xy_tilde[0]+sq.vertices_xy_tilde[1]);
32 vm["12"] = 0.5*(sq.vertices_xy_tilde[1]+sq.vertices_xy_tilde[2]);
33 vm["23"] = 0.5*(sq.vertices_xy_tilde[2]+sq.vertices_xy_tilde[3]);
34 vm["03"] = 0.5*(sq.vertices_xy_tilde[0]+sq.vertices_xy_tilde[3]);
35 vm["c"] = sq_tilde_center;
36
37 auto& sst = sub_sub_square_xy_tilde;
38 sst[0] = {vm["0"],vm["01"],vm["c"],vm["03"]};
39 sst[1] = {vm["01"],vm["1"],vm["12"],vm["c"]};
40 sst[2] = {vm["c"],vm["12"],vm["2"],vm["23"]};
41 sst[3] = {vm["03"],vm["c"],vm["23"],vm["3"]};
42
43 for (int i=0; i<4; ++i)
44 new_sqs[i].vertices_xy_tilde = sst[i];
45
46 //============================================= Determine xyz-prime
47 for (int i=0; i<4; ++i)
48 for (int v=0; v<4; ++v)
49 new_sqs[i].vertices_xyz_prime[v] = sq.rotation_matrix*sst[i][v] +
51
52 //============================================= Compute xyz
53 for (int i=0; i<4; ++i)
54 for (int v=0; v<4; ++v)
55 new_sqs[i].vertices_xyz[v] = new_sqs[i].vertices_xyz_prime[v].Normalized();
56
57 //============================================= Compute SQ xyz-centroid,
58 // R,T,area, ldfe
59 for (int i=0; i<4; ++i)
60 {
61 for (int v=0; v<4; ++v)
62 new_sqs[i].centroid_xyz += new_sqs[i].vertices_xyz[v];
63 new_sqs[i].centroid_xyz /= 4;
64 new_sqs[i].centroid_xyz = new_sqs[i].centroid_xyz.Normalized()*sq.octant_modifier;
65
66 new_sqs[i].rotation_matrix = sq.rotation_matrix;
67 new_sqs[i].translation_vector = sq.translation_vector;
68
69 new_sqs[i].area = ComputeSphericalQuadrilateralArea(new_sqs[i].vertices_xyz);
70 DevelopSQLDFEValues(new_sqs[i],legendre);
71 new_sqs[i].octant_modifier = sq.octant_modifier;
72
73 for (int v=0; v<4; ++v)
74 {
75 new_sqs[i].vertices_xyz[v] = new_sqs[i].vertices_xyz[v]*sq.octant_modifier;
76 new_sqs[i].sub_sqr_points[v] = new_sqs[i].sub_sqr_points[v]*sq.octant_modifier;
77 }
78 }
79
80 return new_sqs;
81}
82
83//###################################################################
84/**Locally refines the cells.*/
87 const double cone_size,
88 const bool dir_as_plane_normal)
89{
90 auto ref_dir_n = ref_dir.Normalized();
91 double mu_cone = cos(cone_size);
92 std::vector<SphericalQuadrilateral> new_deployment;
93 new_deployment.reserve(deployed_SQs_.size());
94
96
97 int num_refined = 0;
98 for (auto& sq : deployed_SQs_)
99 {
100 bool sq_to_be_split = false;
101
102 if (not dir_as_plane_normal)
103 sq_to_be_split = sq.centroid_xyz.Dot(ref_dir_n)>mu_cone;
104 else
105 sq_to_be_split = std::fabs(sq.centroid_xyz.Dot(ref_dir_n)) <
106 (sin(cone_size));
107
108 if (not sq_to_be_split)
109 new_deployment.push_back(sq);
110 else
111 {
112 auto new_sqs = SplitSQ(sq,legendre);
113 for (auto& nsq : new_sqs)
114 new_deployment.push_back(nsq);
115 ++num_refined;
116 }
117 }
118
119 deployed_SQs_.clear();
120 deployed_SQs_ = new_deployment;
121 deployed_SQs_history_.push_back(new_deployment);
122
123 PopulateQuadratureAbscissae();
124
125 Chi::log.Log() << "SLDFESQ refined " << num_refined << " SQs.";
126}
static chi::ChiLog & log
Definition: chi_runtime.h:81
LogStream Log(LOG_LVL level=LOG_0)
Definition: chi_log.cc:35
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::array< SphericalQuadrilateral, 4 > SplitSQ(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre)
std::array< chi_mesh::Vertex, 4 > vertices_xy_tilde
On square.
Definition: sldfe_sq.h:37
Vector3 Normalized() const