www.mooseframework.org
EFAFace.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
19 EFAFace::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 
28 EFAFace::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 
80 void
81 EFAFace::setInteriorFaceNode(unsigned int i, EFANode * node)
82 {
83  _face_interior_nodes[i] = node;
84 }
85 
86 unsigned int
88 {
89  return _nodes.size();
90 }
91 
92 void
93 EFAFace::setNode(unsigned int node_id, EFANode * node)
94 {
95  _nodes[node_id] = node;
96 }
97 
98 EFANode *
99 EFAFace::getNode(unsigned int node_id) const
100 {
101  return _nodes[node_id];
102 }
103 
104 void
105 EFAFace::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 
131 bool
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 
182 bool
183 EFAFace::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 
209 bool
210 EFAFace::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 
235 unsigned int
237 {
238  return _interior_nodes.size();
239 }
240 
241 void
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 
253 void
254 EFAFace::setEdge(unsigned int edge_id, EFAEdge * new_edge)
255 {
256  _edges[edge_id] = new_edge;
257 }
258 
259 void
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 
275 void
276 EFAFace::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 
316 void
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 
336 void
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 
345 bool
347 {
348  if (_num_edges == 3 || _num_edges == 4)
349  return true;
350  else
351  return false;
352 }
353 
354 bool
355 EFAFace::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 
361 bool
362 EFAFace::containsNode(const EFANode * node) const
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 
375 bool
376 EFAFace::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 
390 bool
391 EFAFace::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 
399 void
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 
423 std::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 
448 EFAFace *
449 EFAFace::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 
512 void
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 
555 unsigned 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 
567 bool
569 {
570  if (getNumCuts() > 1)
571  return true;
572  else
573  return false;
574 }
575 
576 void
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)
584  _interior_nodes = from_face._interior_nodes;
585 }
586 
587 bool
588 EFAFace::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 
602 unsigned int
603 EFAFace::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 
614 bool
615 EFAFace::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 
640 EFAFaceNode *
641 EFAFace::getInteriorNode(unsigned int index) const
642 {
643  return _interior_nodes[index];
644 }
645 
646 void
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 }
void copyIntersection(const EFAFace &from_face)
Definition: EFAFace.C:577
bool isAdjacent(const EFAFace *other_face) const
Definition: EFAFace.C:588
bool getMasterInfo(EFANode *node, std::vector< EFANode *> &master_nodes, std::vector< double > &master_weights) const
Definition: EFAFace.C:132
void setEdge(unsigned int edge_id, EFAEdge *new_edge)
Definition: EFAFace.C:254
bool hasIntersection() const
Definition: EFAFace.C:568
EFAFace * combineWithFace(const EFAFace *other_face) const
Definition: EFAFace.C:449
bool containsNode(const EFANode *node) const
Definition: EFAFace.C:362
void resetEdgeIntersection(const EFAFace *ref_face)
Definition: EFAFace.C:513
void setInteriorFaceNode(unsigned int i, EFANode *node)
Definition: EFAFace.C:81
void createEdges()
Definition: EFAFace.C:260
unsigned int numEdges() const
void addEdge(EFAEdge *new_edge)
bool hasSameOrientation(const EFAFace *other_face) const
Definition: EFAFace.C:615
void mapParametricCoordsFrom1DTo2D(unsigned int edge_id, double xi_1d, std::vector< double > &xi_2d) const
Definition: EFAFace.C:647
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
std::vector< EFAFragment2D * > split()
bool isTriOrQuad() const
Definition: EFAFace.C:346
void combineTwoEdges(unsigned int edge_id1, unsigned int edge_id2)
Definition: EFAFace.C:276
bool equivalent(const EFAFace *other_face) const
Definition: EFAFace.C:355
~EFAFace()
Definition: EFAFace.C:60
std::vector< EFAEdge * > _edges
Definition: EFAFace.h:32
EFANode * getNode(unsigned int node_id) const
Definition: EFAFace.C:99
unsigned int getNumCuts() const
Definition: EFAFace.C:556
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
bool getFaceNodeParametricCoords(EFANode *node, std::vector< double > &xi_2d) const
Definition: EFAFace.C:210
bool getEdgeNodeParametricCoords(EFANode *node, std::vector< double > &xi_2d) const
Definition: EFAFace.C:183
const dof_id_type n_nodes
bool containsFace(const EFAFace *other_face) const
Definition: EFAFace.C:376
unsigned int numNodes() const
Definition: EFAFace.C:87
dof_id_type weight(const MeshBase &mesh, const processor_id_type pid)
void sortEdges()
Definition: EFAFace.C:317
EFAEdge * getEdge(unsigned int edge_id) const
Definition: EFAFace.h:50
std::vector< EFAFace * > split() const
Definition: EFAFace.C:424
bool ownsEdge(const EFAEdge *other_edge) const
Definition: EFAFace.C:391
double linearQuadShape2D(unsigned int node_id, std::vector< double > &xi_2d)
Definition: EFAFuncs.C:16
std::vector< EFANode * > _face_interior_nodes
Definition: EFAFace.h:34
unsigned int _num_edges
Definition: EFAFace.h:31
EFAFaceNode * getInteriorNode(unsigned int index) const
Definition: EFAFace.C:641
bool containsNode(const EFANode *node) const
Definition: EFAEdge.C:379
std::vector< EFAFaceNode * > _interior_nodes
Definition: EFAFace.h:33
void switchNode(EFANode *new_node, EFANode *old_node)
Definition: EFAFace.C:105
void reverseEdges()
Definition: EFAFace.C:337
void removeEmbeddedNode(EFANode *emb_node)
Definition: EFAFace.C:400
unsigned int numInteriorNodes() const
Definition: EFAFace.C:236
std::vector< EFANode * > _nodes
Definition: EFAFace.h:30
void createNodes()
Definition: EFAFace.C:242
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
double linearTriShape2D(unsigned int node_id, std::vector< double > &xi_2d)
Definition: EFAFuncs.C:23
void addIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
Definition: EFAEdge.C:132
EFAEdge * getEdge(unsigned int edge_id) const
unsigned int adjacentCommonEdge(const EFAFace *other_face) const
Definition: EFAFace.C:603
void setNode(unsigned int node_id, EFANode *node)
Definition: EFAFace.C:93
EFAFace(unsigned int n_nodes, unsigned int num_interior_face_nodes=0)
Definition: EFAFace.C:19
EFANode * getNode(unsigned int index) const
Definition: EFAEdge.C:181
static const std::string k
Definition: NS.h:124
unsigned int _num_nodes
Definition: EFAFace.h:29