13 #include "MooseError.h"
21 #include "DisplacedProblem.h"
28 params.addClassDescription(
"Base UserObject class for XFEM Geometric Cuts");
29 params.addParam<
bool>(
"heal_always",
false,
"Heal previous cuts at every time step");
30 ExecFlagEnum & exec = params.set<ExecFlagEnum>(
"execute_on");
32 params.setDocString(
"execute_on", exec.getDocString());
34 params.suppressParameter<ExecFlagEnum>(
"execute_on");
42 _xfem = MooseSharedNamespace::dynamic_pointer_cast<XFEM>(_fe_problem.getXFEM());
44 mooseError(
"Problem casting to XFEM in GeometricCutUserObject");
46 _xfem->addGeometricCut(
this);
49 _fe_problem.geomSearchData().addElementPairLocator(
_interface_id, new_xfem_epl);
51 if (_fe_problem.getDisplacedProblem() != NULL)
53 auto new_xfem_epl2 = std::make_shared<XFEMElementPairLocator>(
_xfem,
_interface_id,
true);
54 _fe_problem.getDisplacedProblem()->geomSearchData().addElementPairLocator(
_interface_id,
69 if (_current_elem->dim() == 2)
71 std::vector<Xfem::CutEdge> elem_cut_edges;
72 std::vector<Xfem::CutNode> elem_cut_nodes;
73 std::vector<Xfem::CutEdge> frag_cut_edges;
74 std::vector<std::vector<Point>> frag_edges;
82 _xfem->getFragmentEdges(_current_elem, EFAElem, frag_edges);
100 else if (_current_elem->dim() == 3)
102 std::vector<Xfem::CutFace> elem_cut_faces;
103 std::vector<Xfem::CutFace> frag_cut_faces;
104 std::vector<std::vector<Point>> frag_faces;
112 _xfem->getFragmentFaces(_current_elem, EFAElem, frag_faces);
140 "Element already inserted in map from a different thread");
146 "Element already inserted in map from a different thread");
213 std::ostringstream oss;
218 serialized_buffer.assign(oss.str());
224 mooseAssert(serialized_buffers.size() == _app.n_processors(),
225 "Unexpected size of serialized_buffers: " << serialized_buffers.size());
228 std::istringstream iss;
231 for (
unsigned int rank = 0; rank < serialized_buffers.size(); ++rank)
234 if (rank == processor_id())
239 iss.str(serialized_buffers[rank]);
242 std::map<unsigned int, std::vector<Xfem::GeomMarkedElemInfo2D>> other_marked_elems_2d;
243 std::map<unsigned int, std::vector<Xfem::GeomMarkedElemInfo3D>> other_marked_elems_3d;
244 dataLoad(iss, other_marked_elems_2d,
this);
245 dataLoad(iss, other_marked_elems_3d,
this);
248 _marked_elems_2d.insert(other_marked_elems_2d.begin(), other_marked_elems_2d.end());
249 _marked_elems_3d.insert(other_marked_elems_3d.begin(), other_marked_elems_3d.end());
257 if (_app.n_processors() > 1)
260 std::string send_buffer;
263 std::vector<std::string> recv_buffers;
269 _communicator.allgather(send_buffer, recv_buffers);
276 for (
const auto & gmei : it.second)
280 for (
const auto & gmei : it.second)