https://mooseframework.inl.gov
Loading...
Searching...
No Matches
EFAFace.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "EFAFace.h"
11
12#include "EFAFaceNode.h"
13#include "EFANode.h"
14#include "EFAEdge.h"
15#include "EFAFragment2D.h"
16#include "EFAFuncs.h"
17#include "EFAError.h"
18
19EFAFace::EFAFace(unsigned int n_nodes, unsigned int num_interior_face_nodes)
20 : _num_nodes(n_nodes),
21 _nodes(_num_nodes, nullptr),
22 _num_edges(_num_nodes),
23 _edges(_num_edges, nullptr),
24 _face_interior_nodes(num_interior_face_nodes, nullptr)
25{
26}
27
28EFAFace::EFAFace(const EFAFace & other_face)
29 : _num_nodes(other_face._num_nodes),
30 _nodes(_num_nodes, nullptr),
31 _num_edges(_num_nodes),
32 _edges(_num_edges, nullptr)
33{
34 for (unsigned int k = 0; k < other_face._num_nodes; ++k)
35 {
36 _nodes[k] = other_face._nodes[k];
37 _edges[k] = new EFAEdge(*other_face._edges[k]);
38 }
39 for (unsigned int k = 0; k < other_face._interior_nodes.size(); ++k)
40 _interior_nodes.push_back(new EFAFaceNode(*other_face._interior_nodes[k]));
41}
42
44 : _num_nodes(frag->numEdges()),
45 _nodes(_num_nodes, nullptr),
46 _num_edges(_num_nodes),
47 _edges(_num_edges, nullptr)
48{
49 for (unsigned int k = 0; k < frag->numEdges(); ++k)
50 {
51 EFANode * node = frag->getEdge(k)->getNode(0);
52 unsigned int kprev(k > 0 ? (k - 1) : (frag->numEdges() - 1));
53 if (!frag->getEdge(kprev)->containsNode(node))
54 node = getEdge(k)->getNode(1);
55 _nodes[k] = node;
56 _edges[k] = new EFAEdge(*frag->getEdge(k));
57 }
58}
59
61{
62 for (unsigned int i = 0; i < _edges.size(); ++i)
63 {
64 if (_edges[i])
65 {
66 delete _edges[i];
67 _edges[i] = nullptr;
68 }
69 }
70 for (unsigned int i = 0; i < _interior_nodes.size(); ++i)
71 {
72 if (_interior_nodes[i])
73 {
74 delete _interior_nodes[i];
75 _interior_nodes[i] = nullptr;
76 }
77 }
78}
79
80void
82{
83 _face_interior_nodes[i] = node;
84}
85
86unsigned int
88{
89 return _nodes.size();
90}
91
92void
93EFAFace::setNode(unsigned int node_id, EFANode * node)
94{
95 _nodes[node_id] = node;
96}
97
98EFANode *
99EFAFace::getNode(unsigned int node_id) const
100{
101 return _nodes[node_id];
102}
103
104void
105EFAFace::switchNode(EFANode * new_node, EFANode * old_node)
106{
107 bool is_face_node = true;
108 for (unsigned int i = 0; i < _num_nodes; ++i)
109 {
110 if (_nodes[i] == old_node)
111 {
112 _nodes[i] = new_node;
113 is_face_node = false;
114 }
115 }
116 if (is_face_node)
117 {
118 for (unsigned int i = 0; i < _face_interior_nodes.size(); ++i)
119 if (_face_interior_nodes[i] == old_node)
120 _face_interior_nodes[i] = new_node;
121 }
122 else
123 {
124 for (unsigned int i = 0; i < _edges.size(); ++i)
125 _edges[i]->switchNode(new_node, old_node);
126 for (unsigned int i = 0; i < _interior_nodes.size(); ++i)
127 _interior_nodes[i]->switchNode(new_node, old_node);
128 }
129}
130
131bool
133 std::vector<EFANode *> & master_nodes,
134 std::vector<double> & master_weights) const
135{
136 // Given a EFAnode, find the element edge or fragment edge that contains it
137 // Return its master nodes and weights
138 master_nodes.clear();
139 master_weights.clear();
140 bool masters_found = false;
141 for (unsigned int i = 0; i < _num_edges; ++i) // check element exterior edges
142 {
143 if (_edges[i]->containsNode(node))
144 {
145 masters_found = _edges[i]->getNodeMasters(node, master_nodes, master_weights);
146 if (masters_found)
147 break;
148 else
149 EFAError("In getMasterInfo: cannot find master nodes in element edges");
150 }
151 }
152
153 if (!masters_found) // check element interior embedded nodes
154 {
155 for (unsigned int i = 0; i < _interior_nodes.size(); ++i)
156 {
157 if (_interior_nodes[i]->getNode() == node)
158 {
159 std::vector<double> emb_xi(2, 0.0);
160 emb_xi[0] = _interior_nodes[i]->getParametricCoordinates(0);
161 emb_xi[1] = _interior_nodes[i]->getParametricCoordinates(1);
162 for (unsigned int j = 0; j < _num_nodes; ++j)
163 {
164 master_nodes.push_back(_nodes[j]);
165 double weight = 0.0;
166 if (_num_nodes == 4)
167 weight = Efa::linearQuadShape2D(j, emb_xi);
168 else if (_num_nodes == 3)
169 weight = Efa::linearTriShape2D(j, emb_xi);
170 else
171 EFAError("EFAface::getMasterInfo() only works for quad and tri EFAface");
172 master_weights.push_back(weight);
173 }
174 masters_found = true;
175 break;
176 }
177 }
178 }
179 return masters_found;
180}
181
182bool
183EFAFace::getEdgeNodeParametricCoords(EFANode * node, std::vector<double> & xi_2d) const
184{
185 // get the parametric coords of a node in an edge
186 bool edge_found = false;
187 unsigned int edge_id;
188 if (!isTriOrQuad())
189 EFAError("EFAface::getEdgeNodeParaCoor can only work for quad or tri faces");
190
191 for (unsigned int i = 0; i < _num_edges; ++i)
192 {
193 if (_edges[i]->containsNode(node))
194 {
195 edge_id = i;
196 edge_found = true;
197 break;
198 }
199 }
200 if (edge_found)
201 {
202 double rel_dist = _edges[edge_id]->distanceFromNode1(node);
203 double xi_1d = 2.0 * rel_dist - 1.0; // translate to [-1,1] parent coord syst
204 mapParametricCoordsFrom1DTo2D(edge_id, xi_1d, xi_2d);
205 }
206 return edge_found;
207}
208
209bool
210EFAFace::getFaceNodeParametricCoords(EFANode * node, std::vector<double> & xi_2d) const
211{
212 bool node_in_face = false;
213 if (!isTriOrQuad())
214 EFAError("EFAface::getFaceNodeParaCoor can only work for quad or tri faces");
215
216 if (getEdgeNodeParametricCoords(node, xi_2d))
217 node_in_face = true;
218 else
219 {
220 for (unsigned int i = 0; i < _interior_nodes.size(); ++i)
221 {
222 if (_interior_nodes[i]->getNode() == node)
223 {
224 xi_2d.resize(2, 0.0);
225 xi_2d[0] = _interior_nodes[i]->getParametricCoordinates(0);
226 xi_2d[1] = _interior_nodes[i]->getParametricCoordinates(1);
227 node_in_face = true;
228 break;
229 }
230 } // i
231 }
232 return node_in_face;
233}
234
235unsigned int
237{
238 return _interior_nodes.size();
239}
240
241void
243{
244 for (unsigned int i = 0; i < _edges.size(); ++i)
245 {
246 if (_edges[i] != nullptr)
247 _nodes[i] = _edges[i]->getNode(0);
248 else
249 EFAError("in EFAface::createNodes() _edges[i] does not exist");
250 }
251}
252
253void
254EFAFace::setEdge(unsigned int edge_id, EFAEdge * new_edge)
255{
256 _edges[edge_id] = new_edge;
257}
258
259void
261{
262 for (unsigned int i = 0; i < _num_nodes; ++i)
263 {
264 unsigned int i_plus1(i < (_num_nodes - 1) ? i + 1 : 0);
265 if (_nodes[i] != nullptr && _nodes[i_plus1] != nullptr)
266 {
267 EFAEdge * new_edge = new EFAEdge(_nodes[i], _nodes[i_plus1]);
268 _edges[i] = new_edge;
269 }
270 else
271 EFAError("EFAface::createEdges requires exsiting _nodes");
272 }
273}
274
275void
276EFAFace::combineTwoEdges(unsigned int edge_id1, unsigned int edge_id2)
277{
278 if (_edges[edge_id1]->containsNode(_edges[edge_id2]->getNode(0)) ||
279 _edges[edge_id1]->containsNode(_edges[edge_id2]->getNode(1)))
280 {
281 // edge_id1 must precede edge_id2
282 unsigned int edge1_next(edge_id1 < (_num_edges - 1) ? edge_id1 + 1 : 0);
283 if (edge1_next != edge_id2) // if not, swap
284 {
285 unsigned int itmp = edge_id1;
286 edge_id1 = edge_id2;
287 edge_id2 = itmp;
288 }
289
290 // build new edge and delete old ones
291 EFANode * new_node1 = _edges[edge_id1]->getNode(0);
292 EFANode * emb_node = _edges[edge_id1]->getNode(1);
293 EFANode * new_node2 = _edges[edge_id2]->getNode(1);
294 if (emb_node != _edges[edge_id2]->getNode(0))
295 EFAError("in combine_two_edges face edges are not correctly set up");
296
297 EFAEdge * full_edge = new EFAEdge(new_node1, new_node2);
298 full_edge->addIntersection(-1.0, emb_node, new_node1); // dummy intersection_x
299
300 delete _edges[edge_id1];
301 delete _edges[edge_id2];
302 _edges[edge_id1] = full_edge;
303 _edges.erase(_edges.begin() + edge_id2);
304
305 // update face memeber variables
306 _num_edges -= 1;
307 _num_nodes -= 1;
308 _nodes.resize(_num_nodes, nullptr);
309 for (unsigned int k = 0; k < _num_edges; ++k)
310 _nodes[k] = _edges[k]->getNode(0);
311 }
312 else
313 EFAError("two edges to be combined are not ajacent to each other");
314}
315
316void
318{
319 std::vector<EFAEdge *> ordered_edges(_num_edges, nullptr);
320 ordered_edges[0] = _edges[0];
321 for (unsigned int i = 1; i < _num_edges; ++i)
322 {
323 EFAEdge * last_edge = ordered_edges[i - 1];
324 for (unsigned int j = 0; j < _num_edges; ++j)
325 {
326 if (!_edges[j]->equivalent(*last_edge) && _edges[j]->containsNode(last_edge->getNode(1)))
327 {
328 ordered_edges[i] = _edges[j];
329 break;
330 }
331 } // j
332 } // i
333 _edges = ordered_edges;
334}
335
336void
338{
339 // reverse the orientation of the face
340 for (unsigned int i = 0; i < _edges.size(); ++i)
341 _edges[i]->reverseNodes();
342 std::reverse(_edges.begin(), _edges.end());
343}
344
345bool
347{
348 if (_num_edges == 3 || _num_edges == 4)
349 return true;
350 else
351 return false;
352}
353
354bool
355EFAFace::equivalent(const EFAFace * other_face) const
356{
357 return std::is_permutation(
358 _nodes.begin(), _nodes.end(), other_face->_nodes.begin(), other_face->_nodes.end());
359}
360
361bool
363{
364 for (unsigned int i = 0; i < _num_edges; ++i)
365 if (_edges[i]->containsNode(node))
366 return true;
367
368 for (unsigned int i = 0; i < _interior_nodes.size(); ++i)
369 if (_interior_nodes[i]->getNode() == node)
370 return true;
371
372 return false;
373}
374
375bool
376EFAFace::containsFace(const EFAFace * other_face) const
377{
378 unsigned int counter = 0;
379 for (unsigned int i = 0; i < other_face->_num_nodes; ++i)
380 {
381 if (containsNode(other_face->_nodes[i]))
382 counter += 1;
383 }
384 if (counter == other_face->_num_nodes)
385 return true;
386 else
387 return false;
388}
389
390bool
391EFAFace::ownsEdge(const EFAEdge * other_edge) const
392{
393 for (unsigned int i = 0; i < _edges.size(); ++i)
394 if (_edges[i]->equivalent(*other_edge))
395 return true;
396 return false;
397}
398
399void
401{
402 for (unsigned int i = 0; i < _num_edges; ++i)
403 _edges[i]->removeEmbeddedNode(emb_node);
404
405 unsigned int index = 0;
406 bool node_found = false;
407 for (unsigned int i = 0; i < _interior_nodes.size(); ++i)
408 {
409 if (_interior_nodes[i]->getNode() == emb_node)
410 {
411 node_found = true;
412 index = i;
413 break;
414 }
415 }
416 if (node_found)
417 {
418 delete _interior_nodes[index];
419 _interior_nodes.erase(_interior_nodes.begin() + index);
420 }
421}
422
423std::vector<EFAFace *>
425{
426 std::vector<EFAFace *> new_faces;
427 if (getNumCuts() > 0)
428 {
429 // construct a fragment from this face
430 EFAFragment2D * frag_tmp = new EFAFragment2D(nullptr, this);
431 std::vector<EFAFragment2D *> new_frags_tmp = frag_tmp->split();
432
433 // copy new_frags to new_faces
434 for (unsigned int i = 0; i < new_frags_tmp.size(); ++i)
435 new_faces.push_back(new EFAFace(new_frags_tmp[i]));
436
437 // delete frag_tmp and new_frags
438 delete frag_tmp;
439 for (unsigned int i = 0; i < new_frags_tmp.size(); ++i)
440 delete new_frags_tmp[i];
441 }
442 else
443 new_faces.push_back(new EFAFace(*this));
444
445 return new_faces;
446}
447
448EFAFace *
449EFAFace::combineWithFace(const EFAFace * other_face) const
450{
451 // combine this face with another adjacent face
452 EFAFace * new_face = nullptr;
453 if (isAdjacent(other_face))
454 {
455 unsigned int this_common_edge_id = adjacentCommonEdge(other_face);
456 std::vector<EFANode *> common_nodes;
457 common_nodes.push_back(_edges[this_common_edge_id]->getNode(0));
458 common_nodes.push_back(_edges[this_common_edge_id]->getNode(1));
459
460 unsigned int other_common_edge_id = other_face->adjacentCommonEdge(this);
461 unsigned int new_n_nodes = _num_edges + other_face->_num_edges - 4;
462 EFAFragment2D * new_frag = new EFAFragment2D(nullptr, false, nullptr); // temp fragment
463
464 unsigned int this_edge_id0(this_common_edge_id > 0 ? this_common_edge_id - 1
465 : _num_edges - 1); // common_nodes[0]
466 unsigned int this_edge_id1(this_common_edge_id < (_num_edges - 1) ? this_common_edge_id + 1
467 : 0); // common_nodes[1]
468 unsigned int other_edge_id0(
469 other_common_edge_id < (other_face->_num_edges - 1) ? other_common_edge_id + 1 : 0);
470 unsigned int other_edge_id1(other_common_edge_id > 0 ? other_common_edge_id - 1
471 : other_face->_num_edges - 1);
472
473 EFAEdge * new_edge0 = new EFAEdge(_edges[this_edge_id0]->getNode(0),
474 other_face->_edges[other_edge_id0]->getNode(1));
475 new_edge0->addIntersection(
476 -1.0, common_nodes[0], new_edge0->getNode(0)); // dummy intersection_x
477 new_frag->addEdge(new_edge0); // common_nodes[0]'s edge
478
479 unsigned int other_iedge(other_edge_id0 < (other_face->_num_edges - 1) ? other_edge_id0 + 1
480 : 0);
481 while (!other_face->_edges[other_iedge]->equivalent(*other_face->_edges[other_edge_id1]))
482 {
483 new_frag->addEdge(new EFAEdge(*other_face->_edges[other_iedge]));
484 other_iedge += 1;
485 if (other_iedge == other_face->_num_edges)
486 other_iedge = 0;
487 } // loop over other_face's edges
488
489 EFAEdge * new_edge1 = new EFAEdge(other_face->_edges[other_edge_id1]->getNode(0),
490 _edges[this_edge_id1]->getNode(1));
491 new_edge1->addIntersection(
492 -1.0, common_nodes[1], new_edge1->getNode(0)); // dummy intersection_x
493 new_frag->addEdge(new_edge1);
494
495 unsigned int this_iedge(this_edge_id1 < (_num_edges - 1) ? this_edge_id1 + 1 : 0);
496 while (!_edges[this_iedge]->equivalent(*_edges[this_edge_id0])) // common_nodes[1]'s edge
497 {
498 new_frag->addEdge(new EFAEdge(*_edges[this_iedge]));
499 this_iedge += 1;
500 if (this_iedge == _num_edges)
501 this_iedge = 0;
502 } // loop over this_face's edges
503
504 new_face = new EFAFace(new_frag);
505 delete new_frag;
506 if (new_face->numNodes() != new_n_nodes)
507 EFAError("combine_with() sanity check fails");
508 }
509 return new_face;
510}
511
512void
514{
515 // set up correct edge intersections based on the reference face
516 // the reference face must contain the edge of this face that is to be set up
517 // the reference face must be an element face
518 for (unsigned int j = 0; j < _num_edges; ++j)
519 {
520 if (_edges[j]->hasIntersection())
521 {
522 if (_edges[j]->numEmbeddedNodes() > 1)
523 EFAError("frag face edge can only have 1 emb node at this point");
524
525 EFANode * edge_node1 = _edges[j]->getNode(0);
526 EFANode * edge_node2 = _edges[j]->getNode(1);
527 EFANode * emb_node = _edges[j]->getEmbeddedNode(0);
528 double inters_x = _edges[j]->getIntersection(0, edge_node1);
529 if (std::abs(inters_x + 1.0) < 1.0e-4) // invalid intersection found
530 {
531 std::vector<double> node1_xi2d(2, 0.0);
532 std::vector<double> node2_xi2d(2, 0.0);
533 std::vector<double> emb_xi2d(2, 0.0);
534 if (ref_face->getFaceNodeParametricCoords(edge_node1, node1_xi2d) &&
535 ref_face->getFaceNodeParametricCoords(edge_node2, node2_xi2d) &&
536 ref_face->getFaceNodeParametricCoords(emb_node, emb_xi2d))
537 {
538 // TODO: this is not correct for unstructured elements. Need a fix
539 double dist2node1 =
540 std::sqrt((emb_xi2d[0] - node1_xi2d[0]) * (emb_xi2d[0] - node1_xi2d[0]) +
541 (emb_xi2d[1] - node1_xi2d[1]) * (emb_xi2d[1] - node1_xi2d[1]));
542 double full_dist =
543 std::sqrt((node2_xi2d[0] - node1_xi2d[0]) * (node2_xi2d[0] - node1_xi2d[0]) +
544 (node2_xi2d[1] - node1_xi2d[1]) * (node2_xi2d[1] - node1_xi2d[1]));
545 inters_x = dist2node1 / full_dist;
546 }
547 else
548 EFAError("reference face does not contain the edge with invalid inters");
549 _edges[j]->resetIntersection(inters_x, emb_node, edge_node1);
550 }
551 }
552 }
553}
554
555unsigned int
557{
558 unsigned int num_cuts = 0;
559 for (unsigned int i = 0; i < _edges.size(); ++i)
560 {
561 if (_edges[i]->hasIntersection())
562 num_cuts += _edges[i]->numEmbeddedNodes();
563 }
564 return num_cuts;
565}
566
567bool
569{
570 if (getNumCuts() > 1)
571 return true;
572 else
573 return false;
574}
575
576void
578{
579 for (unsigned int i = 0; i < _edges.size(); ++i)
580 if (from_face._edges[i]->hasIntersection())
581 _edges[i]->copyIntersection(*from_face._edges[i], 0);
582
583 if (from_face.numInteriorNodes() > 0)
585}
586
587bool
588EFAFace::isAdjacent(const EFAFace * other_face) const
589{
590 // two faces are adjacent if they only share one common edge
591 unsigned int counter = 0;
592 for (unsigned int i = 0; i < _num_edges; ++i)
593 if (other_face->ownsEdge(_edges[i]))
594 counter += 1;
595
596 if (counter == 1)
597 return true;
598 else
599 return false;
600}
601
602unsigned int
603EFAFace::adjacentCommonEdge(const EFAFace * other_face) const
604{
605 if (isAdjacent(other_face))
606 {
607 for (unsigned int i = 0; i < _num_edges; ++i)
608 if (other_face->ownsEdge(_edges[i]))
609 return i;
610 }
611 EFAError("this face is not adjacent with other_face");
612}
613
614bool
615EFAFace::hasSameOrientation(const EFAFace * other_face) const
616{
617 bool same_order = false;
618 if (equivalent(other_face))
619 {
620 for (unsigned int i = 0; i < other_face->numNodes(); ++i)
621 {
622 if (other_face->_nodes[i] == _nodes[0])
623 {
624 unsigned int iplus1(i < (other_face->_num_nodes - 1) ? i + 1 : 0);
625 if (other_face->_nodes[iplus1] == _nodes[1])
626 {
627 same_order = true;
628 break;
629 }
630 else if (other_face->_nodes[iplus1] != _nodes[_num_nodes - 1])
631 EFAError("two faces overlap but can't find correct common nodes");
632 }
633 }
634 }
635 else
636 EFAWarning("in hasSameOrientation two faces does not overlap");
637 return same_order;
638}
639
641EFAFace::getInteriorNode(unsigned int index) const
642{
643 return _interior_nodes[index];
644}
645
646void
648 double xi_1d,
649 std::vector<double> & xi_2d) const
650{
651 // given the 1D parent coord of a point in an 2D element edge, translate it to 2D para coords
652 xi_2d.resize(2, 0.0);
653 if (_num_edges == 4)
654 {
655 if (edge_id == 0)
656 {
657 xi_2d[0] = xi_1d;
658 xi_2d[1] = -1.0;
659 }
660 else if (edge_id == 1)
661 {
662 xi_2d[0] = 1.0;
663 xi_2d[1] = xi_1d;
664 }
665 else if (edge_id == 2)
666 {
667 xi_2d[0] = -xi_1d;
668 xi_2d[1] = 1.0;
669 }
670 else if (edge_id == 3)
671 {
672 xi_2d[0] = -1.0;
673 xi_2d[1] = -xi_1d;
674 }
675 else
676 EFAError("edge_id out of bounds");
677 }
678 else if (_num_edges == 3)
679 {
680 if (edge_id == 0)
681 {
682 xi_2d[0] = 0.5 * (1.0 - xi_1d);
683 xi_2d[1] = 0.5 * (1.0 + xi_1d);
684 }
685 else if (edge_id == 1)
686 {
687 xi_2d[0] = 0.0;
688 xi_2d[1] = 0.5 * (1.0 - xi_1d);
689 }
690 else if (edge_id == 2)
691 {
692 xi_2d[0] = 0.5 * (1.0 + xi_1d);
693 xi_2d[1] = 0.0;
694 }
695 else
696 EFAError("edge_id out of bounds");
697 }
698 else
699 EFAError("the EFAface::mapParametricCoordsFrom1DTo2D only works for quad and tri faces");
700}
bool containsNode(const EFANode *node) const
Definition EFAEdge.C:379
EFANode * getNode(unsigned int index) const
Definition EFAEdge.C:181
void addIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
Definition EFAEdge.C:132
std::vector< EFAFaceNode * > _interior_nodes
Definition EFAFace.h:33
void sortEdges()
Definition EFAFace.C:317
std::vector< EFANode * > _nodes
Definition EFAFace.h:30
void setInteriorFaceNode(unsigned int i, EFANode *node)
Definition EFAFace.C:81
std::vector< EFAEdge * > _edges
Definition EFAFace.h:32
bool hasSameOrientation(const EFAFace *other_face) const
Definition EFAFace.C:615
void resetEdgeIntersection(const EFAFace *ref_face)
Definition EFAFace.C:513
bool hasIntersection() const
Definition EFAFace.C:568
unsigned int getNumCuts() const
Definition EFAFace.C:556
void copyIntersection(const EFAFace &from_face)
Definition EFAFace.C:577
EFAFace * combineWithFace(const EFAFace *other_face) const
Definition EFAFace.C:449
void createNodes()
Definition EFAFace.C:242
unsigned int adjacentCommonEdge(const EFAFace *other_face) const
Definition EFAFace.C:603
bool containsFace(const EFAFace *other_face) const
Definition EFAFace.C:376
void mapParametricCoordsFrom1DTo2D(unsigned int edge_id, double xi_1d, std::vector< double > &xi_2d) const
Definition EFAFace.C:647
~EFAFace()
Definition EFAFace.C:60
void setEdge(unsigned int edge_id, EFAEdge *new_edge)
Definition EFAFace.C:254
EFAEdge * getEdge(unsigned int edge_id) const
Definition EFAFace.h:50
bool ownsEdge(const EFAEdge *other_edge) const
Definition EFAFace.C:391
bool getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
Definition EFAFace.C:132
bool containsNode(const EFANode *node) const
Definition EFAFace.C:362
void reverseEdges()
Definition EFAFace.C:337
bool equivalent(const EFAFace *other_face) const
Definition EFAFace.C:355
std::vector< EFAFace * > split() const
Definition EFAFace.C:424
EFAFace(unsigned int n_nodes, unsigned int num_interior_face_nodes=0)
Definition EFAFace.C:19
bool isTriOrQuad() const
Definition EFAFace.C:346
unsigned int _num_nodes
Definition EFAFace.h:29
unsigned int numNodes() const
Definition EFAFace.C:87
void combineTwoEdges(unsigned int edge_id1, unsigned int edge_id2)
Definition EFAFace.C:276
EFAFaceNode * getInteriorNode(unsigned int index) const
Definition EFAFace.C:641
void setNode(unsigned int node_id, EFANode *node)
Definition EFAFace.C:93
bool isAdjacent(const EFAFace *other_face) const
Definition EFAFace.C:588
std::vector< EFANode * > _face_interior_nodes
Definition EFAFace.h:34
void switchNode(EFANode *new_node, EFANode *old_node)
Definition EFAFace.C:105
bool getFaceNodeParametricCoords(EFANode *node, std::vector< double > &xi_2d) const
Definition EFAFace.C:210
unsigned int numInteriorNodes() const
Definition EFAFace.C:236
EFANode * getNode(unsigned int node_id) const
Definition EFAFace.C:99
unsigned int _num_edges
Definition EFAFace.h:31
bool getEdgeNodeParametricCoords(EFANode *node, std::vector< double > &xi_2d) const
Definition EFAFace.C:183
void createEdges()
Definition EFAFace.C:260
void removeEmbeddedNode(EFANode *emb_node)
Definition EFAFace.C:400
EFAEdge * getEdge(unsigned int edge_id) const
void addEdge(EFAEdge *new_edge)
unsigned int numEdges() const
std::vector< EFAFragment2D * > split()
double linearTriShape2D(unsigned int node_id, std::vector< double > &xi_2d)
Definition EFAFuncs.C:23
double linearQuadShape2D(unsigned int node_id, std::vector< double > &xi_2d)
Definition EFAFuncs.C:16
const dof_id_type n_nodes