https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Classes | Typedefs | Enumerations | Functions | Variables
Xfem Namespace Reference

Classes

struct  CutEdge
 Data structure defining a cut on an element edge. More...
 
struct  CutElemInfo
 Information about a cut element. More...
 
struct  CutFace
 Data structure defining a cut through a face. More...
 
struct  CutNode
 Data structure defining a cut through a node. More...
 
struct  GeomMarkedElemInfo2D
 Data structure describing geometrically described cut through 2D element. More...
 
struct  GeomMarkedElemInfo3D
 Data structure describing geometrically described cut through 3D element. More...
 

Typedefs

typedef std::array< std::unordered_map< unsigned int, std::string >, 2 > CachedMaterialProperties
 Convenient typedef for local storage of stateful material properties.
 

Enumerations

enum  XFEM_CUTPLANE_QUANTITY {
  ORIGIN_X , ORIGIN_Y , ORIGIN_Z , NORMAL_X ,
  NORMAL_Y , NORMAL_Z
}
 
enum  XFEM_QRULE { VOLFRAC , MOMENT_FITTING , DIRECT }
 

Functions

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)
 
void stdQuadr2D (unsigned int nen, unsigned int iord, std::vector< std::vector< Real > > &sg2)
 
void wissmannPoints (unsigned int nqp, std::vector< std::vector< Real > > &wss)
 
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 r8vec_copy (int n, double a1[], double a2[])
 
bool r8vec_eq (int n, double a1[], double a2[])
 
double r8vec_dot_product (int n, double a1[], double a2[])
 
bool line_exp_is_degenerate_nd (int dim_num, double p1[], double p2[])
 
int plane_normal_line_exp_int_3d (double pp[3], double normal[3], double p1[3], double p2[3], double pint[3])
 
double polyhedron_volume_3d (double coord[], int order_max, int face_num, int node[], int node_num, int order[])
 
void i4vec_zero (int n, int a[])
 
void normalizePoint (Point &p)
 
void normalizePoint (EFAPoint &p)
 
double r8_acos (double c)
 
double angle_rad_3d (double p1[3], double p2[3], double p3[3])
 
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 that line where the intersection occurs.
 
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 only in the x,y 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 &region)
 Calculate the signed distance from a point to a triangle.
 
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 triangle.
 
bool isInsideEdge (const Point &p1, const Point &p2, const Point &p)
 check if point is inside the straight edge p1-p2
 
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 isInsideCutPlane (const std::vector< Point > &vertices, const Point &p)
 Check if point p is inside a plane.
 
bool operator< (const CutEdge &lhs, const CutEdge &rhs)
 Operator < for two CutEdge Objects Needed to allow the use of std::set<CutEdge>
 
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)
 
void shapeFunc2D (unsigned int nen, std::vector< Real > &ss, std::vector< Point > &xl, std::vector< std::vector< Real > > &shp, Real &xsj, bool natl_flg)
 
void normalizePoint (Point &p)
 
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)
 
Real crossProduct2D (const Point &point_a, const Point &point_b)
 
Real pointSegmentDistance (const Point &x0, const Point &x1, const Point &x2, Point &xp)
 
Real pointTriangleDistance (const Point &x0, const Point &x1, const Point &x2, const Point &x3, Point &xp, unsigned int &region)
 
bool intersectWithEdge (const Point &p1, const Point &p2, const std::vector< Point > &vertices, Point &pint)
 
bool isInsideEdge (const Point &p1, const Point &p2, const Point &p)
 
Real getRelativePosition (const Point &p1, const Point &p2, const Point &p)
 
bool isInsideCutPlane (const std::vector< Point > &vertices, const Point &p)
 

Variables

static const double tol = 1.0e-10
 

Typedef Documentation

◆ CachedMaterialProperties

typedef std::array<std::unordered_map<unsigned int, std::string>, 2> Xfem::CachedMaterialProperties

Convenient typedef for local storage of stateful material properties.

The first (component 0) entry in the CachedMaterialProperties is a map for old material properties. The second (component 1) entry is a map for older material properties. The second entry will be empty if the material storage doesn't have older material properties.

Definition at line 50 of file XFEM.h.

Enumeration Type Documentation

◆ XFEM_CUTPLANE_QUANTITY

Enumerator
ORIGIN_X 
ORIGIN_Y 
ORIGIN_Z 
NORMAL_X 
NORMAL_Y 
NORMAL_Z 

Definition at line 27 of file XFEM.h.

28{
35};
@ NORMAL_X
Definition XFEM.h:32
@ ORIGIN_Y
Definition XFEM.h:30
@ ORIGIN_Z
Definition XFEM.h:31
@ NORMAL_Z
Definition XFEM.h:34
@ NORMAL_Y
Definition XFEM.h:33
@ ORIGIN_X
Definition XFEM.h:29

◆ XFEM_QRULE

