www.mooseframework.org
EFAElement.h
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 #pragma once
11 
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <ostream>
16 
17 class EFANode;
18 
20 {
21 public:
22  EFAElement(unsigned int eid, unsigned int n_nodes);
23 
24  virtual ~EFAElement();
25 
26 protected:
27  unsigned int _id;
28  unsigned int _num_nodes;
29  std::vector<EFANode *> _nodes;
30  std::vector<EFANode *> _local_nodes;
32  std::vector<EFAElement *> _children;
34  std::vector<unsigned int> _crack_tip_neighbors;
35  std::vector<EFAElement *>
36  _general_neighbors; // all elements sharing at least one node with curr elem
37 
38 public:
39  // common methods
40  unsigned int id() const;
41  unsigned int numNodes() const;
42  void setNode(unsigned int node_id, EFANode * node);
43  EFANode * getNode(unsigned int node_id) const;
44  bool containsNode(EFANode * node) const;
45  void printNodes(std::ostream & ostream) const;
46  EFANode * createLocalNodeFromGlobalNode(const EFANode * global_node) const;
47  EFANode * getGlobalNodeFromLocalNode(const EFANode * local_node) const;
48  unsigned int getLocalNodeIndex(EFANode * node) const;
49 
50  void setCrackTipSplit();
51  bool isCrackTipSplit() const;
52  unsigned int numCrackTipNeighbors() const;
53  unsigned int getCrackTipNeighbor(unsigned int index) const;
54  void addCrackTipNeighbor(EFAElement * neighbor_elem);
55 
56  EFAElement * getParent() const;
57  EFAElement * getChild(unsigned int child_id) const;
58  void setParent(EFAElement * parent);
59  unsigned int numChildren() const;
60  void addChild(EFAElement * child);
62  void findGeneralNeighbors(std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivity);
63  EFAElement * getGeneralNeighbor(unsigned int index) const;
64  unsigned int numGeneralNeighbors() const;
65 
66  // pure virtual methods
67  virtual unsigned int numFragments() const = 0;
68  virtual bool isPartial() const = 0;
69  virtual void getNonPhysicalNodes(std::set<EFANode *> & non_physical_nodes) const = 0;
70 
71  virtual void switchNode(EFANode * new_node, EFANode * old_node, bool descend_to_parent) = 0;
72  virtual void switchEmbeddedNode(EFANode * new_node, EFANode * old_node) = 0;
73  virtual void updateFragmentNode() = 0;
74  virtual void getMasterInfo(EFANode * node,
75  std::vector<EFANode *> & master_nodes,
76  std::vector<double> & master_weights) const = 0;
77  virtual unsigned int numInteriorNodes() const = 0;
78 
79  virtual unsigned int getNeighborIndex(const EFAElement * neighbor_elem) const = 0;
80  virtual void clearNeighbors() = 0;
81  virtual void
82  setupNeighbors(std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap) = 0;
83  virtual void neighborSanityCheck() const = 0;
84 
85  virtual void initCrackTip(std::set<EFAElement *> & CrackTipElements) = 0;
86  virtual bool shouldDuplicateForCrackTip(const std::set<EFAElement *> & CrackTipElements) = 0;
87  virtual bool
88  shouldDuplicateCrackTipSplitElement(const std::set<EFAElement *> & CrackTipElements) = 0;
89  virtual bool shouldDuplicateForPhantomCorner() = 0;
90  virtual bool willCrackTipExtend(std::vector<unsigned int> & split_neighbors) const = 0;
91  virtual bool isCrackTipElement() const = 0;
92 
93  virtual unsigned int getNumCuts() const = 0;
94  virtual bool isFinalCut() const = 0;
95  virtual void updateFragments(const std::set<EFAElement *> & CrackTipElements,
96  std::map<unsigned int, EFANode *> & EmbeddedNodes) = 0;
97  virtual void fragmentSanityCheck(unsigned int n_old_frag_edges,
98  unsigned int n_old_frag_cuts) const = 0;
99  virtual void restoreFragment(const EFAElement * const from_elem) = 0;
100 
101  virtual void createChild(const std::set<EFAElement *> & CrackTipElements,
102  std::map<unsigned int, EFAElement *> & Elements,
103  std::map<unsigned int, EFAElement *> & newChildElements,
104  std::vector<EFAElement *> & ChildElements,
105  std::vector<EFAElement *> & ParentElements,
106  std::map<unsigned int, EFANode *> & TempNodes) = 0;
107  virtual void removePhantomEmbeddedNode() = 0;
108  virtual void
109  connectNeighbors(std::map<unsigned int, EFANode *> & PermanentNodes,
110  std::map<unsigned int, EFANode *> & TempNodes,
111  std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap,
112  bool merge_phantom_edges) = 0;
113  virtual void printElement(std::ostream & ostream) = 0;
114 
115 protected:
116  // common methods
117  void mergeNodes(EFANode *& childNode,
118  EFANode *& childOfNeighborNode,
119  EFAElement * childOfNeighborElem,
120  std::map<unsigned int, EFANode *> & PermanentNodes,
121  std::map<unsigned int, EFANode *> & TempNodes);
122 };
123 
EFAElement::switchNode
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)=0
EFAElement::getCrackTipNeighbor
unsigned int getCrackTipNeighbor(unsigned int index) const
Definition: EFAElement.C:148
EFAElement::numFragments
virtual unsigned int numFragments() const =0
EFAElement::_parent
EFAElement * _parent
Definition: EFAElement.h:31
EFAElement::getNode
EFANode * getNode(unsigned int node_id) const
Definition: EFAElement.C:46
EFAElement
Definition: EFAElement.h:19
EFAElement::getGeneralNeighbor
EFAElement * getGeneralNeighbor(unsigned int index) const
Definition: EFAElement.C:236
EFAElement::switchEmbeddedNode
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)=0
EFAElement::~EFAElement
virtual ~EFAElement()
Definition: EFAElement.C:25
EFAElement::getNumCuts
virtual unsigned int getNumCuts() const =0
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
EFAElement::restoreFragment
virtual void restoreFragment(const EFAElement *const from_elem)=0
EFAElement::getNonPhysicalNodes
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const =0
EFAElement::clearNeighbors
virtual void clearNeighbors()=0
EFAElement::printElement
virtual void printElement(std::ostream &ostream)=0
EFAElement::removePhantomEmbeddedNode
virtual void removePhantomEmbeddedNode()=0
EFAElement::setCrackTipSplit
void setCrackTipSplit()
Definition: EFAElement.C:130
EFAElement::mergeNodes
void mergeNodes(EFANode *&childNode, EFANode *&childOfNeighborNode, EFAElement *childOfNeighborElem, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &TempNodes)
Definition: EFAElement.C:248
EFAElement::numNodes
unsigned int numNodes() const
Definition: EFAElement.C:34
EFAElement::findGeneralNeighbors
void findGeneralNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivity)
Definition: EFAElement.C:216
EFAElement::getLocalNodeIndex
unsigned int getLocalNodeIndex(EFANode *node) const
Definition: EFAElement.C:111
EFAElement::shouldDuplicateForPhantomCorner
virtual bool shouldDuplicateForPhantomCorner()=0
EFAElement::getParent
EFAElement * getParent() const
Definition: EFAElement.C:176
EFAElement::createLocalNodeFromGlobalNode
EFANode * createLocalNodeFromGlobalNode(const EFANode *global_node) const
Definition: EFAElement.C:70
EFAElement::_crack_tip_neighbors
std::vector< unsigned int > _crack_tip_neighbors
Definition: EFAElement.h:34
EFAElement::fragmentSanityCheck
virtual void fragmentSanityCheck(unsigned int n_old_frag_edges, unsigned int n_old_frag_cuts) const =0
EFAElement::setNode
void setNode(unsigned int node_id, EFANode *node)
Definition: EFAElement.C:40
EFAElement::addCrackTipNeighbor
void addCrackTipNeighbor(EFAElement *neighbor_elem)
Definition: EFAElement.C:157
EFAElement::_general_neighbors
std::vector< EFAElement * > _general_neighbors
Definition: EFAElement.h:36
EFAElement::_local_nodes
std::vector< EFANode * > _local_nodes
Definition: EFAElement.h:30
EFAElement::willCrackTipExtend
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const =0
EFAElement::_children
std::vector< EFAElement * > _children
Definition: EFAElement.h:32
EFAElement::isFinalCut
virtual bool isFinalCut() const =0
EFAElement::clearParentAndChildren
void clearParentAndChildren()
Definition: EFAElement.C:209
EFAElement::shouldDuplicateForCrackTip
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)=0
EFAElement::_crack_tip_split_element
bool _crack_tip_split_element
Definition: EFAElement.h:33
EFAElement::updateFragments
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)=0
EFAElement::shouldDuplicateCrackTipSplitElement
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)=0
EFAElement::numCrackTipNeighbors
unsigned int numCrackTipNeighbors() const
Definition: EFAElement.C:142
EFAElement::id
unsigned int id() const
Definition: EFAElement.C:28
EFAElement::isCrackTipSplit
bool isCrackTipSplit() const
Definition: EFAElement.C:136
EFAElement::getMasterInfo
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const =0
EFAElement::numInteriorNodes
virtual unsigned int numInteriorNodes() const =0
EFAElement::numChildren
unsigned int numChildren() const
Definition: EFAElement.C:197
EFAElement::setupNeighbors
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap)=0
EFAElement::_id
unsigned int _id
Definition: EFAElement.h:27
EFAElement::EFAElement
EFAElement(unsigned int eid, unsigned int n_nodes)
Definition: EFAElement.C:16
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
EFAElement::getNeighborIndex
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const =0
EFAElement::addChild
void addChild(EFAElement *child)
Definition: EFAElement.C:203
EFAElement::getGlobalNodeFromLocalNode
EFANode * getGlobalNodeFromLocalNode(const EFANode *local_node) const
Definition: EFAElement.C:95
EFAElement::isPartial
virtual bool isPartial() const =0
EFAElement::getChild
EFAElement * getChild(unsigned int child_id) const
Definition: EFAElement.C:182
EFAElement::_nodes
std::vector< EFANode * > _nodes
Definition: EFAElement.h:29
EFAElement::numGeneralNeighbors
unsigned int numGeneralNeighbors() const
Definition: EFAElement.C:242
EFAElement::containsNode
bool containsNode(EFANode *node) const
Definition: EFAElement.C:52
EFAElement::printNodes
void printNodes(std::ostream &ostream) const
Definition: EFAElement.C:61
EFAElement::setParent
void setParent(EFAElement *parent)
Definition: EFAElement.C:191
EFAElement::_num_nodes
unsigned int _num_nodes
Definition: EFAElement.h:28
EFAElement::neighborSanityCheck
virtual void neighborSanityCheck() const =0
EFAElement::updateFragmentNode
virtual void updateFragmentNode()=0