www.mooseframework.org
LevelSetCutUserObject.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 
10 #include "LevelSetCutUserObject.h"
11 #include "SubProblem.h"
12 #include "MooseVariable.h"
13 #include "libmesh/string_to_enum.h"
14 
16 
17 template <>
18 InputParameters
20 {
21  InputParameters params = validParams<GeometricCutUserObject>();
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");
25  return params;
26 }
27 
28 LevelSetCutUserObject::LevelSetCutUserObject(const InputParameters & parameters)
29  : GeometricCutUserObject(parameters),
30  _level_set_var_number(_subproblem
31  .getVariable(_tid,
32  parameters.get<VariableName>("level_set_var"),
33  Moose::VarKindType::VAR_ANY,
34  Moose::VarFieldType::VAR_FIELD_STANDARD)
35  .number()),
36  _system(_subproblem.getSystem(getParam<VariableName>("level_set_var"))),
37  _solution(_system.current_local_solution.get())
38 {
39 }
40 
41 bool
43  std::vector<Xfem::CutEdge> & cut_edges,
44  std::vector<Xfem::CutNode> & /*cut_nodes*/,
45  Real /*time*/) const
46 {
47  bool cut_elem = false;
48 
49  unsigned int n_sides = elem->n_sides();
50 
51  for (unsigned int i = 0; i < n_sides; ++i)
52  {
53  UniquePtr<const Elem> curr_side = elem->side_ptr(i);
54 
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()));
60 
61  const Node * node1 = curr_side->node_ptr(0);
62  const Node * node2 = curr_side->node_ptr(1);
63 
64  dof_id_type ls_dof_id_1 = node1->dof_number(_system.number(), _level_set_var_number, 0);
65  dof_id_type ls_dof_id_2 = node2->dof_number(_system.number(), _level_set_var_number, 0);
66 
67  Number ls_node_1 = (*_solution)(ls_dof_id_1);
68  Number ls_node_2 = (*_solution)(ls_dof_id_2);
69 
70  if (ls_node_1 * ls_node_2 < 0)
71  {
72  cut_elem = true;
73  Xfem::CutEdge mycut;
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);
77  mycut._distance = seg_int_frac;
78  mycut._host_side_id = i;
79  cut_edges.push_back(mycut);
80  }
81  }
82 
83  return cut_elem;
84 }
85 
86 bool
88  std::vector<Xfem::CutFace> & cut_faces,
89  Real /*time*/) const
90 {
91  bool cut_elem = false;
92 
93  for (unsigned int i = 0; i < elem->n_sides(); ++i)
94  {
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 ",
98  curr_side->dim());
99  unsigned int n_edges = curr_side->n_sides();
100 
101  std::vector<unsigned int> cut_edges;
102  std::vector<Real> cut_pos;
103 
104  for (unsigned int j = 0; j < n_edges; j++)
105  {
106  // This returns the lowest-order type of side.
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()));
113 
114  const Node * node1 = curr_edge->node_ptr(0);
115  const Node * node2 = curr_edge->node_ptr(1);
116 
117  dof_id_type ls_dof_id_1 = node1->dof_number(_system.number(), _level_set_var_number, 0);
118  dof_id_type ls_dof_id_2 = node2->dof_number(_system.number(), _level_set_var_number, 0);
119 
120  Number ls_node_1 = (*_solution)(ls_dof_id_1);
121  Number ls_node_2 = (*_solution)(ls_dof_id_2);
122 
123  if (ls_node_1 * ls_node_2 < 0)
124  {
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);
128  }
129  }
130 
131  if (cut_edges.size() == 2)
132  {
133  cut_elem = true;
134  Xfem::CutFace mycut;
135  mycut._face_id = i;
136  mycut._face_edge.push_back(cut_edges[0]);
137  mycut._face_edge.push_back(cut_edges[1]);
138  mycut._position.push_back(cut_pos[0]);
139  mycut._position.push_back(cut_pos[1]);
140  cut_faces.push_back(mycut);
141  }
142  }
143  return cut_elem;
144 }
145 
146 bool
147 LevelSetCutUserObject::cutFragmentByGeometry(std::vector<std::vector<Point>> & /*frag_edges*/,
148  std::vector<Xfem::CutEdge> & /*cut_edges*/,
149  Real /*time*/) const
150 {
151  return false;
152 }
153 
154 bool
155 LevelSetCutUserObject::cutFragmentByGeometry(std::vector<std::vector<Point>> & /*frag_faces*/,
156  std::vector<Xfem::CutFace> & /*cut_faces*/,
157  Real /*time*/) const
158 {
159  mooseError("cutFragmentByGeometry not yet implemented for 3d level set cutting");
160  return false;
161 }
162 
163 const std::vector<Point>
164 LevelSetCutUserObject::getCrackFrontPoints(unsigned int /*num_crack_front_points*/) const
165 {
166  mooseError("getCrackFrontPoints() is not implemented for this object.");
167 }
LevelSetCutUserObject::cutElementByGeometry
virtual bool cutElementByGeometry(const Elem *elem, std::vector< Xfem::CutEdge > &cut_edges, std::vector< Xfem::CutNode > &cut_nodes, Real time) const override
Check to see whether a specified 2D element should be cut based on geometric conditions.
Definition: LevelSetCutUserObject.C:42
Xfem::CutEdge::_id1
unsigned int _id1
ID of the first node on the edge.
Definition: GeometricCutUserObject.h:29
LevelSetCutUserObject.h
Xfem::CutEdge::_distance
Real _distance
Fractional distance along the edge (from node 1 to 2) where the cut is located.
Definition: GeometricCutUserObject.h:33
validParams< GeometricCutUserObject >
InputParameters validParams< GeometricCutUserObject >()
Definition: GeometricCutUserObject.C:25
LevelSetCutUserObject::_system
const System & _system
system reference
Definition: LevelSetCutUserObject.h:48
Xfem::CutFace::_position
std::vector< Real > _position
Fractional distance along the cut edges where the cut is located.
Definition: GeometricCutUserObject.h:71
Xfem::CutEdge::_id2
unsigned int _id2
ID of the second node on the edge.
Definition: GeometricCutUserObject.h:31
validParams< LevelSetCutUserObject >
InputParameters validParams< LevelSetCutUserObject >()
Definition: LevelSetCutUserObject.C:19
Xfem::CutEdge::_host_side_id
unsigned int _host_side_id
Local ID of this side in the host element.
Definition: GeometricCutUserObject.h:35
LevelSetCutUserObject::getCrackFrontPoints
virtual const std::vector< Point > getCrackFrontPoints(unsigned int num_crack_front_points) const override
get a set of points along a crack front from a XFEM GeometricCutUserObject
Definition: LevelSetCutUserObject.C:164
GeometricCutUserObject
Definition: GeometricCutUserObject.h:106
LevelSetCutUserObject::LevelSetCutUserObject
LevelSetCutUserObject(const InputParameters &parameters)
Definition: LevelSetCutUserObject.C:28
Xfem::CutFace::_face_id
unsigned int _face_id
ID of the cut face.
Definition: GeometricCutUserObject.h:67
LevelSetCutUserObject
Definition: LevelSetCutUserObject.h:20
Xfem::CutFace::_face_edge
std::vector< unsigned int > _face_edge
IDs of all cut faces.
Definition: GeometricCutUserObject.h:69
LevelSetCutUserObject::cutFragmentByGeometry
virtual bool cutFragmentByGeometry(std::vector< std::vector< Point >> &frag_edges, std::vector< Xfem::CutEdge > &cut_edges, Real time) const override
Check to see whether a fragment of a 2D element should be cut based on geometric conditions.
Definition: LevelSetCutUserObject.C:147
LevelSetCutUserObject::_level_set_var_number
const unsigned int _level_set_var_number
The variable number of the level set variable we using to define the cuts.
Definition: LevelSetCutUserObject.h:45
Xfem::CutFace
Data structure defining a cut through a face.
Definition: GeometricCutUserObject.h:64
Xfem::CutEdge
Data structure defining a cut on an element edge.
Definition: GeometricCutUserObject.h:26
registerMooseObject
registerMooseObject("XFEMApp", LevelSetCutUserObject)