Enumerator
VOLFRAC 
MOMENT_FITTING 
DIRECT 

Definition at line 37 of file XFEM.h.

38{
39 VOLFRAC,
41 DIRECT
42};
@ DIRECT
Definition XFEM.h:41
@ VOLFRAC
Definition XFEM.h:39
@ MOMENT_FITTING
Definition XFEM.h:40

Function Documentation

◆ angle_rad_3d()

double Xfem::angle_rad_3d ( double  p1[3],
double  p2[3],
double  p3[3] 
)

Definition at line 689 of file XFEMFuncs.C.

724{
725#define DIM_NUM 3
726
727 double dot;
728 int i;
729 double v1norm;
730 double v2norm;
731 double value;
732
733 v1norm = 0.0;
734 for (i = 0; i < DIM_NUM; i++)
735 {
736 v1norm = v1norm + pow(p1[i] - p2[i], 2);
737 }
738 v1norm = sqrt(v1norm);
739
740 if (v1norm == 0.0)
741 {
742 value = 0.0;
743 return value;
744 }
745
746 v2norm = 0.0;
747 for (i = 0; i < DIM_NUM; i++)
748 {
749 v2norm = v2norm + pow(p3[i] - p2[i], 2);
750 }
751 v2norm = sqrt(v2norm);
752
753 if (v2norm == 0.0)
754 {
755 value = 0.0;
756 return value;
757 }
758
759 dot = 0.0;
760 for (i = 0; i < DIM_NUM; i++)
761 {
762 dot = dot + (p1[i] - p2[i]) * (p3[i] - p2[i]);
763 }
764
765 value = r8_acos(dot / (v1norm * v2norm));
766
767 return value;
768#undef DIM_NUM
769}
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
double r8_acos(double c)
Definition XFEMFuncs.C:637
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)

◆ crossProduct2D() [1/2]

Real Xfem::crossProduct2D ( const Point point_a,
const Point point_b 
)

Compute the cross product of two vectors, provided as Point objects, which have nonzero components only in the x,y plane.

Because the vectors both lie in the x,y plane, the only nonzero component of the cross product vector is in the z direction, and that is returned as a scalar value by this function.

Parameters
point_aFirst vector in cross product
point_bSecond vector in cross product
Returns
z component of cross product vector

Referenced by intersectSegmentWithCutLine().

◆ crossProduct2D() [2/2]

Real Xfem::crossProduct2D ( const Point &  point_a,
const Point &  point_b 
)

Definition at line 810 of file XFEMFuncs.C.

811{
812 return (point_a(0) * point_b(1) - point_b(0) * point_a(1));
813}

◆ dunavant_rule2() [1/2]

void Xfem::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 
)

Referenced by stdQuadr2D().

◆ dunavant_rule2() [2/2]

void Xfem::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 
)

Definition at line 19 of file XFEMFuncs.C.

26{
27 // see libmesh/src/quadrature/quadrature_gauss.C
28 // Figure out how many total points by summing up the entries
29 // in the permutation_ids array, and resize the _points and _weights
30 // vectors appropriately.
31 unsigned int total_pts = 0;
32 for (unsigned int p = 0; p < n_wts; ++p)
33 total_pts += permutation_ids[p];
34
35 // Resize point and weight vectors appropriately.
36 points.resize(total_pts);
37 weights.resize(total_pts);
38
39 // Always insert into the points & weights vector relative to the offset
40 unsigned int offset = 0;
41 for (unsigned int p = 0; p < n_wts; ++p)
42 {
43 switch (permutation_ids[p])
44 {
45 case 1:
46 {
47 // The point has only a single permutation (the centroid!)
48 // So we don't even need to look in the a or b arrays.
49 points[offset + 0] = Point(1.0L / 3.0L, 1.0L / 3.0L);
50 weights[offset + 0] = wts[p];
51
52 offset += 1;
53 break;
54 }
55
56 case 3:
57 {
58 // For this type of rule, don't need to look in the b array.
59 points[offset + 0] = Point(a[p], a[p]); // (a,a)
60 points[offset + 1] = Point(a[p], 1.L - 2.L * a[p]); // (a,1-2a)
61 points[offset + 2] = Point(1.L - 2.L * a[p], a[p]); // (1-2a,a)
62
63 for (unsigned int j = 0; j < 3; ++j)
64 weights[offset + j] = wts[p];
65
66 offset += 3;
67 break;
68 }
69
70 case 6:
71 {
72 // This type of point uses all 3 arrays...
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]);
79
80 for (unsigned int j = 0; j < 6; ++j)
81 weights[offset + j] = wts[p];
82
83 offset += 6;
84 break;
85 }
86
87 default:
88 mooseError("Unknown permutation id: ", permutation_ids[p], "!");
89 }
90 }
91}
const Real p
void mooseError(Args &&... args)

◆ getRelativePosition() [1/2]

Real Xfem::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.

