22 bool create_boundary_edges,
27 if (create_boundary_edges)
30 EFAError(
"EFAfragment2D constructor must have a from_host to copy from");
31 if (frag_id == std::numeric_limits<unsigned int>::max())
33 for (
unsigned int i = 0; i < from_host->
numEdges(); ++i)
39 EFAError(
"In EFAfragment2D constructor fragment_copy_index out of bounds");
49 for (
unsigned int i = 0; i < from_face->
numEdges(); ++i)
75 bool contains =
false;
90 unsigned int num_cut_edges = 0;
102 unsigned int num_cut_nodes = 0;
106 return num_cut_nodes;
112 std::set<EFANode *> nodes;
124 bool is_connected =
false;
125 EFAFragment2D * other_frag2d = dynamic_cast<EFAFragment2D *>(other_fragment);
127 EFAError(
"in isConnected other_fragment is not of type EFAfragement2D");
131 for (
unsigned int j = 0; j < other_frag2d->
numEdges(); ++j)
157 EFAError(
"host element must have 1 interior node at this point");
174 EFAError(
"In combine_tip_edges() the frag must have host_elem");
176 bool has_tip_edges =
false;
177 unsigned int elem_tip_edge_id = 99999;
178 std::vector<unsigned int> frag_tip_edge_id;
181 frag_tip_edge_id.clear();
187 frag_tip_edge_id.push_back(j);
189 if (frag_tip_edge_id.size() == 2)
191 has_tip_edges =
true;
192 elem_tip_edge_id = i;
200 unsigned int edge0_next(frag_tip_edge_id[0] < (
numEdges() - 1) ? frag_tip_edge_id[0] + 1 : 0);
201 if (edge0_next != frag_tip_edge_id[1])
202 EFAError(
"frag_tip_edge_id[1] must be the next edge of frag_tip_edge_id[0]");
209 EFAError(
"fragment edges are not correctly set up");
216 double position = (xi_emb - xi_node1) / (xi_node2 - xi_node1);
247 EFAError(
"in isEdgeInterior fragment must have host elem");
249 bool edge_in_elem_edge =
false;
255 edge_in_elem_edge =
true;
259 if (!edge_in_elem_edge)
265 std::vector<unsigned int>
268 std::vector<unsigned int> interior_edge_id;
272 interior_edge_id.push_back(i);
274 return interior_edge_id;
280 bool is_second_cut =
false;
282 EFAError(
"in isSecondaryInteriorEdge fragment must have host elem");
288 is_second_cut =
true;
292 return is_second_cut;
305 EFAError(
"in EFAfragment2D::get_edge, index out of bounds");
318 std::set<EFANode *> edge_nodes;
330 std::vector<EFAFragment2D *>
336 std::vector<EFAFragment2D *> new_fragments;
337 std::vector<unsigned int> cut_edges;
338 std::vector<unsigned int> cut_nodes;
342 cut_nodes.push_back(iedge);
344 EFAError(
"A fragment boundary edge can't have more than 1 cuts");
346 cut_edges.push_back(iedge);
349 if (cut_edges.size() > 2)
351 EFAError(
"In split() fragment cannot have more than 2 cut edges");
353 else if (cut_edges.size() == 1 && cut_nodes.size() == 1)
355 if (cut_edges[0] == 1 && cut_nodes[0] == 0)
374 new_fragments.push_back(new_frag1);
375 new_fragments.push_back(new_frag2);
377 else if (cut_edges[0] == 2 && cut_nodes[0] == 0)
396 new_fragments.push_back(new_frag1);
397 new_fragments.push_back(new_frag2);
399 else if (cut_edges[0] == 2 && cut_nodes[0] == 1)
418 new_fragments.push_back(new_frag1);
419 new_fragments.push_back(new_frag2);
421 else if (cut_edges[0] == 3 && cut_nodes[0] == 1)
440 new_fragments.push_back(new_frag1);
441 new_fragments.push_back(new_frag2);
443 else if (cut_edges[0] == 3 && cut_nodes[0] == 2)
462 new_fragments.push_back(new_frag1);
463 new_fragments.push_back(new_frag2);
465 else if (cut_edges[0] == 3 && cut_nodes[0] == 2)
484 new_fragments.push_back(new_frag1);
485 new_fragments.push_back(new_frag2);
487 else if (cut_edges[0] == 3 && cut_nodes[0] == 2)
506 new_fragments.push_back(new_frag1);
507 new_fragments.push_back(new_frag2);
509 else if (cut_edges[0] == 1 && cut_nodes[0] == 3)
528 new_fragments.push_back(new_frag1);
529 new_fragments.push_back(new_frag2);
531 else if (cut_edges[0] == 0 && cut_nodes[0] == 3)
550 new_fragments.push_back(new_frag1);
551 new_fragments.push_back(new_frag2);
554 else if (cut_nodes.size() == 2)
556 if ((cut_nodes[0] == 0 && cut_nodes[1] == 2) || (cut_nodes[0] == 2 && cut_nodes[1] == 0))
573 new_fragments.push_back(new_frag1);
574 new_fragments.push_back(new_frag2);
576 else if ((cut_nodes[0] == 1 && cut_nodes[1] == 3) || (cut_nodes[0] == 3 && cut_nodes[1] == 1))
593 new_fragments.push_back(new_frag1);
594 new_fragments.push_back(new_frag2);
596 else if ((cut_nodes[0] == 0 && cut_nodes[1] == 1) || (cut_nodes[0] == 1 && cut_nodes[1] == 2) ||
597 (cut_nodes[0] == 2 && cut_nodes[1] == 3) || (cut_nodes[0] == 3 && cut_nodes[1] == 0) ||
598 (cut_nodes[0] == 1 && cut_nodes[1] == 0) || (cut_nodes[0] == 2 && cut_nodes[1] == 1) ||
599 (cut_nodes[0] == 3 && cut_nodes[1] == 2) || (cut_nodes[0] == 0 && cut_nodes[1] == 3))
612 new_fragments.push_back(new_frag);
615 else if (cut_edges.size() == 2 || (cut_edges.size() == 1 && cut_nodes.size() == 0))
617 unsigned int iedge = 0;
618 unsigned int icutedge = 0;
626 if (iedge == cut_edges[icutedge])
629 unsigned int iprevedge(iedge > 0 ? iedge - 1 :
_boundary_edges.size() - 1);
634 EFAError(
"Previous edge does not contain either of the nodes in this edge");
637 new_frag->
addEdge(
new EFAEdge(first_node_on_edge, embedded_node1));
640 if (icutedge == cut_edges.size())
642 iedge = cut_edges[icutedge];
644 if (embedded_node2 != embedded_node1)
648 unsigned int inextedge(iedge < (
_boundary_edges.size() - 1) ? iedge + 1 : 0);
653 EFAError(
"Next edge does not contain either of the nodes in this edge");
655 new_frag->
addEdge(
new EFAEdge(embedded_node2, second_node_on_edge));
665 if (cut_edges.size() > 1)
667 iedge = cut_edges[0] + 1;
672 new_fragments.push_back(new_frag);
673 }
while (new_fragments.size() < cut_edges.size());
675 else if (cut_nodes.size() == 1)
682 new_frag->
addEdge(
new EFAEdge(first_node_on_edge, second_node_on_edge));
684 new_fragments.push_back(new_frag);
687 return new_fragments;