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())
93 mooseError(
"Not implemented yet for 3D.");
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));
109 bool is_connected =
false;
110 EFAFragment3D * other_frag3d = dynamic_cast<EFAFragment3D *>(other_fragment);
112 EFAError(
"in isConnected other_fragment is not of type EFAfragement3D");
114 for (
unsigned int i = 0; i <
_faces.size(); ++i)
116 for (
unsigned int j = 0; j < other_frag3d->
numFaces(); ++j)
133 EFAFragment3D * other_frag3d = dynamic_cast<EFAFragment3D *>(other_fragment);
135 EFAError(
"in isEdgeConnected other_fragment is not of type EFAfragement3D");
137 for (
unsigned int i = 0; i <
_faces.size(); ++i)
138 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
139 for (
unsigned int k = 0; k < other_frag3d->
numFaces(); ++k)
140 for (
unsigned int l = 0; l < other_frag3d->
_faces[k]->numEdges(); ++l)
141 if (
_faces[i]->getEdge(j)->equivalent(*(other_frag3d->
_faces[k]->getEdge(l))))
157 std::map<EFANode *, std::vector<EFAFace *>> emb_inverse_map;
158 for (
unsigned int i = 0; i <
_faces.size(); ++i)
160 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
162 if (
_faces[i]->getEdge(j)->hasIntersection())
164 EFANode * emb_node =
_faces[i]->getEdge(j)->getEmbeddedNode(0);
165 emb_inverse_map[emb_node].push_back(
_faces[i]);
171 std::vector<EFANode *> invalid_emb;
172 std::map<EFANode *, std::vector<EFAFace *>>::iterator it;
173 for (it = emb_inverse_map.begin(); it != emb_inverse_map.end(); ++it)
175 EFANode * emb_node = it->first;
176 std::vector<EFAFace *> & emb_faces = it->second;
177 if (emb_faces.size() != 2)
178 EFAError(
"one embedded node must be owned by 2 faces");
180 for (
unsigned int i = 0; i < emb_faces.size(); ++i)
182 unsigned int face_id =
getFaceID(emb_faces[i]);
187 invalid_emb.push_back(emb_node);
191 for (
unsigned int i = 0; i < invalid_emb.size(); ++i)
203 EFAError(
"In combine_tip_faces() the frag must have host_elem");
207 std::vector<unsigned int> frag_tip_face_id;
208 for (
unsigned int j = 0; j <
_faces.size(); ++j)
211 frag_tip_face_id.push_back(j);
213 if (frag_tip_face_id.size() == 2)
223 EFAError(
"in isFaceInterior() fragment must have host elem");
225 bool face_in_elem_face =
false;
230 face_in_elem_face =
true;
234 if (!face_in_elem_face)
240 std::vector<unsigned int>
243 std::vector<unsigned int> interior_face_id;
244 for (
unsigned int i = 0; i <
_faces.size(); ++i)
247 interior_face_id.push_back(i);
249 return interior_face_id;
255 bool is_third_cut =
false;
257 EFAError(
"in isThirdInteriorFace fragment must have host elem");
279 if (face_id >
_faces.size() - 1)
280 EFAError(
"in EFAfragment3D::get_face, index out of bounds");
287 for (
unsigned int i = 0; i <
_faces.size(); ++i)
290 EFAError(
"face not found in get_face_id()");
297 _faces.push_back(new_face);
303 std::set<EFANode *> face_nodes;
304 for (
unsigned int i = 0; i <
_faces[face_id]->numNodes(); ++i)
305 face_nodes.insert(
_faces[face_id]->getNode(i));
315 std::vector<EFAFragment3D *>
319 std::vector<EFAFragment3D *> new_fragments;
320 std::vector<std::vector<EFAFace *>> all_subfaces;
321 for (
unsigned int i = 0; i <
_faces.size(); ++i)
323 std::vector<EFAFace *> subfaces =
_faces[i]->split();
324 all_subfaces.push_back(subfaces);
331 for (
unsigned int i = 0; i < all_subfaces.size(); ++i)
332 for (
unsigned int j = 0; j < all_subfaces[i].size(); ++j)
333 new_frag->
addFace(all_subfaces[i][j]);
335 new_fragments.push_back(new_frag);
342 unsigned int startOldFaceID = 0;
343 for (
unsigned int i = 0; i <
_faces.size(); ++i)
345 if (all_subfaces[i].size() == 2)
347 start_face1 = all_subfaces[i][0];
348 start_face2 = all_subfaces[i][1];
355 new_fragments.push_back(new_frag1);
356 new_fragments.push_back(new_frag2);
358 return new_fragments;
365 for (
unsigned int i = 0; i <
_faces.size(); ++i)
367 std::vector<EFAFace *> face_adjacents(
_faces[i]->numEdges(), NULL);
368 for (
unsigned int j = 0; j <
_faces.size(); ++j)
372 unsigned int adj_edge =
_faces[i]->adjacentCommonEdge(
_faces[j]);
373 face_adjacents[adj_edge] =
_faces[j];
389 for (
unsigned int i = 0; i <
_faces.size(); ++i)
397 for (
unsigned int i = 0; i <
_faces.size(); ++i)
405 std::vector<EFANode *> & nodes)
const
409 nodes.resize(all_node_set.size());
410 std::copy(all_node_set.begin(), all_node_set.end(), nodes.begin());
413 face_node_indices.clear();
414 for (
unsigned int i = 0; i <
_faces.size(); ++i)
416 std::vector<unsigned int> line_face_indices;
417 for (
unsigned int j = 0; j <
_faces[i]->numNodes(); ++j)
420 unsigned int vec_index = std::find(nodes.begin(), nodes.end(), node) - nodes.begin();
421 line_face_indices.push_back(vec_index);
423 face_node_indices.push_back(line_face_indices);
429 unsigned int startOldFaceID,
430 std::vector<std::vector<EFAFace *>> & subfaces)
433 std::vector<bool> contributed(subfaces.size(),
false);
434 contributed[startOldFaceID] =
true;
435 unsigned int num_contrib_faces = 1;
436 unsigned int old_num_contrib = 1;
437 std::vector<EFAFace *> frag_faces(1, start_face);
442 old_num_contrib = num_contrib_faces;
443 for (
unsigned int i = 0; i < subfaces.size(); ++i)
447 bool adjacent_found =
false;
448 for (
unsigned int j = 0; j < subfaces[i].size(); ++j)
450 for (
unsigned int k = 0; k < frag_faces.size(); ++k)
452 if (subfaces[i][j]->isAdjacent(frag_faces[k]))
454 adjacent_found =
true;
455 contributed[i] =
true;
456 frag_faces.push_back(subfaces[i][j]);
457 num_contrib_faces += 1;
466 }
while (num_contrib_faces != old_num_contrib);
469 std::vector<EFAEdge *> cut_plane_edges;
471 for (
unsigned int i = 0; i < frag_faces.size(); ++i)
472 new_frag->
addFace(frag_faces[i]);
475 for (
unsigned int i = 0; i < new_frag->
numFaces(); ++i)
478 if (lone_edge != NULL)
479 cut_plane_edges.push_back(
new EFAEdge(*lone_edge));
483 for (
unsigned int i = 0; i < cut_plane_edges.size(); ++i)
484 cut_face->
setEdge(i, cut_plane_edges[i]);
499 for (
unsigned int i = 0; i <
_faces[face_id]->numEdges(); ++i)
501 return _faces[face_id]->getEdge(i);
507 unsigned int face_id2,
515 std::set<EFAFace *> face1_neigh;
518 std::set<EFAFace *> face2_neigh;
521 std::vector<EFAFace *> common_adjacent_faces =
Efa::getCommonElems(face1_neigh, face2_neigh);
523 for (
unsigned int i = 0; i < common_adjacent_faces.size(); ++i)
525 EFAFace * comm_face = common_adjacent_faces[i];
526 if (comm_face != NULL)
538 _faces[face_id1] = full_face;