Parameters
p1,p2End points of the line segment
pPoint coordinate
Returns
the relative position of p from p1

Referenced by InterfaceMeshCut3DUserObject::cutElementByGeometry().

◆ getRelativePosition() [2/2]

Real Xfem::getRelativePosition ( const Point &  p1,
const Point &  p2,
const Point &  p 
)

Definition at line 989 of file XFEMFuncs.C.

990{
991 Real full_len = (p2 - p1).norm();
992 Real len_p1_p = (p - p1).norm();
993 return len_p1_p / full_len;
994}

◆ i4vec_zero()

void Xfem::i4vec_zero ( int  n,
int  a[] 
)

Definition at line 584 of file XFEMFuncs.C.

608{
609 int i;
610
611 for (i = 0; i < n; i++)
612 {
613 a[i] = 0;
614 }
615 return;
616}

Referenced by XFEMCutElem3D::computePhysicalVolumeFraction().

◆ intersectSegmentWithCutLine() [1/2]

bool Xfem::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 that line where the intersection occurs.

Parameters
segment_point1Point at one end of the line segment
segment_point1Point at other end of the line segment
cutting_line_pointsPair of points that define the cutting line
cutting_line_fractionFractional distance from the start to end point of the cutting line over which the cutting line is currently active
segment_intersection_fractionFrictional distance along the cut segment from segment_point1 where the intersection occurs
Returns
true if the segment is intersected, false if it is not

Referenced by XFEMCrackGrowthIncrement2DCut::cutElementByCrackGrowthIncrement(), GeometricCut2DUserObject::cutElementByGeometry(), InterfaceMeshCut2DUserObject::cutElementByGeometry(), MeshCut2DUserObjectBase::cutElementByGeometry(), GeometricCut2DUserObject::cutFragmentByGeometry(), and MeshCut2DUserObjectBase::cutFragmentByGeometry().

◆ intersectSegmentWithCutLine() [2/2]

bool Xfem::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 
)

Definition at line 772 of file XFEMFuncs.C.

777{
778 // Use the algorithm described here to determine whether a line segment is intersected
779 // by a cutting line, and to compute the fraction along that line where the intersection
780 // occurs:
781 // http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect
782
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;
787
788 Real cut_dir_cross_seg_dir = crossProduct2D(cut_dir, seg_dir);
789
790 if (std::abs(cut_dir_cross_seg_dir) > Xfem::tol)
791 {
792 // Fraction of the distance along the cutting segment where it intersects the edge segment
793 Real cut_int_frac = crossProduct2D(cut_start_to_seg_start, seg_dir) / cut_dir_cross_seg_dir;
794
795 if (cut_int_frac >= 0.0 && cut_int_frac <= cutting_line_fraction)
796 { // Cutting segment intersects the line of the edge segment, but the intersection point may be
797 // outside the segment
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)
800 {
801 cut_segment = true;
802 segment_intersection_fraction = int_frac;
803 }
804 }
805 }
806 return cut_segment;
807}
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...
static const double tol
Definition XFEMFuncs.h:23

◆ intersectWithEdge() [1/2]

bool Xfem::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 triangle.

Parameters
p1,p2End points of the line segment
verticesVertices of two-node element.
pintIntersection point
Returns
true if a line intersects with an element

Referenced by InterfaceMeshCut3DUserObject::cutElementByGeometry().

◆ intersectWithEdge() [2/2]

bool Xfem::intersectWithEdge ( const Point &  p1,
const Point &  p2,
const std::vector< Point > &  vertices,
Point &  pint 
)

Definition at line 946 of file XFEMFuncs.C.

950{
951 bool has_intersection = false;
952
953 if (vertices.size() != 3)
954 mooseError("The number of vertices of cutting element must be 3.");
955
956 Plane elem_plane(vertices[0], vertices[1], vertices[2]);
957 Point point = vertices[0];
958 Point normal = elem_plane.unit_normal(point);
959
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}};
965
967 &plane_point[0], &planenormal[0], &edge_point1[0], &edge_point2[0], &cut_point[0]) == 1)
968 {
969 Point temp_p(cut_point[0], cut_point[1], cut_point[2]);
970 if (isInsideCutPlane(vertices, temp_p) && isInsideEdge(p1, p2, temp_p))
971 {
972 pint = temp_p;
973 has_intersection = true;
974 }
975 }
976
977 return has_intersection;
978}
int plane_normal_line_exp_int_3d(double pp[3], double normal[3], double p1[3], double p2[3], double pint[3])
Definition XFEMFuncs.C:401
bool isInsideEdge(const Point &p1, const Point &p2, const Point &p)
check if point is inside the straight edge p1-p2
bool isInsideCutPlane(const std::vector< Point > &vertices, const Point &p)
Check if point p is inside a plane.

◆ isInsideCutPlane() [1/2]

bool Xfem::isInsideCutPlane ( const std::vector< Point > &  vertices,
const Point p 
)

