27 _faces(_num_faces, NULL),
28 _face_neighbors(_num_faces),
29 _face_edge_neighbors(_num_faces)
39 EFAError(
"In EFAelement3D the supported TET element types are TET4 and TET10");
51 EFAError(
"In EFAelement3D the supported HEX element types are HEX8, HEX20 and HEX27");
54 EFAError(
"In EFAelement3D the supported element types are TET4, TET10, HEX8, HEX20 and HEX27");
59 :
EFAElement(from_elem->_id, from_elem->_num_nodes),
60 _num_faces(from_elem->_num_faces),
61 _faces(_num_faces, NULL),
62 _face_neighbors(_num_faces),
63 _face_edge_neighbors(_num_faces)
77 EFAError(
"In EFAelement3D ",
79 " the copy constructor must have from_elem w/ global nodes. node: ",
82 from_elem->
_nodes[i]->category());
88 for (
unsigned int i = 0; i < from_elem->
_fragments.size(); ++i)
102 EFAError(
"In EFAelement3D copy constructor this elem's nodes must be local");
113 EFAError(
"this EFAelement3D constructor only converts global nodes to local nodes");
118 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
126 for (
unsigned int i = 0; i <
_faces.size(); ++i)
265 EFAError(
"EFAElement3D: number of faces should be either 4(TET) or 6(HEX).");
277 bool partial =
false;
282 bool node_in_frag =
false;
283 for (
unsigned int j = 0; j <
_fragments.size(); ++j)
306 for (
unsigned int i = 0; i <
_nodes.size(); ++i)
307 non_physical_nodes.insert(
_nodes[i]);
310 std::set<EFANode *>::iterator sit;
311 for (sit = non_physical_nodes.begin(); sit != non_physical_nodes.end();)
314 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
318 non_physical_nodes.erase(sit++);
334 if (
_nodes[i] == old_node)
337 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
340 for (
unsigned int i = 0; i <
_faces.size(); ++i)
343 if (
_parent && descend_to_parent)
349 for (
unsigned int k = 0; k < neigh_elem->
numChildren(); ++k)
362 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
374 std::vector<EFANode *> & master_nodes,
375 std::vector<double> & master_weights)
const
378 master_nodes.clear();
379 master_weights.clear();
380 bool masters_found =
false;
385 masters_found =
_faces[i]->getMasterInfo(node, master_nodes, master_weights);
389 EFAError(
"In getMasterInfo: cannot find master nodes in element faces");
399 std::vector<double> xi_3d(3, -100.0);
400 for (
unsigned int j = 0; j < 3; ++j)
404 master_nodes.push_back(
_nodes[j]);
411 EFAError(
"unknown 3D element");
412 master_weights.push_back(weight);
414 masters_found =
true;
421 EFAError(
"In EFAelement3D::getMaterInfo, cannot find the given EFAnode");
433 bool overlays =
false;
434 const EFAElement3D * other3d = dynamic_cast<const EFAElement3D *>(other_elem);
436 EFAError(
"failed to dynamic cast to other3d");
440 if (common_face_curr.size() == 1)
442 unsigned int curr_face_id = common_face_curr[0];
444 unsigned int other_face_id = other3d->
getFaceID(curr_face);
449 else if (common_face_curr.size() > 1)
464 EFAError(
"in getNeighborIndex() element ",
_id,
" does not have neighbor ", neighbor_elem->
id());
470 unsigned int face_id,
471 unsigned int edge_id,
472 unsigned int & neigh_face_id,
473 unsigned int & neigh_edge_id)
const
476 for (
unsigned int i = 0; i < neighbor_elem->
numFaces(); ++i)
478 for (
unsigned int j = 0; j < neighbor_elem->
getFace(i)->
numEdges(); ++j)
489 EFAError(
"in getNeighborEdgeIndex() element ",
491 " does not share a common edge with element",
492 neighbor_elem->
id());
499 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
502 for (
unsigned int edge_iter = 0; edge_iter <
_faces[face_iter]->numEdges(); ++edge_iter)
515 EFAError(
"neighbor_elem is not of EFAelement3D type");
517 std::vector<unsigned int> common_face_id =
getCommonFaceID(neigh_elem);
518 std::vector<unsigned int> face_ids, edge_ids;
519 if (common_face_id.size() == 0 &&
getCommonEdgeID(neigh_elem, face_ids, edge_ids) &&
522 bool is_edge_neighbor =
false;
527 EFAError(
"in updateFaceNeighbors: Cannot have more than 1 fragment");
532 is_edge_neighbor =
true;
535 is_edge_neighbor =
true;
537 if (is_edge_neighbor)
539 for (
unsigned int i = 0; i < face_ids.size(); ++i)
541 unsigned int face_id = face_ids[i];
542 unsigned int edge_id = edge_ids[i];
550 unsigned int face_id = common_face_id[0];
551 bool is_face_neighbor =
false;
556 EFAError(
"in updateFaceNeighbors: Cannot have more than 1 fragment");
561 is_face_neighbor =
true;
564 is_face_neighbor =
true;
566 if (is_face_neighbor)
572 " already has 2 face neighbors: ",
586 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
588 for (
unsigned int en_iter = 0; en_iter <
_face_neighbors[face_iter].size(); ++en_iter)
591 if (neigh_elem != NULL)
593 bool found_neighbor =
false;
594 for (
unsigned int face_iter2 = 0; face_iter2 < neigh_elem->
numFaces(); ++face_iter2)
596 for (
unsigned int en_iter2 = 0; en_iter2 < neigh_elem->
numFaceNeighbors(face_iter2);
601 if ((en_iter2 > 1) && (en_iter > 1))
604 "Element and neighbor element cannot both have >1 neighbors on a common face");
606 found_neighbor =
true;
612 EFAError(
"Neighbor element doesn't recognize current element as neighbor");
623 CrackTipElements.insert(
this);
624 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
633 EFAError(
"Element has a neighbor that overlays itself");
637 EFAError(
"crack_tip_split_element already flagged. In elem: ",
665 bool should_duplicate =
false;
668 std::set<EFAElement *>::iterator sit;
669 sit = CrackTipElements.find(
this);
671 should_duplicate =
true;
673 should_duplicate =
true;
675 should_duplicate =
true;
677 return should_duplicate;
687 bool should_duplicate =
false;
690 std::vector<unsigned int> split_neighbors;
692 should_duplicate =
true;
698 std::set<EFANode *> non_physical_nodes;
705 EFAError(
"general elem is not of type EFAelement3D");
708 std::set<EFAElement *>::iterator sit;
709 sit = CrackTipElements.find(neigh_elem);
710 if (sit != CrackTipElements.end() && neigh_elem->
numFragments() > 1)
712 for (
unsigned int i = 0; i < neigh_elem->
numFaces(); ++i)
714 std::set<EFANode *> neigh_face_nodes = neigh_elem->
getFaceNodes(i);
718 should_duplicate =
true;
723 if (should_duplicate)
728 return should_duplicate;
737 bool should_duplicate =
false;
748 for (
unsigned int j = 0; j < neighbor_elem->
numFaces(); ++j)
756 should_duplicate =
true;
763 if (should_duplicate)
767 return should_duplicate;
776 bool will_extend =
false;
783 EFAError(
"in will_crack_tip_extend() element ",
787 " neighbors on face ",
793 EFAError(
"in will_crack_tip_extend() element ",
803 std::vector<EFANode *> neigh_cut_nodes = neigh_frag1->
getCommonNodes(neigh_frag2);
805 for (
unsigned int j = 0; j < neigh_cut_nodes.size(); ++j)
812 split_neighbors.push_back(neigh_idx);
830 unsigned int num_cut_faces = 0;
832 if (
_faces[i]->hasIntersection())
834 return num_cut_faces;
842 bool cut_third =
false;
845 unsigned int num_interior_faces = 0;
846 for (
unsigned int i = 0; i <
_fragments[0]->numFaces(); ++i)
849 num_interior_faces += 1;
851 if (num_interior_faces == 3)
859 std::map<unsigned int, EFANode *> & EmbeddedNodes)
862 std::set<EFAElement *>::iterator sit;
863 sit = CrackTipElements.find(
this);
864 if (sit != CrackTipElements.end())
869 EFAError(
"crack tip elem ",
_id,
" must have 1 fragment");
875 _fragments[0]->removeInvalidEmbeddedNodes(EmbeddedNodes);
881 EFAError(
"Element ",
_id,
" must have 1 fragment at this point");
884 unsigned int num_cut_frag_faces =
_fragments[0]->getNumCuts();
885 unsigned int num_frag_faces =
_fragments[0]->numFaces();
887 EFAError(
"In element ",
_id,
" there are too many cut fragment faces");
890 if (num_cut_frag_faces == 0)
901 std::vector<EFAFragment3D *> new_frags =
_fragments[0]->split();
902 if (new_frags.size() == 1 || new_frags.size() == 2)
906 for (
unsigned int i = 0; i < new_frags.size(); ++i)
910 EFAError(
"Number of fragments must be 1 or 2 at this point");
919 if (n_interior_nodes > 0 && n_interior_nodes != 1)
920 EFAError(
"After update_fragments this element has ", n_interior_nodes,
" interior nodes");
922 if (n_old_frag_cuts == 0)
925 EFAError(
"Incorrect link size for element with 0 cuts");
930 EFAError(
"Incorrect link size for element with crack-tip faces");
935 n_old_frag_faces + n_old_frag_cuts + 2)
936 EFAError(
"Incorrect link size for element that has been completely cut");
943 const EFAElement3D * from_elem3d = dynamic_cast<const EFAElement3D *>(from_elem);
945 EFAError(
"from_elem is not of EFAelement3D type");
949 EFAError(
"in restoreFragmentInfo elements must not have any pre-existing fragments");
950 for (
unsigned int i = 0; i < from_elem3d->
numFragments(); ++i)
955 EFAError(
"in restoreFragmentInfo elements must not have any pre-exsiting interior nodes");
961 EFAError(
"In restoreEdgeIntersection: edge cuts already exist in element ",
_id);
966 for (
unsigned int i = 0; i < from_elem3d->
numNodes(); ++i)
972 EFAError(
"In restoreFragmentInfo all of from_elem's nodes must be local");
978 std::map<unsigned int, EFAElement *> & Elements,
979 std::map<unsigned int, EFAElement *> & newChildElements,
980 std::vector<EFAElement *> & ChildElements,
981 std::vector<EFAElement *> & ParentElements,
982 std::map<unsigned int, EFANode *> & TempNodes)
985 EFAError(
"Element cannot have existing children in createChildElements");
990 EFAError(
"More than 2 fragments not yet supported");
993 ParentElements.push_back(
this);
994 for (
unsigned int ichild = 0; ichild <
_fragments.size(); ++ichild)
996 unsigned int new_elem_id;
997 if (newChildElements.size() == 0)
1003 newChildElements.insert(std::make_pair(new_elem_id, childElem));
1005 ChildElements.push_back(childElem);
1009 std::vector<std::vector<EFANode *>> cut_plane_nodes;
1015 std::vector<EFANode *> node_line;
1016 for (
unsigned int j = 0; j < face->
numNodes(); ++j)
1017 node_line.push_back(face->
getNode(j));
1018 cut_plane_nodes.push_back(node_line);
1022 std::vector<EFAPoint> cut_plane_points;
1027 if (cut_plane_nodes.size())
1029 for (
unsigned int i = 0; i < cut_plane_nodes[0].size(); ++i)
1031 std::vector<EFANode *> master_nodes;
1032 std::vector<double> master_weights;
1034 this->
getMasterInfo(cut_plane_nodes[0][i], master_nodes, master_weights);
1036 for (
unsigned int i = 0; i < master_nodes.size(); ++i)
1042 cut_plane_points.push_back(coor);
1044 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
1045 orig += cut_plane_points[i];
1046 orig /= cut_plane_points.size();
1049 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
1050 center += cut_plane_points[i];
1051 center /= cut_plane_points.size();
1053 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
1055 unsigned int iplus1 = i < cut_plane_points.size() - 1 ? i + 1 : 0;
1056 EFAPoint ray1 = cut_plane_points[i] - center;
1057 EFAPoint ray2 = cut_plane_points[iplus1] - center;
1058 normal += ray1.
cross(ray2);
1060 normal /= cut_plane_points.size();
1065 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1069 EFAPoint origin_to_point = p - orig;
1072 else if (origin_to_point * normal <
Xfem::tol)
1078 TempNodes.insert(std::make_pair(new_node_id, newNode));
1079 childElem->
setNode(j, newNode);
1089 for (
unsigned int j = 0; j <
_num_faces; ++j)
1111 for (
unsigned int i = 0; i <
_num_faces; ++i)
1114 std::vector<EFANode *> nodes_to_delete;
1115 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
1126 for (
unsigned int j = 0; j <
_faces[i]->numInteriorNodes(); ++j)
1128 EFANode * face_node =
_faces[i]->getInteriorNode(j)->getNode();
1130 nodes_to_delete.push_back(face_node);
1134 for (
unsigned int j = 0; j < nodes_to_delete.size(); ++j)
1142 std::map<unsigned int, EFANode *> & TempNodes,
1143 std::map<
EFANode *, std::set<EFAElement *>> & InverseConnectivityMap,
1144 bool merge_phantom_faces)
1148 EFAError(
"no parent element for child element ",
_id,
" in connect_neighbors");
1151 EFAError(
"cannot dynamic cast to parent3d in connect_neighbors");
1154 for (
unsigned int j = 0; j <
_num_faces; ++j)
1161 if (
_faces[j]->hasIntersection())
1163 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1166 dynamic_cast<EFAElement3D *>(NeighborElem->
getChild(l));
1167 if (!childOfNeighborElem)
1168 EFAError(
"dynamic cast childOfNeighborElem fails");
1171 EFAFace * neighborChildFace = childOfNeighborElem->
getFace(neighbor_face_id);
1172 if (
_faces[j]->equivalent(neighborChildFace))
1177 for (
unsigned int i = 0; i <
_faces[j]->numNodes(); ++i)
1179 unsigned int childNodeIndex = i;
1180 unsigned int neighborChildNodeIndex =
1184 EFANode * childOfNeighborNode = neighborChildFace->
getNode(neighborChildNodeIndex);
1186 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1191 unsigned int childNodeIndex = m;
1192 unsigned int neighborChildNodeIndex =
1195 EFANode * childNode =
_faces[j]->getInteriorFaceNode(childNodeIndex);
1196 EFANode * childOfNeighborNode =
1199 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1207 if (merge_phantom_faces)
1209 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1212 dynamic_cast<EFAElement3D *>(NeighborElem->
getChild(l));
1213 if (!childOfNeighborElem)
1214 EFAError(
"dynamic cast childOfNeighborElem fails");
1216 EFAFace * neighborChildFace = childOfNeighborElem->
getFace(neighbor_face_id);
1217 if (!neighborChildFace
1218 ->hasIntersection())
1222 if (
_faces[j]->equivalent(neighborChildFace))
1225 for (
unsigned int i = 0; i <
_faces[j]->numNodes(); ++i)
1227 unsigned int childNodeIndex = i;
1228 unsigned int neighborChildNodeIndex =
1232 EFANode * childOfNeighborNode = neighborChildFace->
getNode(neighborChildNodeIndex);
1234 if (childNode->
parent() != NULL &&
1239 childOfNeighborNode,
1240 childOfNeighborElem,
1253 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1261 std::set<EFAElement *> patch_elems = InverseConnectivityMap[childNode->
parent()];
1262 if (parent3d->
numFragments() == 1 && patch_elems.size() == 1)
1269 PermanentNodes.insert(std::make_pair(new_node_id, newNode));
1274 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
1283 ostream << std::setw(5);
1284 ostream <<
_id <<
"| ";
1285 for (
unsigned int j = 0; j <
_num_faces; ++j)
1287 for (
unsigned int k = 0; k <
_faces[j]->numNodes(); ++k)
1288 ostream << std::setw(5) <<
_faces[j]->getNode(k)->idCatString();
1291 ostream << std::endl;
1294 ostream << std::setw(5);
1297 for (
unsigned int j = 0; j <
_num_faces; ++j)
1299 for (
unsigned int k = 0; k <
_faces[j]->numEdges(); ++k)
1301 ostream << std::setw(4);
1302 if (
_faces[j]->getEdge(k)->hasIntersection())
1304 if (
_faces[j]->getEdge(k)->numEmbeddedNodes() > 1)
1307 for (
unsigned int l = 0; l <
_faces[j]->getEdge(k)->numEmbeddedNodes(); ++l)
1309 ostream <<
_faces[j]->getEdge(k)->getEmbeddedNode(l)->id() <<
" ";
1310 if (l ==
_faces[j]->getEdge(k)->numEmbeddedNodes() - 1)
1317 ostream <<
_faces[j]->getEdge(k)->getEmbeddedNode(0)->id() <<
" ";
1324 ostream << std::endl;
1327 ostream << std::setw(5);
1330 for (
unsigned int j = 0; j <
_num_faces; ++j)
1332 ostream << std::setw(4);
1353 ostream << std::endl;
1356 for (
unsigned int j = 0; j <
_fragments.size(); ++j)
1358 ostream << std::setw(4);
1359 ostream <<
"frag" << j <<
"| ";
1360 for (
unsigned int k = 0; k <
_fragments[j]->numFaces(); ++k)
1362 for (
unsigned int l = 0; l <
_fragments[j]->getFace(k)->numNodes(); ++l)
1363 ostream << std::setw(5) <<
_fragments[j]->getFace(k)->getNode(l)->idCatString();
1366 ostream << std::endl;
1368 ostream << std::endl;
1377 EFAError(
"frag_id out of bounds");
1383 std::set<EFANode *> face_nodes;
1384 for (
unsigned int i = 0; i <
_faces[face_id]->numNodes(); ++i)
1385 face_nodes.insert(
_faces[face_id]->getNode(i));
1393 unsigned int face_id = 99999;
1394 bool face_found =
false;
1395 for (
unsigned int i = 0; i <
_num_faces; ++i)
1406 std::vector<double> xi_2d(2, 0.0);
1407 if (
_faces[face_id]->getFaceNodeParametricCoords(node, xi_2d))
1410 EFAError(
"failed to get the 2D para coords on the face");
1421 EFAError(
"interior_node_id out of bounds");
1427 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
1430 for (
unsigned int i = 0; i <
_faces.size(); ++i)
1433 if (remove_for_neighbor)
1435 for (
unsigned int i = 0; i <
numFaces(); ++i)
1457 int hex_local_node_indices[6][4] = {
1458 {0, 3, 2, 1}, {0, 1, 5, 4}, {1, 2, 6, 5}, {2, 3, 7, 6}, {3, 0, 4, 7}, {4, 5, 6, 7}};
1459 int tet_local_node_indices[4][3] = {{0, 2, 1}, {0, 1, 3}, {1, 2, 3}, {2, 0, 3}};
1461 int hex_interior_face_node_indices[6][5] = {{8, 9, 10, 11, 20},
1462 {8, 13, 16, 12, 21},
1463 {9, 14, 17, 13, 22},
1464 {10, 14, 18, 15, 23},
1465 {11, 15, 19, 12, 24},
1466 {16, 17, 18, 19, 25}};
1467 int tet_interior_face_node_indices[4][3] = {{4, 5, 6}, {4, 7, 8}, {5, 8, 9}, {6, 7, 9}};
1473 EFAError(
"num_faces of hexes must be 6");
1474 for (
unsigned int i = 0; i <
_num_faces; ++i)
1477 for (
unsigned int j = 0; j < 4; ++j)
1479 _faces[i]->createEdges();
1481 _faces[i]->setInteriorFaceNode(k,
_nodes[hex_interior_face_node_indices[i][k]]);
1487 EFAError(
"num_faces of tets must be 4");
1488 for (
unsigned int i = 0; i <
_num_faces; ++i)
1491 for (
unsigned int j = 0; j < 3; ++j)
1493 _faces[i]->createEdges();
1495 _faces[i]->setInteriorFaceNode(k,
_nodes[tet_interior_face_node_indices[i][k]]);
1499 EFAError(
"unknown 3D element type in createFaces()");
1501 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
1504 for (
unsigned int edge_iter = 0; edge_iter <
_faces[face_iter]->numEdges(); ++edge_iter)
1521 bool found_face_id =
false;
1522 unsigned int face_id;
1523 for (
unsigned int iface = 0; iface <
_num_faces; ++iface)
1525 if (
_faces[iface]->equivalent(face))
1528 found_face_id =
true;
1533 EFAError(
"input face not found in get_face_id()");
1537 std::vector<unsigned int>
1540 std::vector<unsigned int> face_id;
1541 for (
unsigned int i = 0; i <
_num_faces; ++i)
1543 for (
unsigned int j = 0; j < other_elem->
_num_faces; ++j)
1547 face_id.push_back(i);
1557 std::vector<unsigned int> & face_id,
1558 std::vector<unsigned int> & edge_id)
const
1560 bool has_common_edge =
false;
1561 bool move_to_next_edge =
false;
1564 for (
unsigned int i = 0; i <
_num_faces; ++i)
1565 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
1567 move_to_next_edge =
false;
1568 for (
unsigned int k = 0; k < other_elem->
_num_faces; ++k)
1570 for (
unsigned int l = 0; l < other_elem->
_faces[k]->numEdges(); ++l)
1571 if ((
_faces[i]->getEdge(j)->equivalent(*(other_elem->
_faces[k]->getEdge(l)))) &&
1574 face_id.push_back(i);
1575 edge_id.push_back(j);
1576 move_to_next_edge =
true;
1577 has_common_edge =
true;
1581 if (move_to_next_edge)
1586 return has_common_edge;
1591 unsigned int node_id,
1595 bool found_id =
false;
1596 unsigned int neigh_face_node_id;
1598 if (common_face_id == face_id)
1602 for (
unsigned int i = 0; i < neigh_face->
numNodes(); ++i)
1606 neigh_face_node_id = i;
1613 EFAError(
"getNeighborFaceNodeID: neighbor_elem is not a neighbor on face_id");
1615 EFAError(
"getNeighborFaceNodeID: could not find neighbor face node id");
1616 return neigh_face_node_id;
1621 unsigned int node_id,
1625 bool found_id =
false;
1626 unsigned int neigh_face_node_id;
1628 if (common_face_id == face_id)
1637 neigh_face_node_id = i;
1644 EFAError(
"getNeighborFaceNodeID: neighbor_elem is not a neighbor on face_id");
1646 EFAError(
"getNeighborFaceNodeID: could not find neighbor face node id");
1647 return neigh_face_node_id;
1652 unsigned int edge_id,
1656 bool found_id =
false;
1657 unsigned int neigh_face_edge_id;
1659 if (common_face_id == face_id)
1663 for (
unsigned int i = 0; i < neigh_face->
numEdges(); ++i)
1665 if (
_faces[face_id]->getEdge(edge_id)->equivalent(*neigh_face->
getEdge(i)))
1667 neigh_face_edge_id = i;
1674 EFAError(
"getNeighborFaceEdgeID: neighbor_elem is not a neighbor on face_id");
1676 EFAError(
"getNeighborFaceEdgeID: could not find neighbor face edge id");
1677 return neigh_face_edge_id;
1684 for (
unsigned int i = 0; i <
_faces.size(); ++i)
1686 std::vector<EFAFace *> face_adjacents(
_faces[i]->numEdges(), NULL);
1687 for (
unsigned int j = 0; j <
_faces.size(); ++j)
1691 unsigned int adj_edge =
_faces[i]->adjacentCommonEdge(
_faces[j]);
1692 face_adjacents[adj_edge] =
_faces[j];
1711 EFAError(
"frag_id out of bounds in getFragmentFace");
1717 std::set<EFANode *> phantom_nodes;
1720 for (
unsigned int j = 0; j <
_faces[face_id]->numNodes(); ++j)
1722 bool node_in_frag =
false;
1723 for (
unsigned int k = 0; k <
_fragments.size(); ++k)
1727 node_in_frag =
true;
1735 return phantom_nodes;
1744 bool frag_face_found =
false;
1745 frag_face_id = 99999;
1748 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1753 frag_face_found =
true;
1758 return frag_face_found;
1763 unsigned int ElemFaceEdgeID,
1764 unsigned int & FragFaceID,
1765 unsigned int & FragFaceEdgeID)
const
1768 bool frag_edge_found =
false;
1770 FragFaceEdgeID = 99999;
1773 EFAEdge * elem_edge =
_faces[ElemFaceID]->getEdge(ElemFaceEdgeID);
1775 for (
unsigned int i = 0; i < frag_face->
numEdges(); ++i)
1780 frag_edge_found =
true;
1785 return frag_edge_found;
1790 unsigned int ElemFaceEdgeID,
1791 double position)
const
1793 unsigned int FragFaceID = 99999, FragFaceEdgeID = 99999;
1794 bool is_in_real =
false;
1801 EFAEdge * elem_edge =
_faces[ElemFaceID]->getEdge(ElemFaceEdgeID);
1803 double xi[2] = {-1.0, -1.0};
1806 if ((position - xi[0]) * (position - xi[1]) <
1816 bool is_phantom =
false;
1819 bool contains_frag_face =
false;
1820 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
1822 for (
unsigned int j = 0; j <
_fragments[i]->numFaces(); ++j)
1826 contains_frag_face =
true;
1830 if (contains_frag_face)
1833 if (!contains_frag_face)
1857 EFAError(
"edge neighbor does not exist");
1862 unsigned int edge_id,
1863 unsigned int neighbor_id)
const
1868 EFAError(
"edge neighbor does not exist");
1874 bool has_tip_faces =
false;
1877 for (
unsigned int i = 0; i <
_num_faces; ++i)
1879 unsigned int num_frag_faces = 0;
1880 if (
_faces[i]->hasIntersection())
1882 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1885 num_frag_faces += 1;
1887 if (num_frag_faces == 2)
1889 has_tip_faces =
true;
1895 return has_tip_faces;
1898 std::vector<unsigned int>
1902 std::vector<unsigned int> tip_face_id;
1905 for (
unsigned int i = 0; i <
_num_faces; ++i)
1907 unsigned int num_frag_faces = 0;
1908 if (
_faces[i]->hasIntersection())
1910 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1913 num_frag_faces += 1;
1915 if (num_frag_faces == 2)
1916 tip_face_id.push_back(i);
1927 std::set<EFANode *> tip_emb;
1930 for (
unsigned int i = 0; i <
_num_faces; ++i)
1932 std::vector<EFAFace *> frag_faces;
1933 if (
_faces[i]->hasIntersection())
1935 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1938 frag_faces.push_back(
_fragments[0]->getFace(j));
1940 if (frag_faces.size() == 2)
1942 unsigned int edge_id = frag_faces[0]->adjacentCommonEdge(frag_faces[1]);
1943 tip_emb.insert(frag_faces[0]->getEdge(edge_id)->
getNode(0));
1944 tip_emb.insert(frag_faces[0]->getEdge(edge_id)->
getNode(1));
1955 bool contain_tip =
false;
1958 unsigned int num_frag_faces = 0;
1959 if (
_faces[face_id]->hasIntersection())
1961 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1964 num_frag_faces += 1;
1966 if (num_frag_faces == 2)
1977 bool has_cut =
false;
1982 unsigned int FragFaceID = 99999;
1995 unsigned int edge_id,
1998 std::map<unsigned int, EFANode *> & EmbeddedNodes,
1999 bool add_to_neighbor,
2000 bool add_to_adjacent)
2003 EFANode * local_embedded = NULL;
2007 local_embedded = embedded_node;
2011 unsigned int adj_face_id =
getFaceID(adj_face);
2015 bool cut_exist =
false;
2021 if (embedded_node && embedded_node != old_emb)
2022 EFAError(
"Attempting to add edge intersection when one already exists with different node.",
2029 local_embedded = old_emb;
2039 adj_face_id, adj_edge_id, position, edge_node1, embedded_node, local_embedded);
2041 if (!local_embedded)
2045 EmbeddedNodes.insert(std::make_pair(new_node_id, local_embedded));
2051 EFAError(
"element edge can't have >2 embedded nodes");
2055 unsigned int FragFaceID;
2056 unsigned int FragFaceEdgeID;
2061 double xi[2] = {-1.0, -1.0};
2064 double frag_pos = (position - xi[0]) / (xi[1] - xi[0]);
2068 frag_edge->
addIntersection(frag_pos, local_embedded, frag_edge_node1);
2072 if (add_to_adjacent)
2074 double adj_pos = 1.0 - position;
2076 adj_face_id, adj_edge_id, adj_pos, local_embedded, EmbeddedNodes,
false,
false);
2081 if (add_to_neighbor)
2083 for (
unsigned int en_iter = 0; en_iter <
numFaceNeighbors(face_id); ++en_iter)
2088 double neigh_pos = 1.0 - position;
2090 neigh_face_id, neigh_edge_id, neigh_pos, local_embedded, EmbeddedNodes,
false,
true);
2093 for (
unsigned int en_iter = 0; en_iter <
numEdgeNeighbors(face_id, edge_id); ++en_iter)
2096 unsigned int neigh_face_id, neigh_edge_id;
2103 neigh_pos = position;
2104 else if (
_faces[face_id]->getEdge(edge_id)->getNode(1) ==
2106 neigh_pos = 1.0 - position;
2108 EFAError(
"The EFANodes on commaon edge are not matched.");
2111 neigh_face_id, neigh_edge_id, neigh_pos, local_embedded, EmbeddedNodes,
false,
true);
2120 std::map<unsigned int, EFANode *> & ,
2131 unsigned int edge_id,
2141 for (
unsigned int en_iter = 0; en_iter <
numFaceNeighbors(face_id); ++en_iter)
2153 if (embedded_node && embedded_node != old_emb)
2155 "attempting to add edge intersection when one already exists with different node.");
2156 if (local_embedded && local_embedded != old_emb)
2157 EFAError(
"attempting to assign contradictory pointer to local_embedded.");
2159 local_embedded = old_emb;
2166 std::vector<double> & xi_2d,
2167 std::vector<double> & xi_3d)
const
2170 xi_3d.resize(3, 0.0);
2175 xi_3d[0] = xi_2d[1];
2176 xi_3d[1] = xi_2d[0];
2179 else if (face_id == 1)
2181 xi_3d[0] = xi_2d[0];
2183 xi_3d[2] = xi_2d[1];
2185 else if (face_id == 2)
2188 xi_3d[1] = xi_2d[0];
2189 xi_3d[2] = xi_2d[1];
2191 else if (face_id == 3)
2193 xi_3d[0] = -xi_2d[0];
2195 xi_3d[2] = xi_2d[1];
2197 else if (face_id == 4)
2200 xi_3d[1] = -xi_2d[0];
2201 xi_3d[2] = xi_2d[1];
2203 else if (face_id == 5)
2205 xi_3d[0] = xi_2d[0];
2206 xi_3d[1] = xi_2d[1];
2210 EFAError(
"face_id out of bounds");
2216 xi_3d[0] = xi_2d[0];
2217 xi_3d[1] = xi_2d[1];
2220 else if (face_id == 1)
2223 xi_3d[1] = xi_2d[0];
2224 xi_3d[2] = xi_2d[1];
2226 else if (face_id == 2)
2228 xi_3d[0] = xi_2d[1];
2230 xi_3d[2] = xi_2d[0];
2232 else if (face_id == 3)
2234 xi_3d[0] = xi_2d[0];
2235 xi_3d[1] = xi_2d[2];
2236 xi_3d[2] = xi_2d[1];
2239 EFAError(
"face_id out of bounds");
2242 EFAError(
"unknown element for 3D");
2245 std::vector<EFANode *>
2248 std::set<EFANode *> e1nodes(
_nodes.begin(),
2250 std::set<EFANode *> e2nodes(other_elem->
_nodes.begin(),
2253 return common_nodes;