11 #include "MooseMesh.h"
12 #include "MooseVariableFE.h"
16 #include "libmesh/mesh_tools.h"
17 #include "libmesh/parallel_algebra.h"
18 #include "libmesh/parallel.h"
26 InputParameters params = validParams<GeneralUserObject>();
27 params.addRequiredParam<VariableName>(
28 "variable",
"The name of the variable that this UserObject operates on");
29 params.addParam<UserObjectName>(
30 "geometric_cut_userobject",
31 "Name of GeometricCutUserObject that provides the points to this UserObject.");
32 params.addRequiredParam<VariableName>(
33 "level_set_var",
"The name of level set variable used to represent the interface");
34 params.addClassDescription(
"Obtain field values and gradients on the interface.");
39 : GeneralUserObject(parameters),
40 _mesh(_subproblem.mesh()),
41 _var(&_subproblem.getVariable(_tid, parameters.get<VariableName>(
"variable"))),
42 _level_set_var_number(
43 _subproblem.getVariable(_tid, parameters.get<VariableName>(
"level_set_var")).number()),
44 _system(_subproblem.getSystem(getParam<VariableName>(
"level_set_var"))),
45 _solution(_system.current_local_solution.get())
54 const UserObject * uo =
55 &(_fe_problem.getUserObjectBase(getParam<UserObjectName>(
"geometric_cut_userobject")));
57 if (dynamic_cast<const LineSegmentCutSetUserObject *>(uo) ==
nullptr)
58 mooseError(
"UserObject casting to GeometricCutUserObject in XFEMSingleVariableConstraint");
60 _geo_cut = dynamic_cast<const LineSegmentCutSetUserObject *>(uo);
62 _xfem = MooseSharedNamespace::dynamic_pointer_cast<XFEM>(_fe_problem.getXFEM());
64 mooseError(
"Problem casting to XFEM in PointValueAtXFEMInterface");
80 const int line_cut_data_len = 6;
81 for (
unsigned int i = 0; i < cut_data.size() / line_cut_data_len; ++i)
84 Point(cut_data[i * line_cut_data_len + 0], cut_data[i * line_cut_data_len + 1]));
85 if (i == cut_data.size() / line_cut_data_len - 1)
87 Point(cut_data[i * line_cut_data_len + 2], cut_data[i * line_cut_data_len + 3]));
90 BoundingBox bbox =
_mesh.getInflatedProcessorBoundingBox();
92 std::vector<Point> point_vec(1);
98 if (bbox.contains_point(p))
106 _subproblem.setCurrentSubdomainID(elem, 0);
107 _subproblem.reinitElemPhys(elem, point_vec, 0);
111 ((dynamic_cast<MooseVariable *>(
_var))->gradSln())[0];
115 if (elem2 !=
nullptr)
119 _subproblem.setCurrentSubdomainID(elem2, 0);
120 _subproblem.reinitElemPhys(elem2, point_vec, 0);
124 ((dynamic_cast<MooseVariable *>(
_var))->gradSln())[0];
142 const Elem * elem1 = (*_pl)(p);
144 if (elem1->processor_id() != processor_id())
147 const Node * node = elem1->node_ptr(0);
151 Number ls_node_value = (*_solution)(ls_dof_id);
153 bool positive =
false;
155 if (
_xfem->isPointInsidePhysicalDomain(elem1, *node))
157 if (ls_node_value > 0.0)
162 if (ls_node_value < 0.0)
166 const Elem * elem2 =
nullptr;
170 if (pair.first == elem1)
175 else if (pair.second == elem1)
184 "PointValueAtXFEMInterface: The interface points are not found by element pair locator.");
186 if ((positive && positive_level_set) || (!positive && !positive_level_set))
188 else if ((!positive && positive_level_set) || (positive && !positive_level_set))