12 #include "FEProblem.h"
20 InputParameters params = validParams<AuxKernel>();
21 params.addClassDescription(
22 "Auxiliary Kernel that calcuates level set value using line segments' description.");
23 params.addParam<UserObjectName>(
24 "line_segment_cut_set_user_object",
25 "Name of GeometricCutUserObject that gives the line segments information.");
30 : AuxKernel(parameters)
33 mooseError(
"LineSegmentLevelSetAux: Aux variable must be nodal variable.");
35 FEProblemBase * fe_problem = dynamic_cast<FEProblemBase *>(&_subproblem);
37 const UserObject * uo = &(
38 fe_problem->getUserObjectBase(getParam<UserObjectName>(
"line_segment_cut_set_user_object")));
40 if (dynamic_cast<const LineSegmentCutSetUserObject *>(uo) ==
nullptr)
42 "Failed to cast UserObject to LineSegmentCutSetUserObject in LineSegmentLevelSetAux");
44 _linesegment_uo = dynamic_cast<const LineSegmentCutSetUserObject *>(uo);
50 const int line_cut_data_len = 6;
52 Real min_dist = std::numeric_limits<Real>::max();
54 for (
unsigned int i = 0; i <
_cut_data.size() / line_cut_data_len; ++i)
56 Point a = Point(
_cut_data[i * line_cut_data_len + 0],
_cut_data[i * line_cut_data_len + 1], 0);
57 Point b = Point(
_cut_data[i * line_cut_data_len + 2],
_cut_data[i * line_cut_data_len + 3], 0);
60 Point v = (b - a) / (b - a).norm();
61 Real d = (b - a).norm();
69 dist = (p - a).norm();
74 dist = (p - b).norm();
80 dist = (p - a - v).norm();
81 nearest_point = (a + v);
84 Point p_nearest_point = nearest_point - p;
86 Point normal_ab = Point(-(b - a)(1), (b - a)(0), 0);
88 if (normal_ab * p_nearest_point < 0)
91 if (std::abs(dist) < std::abs(min_dist))
102 AuxKernel::compute();