https://mooseframework.inl.gov
Loading...
Searching...
No Matches
EFAElement3D.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 "EFAElement.h"
13#include "EFAPoint.h"
14
15class EFANode;
16class EFAFace;
17class EFAVolumeNode;
18class EFAFragment3D;
19
21{
22public:
23 EFAElement3D(unsigned int eid, unsigned int n_nodes, unsigned int n_faces);
24 EFAElement3D(const EFAElement3D * from_elem, bool convert_to_local);
25
27
28private:
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
40public:
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);
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) const;
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<std::pair<unsigned int, unsigned int>> & common_ids) const;
109 unsigned int getNeighborFaceNodeID(unsigned int face_id,
110 unsigned int node_id,
111 EFAElement3D * neighbor_elem) const;
112 unsigned int getNeighborFaceInteriorNodeID(unsigned int face_id,
113 unsigned int node_id,
114 EFAElement3D * neighbor_elem) const;
115 unsigned int getNeighborFaceEdgeID(unsigned int face_id,
116 unsigned int edg_id,
117 EFAElement3D * neighbor_elem) const;
119 EFAFace * getAdjacentFace(unsigned int face_id, unsigned int edge_id) const;
120
121 EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const;
122 std::set<EFANode *> getPhantomNodeOnFace(unsigned int face_id) const;
123 bool getFragmentFaceID(unsigned int elem_face_id, unsigned int & frag_face_id) const;
124 bool getFragmentFaceEdgeID(unsigned int ElemFaceID,
125 unsigned int ElemFaceEdgeID,
126 unsigned int & FragFaceID,
127 unsigned int & FragFaceEdgeID) const;
128 bool
129 isPhysicalEdgeCut(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, double position) const;
130 bool isFacePhantom(unsigned int face_id) const;
131 unsigned int numFaceNeighbors(unsigned int face_id) const;
132 unsigned int numEdgeNeighbors(unsigned int face_id, unsigned int edge_id) const;
133 EFAElement3D * getFaceNeighbor(unsigned int face_id, unsigned int neighbor_id) const;
135 getEdgeNeighbor(unsigned int face_id, unsigned int edge_id, unsigned int neighbor_id) const;
136
137 bool fragmentHasTipFaces() const;
138 std::vector<unsigned int> getTipFaceIDs() const;
139 std::set<EFANode *> getTipEmbeddedNodes() const;
140 bool faceContainsTip(unsigned int face_id) const;
141 bool fragmentFaceAlreadyCut(unsigned int ElemFaceID) const;
142
143 void addFaceEdgeCut(unsigned int face_id,
144 unsigned int edge_id,
145 double position,
146 EFANode * embedded_node,
147 std::map<unsigned int, EFANode *> & EmbeddedNodes,
148 bool add_to_neighbor,
149 bool add_to_adjacent);
150 void addFragFaceEdgeCut(unsigned int frag_face_id,
151 unsigned int frag_edge_id,
152 double position,
153 std::map<unsigned int, EFANode *> & EmbeddedNodes,
154 bool add_to_neighbor,
155 bool add_to_adjacent);
156 std::vector<EFANode *> getCommonNodes(const EFAElement3D * other_elem) const;
157
158private:
159 // EFAelement3D specific methods
160 void checkNeighborFaceCut(unsigned int face_id,
161 unsigned int edge_id,
162 double position,
163 EFANode * from_node,
164 EFANode * embedded_node,
165 EFANode *& local_embedded);
166 void mapParametricCoordinateFrom2DTo3D(unsigned int face_id,
167 std::vector<double> & xi_2d,
168 std::vector<double> & xi_3d) const;
169
170 void setLocalCoordinates();
171};
virtual void restoreFragment(const EFAElement *const from_elem)
std::vector< unsigned int > getCommonFaceID(const EFAElement3D *other_elem) const
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)
void checkNeighborFaceCut(unsigned int face_id, unsigned int edge_id, double position, EFANode *from_node, EFANode *embedded_node, EFANode *&local_embedded)
std::vector< unsigned int > getTipFaceIDs() const
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)
bool overlaysElement(const EFAElement3D *other_elem) const
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)
virtual unsigned int numInteriorNodes() const
void setLocalCoordinates()
EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const
bool getCommonEdgeID(const EFAElement3D *other_elem, std::vector< std::pair< unsigned int, unsigned int > > &common_ids) const
EFAElement3D * getFaceNeighbor(unsigned int face_id, unsigned int neighbor_id) const
std::vector< std::vector< std::vector< EFAElement3D * > > > _face_edge_neighbors
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)
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)
std::vector< EFAFragment3D * > _fragments
std::set< EFANode * > getFaceNodes(unsigned int face_id) const
bool getFragmentFaceEdgeID(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, unsigned int &FragFaceID, unsigned int &FragFaceEdgeID) const
unsigned int numEdgeNeighbors(unsigned int face_id, unsigned int edge_id) const
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)
std::vector< std::vector< EFAElement3D * > > _face_neighbors
unsigned int numFaces() const
virtual bool shouldDuplicateForPhantomCorner()
unsigned int getFaceID(EFAFace *face) const
virtual unsigned int numFragments() const
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const
virtual unsigned int getNumCuts() const
EFAElement3D * getEdgeNeighbor(unsigned int face_id, unsigned int edge_id, unsigned int neighbor_id) const
void setFace(unsigned int face_id, EFAFace *face)
EFAFragment3D * getFragment(unsigned int frag_id) const
unsigned int _num_vertices
unsigned int getNeighborFaceEdgeID(unsigned int face_id, unsigned int edg_id, EFAElement3D *neighbor_elem) const
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)
bool fragmentHasTipFaces() const
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
void findFacesAdjacentToFaces()
std::vector< EFAPoint > _local_node_coor
std::set< EFANode * > getTipEmbeddedNodes() const
void removeEmbeddedNode(EFANode *emb_node, bool remove_for_neighbor)
void mapParametricCoordinateFrom2DTo3D(unsigned int face_id, std::vector< double > &xi_2d, std::vector< double > &xi_3d) const
bool getFaceNodeParametricCoordinates(EFANode *node, std::vector< double > &xi_3d) const
EFAFace * getFace(unsigned int face_id) const
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * > > &InverseConnectivityMap)
virtual bool isFinalCut() const
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
EFAVolumeNode * getInteriorNode(unsigned int interior_node_id) const
virtual bool isPartial() const
virtual void updateFragmentNode()
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)
bool isPhysicalEdgeCut(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, double position) const
bool getFragmentFaceID(unsigned int elem_face_id, unsigned int &frag_face_id) const
std::vector< EFAFace * > _faces
unsigned int _num_interior_face_nodes
bool isFacePhantom(unsigned int face_id) const
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const
virtual void neighborSanityCheck() const
std::vector< EFANode * > getCommonNodes(const EFAElement3D *other_elem) const
unsigned int _num_faces
virtual void clearNeighbors()
unsigned int getNeighborFaceInteriorNodeID(unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const
virtual void removePhantomEmbeddedNode()
unsigned int getNeighborFaceNodeID(unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const
bool fragmentFaceAlreadyCut(unsigned int ElemFaceID) const
std::vector< EFAVolumeNode * > _interior_nodes
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)
virtual bool isCrackTipElement() const
virtual void fragmentSanityCheck(unsigned int n_old_frag_faces, unsigned int n_old_frag_cuts) const
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)
unsigned int numFaceNeighbors(unsigned int face_id) const
bool faceContainsTip(unsigned int face_id) const
EFAFace * getAdjacentFace(unsigned int face_id, unsigned int edge_id) const
std::set< EFANode * > getPhantomNodeOnFace(unsigned int face_id) const
virtual void printElement(std::ostream &ostream) const
std::vector< std::vector< EFAFace * > > _faces_adjacent_to_faces
const dof_id_type n_nodes