Chi-Tech
pwl_polyhedron_02_xyz_shapefuncs.cc
Go to the documentation of this file.
2
4
6{
7
8// ###################################################################
9/**Returns the evaluation of shape function i at the supplied point.*/
10double
12 const chi_mesh::Vector3& xyz) const
13{
14 for (size_t f = 0; f < face_data_.size(); f++)
15 {
16 for (size_t s = 0; s < face_data_[f].sides.size(); s++)
17 {
18 // Map xyz to xi_eta_zeta
19 const auto& p0 = ref_grid_.vertices[face_data_[f].sides[s].v_index[0]];
20 chi_mesh::Vector3 xyz_ref = xyz - p0;
21
22 chi_mesh::Vector3 xi_eta_zeta = face_data_[f].sides[s].Jinv * xyz_ref;
23
24 double xi = xi_eta_zeta.x;
25 double eta = xi_eta_zeta.y;
26 double zeta = xi_eta_zeta.z;
27
28 // Determine if inside tet
29 if ((xi >= -1.0e-12) and (eta >= -1.0e-12) and (zeta >= -1.0e-12) and
30 ((xi + eta + zeta) <= (1.0 + 1.0e-12)))
31 {
32 double Ni = 0.0;
33 double Nf = 0.0;
34 double Nc = alphac_ * zeta;
35
36 if (node_side_maps_[i].face_map[f].side_map[s].part_of_face)
37 {
38 if (node_side_maps_[i].face_map[f].side_map[s].index == 0)
39 {
40 Ni = 1 - xi - eta - zeta;
41 }
42 if (node_side_maps_[i].face_map[f].side_map[s].index == 2)
43 {
44 Ni = eta;
45 }
46
47 Nf = face_betaf_[f] * xi;
48 }
49
50 return Ni + Nf + Nc;
51 }
52 }
53 }
54 return 0.0;
55}
56
57// ###################################################################
58/**Populates shape_values with the value of each shape function's
59 * value evaluate at the supplied point.*/
61 const chi_mesh::Vector3& xyz, std::vector<double>& shape_values) const
62{
63 shape_values.resize(num_nodes_, 0.0);
64 for (size_t f = 0; f < face_data_.size(); f++)
65 {
66 for (size_t s = 0; s < face_data_[f].sides.size(); s++)
67 {
68 auto& side_fe_info = face_data_[f].sides[s];
69 // Map xyz to xi_eta_zeta
70 const auto& p0 = ref_grid_.vertices[side_fe_info.v_index[0]];
71 chi_mesh::Vector3 xi_eta_zeta = side_fe_info.Jinv * (xyz - p0);
72
73 double xi = xi_eta_zeta.x;
74 double eta = xi_eta_zeta.y;
75 double zeta = xi_eta_zeta.z;
76
77 // Determine if inside tet
78 if ((xi >= -1.0e-12) and (eta >= -1.0e-12) and (zeta >= -1.0e-12) and
79 ((xi + eta + zeta) <= (1.0 + 1.0e-12)))
80 {
81 for (int i = 0; i < num_nodes_; i++)
82 {
83 auto side_map = node_side_maps_[i].face_map[f].side_map[s];
84
85 double Ni = 0.0;
86 double Nf = 0.0;
87 double Nc = alphac_ * zeta;
88
89 if (side_map.part_of_face)
90 {
91 if (side_map.index == 0) Ni = 1 - xi - eta - zeta;
92 else if (side_map.index == 2)
93 Ni = eta;
94
95 Nf = face_betaf_[f] * xi;
96 }
97
98 shape_values[i] = Ni + Nf + Nc;
99 } // for dof
100 return;
101 } // if in tet
102 } // for side
103 } // for face
104}
105
106// ###################################################################
107/**Returns the evaluation of grad-shape function i at the supplied point.*/
109 const chi_mesh::Vector3& xyz) const
110{
111 chi_mesh::Vector3 grad, gradr;
112 for (size_t f = 0; f < face_data_.size(); f++)
113 {
114 for (size_t s = 0; s < face_data_[f].sides.size(); s++)
115 {
116 // Map xyz to xi_eta_zeta
117 const auto& p0 = ref_grid_.vertices[face_data_[f].sides[s].v_index[0]];
118 chi_mesh::Vector3 xyz_ref = xyz - p0;
119
120 chi_mesh::Vector3 xi_eta_zeta = face_data_[f].sides[s].Jinv * xyz_ref;
121
122 double xi = xi_eta_zeta.x;
123 double eta = xi_eta_zeta.y;
124 double zeta = xi_eta_zeta.z;
125
126 // Determine if inside tet
127 if ((xi >= -1.0e-12) and (eta >= -1.0e-12) and (zeta >= -1.0e-12) and
128 ((xi + eta + zeta) <= (1.0 + 1.0e-12)))
129 {
130 chi_mesh::Vector3 grad_i;
131 chi_mesh::Vector3 grad_f;
132 chi_mesh::Vector3 grad_c;
133
134 if (node_side_maps_[i].face_map[f].side_map[s].part_of_face)
135 {
136 if (node_side_maps_[i].face_map[f].side_map[s].index == 0)
137 {
138 grad_i.x = -1.0;
139 grad_i.y = -1.0;
140 grad_i.z = -1.0;
141 }
142 if (node_side_maps_[i].face_map[f].side_map[s].index == 2)
143 {
144 grad_i.x = 0.0;
145 grad_i.y = 1.0;
146 grad_i.z = 0.0;
147 }
148
149 grad_f.x = face_betaf_[f] * 1.0;
150 grad_f.y = face_betaf_[f] * 0.0;
151 grad_f.z = face_betaf_[f] * 0.0;
152 }
153
154 grad_c.x = alphac_ * 0.0;
155 grad_c.y = alphac_ * 0.0;
156 grad_c.z = alphac_ * 1.0;
157
158 grad = (grad_i + grad_f + grad_c);
159 grad = face_data_[f].sides[s].JTinv * grad;
160
161 return grad;
162 }
163 }
164 }
165 return gradr;
166}
167
168// ###################################################################
169/**Populates gradshape_values with the value of each shape function's
170 * gradient evaluated at the supplied point.*/
172 const chi_mesh::Vector3& xyz,
173 std::vector<chi_mesh::Vector3>& gradshape_values) const
174{
175 gradshape_values.clear();
176 for (int i = 0; i < num_nodes_; ++i)
177 gradshape_values.emplace_back(GradShapeValue(i, xyz));
178}
179
180} // namespace chi_math::cell_mapping
const chi_mesh::MeshContinuum & ref_grid_
Definition: CellMapping.h:117
const size_t num_nodes_
Definition: CellMapping.h:120
double ShapeValue(int i, const chi_mesh::Vector3 &xyz) const override
std::vector< FEnodeMap > node_side_maps_
Maps nodes to side tets.
void ShapeValues(const chi_mesh::Vector3 &xyz, std::vector< double > &shape_values) const override
std::vector< FEface_data > face_data_
Holds determinants and data tet-by-tet.
void GradShapeValues(const chi_mesh::Vector3 &xyz, std::vector< chi_mesh::Vector3 > &gradshape_values) const override
chi_mesh::Vector3 GradShapeValue(int i, const chi_mesh::Vector3 &xyz) const override
double x
Element-0.
double y
Element-1.
double z
Element-2.