Check if point p is inside a plane.

Parameters
verticesVertices of the plane
pPoint coordinate
Returns
true if point p is inside a plane

Referenced by intersectWithEdge().

◆ isInsideCutPlane() [2/2]

bool Xfem::isInsideCutPlane ( const std::vector< Point > &  vertices,
const Point &  p 
)

Definition at line 997 of file XFEMFuncs.C.

998{
999 unsigned int n_node = vertices.size();
1000
1001 if (n_node != 3)
1002 mooseError("The number of vertices of cutting element must be 3.");
1003
1004 Plane elem_plane(vertices[0], vertices[1], vertices[2]);
1005 Point normal = elem_plane.unit_normal(vertices[0]);
1006
1007 bool inside = false;
1008 unsigned int counter = 0;
1009
1010 for (unsigned int i = 0; i < n_node; ++i)
1011 {
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);
1016
1017 normalizePoint(middle2p);
1018 normalizePoint(side_norm);
1019
1020 if (middle2p * side_norm <= 0)
1021 counter += 1;
1022 }
1023
1024 if (counter == n_node)
1025 inside = true;
1026 return inside;
1027}
void normalizePoint(Point &p)

◆ isInsideEdge() [1/2]

bool Xfem::isInsideEdge ( const Point p1,
const Point p2,
const Point p 
)

check if point is inside the straight edge p1-p2

Parameters
p1,p2End points of the line segment
pPoint coordinate
Returns
true if a point is inside the edge p1-p2

Referenced by intersectWithEdge().

◆ isInsideEdge() [2/2]

bool Xfem::isInsideEdge ( const Point &  p1,
const Point &  p2,
const Point &  p 
)

Definition at line 981 of file XFEMFuncs.C.

982{
983 Real dotp1 = (p1 - p) * (p2 - p1);
984 Real dotp2 = (p2 - p) * (p2 - p1);
985 return (dotp1 * dotp2 <= 0.0);
986}

◆ line_exp_is_degenerate_nd()

bool Xfem::line_exp_is_degenerate_nd ( int  dim_num,
double  p1[],
double  p2[] 
)

Definition at line 392 of file XFEMFuncs.C.

393{
394 // John Burkardt geometry.cpp
395 bool value;
396 value = r8vec_eq(dim_num, p1, p2);
397 return value;
398}
bool r8vec_eq(int n, double a1[], double a2[])
Definition XFEMFuncs.C:372

Referenced by plane_normal_line_exp_int_3d().

◆ normalizePoint() [1/3]

void Xfem::normalizePoint ( EFAPoint p)

Definition at line 629 of file XFEMFuncs.C.

630{
631 Real len = p.norm();
632 if (len > tol)
633 p *= (1.0 / len);
634}
const double tol

◆ normalizePoint() [2/3]

void Xfem::normalizePoint ( Point p)

◆ normalizePoint() [3/3]

void Xfem::normalizePoint ( Point &  p)

Definition at line 619 of file XFEMFuncs.C.

620{
621 Real len = p.norm();
622 if (len > tol)
623 p = (1.0 / len) * p;
624 else
625 p.zero();
626}

◆ operator<()

bool Xfem::operator< ( const CutEdge lhs,
const CutEdge rhs 
)
inline

Operator < for two CutEdge Objects Needed to allow the use of std::set<CutEdge>

Parameters
lhsCutEdge object on the left side of the comparison
rhsCutEdge object on the right side of the comparison
Returns
bool true if lhs < rhs

Definition at line 45 of file GeometricCutUserObject.h.

47{
48 if (lhs._id1 != rhs._id1)
49 return lhs._id1 < rhs._id1;
50 else
51 return lhs._id2 < rhs._id2;
52}
unsigned int _id1
ID of the first node on the edge.
unsigned int _id2
ID of the second node on the edge.

◆ plane_normal_line_exp_int_3d()

int Xfem::plane_normal_line_exp_int_3d ( double  pp[3],
double  normal[3],
double  p1[3],
double  p2[3],
double  pint[3] 
)

Definition at line 401 of file XFEMFuncs.C.

