www.mooseframework.org
PointValueAtXFEMInterface.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "MooseMesh.h"
12 #include "MooseVariableFE.h"
13 #include "XFEM.h"
15 
16 #include "libmesh/mesh_tools.h"
17 #include "libmesh/parallel_algebra.h"
18 #include "libmesh/parallel.h"
19 
21 
22 template <>
23 InputParameters
25 {
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.");
35  return params;
36 }
37 
38 PointValueAtXFEMInterface::PointValueAtXFEMInterface(const InputParameters & parameters)
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())
46 {
47 }
48 
49 void
51 {
52  _pl = _mesh.getPointLocator();
53 
54  const UserObject * uo =
55  &(_fe_problem.getUserObjectBase(getParam<UserObjectName>("geometric_cut_userobject")));
56 
57  if (dynamic_cast<const LineSegmentCutSetUserObject *>(uo) == nullptr)
58  mooseError("UserObject casting to GeometricCutUserObject in XFEMSingleVariableConstraint");
59 
60  _geo_cut = dynamic_cast<const LineSegmentCutSetUserObject *>(uo);
61 
62  _xfem = MooseSharedNamespace::dynamic_pointer_cast<XFEM>(_fe_problem.getXFEM());
63  if (_xfem == nullptr)
64  mooseError("Problem casting to XFEM in PointValueAtXFEMInterface");
65 
66  _elem_pairs = _xfem->getXFEMCutElemPairs(_xfem->getGeometricCutID(_geo_cut));
67 }
68 
69 void
71 {
76  _points.clear();
77 
78  std::vector<Real> cut_data = _geo_cut->getCutData();
79 
80  const int line_cut_data_len = 6;
81  for (unsigned int i = 0; i < cut_data.size() / line_cut_data_len; ++i)
82  {
83  _points.push_back(
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)
86  _points.push_back(
87  Point(cut_data[i * line_cut_data_len + 2], cut_data[i * line_cut_data_len + 3]));
88  }
89 
90  BoundingBox bbox = _mesh.getInflatedProcessorBoundingBox();
91 
92  std::vector<Point> point_vec(1);
93 
94  for (MooseIndex(_points) i = 0; i < _points.size(); ++i)
95  {
96  Point p = _points[i];
97 
98  if (bbox.contains_point(p))
99  {
100  const Elem * elem = getElemContainingPoint(p, true);
101 
102  if (elem != nullptr)
103  {
104  point_vec[0] = p;
105 
106  _subproblem.setCurrentSubdomainID(elem, 0);
107  _subproblem.reinitElemPhys(elem, point_vec, 0);
108 
109  _values_positive_level_set_side[i] = (dynamic_cast<MooseVariable *>(_var))->sln()[0];
111  ((dynamic_cast<MooseVariable *>(_var))->gradSln())[0];
112  }
113 
114  const Elem * elem2 = getElemContainingPoint(p, false);
115  if (elem2 != nullptr)
116  {
117  point_vec[0] = p;
118 
119  _subproblem.setCurrentSubdomainID(elem2, 0);
120  _subproblem.reinitElemPhys(elem2, point_vec, 0);
121 
122  _values_negative_level_set_side[i] = (dynamic_cast<MooseVariable *>(_var))->sln()[0];
124  ((dynamic_cast<MooseVariable *>(_var))->gradSln())[0];
125  }
126  }
127  }
128 }
129 
130 void
132 {
133  _communicator.set_union(_values_positive_level_set_side);
134  _communicator.set_union(_grad_values_positive_level_set_side);
135  _communicator.set_union(_values_negative_level_set_side);
136  _communicator.set_union(_grad_values_negative_level_set_side);
137 }
138 
139 const Elem *
140 PointValueAtXFEMInterface::getElemContainingPoint(const Point & p, bool positive_level_set)
141 {
142  const Elem * elem1 = (*_pl)(p);
143 
144  if (elem1->processor_id() != processor_id())
145  return nullptr;
146 
147  const Node * node = elem1->node_ptr(0);
148 
149  dof_id_type ls_dof_id = node->dof_number(_system.number(), _level_set_var_number, 0);
150 
151  Number ls_node_value = (*_solution)(ls_dof_id);
152 
153  bool positive = false;
154 
155  if (_xfem->isPointInsidePhysicalDomain(elem1, *node))
156  {
157  if (ls_node_value > 0.0)
158  positive = true;
159  }
160  else
161  {
162  if (ls_node_value < 0.0)
163  positive = true;
164  }
165 
166  const Elem * elem2 = nullptr;
167  bool found = false;
168  for (auto & pair : *_elem_pairs)
169  {
170  if (pair.first == elem1)
171  {
172  elem2 = pair.second;
173  found = true;
174  }
175  else if (pair.second == elem1)
176  {
177  elem2 = pair.first;
178  found = true;
179  }
180  }
181 
182  if (!found)
183  mooseError(
184  "PointValueAtXFEMInterface: The interface points are not found by element pair locator.");
185 
186  if ((positive && positive_level_set) || (!positive && !positive_level_set))
187  return elem1;
188  else if ((!positive && positive_level_set) || (positive && !positive_level_set))
189  return elem2;
190  else
191  return nullptr;
192 }
PointValueAtXFEMInterface.h
PointValueAtXFEMInterface::_geo_cut
const LineSegmentCutSetUserObject * _geo_cut
Pointer to LineSegmentCutSetUserObject object.
Definition: PointValueAtXFEMInterface.h:97
PointValueAtXFEMInterface::execute
virtual void execute() override
Definition: PointValueAtXFEMInterface.C:70
PointValueAtXFEMInterface::_mesh
MooseMesh & _mesh
The Mesh we're using.
Definition: PointValueAtXFEMInterface.h:82
PointValueAtXFEMInterface::finalize
virtual void finalize() override
Definition: PointValueAtXFEMInterface.C:131
PointValueAtXFEMInterface::_system
const System & _system
System reference.
Definition: PointValueAtXFEMInterface.h:106
PointValueAtXFEMInterface::PointValueAtXFEMInterface
PointValueAtXFEMInterface(const InputParameters &parameters)
Definition: PointValueAtXFEMInterface.C:38
PointValueAtXFEMInterface::_pl
std::unique_ptr< PointLocatorBase > _pl
Pointer to PointLocatorBase object.
Definition: PointValueAtXFEMInterface.h:88
LineSegmentCutSetUserObject::getCutData
virtual std::vector< Real > getCutData() const
Get the cut location information.
Definition: LineSegmentCutSetUserObject.h:32
PointValueAtXFEMInterface::_xfem
std::shared_ptr< XFEM > _xfem
Pointer to the XFEM controller object.
Definition: PointValueAtXFEMInterface.h:91
PointValueAtXFEMInterface::_values_positive_level_set_side
std::map< unsigned int, Real > _values_positive_level_set_side
Mapping from point index and its values at the positive level set side.
Definition: PointValueAtXFEMInterface.h:112
PointValueAtXFEMInterface::_var
MooseVariableFEBase * _var
Pointer to MooseVariableFEBase object.
Definition: PointValueAtXFEMInterface.h:100
PointValueAtXFEMInterface::_elem_pairs
const ElementPairLocator::ElementPairList * _elem_pairs
Pointer to ElementPairList object.
Definition: PointValueAtXFEMInterface.h:94
PointValueAtXFEMInterface::getElemContainingPoint
const Elem * getElemContainingPoint(const Point &p, bool positive_level_set)
Find the element in the element pairs that contains the point in its physical domain.
Definition: PointValueAtXFEMInterface.C:140
PointValueAtXFEMInterface::_points
std::vector< Point > _points
The points to evaluate at.
Definition: PointValueAtXFEMInterface.h:85
XFEM.h
LineSegmentCutSetUserObject.h
PointValueAtXFEMInterface::_level_set_var_number
const unsigned int _level_set_var_number
The variable number of the level set variable we are operating on.
Definition: PointValueAtXFEMInterface.h:103
PointValueAtXFEMInterface::initialize
virtual void initialize() override
Definition: PointValueAtXFEMInterface.C:50
registerMooseObject
registerMooseObject("XFEMApp", PointValueAtXFEMInterface)
validParams< PointValueAtXFEMInterface >
InputParameters validParams< PointValueAtXFEMInterface >()
Definition: PointValueAtXFEMInterface.C:24
PointValueAtXFEMInterface::_grad_values_negative_level_set_side
std::map< unsigned int, RealVectorValue > _grad_values_negative_level_set_side
Mapping from point index and its gradient at the negative level set side.
Definition: PointValueAtXFEMInterface.h:121
PointValueAtXFEMInterface::_values_negative_level_set_side
std::map< unsigned int, Real > _values_negative_level_set_side
Mapping from point index and its values at the negative level set side.
Definition: PointValueAtXFEMInterface.h:115
PointValueAtXFEMInterface
Definition: PointValueAtXFEMInterface.h:26
PointValueAtXFEMInterface::_grad_values_positive_level_set_side
std::map< unsigned int, RealVectorValue > _grad_values_positive_level_set_side
Mapping from point index and its gradient at the positive level set side.
Definition: PointValueAtXFEMInterface.h:118