12 #include "MooseError.h"
13 #include "Conversion.h"
24 const unsigned int * permutation_ids,
26 std::vector<Point> & points,
27 std::vector<Real> & weights)
33 unsigned int total_pts = 0;
34 for (
unsigned int p = 0; p < n_wts; ++p)
35 total_pts += permutation_ids[p];
38 points.resize(total_pts);
39 weights.resize(total_pts);
42 unsigned int offset = 0;
43 for (
unsigned int p = 0; p < n_wts; ++p)
45 switch (permutation_ids[p])
51 points[offset + 0] = Point(1.0L / 3.0L, 1.0L / 3.0L);
52 weights[offset + 0] = wts[p];
61 points[offset + 0] = Point(a[p], a[p]);
62 points[offset + 1] = Point(a[p], 1.L - 2.L * a[p]);
63 points[offset + 2] = Point(1.L - 2.L * a[p], a[p]);
65 for (
unsigned int j = 0; j < 3; ++j)
66 weights[offset + j] = wts[p];
75 points[offset + 0] = Point(a[p], b[p]);
76 points[offset + 1] = Point(b[p], a[p]);
77 points[offset + 2] = Point(a[p], 1.L - a[p] - b[p]);
78 points[offset + 3] = Point(1.L - a[p] - b[p], a[p]);
79 points[offset + 4] = Point(b[p], 1.L - a[p] - b[p]);
80 points[offset + 5] = Point(1.L - a[p] - b[p], b[p]);
82 for (
unsigned int j = 0; j < 6; ++j)
83 weights[offset + j] = wts[p];
90 mooseError(
"Unknown permutation id: ", permutation_ids[p],
"!");
96 stdQuadr2D(
unsigned int nen,
unsigned int iord, std::vector<std::vector<Real>> & sg2)
101 Real lr4[4] = {-1.0, 1.0, -1.0, 1.0};
102 Real lz4[4] = {-1.0, -1.0, 1.0, 1.0};
103 Real lr9[9] = {-1.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0};
104 Real lz9[9] = {-1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0};
105 Real lw9[9] = {25.0, 40.0, 25.0, 40.0, 64.0, 40.0, 25.0, 40.0, 25.0};
120 for (
unsigned int i = 0; i < 4; ++i)
122 for (
unsigned int i = 0; i < 4; ++i)
124 sg2[i][0] = (1 / sqrt(3)) * lr4[i];
125 sg2[i][1] = (1 / sqrt(3)) * lz4[i];
132 for (
unsigned int i = 0; i < 9; ++i)
134 for (
unsigned int i = 0; i < 9; ++i)
136 sg2[i][0] = sqrt(0.6) * lr9[i];
137 sg2[i][1] = sqrt(0.6) * lz9[i];
138 sg2[i][2] = (1.0 / 81.0) * lw9[i];
142 mooseError(
"Invalid quadrature order = " + Moose::stringify(iord) +
" for quad elements");
150 sg2[0][0] = 1.0 / 3.0;
151 sg2[0][1] = 1.0 / 3.0;
152 sg2[0][2] = 1.0 / 3.0;
158 for (
unsigned int i = 0; i < 3; ++i)
160 sg2[0][0] = 2.0 / 3.0;
161 sg2[0][1] = 1.0 / 6.0;
162 sg2[0][2] = 1.0 / 6.0;
163 sg2[0][3] = 1.0 / 6.0;
164 sg2[1][0] = 1.0 / 6.0;
165 sg2[1][1] = 2.0 / 3.0;
166 sg2[1][2] = 1.0 / 6.0;
167 sg2[1][3] = 1.0 / 6.0;
168 sg2[2][0] = 1.0 / 6.0;
169 sg2[2][1] = 1.0 / 6.0;
170 sg2[2][2] = 2.0 / 3.0;
171 sg2[2][3] = 1.0 / 6.0;
176 for (
unsigned int i = 0; i < 4; ++i)
178 sg2[0][0] = 1.5505102572168219018027159252941e-01;
179 sg2[0][1] = 1.7855872826361642311703513337422e-01;
180 sg2[0][2] = 1.0 - sg2[0][0] - sg2[0][1];
181 sg2[0][3] = 1.5902069087198858469718450103758e-01;
183 sg2[1][0] = 6.4494897427831780981972840747059e-01;
184 sg2[1][1] = 7.5031110222608118177475598324603e-02;
185 sg2[1][2] = 1.0 - sg2[1][0] - sg2[1][1];
186 sg2[1][3] = 9.0979309128011415302815498962418e-02;
188 sg2[2][0] = 1.5505102572168219018027159252941e-01;
189 sg2[2][1] = 6.6639024601470138670269327409637e-01;
190 sg2[2][2] = 1.0 - sg2[2][0] - sg2[2][1];
191 sg2[2][3] = 1.5902069087198858469718450103758e-01;
193 sg2[3][0] = 6.4494897427831780981972840747059e-01;
194 sg2[3][1] = 2.8001991549907407200279599420481e-01;
195 sg2[3][2] = 1.0 - sg2[3][0] - sg2[3][1];
196 sg2[3][3] = 9.0979309128011415302815498962418e-02;
200 const unsigned int n_wts = 2;
201 const Real wts[n_wts] = {1.1169079483900573284750350421656140e-01L,
202 5.4975871827660933819163162450105264e-02L};
204 const Real a[n_wts] = {4.4594849091596488631832925388305199e-01L,
205 9.1576213509770743459571463402201508e-02L};
207 const Real b[n_wts] = {0., 0.};
208 const unsigned int permutation_ids[n_wts] = {3, 3};
210 std::vector<Point> points;
211 std::vector<Real> weights;
212 dunavant_rule2(wts, a, b, permutation_ids, n_wts, points, weights);
215 for (
unsigned int i = 0; i < 6; ++i)
217 for (
unsigned int i = 0; i < 6; ++i)
219 sg2[i][0] = points[i](0);
220 sg2[i][1] = points[i](1);
221 sg2[i][2] = 1.0 - points[i](0) - points[i](1);
222 sg2[i][3] = weights[i];
226 mooseError(
"Invalid quadrature order = " + Moose::stringify(iord) +
" for triangle elements");
229 mooseError(
"Invalid 2D element type");
238 for (
unsigned int i = 0; i < 6; ++i)
242 wss[0][2] = 1.1428571428571428;
245 wss[1][1] = 9.6609178307929590e-01;
246 wss[1][2] = 4.3956043956043956e-01;
248 wss[2][0] = 8.5191465330460049e-01;
249 wss[2][1] = 4.5560372783619284e-01;
250 wss[2][2] = 5.6607220700753210e-01;
252 wss[3][0] = -wss[2][0];
253 wss[3][1] = wss[2][1];
254 wss[3][2] = wss[2][2];
256 wss[4][0] = 6.3091278897675402e-01;
257 wss[4][1] = -7.3162995157313452e-01;
258 wss[4][2] = 6.4271900178367668e-01;
260 wss[5][0] = -wss[4][0];
261 wss[5][1] = wss[4][1];
262 wss[5][2] = wss[4][2];
265 mooseError(
"Unknown Wissmann quadrature type");
270 std::vector<Real> & ss,
271 std::vector<Point> & xl,
272 std::vector<std::vector<Real>> & shp,
277 Real s[4] = {-0.5, 0.5, 0.5, -0.5};
278 Real t[4] = {-0.5, -0.5, 0.5, 0.5};
282 Real xs[2][2] = {{0.0, 0.0}, {0.0, 0.0}};
283 Real sx[2][2] = {{0.0, 0.0}, {0.0, 0.0}};
284 for (
unsigned int i = 0; i < 4; ++i)
286 shp[i][2] = (0.5 + s[i] * ss[0]) * (0.5 + t[i] * ss[1]);
287 shp[i][0] = s[i] * (0.5 + t[i] * ss[1]);
288 shp[i][1] = t[i] * (0.5 + s[i] * ss[0]);
290 for (
unsigned int i = 0; i < 2; ++i)
292 for (
unsigned int j = 0; j < 2; ++j)
295 for (
unsigned int k = 0; k < nen; ++k)
296 xs[i][j] += xl[k](i) * shp[k][j];
299 xsj = xs[0][0] * xs[1][1] - xs[0][1] * xs[1][0];
300 if (natl_flg ==
false)
302 Real temp = 1.0 / xsj;
303 sx[0][0] = xs[1][1] * temp;
304 sx[1][1] = xs[0][0] * temp;
305 sx[0][1] = -xs[0][1] * temp;
306 sx[1][0] = -xs[1][0] * temp;
307 for (
unsigned int i = 0; i < nen; ++i)
309 temp = shp[i][0] * sx[0][0] + shp[i][1] * sx[1][0];
310 shp[i][1] = shp[i][0] * sx[0][1] + shp[i][1] * sx[1][1];
318 Point x13 = xl[2] - xl[0];
319 Point x23 = xl[2] - xl[1];
320 Point cross_prod = x13.cross(x23);
321 xsj = cross_prod.norm();
330 if (natl_flg ==
false)
332 shp[0][0] = (xl[1](1) - xl[2](1)) * xsjr;
333 shp[0][1] = (xl[2](0) - xl[1](0)) * xsjr;
334 shp[1][0] = (xl[2](1) - xl[0](1)) * xsjr;
335 shp[1][1] = (xl[0](0) - xl[2](0)) * xsjr;
336 shp[2][0] = (xl[0](1) - xl[1](1)) * xsjr;
337 shp[2][1] = (xl[1](0) - xl[0](0)) * xsjr;
350 mooseError(
"ShapeFunc2D only works for linear quads and tris!");
358 for (
int i = 0; i < n; ++i)
368 for (
int i = 0; i < n; ++i)
377 for (
int i = 0; i < n; ++i)
388 for (
int i = 0; i < n; ++i)
389 value += a1[i] * a2[i];
404 double pp[3],
double normal[3],
double p1[3],
double p2[3],
double pint[3])
424 double direction[DIM_NUM];
431 mooseError(
"PLANE_NORMAL_LINE_EXP_INT_3D - Fatal error! The line is degenerate.");
436 mooseError(
"PLANE_NORMAL_LINE_EXP_INT_3D - Fatal error! The normal vector of the plane is "
439 for (
unsigned int i = 0; i < DIM_NUM; ++i)
440 normal[i] = normal[i] / temp;
443 for (
unsigned int i = 0; i < DIM_NUM; ++i)
444 direction[i] = p2[i] - p1[i];
447 for (
unsigned int i = 0; i < DIM_NUM; ++i)
448 direction[i] = direction[i] / temp;
455 for (
unsigned int i = 0; i < DIM_NUM; ++i)
456 temp = temp + normal[i] * (p1[i] - pp[i]);
466 for (
unsigned int i = 0; i < DIM_NUM; ++i)
474 for (
unsigned int i = 0; i < DIM_NUM; ++i)
475 temp = temp + normal[i] * (pp[i] - p1[i]);
477 for (
unsigned int i = 0; i < DIM_NUM; ++i)
478 temp2 = temp2 + normal[i] * direction[i];
481 for (
unsigned int i = 0; i < DIM_NUM; ++i)
482 pint[i] = p1[i] + temp * direction[i] / temp2;
490 double coord[],
int order_max,
int face_num,
int node[],
int ,
int order[])
553 for (face = 0; face < face_num; face++)
555 n3 = node[order[face] - 1 + face * order_max];
556 x3 = coord[0 + n3 * 3];
557 y3 = coord[1 + n3 * 3];
558 z3 = coord[2 + n3 * 3];
560 for (v = 0; v < order[face] - 2; v++)
562 n1 = node[v + face * order_max];
563 x1 = coord[0 + n1 * 3];
564 y1 = coord[1 + n1 * 3];
565 z1 = coord[2 + n1 * 3];
567 n2 = node[v + 1 + face * order_max];
568 x2 = coord[0 + n2 * 3];
569 y2 = coord[1 + n2 * 3];
570 z2 = coord[2 + n2 * 3];
573 x1 * y2 * z3 - x1 * y3 * z2 + x2 * y3 * z1 - x2 * y1 * z3 + x3 * y1 * z2 - x3 * y2 * z1;
575 volume = volume + term;
579 volume = volume / 6.0;
613 for (i = 0; i < n; i++)
670 #define PI 3.141592653589793
736 for (i = 0; i < DIM_NUM; i++)
738 v1norm = v1norm +
pow(p1[i] - p2[i], 2);
740 v1norm = sqrt(v1norm);
749 for (i = 0; i < DIM_NUM; i++)
751 v2norm = v2norm +
pow(p3[i] - p2[i], 2);
753 v2norm = sqrt(v2norm);
762 for (i = 0; i < DIM_NUM; i++)
764 dot = dot + (p1[i] - p2[i]) * (p3[i] - p2[i]);
767 value =
r8_acos(dot / (v1norm * v2norm));