403{
404// John Burkardt geometry.cpp
405// Parameters:
406//
407// Input, double PP[3], a point on the plane.
408//
409// Input, double NORMAL[3], a normal vector to the plane.
410//
411// Input, double P1[3], P2[3], two distinct points on the line.
412//
413// Output, double PINT[3], the coordinates of a
414// common point of the plane and line, when IVAL is 1 or 2.
415//
416// Output, integer PLANE_NORMAL_LINE_EXP_INT_3D, the kind of intersection;
417// 0, the line and plane seem to be parallel and separate;
418// 1, the line and plane intersect at a single point;
419// 2, the line and plane seem to be parallel and joined.
420#define DIM_NUM 3
421
422 double direction[DIM_NUM];
423 int ival;
424 double temp;
425 double temp2;
426 //
427 // Make sure the line is not degenerate.
428 if (line_exp_is_degenerate_nd(DIM_NUM, p1, p2))
429 mooseError("PLANE_NORMAL_LINE_EXP_INT_3D - Fatal error! The line is degenerate.");
430 //
431 // Make sure the plane normal vector is a unit vector.
432 temp = r8vec_norm(DIM_NUM, normal);
433 if (temp == 0.0)
434 mooseError("PLANE_NORMAL_LINE_EXP_INT_3D - Fatal error! The normal vector of the plane is "
435 "degenerate.");
436
437 for (unsigned int i = 0; i < DIM_NUM; ++i)
438 normal[i] = normal[i] / temp;
439 //
440 // Determine the unit direction vector of the line.
441 for (unsigned int i = 0; i < DIM_NUM; ++i)
442 direction[i] = p2[i] - p1[i];
443 temp = r8vec_norm(DIM_NUM, direction);
444
445 for (unsigned int i = 0; i < DIM_NUM; ++i)
446 direction[i] = direction[i] / temp;
447 //
448 // If the normal and direction vectors are orthogonal, then
449 // we have a special case to deal with.
450 if (r8vec_dot_product(DIM_NUM, normal, direction) == 0.0)
451 {
452 temp = 0.0;
453 for (unsigned int i = 0; i < DIM_NUM; ++i)
454 temp = temp + normal[i] * (p1[i] - pp[i]);
455
456 if (temp == 0.0)
457 {
458 ival = 2;
459 r8vec_copy(DIM_NUM, p1, pint);
460 }
461 else
462 {
463 ival = 0;
464 for (unsigned int i = 0; i < DIM_NUM; ++i)
465 pint[i] = 1.0e20; // dummy huge value
466 }
467 return ival;
468 }
469 //
470 // Determine the distance along the direction vector to the intersection point.
471 temp = 0.0;
472 for (unsigned int i = 0; i < DIM_NUM; ++i)
473 temp = temp + normal[i] * (pp[i] - p1[i]);
474 temp2 = 0.0;
475 for (unsigned int i = 0; i < DIM_NUM; ++i)
476 temp2 = temp2 + normal[i] * direction[i];
477
478 ival = 1;
479 for (unsigned int i = 0; i < DIM_NUM; ++i)
480 pint[i] = p1[i] + temp * direction[i] / temp2;
481
482 return ival;
483#undef DIM_NUM
484}
double r8vec_norm(int n, double a[])
Definition XFEMFuncs.C:352
double r8vec_dot_product(int n, double a1[], double a2[])
Definition XFEMFuncs.C:382
bool line_exp_is_degenerate_nd(int dim_num, double p1[], double p2[])
Definition XFEMFuncs.C:392
void r8vec_copy(int n, double a1[], double a2[])
Definition XFEMFuncs.C:363

Referenced by CrackMeshCut3DUserObject::findIntersection(), CrackMeshCut3DUserObject::intersectWithEdge(), intersectWithEdge(), and GeometricCut3DUserObject::intersectWithEdge().

◆ pointSegmentDistance() [1/2]

Real Xfem::pointSegmentDistance ( const Point x0,
const Point x1,
const Point x2,
Point xp 
)

Calculate the signed distance from a point to a line segment.

Positive values are on the side of the line segment's normal (using standard conventions).

Parameters
x1,x2Coordinates of line segment end points
x0Coordinate of the point
xpClosest point coordinate on the line segment
Returns
Distance from a point x0 to a line segment defined by x1-x2

Referenced by pointTriangleDistance().

◆ pointSegmentDistance() [2/2]

Real Xfem::pointSegmentDistance ( const Point &  x0,
const Point &  x1,
const Point &  x2,
Point &  xp 
)

Definition at line 816 of file XFEMFuncs.C.

817{
818 Point dx = x2 - x1;
819 Real m2 = dx * dx;
820 if (m2 == 0)
821 mooseError("In XFEMFuncs::pointSegmentDistance(), x0 and x1 should be two different points.");
822 // find parameter coordinate of closest point on segment
823 Real s12 = (x2 - x0) * dx / m2;
824 if (s12 < 0)
825 s12 = 0;
826 else if (s12 > 1)
827 s12 = 1;
828 // and find the distance
829 xp = s12 * x1 + (1 - s12) * x2;
830 return std::sqrt((x0 - xp) * (x0 - xp));
831}

◆ pointTriangleDistance() [1/2]

Real Xfem::pointTriangleDistance ( const Point x0,
const Point x1,
const Point x2,
const Point x3,
Point xp,
unsigned int region 
)

Calculate the signed distance from a point to a triangle.

Positive values are on the side of the triangle's normal (using standard conventions).

Parameters
x1,x2,x3Coordinates of triangle vertices
x0Coordinate of the point
xpClosest point coordinate on the triangle
regionThe seven regions where the closest point could be located
Returns
distance from a point x0 to a triangle defined by x1-x2-x3

