20 : _num_nodes(n_nodes),
21 _nodes(_num_nodes, NULL),
22 _num_edges(_num_nodes),
23 _edges(_num_edges, NULL),
24 _face_interior_nodes(num_interior_face_nodes, NULL)
29 : _num_nodes(other_face._num_nodes),
30 _nodes(_num_nodes, NULL),
31 _num_edges(_num_nodes),
32 _edges(_num_edges, NULL)
34 for (
unsigned int k = 0; k < other_face.
_num_nodes; ++k)
44 : _num_nodes(frag->numEdges()),
45 _nodes(_num_nodes, NULL),
46 _num_edges(_num_nodes),
47 _edges(_num_edges, NULL)
49 for (
unsigned int k = 0; k < frag->
numEdges(); ++k)
52 unsigned int kprev(k > 0 ? (k - 1) : (frag->
numEdges() - 1));
62 for (
unsigned int i = 0; i <
_edges.size(); ++i)
107 bool is_face_node =
true;
110 if (
_nodes[i] == old_node)
113 is_face_node =
false;
124 for (
unsigned int i = 0; i <
_edges.size(); ++i)
133 std::vector<EFANode *> & master_nodes,
134 std::vector<double> & master_weights)
const
138 master_nodes.clear();
139 master_weights.clear();
140 bool masters_found =
false;
145 masters_found =
_edges[i]->getNodeMasters(node, master_nodes, master_weights);
149 EFAError(
"In getMasterInfo: cannot find master nodes in element edges");
159 std::vector<double> emb_xi(2, 0.0);
164 master_nodes.push_back(
_nodes[j]);
171 EFAError(
"EFAface::getMasterInfo() only works for quad and tri EFAface");
172 master_weights.push_back(weight);
174 masters_found =
true;
179 return masters_found;
186 bool edge_found =
false;
187 unsigned int edge_id;
189 EFAError(
"EFAface::getEdgeNodeParaCoor can only work for quad or tri faces");
202 double rel_dist =
_edges[edge_id]->distanceFromNode1(node);
203 double xi_1d = 2.0 * rel_dist - 1.0;
212 bool node_in_face =
false;
214 EFAError(
"EFAface::getFaceNodeParaCoor can only work for quad or tri faces");
224 xi_2d.resize(2, 0.0);
244 for (
unsigned int i = 0; i <
_edges.size(); ++i)
249 EFAError(
"in EFAface::createNodes() _edges[i] does not exist");
268 _edges[edge_id] = new_edge;
276 unsigned int i_plus1(i < (
_num_nodes - 1) ? i + 1 : 0);
283 EFAError(
"EFAface::createEdges requires exsiting _nodes");
294 unsigned int edge1_next(edge_id1 < (
_num_edges - 1) ? edge_id1 + 1 : 0);
295 if (edge1_next != edge_id2)
297 unsigned int itmp = edge_id1;
307 EFAError(
"in combine_two_edges face edges are not correctly set up");
314 _edges[edge_id1] = full_edge;
325 EFAError(
"two edges to be combined are not ajacent to each other");
331 std::vector<EFAEdge *> ordered_edges(
_num_edges, NULL);
332 ordered_edges[0] =
_edges[0];
335 EFAEdge * last_edge = ordered_edges[i - 1];
340 ordered_edges[i] =
_edges[j];
352 for (
unsigned int i = 0; i <
_edges.size(); ++i)
353 _edges[i]->reverseNodes();
370 bool overlap =
false;
375 for (
unsigned int j = 0; j < other_face->
_num_nodes; ++j)
393 bool contains =
false;
420 for (
unsigned int i = 0; i < other_face->
_num_nodes; ++i)
434 for (
unsigned int i = 0; i <
_edges.size(); ++i)
446 unsigned int index = 0;
447 bool node_found =
false;
464 std::vector<EFAFace *>
467 std::vector<EFAFace *> new_faces;
472 std::vector<EFAFragment2D *> new_frags_tmp = frag_tmp->
split();
475 for (
unsigned int i = 0; i < new_frags_tmp.size(); ++i)
476 new_faces.push_back(
new EFAFace(new_frags_tmp[i]));
480 for (
unsigned int i = 0; i < new_frags_tmp.size(); ++i)
481 delete new_frags_tmp[i];
484 new_faces.push_back(
new EFAFace(*
this));
497 std::vector<EFANode *> common_nodes;
498 common_nodes.push_back(
_edges[this_common_edge_id]->
getNode(0));
499 common_nodes.push_back(
_edges[this_common_edge_id]->
getNode(1));
505 unsigned int this_edge_id0(this_common_edge_id > 0 ? this_common_edge_id - 1
507 unsigned int this_edge_id1(this_common_edge_id < (
_num_edges - 1) ? this_common_edge_id + 1
509 unsigned int other_edge_id0(
510 other_common_edge_id < (other_face->
_num_edges - 1) ? other_common_edge_id + 1 : 0);
511 unsigned int other_edge_id1(other_common_edge_id > 0 ? other_common_edge_id - 1
515 other_face->
_edges[other_edge_id0]->getNode(1));
517 -1.0, common_nodes[0], new_edge0->
getNode(0));
520 unsigned int other_iedge(other_edge_id0 < (other_face->
_num_edges - 1) ? other_edge_id0 + 1
522 while (!other_face->
_edges[other_iedge]->equivalent(*other_face->
_edges[other_edge_id1]))
531 _edges[this_edge_id1]->getNode(1));
533 -1.0, common_nodes[1], new_edge1->
getNode(0));
536 unsigned int this_iedge(this_edge_id1 < (
_num_edges - 1) ? this_edge_id1 + 1 : 0);
545 new_face =
new EFAFace(new_frag);
547 if (new_face->
numNodes() != new_n_nodes)
548 EFAError(
"combine_with() sanity check fails");
563 if (
_edges[j]->numEmbeddedNodes() > 1)
564 EFAError(
"frag face edge can only have 1 emb node at this point");
569 double inters_x =
_edges[j]->getIntersection(0, edge_node1);
570 if (std::abs(inters_x + 1.0) < 1.0e-4)
572 std::vector<double> node1_xi2d(2, 0.0);
573 std::vector<double> node2_xi2d(2, 0.0);
574 std::vector<double> emb_xi2d(2, 0.0);
581 std::sqrt((emb_xi2d[0] - node1_xi2d[0]) * (emb_xi2d[0] - node1_xi2d[0]) +
582 (emb_xi2d[1] - node1_xi2d[1]) * (emb_xi2d[1] - node1_xi2d[1]));
584 std::sqrt((node2_xi2d[0] - node1_xi2d[0]) * (node2_xi2d[0] - node1_xi2d[0]) +
585 (node2_xi2d[1] - node1_xi2d[1]) * (node2_xi2d[1] - node1_xi2d[1]));
586 inters_x = dist2node1 / full_dist;
589 EFAError(
"reference face does not contain the edge with invalid inters");
590 _edges[j]->resetIntersection(inters_x, emb_node, edge_node1);
599 unsigned int num_cuts = 0;
600 for (
unsigned int i = 0; i <
_edges.size(); ++i)
603 num_cuts +=
_edges[i]->numEmbeddedNodes();
620 for (
unsigned int i = 0; i <
_edges.size(); ++i)
621 if (from_face.
_edges[i]->hasIntersection())
653 EFAError(
"this face is not adjacent with other_face");
660 bool same_order =
false;
663 for (
unsigned int i = 0; i < other_face->
numNodes(); ++i)
667 unsigned int iplus1(i < (other_face->
_num_nodes - 1) ? i + 1 : 0);
674 EFAError(
"two faces overlap but can't find correct common nodes");
679 EFAWarning(
"in hasSameOrientation two faces does not overlap");
692 std::vector<double> & xi_2d)
const
695 xi_2d.resize(2, 0.0);
703 else if (edge_id == 1)
708 else if (edge_id == 2)
713 else if (edge_id == 3)
719 EFAError(
"edge_id out of bounds");
725 xi_2d[0] = 0.5 * (1.0 - xi_1d);
726 xi_2d[1] = 0.5 * (1.0 + xi_1d);
728 else if (edge_id == 1)
731 xi_2d[1] = 0.5 * (1.0 - xi_1d);
733 else if (edge_id == 2)
735 xi_2d[0] = 0.5 * (1.0 + xi_1d);
739 EFAError(
"edge_id out of bounds");
742 EFAError(
"the EFAface::mapParametricCoordsFrom1DTo2D only works for quad and tri faces");