https://mooseframework.inl.gov
Loading...
Searching...
No Matches
EFAElement2D.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 EFAEdge;
16class EFAFace;
17class EFAFaceNode;
18class EFAFragment2D;
19
21{
22public:
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
28
29private:
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
37public:
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);
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) const;
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;
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
130private:
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};
void addNodeCut(unsigned int node_id, EFANode *embedded_permanent_node, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &EmbeddedPermanentNodes)
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const
virtual unsigned int numFragments() const
EFAFragment2D * getFragment(unsigned int frag_id) const
virtual unsigned int numInteriorNodes() const
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)
void mapParametricCoordFrom1Dto2D(unsigned int edge_id, double xi_1d, std::vector< double > &para_coor) const
virtual bool shouldDuplicateForPhantomCorner()
std::vector< EFAPoint > _local_node_coor
void addEdgeCut(unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor)
bool fragmentEdgeAlreadyCut(unsigned int ElemEdgeID) const
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)
virtual bool isCrackTipElement() const
bool fragmentHasTipEdges() const
virtual unsigned int getNumCuts() const
std::vector< std::vector< EFAElement2D * > > _edge_neighbors
virtual void clearNeighbors()
EFAFaceNode * getInteriorNode(unsigned int interior_node_id) const
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)
virtual void updateFragmentNode()
virtual void fragmentSanityCheck(unsigned int n_old_frag_edges, unsigned int n_old_frag_cuts) const
virtual void restoreFragment(const EFAElement *const from_elem)
void setEdge(unsigned int edge_id, EFAEdge *edge)
std::vector< EFAFragment2D * > branchingSplit(std::map< unsigned int, EFANode * > &EmbeddedNodes)
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)
virtual bool isPartial() const
bool overlaysElement(const EFAElement2D *other_elem) const
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)
virtual void printElement(std::ostream &ostream) const
bool addFragmentEdgeCut(unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes)
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)
unsigned int getCrackTipSplitElementID() const
std::set< EFANode * > getPhantomNodeOnEdge(unsigned int edge_id) const
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
bool isEdgePhantom(unsigned int edge_id) const
virtual void neighborSanityCheck() const
EFANode * getTipEmbeddedNode() const
EFAEdge * getEdge(unsigned int edge_id) const
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const
unsigned int numEdges() const
bool getFragmentEdgeID(unsigned int elem_edge_id, unsigned int &frag_edge_id) const
void setLocalCoordinates()
std::set< EFANode * > getEdgeNodes(unsigned int edge_id) const
bool edgeContainsTip(unsigned int edge_id) const
std::vector< EFAFaceNode * > _interior_nodes
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const
EFAEdge * getFragmentEdge(unsigned int frag_id, unsigned int edge_id) const
unsigned int _num_edges
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * > > &InverseConnectivityMap)
virtual void switchEmbeddedNode(EFANode *new_node, EFANode *old_node)
std::vector< EFANode * > getCommonNodes(const EFAElement2D *other_elem) const
virtual void removePhantomEmbeddedNode()
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)
std::vector< EFAFragment2D * > _fragments
bool getEdgeNodeParametricCoordinate(EFANode *node, std::vector< double > &para_coor) const
void deleteInteriorNodes()
std::vector< EFAEdge * > _edges
unsigned int numEdgeNeighbors(unsigned int edge_id) const
virtual bool isFinalCut() const
EFAElement2D * getEdgeNeighbor(unsigned int edge_id, unsigned int neighbor_id) const
unsigned int getTipEdgeID() const
const dof_id_type n_nodes