Referenced by InterfaceMeshCut3DUserObject::calculateSignedDistance().

◆ pointTriangleDistance() [2/2]

Real Xfem::pointTriangleDistance ( const Point &  x0,
const Point &  x1,
const Point &  x2,
const Point &  x3,
Point &  xp,
unsigned int region 
)

Definition at line 834 of file XFEMFuncs.C.

840{
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;
845
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)
850 { // if we're inside the triangle
851 region = 0;
852 xp = w23 * x1 + w31 * x2 + w12 * x3;
853 return std::sqrt((x0 - xp) * (x0 - xp));
854 }
855 else
856 {
857 if (w23 > 0) // this rules out edge 2-3 for us
858 {
859 Point xp1, xp2;
860 Real distance_12 = pointSegmentDistance(x0, x1, x2, xp1);
861 Real distance_13 = pointSegmentDistance(x0, x1, x3, xp2);
862 Real distance_1 = std::sqrt((x0 - x1) * (x0 - x1));
863 if (std::min(distance_12, distance_13) < distance_1)
864 {
865 if (distance_12 < distance_13)
866 {
867 region = 4;
868 xp = xp1;
869 return distance_12;
870 }
871 else
872 {
873 region = 6;
874 xp = xp2;
875 return distance_13;
876 }
877 }
878 else
879 {
880 region = 1;
881 xp = x1;
882 return distance_1;
883 }
884 }
885 else if (w31 > 0) // this rules out edge 1-3
886 {
887 Point xp1, xp2;
888 Real distance_12 = pointSegmentDistance(x0, x1, x2, xp1);
889 Real distance_23 = pointSegmentDistance(x0, x2, x3, xp2);
890 Real distance_2 = std::sqrt((x0 - x2) * (x0 - x2));
891 if (std::min(distance_12, distance_23) < distance_2)
892 {
893 if (distance_12 < distance_23)
894 {
895 region = 4;
896 xp = xp1;
897 return distance_12;
898 }
899 else
900 {
901 region = 5;
902 xp = xp2;
903 return distance_23;
904 }
905 }
906 else
907 {
908 region = 2;
909 xp = x2;
910 return distance_2;
911 }
912 }
913 else // w12 must be >0, ruling out edge 1-2
914 {
915 Point xp1, xp2;
916 Real distance_23 = pointSegmentDistance(x0, x2, x3, xp1);
917 Real distance_31 = pointSegmentDistance(x0, x3, x1, xp2);
918 Real distance_3 = std::sqrt((x0 - x3) * (x0 - x3));
919 if (std::min(distance_23, distance_31) < distance_3)
920 {
921 if (distance_23 < distance_31)
922 {
923 region = 5;
924 xp = xp1;
925 return distance_23;
926 }
927 else
928 {
929 region = 6;
930 xp = xp2;
931 return distance_31;
932 }
933 }
934 else
935 {
936 region = 3;
937 xp = x3;
938 return distance_3;
939 }
940 }
941 }
942 mooseError("Cannot find closest location in XFEMFuncs::pointTriangleDistance().");
943}
Real pointSegmentDistance(const Point &x0, const Point &x1, const Point &x2, Point &xp)
Calculate the signed distance from a point to a line segment.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ polyhedron_volume_3d()

double Xfem::polyhedron_volume_3d ( double  coord[],
int  order_max,
int  face_num,
int  node[],
int  node_num,
int  order[] 
)

Definition at line 487 of file XFEMFuncs.C.

527{
528#define DIM_NUM 3
529
530 int face;
531 int n1;
532 int n2;
533 int n3;
534 double term;
535 int v;
536 double volume;
537 double x1;
538 double x2;
539 double x3;
540 double y1;
541 double y2;
542 double y3;
543 double z1;
544 double z2;
545 double z3;
546 //
547 volume = 0.0;
548 //
549 // Triangulate each face.
550 //
551 for (face = 0; face < face_num; face++)
552 {
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];
557
558 for (v = 0; v < order[face] - 2; v++)
559 {
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];
564
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];
569
570 term =
571 x1 * y2 * z3 - x1 * y3 * z2 + x2 * y3 * z1 - x2 * y1 * z3 + x3 * y1 * z2 - x3 * y2 * z1;
572
573 volume = volume + term;
574 }
575 }
576
577 volume = volume / 6.0;
578
579 return volume;
580#undef DIM_NUM
581}
const double v
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)

Referenced by XFEMCutElem3D::computePhysicalVolumeFraction().

◆ r8_acos()

double Xfem::r8_acos ( double  c)

Definition at line 637 of file XFEMFuncs.C.

667{
668#define PI 3.141592653589793
669
670 double value;
671
672 if (c <= -1.0)
673 {
674 value = PI;
675 }
676 else if (1.0 <= c)
677 {
678 value = 0.0;
679 }
680 else
681 {
682 value = acos(c);
683 }
684 return value;
685#undef PI
686}

