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  const std::vector<EFANode *> & getNodes() const { return _nodes; }
45  bool containsNode(EFANode * node) const;
46  void printNodes(std::ostream & ostream) const;
47  EFANode * createLocalNodeFromGlobalNode(const EFANode * global_node) const;
48  EFANode * getGlobalNodeFromLocalNode(const EFANode * local_node) const;
49  unsigned int getLocalNodeIndex(EFANode * node) const;
50 
51  void setCrackTipSplit();
52  bool isCrackTipSplit() const;
53  unsigned int numCrackTipNeighbors() const;
54  unsigned int getCrackTipNeighbor(unsigned int index) const;
55  void addCrackTipNeighbor(EFAElement * neighbor_elem);
56 
57  EFAElement * getParent() const;
58  EFAElement * getChild(unsigned int child_id) const;
59  void setParent(EFAElement * parent);
60  unsigned int numChildren() const;
61  void addChild(EFAElement * child);
63  void
64  findGeneralNeighbors(const std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivity);
65  EFAElement * getGeneralNeighbor(unsigned int index) const;
66  unsigned int numGeneralNeighbors() const;
67 
68  // pure virtual methods
69  virtual unsigned int numFragments() const = 0;
70  virtual bool isPartial() const = 0;
71  virtual void getNonPhysicalNodes(std::set<EFANode *> & non_physical_nodes) const = 0;
72 
73  virtual void switchNode(EFANode * new_node, EFANode * old_node, bool descend_to_parent) = 0;
74  virtual void switchEmbeddedNode(EFANode * new_node, EFANode * old_node) = 0;
75  virtual void updateFragmentNode() = 0;
76  virtual void getMasterInfo(EFANode * node,
77  std::vector<EFANode *> & master_nodes,
78  std::vector<double> & master_weights) const = 0;
79  virtual unsigned int numInteriorNodes() const = 0;
80 
81  virtual unsigned int getNeighborIndex(const EFAElement * neighbor_elem) const = 0;
82  virtual void clearNeighbors() = 0;
83  virtual void
84  setupNeighbors(std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap) = 0;
85  virtual void neighborSanityCheck() const = 0;
86 
87  virtual void initCrackTip(std::set<EFAElement *> & CrackTipElements) = 0;
88  virtual bool shouldDuplicateForCrackTip(const std::set<EFAElement *> & CrackTipElements) = 0;
89  virtual bool
90  shouldDuplicateCrackTipSplitElement(const std::set<EFAElement *> & CrackTipElements) = 0;
91  virtual bool shouldDuplicateForPhantomCorner() = 0;
92  virtual bool willCrackTipExtend(std::vector<unsigned int> & split_neighbors) const = 0;
93  virtual bool isCrackTipElement() const = 0;
94 
95  virtual unsigned int getNumCuts() const = 0;
96  virtual bool isFinalCut() const = 0;
97  virtual void updateFragments(const std::set<EFAElement *> & CrackTipElements,
98  std::map<unsigned int, EFANode *> & EmbeddedNodes) = 0;
99  virtual void fragmentSanityCheck(unsigned int n_old_frag_edges,
100  unsigned int n_old_frag_cuts) const = 0;
101  virtual void restoreFragment(const EFAElement * const from_elem) = 0;
102 
103  virtual void createChild(const std::set<EFAElement *> & CrackTipElements,
104  std::map<unsigned int, EFAElement *> & Elements,
105  std::map<unsigned int, EFAElement *> & newChildElements,
106  std::vector<EFAElement *> & ChildElements,
107  std::vector<EFAElement *> & ParentElements,
108  std::map<unsigned int, EFANode *> & TempNodes) = 0;
109  virtual void removePhantomEmbeddedNode() = 0;
110  virtual void
111  connectNeighbors(std::map<unsigned int, EFANode *> & PermanentNodes,
112  std::map<unsigned int, EFANode *> & TempNodes,
113  std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap,
114  bool merge_phantom_edges) = 0;
115  virtual void printElement(std::ostream & ostream) const = 0;
116 
117 protected:
118  // common methods
119  void mergeNodes(EFANode *& childNode,
120  EFANode *& childOfNeighborNode,
121  EFAElement * childOfNeighborElem,
122  std::map<unsigned int, EFANode *> & PermanentNodes,
123  std::map<unsigned int, EFANode *> & TempNodes);
124 };
void clearParentAndChildren()
Definition: EFAElement.C:201
bool isCrackTipSplit() const
Definition: EFAElement.C:128
virtual void printElement(std::ostream &ostream) const =0
virtual void getNonPhysicalNodes(std::set< EFANode *> &non_physical_nodes) const =0
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
unsigned int numChildren() const
Definition: EFAElement.C:189
unsigned int numCrackTipNeighbors() const
Definition: EFAElement.C:134
unsigned int id() const
Definition: EFAElement.C:28
unsigned int _id
Definition: EFAElement.h:27
virtual unsigned int numInteriorNodes() const =0
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const =0
virtual bool isPartial() const =0
virtual bool isCrackTipElement() const =0
EFAElement(unsigned int eid, unsigned int n_nodes)
Definition: EFAElement.C:16
void addChild(EFAElement *child)
Definition: EFAElement.C:195
unsigned int numGeneralNeighbors() const
Definition: EFAElement.C:236
bool containsNode(EFANode *node) const
Definition: EFAElement.C:52
EFANode * getGlobalNodeFromLocalNode(const EFANode *local_node) const
Definition: EFAElement.C:95
EFAElement * getChild(unsigned int child_id) const
Definition: EFAElement.C:174
virtual void neighborSanityCheck() const =0
virtual void updateFragmentNode()=0
const dof_id_type n_nodes
std::vector< EFANode * > _nodes
Definition: EFAElement.h:29
unsigned int getCrackTipNeighbor(unsigned int index) const
Definition: EFAElement.C:140
virtual unsigned int numFragments() const =0
void printNodes(std::ostream &ostream) const
Definition: EFAElement.C:61
void setParent(EFAElement *parent)
Definition: EFAElement.C:183
void findGeneralNeighbors(const std::map< EFANode *, std::set< EFAElement *>> &InverseConnectivity)
Definition: EFAElement.C:208
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement *>> &InverseConnectivityMap)=0
unsigned int _num_nodes
Definition: EFAElement.h:28
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement *> &CrackTipElements)=0
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)=0
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)=0
virtual ~EFAElement()
Definition: EFAElement.C:25
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
EFAElement * _parent
Definition: EFAElement.h:31
EFANode * getNode(unsigned int node_id) const
Definition: EFAElement.C:46
virtual void restoreFragment(const EFAElement *const from_elem)=0
EFAElement * getGeneralNeighbor(unsigned int index) const
Definition: EFAElement.C:230
virtual void clearNeighbors()=0
void mergeNodes(EFANode *&childNode, EFANode *&childOfNeighborNode, EFAElement *childOfNeighborElem, std::map< unsigned int, EFANode *> &PermanentNodes, std::map< unsigned int, EFANode *> &TempNodes)
Definition: EFAElement.C:242
virtual unsigned int getNumCuts() const =0
virtual void getMasterInfo(EFANode *node, std::vector< EFANode *> &master_nodes, std::vector< double > &master_weights) const =0
unsigned int getLocalNodeIndex(EFANode *node) const
Definition: EFAElement.C:111
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement *> &CrackTipElements)=0
virtual void updateFragments(const std::set< EFAElement *> &CrackTipElements, std::map< unsigned int, EFANode *> &EmbeddedNodes)=0
virtual void removePhantomEmbeddedNode()=0
EFANode * createLocalNodeFromGlobalNode(const EFANode *global_node) const
Definition: EFAElement.C:70
void setCrackTipSplit()
Definition: EFAElement.C:122
unsigned int numNodes() const
Definition: EFAElement.C:34
void addCrackTipNeighbor(EFAElement *neighbor_elem)
Definition: EFAElement.C:149
virtual void initCrackTip(std::set< EFAElement *> &CrackTipElements)=0
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const =0
const std::vector< EFANode * > & getNodes() const
Definition: EFAElement.h:44
virtual bool shouldDuplicateForPhantomCorner()=0
std::vector< EFAElement * > _general_neighbors
Definition: EFAElement.h:36
std::vector< EFAElement * > _children
Definition: EFAElement.h:32
virtual bool isFinalCut() const =0
EFAElement * getParent() const
Definition: EFAElement.C:168
bool _crack_tip_split_element
Definition: EFAElement.h:33
virtual void fragmentSanityCheck(unsigned int n_old_frag_edges, unsigned int n_old_frag_cuts) const =0
std::vector< unsigned int > _crack_tip_neighbors
Definition: EFAElement.h:34
void setNode(unsigned int node_id, EFANode *node)
Definition: EFAElement.C:40
std::vector< EFANode * > _local_nodes
Definition: EFAElement.h:30