www.mooseframework.org
EFAElement3D.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 "EFAElement.h"
13 #include "EFAPoint.h"
14 
15 class EFANode;
16 class EFAFace;
17 class EFAVolumeNode;
18 class EFAFragment3D;
19 
20 class EFAElement3D : public EFAElement
21 {
22 public:
23  EFAElement3D(unsigned int eid, unsigned int n_nodes, unsigned int n_faces);
24  EFAElement3D(const EFAElement3D * from_elem, bool convert_to_local);
25 
26  ~EFAElement3D();
27 
28 private:
29  unsigned int _num_faces;
30  std::vector<EFAFace *> _faces;
31  std::vector<EFAVolumeNode *> _interior_nodes;
32  std::vector<std::vector<EFAElement3D *>> _face_neighbors;
33  std::vector<std::vector<std::vector<EFAElement3D *>>> _face_edge_neighbors;
34  std::vector<EFAFragment3D *> _fragments;
35  std::vector<std::vector<EFAFace *>> _faces_adjacent_to_faces;
36  unsigned int _num_vertices;
38  std::vector<EFAPoint> _local_node_coor;
39 
40 public:
41  // override virtual methods in base class
42  virtual unsigned int numFragments() const;
43  virtual bool isPartial() const;
44  virtual void getNonPhysicalNodes(std::set<EFANode *> & non_physical_nodes) const;
45 
46  virtual void switchNode(EFANode * new_node, EFANode * old_node, bool descend_to_parent);
47  virtual void switchEmbeddedNode(EFANode * new_node, EFANode * old_node);
48  virtual void updateFragmentNode();
49  virtual void getMasterInfo(EFANode * node,
50  std::vector<EFANode *> & master_nodes,
51  std::vector<double> & master_weights) const;
52  virtual unsigned int numInteriorNodes() const;
53 
54  bool overlaysElement(const EFAElement3D * other_elem) const;
55  virtual unsigned int getNeighborIndex(const EFAElement * neighbor_elem) const;
56  virtual void getNeighborEdgeIndex(const EFAElement3D * neighbor_elem,
57  unsigned int face_id,
58  unsigned int edge_id,
59  unsigned int & neigh_face_id,
60  unsigned int & neigh_edge_id) const;
61  virtual void clearNeighbors();
62  virtual void setupNeighbors(std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap);
63  virtual void neighborSanityCheck() const;
64 
65  virtual void initCrackTip(std::set<EFAElement *> & CrackTipElements);
66  virtual bool shouldDuplicateForCrackTip(const std::set<EFAElement *> & CrackTipElements);
67  virtual bool shouldDuplicateCrackTipSplitElement(const std::set<EFAElement *> & CrackTipElements);
68  virtual bool shouldDuplicateForPhantomCorner();
69  virtual bool willCrackTipExtend(std::vector<unsigned int> & split_neighbors) const;
70  virtual bool isCrackTipElement() const;
71 
72  virtual unsigned int getNumCuts() const;
73  virtual bool isFinalCut() const;
74  virtual void updateFragments(const std::set<EFAElement *> & CrackTipElements,
75  std::map<unsigned int, EFANode *> & EmbeddedNodes);
76  virtual void fragmentSanityCheck(unsigned int n_old_frag_faces,
77  unsigned int n_old_frag_cuts) const;
78  virtual void restoreFragment(const EFAElement * const from_elem);
79 
80  virtual void createChild(const std::set<EFAElement *> & CrackTipElements,
81  std::map<unsigned int, EFAElement *> & Elements,
82  std::map<unsigned int, EFAElement *> & newChildElements,
83  std::vector<EFAElement *> & ChildElements,
84  std::vector<EFAElement *> & ParentElements,
85  std::map<unsigned int, EFANode *> & TempNodes);
86  virtual void removePhantomEmbeddedNode();
87  virtual void
88  connectNeighbors(std::map<unsigned int, EFANode *> & PermanentNodes,
89  std::map<unsigned int, EFANode *> & TempNodes,
90  std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap,
91  bool merge_phantom_faces);
92  virtual void printElement(std::ostream & ostream);
93 
94  // EFAelement3D specific methods
95  EFAFragment3D * getFragment(unsigned int frag_id) const;
96  std::set<EFANode *> getFaceNodes(unsigned int face_id) const;
97  bool getFaceNodeParametricCoordinates(EFANode * node, std::vector<double> & xi_3d) const;
98  EFAVolumeNode * getInteriorNode(unsigned int interior_node_id) const;
99  void removeEmbeddedNode(EFANode * emb_node, bool remove_for_neighbor);
100 
101  unsigned int numFaces() const;
102  void setFace(unsigned int face_id, EFAFace * face);
103  void createFaces();
104  EFAFace * getFace(unsigned int face_id) const;
105  unsigned int getFaceID(EFAFace * face) const;
106  std::vector<unsigned int> getCommonFaceID(const EFAElement3D * other_elem) const;
107  bool getCommonEdgeID(const EFAElement3D * other_elem,
108  std::vector<unsigned int> & face_id,
109  std::vector<unsigned int> & edge_id) const;
110  unsigned int getNeighborFaceNodeID(unsigned int face_id,
111  unsigned int node_id,
112  EFAElement3D * neighbor_elem) const;
113  unsigned int getNeighborFaceInteriorNodeID(unsigned int face_id,
114  unsigned int node_id,
115  EFAElement3D * neighbor_elem) const;
116  unsigned int getNeighborFaceEdgeID(unsigned int face_id,
117  unsigned int edg_id,
118  EFAElement3D * neighbor_elem) const;
120  EFAFace * getAdjacentFace(unsigned int face_id, unsigned int edge_id) const;
121 
122  EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const;
123  std::set<EFANode *> getPhantomNodeOnFace(unsigned int face_id) const;
124  bool getFragmentFaceID(unsigned int elem_face_id, unsigned int & frag_face_id) const;
125  bool getFragmentFaceEdgeID(unsigned int ElemFaceID,
126  unsigned int ElemFaceEdgeID,
127  unsigned int & FragFaceID,
128  unsigned int & FragFaceEdgeID) const;
129  bool
130  isPhysicalEdgeCut(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, double position) const;
131  bool isFacePhantom(unsigned int face_id) const;
132  unsigned int numFaceNeighbors(unsigned int face_id) const;
133  unsigned int numEdgeNeighbors(unsigned int face_id, unsigned int edge_id) const;
134  EFAElement3D * getFaceNeighbor(unsigned int face_id, unsigned int neighbor_id) const;
135  EFAElement3D *
136  getEdgeNeighbor(unsigned int face_id, unsigned int edge_id, unsigned int neighbor_id) const;
137 
138  bool fragmentHasTipFaces() const;
139  std::vector<unsigned int> getTipFaceIDs() const;
140  std::set<EFANode *> getTipEmbeddedNodes() const;
141  bool faceContainsTip(unsigned int face_id) const;
142  bool fragmentFaceAlreadyCut(unsigned int ElemFaceID) const;
143 
144  void addFaceEdgeCut(unsigned int face_id,
145  unsigned int edge_id,
146  double position,
147  EFANode * embedded_node,
148  std::map<unsigned int, EFANode *> & EmbeddedNodes,
149  bool add_to_neighbor,
150  bool add_to_adjacent);
151  void addFragFaceEdgeCut(unsigned int frag_face_id,
152  unsigned int frag_edge_id,
153  double position,
154  std::map<unsigned int, EFANode *> & EmbeddedNodes,
155  bool add_to_neighbor,
156  bool add_to_adjacent);
157  std::vector<EFANode *> getCommonNodes(const EFAElement3D * other_elem) const;
158 
159 private:
160  // EFAelement3D specific methods
161  void checkNeighborFaceCut(unsigned int face_id,
162  unsigned int edge_id,
163  double position,
164  EFANode * from_node,
165  EFANode * embedded_node,
166  EFANode *& local_embedded);
167  void mapParametricCoordinateFrom2DTo3D(unsigned int face_id,
168  std::vector<double> & xi_2d,
169  std::vector<double> & xi_3d) const;
170 
171  void setLocalCoordinates();
172 };
173 
EFAPoint.h
EFAElement3D::updateFragmentNode
virtual void updateFragmentNode()
Definition: EFAElement3D.C:367
EFAElement3D::overlaysElement
bool overlaysElement(const EFAElement3D *other_elem) const
Definition: EFAElement3D.C:431
EFAElement3D::getFaceID
unsigned int getFaceID(EFAFace *face) const
Definition: EFAElement3D.C:1519
EFAElement3D::fragmentFaceAlreadyCut
bool fragmentFaceAlreadyCut(unsigned int ElemFaceID) const
Definition: EFAElement3D.C:1974
EFAElement
Definition: EFAElement.h:19
EFAElement3D::_fragments
std::vector< EFAFragment3D * > _fragments
Definition: EFAElement3D.h:34
EFAElement3D::getFragmentFace
EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const
Definition: EFAElement3D.C:1706
EFAElement3D::isFinalCut
virtual bool isFinalCut() const
Definition: EFAElement3D.C:838
EFAElement.h
EFAElement3D::removeEmbeddedNode
void removeEmbeddedNode(EFANode *emb_node, bool remove_for_neighbor)
Definition: EFAElement3D.C:1425
EFAElement3D::neighborSanityCheck
virtual void neighborSanityCheck() const
Definition: EFAElement3D.C:584
EFAElement3D::getFragment
EFAFragment3D * getFragment(unsigned int frag_id) const
Definition: EFAElement3D.C:1372
EFAElement3D::getFragmentFaceID
bool getFragmentFaceID(unsigned int elem_face_id, unsigned int &frag_face_id) const
Definition: EFAElement3D.C:1739
EFAElement3D::getInteriorNode
EFAVolumeNode * getInteriorNode(unsigned int interior_node_id) const
Definition: EFAElement3D.C:1416
EFAElement3D::_face_edge_neighbors
std::vector< std::vector< std::vector< EFAElement3D * > > > _face_edge_neighbors
Definition: EFAElement3D.h:33
EFAElement3D::_num_faces
unsigned int _num_faces
Definition: EFAElement3D.h:29
EFAElement3D::numEdgeNeighbors
unsigned int numEdgeNeighbors(unsigned int face_id, unsigned int edge_id) const
Definition: EFAElement3D.C:1846
EFAElement3D::getCommonFaceID
std::vector< unsigned int > getCommonFaceID(const EFAElement3D *other_elem) const
Definition: EFAElement3D.C:1538
EFAElement3D::mapParametricCoordinateFrom2DTo3D
void mapParametricCoordinateFrom2DTo3D(unsigned int face_id, std::vector< double > &xi_2d, std::vector< double > &xi_3d) const
Definition: EFAElement3D.C:2165
EFAElement3D::setFace
void setFace(unsigned int face_id, EFAFace *face)
Definition: EFAElement3D.C:1448
EFAElement3D::getNeighborIndex
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const
Definition: EFAElement3D.C:458
EFAElement3D::_faces
std::vector< EFAFace * > _faces
Definition: EFAElement3D.h:30
EFAElement3D::~EFAElement3D
~EFAElement3D()
Definition: EFAElement3D.C:116
EFAElement3D::addFragFaceEdgeCut
void addFragFaceEdgeCut(unsigned int frag_face_id, unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor, bool add_to_adjacent)
Definition: EFAElement3D.C:2117
EFAElement3D::getCommonNodes
std::vector< EFANode * > getCommonNodes(const EFAElement3D *other_elem) const
Definition: EFAElement3D.C:2246
EFAElement3D::willCrackTipExtend
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const
Definition: EFAElement3D.C:771
EFAElement3D::getFragmentFaceEdgeID
bool getFragmentFaceEdgeID(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, unsigned int &FragFaceID, unsigned int &FragFaceEdgeID) const
Definition: EFAElement3D.C:1762
EFAElement3D::checkNeighborFaceCut
void checkNeighborFaceCut(unsigned int face_id, unsigned int edge_id, double position, EFANode *from_node, EFANode *embedded_node, EFANode *&local_embedded)
Definition: EFAElement3D.C:2130
EFAElement3D::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)
Definition: EFAElement3D.C:977
EFAElement3D::isPartial
virtual bool isPartial() const
Definition: EFAElement3D.C:275
EFAElement3D::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_faces)
Definition: EFAElement3D.C:1141
EFAElement3D::removePhantomEmbeddedNode
virtual void removePhantomEmbeddedNode()
Definition: EFAElement3D.C:1106
EFAElement3D::getNumCuts
virtual unsigned int getNumCuts() const
Definition: EFAElement3D.C:828
EFAElement3D::setLocalCoordinates
void setLocalCoordinates()
Definition: EFAElement3D.C:153
EFAElement3D::getTipFaceIDs
std::vector< unsigned int > getTipFaceIDs() const
Definition: EFAElement3D.C:1899
EFAElement3D::getFaceNodeParametricCoordinates
bool getFaceNodeParametricCoordinates(EFANode *node, std::vector< double > &xi_3d) const
Definition: EFAElement3D.C:1390
EFAElement3D::numFaceNeighbors
unsigned int numFaceNeighbors(unsigned int face_id) const
Definition: EFAElement3D.C:1840
EFAElement3D::switchEmbeddedNode
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)
Definition: EFAElement3D.C:356
EFAElement3D
Definition: EFAElement3D.h:20
EFAElement3D::clearNeighbors
virtual void clearNeighbors()
Definition: EFAElement3D.C:496
EFAElement3D::getPhantomNodeOnFace
std::set< EFANode * > getPhantomNodeOnFace(unsigned int face_id) const
Definition: EFAElement3D.C:1715
EFAElement3D::_interior_nodes
std::vector< EFAVolumeNode * > _interior_nodes
Definition: EFAElement3D.h:31
EFAElement3D::getAdjacentFace
EFAFace * getAdjacentFace(unsigned int face_id, unsigned int edge_id) const
Definition: EFAElement3D.C:1700
EFAElement3D::getFaceNodes
std::set< EFANode * > getFaceNodes(unsigned int face_id) const
Definition: EFAElement3D.C:1381
EFAElement3D::switchNode
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)
Definition: EFAElement3D.C:329
EFAElement3D::updateFragments
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)
Definition: EFAElement3D.C:858
EFAElement3D::getFace
EFAFace * getFace(unsigned int face_id) const
Definition: EFAElement3D.C:1513
EFAElement3D::isFacePhantom
bool isFacePhantom(unsigned int face_id) const
Definition: EFAElement3D.C:1814
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
EFAElement3D::isPhysicalEdgeCut
bool isPhysicalEdgeCut(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, double position) const
Definition: EFAElement3D.C:1789
EFAVolumeNode
Definition: EFAVolumeNode.h:14
EFAElement3D::initCrackTip
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)
Definition: EFAElement3D.C:619
EFAElement3D::getNeighborFaceEdgeID
unsigned int getNeighborFaceEdgeID(unsigned int face_id, unsigned int edg_id, EFAElement3D *neighbor_elem) const
Definition: EFAElement3D.C:1651
EFAElement3D::getFaceNeighbor
EFAElement3D * getFaceNeighbor(unsigned int face_id, unsigned int neighbor_id) const
Definition: EFAElement3D.C:1852
EFAElement3D::fragmentHasTipFaces
bool fragmentHasTipFaces() const
Definition: EFAElement3D.C:1872
EFAElement3D::numInteriorNodes
virtual unsigned int numInteriorNodes() const
Definition: EFAElement3D.C:425
EFAElement3D::numFaces
unsigned int numFaces() const
Definition: EFAElement3D.C:1442
EFAElement3D::printElement
virtual void printElement(std::ostream &ostream)
Definition: EFAElement3D.C:1280
EFAElement3D::_faces_adjacent_to_faces
std::vector< std::vector< EFAFace * > > _faces_adjacent_to_faces
Definition: EFAElement3D.h:35
EFAElement3D::shouldDuplicateCrackTipSplitElement
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)
Definition: EFAElement3D.C:681
EFAElement3D::getNeighborEdgeIndex
virtual void getNeighborEdgeIndex(const EFAElement3D *neighbor_elem, unsigned int face_id, unsigned int edge_id, unsigned int &neigh_face_id, unsigned int &neigh_edge_id) const
Definition: EFAElement3D.C:469
EFAElement3D::getMasterInfo
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
Definition: EFAElement3D.C:373
EFAElement3D::EFAElement3D
EFAElement3D(unsigned int eid, unsigned int n_nodes, unsigned int n_faces)
Definition: EFAElement3D.C:24
EFAElement3D::shouldDuplicateForCrackTip
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)
Definition: EFAElement3D.C:657
EFAFace
Definition: EFAFace.h:19
EFAElement3D::createFaces
void createFaces()
Definition: EFAElement3D.C:1454
EFAElement3D::_num_interior_face_nodes
unsigned int _num_interior_face_nodes
Definition: EFAElement3D.h:37
EFAElement3D::getTipEmbeddedNodes
std::set< EFANode * > getTipEmbeddedNodes() const
Definition: EFAElement3D.C:1924
EFAElement3D::shouldDuplicateForPhantomCorner
virtual bool shouldDuplicateForPhantomCorner()
Definition: EFAElement3D.C:732
EFAElement3D::fragmentSanityCheck
virtual void fragmentSanityCheck(unsigned int n_old_frag_faces, unsigned int n_old_frag_cuts) const
Definition: EFAElement3D.C:916
EFAElement3D::findFacesAdjacentToFaces
void findFacesAdjacentToFaces()
Definition: EFAElement3D.C:1681
EFAElement3D::numFragments
virtual unsigned int numFragments() const
Definition: EFAElement3D.C:269
EFAElement3D::_num_vertices
unsigned int _num_vertices
Definition: EFAElement3D.h:36
EFANode
Definition: EFANode.h:14
EFAElement3D::isCrackTipElement
virtual bool isCrackTipElement() const
Definition: EFAElement3D.C:822
EFAElement3D::faceContainsTip
bool faceContainsTip(unsigned int face_id) const
Definition: EFAElement3D.C:1953
EFAElement3D::_face_neighbors
std::vector< std::vector< EFAElement3D * > > _face_neighbors
Definition: EFAElement3D.h:32
EFAElement3D::getNonPhysicalNodes
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const
Definition: EFAElement3D.C:302
EFAElement3D::restoreFragment
virtual void restoreFragment(const EFAElement *const from_elem)
Definition: EFAElement3D.C:941
EFAElement3D::getNeighborFaceNodeID
unsigned int getNeighborFaceNodeID(unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const
Definition: EFAElement3D.C:1590
EFAElement3D::getEdgeNeighbor
EFAElement3D * getEdgeNeighbor(unsigned int face_id, unsigned int edge_id, unsigned int neighbor_id) const
Definition: EFAElement3D.C:1861
EFAElement3D::_local_node_coor
std::vector< EFAPoint > _local_node_coor
Definition: EFAElement3D.h:38
EFAFragment3D
Definition: EFAFragment3D.h:20
EFAElement3D::getNeighborFaceInteriorNodeID
unsigned int getNeighborFaceInteriorNodeID(unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const
Definition: EFAElement3D.C:1620
EFAElement3D::setupNeighbors
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap)
Definition: EFAElement3D.C:508
EFAElement3D::getCommonEdgeID
bool getCommonEdgeID(const EFAElement3D *other_elem, std::vector< unsigned int > &face_id, std::vector< unsigned int > &edge_id) const
Definition: EFAElement3D.C:1556