29 EFAError(
"EFAfragment3D constructor must have a from_host to copy from");
30 if (frag_id == std::numeric_limits<unsigned int>::max())
32 for (
unsigned int i = 0; i < from_host->
numFaces(); ++i)
38 EFAError(
"In EFAfragment3D constructor fragment_copy_index out of bounds");
48 for (
unsigned int i = 0; i <
_faces.size(); ++i)
61 for (
unsigned int i = 0; i <
_faces.size(); ++i)
68 bool contains =
false;
69 for (
unsigned int i = 0; i <
_faces.size(); ++i)
83 unsigned int num_cut_faces = 0;
84 for (
unsigned int i = 0; i <
_faces.size(); ++i)
85 if (
_faces[i]->hasIntersection())
99 std::set<EFANode *> all_nodes;
100 for (
unsigned int i = 0; i <
_faces.size(); ++i)
101 for (
unsigned int j = 0;
j <
_faces[i]->numNodes(); ++
j)
102 all_nodes.insert(
_faces[i]->getNode(
j));
111 EFAError(
"in isConnected other_fragment is not of type EFAfragement3D");
113 for (
unsigned int i = 0; i <
_faces.size(); ++i)
114 for (
unsigned int j = 0;
j < other_frag3d->
numFaces(); ++
j)
126 EFAError(
"in isEdgeConnected other_fragment is not of type EFAfragement3D");
128 for (
unsigned int i = 0; i <
_faces.size(); ++i)
129 for (
unsigned int j = 0;
j <
_faces[i]->numEdges(); ++
j)
130 for (
unsigned int k = 0;
k < other_frag3d->
numFaces(); ++
k)
131 for (
unsigned int l = 0; l < other_frag3d->
_faces[
k]->numEdges(); ++l)
132 if (
_faces[i]->getEdge(
j)->equivalent(*(other_frag3d->
_faces[
k]->getEdge(l))))
148 std::map<EFANode *, std::vector<EFAFace *>> emb_inverse_map;
149 for (
unsigned int i = 0; i <
_faces.size(); ++i)
150 for (
unsigned int j = 0;
j <
_faces[i]->numEdges(); ++
j)
151 if (
_faces[i]->getEdge(
j)->hasIntersection())
154 emb_inverse_map[emb_node].push_back(
_faces[i]);
158 std::vector<EFANode *> invalid_emb;
159 std::map<EFANode *, std::vector<EFAFace *>>::iterator it;
160 for (it = emb_inverse_map.begin(); it != emb_inverse_map.end(); ++it)
162 EFANode * emb_node = it->first;
163 std::vector<EFAFace *> & emb_faces = it->second;
164 if (emb_faces.size() != 2)
165 EFAError(
"one embedded node must be owned by 2 faces");
166 unsigned int counter = 0;
167 for (
unsigned int i = 0; i < emb_faces.size(); ++i)
169 unsigned int face_id =
getFaceID(emb_faces[i]);
174 invalid_emb.push_back(emb_node);
178 for (
unsigned int i = 0; i < invalid_emb.size(); ++i)
190 EFAError(
"In combine_tip_faces() the frag must have host_elem");
194 std::vector<unsigned int> frag_tip_face_id;
195 for (
unsigned int j = 0;
j <
_faces.size(); ++
j)
197 frag_tip_face_id.push_back(
j);
199 if (frag_tip_face_id.size() == 2)
209 EFAError(
"in isFaceInterior() fragment must have host elem");
211 bool face_in_elem_face =
false;
215 face_in_elem_face =
true;
220 return !face_in_elem_face;
223 std::vector<unsigned int>
226 std::vector<unsigned int> interior_face_id;
227 for (
unsigned int i = 0; i <
_faces.size(); ++i)
229 interior_face_id.push_back(i);
231 return interior_face_id;
238 EFAError(
"in isThirdInteriorFace fragment must have host elem");
256 if (face_id >
_faces.size() - 1)
257 EFAError(
"in EFAfragment3D::get_face, index out of bounds");
264 for (
unsigned int i = 0; i <
_faces.size(); ++i)
267 EFAError(
"face not found in get_face_id()");
273 _faces.push_back(new_face);
279 std::set<EFANode *> face_nodes;
280 for (
unsigned int i = 0; i <
_faces[face_id]->numNodes(); ++i)
281 face_nodes.insert(
_faces[face_id]->getNode(i));
291 std::vector<EFAFragment3D *>
295 std::vector<EFAFragment3D *> new_fragments;
296 std::vector<std::vector<EFAFace *>> all_subfaces;
297 for (
unsigned int i = 0; i <
_faces.size(); ++i)
299 std::vector<EFAFace *> subfaces =
_faces[i]->split();
300 all_subfaces.push_back(subfaces);
307 for (
unsigned int i = 0; i < all_subfaces.size(); ++i)
308 for (
unsigned int j = 0;
j < all_subfaces[i].size(); ++
j)
309 new_frag->
addFace(all_subfaces[i][
j]);
311 new_fragments.push_back(new_frag);
316 EFAFace * start_face1 =
nullptr;
317 EFAFace * start_face2 =
nullptr;
318 unsigned int startOldFaceID = 0;
319 for (
unsigned int i = 0; i <
_faces.size(); ++i)
321 if (all_subfaces[i].size() == 2)
323 start_face1 = all_subfaces[i][0];
324 start_face2 = all_subfaces[i][1];
331 new_fragments.push_back(new_frag1);
332 new_fragments.push_back(new_frag2);
334 return new_fragments;
341 for (
unsigned int i = 0; i <
_faces.size(); ++i)
343 std::vector<EFAFace *> face_adjacents(
_faces[i]->numEdges(),
nullptr);
344 for (
unsigned int j = 0;
j <
_faces.size(); ++
j)
347 unsigned int adj_edge =
_faces[i]->adjacentCommonEdge(
_faces[
j]);
348 face_adjacents[adj_edge] =
_faces[
j];
364 for (
unsigned int i = 0; i <
_faces.size(); ++i)
372 for (
unsigned int i = 0; i <
_faces.size(); ++i)
380 std::vector<EFANode *> & nodes)
const 384 nodes.resize(all_node_set.size());
385 std::copy(all_node_set.begin(), all_node_set.end(), nodes.begin());
388 face_node_indices.clear();
389 for (
unsigned int i = 0; i <
_faces.size(); ++i)
391 std::vector<unsigned int> line_face_indices;
392 for (
unsigned int j = 0;
j <
_faces[i]->numNodes(); ++
j)
395 unsigned int vec_index = std::find(nodes.begin(), nodes.end(), node) - nodes.begin();
396 line_face_indices.push_back(vec_index);
398 face_node_indices.push_back(line_face_indices);
404 unsigned int startOldFaceID,
405 std::vector<std::vector<EFAFace *>> & subfaces)
408 std::vector<bool> contributed(subfaces.size(),
false);
409 contributed[startOldFaceID] =
true;
410 unsigned int num_contrib_faces = 1;
411 unsigned int old_num_contrib = 1;
412 std::vector<EFAFace *> frag_faces(1, start_face);
417 old_num_contrib = num_contrib_faces;
418 for (
unsigned int i = 0; i < subfaces.size(); ++i)
422 bool adjacent_found =
false;
423 for (
unsigned int j = 0;
j < subfaces[i].size(); ++
j)
425 for (
unsigned int k = 0;
k < frag_faces.size(); ++
k)
427 if (subfaces[i][
j]->isAdjacent(frag_faces[
k]))
429 adjacent_found =
true;
430 contributed[i] =
true;
431 frag_faces.push_back(subfaces[i][
j]);
432 num_contrib_faces += 1;
441 }
while (num_contrib_faces != old_num_contrib);
444 std::vector<EFAEdge *> cut_plane_edges;
446 for (
unsigned int i = 0; i < frag_faces.size(); ++i)
447 new_frag->
addFace(frag_faces[i]);
450 for (
unsigned int i = 0; i < new_frag->
numFaces(); ++i)
453 if (lone_edge !=
nullptr)
454 cut_plane_edges.push_back(
new EFAEdge(*lone_edge));
458 for (
unsigned int i = 0; i < cut_plane_edges.size(); ++i)
459 cut_face->
setEdge(i, cut_plane_edges[i]);
474 for (
unsigned int i = 0; i <
_faces[face_id]->numEdges(); ++i)
476 return _faces[face_id]->getEdge(i);
482 unsigned int face_id2,
490 std::set<EFAFace *> face1_neigh;
493 std::set<EFAFace *> face2_neigh;
496 std::vector<EFAFace *> common_adjacent_faces =
Efa::getCommonElems(face1_neigh, face2_neigh);
498 for (
unsigned int i = 0; i < common_adjacent_faces.size(); ++i)
500 EFAFace * comm_face = common_adjacent_faces[i];
501 if (comm_face !=
nullptr)
513 _faces[face_id1] = full_face;
EFAFragment3D * getFragment(unsigned int frag_id) const
virtual bool containsNode(EFANode *node) const
EFAFace * getFace(unsigned int face_id) const
void removeEmbeddedNode(EFANode *emb_node)
void setEdge(unsigned int edge_id, EFAEdge *new_edge)
virtual unsigned int getNumCuts() const
void findFacesAdjacentToFaces()
virtual unsigned int numInteriorNodes() const
void mooseError(Args &&... args)
EFAElement3D * getHostElement() const
std::vector< EFAFragment3D * > split()
void resetEdgeIntersection(const EFAFace *ref_face)
unsigned int getFaceID(EFAFace *face) const
EFAEdge * loneEdgeOnFace(unsigned int face_id) const
bool deleteFromMap(std::map< unsigned int, T *> &theMap, T *elemToDelete, bool delete_elem=true)
virtual unsigned int numFragments() const
std::vector< std::vector< EFAFace * > > _faces_adjacent_to_faces
void combineTwoEdges(unsigned int edge_id1, unsigned int edge_id2)
unsigned int numFaces() const
EFAFragment3D(EFAElement3D *host, bool create_faces, const EFAElement3D *from_host, unsigned int frag_id=std::numeric_limits< unsigned int >::max())
bool isFaceInterior(unsigned int face_id) const
void getNodeInfo(std::vector< std::vector< unsigned int >> &face_node_indices, std::vector< EFANode *> &nodes) const
bool containsFace(const EFAFace *other_face) const
EFAFragment3D * connectSubfaces(EFAFace *start_face, unsigned int startOldFaceID, std::vector< std::vector< EFAFace *>> &subfaces)
EFAFace * getFace(unsigned int face_id) const
virtual bool isConnected(EFAFragment *other_fragment) const
EFAElement3D * _host_elem
EFAFace * getAdjacentFace(unsigned int face_id, unsigned int edge_id) const
virtual unsigned int getNumCutNodes() const
bool isThirdInteriorFace(unsigned int face_id) const
virtual bool isEdgeConnected(EFAFragment *other_fragment) const
void removeEmbeddedNode(EFANode *emb_node, bool remove_for_neighbor)
void addFace(EFAFace *new_face)
bool hasFaceWithOneCut() const
std::vector< unsigned int > get_interior_face_id() const
std::vector< T > getCommonElems(std::set< T > &v1, std::set< T > &v2)
virtual void removeInvalidEmbeddedNodes(std::map< unsigned int, EFANode *> &EmbeddedNodes)
std::set< EFANode * > getFaceNodes(unsigned int face_id) const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
unsigned int adjacentCommonEdge(const EFAFace *other_face) const
void combine_two_faces(unsigned int face_id1, unsigned int face_id2, const EFAFace *elem_face)
EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const
virtual void switchNode(EFANode *new_node, EFANode *old_node)
std::vector< EFAFace * > _faces
static const std::string k
EFAVolumeNode * getInteriorNode(unsigned int interior_node_id) const
unsigned int numFaces() const
virtual std::set< EFANode * > getAllNodes() const