www.mooseframework.org
EFAElement2D.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 EFAEdge;
16 class EFAFace;
17 class EFAFaceNode;
18 class EFAFragment2D;
19 
20 class EFAElement2D : public EFAElement
21 {
22 public:
23  EFAElement2D(unsigned int eid, unsigned int n_nodes);
24  EFAElement2D(const EFAElement2D * from_elem, bool convert_to_local);
25  EFAElement2D(const EFAFace * from_face);
26 
27  ~EFAElement2D();
28 
29 private:
30  unsigned int _num_edges;
31  std::vector<EFAEdge *> _edges;
32  std::vector<EFAFaceNode *> _interior_nodes;
33  std::vector<std::vector<EFAElement2D *>> _edge_neighbors;
34  std::vector<EFAFragment2D *> _fragments;
35  std::vector<EFAPoint> _local_node_coor;
36 
37 public:
38  // override virtual methods in base class
39  virtual unsigned int numFragments() const;
40  virtual bool isPartial() const;
41  virtual void getNonPhysicalNodes(std::set<EFANode *> & non_physical_nodes) const;
42 
43  virtual void switchNode(EFANode * new_node, EFANode * old_node, bool descend_to_parent);
44  virtual void switchEmbeddedNode(EFANode * new_node, EFANode * old_node);
45  virtual void updateFragmentNode();
46  virtual void getMasterInfo(EFANode * node,
47  std::vector<EFANode *> & master_nodes,
48  std::vector<double> & master_weights) const;
49  virtual unsigned int numInteriorNodes() const;
50 
51  bool overlaysElement(const EFAElement2D * other_elem) const;
52  virtual unsigned int getNeighborIndex(const EFAElement * neighbor_elem) const;
53  virtual void clearNeighbors();
54  virtual void setupNeighbors(std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap);
55  virtual void neighborSanityCheck() const;
56 
57  virtual void initCrackTip(std::set<EFAElement *> & CrackTipElements);
58  virtual bool shouldDuplicateForCrackTip(const std::set<EFAElement *> & CrackTipElements);
59  virtual bool shouldDuplicateCrackTipSplitElement(const std::set<EFAElement *> & CrackTipElements);
60  virtual bool shouldDuplicateForPhantomCorner();
61  virtual bool willCrackTipExtend(std::vector<unsigned int> & split_neighbors) const;
62  virtual bool isCrackTipElement() const;
63 
64  virtual unsigned int getNumCuts() const;
65  virtual bool isFinalCut() const;
66  virtual void updateFragments(const std::set<EFAElement *> & CrackTipElements,
67  std::map<unsigned int, EFANode *> & EmbeddedNodes);
68  virtual void fragmentSanityCheck(unsigned int n_old_frag_edges,
69  unsigned int n_old_frag_cuts) const;
70  virtual void restoreFragment(const EFAElement * const from_elem);
71 
72  virtual void createChild(const std::set<EFAElement *> & CrackTipElements,
73  std::map<unsigned int, EFAElement *> & Elements,
74  std::map<unsigned int, EFAElement *> & newChildElements,
75  std::vector<EFAElement *> & ChildElements,
76  std::vector<EFAElement *> & ParentElements,
77  std::map<unsigned int, EFANode *> & TempNodes);
78  virtual void removePhantomEmbeddedNode();
79  virtual void
80  connectNeighbors(std::map<unsigned int, EFANode *> & PermanentNodes,
81  std::map<unsigned int, EFANode *> & TempNodes,
82  std::map<EFANode *, std::set<EFAElement *>> & InverseConnectivityMap,
83  bool merge_phantom_edges);
84  virtual void printElement(std::ostream & ostream);
85 
86  // EFAelement2D specific methods
87  EFAFragment2D * getFragment(unsigned int frag_id) const;
88  std::set<EFANode *> getEdgeNodes(unsigned int edge_id) const;
89  bool getEdgeNodeParametricCoordinate(EFANode * node, std::vector<double> & para_coor) const;
90  EFAFaceNode * getInteriorNode(unsigned int interior_node_id) const;
91  void deleteInteriorNodes();
92 
93  unsigned int numEdges() const;
94  void setEdge(unsigned int edge_id, EFAEdge * edge);
95  void createEdges();
96  EFAEdge * getEdge(unsigned int edge_id) const;
97 
98  EFAEdge * getFragmentEdge(unsigned int frag_id, unsigned int edge_id) const;
99  std::set<EFANode *> getPhantomNodeOnEdge(unsigned int edge_id) const;
100  bool getFragmentEdgeID(unsigned int elem_edge_id, unsigned int & frag_edge_id) const;
101  bool isEdgePhantom(unsigned int edge_id) const;
102 
103  unsigned int numEdgeNeighbors(unsigned int edge_id) const;
104  EFAElement2D * getEdgeNeighbor(unsigned int edge_id, unsigned int neighbor_id) const;
105 
106  unsigned int getCrackTipSplitElementID() const;
107 
108  bool fragmentHasTipEdges() const;
109  unsigned int getTipEdgeID() const;
110  EFANode * getTipEmbeddedNode() const;
111  bool edgeContainsTip(unsigned int edge_id) const;
112  bool fragmentEdgeAlreadyCut(unsigned int ElemEdgeID) const;
113 
114  void addEdgeCut(unsigned int edge_id,
115  double position,
116  EFANode * embedded_node,
117  std::map<unsigned int, EFANode *> & EmbeddedNodes,
118  bool add_to_neighbor);
119  void addNodeCut(unsigned int node_id,
120  EFANode * embedded_permanent_node,
121  std::map<unsigned int, EFANode *> & PermanentNodes,
122  std::map<unsigned int, EFANode *> & EmbeddedPermanentNodes);
123  bool addFragmentEdgeCut(unsigned int frag_edge_id,
124  double position,
125  std::map<unsigned int, EFANode *> & EmbeddedNodes);
126  std::vector<EFAFragment2D *> branchingSplit(std::map<unsigned int, EFANode *> & EmbeddedNodes);
127 
128  std::vector<EFANode *> getCommonNodes(const EFAElement2D * other_elem) const;
129 
130 private:
131  // given the 1D parent coord of a point in an 2D element edge, translate it to 2D parametric
132  // coords
133  void mapParametricCoordFrom1Dto2D(unsigned int edge_id,
134  double xi_1d,
135  std::vector<double> & para_coor) const;
136  void setLocalCoordinates();
137 };
138 
EFAElement2D::restoreFragment
virtual void restoreFragment(const EFAElement *const from_elem)
Definition: EFAElement2D.C:944
EFAPoint.h
EFAElement2D::switchNode
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)
Definition: EFAElement2D.C:262
EFAElement2D::fragmentHasTipEdges
bool fragmentHasTipEdges() const
Definition: EFAElement2D.C:1581
EFAElement2D::setupNeighbors
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap)
Definition: EFAElement2D.C:467
EFAElement2D::shouldDuplicateCrackTipSplitElement
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)
Definition: EFAElement2D.C:639
EFAElement2D::addFragmentEdgeCut
bool addFragmentEdgeCut(unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes)
Definition: EFAElement2D.C:1837
EFAElement2D::getEdge
EFAEdge * getEdge(unsigned int edge_id) const
Definition: EFAElement2D.C:1475
EFAElement2D::setLocalCoordinates
void setLocalCoordinates()
Definition: EFAElement2D.C:141
EFAElement2D::isFinalCut
virtual bool isFinalCut() const
Definition: EFAElement2D.C:791
EFAElement
Definition: EFAElement.h:19
EFAElement2D::clearNeighbors
virtual void clearNeighbors()
Definition: EFAElement2D.C:459
EFAElement2D::removePhantomEmbeddedNode
virtual void removePhantomEmbeddedNode()
Definition: EFAElement2D.C:1151
EFAElement2D::_local_node_coor
std::vector< EFAPoint > _local_node_coor
Definition: EFAElement2D.h:35
EFAElement2D::_edges
std::vector< EFAEdge * > _edges
Definition: EFAElement2D.h:31
EFAElement2D::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: EFAElement2D.C:985
EFAElement2D::getMasterInfo
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
Definition: EFAElement2D.C:300
EFAElement2D::shouldDuplicateForCrackTip
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)
Definition: EFAElement2D.C:615
EFAElement.h
EFAElement2D::overlaysElement
bool overlaysElement(const EFAElement2D *other_elem) const
Definition: EFAElement2D.C:359
EFAElement2D::~EFAElement2D
~EFAElement2D()
Definition: EFAElement2D.C:104
EFAElement2D::createEdges
void createEdges()
Definition: EFAElement2D.C:1459
EFAElement2D::getEdgeNeighbor
EFAElement2D * getEdgeNeighbor(unsigned int edge_id, unsigned int neighbor_id) const
Definition: EFAElement2D.C:1572
EFAElement2D::numEdgeNeighbors
unsigned int numEdgeNeighbors(unsigned int edge_id) const
Definition: EFAElement2D.C:1563
EFAElement2D::neighborSanityCheck
virtual void neighborSanityCheck() const
Definition: EFAElement2D.C:523
EFAElement2D::getPhantomNodeOnEdge
std::set< EFANode * > getPhantomNodeOnEdge(unsigned int edge_id) const
Definition: EFAElement2D.C:1490
EFAElement2D::isPartial
virtual bool isPartial() const
Definition: EFAElement2D.C:208
EFAElement2D::getNumCuts
virtual unsigned int getNumCuts() const
Definition: EFAElement2D.C:781
EFAElement2D::updateFragments
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)
Definition: EFAElement2D.C:810
EFAFaceNode
Definition: EFAFaceNode.h:14
EFAElement2D::getFragmentEdge
EFAEdge * getFragmentEdge(unsigned int frag_id, unsigned int edge_id) const
Definition: EFAElement2D.C:1481
EFAFragment2D
Definition: EFAFragment2D.h:20
EFAElement2D::deleteInteriorNodes
void deleteInteriorNodes()
Definition: EFAElement2D.C:1439
EFAElement2D::branchingSplit
std::vector< EFAFragment2D * > branchingSplit(std::map< unsigned int, EFANode * > &EmbeddedNodes)
Definition: EFAElement2D.C:1916
EFAElement2D::getEdgeNodes
std::set< EFANode * > getEdgeNodes(unsigned int edge_id) const
Definition: EFAElement2D.C:1397
EFAElement2D::initCrackTip
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)
Definition: EFAElement2D.C:556
EFAElement2D::getNonPhysicalNodes
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const
Definition: EFAElement2D.C:235
EFAElement2D::_fragments
std::vector< EFAFragment2D * > _fragments
Definition: EFAElement2D.h:34
EFAElement2D::getCommonNodes
std::vector< EFANode * > getCommonNodes(const EFAElement2D *other_elem) const
Definition: EFAElement2D.C:2061
EFAElement2D::addEdgeCut
void addEdgeCut(unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor)
Definition: EFAElement2D.C:1710
EFAElement2D::isEdgePhantom
bool isEdgePhantom(unsigned int edge_id) const
Definition: EFAElement2D.C:1537
EFAElement2D::mapParametricCoordFrom1Dto2D
void mapParametricCoordFrom1Dto2D(unsigned int edge_id, double xi_1d, std::vector< double > &para_coor) const
Definition: EFAElement2D.C:2006
EFAElement2D::fragmentSanityCheck
virtual void fragmentSanityCheck(unsigned int n_old_frag_edges, unsigned int n_old_frag_cuts) const
Definition: EFAElement2D.C:871
EFAElement2D::getEdgeNodeParametricCoordinate
bool getEdgeNodeParametricCoordinate(EFANode *node, std::vector< double > &para_coor) const
Definition: EFAElement2D.C:1406
EFAElement2D::getCrackTipSplitElementID
unsigned int getCrackTipSplitElementID() const
Definition: EFAElement2D.C:594
EFAElement2D::switchEmbeddedNode
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)
Definition: EFAElement2D.C:289
EFAElement2D::getFragment
EFAFragment2D * getFragment(unsigned int frag_id) const
Definition: EFAElement2D.C:1388
EFAElement2D::_num_edges
unsigned int _num_edges
Definition: EFAElement2D.h:30
EFAElement2D::_edge_neighbors
std::vector< std::vector< EFAElement2D * > > _edge_neighbors
Definition: EFAElement2D.h:33
EFAElement2D::getInteriorNode
EFAFaceNode * getInteriorNode(unsigned int interior_node_id) const
Definition: EFAElement2D.C:1430
EFAElement2D::EFAElement2D
EFAElement2D(unsigned int eid, unsigned int n_nodes)
Definition: EFAElement2D.C:23
EFAElement2D::fragmentEdgeAlreadyCut
bool fragmentEdgeAlreadyCut(unsigned int ElemEdgeID) const
Definition: EFAElement2D.C:1690
EFAElement2D::isCrackTipElement
virtual bool isCrackTipElement() const
Definition: EFAElement2D.C:775
EFAFace
Definition: EFAFace.h:19
EFAElement2D::_interior_nodes
std::vector< EFAFaceNode * > _interior_nodes
Definition: EFAElement2D.h:32
EFAElement2D::shouldDuplicateForPhantomCorner
virtual bool shouldDuplicateForPhantomCorner()
Definition: EFAElement2D.C:690
EFAElement2D::getNeighborIndex
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const
Definition: EFAElement2D.C:447
EFAEdge
Definition: EFAEdge.h:16
EFANode
Definition: EFANode.h:14
EFAElement2D::setEdge
void setEdge(unsigned int edge_id, EFAEdge *edge)
Definition: EFAElement2D.C:1453
EFAElement2D::updateFragmentNode
virtual void updateFragmentNode()
Definition: EFAElement2D.C:1301
EFAElement2D::numFragments
virtual unsigned int numFragments() const
Definition: EFAElement2D.C:202
EFAElement2D::edgeContainsTip
bool edgeContainsTip(unsigned int edge_id) const
Definition: EFAElement2D.C:1669
EFAElement2D::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)
Definition: EFAElement2D.C:1171
EFAElement2D
Definition: EFAElement2D.h:20
EFAElement2D::printElement
virtual void printElement(std::ostream &ostream)
Definition: EFAElement2D.C:1312
EFAElement2D::getTipEmbeddedNode
EFANode * getTipEmbeddedNode() const
Definition: EFAElement2D.C:1636
EFAElement2D::numEdges
unsigned int numEdges() const
Definition: EFAElement2D.C:1447
EFAElement2D::addNodeCut
void addNodeCut(unsigned int node_id, EFANode *embedded_permanent_node, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &EmbeddedPermanentNodes)
Definition: EFAElement2D.C:1814
EFAElement2D::willCrackTipExtend
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const
Definition: EFAElement2D.C:729
EFAElement2D::getFragmentEdgeID
bool getFragmentEdgeID(unsigned int elem_edge_id, unsigned int &frag_edge_id) const
Definition: EFAElement2D.C:1514
EFAElement2D::numInteriorNodes
virtual unsigned int numInteriorNodes() const
Definition: EFAElement2D.C:353
EFAElement2D::getTipEdgeID
unsigned int getTipEdgeID() const
Definition: EFAElement2D.C:1608