Chi-Tech
pwl_polyhedron_04_initqpdata.cc
Go to the documentation of this file.
2
4
6{
7
8finite_element::VolumetricQuadraturePointData
10{
11 //=================================== Determine number of internal qpoints
12 size_t num_tets = 0;
13 for (auto& face : face_data_)
14 num_tets += face.sides.size();
15
16 size_t num_vol_qpoints = volume_quadrature_.qpoints_.size();
17 size_t ttl_num_vol_qpoints = num_tets * num_vol_qpoints;
18
19 //=================================== Declare necessary vars
20 std::vector<unsigned int> V_quadrature_point_indices;
21 VecVec3 V_qpoints_xyz;
22 std::vector<VecDbl> V_shape_value;
23 std::vector<VecVec3> V_shape_grad;
24 VecDbl V_JxW;
25 size_t V_num_nodes;
26
27 //=================================== Init volumetric quadrature
28 V_quadrature_point_indices.reserve(ttl_num_vol_qpoints);
29 for (unsigned int qp = 0; qp < ttl_num_vol_qpoints; ++qp)
30 V_quadrature_point_indices.push_back(qp);
31
32 V_shape_value.reserve(num_nodes_);
33 V_shape_grad.reserve(num_nodes_);
34 for (size_t i = 0; i < num_nodes_; i++)
35 {
36 VecDbl node_shape_value;
37 VecVec3 node_shape_grad;
38
39 node_shape_value.reserve(ttl_num_vol_qpoints);
40 node_shape_grad.reserve(ttl_num_vol_qpoints);
41
42 for (size_t f = 0; f < face_data_.size(); f++)
43 {
44 for (size_t s = 0; s < face_data_[f].sides.size(); s++)
45 {
46 for (const auto& qpoint : volume_quadrature_.qpoints_)
47 {
48 node_shape_value.push_back(FaceSideShape(f, s, i, qpoint));
49 node_shape_grad.emplace_back(FaceSideGradShape_x(f, s, i), // x
50 FaceSideGradShape_y(f, s, i), // y
51 FaceSideGradShape_z(f, s, i)); // z
52 } // for qp
53 } // for side
54 } // for face
55
56 V_shape_value.push_back(node_shape_value);
57 V_shape_grad.push_back(node_shape_grad);
58 } // for i
59
60 V_JxW.reserve(ttl_num_vol_qpoints);
61 V_qpoints_xyz.reserve(ttl_num_vol_qpoints);
62 for (const auto& face : face_data_)
63 {
64 for (const auto& side : face.sides)
65 {
66 for (size_t qp = 0; qp < num_vol_qpoints; ++qp)
67 {
68 const auto w = volume_quadrature_.weights_[qp];
69 V_JxW.push_back(side.detJ * w);
70
71 const auto& qp_xyz_tilde = volume_quadrature_.qpoints_[qp];
72 V_qpoints_xyz.push_back(side.v0 + side.J * qp_xyz_tilde);
73 } // for qp
74 } // for side
75 } // for face
76
77 V_num_nodes = num_nodes_;
78
79 return finite_element::VolumetricQuadraturePointData(V_quadrature_point_indices,
80 V_qpoints_xyz,
81 V_shape_value,
82 V_shape_grad,
83 V_JxW,
85 V_num_nodes);
86}
87
90{
91 const bool ON_SURFACE = true;
92
93 //=================================== Init surface quadrature
94 size_t num_srf_qpoints = surface_quadrature_.qpoints_.size();
95
96 unsigned int f = face_index;
97 //=================================== Declare necessary vars
98 std::vector<unsigned int> F_quadrature_point_indices;
99 VecVec3 F_qpoints_xyz;
100 std::vector<VecDbl> F_shape_value;
101 std::vector<VecVec3> F_shape_grad;
102 VecDbl F_JxW;
103 VecVec3 F_normals;
104 size_t F_num_nodes;
105
106 size_t num_tris = face_data_[f].sides.size();
107 size_t ttl_num_face_qpoints = num_tris * num_srf_qpoints;
108
109 F_quadrature_point_indices.reserve(ttl_num_face_qpoints);
110 for (unsigned int qp = 0; qp < ttl_num_face_qpoints; ++qp)
111 F_quadrature_point_indices.push_back(qp);
112
113 F_normals.reserve(ttl_num_face_qpoints);
114 for (size_t qp = 0; qp < ttl_num_face_qpoints; ++qp)
115 F_normals.push_back(face_data_[f].normal);
116
117 F_shape_value.reserve(num_nodes_);
118 F_shape_grad.reserve(num_nodes_);
119 for (size_t i = 0; i < num_nodes_; i++)
120 {
121 VecDbl node_shape_value;
122 VecVec3 node_shape_grad;
123
124 node_shape_value.reserve(ttl_num_face_qpoints);
125 node_shape_grad.reserve(ttl_num_face_qpoints);
126
127 for (size_t s = 0; s < face_data_[f].sides.size(); s++)
128 {
129 for (const auto& qpoint : surface_quadrature_.qpoints_)
130 {
131 node_shape_value.push_back(FaceSideShape(f, s, i, qpoint, ON_SURFACE));
132 node_shape_grad.emplace_back(FaceSideGradShape_x(f, s, i), // x
133 FaceSideGradShape_y(f, s, i), // y
134 FaceSideGradShape_z(f, s, i)); // z
135 } // for qp
136 } // for s
137 F_shape_value.push_back(node_shape_value);
138 F_shape_grad.push_back(node_shape_grad);
139 } // for i
140
141 F_JxW.reserve(ttl_num_face_qpoints);
142 F_qpoints_xyz.reserve(ttl_num_face_qpoints);
143 for (const auto& side : face_data_[f].sides)
144 for (size_t qp = 0; qp < num_srf_qpoints; ++qp)
145 {
146 const auto w = surface_quadrature_.weights_[qp];
147 F_JxW.push_back(side.detJ_surf * w);
148
149 const auto& qp_xyz_tilde = surface_quadrature_.qpoints_[qp];
150 F_qpoints_xyz.push_back(side.v0 + side.J * qp_xyz_tilde);
151 }
152
153 F_num_nodes = face_data_[f].sides.size();
154
155 return finite_element::SurfaceQuadraturePointData(F_quadrature_point_indices,
156 F_qpoints_xyz,
157 F_shape_value,
158 F_shape_grad,
159 F_JxW,
160 F_normals,
162 F_num_nodes);
163}
164
165} // namespace chi_math::cell_mapping
const std::vector< std::vector< int > > face_node_mappings_
Definition: CellMapping.h:130
const size_t num_nodes_
Definition: CellMapping.h:120
std::vector< chi_math::QuadraturePointXYZ > qpoints_
Definition: quadrature.h:37
std::vector< double > weights_
Definition: quadrature.h:38
std::vector< FEface_data > face_data_
Holds determinants and data tet-by-tet.
finite_element::SurfaceQuadraturePointData MakeSurfaceQuadraturePointData(size_t face_index) const override
finite_element::VolumetricQuadraturePointData MakeVolumetricQuadraturePointData() const override
double FaceSideGradShape_y(uint32_t face_index, uint32_t side_index, uint32_t i) const
double FaceSideShape(uint32_t face_index, uint32_t side_index, uint32_t i, const chi_mesh::Vector3 &qpoint, bool on_surface=false) const
double FaceSideGradShape_x(uint32_t face_index, uint32_t side_index, uint32_t i) const
double FaceSideGradShape_z(uint32_t face_index, uint32_t side_index, uint32_t i) const