25 if (n_nodes == 4 || n_nodes == 8 || n_nodes == 9)
27 else if (n_nodes == 3 || n_nodes == 6)
30 EFAError(
"In EFAelement2D the supported element types are QUAD4, QUAD8, QUAD9, TRI3 and TRI6");
34 std::vector<std::vector<EFAElement2D *>>(
_num_edges, std::vector<EFAElement2D *>(1, NULL));
38 :
EFAElement(from_elem->_id, from_elem->_num_nodes),
39 _num_edges(from_elem->_num_edges),
40 _edges(_num_edges, NULL),
41 _edge_neighbors(_num_edges, std::vector<
EFAElement2D *>(1, NULL))
56 EFAError(
"In EFAelement2D ",
58 " the copy constructor must have from_elem w/ global nodes. node: ",
61 from_elem->
_nodes[i]->category());
67 for (
unsigned int i = 0; i < from_elem->
_fragments.size(); ++i)
81 EFAError(
"In EFAelement2D copy constructor this elem's nodes must be local");
87 EFAError(
"this EFAelement2D constructor only converts global nodes to local nodes");
92 _num_edges(from_face->numEdges()),
93 _edges(_num_edges, NULL),
94 _edge_neighbors(_num_edges, std::vector<
EFAElement2D *>(1, NULL))
106 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
114 for (
unsigned int i = 0; i <
_edges.size(); ++i)
210 bool partial =
false;
215 bool node_in_frag =
false;
216 for (
unsigned int j = 0; j <
_fragments.size(); ++j)
239 for (
unsigned int i = 0; i <
_nodes.size(); ++i)
240 non_physical_nodes.insert(
_nodes[i]);
243 std::set<EFANode *>::iterator sit;
244 for (sit = non_physical_nodes.begin(); sit != non_physical_nodes.end();)
247 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
251 non_physical_nodes.erase(sit++);
267 if (
_nodes[i] == old_node)
270 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
273 for (
unsigned int i = 0; i <
_edges.size(); ++i)
276 if (
_parent && descend_to_parent)
282 for (
unsigned int k = 0; k < neigh_elem->
numChildren(); ++k)
295 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
301 std::vector<EFANode *> & master_nodes,
302 std::vector<double> & master_weights)
const
306 master_nodes.clear();
307 master_weights.clear();
308 bool masters_found =
false;
313 masters_found =
_edges[i]->getNodeMasters(node, master_nodes, master_weights);
317 EFAError(
"In getMasterInfo: cannot find master nodes in element edges");
327 std::vector<double> emb_xi(2, 0.0);
332 master_nodes.push_back(
_nodes[j]);
339 EFAError(
"unknown 2D element");
340 master_weights.push_back(weight);
342 masters_found =
true;
349 EFAError(
"In EFAelement2D::getMaterInfo, cannot find the given EFAnode");
361 bool overlays =
false;
369 if (common_nodes.size() == 2)
371 std::vector<EFANode *> common_nodes_vec(common_nodes.begin(), common_nodes.end());
377 if (
_nodes[i] == common_nodes_vec[0])
381 else if (
_nodes[i] == common_nodes_vec[1])
388 EFAError(
"in overlays_elem() couldn't find common node");
390 bool e1ascend =
false;
391 unsigned int e1n1idx_plus1(e1n1idx < (
_num_edges - 1) ? e1n1idx + 1 : 0);
392 unsigned int e1n1idx_minus1(e1n1idx > 0 ? e1n1idx - 1 :
_num_edges - 1);
393 if (e1n2idx == e1n1idx_plus1)
399 if (e1n2idx != e1n1idx_minus1)
400 EFAError(
"in overlays_elem() common nodes must be adjacent to each other");
407 if (other_elem->
getNode(i) == common_nodes_vec[0])
411 else if (other_elem->
getNode(i) == common_nodes_vec[1])
417 EFAError(
"in overlays_elem() couldn't find common node");
419 bool e2ascend =
false;
420 unsigned int e2n1idx_plus1(e2n1idx < (
_num_edges - 1) ? e2n1idx + 1 : 0);
421 unsigned int e2n1idx_minus1(e2n1idx > 0 ? e2n1idx - 1 :
_num_edges - 1);
422 if (e2n2idx == e2n1idx_plus1)
428 if (e2n2idx != e2n1idx_minus1)
429 EFAError(
"in overlays_elem() common nodes must be adjacent to each other");
433 if ((e1ascend && e2ascend) || (!e1ascend && !e2ascend))
438 else if (common_nodes.size() > 2)
455 "in get_neighbor_index() element: ",
_id,
" does not have neighbor: ", neighbor_elem->
id());
462 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
474 EFAError(
"neighbor_elem is not of EFAelement2D type");
477 if (common_nodes.size() >= 2)
479 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
481 std::set<EFANode *> edge_nodes =
getEdgeNodes(edge_iter);
482 bool is_edge_neighbor =
false;
489 EFAError(
"in updateEdgeNeighbors: Cannot have more than 1 fragment");
493 is_edge_neighbor =
true;
496 is_edge_neighbor =
true;
499 if (is_edge_neighbor)
507 " already has 2 edge neighbors: ",
525 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
527 for (
unsigned int en_iter = 0; en_iter <
_edge_neighbors[edge_iter].size(); ++en_iter)
530 if (neigh_elem != NULL)
532 bool found_neighbor =
false;
533 for (
unsigned int edge_iter2 = 0; edge_iter2 < neigh_elem->
numEdges(); ++edge_iter2)
535 for (
unsigned int en_iter2 = 0; en_iter2 < neigh_elem->
numEdgeNeighbors(edge_iter2);
540 if ((en_iter2 > 1) && (en_iter > 1))
542 "Element and neighbor element cannot both have >1 neighbors on a common edge");
543 found_neighbor =
true;
549 EFAError(
"Neighbor element doesn't recognize current element as neighbor");
560 CrackTipElements.insert(
this);
561 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
570 EFAError(
"Element has a neighbor that overlays itself");
574 EFAError(
"crack_tip_split_element already flagged. In elem: ",
598 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
610 EFAError(
"In getCrackTipSplitElementID could not find element id");
623 bool should_duplicate =
false;
626 std::set<EFAElement *>::iterator sit;
627 sit = CrackTipElements.find(
this);
629 should_duplicate =
true;
631 should_duplicate =
true;
633 should_duplicate =
true;
635 return should_duplicate;
645 bool should_duplicate =
false;
648 std::vector<unsigned int> split_neighbors;
650 should_duplicate =
true;
656 std::set<EFANode *> non_physical_nodes;
663 EFAError(
"general elem is not of type EFAelement2D");
666 std::set<EFAElement *>::iterator sit;
667 sit = CrackTipElements.find(neigh_elem);
668 if (sit != CrackTipElements.end() && neigh_elem->
numFragments() > 1)
670 for (
unsigned int i = 0; i < neigh_elem->
numEdges(); ++i)
672 std::set<EFANode *> neigh_edge_nodes = neigh_elem->
getEdgeNodes(i);
676 should_duplicate =
true;
681 if (should_duplicate)
686 return should_duplicate;
695 bool should_duplicate =
false;
706 for (
unsigned int j = 0; j < neighbor_elem->
numEdges(); ++j)
714 should_duplicate =
true;
721 if (should_duplicate)
725 return should_duplicate;
734 bool will_extend =
false;
741 EFAError(
"in will_crack_tip_extend() element: ",
750 EFAError(
"in will_crack_tip_extend() element: ",
759 std::vector<EFANode *> neigh_cut_nodes = frag1->
getCommonNodes(frag2);
760 if (neigh_cut_nodes.size() != 2)
761 EFAError(
"2 frags in a elem does not share 2 common nodes");
762 if (
_edges[neigh_idx]->isEmbeddedNode(neigh_cut_nodes[0]) ||
763 _edges[neigh_idx]->isEmbeddedNode(neigh_cut_nodes[1]))
765 split_neighbors.push_back(neigh_idx);
783 unsigned int num_cuts = 0;
785 if (
_edges[i]->hasIntersection())
786 num_cuts +=
_edges[i]->numEmbeddedNodes();
794 bool cut_twice =
false;
797 unsigned int num_interior_edges = 0;
798 for (
unsigned int i = 0; i <
_fragments[0]->numEdges(); ++i)
801 num_interior_edges += 1;
803 if (num_interior_edges == 2)
811 std::map<unsigned int, EFANode *> & EmbeddedNodes)
814 std::set<EFAElement *>::iterator sit;
815 sit = CrackTipElements.find(
this);
816 if (sit != CrackTipElements.end())
821 EFAError(
"crack tip elem ",
_id,
" must have 1 fragment");
827 _fragments[0]->removeInvalidEmbeddedNodes(EmbeddedNodes);
833 EFAError(
"Element ",
_id,
" must have 1 fragment at this point");
836 unsigned int num_cut_frag_edges =
_fragments[0]->getNumCuts();
837 unsigned int num_cut_nodes =
_fragments[0]->getNumCutNodes();
838 unsigned int num_frag_edges =
_fragments[0]->numEdges();
839 if (num_cut_frag_edges > 3)
840 EFAError(
"In element ",
_id,
" there are more than 2 cut fragment edges");
842 if (num_cut_frag_edges == 0 && num_cut_nodes == 0)
856 std::vector<EFAFragment2D *> new_frags;
857 if (num_cut_frag_edges == 3)
864 for (
unsigned int i = 0; i < new_frags.size(); ++i)
873 if (n_old_frag_cuts > 3)
874 EFAError(
"Sanity check: in element ",
_id,
" frag has more than 3 cut edges");
877 std::vector<unsigned int> num_emb;
878 std::vector<unsigned int> num_perm;
879 std::vector<unsigned int> num_emb_perm;
880 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
882 num_emb.push_back(0);
883 num_perm.push_back(0);
884 num_emb_perm.push_back(0);
885 std::set<EFANode *> perm_nodes;
886 std::set<EFANode *> emb_nodes;
887 std::set<EFANode *> emb_perm_nodes;
888 for (
unsigned int j = 0; j <
_fragments[i]->numEdges(); ++j)
890 for (
unsigned int k = 0; k < 2; ++k)
894 perm_nodes.insert(temp_node);
896 emb_nodes.insert(temp_node);
898 emb_perm_nodes.insert(temp_node);
900 EFAError(
"Invalid node category");
903 num_perm[i] = perm_nodes.size();
904 num_emb[i] = emb_nodes.size();
905 num_emb_perm[i] = emb_perm_nodes.size();
909 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
910 if (num_emb_perm[i] != 0)
914 if (n_interior_nodes > 0 && n_interior_nodes != 1)
915 EFAError(
"After update_fragments this element has ", n_interior_nodes,
" interior nodes");
917 if (n_old_frag_cuts == 0)
920 EFAError(
"Incorrect link size for element with 0 cuts");
922 else if (n_old_frag_cuts == 1)
925 EFAError(
"Incorrect link size for element with 1 cut");
927 else if (n_old_frag_cuts == 2)
931 EFAError(
"Incorrect link size for element with 2 cuts");
933 else if (n_old_frag_cuts == 3)
936 _fragments[2]->numEdges()) != n_old_frag_edges + 9)
937 EFAError(
"Incorrect link size for element with 3 cuts");
940 EFAError(
"Unexpected number of old fragment cuts");
946 const EFAElement2D * from_elem2d = dynamic_cast<const EFAElement2D *>(from_elem);
948 EFAError(
"from_elem is not of EFAelement2D type");
952 EFAError(
"in restoreFragmentInfo elements must not have any pre-existing fragments");
953 for (
unsigned int i = 0; i < from_elem2d->
numFragments(); ++i)
958 EFAError(
"in restoreFragmentInfo elements must not have any pre-exsiting interior nodes");
964 EFAError(
"In restoreEdgeIntersection: edge cuts already exist in element ",
_id);
967 if (from_elem2d->
_edges[i]->hasIntersection())
968 _edges[i]->copyIntersection(*from_elem2d->
_edges[i], 0);
969 if (
_edges[i]->numEmbeddedNodes() > 2)
970 EFAError(
"elem ",
_id,
" has an edge with >2 cuts");
974 for (
unsigned int i = 0; i < from_elem2d->
numNodes(); ++i)
980 EFAError(
"In restoreFragmentInfo all of from_elem's nodes must be local");
986 std::map<unsigned int, EFAElement *> & Elements,
987 std::map<unsigned int, EFAElement *> & newChildElements,
988 std::vector<EFAElement *> & ChildElements,
989 std::vector<EFAElement *> & ParentElements,
990 std::map<unsigned int, EFANode *> & TempNodes)
993 EFAError(
"Element cannot have existing children in createChildElements");
995 bool shouldDuplicateForCutNodeElement =
false;
999 shouldDuplicateForCutNodeElement =
true;
1003 shouldDuplicateForCutNodeElement)
1006 EFAError(
"More than 3 fragments not yet supported");
1009 ParentElements.push_back(
this);
1010 for (
unsigned int ichild = 0; ichild <
_fragments.size(); ++ichild)
1012 unsigned int new_elem_id;
1013 if (newChildElements.size() == 0)
1019 newChildElements.insert(std::make_pair(new_elem_id, childElem));
1021 ChildElements.push_back(childElem);
1025 std::vector<EFAPoint> local_embedded_node_coor;
1031 std::vector<EFANode *> master_nodes;
1032 std::vector<double> master_weights;
1034 for (
unsigned int j = 0; j < 2; ++j)
1039 for (
unsigned int k = 0; k < master_nodes.size(); ++k)
1045 local_embedded_node_coor.push_back(coor);
1055 if (local_embedded_node_coor.size())
1057 EFAPoint cut_line = local_embedded_node_coor[1] - local_embedded_node_coor[0];
1058 normal =
EFAPoint(cut_line(1), -cut_line(0), 0.0);
1060 origin = (local_embedded_node_coor[0] + local_embedded_node_coor[1]) * 0.5;
1063 if (local_embedded_node_coor.size() == 4)
1065 EFAPoint cut_line = local_embedded_node_coor[3] - local_embedded_node_coor[2];
1066 normal2 =
EFAPoint(cut_line(1), -cut_line(0), 0.0);
1068 origin2 = (local_embedded_node_coor[2] + local_embedded_node_coor[3]) * 0.5;
1072 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1077 EFAPoint origin_to_point = p - origin;
1078 EFAPoint origin2_to_point = p - origin2;
1087 TempNodes.insert(std::make_pair(new_node_id, newNode));
1088 childElem->
setNode(j, newNode);
1094 else if (std::abs(origin_to_point * normal) <
Xfem::tol &&
1099 TempNodes.insert(std::make_pair(new_node_id, newNode));
1100 childElem->
setNode(j, newNode);
1102 else if (origin_to_point * normal <
Xfem::tol && origin2_to_point * normal2 <
Xfem::tol &&
1118 TempNodes.insert(std::make_pair(new_node_id, newNode));
1119 childElem->
setNode(j, newNode);
1128 for (
unsigned int j = 0; j <
_num_edges; ++j)
1130 unsigned int jplus1(j < (
_num_edges - 1) ? j + 1 : 0);
1132 if (
_edges[j]->hasIntersection())
1136 childElem->
setEdge(j, new_edge);
1156 for (
unsigned int i = 0; i <
_num_edges; ++i)
1158 std::vector<EFANode *> nodes_to_delete;
1159 for (
unsigned int j = 0; j <
_edges[i]->numEmbeddedNodes(); ++j)
1162 nodes_to_delete.push_back(
_edges[i]->getEmbeddedNode(j));
1164 for (
unsigned int j = 0; j < nodes_to_delete.size(); ++j)
1165 _edges[i]->removeEmbeddedNode(nodes_to_delete[j]);
1172 std::map<unsigned int, EFANode *> & TempNodes,
1173 std::map<
EFANode *, std::set<EFAElement *>> & InverseConnectivityMap,
1174 bool merge_phantom_edges)
1178 EFAError(
"no parent element for child element ",
_id,
" in connect_neighbors");
1181 EFAError(
"cannot dynamic cast to parent2d in connect_neighbors");
1184 for (
unsigned int j = 0; j <
_num_edges; ++j)
1191 if (
_edges[j]->hasIntersection())
1193 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1196 dynamic_cast<EFAElement2D *>(NeighborElem->
getChild(l));
1197 if (!childOfNeighborElem)
1198 EFAError(
"dynamic cast childOfNeighborElem fails");
1201 EFAEdge * neighborChildEdge = childOfNeighborElem->
getEdge(neighbor_edge_id);
1202 if (
_edges[j]->equivalent(*neighborChildEdge))
1207 unsigned int num_edge_nodes = 2;
1208 for (
unsigned int i = 0; i < num_edge_nodes; ++i)
1210 unsigned int childNodeIndex = i;
1211 unsigned int neighborChildNodeIndex = num_edge_nodes - 1 - childNodeIndex;
1214 EFANode * childOfNeighborNode = neighborChildEdge->
getNode(neighborChildNodeIndex);
1217 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1224 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1231 if (merge_phantom_edges)
1233 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1236 dynamic_cast<EFAElement2D *>(NeighborElem->
getChild(l));
1237 if (!childOfNeighborElem)
1238 EFAError(
"dynamic cast childOfNeighborElem fails");
1240 EFAEdge * neighborChildEdge = childOfNeighborElem->
getEdge(neighbor_edge_id);
1246 unsigned int num_edge_nodes = 2;
1247 for (
unsigned int i = 0; i < num_edge_nodes; ++i)
1249 unsigned int childNodeIndex = i;
1250 unsigned int neighborChildNodeIndex = num_edge_nodes - 1 - childNodeIndex;
1253 EFANode * childOfNeighborNode = neighborChildEdge->
getNode(neighborChildNodeIndex);
1255 if (childNode->
parent() != NULL &&
1260 childOfNeighborNode,
1261 childOfNeighborElem,
1274 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1282 std::set<EFAElement *> patch_elems = InverseConnectivityMap[childNode->
parent()];
1283 if (parent2d->
numFragments() == 1 && patch_elems.size() == 1)
1290 PermanentNodes.insert(std::make_pair(new_node_id, newNode));
1295 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
1303 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1305 if (
_nodes[j]->parent() != NULL &&
1314 ostream << std::setw(4);
1315 ostream <<
_id <<
" | ";
1316 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1318 ostream << std::setw(5) <<
_nodes[j]->idCatString();
1322 for (
unsigned int j = 0; j <
_num_edges; ++j)
1324 ostream << std::setw(4);
1325 if (
_edges[j]->hasIntersection())
1327 if (
_edges[j]->numEmbeddedNodes() > 1)
1330 for (
unsigned int k = 0; k <
_edges[j]->numEmbeddedNodes(); ++k)
1332 ostream <<
_edges[j]->getEmbeddedNode(k)->id();
1333 if (k ==
_edges[j]->numEmbeddedNodes() - 1)
1340 ostream <<
_edges[j]->getEmbeddedNode(0)->id() <<
" ";
1346 for (
unsigned int j = 0; j <
_num_edges; ++j)
1363 ostream << std::setw(4);
1371 for (
unsigned int j = 0; j <
_fragments.size(); ++j)
1373 ostream << std::setw(4);
1374 ostream <<
" " << j <<
" | ";
1375 for (
unsigned int k = 0; k <
_fragments[j]->numEdges(); ++k)
1381 ostream << std::setw(5) << prt_node->
idCatString();
1384 ostream << std::endl;
1393 EFAError(
"frag_id out of bounds");
1399 std::set<EFANode *> edge_nodes;
1409 unsigned int edge_id = 99999;
1410 bool edge_found =
false;
1411 for (
unsigned int i = 0; i <
_num_edges; ++i)
1422 double rel_dist =
_edges[edge_id]->distanceFromNode1(node);
1423 double xi_1d = 2.0 * rel_dist - 1.0;
1435 EFAError(
"interior_node_id out of bounds");
1461 for (
unsigned int i = 0; i <
_num_edges; ++i)
1463 unsigned int i_plus1(i < (
_num_edges - 1) ? i + 1 : 0);
1486 EFAError(
"frag_id out of bounds in get_frag_edge()");
1492 std::set<EFANode *> phantom_nodes;
1495 for (
unsigned int j = 0; j < 2; ++j)
1497 bool node_in_frag =
false;
1498 for (
unsigned int k = 0; k <
_fragments.size(); ++k)
1502 node_in_frag =
true;
1510 return phantom_nodes;
1519 bool frag_edge_found =
false;
1520 frag_edge_id = 99999;
1523 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1528 frag_edge_found =
true;
1533 return frag_edge_found;
1539 bool is_phantom =
false;
1542 bool contain_frag_edge =
false;
1543 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
1545 for (
unsigned int j = 0; j <
_fragments[i]->numEdges(); ++j)
1549 contain_frag_edge =
true;
1553 if (contain_frag_edge)
1556 if (!contain_frag_edge)
1565 unsigned int num_neighbors = 0;
1568 return num_neighbors;
1577 EFAError(
"edge neighbor does not exist");
1583 bool has_tip_edges =
false;
1586 for (
unsigned int i = 0; i <
_num_edges; ++i)
1588 unsigned int num_frag_edges = 0;
1589 if (
_edges[i]->hasIntersection())
1591 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1594 num_frag_edges += 1;
1596 if (num_frag_edges == 2)
1598 has_tip_edges =
true;
1604 return has_tip_edges;
1611 unsigned int tip_edge_id = 99999;
1614 for (
unsigned int i = 0; i <
_num_edges; ++i)
1616 unsigned int num_frag_edges = 0;
1617 if (
_edges[i]->hasIntersection())
1619 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1622 num_frag_edges += 1;
1624 if (num_frag_edges == 2)
1642 for (
unsigned int i = 0; i <
_num_edges; ++i)
1644 std::vector<EFAEdge *> frag_edges;
1645 if (
_edges[i]->hasIntersection())
1647 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1650 frag_edges.push_back(
_fragments[0]->getEdge(j));
1652 if (frag_edges.size() == 2)
1655 tip_emb = frag_edges[0]->
getNode(1);
1657 tip_emb = frag_edges[0]->
getNode(0);
1659 EFAError(
"Common node can't be found between 2 tip frag edges");
1671 bool contains_tip =
false;
1674 unsigned int num_frag_edges = 0;
1675 if (
_edges[edge_id]->hasIntersection())
1677 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1680 num_frag_edges += 1;
1682 if (num_frag_edges == 2)
1683 contains_tip =
true;
1686 return contains_tip;
1693 bool has_cut =
false;
1698 unsigned int FragEdgeID = 99999;
1713 std::map<unsigned int, EFANode *> & EmbeddedNodes,
1714 bool add_to_neighbor)
1716 EFANode * local_embedded = NULL;
1719 local_embedded = embedded_node;
1721 if (
_edges[edge_id]->hasIntersectionAtPosition(position, edge_node1) && position >
Xfem::tol &&
1724 unsigned int emb_id =
_edges[edge_id]->getEmbeddedNodeIndex(position, edge_node1);
1725 EFANode * old_emb =
_edges[edge_id]->getEmbeddedNode(emb_id);
1726 if (embedded_node && embedded_node != old_emb)
1728 EFAError(
"Attempting to add edge intersection when one already exists with different node.",
1736 local_embedded = old_emb;
1740 bool add2elem =
true;
1743 unsigned int frag_edge_id = 99999;
1745 EFANode * frag_edge_node1 = NULL;
1746 double frag_pos = -1.0;
1747 bool add2frag =
false;
1754 double xi[2] = {-1.0, -1.0};
1755 xi[0] =
_edges[edge_id]->distanceFromNode1(frag_edge->
getNode(0));
1756 xi[1] =
_edges[edge_id]->distanceFromNode1(frag_edge->
getNode(1));
1757 if ((position - xi[0]) * (position - xi[1]) <
1760 frag_edge_node1 = frag_edge->
getNode(0);
1761 frag_pos = (position - xi[0]) / (xi[1] - xi[0]);
1769 EFAWarning(
"attempting to add new cut to a cut fragment edge");
1779 if (!local_embedded)
1783 EmbeddedNodes.insert(std::make_pair(new_node_id, local_embedded));
1785 _edges[edge_id]->addIntersection(position, local_embedded, edge_node1);
1786 if (
_edges[edge_id]->numEmbeddedNodes() > 2)
1787 EFAError(
"element edge can't have >2 embedded nodes");
1793 frag_edge->
addIntersection(frag_pos, local_embedded, frag_edge_node1);
1795 EFAError(
"fragment edge can't have >1 embedded nodes");
1799 if (add_to_neighbor)
1801 for (
unsigned int en_iter = 0; en_iter <
numEdgeNeighbors(edge_id); ++en_iter)
1805 if (edge_neighbor->
getEdge(neighbor_edge_id)->
getNode(0) == edge_node1)
1806 EFAError(
"neighbor edge has the same direction as this edge");
1807 double neigh_pos = 1.0 - position;
1808 edge_neighbor->
addEdgeCut(neighbor_edge_id, neigh_pos, local_embedded, EmbeddedNodes,
false);
1815 EFANode * embedded_permanent_node,
1816 std::map<unsigned int, EFANode *> & PermanentNodes,
1817 std::map<unsigned int, EFANode *> & EmbeddedPermanentNodes)
1819 EFANode * local_embedded_permanent = NULL;
1821 if (embedded_permanent_node)
1822 local_embedded_permanent = embedded_permanent_node;
1827 local_embedded_permanent = node;
1828 EmbeddedPermanentNodes.insert(std::make_pair(node->
id(), local_embedded_permanent));
1830 EFAError(
"Attempted to delete node: ",
1831 local_embedded_permanent->
id(),
1832 " from PermanentNodes, but couldn't find it");
1839 std::map<unsigned int, EFANode *> & EmbeddedNodes)
1842 EFAError(
"Element: ",
_id,
" should have only 1 fragment in addFragEdgeIntersection");
1843 EFANode * local_embedded = NULL;
1846 bool isValidIntersection =
true;
1851 (std::abs(1.0 - position) <
Xfem::tol &&
1853 isValidIntersection =
false;
1857 isValidIntersection =
false;
1860 if (isValidIntersection)
1865 EFAError(
"Attempting to add fragment edge intersection when one already exists with "
1866 "different position.",
1878 if (!
_fragments[0]->isEdgeInterior(frag_edge_id) ||
1879 _fragments[0]->isSecondaryInteriorEdge(frag_edge_id))
1880 EFAError(
"Attemping to add intersection to an invalid fragment edge. Element: ",
1888 EmbeddedNodes.insert(std::make_pair(new_node_id, local_embedded));
1895 std::vector<double> node1_para_coor(2, 0.0);
1896 std::vector<double> node2_para_coor(2, 0.0);
1900 double xi = (1.0 - position) * node1_para_coor[0] + position * node2_para_coor[0];
1901 double eta = (1.0 - position) * node1_para_coor[1] + position * node2_para_coor[1];
1905 EFAError(
"elem: ",
_id,
" cannot get the parametric coords of two end embedded nodes");
1912 return isValidIntersection;
1915 std::vector<EFAFragment2D *>
1919 EFAError(
"branching is only allowed for an uncut element");
1922 std::vector<EFANode *> three_nodes;
1923 for (
unsigned int i = 0; i <
_edges.size(); ++i)
1926 if (
_edges[i]->numEmbeddedNodes() == 1)
1927 three_nodes.push_back(
_edges[i]->getEmbeddedNode(0));
1928 else if (
_edges[i]->numEmbeddedNodes() == 2)
1931 _edges[i]->getIntersection(0, node1) <
_edges[i]->getIntersection(1, node1) ? 0 : 1);
1932 unsigned int id1 = 1 - id0;
1933 three_nodes.push_back(
_edges[i]->getEmbeddedNode(id0));
1934 three_nodes.push_back(
_edges[i]->getEmbeddedNode(id1));
1937 if (three_nodes.size() != 3)
1938 EFAError(
"three_nodes.size() != 3");
1942 std::vector<double> center_xi(2, 0.0);
1943 for (
unsigned int i = 0; i < 3; ++i)
1945 std::vector<double> xi_2d(2, 0.0);
1947 center_xi[0] += xi_2d[0];
1948 center_xi[1] += xi_2d[1];
1950 center_xi[0] /= 3.0;
1951 center_xi[1] /= 3.0;
1956 EmbeddedNodes.insert(std::make_pair(new_node_id, new_emb));
1960 std::vector<EFAFragment2D *> new_fragments;
1961 for (
unsigned int i = 0; i < 3; ++i)
1964 unsigned int iplus1(i < 2 ? i + 1 : 0);
1968 unsigned int iedge = 0;
1969 bool add_more_edges =
true;
1970 for (
unsigned int j = 0; j <
_edges.size(); ++j)
1976 new_frag->
addEdge(
new EFAEdge(three_nodes[i], three_nodes[iplus1]));
1977 add_more_edges =
false;
1987 while (add_more_edges)
1990 if (iedge ==
_edges.size())
1995 add_more_edges =
false;
2000 new_fragments.push_back(new_frag);
2002 return new_fragments;
2008 std::vector<double> & para_coor)
const
2010 para_coor.resize(2, 0.0);
2015 para_coor[0] = xi_1d;
2016 para_coor[1] = -1.0;
2018 else if (edge_id == 1)
2021 para_coor[1] = xi_1d;
2023 else if (edge_id == 2)
2025 para_coor[0] = -xi_1d;
2028 else if (edge_id == 3)
2030 para_coor[0] = -1.0;
2031 para_coor[1] = -xi_1d;
2034 EFAError(
"edge_id out of bounds");
2040 para_coor[0] = 0.5 * (1.0 - xi_1d);
2041 para_coor[1] = 0.5 * (1.0 + xi_1d);
2043 else if (edge_id == 1)
2046 para_coor[1] = 0.5 * (1.0 - xi_1d);
2048 else if (edge_id == 2)
2050 para_coor[0] = 0.5 * (1.0 + xi_1d);
2054 EFAError(
"edge_id out of bounds");
2057 EFAError(
"unknown element for 2D");
2060 std::vector<EFANode *>
2063 std::set<EFANode *> e1nodes(
_nodes.begin(),
2067 return common_nodes;