13 #include "MooseError.h"
15 #include "libmesh/string_to_enum.h"
28 params.addClassDescription(
"Base class for 3D XFEM Geometric Cut UserObjects");
40 std::vector<Xfem::CutEdge> & ,
41 std::vector<Xfem::CutNode> & ,
44 mooseError(
"Invalid method: must use vector of element faces for 3D mesh cutting");
50 std::vector<Xfem::CutFace> & cut_faces,
54 bool cut_elem =
false;
56 for (
unsigned int i = 0; i < elem->n_sides(); ++i)
59 std::unique_ptr<const Elem> curr_side = elem->side_ptr(i);
60 if (curr_side->dim() != 2)
61 mooseError(
"In cutElementByGeometry dimension of side must be 2, but it is ",
63 unsigned int n_edges = curr_side->n_sides();
65 std::vector<unsigned int> cut_edges;
66 std::vector<Real> cut_pos;
68 for (
unsigned int j = 0; j < n_edges; j++)
71 std::unique_ptr<const Elem> curr_edge = curr_side->side_ptr(j);
72 if (curr_edge->type() != EDGE2)
73 mooseError(
"In cutElementByGeometry face edge must be EDGE2, but type is: ",
74 libMesh::Utility::enum_to_string(curr_edge->type()),
75 " base element type is: ",
76 libMesh::Utility::enum_to_string(elem->type()));
77 const Node * node1 = curr_edge->node_ptr(0);
78 const Node * node2 = curr_edge->node_ptr(1);
81 if (intersectWithEdge(*node1, *node2, intersection))
83 cut_edges.push_back(j);
84 cut_pos.push_back(getRelativePosition(*node1, *node2, intersection));
88 if (cut_edges.size() == 2)
97 cut_faces.push_back(mycut);
106 std::vector<Xfem::CutEdge> & ,
109 mooseError(
"Invalid method: must use vector of element faces for 3D mesh cutting");
115 std::vector<Xfem::CutFace> & ,
119 mooseError(
"cutFragmentByGeometry not yet implemented for 3D mesh cutting");
126 bool has_intersection =
false;
129 double edge_point1[3] = {p1(0), p1(1), p1(2)};
130 double edge_point2[3] = {p2(0), p2(1), p2(2)};
131 double cut_point[3] = {0.0, 0.0, 0.0};
134 plane_point, plane_normal, edge_point1, edge_point2, cut_point) == 1)
136 Point temp_p(cut_point[0], cut_point[1], cut_point[2]);
140 has_intersection =
true;
143 return has_intersection;
149 Real dotp1 = (p1 - p) * (p2 - p1);
150 Real dotp2 = (p2 - p) * (p2 - p1);
151 return (dotp1 * dotp2 <= 0.0);
157 const Point & p)
const
160 Real full_len = (p2 - p1).norm();
161 Real len_p1_p = (p - p1).norm();
162 return len_p1_p / full_len;