Chi-Tech
pwl_polygon_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_tris = sides_.size();
13 size_t num_vol_qpoints = volume_quadrature_.qpoints_.size();
14 size_t ttl_num_vol_qpoints = num_tris * num_vol_qpoints;
15
16 //=================================== Declare necessary vars
17 std::vector<unsigned int> V_quadrature_point_indices;
18 VecVec3 V_qpoints_xyz;
19 std::vector<VecDbl> V_shape_value;
20 std::vector<VecVec3> V_shape_grad;
21 VecDbl V_JxW;
22 size_t V_num_nodes;
23
24 //=================================== Init volumetric quadrature
25 V_quadrature_point_indices.reserve(ttl_num_vol_qpoints);
26 for (unsigned int qp = 0; qp < ttl_num_vol_qpoints; ++qp)
27 V_quadrature_point_indices.push_back(qp);
28
29 V_shape_value.reserve(num_nodes_);
30 V_shape_grad.reserve(num_nodes_);
31 for (size_t i = 0; i < num_nodes_; i++)
32 {
33 VecDbl node_shape_value;
34 VecVec3 node_shape_grad;
35
36 node_shape_value.reserve(ttl_num_vol_qpoints);
37 node_shape_grad.reserve(ttl_num_vol_qpoints);
38
39 for (size_t s = 0; s < sides_.size(); s++)
40 {
41 for (const auto& qpoint : volume_quadrature_.qpoints_)
42 {
43 node_shape_value.push_back(SideShape(s, i, qpoint));
44 node_shape_grad.emplace_back(SideGradShape_x(s, i), // x
45 SideGradShape_y(s, i), // y
46 0.0); // z
47 } // for qp
48 } // for side
49
50 V_shape_value.push_back(node_shape_value);
51 V_shape_grad.push_back(node_shape_grad);
52 } // for i
53
54 V_JxW.reserve(ttl_num_vol_qpoints);
55 V_qpoints_xyz.reserve(ttl_num_vol_qpoints);
56 for (const auto& side : sides_)
57 {
58 for (size_t qp = 0; qp < num_vol_qpoints; ++qp)
59 {
60 const auto w = volume_quadrature_.weights_[qp];
61 V_JxW.push_back(side.detJ * w);
62
63 const auto& qp_xyz_tilde = volume_quadrature_.qpoints_[qp];
64 V_qpoints_xyz.push_back(side.v0 + side.J * qp_xyz_tilde);
65 } // for qp
66 } // for side
67
68 V_num_nodes = num_nodes_;
69
70 return finite_element::VolumetricQuadraturePointData(V_quadrature_point_indices,
71 V_qpoints_xyz,
72 V_shape_value,
73 V_shape_grad,
74 V_JxW,
76 V_num_nodes);
77}
78
81{
82 const bool ON_SURFACE = true;
83
84 //=================================== Init surface quadrature
85 size_t num_srf_qpoints = surface_quadrature_.qpoints_.size();
86
87 unsigned int s = face_index;
88 //=================================== Declare necessary vars
89 std::vector<unsigned int> F_quadrature_point_indices;
90 VecVec3 F_qpoints_xyz;
91 std::vector<VecDbl> F_shape_value;
92 std::vector<VecVec3> F_shape_grad;
93 VecDbl F_JxW;
94 VecVec3 F_normals;
95 size_t F_num_nodes;
96
97 size_t ttl_num_face_qpoints = num_srf_qpoints;
98
99 F_quadrature_point_indices.reserve(ttl_num_face_qpoints);
100 for (unsigned int qp = 0; qp < ttl_num_face_qpoints; ++qp)
101 F_quadrature_point_indices.push_back(qp);
102
103 F_normals.reserve(ttl_num_face_qpoints);
104 for (size_t qp = 0; qp < ttl_num_face_qpoints; ++qp)
105 F_normals.push_back(sides_[s].normal);
106
107 F_shape_value.reserve(num_nodes_);
108 F_shape_grad.reserve(num_nodes_);
109 for (size_t i = 0; i < num_nodes_; i++)
110 {
111 VecDbl node_shape_value;
112 VecVec3 node_shape_grad;
113
114 node_shape_value.reserve(ttl_num_face_qpoints);
115 node_shape_grad.reserve(ttl_num_face_qpoints);
116
117 for (const auto& qpoint : surface_quadrature_.qpoints_)
118 {
119 node_shape_value.push_back(SideShape(s, i, qpoint, ON_SURFACE));
120 node_shape_grad.emplace_back(SideGradShape_x(s, i), // x
121 SideGradShape_y(s, i), // y
122 0.0); // z
123 } // for qp
124 F_shape_value.push_back(node_shape_value);
125 F_shape_grad.push_back(node_shape_grad);
126 } // for i
127
128 F_JxW.reserve(ttl_num_face_qpoints);
129 F_qpoints_xyz.reserve(ttl_num_face_qpoints);
130 for (size_t qp = 0; qp < num_srf_qpoints; ++qp)
131 {
132 const auto w = surface_quadrature_.weights_[qp];
133 F_JxW.push_back(sides_[s].detJ_surf * w);
134
135 const auto& qp_xyz_tilde = surface_quadrature_.qpoints_[qp];
136 F_qpoints_xyz.push_back(sides_[s].v0 + sides_[s].J * qp_xyz_tilde);
137 }
138
139 F_num_nodes = 2;
140
141 return finite_element::SurfaceQuadraturePointData(F_quadrature_point_indices,
142 F_qpoints_xyz,
143 F_shape_value,
144 F_shape_grad,
145 F_JxW,
146 F_normals,
148 F_num_nodes);
149}
150
151} // 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
double SideShape(uint32_t side, uint32_t i, const chi_mesh::Vector3 &qpoint, bool on_surface=false) const
finite_element::SurfaceQuadraturePointData MakeSurfaceQuadraturePointData(size_t face_index) const override
finite_element::VolumetricQuadraturePointData MakeVolumetricQuadraturePointData() const override