11 #include "SubProblem.h"
12 #include "MooseVariable.h"
13 #include "libmesh/string_to_enum.h"
22 params.addRequiredParam<VariableName>(
23 "level_set_var",
"The name of level set variable used to represent the interface");
24 params.addClassDescription(
"XFEM mesh cut by level set function");
30 _level_set_var_number(_subproblem
32 parameters.get<VariableName>(
"level_set_var"),
33 Moose::VarKindType::VAR_ANY,
34 Moose::VarFieldType::VAR_FIELD_STANDARD)
36 _system(_subproblem.getSystem(getParam<VariableName>(
"level_set_var"))),
37 _solution(_system.current_local_solution.get())
43 std::vector<Xfem::CutEdge> & cut_edges,
44 std::vector<Xfem::CutNode> & ,
47 bool cut_elem =
false;
49 unsigned int n_sides = elem->n_sides();
51 for (
unsigned int i = 0; i < n_sides; ++i)
53 UniquePtr<const Elem> curr_side = elem->side_ptr(i);
55 if (curr_side->type() != EDGE2)
56 mooseError(
"In LevelSetCutUserObject element side must be EDGE2, but type is: ",
57 libMesh::Utility::enum_to_string(curr_side->type()),
58 " base element type is: ",
59 libMesh::Utility::enum_to_string(elem->type()));
61 const Node * node1 = curr_side->node_ptr(0);
62 const Node * node2 = curr_side->node_ptr(1);
67 Number ls_node_1 = (*_solution)(ls_dof_id_1);
68 Number ls_node_2 = (*_solution)(ls_dof_id_2);
70 if (ls_node_1 * ls_node_2 < 0)
74 mycut.
_id1 = node1->id();
75 mycut.
_id2 = node2->id();
76 Real seg_int_frac = std::abs(ls_node_1) / std::abs(ls_node_1 - ls_node_2);
79 cut_edges.push_back(mycut);
88 std::vector<Xfem::CutFace> & cut_faces,
91 bool cut_elem =
false;
93 for (
unsigned int i = 0; i < elem->n_sides(); ++i)
95 std::unique_ptr<const Elem> curr_side = elem->side_ptr(i);
96 if (curr_side->dim() != 2)
97 mooseError(
"In LevelSetCutUserObject dimension of side must be 2, but it is ",
99 unsigned int n_edges = curr_side->n_sides();
101 std::vector<unsigned int> cut_edges;
102 std::vector<Real> cut_pos;
104 for (
unsigned int j = 0; j < n_edges; j++)
107 std::unique_ptr<const Elem> curr_edge = curr_side->side_ptr(j);
108 if (curr_edge->type() != EDGE2)
109 mooseError(
"In LevelSetCutUserObject face edge must be EDGE2, but type is: ",
110 libMesh::Utility::enum_to_string(curr_edge->type()),
111 " base element type is: ",
112 libMesh::Utility::enum_to_string(elem->type()));
114 const Node * node1 = curr_edge->node_ptr(0);
115 const Node * node2 = curr_edge->node_ptr(1);
120 Number ls_node_1 = (*_solution)(ls_dof_id_1);
121 Number ls_node_2 = (*_solution)(ls_dof_id_2);
123 if (ls_node_1 * ls_node_2 < 0)
125 Real seg_int_frac = std::abs(ls_node_1) / std::abs(ls_node_1 - ls_node_2);
126 cut_edges.push_back(j);
127 cut_pos.push_back(seg_int_frac);
131 if (cut_edges.size() == 2)
140 cut_faces.push_back(mycut);
148 std::vector<Xfem::CutEdge> & ,
156 std::vector<Xfem::CutFace> & ,
159 mooseError(
"cutFragmentByGeometry not yet implemented for 3d level set cutting");
163 const std::vector<Point>
166 mooseError(
"getCrackFrontPoints() is not implemented for this object.");