www.mooseframework.org
XFEMMaterialStateMarkerBase.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 
12 #include "XFEM.h"
13 #include "MooseMesh.h"
14 
15 #include "libmesh/parallel_algebra.h"
16 #include "libmesh/parallel.h"
17 
18 template <>
19 InputParameters
21 {
22  InputParameters params = validParams<ElementUserObject>();
23  params.addParam<std::vector<BoundaryName>>(
24  "initiate_on_boundary",
25  "Permit cracks to initiate in elements adjacent to specified boundaries");
26  params.addParam<bool>("secondary_cracks", false, "should secondary cracks be allowed");
27  return params;
28 }
29 
31  : ElementUserObject(parameters),
32  _mesh(_subproblem.mesh()),
33  _secondary_cracks(getParam<bool>("secondary_cracks"))
34 {
35  FEProblemBase * fe_problem = dynamic_cast<FEProblemBase *>(&_subproblem);
36  if (fe_problem == NULL)
37  mooseError("Problem casting _subproblem to FEProblemBase in XFEMMaterialStateMarkerBase");
38  _xfem = MooseSharedNamespace::dynamic_pointer_cast<XFEM>(fe_problem->getXFEM());
39  if (_xfem == nullptr)
40  mooseError("Problem casting to XFEM in XFEMMaterialStateMarkerBase");
41  if (isNodal())
42  mooseError("XFEMMaterialStateMarkerBase can only be run on an element variable");
43 
44  if (isParamValid("initiate_on_boundary"))
45  {
46  std::vector<BoundaryName> initiation_boundary_names =
47  getParam<std::vector<BoundaryName>>("initiate_on_boundary");
48  _initiation_boundary_ids = _mesh.getBoundaryIDs(initiation_boundary_names, true);
49  }
50 }
51 
52 void
54 {
55  _marked_elems.clear();
57  .clear(); // mark the fragment which has secondary crack growing from the primary crack
58  _marked_elem_sides.clear();
59 }
60 
61 void
63 {
64  RealVectorValue direction;
65  bool isCut = _xfem->isElemCut(_current_elem);
66  bool isCTE = _xfem->isElemAtCrackTip(_current_elem);
67  bool isOnBoundary = false;
68  unsigned int boundarySide = 99999;
69  unsigned int _current_eid = _current_elem->id();
70  std::map<unsigned int, RealVectorValue>::iterator mit;
71  mit = _marked_elems.find(_current_eid);
72 
73  for (unsigned int i = 0; i < _initiation_boundary_ids.size(); ++i)
74  {
75  if (_mesh.isBoundaryElem(_current_eid, _initiation_boundary_ids[i]))
76  {
77  isOnBoundary = true;
78  boundarySide = _mesh.sideWithBoundaryID(_current_elem, _initiation_boundary_ids[i]);
79  }
80  }
81 
82  if (isCTE && doesElementCrack(direction))
83  {
84  if (mit != _marked_elems.end())
85  {
86  mooseError("ERROR: element ", _current_eid, " already marked for crack growth.");
87  }
88  _marked_elems[_current_eid] = direction;
89  }
90  else if (isOnBoundary && doesElementCrack(direction))
91  {
92  if (mit != _marked_elems.end())
93  {
94  mooseError("ERROR: element ", _current_eid, " already marked for crack growth.");
95  }
96  _marked_elems[_current_eid] = direction;
97  _marked_elem_sides[_current_eid] = boundarySide;
98  }
99  else if (isCut && _secondary_cracks && doesElementCrack(direction))
100  {
101  if (mit != _marked_elems.end())
102  {
103  mooseError("ERROR: element ", _current_eid, " already marked for crack growth.");
104  }
105  _marked_elems[_current_eid] = direction;
106  _marked_frags.insert(_current_eid);
107  }
108 }
109 
110 void
112 {
113  const XFEMMaterialStateMarkerBase & xmuo = dynamic_cast<const XFEMMaterialStateMarkerBase &>(y);
114 
115  for (std::map<unsigned int, RealVectorValue>::const_iterator mit = xmuo._marked_elems.begin();
116  mit != xmuo._marked_elems.end();
117  ++mit)
118  {
119  _marked_elems[mit->first] = mit->second; // TODO do error checking for duplicates here too
120  }
121 
122  for (std::set<unsigned int>::const_iterator mit = xmuo._marked_frags.begin();
123  mit != xmuo._marked_frags.end();
124  ++mit)
125  {
126  _marked_frags.insert(*mit); // TODO do error checking for duplicates here too
127  }
128 
129  for (std::map<unsigned int, unsigned int>::const_iterator mit = xmuo._marked_elem_sides.begin();
130  mit != xmuo._marked_elem_sides.end();
131  ++mit)
132  {
133  _marked_elem_sides[mit->first] = mit->second; // TODO do error checking for duplicates here too
134  }
135 }
136 
137 void
139 {
140  _communicator.set_union(_marked_elems);
141  _communicator.set_union(_marked_frags);
142  _communicator.set_union(_marked_elem_sides);
143 
144  _xfem->clearStateMarkedElems();
145  std::map<unsigned int, RealVectorValue>::iterator mit;
146  for (mit = _marked_elems.begin(); mit != _marked_elems.end(); ++mit)
147  {
148  if (_marked_elem_sides.find(mit->first) != _marked_elem_sides.end())
149  {
150  _xfem->addStateMarkedElem(mit->first, mit->second, _marked_elem_sides[mit->first]);
151  }
152  else if (_marked_frags.find(mit->first) != _marked_frags.end())
153  {
154  _xfem->addStateMarkedFrag(mit->first, mit->second);
155  }
156  else
157  {
158  _xfem->addStateMarkedElem(mit->first, mit->second);
159  }
160  }
161  _marked_elems.clear();
162  _marked_frags.clear();
163  _marked_elem_sides.clear();
164 }
165 
166 bool
168 {
169  direction(1) = 1.0;
170  return true;
171 }
XFEMMaterialStateMarkerBase::_secondary_cracks
bool _secondary_cracks
Definition: XFEMMaterialStateMarkerBase.h:44
XFEMMaterialStateMarkerBase::threadJoin
virtual void threadJoin(const UserObject &y) override
Definition: XFEMMaterialStateMarkerBase.C:111
XFEMMaterialStateMarkerBase::_mesh
MooseMesh & _mesh
Definition: XFEMMaterialStateMarkerBase.h:42
XFEMMaterialStateMarkerBase::_initiation_boundary_ids
std::vector< BoundaryID > _initiation_boundary_ids
Definition: XFEMMaterialStateMarkerBase.h:43
XFEMMaterialStateMarkerBase::doesElementCrack
virtual bool doesElementCrack(RealVectorValue &direction)
Determine whether the current element should be cut by a new crack.
Definition: XFEMMaterialStateMarkerBase.C:167
XFEMMaterialStateMarkerBase::XFEMMaterialStateMarkerBase
XFEMMaterialStateMarkerBase(const InputParameters &parameters)
Factory constructor, takes parameters so that all derived classes can be built using the same constru...
Definition: XFEMMaterialStateMarkerBase.C:30
XFEM.h
XFEMMaterialStateMarkerBase::initialize
virtual void initialize() override
Definition: XFEMMaterialStateMarkerBase.C:53
XFEMMaterialStateMarkerBase::_xfem
std::shared_ptr< XFEM > _xfem
Definition: XFEMMaterialStateMarkerBase.h:45
XFEMMaterialStateMarkerBase::_marked_elem_sides
std::map< unsigned int, unsigned int > _marked_elem_sides
Definition: XFEMMaterialStateMarkerBase.h:48
XFEMMaterialStateMarkerBase::_marked_elems
std::map< unsigned int, RealVectorValue > _marked_elems
Definition: XFEMMaterialStateMarkerBase.h:46
XFEMMaterialStateMarkerBase
Coupled auxiliary value.
Definition: XFEMMaterialStateMarkerBase.h:19
XFEMMaterialStateMarkerBase::_marked_frags
std::set< unsigned int > _marked_frags
Definition: XFEMMaterialStateMarkerBase.h:47
validParams< XFEMMaterialStateMarkerBase >
InputParameters validParams< XFEMMaterialStateMarkerBase >()
Definition: XFEMMaterialStateMarkerBase.C:20
XFEMMaterialStateMarkerBase::finalize
virtual void finalize() override
Definition: XFEMMaterialStateMarkerBase.C:138
XFEMMaterialStateMarkerBase.h
XFEMMaterialStateMarkerBase::execute
virtual void execute() override
Definition: XFEMMaterialStateMarkerBase.C:62