22 const unsigned int * permutation_ids,
24 std::vector<Point> & points,
25 std::vector<Real> & weights)
31 unsigned int total_pts = 0;
32 for (
unsigned int p = 0;
p < n_wts; ++
p)
33 total_pts += permutation_ids[
p];
36 points.resize(total_pts);
37 weights.resize(total_pts);
40 unsigned int offset = 0;
41 for (
unsigned int p = 0;
p < n_wts; ++
p)
43 switch (permutation_ids[
p])
49 points[offset + 0] = Point(1.0L / 3.0L, 1.0L / 3.0L);
50 weights[offset + 0] = wts[
p];
59 points[offset + 0] = Point(
a[
p],
a[
p]);
60 points[offset + 1] = Point(
a[
p], 1.L - 2.L *
a[
p]);
61 points[offset + 2] = Point(1.L - 2.L *
a[
p],
a[
p]);
63 for (
unsigned int j = 0; j < 3; ++j)
64 weights[offset + j] = wts[
p];
73 points[offset + 0] = Point(
a[
p],
b[
p]);
74 points[offset + 1] = Point(
b[
p],
a[
p]);
75 points[offset + 2] = Point(
a[
p], 1.L -
a[
p] -
b[
p]);
76 points[offset + 3] = Point(1.L -
a[
p] -
b[
p],
a[
p]);
77 points[offset + 4] = Point(
b[
p], 1.L -
a[
p] -
b[
p]);
78 points[offset + 5] = Point(1.L -
a[
p] -
b[
p],
b[
p]);
80 for (
unsigned int j = 0; j < 6; ++j)
81 weights[offset + j] = wts[
p];
88 mooseError(
"Unknown permutation id: ", permutation_ids[
p],
"!");
94stdQuadr2D(
unsigned int nen,
unsigned int iord, std::vector<std::vector<Real>> & sg2)
99 Real lr4[4] = {-1.0, 1.0, -1.0, 1.0};
100 Real lz4[4] = {-1.0, -1.0, 1.0, 1.0};
101 Real lr9[9] = {-1.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0};
102 Real lz9[9] = {-1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0};
103 Real lw9[9] = {25.0, 40.0, 25.0, 40.0, 64.0, 40.0, 25.0, 40.0, 25.0};
118 for (
unsigned int i = 0; i < 4; ++i)
120 for (
unsigned int i = 0; i < 4; ++i)
122 sg2[i][0] = (1 / sqrt(3)) * lr4[i];
123 sg2[i][1] = (1 / sqrt(3)) * lz4[i];
130 for (
unsigned int i = 0; i < 9; ++i)
132 for (
unsigned int i = 0; i < 9; ++i)
134 sg2[i][0] = sqrt(0.6) * lr9[i];
135 sg2[i][1] = sqrt(0.6) * lz9[i];
136 sg2[i][2] = (1.0 / 81.0) * lw9[i];
148 sg2[0][0] = 1.0 / 3.0;
149 sg2[0][1] = 1.0 / 3.0;
150 sg2[0][2] = 1.0 / 3.0;
156 for (
unsigned int i = 0; i < 3; ++i)
158 sg2[0][0] = 2.0 / 3.0;
159 sg2[0][1] = 1.0 / 6.0;
160 sg2[0][2] = 1.0 / 6.0;
161 sg2[0][3] = 1.0 / 6.0;
162 sg2[1][0] = 1.0 / 6.0;
163 sg2[1][1] = 2.0 / 3.0;
164 sg2[1][2] = 1.0 / 6.0;
165 sg2[1][3] = 1.0 / 6.0;
166 sg2[2][0] = 1.0 / 6.0;
167 sg2[2][1] = 1.0 / 6.0;
168 sg2[2][2] = 2.0 / 3.0;
169 sg2[2][3] = 1.0 / 6.0;
174 for (
unsigned int i = 0; i < 4; ++i)
176 sg2[0][0] = 1.5505102572168219018027159252941e-01;
177 sg2[0][1] = 1.7855872826361642311703513337422e-01;
178 sg2[0][2] = 1.0 - sg2[0][0] - sg2[0][1];
179 sg2[0][3] = 1.5902069087198858469718450103758e-01;
181 sg2[1][0] = 6.4494897427831780981972840747059e-01;
182 sg2[1][1] = 7.5031110222608118177475598324603e-02;
183 sg2[1][2] = 1.0 - sg2[1][0] - sg2[1][1];
184 sg2[1][3] = 9.0979309128011415302815498962418e-02;
186 sg2[2][0] = 1.5505102572168219018027159252941e-01;
187 sg2[2][1] = 6.6639024601470138670269327409637e-01;
188 sg2[2][2] = 1.0 - sg2[2][0] - sg2[2][1];
189 sg2[2][3] = 1.5902069087198858469718450103758e-01;
191 sg2[3][0] = 6.4494897427831780981972840747059e-01;
192 sg2[3][1] = 2.8001991549907407200279599420481e-01;
193 sg2[3][2] = 1.0 - sg2[3][0] - sg2[3][1];
194 sg2[3][3] = 9.0979309128011415302815498962418e-02;
198 const unsigned int n_wts = 2;
199 const Real wts[n_wts] = {1.1169079483900573284750350421656140e-01L,
200 5.4975871827660933819163162450105264e-02L};
202 const Real
a[n_wts] = {4.4594849091596488631832925388305199e-01L,
203 9.1576213509770743459571463402201508e-02L};
205 const Real
b[n_wts] = {0., 0.};
206 const unsigned int permutation_ids[n_wts] = {3, 3};
208 std::vector<Point> points;
209 std::vector<Real> weights;
213 for (
unsigned int i = 0; i < 6; ++i)
215 for (
unsigned int i = 0; i < 6; ++i)
217 sg2[i][0] = points[i](0);
218 sg2[i][1] = points[i](1);
219 sg2[i][2] = 1.0 - points[i](0) - points[i](1);
220 sg2[i][3] = weights[i];
236 for (
unsigned int i = 0; i < 6; ++i)
240 wss[0][2] = 1.1428571428571428;
243 wss[1][1] = 9.6609178307929590e-01;
244 wss[1][2] = 4.3956043956043956e-01;
246 wss[2][0] = 8.5191465330460049e-01;
247 wss[2][1] = 4.5560372783619284e-01;
248 wss[2][2] = 5.6607220700753210e-01;
250 wss[3][0] = -wss[2][0];
251 wss[3][1] = wss[2][1];
252 wss[3][2] = wss[2][2];
254 wss[4][0] = 6.3091278897675402e-01;
255 wss[4][1] = -7.3162995157313452e-01;
256 wss[4][2] = 6.4271900178367668e-01;
258 wss[5][0] = -wss[4][0];
259 wss[5][1] = wss[4][1];
260 wss[5][2] = wss[4][2];
263 mooseError(
"Unknown Wissmann quadrature type");
268 std::vector<Real> & ss,
269 std::vector<Point> & xl,
270 std::vector<std::vector<Real>> & shp,
275 Real s[4] = {-0.5, 0.5, 0.5, -0.5};
276 Real t[4] = {-0.5, -0.5, 0.5, 0.5};
280 Real xs[2][2] = {{0.0, 0.0}, {0.0, 0.0}};
281 Real sx[2][2] = {{0.0, 0.0}, {0.0, 0.0}};
282 for (
unsigned int i = 0; i < 4; ++i)
284 shp[i][2] = (0.5 + s[i] * ss[0]) * (0.5 + t[i] * ss[1]);
285 shp[i][0] = s[i] * (0.5 + t[i] * ss[1]);
286 shp[i][1] = t[i] * (0.5 + s[i] * ss[0]);
288 for (
unsigned int i = 0; i < 2; ++i)
290 for (
unsigned int j = 0; j < 2; ++j)
293 for (
unsigned int k = 0; k < nen; ++k)
294 xs[i][j] += xl[k](i) * shp[k][j];
297 xsj = xs[0][0] * xs[1][1] - xs[0][1] * xs[1][0];
298 if (natl_flg ==
false)
300 Real temp = 1.0 / xsj;
301 sx[0][0] = xs[1][1] * temp;
302 sx[1][1] = xs[0][0] * temp;
303 sx[0][1] = -xs[0][1] * temp;
304 sx[1][0] = -xs[1][0] * temp;
305 for (
unsigned int i = 0; i < nen; ++i)
307 temp = shp[i][0] * sx[0][0] + shp[i][1] * sx[1][0];
308 shp[i][1] = shp[i][0] * sx[0][1] + shp[i][1] * sx[1][1];
316 Point x13 = xl[2] - xl[0];
317 Point x23 = xl[2] - xl[1];
318 Point cross_prod = x13.cross(x23);
319 xsj = cross_prod.norm();
328 if (natl_flg ==
false)
330 shp[0][0] = (xl[1](1) - xl[2](1)) * xsjr;
331 shp[0][1] = (xl[2](0) - xl[1](0)) * xsjr;
332 shp[1][0] = (xl[2](1) - xl[0](1)) * xsjr;
333 shp[1][1] = (xl[0](0) - xl[2](0)) * xsjr;
334 shp[2][0] = (xl[0](1) - xl[1](1)) * xsjr;
335 shp[2][1] = (xl[1](0) - xl[0](0)) * xsjr;
348 mooseError(
"ShapeFunc2D only works for linear quads and tris!");
356 for (
int i = 0; i < n; ++i)
366 for (
int i = 0; i < n; ++i)
375 for (
int i = 0; i < n; ++i)
386 for (
int i = 0; i < n; ++i)
387 value += a1[i] * a2[i];
402 double pp[3],
double normal[3],
double p1[3],
double p2[3],
double pint[3])
422 double direction[DIM_NUM];
429 mooseError(
"PLANE_NORMAL_LINE_EXP_INT_3D - Fatal error! The line is degenerate.");
434 mooseError(
"PLANE_NORMAL_LINE_EXP_INT_3D - Fatal error! The normal vector of the plane is "
437 for (
unsigned int i = 0; i < DIM_NUM; ++i)
438 normal[i] = normal[i] / temp;
441 for (
unsigned int i = 0; i < DIM_NUM; ++i)
442 direction[i] = p2[i] - p1[i];
445 for (
unsigned int i = 0; i < DIM_NUM; ++i)
446 direction[i] = direction[i] / temp;
453 for (
unsigned int i = 0; i < DIM_NUM; ++i)
454 temp = temp + normal[i] * (p1[i] - pp[i]);
464 for (
unsigned int i = 0; i < DIM_NUM; ++i)
472 for (
unsigned int i = 0; i < DIM_NUM; ++i)
473 temp = temp + normal[i] * (pp[i] - p1[i]);
475 for (
unsigned int i = 0; i < DIM_NUM; ++i)
476 temp2 = temp2 + normal[i] * direction[i];
479 for (
unsigned int i = 0; i < DIM_NUM; ++i)
480 pint[i] = p1[i] + temp * direction[i] / temp2;
488 double coord[],
int order_max,
int face_num,
int node[],
int ,
int order[])
551 for (face = 0; face < face_num; face++)
553 n3 = node[order[face] - 1 + face * order_max];
554 x3 = coord[0 + n3 * 3];
555 y3 = coord[1 + n3 * 3];
556 z3 = coord[2 + n3 * 3];
558 for (
v = 0;
v < order[face] - 2;
v++)
560 n1 = node[
v + face * order_max];
561 x1 = coord[0 + n1 * 3];
562 y1 = coord[1 + n1 * 3];
563 z1 = coord[2 + n1 * 3];
565 n2 = node[
v + 1 + face * order_max];
566 x2 = coord[0 + n2 * 3];
567 y2 = coord[1 + n2 * 3];
568 z2 = coord[2 + n2 * 3];
571 x1 * y2 * z3 - x1 * y3 * z2 + x2 * y3 * z1 - x2 * y1 * z3 + x3 * y1 * z2 - x3 * y2 * z1;
573 volume = volume + term;
577 volume = volume / 6.0;
611 for (i = 0; i < n; i++)
668#define PI 3.141592653589793
734 for (i = 0; i < DIM_NUM; i++)
736 v1norm = v1norm +
pow(p1[i] - p2[i], 2);
738 v1norm = sqrt(v1norm);
747 for (i = 0; i < DIM_NUM; i++)
749 v2norm = v2norm +
pow(p3[i] - p2[i], 2);
751 v2norm = sqrt(v2norm);
760 for (i = 0; i < DIM_NUM; i++)
762 dot = dot + (p1[i] - p2[i]) * (p3[i] - p2[i]);
765 value =
r8_acos(dot / (v1norm * v2norm));
773 const Point & segment_point2,
774 const std::pair<Point, Point> & cutting_line_points,
775 const Real & cutting_line_fraction,
776 Real & segment_intersection_fraction)
783 bool cut_segment =
false;
784 Point seg_dir = segment_point2 - segment_point1;
785 Point cut_dir = cutting_line_points.second - cutting_line_points.first;
786 Point cut_start_to_seg_start = segment_point1 - cutting_line_points.first;
790 if (std::abs(cut_dir_cross_seg_dir) >
Xfem::tol)
793 Real cut_int_frac =
crossProduct2D(cut_start_to_seg_start, seg_dir) / cut_dir_cross_seg_dir;
795 if (cut_int_frac >= 0.0 && cut_int_frac <= cutting_line_fraction)
798 Real int_frac =
crossProduct2D(cut_start_to_seg_start, cut_dir) / cut_dir_cross_seg_dir;
799 if (int_frac >= 0.0 && int_frac <= 1.0)
802 segment_intersection_fraction = int_frac;
812 return (point_a(0) * point_b(1) - point_b(0) * point_a(1));
821 mooseError(
"In XFEMFuncs::pointSegmentDistance(), x0 and x1 should be two different points.");
823 Real s12 = (x2 - x0) * dx / m2;
829 xp = s12 * x1 + (1 - s12) * x2;
830 return std::sqrt((x0 - xp) * (x0 - xp));
839 unsigned int & region)
841 Point x13 = x1 - x3, x23 = x2 - x3, x03 = x0 - x3;
842 Real m13 = x13 * x13, m23 = x23 * x23,
d = x13 * x23;
843 Real invdet = 1.0 / std::max(m13 * m23 -
d *
d, 1e-30);
844 Real
a = x13 * x03,
b = x23 * x03;
846 Real w23 = invdet * (m23 *
a -
d *
b);
847 Real w31 = invdet * (m13 *
b -
d *
a);
848 Real w12 = 1 - w23 - w31;
849 if (w23 >= 0 && w31 >= 0 && w12 >= 0)
852 xp = w23 * x1 + w31 * x2 + w12 * x3;
853 return std::sqrt((x0 - xp) * (x0 - xp));
862 Real distance_1 = std::sqrt((x0 - x1) * (x0 - x1));
863 if (std::min(distance_12, distance_13) < distance_1)
865 if (distance_12 < distance_13)
890 Real distance_2 = std::sqrt((x0 - x2) * (x0 - x2));
891 if (std::min(distance_12, distance_23) < distance_2)
893 if (distance_12 < distance_23)
918 Real distance_3 = std::sqrt((x0 - x3) * (x0 - x3));
919 if (std::min(distance_23, distance_31) < distance_3)
921 if (distance_23 < distance_31)
942 mooseError(
"Cannot find closest location in XFEMFuncs::pointTriangleDistance().");
948 const std::vector<Point> & vertices,
951 bool has_intersection =
false;
953 if (vertices.size() != 3)
954 mooseError(
"The number of vertices of cutting element must be 3.");
956 Plane elem_plane(vertices[0], vertices[1], vertices[2]);
957 Point point = vertices[0];
958 Point normal = elem_plane.unit_normal(point);
960 std::array<Real, 3> plane_point = {{point(0), point(1), point(2)}};
961 std::array<Real, 3> planenormal = {{normal(0), normal(1), normal(2)}};
962 std::array<Real, 3> edge_point1 = {{p1(0), p1(1), p1(2)}};
963 std::array<Real, 3> edge_point2 = {{p2(0), p2(1), p2(2)}};
964 std::array<Real, 3> cut_point = {{0.0, 0.0, 0.0}};
967 &plane_point[0], &planenormal[0], &edge_point1[0], &edge_point2[0], &cut_point[0]) == 1)
969 Point temp_p(cut_point[0], cut_point[1], cut_point[2]);
973 has_intersection =
true;
977 return has_intersection;
983 Real dotp1 = (p1 -
p) * (p2 - p1);
984 Real dotp2 = (p2 -
p) * (p2 - p1);
985 return (dotp1 * dotp2 <= 0.0);
991 Real full_len = (p2 - p1).norm();
992 Real len_p1_p = (
p - p1).norm();
993 return len_p1_p / full_len;
999 unsigned int n_node = vertices.size();
1002 mooseError(
"The number of vertices of cutting element must be 3.");
1004 Plane elem_plane(vertices[0], vertices[1], vertices[2]);
1005 Point normal = elem_plane.unit_normal(vertices[0]);
1007 bool inside =
false;
1008 unsigned int counter = 0;
1010 for (
unsigned int i = 0; i < n_node; ++i)
1012 unsigned int iplus1 = (i < n_node - 1 ? i + 1 : 0);
1013 Point middle2p =
p - 0.5 * (vertices[i] + vertices[iplus1]);
1014 const Point side_tang = vertices[iplus1] - vertices[i];
1015 Point side_norm = side_tang.cross(normal);
1020 if (middle2p * side_norm <= 0)
1024 if (counter == n_node)
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
void mooseError(Args &&... args)
std::string stringify(const T &t)
void i4vec_zero(int n, int a[])
double polyhedron_volume_3d(double coord[], int order_max, int face_num, int node[], int node_num, int order[])
double angle_rad_3d(double p1[3], double p2[3], double p3[3])
void wissmannPoints(unsigned int nqp, std::vector< std::vector< Real > > &wss)
bool intersectSegmentWithCutLine(const Point &segment_point1, const Point &segment_point2, const std::pair< Point, Point > &cutting_line_points, const Real &cutting_line_fraction, Real &segment_intersection_fraction)
Determine whether a line segment is intersected by a cutting line, and compute the fraction along tha...
Real crossProduct2D(const Point &point_a, const Point &point_b)
Compute the cross product of two vectors, provided as Point objects, which have nonzero components on...
void stdQuadr2D(unsigned int nen, unsigned int iord, std::vector< std::vector< Real > > &sg2)
Real getRelativePosition(const Point &p1, const Point &p2, const Point &p)
Get the relative position of p from p1 respect to the total length of the line segment.
bool intersectWithEdge(const Point &p1, const Point &p2, const std::vector< Point > &vertices, Point &pint)
check if a line intersects with an element defined by vertices calculate the distance from a point to...
void shapeFunc2D(unsigned int nen, std::vector< Real > &ss, std::vector< Point > &xl, std::vector< std::vector< Real > > &shp, Real &xsj, bool natl_flg)
double r8vec_norm(int n, double a[])
void dunavant_rule2(const Real *wts, const Real *a, const Real *b, const unsigned int *permutation_ids, unsigned int n_wts, std::vector< Point > &points, std::vector< Real > &weights)
bool r8vec_eq(int n, double a1[], double a2[])
int plane_normal_line_exp_int_3d(double pp[3], double normal[3], double p1[3], double p2[3], double pint[3])
bool isInsideEdge(const Point &p1, const Point &p2, const Point &p)
check if point is inside the straight edge p1-p2
double r8vec_dot_product(int n, double a1[], double a2[])
bool line_exp_is_degenerate_nd(int dim_num, double p1[], double p2[])
bool isInsideCutPlane(const std::vector< Point > &vertices, const Point &p)
Check if point p is inside a plane.
Real pointSegmentDistance(const Point &x0, const Point &x1, const Point &x2, Point &xp)
Calculate the signed distance from a point to a line segment.
Real pointTriangleDistance(const Point &x0, const Point &x1, const Point &x2, const Point &x3, Point &xp, unsigned int ®ion)
Calculate the signed distance from a point to a triangle.
void normalizePoint(Point &p)
void r8vec_copy(int n, double a1[], double a2[])