www.mooseframework.org
ElementFragmentAlgorithm.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 // TODO:
11 // Clean up error checking in (!found_edge)
12 // Save fragment for uncut element ahead of crack tip to avoid renumbering if only embedded node
13 // Add common code to compare neighbors & fragments (replace multiple set_intersection calls)
14 
15 // Handle cases other than 0 or 2 cut edges/elem (include data structure to link cut edges with
16 // cracks?)
17 // Allow for more than one cut on an edge
18 // Support 2d higher order elements
19 // 3D propagation
20 // 3D branching
21 
23 
24 #include "EFANode.h"
25 #include "EFAElement3D.h"
26 #include "EFAElement2D.h"
27 #include "EFAFuncs.h"
28 #include "EFAError.h"
29 
30 ElementFragmentAlgorithm::ElementFragmentAlgorithm(std::ostream & os) : _ostream(os) {}
31 
33 {
34  std::map<unsigned int, EFANode *>::iterator mit;
35  for (mit = _permanent_nodes.begin(); mit != _permanent_nodes.end(); ++mit)
36  {
37  delete mit->second;
38  mit->second = NULL;
39  }
40  for (mit = _embedded_nodes.begin(); mit != _embedded_nodes.end(); ++mit)
41  {
42  delete mit->second;
43  mit->second = NULL;
44  }
45  for (mit = _embedded_permanent_nodes.begin(); mit != _embedded_permanent_nodes.end(); ++mit)
46  {
47  delete mit->second;
48  mit->second = NULL;
49  }
50  for (mit = _temp_nodes.begin(); mit != _temp_nodes.end(); ++mit)
51  {
52  delete mit->second;
53  mit->second = NULL;
54  }
55  std::map<unsigned int, EFAElement *>::iterator eit;
56  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
57  {
58  delete eit->second;
59  eit->second = NULL;
60  }
61 }
62 
63 unsigned int
64 ElementFragmentAlgorithm::add2DElements(std::vector<std::vector<unsigned int>> & quads)
65 {
66  unsigned int first_id = 0;
67  unsigned int num_nodes = quads[0].size();
68 
69  if (quads.size() == 0)
70  EFAError("add2DElements called with empty vector of quads");
71 
72  for (unsigned int i = 0; i < quads.size(); ++i)
73  {
74  unsigned int new_elem_id = Efa::getNewID(_elements);
75  EFAElement2D * newElem = new EFAElement2D(new_elem_id, num_nodes);
76  _elements.insert(std::make_pair(new_elem_id, newElem));
77 
78  if (i == 0)
79  first_id = new_elem_id;
80 
81  for (unsigned int j = 0; j < num_nodes; ++j)
82  {
83  EFANode * currNode = NULL;
84  std::map<unsigned int, EFANode *>::iterator mit = _permanent_nodes.find(quads[i][j]);
85  if (mit == _permanent_nodes.end())
86  {
87  currNode = new EFANode(quads[i][j], EFANode::N_CATEGORY_PERMANENT);
88  _permanent_nodes.insert(std::make_pair(quads[i][j], currNode));
89  }
90  else
91  currNode = mit->second;
92 
93  newElem->setNode(j, currNode);
94  _inverse_connectivity[currNode].insert(newElem);
95  }
96  newElem->createEdges();
97  }
98  return first_id;
99 }
100 
101 EFAElement *
102 ElementFragmentAlgorithm::add2DElement(std::vector<unsigned int> quad, unsigned int id)
103 {
104  unsigned int num_nodes = quad.size();
105 
106  std::map<unsigned int, EFAElement *>::iterator mit = _elements.find(id);
107  if (mit != _elements.end())
108  EFAError("In add2DElement element with id: ", id, " already exists");
109 
110  EFAElement2D * newElem = new EFAElement2D(id, num_nodes);
111  _elements.insert(std::make_pair(id, newElem));
112 
113  for (unsigned int j = 0; j < num_nodes; ++j)
114  {
115  EFANode * currNode = NULL;
116  std::map<unsigned int, EFANode *>::iterator mit = _permanent_nodes.find(quad[j]);
117  if (mit == _permanent_nodes.end())
118  {
119  currNode = new EFANode(quad[j], EFANode::N_CATEGORY_PERMANENT);
120  _permanent_nodes.insert(std::make_pair(quad[j], currNode));
121  }
122  else
123  currNode = mit->second;
124 
125  newElem->setNode(j, currNode);
126  _inverse_connectivity[currNode].insert(newElem);
127  }
128  newElem->createEdges();
129  return newElem;
130 }
131 
132 EFAElement *
133 ElementFragmentAlgorithm::add3DElement(std::vector<unsigned int> quad, unsigned int id)
134 {
135  unsigned int num_nodes = quad.size();
136  unsigned int num_faces = 0;
137  if (num_nodes == 27)
138  num_faces = 6;
139  else if (num_nodes == 20)
140  num_faces = 6;
141  else if (num_nodes == 8)
142  num_faces = 6;
143  else if (num_nodes == 4)
144  num_faces = 4;
145  else if (num_nodes == 10)
146  num_faces = 4;
147  else
148  EFAError("In add3DElement element with id: ", id, " has invalid num_nodes");
149 
150  std::map<unsigned int, EFAElement *>::iterator mit = _elements.find(id);
151  if (mit != _elements.end())
152  EFAError("In add3DElement element with id: ", id, " already exists");
153 
154  EFAElement3D * newElem = new EFAElement3D(id, num_nodes, num_faces);
155  _elements.insert(std::make_pair(id, newElem));
156 
157  for (unsigned int j = 0; j < num_nodes; ++j)
158  {
159  EFANode * currNode = NULL;
160  std::map<unsigned int, EFANode *>::iterator mit = _permanent_nodes.find(quad[j]);
161  if (mit == _permanent_nodes.end())
162  {
163  currNode = new EFANode(quad[j], EFANode::N_CATEGORY_PERMANENT);
164  _permanent_nodes.insert(std::make_pair(quad[j], currNode));
165  }
166  else
167  currNode = mit->second;
168 
169  newElem->setNode(j, currNode);
170  _inverse_connectivity[currNode].insert(newElem);
171  }
172  newElem->createFaces();
173  return newElem;
174 }
175 
176 void
178 {
179  std::map<unsigned int, EFAElement *>::iterator eit;
180  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
181  {
182  EFAElement * elem = eit->second;
183  elem->clearNeighbors();
184  }
185 
186  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
187  {
188  EFAElement * curr_elem = eit->second;
190  } // loop over all elements
191 
192  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
193  {
194  EFAElement * curr_elem = eit->second;
195  curr_elem->neighborSanityCheck();
196  }
197 }
198 
199 void
201 {
202  _crack_tip_elements.clear(); // re-build CrackTipElements!
203  std::map<unsigned int, EFAElement *>::iterator eit;
204  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
205  {
206  EFAElement * curr_elem = eit->second;
207  curr_elem->initCrackTip(_crack_tip_elements); // CrackTipElements changed here
208  }
209 }
210 
211 void
213  unsigned int edgeid,
214  double position)
215 {
216  // this method is called when we are marking cut edges
217  std::map<unsigned int, EFAElement *>::iterator eit = _elements.find(elemid);
218  if (eit == _elements.end())
219  EFAError("Could not find element with id: ", elemid, " in addEdgeIntersection");
220 
221  EFAElement2D * curr_elem = dynamic_cast<EFAElement2D *>(eit->second);
222  if (!curr_elem)
223  EFAError("addElemEdgeIntersection: elem ", elemid, " is not of type EFAelement2D");
224  curr_elem->addEdgeCut(edgeid, position, NULL, _embedded_nodes, true);
225 }
226 
227 void
228 ElementFragmentAlgorithm::addElemNodeIntersection(unsigned int elemid, unsigned int nodeid)
229 {
230  // this method is called when we are marking cut nodes
231  std::map<unsigned int, EFAElement *>::iterator eit = _elements.find(elemid);
232  if (eit == _elements.end())
233  EFAError("Could not find element with id: ", elemid, " in addElemNodeIntersection");
234 
235  EFAElement2D * curr_elem = dynamic_cast<EFAElement2D *>(eit->second);
236  if (!curr_elem)
237  EFAError("addElemNodeIntersection: elem ", elemid, " is not of type EFAelement2D");
238 
239  // Only add cut node when the curr_elem does not have any fragment
240  if (curr_elem->numFragments() == 0)
241  curr_elem->addNodeCut(nodeid, NULL, _permanent_nodes, _embedded_permanent_nodes);
242 }
243 
244 bool
246  unsigned int frag_edge_id,
247  double position)
248 {
249  // N.B. this method must be called after addEdgeIntersection
250  std::map<unsigned int, EFAElement *>::iterator eit = _elements.find(elemid);
251  if (eit == _elements.end())
252  EFAError("Could not find element with id: ", elemid, " in addFragEdgeIntersection");
253 
254  EFAElement2D * elem = dynamic_cast<EFAElement2D *>(eit->second);
255  if (!elem)
256  EFAError("addFragEdgeIntersection: elem ", elemid, " is not of type EFAelement2D");
257  return elem->addFragmentEdgeCut(frag_edge_id, position, _embedded_nodes);
258 }
259 
260 void
262  unsigned int faceid,
263  std::vector<unsigned int> edgeid,
264  std::vector<double> position)
265 {
266  // this method is called when we are marking cut edges
267  std::map<unsigned int, EFAElement *>::iterator eit = _elements.find(elemid);
268  if (eit == _elements.end())
269  EFAError("Could not find element with id: ", elemid, " in addEdgeIntersection");
270 
271  EFAElement3D * curr_elem = dynamic_cast<EFAElement3D *>(eit->second);
272  if (!curr_elem)
273  EFAError("addElemEdgeIntersection: elem ", elemid, " is not of type EFAelement2D");
274 
275  // add cuts to two face edges at the same time
276  curr_elem->addFaceEdgeCut(faceid, edgeid[0], position[0], NULL, _embedded_nodes, true, true);
277  curr_elem->addFaceEdgeCut(faceid, edgeid[1], position[1], NULL, _embedded_nodes, true, true);
278 }
279 
280 void
282  unsigned int /*FragFaceID*/,
283  std::vector<unsigned int> /*FragFaceEdgeID*/,
284  std::vector<double> /*position*/)
285 {
286  // TODO: need to finish this for 3D problems
287 }
288 
289 void
291 {
292  // loop over the elements in the mesh
293  std::map<unsigned int, EFAElement *>::iterator eit;
294  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
295  {
296  EFAElement * curr_elem = eit->second;
298  } // loop over all elements
299 }
300 
301 void
302 ElementFragmentAlgorithm::updateTopology(bool mergeUncutVirtualEdges)
303 {
304  // If mergeUncutVirtualEdges=true, this algorithm replicates the
305  // behavior of classical XFEM. If false, it gives the behavior of
306  // the Richardson et. al. (2011) paper
307 
308  _new_nodes.clear();
309  _child_elements.clear();
310  _parent_elements.clear();
311  // _merged_edge_map.clear();
312 
313  unsigned int first_new_node_id = Efa::getNewID(_permanent_nodes);
314 
316  connectFragments(mergeUncutVirtualEdges);
317  sanityCheck();
319 
320  std::map<unsigned int, EFANode *>::iterator mit;
321  for (mit = _permanent_nodes.begin(); mit != _permanent_nodes.end(); ++mit)
322  {
323  if (mit->first >= first_new_node_id)
324  _new_nodes.push_back(mit->second);
325  }
326  clearPotentialIsolatedNodes(); // _new_nodes and _permanent_nodes may change here
327 }
328 
329 void
331 {
332  _new_nodes.clear();
333  _child_elements.clear();
334  _parent_elements.clear();
335  // _merged_edge_map.clear();
336  _crack_tip_elements.clear();
337  _inverse_connectivity.clear();
338 
339  std::map<unsigned int, EFANode *>::iterator mit;
340  for (mit = _permanent_nodes.begin(); mit != _permanent_nodes.end(); ++mit)
341  {
342  delete mit->second;
343  mit->second = NULL;
344  }
345  _permanent_nodes.clear();
346  // for (mit = EmbeddedNodes.begin(); mit != EmbeddedNodes.end(); ++mit )
347  // {
348  // delete mit->second;
349  // mit->second = NULL;
350  // }
351  for (mit = _temp_nodes.begin(); mit != _temp_nodes.end(); ++mit)
352  {
353  delete mit->second;
354  mit->second = NULL;
355  }
356  _temp_nodes.clear();
357  std::map<unsigned int, EFAElement *>::iterator eit;
358  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
359  {
360  delete eit->second;
361  eit->second = NULL;
362  }
363  _elements.clear();
364 }
365 
366 void
368 {
369  _inverse_connectivity.clear();
370  for (unsigned int i = 0; i < _parent_elements.size(); ++i)
371  {
373  EFAError("Attempted to delete parent element: ",
374  _parent_elements[i]->id(),
375  " from _elements, but couldn't find it");
376  }
377  _parent_elements.clear();
378 
379  std::map<unsigned int, EFAElement *>::iterator eit;
380  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
381  {
382  EFAElement * curr_elem = eit->second;
383  curr_elem->clearParentAndChildren();
384  for (unsigned int j = 0; j < curr_elem->numNodes(); j++)
385  {
386  EFANode * curr_node = curr_elem->getNode(j);
387  _inverse_connectivity[curr_node].insert(curr_elem);
388  }
389  }
390 
391  std::map<unsigned int, EFANode *>::iterator mit;
392  for (mit = _permanent_nodes.begin(); mit != _permanent_nodes.end(); ++mit)
393  mit->second->removeParent();
394 
395  for (mit = _temp_nodes.begin(); mit != _temp_nodes.end(); ++mit)
396  {
397  delete mit->second;
398  mit->second = NULL;
399  }
400  _temp_nodes.clear();
401 
402  _new_nodes.clear();
403  _child_elements.clear();
404 
405  // TODO: Sanity check to make sure that there are no nodes that are not connected
406  // to an element -- there shouldn't be any
407 }
408 
409 void
411  const EFAElement * const from_elem)
412 {
413  elem->restoreFragment(from_elem);
414 }
415 
416 void
418 {
419  // temporary container for new elements -- will be merged with Elements
420  std::map<unsigned int, EFAElement *> newChildElements;
421 
422  // loop over the original elements in the mesh
423  std::map<unsigned int, EFAElement *>::iterator eit;
424  std::map<unsigned int, EFAElement *>::iterator ElementsEnd = _elements.end();
425  for (eit = _elements.begin(); eit != ElementsEnd; ++eit)
426  {
427  EFAElement * curr_elem = eit->second;
428  curr_elem->createChild(_crack_tip_elements,
429  _elements,
430  newChildElements,
433  _temp_nodes);
434  } // loop over elements
435  // Merge newChildElements back in with Elements
436  _elements.insert(newChildElements.begin(), newChildElements.end());
437 }
438 
439 void
440 ElementFragmentAlgorithm::connectFragments(bool mergeUncutVirtualEdges)
441 {
442  // now perform the comparison on the children
443  for (unsigned int elem_iter = 0; elem_iter < _child_elements.size(); elem_iter++)
444  {
445  EFAElement * childElem = _child_elements[elem_iter];
446  childElem->connectNeighbors(
447  _permanent_nodes, _temp_nodes, _inverse_connectivity, mergeUncutVirtualEdges);
448  childElem->updateFragmentNode();
449  } // loop over child elements
450 
451  std::vector<EFAElement *>::iterator vit;
452  for (vit = _child_elements.begin(); vit != _child_elements.end();)
453  {
454  if (*vit == NULL)
455  vit = _child_elements.erase(vit);
456  else
457  ++vit;
458  }
459 }
460 
461 void
463 {
464  // Make sure there are no remaining TempNodes
465  if (_temp_nodes.size() > 0)
466  {
467  _ostream << "_temp_nodes size > 0. size=" << _temp_nodes.size() << std::endl;
468  printMesh();
469  exit(1);
470  }
471 }
472 
473 void
475 {
476  std::set<EFAElement *>::iterator sit;
477  // Delete all elements that were previously flagged as crack tip elements if they have
478  // been split (and hence appear in ParentElements).
479  for (unsigned int i = 0; i < _parent_elements.size(); ++i)
480  {
481  sit = _crack_tip_elements.find(_parent_elements[i]);
482  if (sit != _crack_tip_elements.end())
483  _crack_tip_elements.erase(sit);
484  }
485 
486  // Go through new child elements to find elements that are newly at the crack tip due to
487  // crack growth.
488  for (unsigned int elem_iter = 0; elem_iter < _child_elements.size(); elem_iter++)
489  {
490  EFAElement * childElem = _child_elements[elem_iter];
491  if (childElem->isCrackTipElement())
492  _crack_tip_elements.insert(childElem);
493  } // loop over (new) child elements
494 
495  //_ostream << "Crack tip elements: ";
496  // for (sit=CrackTipElements.begin(); sit!=CrackTipElements.end(); ++sit)
497  //{
498  // _ostream << (*sit)->id<<" ";
499  //}
500  //_ostream << std::endl;
501 }
502 
503 void
505 {
506  _ostream << "============================================================"
507  << "==================================================" << std::endl;
508  _ostream << " CutElemMesh Data" << std::endl;
509  _ostream << "============================================================"
510  << "==================================================" << std::endl;
511  _ostream << "Permanent Nodes:" << std::endl;
512  std::map<unsigned int, EFANode *>::iterator mit;
513  unsigned int counter = 0;
514  for (mit = _permanent_nodes.begin(); mit != _permanent_nodes.end(); ++mit)
515  {
516  _ostream << " " << mit->second->id();
517  counter += 1;
518  if (counter % 10 == 0)
519  _ostream << std::endl;
520  }
521  _ostream << std::endl;
522  _ostream << "Temp Nodes:" << std::endl;
523  counter = 0;
524  for (mit = _temp_nodes.begin(); mit != _temp_nodes.end(); ++mit)
525  {
526  _ostream << " " << mit->second->id();
527  counter += 1;
528  if (counter % 10 == 0)
529  _ostream << std::endl;
530  }
531  _ostream << std::endl;
532  _ostream << "Embedded Nodes:" << std::endl;
533  counter = 0;
534  for (mit = _embedded_nodes.begin(); mit != _embedded_nodes.end(); ++mit)
535  {
536  _ostream << " " << mit->second->id();
537  counter += 1;
538  if (counter % 10 == 0)
539  _ostream << std::endl;
540  }
541  _ostream << std::endl;
542  _ostream << "Embedded Permanent Nodes:" << std::endl;
543  counter = 0;
544  for (mit = _embedded_permanent_nodes.begin(); mit != _embedded_permanent_nodes.end(); ++mit)
545  {
546  _ostream << " " << mit->second->id();
547  counter += 1;
548  if (counter % 10 == 0)
549  _ostream << std::endl;
550  }
551  _ostream << std::endl;
552  _ostream << "Parent Elements:" << std::endl;
553  counter = 0;
554  for (unsigned int i = 0; i < _parent_elements.size(); ++i)
555  {
556  _ostream << " " << _parent_elements[i]->id();
557  counter += 1;
558  if (counter % 10 == 0)
559  _ostream << std::endl;
560  }
561  _ostream << std::endl;
562  _ostream << "Child Elements:" << std::endl;
563  counter = 0;
564  for (unsigned int i = 0; i < _child_elements.size(); ++i)
565  {
566  _ostream << " " << _child_elements[i]->id();
567  counter += 1;
568  if (counter % 10 == 0)
569  _ostream << std::endl;
570  }
571  _ostream << std::endl;
572  _ostream << "Elements:" << std::endl;
573  _ostream << " id "
574  << "| nodes "
575  << "| embedded nodes "
576  << "| edge neighbors "
577  << "| frag "
578  << "| frag link ... " << std::endl;
579  _ostream << "------------------------------------------------------------"
580  << "--------------------------------------------------" << std::endl;
581  std::map<unsigned int, EFAElement *>::iterator eit;
582  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
583  {
584  EFAElement * currElem = eit->second;
585  currElem->printElement(_ostream);
586  }
587 }
588 
589 EFAElement *
591 {
592  std::map<unsigned int, EFAElement *>::iterator mit = _elements.find(id);
593  if (mit == _elements.end())
594  EFAError("in getElemByID() could not find element: ", id);
595  return mit->second;
596 }
597 
598 unsigned int
600 {
601  unsigned int elem_id = 99999;
602  std::map<unsigned int, EFAElement *>::iterator eit;
603  for (eit = _elements.begin(); eit != _elements.end(); ++eit)
604  {
605  EFAElement * curr_elem = eit->second;
606  unsigned int counter = 0;
607  for (unsigned int i = 0; i < curr_elem->numNodes(); ++i)
608  {
609  if (curr_elem->getNode(i)->id() == node_id[i])
610  counter += 1;
611  }
612  if (counter == curr_elem->numNodes())
613  {
614  elem_id = curr_elem->id();
615  break;
616  }
617  }
618  return elem_id;
619 }
620 
621 void
623 {
624  // Collect all parent nodes that will be isolated
625  std::map<EFANode *, std::vector<EFANode *>> isolate_parent_to_child;
626  for (unsigned int i = 0; i < _new_nodes.size(); ++i)
627  {
628  EFANode * parent_node = _new_nodes[i]->parent();
629  if (!parent_node)
630  EFAError("a new permanent node must have a parent node!");
631  bool isParentNodeInNewElem = false;
632  for (unsigned int j = 0; j < _child_elements.size(); ++j)
633  {
634  if (_child_elements[j]->containsNode(parent_node))
635  {
636  isParentNodeInNewElem = true;
637  break;
638  }
639  }
640  if (!isParentNodeInNewElem)
641  isolate_parent_to_child[parent_node].push_back(_new_nodes[i]);
642  }
643 
644  // For each isolated parent node, pick one of its child new node
645  // Then, switch that child with its parent for all new elems
646  std::map<EFANode *, std::vector<EFANode *>>::iterator mit;
647  for (mit = isolate_parent_to_child.begin(); mit != isolate_parent_to_child.end(); ++mit)
648  {
649  EFANode * parent_node = mit->first;
650  EFANode * child_node = (mit->second)[0]; // need to discard it and swap it back to its parent
651  for (unsigned int i = 0; i < _child_elements.size(); ++i)
652  {
653  if (_child_elements[i]->containsNode(child_node))
654  _child_elements[i]->switchNode(parent_node, child_node, true);
655  }
656  _new_nodes.erase(std::remove(_new_nodes.begin(), _new_nodes.end(), child_node),
657  _new_nodes.end());
659  }
660 }
ElementFragmentAlgorithm::connectFragments
void connectFragments(bool mergeUncutVirtualEdges)
Definition: ElementFragmentAlgorithm.C:440
ElementFragmentAlgorithm::updatePhysicalLinksAndFragments
void updatePhysicalLinksAndFragments()
Definition: ElementFragmentAlgorithm.C:290
ElementFragmentAlgorithm::add2DElements
unsigned int add2DElements(std::vector< std::vector< unsigned int >> &quads)
Definition: ElementFragmentAlgorithm.C:64
EFAElement::getNode
EFANode * getNode(unsigned int node_id) const
Definition: EFAElement.C:46
EFAElement2D::addFragmentEdgeCut
bool addFragmentEdgeCut(unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes)
Definition: EFAElement2D.C:1837
ElementFragmentAlgorithm::initCrackTipTopology
void initCrackTipTopology()
Definition: ElementFragmentAlgorithm.C:200
EFANode::id
unsigned int id() const
Definition: EFANode.C:36
EFAElement
Definition: EFAElement.h:19
EFANode.h
ElementFragmentAlgorithm::clearPotentialIsolatedNodes
void clearPotentialIsolatedNodes()
Definition: ElementFragmentAlgorithm.C:622
EFAFuncs.h
EFAElement::initCrackTip
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)=0
EFAElement::connectNeighbors
virtual void connectNeighbors(std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &TempNodes, std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap, bool merge_phantom_edges)=0
EFAElement2D::createEdges
void createEdges()
Definition: EFAElement2D.C:1459
EFAElement::restoreFragment
virtual void restoreFragment(const EFAElement *const from_elem)=0
ElementFragmentAlgorithm::add3DElement
EFAElement * add3DElement(std::vector< unsigned int > quad, unsigned int id)
Definition: ElementFragmentAlgorithm.C:133
ElementFragmentAlgorithm::_child_elements
std::vector< EFAElement * > _child_elements
Definition: ElementFragmentAlgorithm.h:41
EFAElement::clearNeighbors
virtual void clearNeighbors()=0
EFAElement::printElement
virtual void printElement(std::ostream &ostream)=0
counter
static unsigned int counter
Definition: ContactPenetrationAuxAction.C:17
EFAElement::numNodes
unsigned int numNodes() const
Definition: EFAElement.C:34
ElementFragmentAlgorithm::addFragFaceIntersection
void addFragFaceIntersection(unsigned int ElemID, unsigned int FragFaceID, std::vector< unsigned int > FragFaceEdgeID, std::vector< double > position)
Definition: ElementFragmentAlgorithm.C:281
ElementFragmentAlgorithm.h
ElementFragmentAlgorithm::updateTopology
void updateTopology(bool mergeUncutVirtualEdges=true)
Definition: ElementFragmentAlgorithm.C:302
ElementFragmentAlgorithm::sanityCheck
void sanityCheck()
Definition: ElementFragmentAlgorithm.C:462
EFAElement::setNode
void setNode(unsigned int node_id, EFANode *node)
Definition: EFAElement.C:40
ElementFragmentAlgorithm::clearAncestry
void clearAncestry()
Definition: ElementFragmentAlgorithm.C:367
ElementFragmentAlgorithm::addElemFaceIntersection
void addElemFaceIntersection(unsigned int elemid, unsigned int faceid, std::vector< unsigned int > edgeid, std::vector< double > position)
Definition: ElementFragmentAlgorithm.C:261
EFAElement3D
Definition: EFAElement3D.h:20
ElementFragmentAlgorithm::_elements
std::map< unsigned int, EFAElement * > _elements
Definition: ElementFragmentAlgorithm.h:36
ElementFragmentAlgorithm::_temp_nodes
std::map< unsigned int, EFANode * > _temp_nodes
Definition: ElementFragmentAlgorithm.h:34
ElementFragmentAlgorithm::printMesh
void printMesh()
Definition: ElementFragmentAlgorithm.C:504
EFAElement::clearParentAndChildren
void clearParentAndChildren()
Definition: EFAElement.C:209
ElementFragmentAlgorithm::addFragEdgeIntersection
bool addFragEdgeIntersection(unsigned int elemid, unsigned int frag_edge_id, double position)
Definition: ElementFragmentAlgorithm.C:245
EFAElement::updateFragments
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)=0
ElementFragmentAlgorithm::_permanent_nodes
std::map< unsigned int, EFANode * > _permanent_nodes
Definition: ElementFragmentAlgorithm.h:32
EFAElement2D::addEdgeCut
void addEdgeCut(unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor)
Definition: EFAElement2D.C:1710
EFAElement3D.h
EFAElement3D::addFaceEdgeCut
void addFaceEdgeCut(unsigned int face_id, unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor, bool add_to_adjacent)
Definition: EFAElement3D.C:1994
EFAElement::id
unsigned int id() const
Definition: EFAElement.C:28
ElementFragmentAlgorithm::updateEdgeNeighbors
void updateEdgeNeighbors()
Definition: ElementFragmentAlgorithm.C:177
ElementFragmentAlgorithm::createChildElements
void createChildElements()
Definition: ElementFragmentAlgorithm.C:417
EFAError.h
ElementFragmentAlgorithm::_inverse_connectivity
std::map< EFANode *, std::set< EFAElement * > > _inverse_connectivity
Definition: ElementFragmentAlgorithm.h:43
ElementFragmentAlgorithm::reset
void reset()
Definition: ElementFragmentAlgorithm.C:330
ElementFragmentAlgorithm::add2DElement
EFAElement * add2DElement(std::vector< unsigned int > quad, unsigned int id)
Definition: ElementFragmentAlgorithm.C:102
EFAElement::setupNeighbors
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap)=0
EFANode::N_CATEGORY_PERMANENT
Definition: EFANode.h:19
ElementFragmentAlgorithm::~ElementFragmentAlgorithm
~ElementFragmentAlgorithm()
Definition: ElementFragmentAlgorithm.C:32
ElementFragmentAlgorithm::_embedded_nodes
std::map< unsigned int, EFANode * > _embedded_nodes
Definition: ElementFragmentAlgorithm.h:33
EFAElement3D::createFaces
void createFaces()
Definition: EFAElement3D.C:1454
ElementFragmentAlgorithm::_embedded_permanent_nodes
std::map< unsigned int, EFANode * > _embedded_permanent_nodes
Definition: ElementFragmentAlgorithm.h:35
EFAElement::isCrackTipElement
virtual bool isCrackTipElement() const =0
EFAElement::createChild
virtual void createChild(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFAElement * > &Elements, std::map< unsigned int, EFAElement * > &newChildElements, std::vector< EFAElement * > &ChildElements, std::vector< EFAElement * > &ParentElements, std::map< unsigned int, EFANode * > &TempNodes)=0
EFANode
Definition: EFANode.h:14
ElementFragmentAlgorithm::_crack_tip_elements
std::set< EFAElement * > _crack_tip_elements
Definition: ElementFragmentAlgorithm.h:38
ElementFragmentAlgorithm::restoreFragmentInfo
void restoreFragmentInfo(EFAElement *const elem, const EFAElement *const from_elem)
Definition: ElementFragmentAlgorithm.C:410
EFAElement2D::numFragments
virtual unsigned int numFragments() const
Definition: EFAElement2D.C:202
ElementFragmentAlgorithm::_ostream
std::ostream & _ostream
Definition: ElementFragmentAlgorithm.h:30
EFAElement2D
Definition: EFAElement2D.h:20
Efa::deleteFromMap
bool deleteFromMap(std::map< unsigned int, T * > &theMap, T *elemToDelete, bool delete_elem=true)
Definition: EFAFuncs.h:22
EFAElement2D::addNodeCut
void addNodeCut(unsigned int node_id, EFANode *embedded_permanent_node, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &EmbeddedPermanentNodes)
Definition: EFAElement2D.C:1814
EFAElement2D.h
Efa::getNewID
unsigned int getNewID(std::map< unsigned int, T * > &theMap)
Definition: EFAFuncs.h:38
ElementFragmentAlgorithm::getElemByID
EFAElement * getElemByID(unsigned int id)
Definition: ElementFragmentAlgorithm.C:590
ElementFragmentAlgorithm::getElemIdByNodes
unsigned int getElemIdByNodes(unsigned int *node_id)
Definition: ElementFragmentAlgorithm.C:599
ElementFragmentAlgorithm::_parent_elements
std::vector< EFAElement * > _parent_elements
Definition: ElementFragmentAlgorithm.h:42
ElementFragmentAlgorithm::ElementFragmentAlgorithm
ElementFragmentAlgorithm(std::ostream &os)
Constructor.
Definition: ElementFragmentAlgorithm.C:30
ElementFragmentAlgorithm::updateCrackTipElements
void updateCrackTipElements()
Definition: ElementFragmentAlgorithm.C:474
ElementFragmentAlgorithm::addElemEdgeIntersection
void addElemEdgeIntersection(unsigned int elemid, unsigned int edgeid, double position)
Definition: ElementFragmentAlgorithm.C:212
EFAElement::neighborSanityCheck
virtual void neighborSanityCheck() const =0
ElementFragmentAlgorithm::_new_nodes
std::vector< EFANode * > _new_nodes
Definition: ElementFragmentAlgorithm.h:39
EFAElement::updateFragmentNode
virtual void updateFragmentNode()=0
ElementFragmentAlgorithm::addElemNodeIntersection
void addElemNodeIntersection(unsigned int elemid, unsigned int nodeid)
Definition: ElementFragmentAlgorithm.C:228