Referenced by angle_rad_3d().

◆ r8vec_copy()

void Xfem::r8vec_copy ( int  n,
double  a1[],
double  a2[] 
)

Definition at line 363 of file XFEMFuncs.C.

364{
365 // John Burkardt geometry.cpp
366 for (int i = 0; i < n; ++i)
367 a2[i] = a1[i];
368 return;
369}

Referenced by plane_normal_line_exp_int_3d().

◆ r8vec_dot_product()

double Xfem::r8vec_dot_product ( int  n,
double  a1[],
double  a2[] 
)

Definition at line 382 of file XFEMFuncs.C.

383{
384 // John Burkardt geometry.cpp
385 double value = 0.0;
386 for (int i = 0; i < n; ++i)
387 value += a1[i] * a2[i];
388 return value;
389}

Referenced by plane_normal_line_exp_int_3d().

◆ r8vec_eq()

bool Xfem::r8vec_eq ( int  n,
double  a1[],
double  a2[] 
)

Definition at line 372 of file XFEMFuncs.C.

373{
374 // John Burkardt geometry.cpp
375 for (int i = 0; i < n; ++i)
376 if (a1[i] != a2[i])
377 return false;
378 return true;
379}

Referenced by line_exp_is_degenerate_nd().

◆ r8vec_norm()

double Xfem::r8vec_norm ( int  n,
double  a[] 
)

Definition at line 352 of file XFEMFuncs.C.

353{
354 // John Burkardt geometry.cpp
355 double v = 0.0;
356 for (int i = 0; i < n; ++i)
357 v = v + a[i] * a[i];
358 v = std::sqrt(v);
359 return v;
360}

Referenced by plane_normal_line_exp_int_3d().

◆ shapeFunc2D() [1/2]

void Xfem::shapeFunc2D ( unsigned int  nen,
std::vector< Real > &  ss,
std::vector< Point > &  xl,
std::vector< std::vector< Real > > &  shp,
Real &  xsj,
bool  natl_flg 
)

◆ shapeFunc2D() [2/2]

void Xfem::shapeFunc2D ( unsigned int  nen,
std::vector< Real > &  ss,
std::vector< Point > &  xl,
std::vector< std::vector< Real > > &  shp,
Real &  xsj,
bool  natl_flg 
)

Definition at line 267 of file XFEMFuncs.C.

273{
274 // Get shape functions and derivatives
275 Real s[4] = {-0.5, 0.5, 0.5, -0.5};
276 Real t[4] = {-0.5, -0.5, 0.5, 0.5};
277
278 if (nen == 4) // quad element
279 {
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)
283 {
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]);
287 }
288 for (unsigned int i = 0; i < 2; ++i) // x, y
289 {
290 for (unsigned int j = 0; j < 2; ++j) // xi, eta
291 {
292 xs[i][j] = 0.0;
293 for (unsigned int k = 0; k < nen; ++k)
294 xs[i][j] += xl[k](i) * shp[k][j];
295 }
296 }
297 xsj = xs[0][0] * xs[1][1] - xs[0][1] * xs[1][0]; // det(j)
298 if (natl_flg == false) // get global derivatives
299 {
300 Real temp = 1.0 / xsj;
301 sx[0][0] = xs[1][1] * temp; // inv(j)
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)
306 {
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];
309 shp[i][0] = temp;
310 }
311 }
312 }
313 else if (nen == 3) // triangle element
314 {
315 // x1*(y2 - y3) + x2*(y3 - y1) + x3*(y1 - y2)
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();
320 Real xsjr = 1.0;
321 if (xsj != 0.0)
322 xsjr = 1.0 / xsj;
323 // xsj *= 0.5; // we do not have this 0.5 here because in stdQuad2D the sum of all weights in
324 // tri is 0.5
325 shp[0][2] = ss[0];
326 shp[1][2] = ss[1];
327 shp[2][2] = ss[2];
328 if (natl_flg == false) // need global drivatives
329 {
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;
336 }
337 else
338 {
339 shp[0][0] = 1.0;
340 shp[0][1] = 0.0;
341 shp[1][0] = 0.0;
342 shp[1][1] = 1.0;
343 shp[2][0] = -1.0;
344 shp[2][1] = -1.0;
345 }
346 }
347 else
348 mooseError("ShapeFunc2D only works for linear quads and tris!");
349}

◆ stdQuadr2D()

void Xfem::stdQuadr2D ( unsigned int  nen,
unsigned int  iord,
std::vector< std::vector< Real > > &  sg2 
)

Definition at line 94 of file XFEMFuncs.C.

