https://mooseframework.inl.gov
Loading...
Searching...
No Matches
EFAElement.h
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#pragma once
11
12#include <vector>
13#include <map>
14#include <set>
15#include <ostream>
16
17class EFANode;
18
20{
21public:
22 EFAElement(unsigned int eid, unsigned int n_nodes);
23
24 virtual ~EFAElement();
25
26protected:
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
38public:
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;
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
117protected:
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 addChild(EFAElement *child)
Definition EFAElement.C:195
EFAElement * getGeneralNeighbor(unsigned int index) const
Definition EFAElement.C:230
const std::vector< EFANode * > & getNodes() const
Definition EFAElement.h:44
virtual unsigned int numFragments() const =0
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const =0
virtual unsigned int getNumCuts() const =0
unsigned int numGeneralNeighbors() const
Definition EFAElement.C:236
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const =0
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const =0
std::vector< EFANode * > _nodes
Definition EFAElement.h:29
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
void clearParentAndChildren()
Definition EFAElement.C:201
virtual bool isPartial() const =0
unsigned int _num_nodes
Definition EFAElement.h:28
unsigned int numNodes() const
Definition EFAElement.C:34
EFAElement * _parent
Definition EFAElement.h:31
void mergeNodes(EFANode *&childNode, EFANode *&childOfNeighborNode, EFAElement *childOfNeighborElem, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &TempNodes)
Definition EFAElement.C:242
void addCrackTipNeighbor(EFAElement *neighbor_elem)
Definition EFAElement.C:149
std::vector< EFAElement * > _general_neighbors
Definition EFAElement.h:36
EFANode * getNode(unsigned int node_id) const
Definition EFAElement.C:46
void setCrackTipSplit()
Definition EFAElement.C:122
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)=0
virtual ~EFAElement()
Definition EFAElement.C:25
virtual void restoreFragment(const EFAElement *const from_elem)=0
bool containsNode(EFANode *node) const
Definition EFAElement.C:52
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
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)=0
EFAElement * getChild(unsigned int child_id) const
Definition EFAElement.C:174
bool isCrackTipSplit() const
Definition EFAElement.C:128
virtual void updateFragmentNode()=0
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * > > &InverseConnectivityMap)=0
void setNode(unsigned int node_id, EFANode *node)
Definition EFAElement.C:40
unsigned int numCrackTipNeighbors() const
Definition EFAElement.C:134
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)=0
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)=0
unsigned int _id
Definition EFAElement.h:27
bool _crack_tip_split_element
Definition EFAElement.h:33
virtual bool isFinalCut() const =0
virtual bool shouldDuplicateForPhantomCorner()=0
void setParent(EFAElement *parent)
Definition EFAElement.C:183
virtual void clearNeighbors()=0
std::vector< unsigned int > _crack_tip_neighbors
Definition EFAElement.h:34
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)=0
unsigned int getLocalNodeIndex(EFANode *node) const
Definition EFAElement.C:111
void findGeneralNeighbors(const std::map< EFANode *, std::set< EFAElement * > > &InverseConnectivity)
Definition EFAElement.C:208
void printNodes(std::ostream &ostream) const
Definition EFAElement.C:61
EFANode * createLocalNodeFromGlobalNode(const EFANode *global_node) const
Definition EFAElement.C:70
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)=0
unsigned int getCrackTipNeighbor(unsigned int index) const
Definition EFAElement.C:140
virtual bool isCrackTipElement() const =0
unsigned int numChildren() const
Definition EFAElement.C:189
virtual void fragmentSanityCheck(unsigned int n_old_frag_edges, unsigned int n_old_frag_cuts) const =0
std::vector< EFANode * > _local_nodes
Definition EFAElement.h:30
unsigned int id() const
Definition EFAElement.C:28
std::vector< EFAElement * > _children
Definition EFAElement.h:32
virtual unsigned int numInteriorNodes() const =0
EFAElement * getParent() const
Definition EFAElement.C:168
EFANode * getGlobalNodeFromLocalNode(const EFANode *local_node) const
Definition EFAElement.C:95
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const =0
virtual void neighborSanityCheck() const =0
virtual void printElement(std::ostream &ostream) const =0
virtual void removePhantomEmbeddedNode()=0
const dof_id_type n_nodes