95{
96 // Purpose: get Guass integration points for 2D quad and tri elems
97 // N.B. only works for n_qp <= 6
98
99 Real lr4[4] = {-1.0, 1.0, -1.0, 1.0}; // libmesh order
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}; // libmesh order
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};
104
105 if (nen == 4) // 2d quad element
106 {
107 if (iord == 1) // 1-point Gauss
108 {
109 sg2.resize(1);
110 sg2[0].resize(3);
111 sg2[0][0] = 0.0;
112 sg2[0][1] = 0.0;
113 sg2[0][2] = 4.0;
114 }
115 else if (iord == 2) // 2x2-point Gauss
116 {
117 sg2.resize(4);
118 for (unsigned int i = 0; i < 4; ++i)
119 sg2[i].resize(3);
120 for (unsigned int i = 0; i < 4; ++i)
121 {
122 sg2[i][0] = (1 / sqrt(3)) * lr4[i];
123 sg2[i][1] = (1 / sqrt(3)) * lz4[i];
124 sg2[i][2] = 1.0;
125 }
126 }
127 else if (iord == 3) // 3x3-point Gauss
128 {
129 sg2.resize(9);
130 for (unsigned int i = 0; i < 9; ++i)
131 sg2[i].resize(3);
132 for (unsigned int i = 0; i < 9; ++i)
133 {
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];
137 }
138 }
139 else
140 mooseError("Invalid quadrature order = " + Moose::stringify(iord) + " for quad elements");
141 }
142 else if (nen == 3) // triangle
143 {
144 if (iord == 1) // one-point Gauss
145 {
146 sg2.resize(1);
147 sg2[0].resize(4);
148 sg2[0][0] = 1.0 / 3.0;
149 sg2[0][1] = 1.0 / 3.0;
150 sg2[0][2] = 1.0 / 3.0;
151 sg2[0][3] = 0.5;
152 }
153 else if (iord == 2) // three-point Gauss
154 {
155 sg2.resize(3);
156 for (unsigned int i = 0; i < 3; ++i)
157 sg2[i].resize(4);
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;
170 }
171 else if (iord == 3) // four-point Gauss
172 {
173 sg2.resize(4);
174 for (unsigned int i = 0; i < 4; ++i)
175 sg2[i].resize(4);
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;
180
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;
185
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;
190
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;
195 }
196 else if (iord == 4) // six-point Guass
197 {
198 const unsigned int n_wts = 2;
199 const Real wts[n_wts] = {1.1169079483900573284750350421656140e-01L,
200 5.4975871827660933819163162450105264e-02L};
201
202 const Real a[n_wts] = {4.4594849091596488631832925388305199e-01L,
203 9.1576213509770743459571463402201508e-02L};
204
205 const Real b[n_wts] = {0., 0.}; // not used
206 const unsigned int permutation_ids[n_wts] = {3, 3};
207
208 std::vector<Point> points;
209 std::vector<Real> weights;
210 dunavant_rule2(wts, a, b, permutation_ids, n_wts, points, weights); // 6 total points
211
212 sg2.resize(6);
213 for (unsigned int i = 0; i < 6; ++i)
214 sg2[i].resize(4);
215 for (unsigned int i = 0; i < 6; ++i)
216 {
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];
221 }
222 }
223 else
224 mooseError("Invalid quadrature order = " + Moose::stringify(iord) + " for triangle elements");
225 }
226 else
227 mooseError("Invalid 2D element type");
228}
std::string stringify(const T &t)
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)

Referenced by XFEMCutElem2D::getPhysicalQuadraturePoints(), and XFEM::getXFEMqRuleOnSurface().

◆ wissmannPoints()

void Xfem::wissmannPoints ( unsigned int  nqp,
std::vector< std::vector< Real > > &  wss 
)

Definition at line 231 of file XFEMFuncs.C.

232{
233 if (nqp == 6)
234 {
235 wss.resize(6);
236 for (unsigned int i = 0; i < 6; ++i)
237 wss[i].resize(3);
238 wss[0][0] = 0.0;
239 wss[0][1] = 0.0;
240 wss[0][2] = 1.1428571428571428;
241
242 wss[1][0] = 0.0;
243 wss[1][1] = 9.6609178307929590e-01;
244 wss[1][2] = 4.3956043956043956e-01;
245
246 wss[2][0] = 8.5191465330460049e-01;
247 wss[2][1] = 4.5560372783619284e-01;
248 wss[2][2] = 5.6607220700753210e-01;
249
250 wss[3][0] = -wss[2][0];
251 wss[3][1] = wss[2][1];
252 wss[3][2] = wss[2][2];
253
254 wss[4][0] = 6.3091278897675402e-01;
255 wss[4][1] = -7.3162995157313452e-01;
256 wss[4][2] = 6.4271900178367668e-01;
257
258 wss[5][0] = -wss[4][0];
259 wss[5][1] = wss[4][1];
260 wss[5][2] = wss[4][2];
261 }
262 else
263 mooseError("Unknown Wissmann quadrature type");
264}

Variable Documentation

◆ tol

const double Xfem::tol = 1.0e-10
static