#include <ElementFragmentAlgorithm.h>
|
| ElementFragmentAlgorithm (std::ostream &os) |
| Constructor. More...
|
|
| ~ElementFragmentAlgorithm () |
|
unsigned int | add2DElements (std::vector< std::vector< unsigned int >> &quads) |
|
EFAElement * | add2DElement (std::vector< unsigned int > quad, unsigned int id) |
|
EFAElement * | add3DElement (std::vector< unsigned int > quad, unsigned int id) |
|
void | updateEdgeNeighbors () |
|
void | initCrackTipTopology () |
|
void | addElemEdgeIntersection (unsigned int elemid, unsigned int edgeid, double position) |
|
void | addElemNodeIntersection (unsigned int elemid, unsigned int nodeid) |
|
bool | addFragEdgeIntersection (unsigned int elemid, unsigned int frag_edge_id, double position) |
|
void | addElemFaceIntersection (unsigned int elemid, unsigned int faceid, std::vector< unsigned int > edgeid, std::vector< double > position) |
|
void | addFragFaceIntersection (unsigned int ElemID, unsigned int FragFaceID, std::vector< unsigned int > FragFaceEdgeID, std::vector< double > position) |
|
void | updatePhysicalLinksAndFragments () |
|
void | updateTopology (bool mergeUncutVirtualEdges=true) |
|
void | reset () |
|
void | clearAncestry () |
|
void | restoreFragmentInfo (EFAElement *const elem, const EFAElement *const from_elem) |
|
void | createChildElements () |
|
void | connectFragments (bool mergeUncutVirtualEdges) |
|
void | sanityCheck () |
|
void | updateCrackTipElements () |
|
void | printMesh () |
|
void | error (const std::string &error_string) |
|
const std::vector< EFAElement * > & | getChildElements () |
|
const std::vector< EFAElement * > & | getParentElements () |
|
const std::vector< EFANode * > & | getNewNodes () |
|
const std::set< EFAElement * > & | getCrackTipElements () |
|
const std::map< unsigned int, EFANode * > & | getPermanentNodes () |
|
const std::map< unsigned int, EFANode * > & | getTempNodes () |
|
const std::map< unsigned int, EFANode * > & | getEmbeddedNodes () |
|
EFAElement * | getElemByID (unsigned int id) |
|
unsigned int | getElemIdByNodes (unsigned int *node_id) |
|
void | clearPotentialIsolatedNodes () |
|
Definition at line 19 of file ElementFragmentAlgorithm.h.
◆ ElementFragmentAlgorithm()
ElementFragmentAlgorithm::ElementFragmentAlgorithm |
( |
std::ostream & |
os | ) |
|
◆ ~ElementFragmentAlgorithm()
ElementFragmentAlgorithm::~ElementFragmentAlgorithm |
( |
| ) |
|
Definition at line 32 of file ElementFragmentAlgorithm.C.
34 std::map<unsigned int, EFANode *>::iterator mit;
55 std::map<unsigned int, EFAElement *>::iterator eit;
◆ add2DElement()
EFAElement * ElementFragmentAlgorithm::add2DElement |
( |
std::vector< unsigned int > |
quad, |
|
|
unsigned int |
id |
|
) |
| |
Definition at line 102 of file ElementFragmentAlgorithm.C.
104 unsigned int num_nodes = quad.size();
106 std::map<unsigned int, EFAElement *>::iterator mit =
_elements.find(
id);
108 EFAError(
"In add2DElement element with id: ",
id,
" already exists");
111 _elements.insert(std::make_pair(
id, newElem));
113 for (
unsigned int j = 0; j < num_nodes; ++j)
116 std::map<unsigned int, EFANode *>::iterator mit =
_permanent_nodes.find(quad[j]);
123 currNode = mit->second;
Referenced by XFEM::buildEFAMesh().
◆ add2DElements()
unsigned int ElementFragmentAlgorithm::add2DElements |
( |
std::vector< std::vector< unsigned int >> & |
quads | ) |
|
Definition at line 64 of file ElementFragmentAlgorithm.C.
66 unsigned int first_id = 0;
67 unsigned int num_nodes = quads[0].size();
69 if (quads.size() == 0)
70 EFAError(
"add2DElements called with empty vector of quads");
72 for (
unsigned int i = 0; i < quads.size(); ++i)
76 _elements.insert(std::make_pair(new_elem_id, newElem));
79 first_id = new_elem_id;
81 for (
unsigned int j = 0; j < num_nodes; ++j)
84 std::map<unsigned int, EFANode *>::iterator mit =
_permanent_nodes.find(quads[i][j]);
91 currNode = mit->second;
◆ add3DElement()
EFAElement * ElementFragmentAlgorithm::add3DElement |
( |
std::vector< unsigned int > |
quad, |
|
|
unsigned int |
id |
|
) |
| |
Definition at line 133 of file ElementFragmentAlgorithm.C.
135 unsigned int num_nodes = quad.size();
136 unsigned int num_faces = 0;
139 else if (num_nodes == 20)
141 else if (num_nodes == 8)
143 else if (num_nodes == 4)
145 else if (num_nodes == 10)
148 EFAError(
"In add3DElement element with id: ",
id,
" has invalid num_nodes");
150 std::map<unsigned int, EFAElement *>::iterator mit =
_elements.find(
id);
152 EFAError(
"In add3DElement element with id: ",
id,
" already exists");
155 _elements.insert(std::make_pair(
id, newElem));
157 for (
unsigned int j = 0; j < num_nodes; ++j)
160 std::map<unsigned int, EFANode *>::iterator mit =
_permanent_nodes.find(quad[j]);
167 currNode = mit->second;
Referenced by XFEM::buildEFAMesh().
◆ addElemEdgeIntersection()
void ElementFragmentAlgorithm::addElemEdgeIntersection |
( |
unsigned int |
elemid, |
|
|
unsigned int |
edgeid, |
|
|
double |
position |
|
) |
| |
◆ addElemFaceIntersection()
void ElementFragmentAlgorithm::addElemFaceIntersection |
( |
unsigned int |
elemid, |
|
|
unsigned int |
faceid, |
|
|
std::vector< unsigned int > |
edgeid, |
|
|
std::vector< double > |
position |
|
) |
| |
Definition at line 261 of file ElementFragmentAlgorithm.C.
267 std::map<unsigned int, EFAElement *>::iterator eit =
_elements.find(elemid);
269 EFAError(
"Could not find element with id: ", elemid,
" in addEdgeIntersection");
271 EFAElement3D * curr_elem = dynamic_cast<EFAElement3D *>(eit->second);
273 EFAError(
"addElemEdgeIntersection: elem ", elemid,
" is not of type EFAelement2D");
Referenced by XFEM::markCutFacesByGeometry().
◆ addElemNodeIntersection()
void ElementFragmentAlgorithm::addElemNodeIntersection |
( |
unsigned int |
elemid, |
|
|
unsigned int |
nodeid |
|
) |
| |
Definition at line 228 of file ElementFragmentAlgorithm.C.
231 std::map<unsigned int, EFAElement *>::iterator eit =
_elements.find(elemid);
233 EFAError(
"Could not find element with id: ", elemid,
" in addElemNodeIntersection");
235 EFAElement2D * curr_elem = dynamic_cast<EFAElement2D *>(eit->second);
237 EFAError(
"addElemNodeIntersection: elem ", elemid,
" is not of type EFAelement2D");
Referenced by XFEM::markCutEdgesByGeometry().
◆ addFragEdgeIntersection()
bool ElementFragmentAlgorithm::addFragEdgeIntersection |
( |
unsigned int |
elemid, |
|
|
unsigned int |
frag_edge_id, |
|
|
double |
position |
|
) |
| |
◆ addFragFaceIntersection()
void ElementFragmentAlgorithm::addFragFaceIntersection |
( |
unsigned int |
ElemID, |
|
|
unsigned int |
FragFaceID, |
|
|
std::vector< unsigned int > |
FragFaceEdgeID, |
|
|
std::vector< double > |
position |
|
) |
| |
◆ clearAncestry()
void ElementFragmentAlgorithm::clearAncestry |
( |
| ) |
|
Definition at line 367 of file ElementFragmentAlgorithm.C.
373 EFAError(
"Attempted to delete parent element: ",
375 " from _elements, but couldn't find it");
379 std::map<unsigned int, EFAElement *>::iterator eit;
384 for (
unsigned int j = 0; j < curr_elem->
numNodes(); j++)
391 std::map<unsigned int, EFANode *>::iterator mit;
393 mit->second->removeParent();
◆ clearPotentialIsolatedNodes()
void ElementFragmentAlgorithm::clearPotentialIsolatedNodes |
( |
| ) |
|
Definition at line 622 of file ElementFragmentAlgorithm.C.
625 std::map<EFANode *, std::vector<EFANode *>> isolate_parent_to_child;
626 for (
unsigned int i = 0; i <
_new_nodes.size(); ++i)
630 EFAError(
"a new permanent node must have a parent node!");
631 bool isParentNodeInNewElem =
false;
636 isParentNodeInNewElem =
true;
640 if (!isParentNodeInNewElem)
641 isolate_parent_to_child[parent_node].push_back(
_new_nodes[i]);
646 std::map<EFANode *, std::vector<EFANode *>>::iterator mit;
647 for (mit = isolate_parent_to_child.begin(); mit != isolate_parent_to_child.end(); ++mit)
649 EFANode * parent_node = mit->first;
650 EFANode * child_node = (mit->second)[0];
Referenced by updateTopology().
◆ connectFragments()
void ElementFragmentAlgorithm::connectFragments |
( |
bool |
mergeUncutVirtualEdges | ) |
|
◆ createChildElements()
void ElementFragmentAlgorithm::createChildElements |
( |
| ) |
|
Definition at line 417 of file ElementFragmentAlgorithm.C.
420 std::map<unsigned int, EFAElement *> newChildElements;
423 std::map<unsigned int, EFAElement *>::iterator eit;
424 std::map<unsigned int, EFAElement *>::iterator ElementsEnd =
_elements.end();
425 for (eit =
_elements.begin(); eit != ElementsEnd; ++eit)
436 _elements.insert(newChildElements.begin(), newChildElements.end());
Referenced by updateTopology().
◆ error()
void ElementFragmentAlgorithm::error |
( |
const std::string & |
error_string | ) |
|
◆ getChildElements()
const std::vector<EFAElement *>& ElementFragmentAlgorithm::getChildElements |
( |
| ) |
|
|
inline |
◆ getCrackTipElements()
const std::set<EFAElement *>& ElementFragmentAlgorithm::getCrackTipElements |
( |
| ) |
|
|
inline |
◆ getElemByID()
EFAElement * ElementFragmentAlgorithm::getElemByID |
( |
unsigned int |
id | ) |
|
◆ getElemIdByNodes()
unsigned int ElementFragmentAlgorithm::getElemIdByNodes |
( |
unsigned int * |
node_id | ) |
|
Definition at line 599 of file ElementFragmentAlgorithm.C.
601 unsigned int elem_id = 99999;
602 std::map<unsigned int, EFAElement *>::iterator eit;
607 for (
unsigned int i = 0; i < curr_elem->
numNodes(); ++i)
609 if (curr_elem->
getNode(i)->
id() == node_id[i])
614 elem_id = curr_elem->
id();
◆ getEmbeddedNodes()
const std::map<unsigned int, EFANode *>& ElementFragmentAlgorithm::getEmbeddedNodes |
( |
| ) |
|
|
inline |
◆ getNewNodes()
const std::vector<EFANode *>& ElementFragmentAlgorithm::getNewNodes |
( |
| ) |
|
|
inline |
◆ getParentElements()
const std::vector<EFAElement *>& ElementFragmentAlgorithm::getParentElements |
( |
| ) |
|
|
inline |
◆ getPermanentNodes()
const std::map<unsigned int, EFANode *>& ElementFragmentAlgorithm::getPermanentNodes |
( |
| ) |
|
|
inline |
◆ getTempNodes()
const std::map<unsigned int, EFANode *>& ElementFragmentAlgorithm::getTempNodes |
( |
| ) |
|
|
inline |
◆ initCrackTipTopology()
void ElementFragmentAlgorithm::initCrackTipTopology |
( |
| ) |
|
◆ printMesh()
void ElementFragmentAlgorithm::printMesh |
( |
| ) |
|
Definition at line 504 of file ElementFragmentAlgorithm.C.
506 _ostream <<
"============================================================"
507 <<
"==================================================" << std::endl;
508 _ostream <<
" CutElemMesh Data" << std::endl;
509 _ostream <<
"============================================================"
510 <<
"==================================================" << std::endl;
511 _ostream <<
"Permanent Nodes:" << std::endl;
512 std::map<unsigned int, EFANode *>::iterator mit;
516 _ostream <<
" " << mit->second->id();
522 _ostream <<
"Temp Nodes:" << std::endl;
526 _ostream <<
" " << mit->second->id();
532 _ostream <<
"Embedded Nodes:" << std::endl;
536 _ostream <<
" " << mit->second->id();
542 _ostream <<
"Embedded Permanent Nodes:" << std::endl;
546 _ostream <<
" " << mit->second->id();
552 _ostream <<
"Parent Elements:" << std::endl;
562 _ostream <<
"Child Elements:" << std::endl;
572 _ostream <<
"Elements:" << std::endl;
575 <<
"| embedded nodes "
576 <<
"| edge neighbors "
578 <<
"| frag link ... " << std::endl;
579 _ostream <<
"------------------------------------------------------------"
580 <<
"--------------------------------------------------" << std::endl;
581 std::map<unsigned int, EFAElement *>::iterator eit;
Referenced by XFEM::cutMeshWithEFA(), and sanityCheck().
◆ reset()
void ElementFragmentAlgorithm::reset |
( |
| ) |
|
◆ restoreFragmentInfo()
void ElementFragmentAlgorithm::restoreFragmentInfo |
( |
EFAElement *const |
elem, |
|
|
const EFAElement *const |
from_elem |
|
) |
| |
◆ sanityCheck()
void ElementFragmentAlgorithm::sanityCheck |
( |
| ) |
|
◆ updateCrackTipElements()
void ElementFragmentAlgorithm::updateCrackTipElements |
( |
| ) |
|
◆ updateEdgeNeighbors()
void ElementFragmentAlgorithm::updateEdgeNeighbors |
( |
| ) |
|
◆ updatePhysicalLinksAndFragments()
void ElementFragmentAlgorithm::updatePhysicalLinksAndFragments |
( |
| ) |
|
◆ updateTopology()
void ElementFragmentAlgorithm::updateTopology |
( |
bool |
mergeUncutVirtualEdges = true | ) |
|
◆ _child_elements
std::vector<EFAElement *> ElementFragmentAlgorithm::_child_elements |
|
private |
◆ _crack_tip_elements
std::set<EFAElement *> ElementFragmentAlgorithm::_crack_tip_elements |
|
private |
◆ _deleted_nodes
std::vector<EFANode *> ElementFragmentAlgorithm::_deleted_nodes |
|
private |
◆ _elements
std::map<unsigned int, EFAElement *> ElementFragmentAlgorithm::_elements |
|
private |
Definition at line 36 of file ElementFragmentAlgorithm.h.
Referenced by add2DElement(), add2DElements(), add3DElement(), addElemEdgeIntersection(), addElemFaceIntersection(), addElemNodeIntersection(), addFragEdgeIntersection(), clearAncestry(), createChildElements(), getElemByID(), getElemIdByNodes(), initCrackTipTopology(), printMesh(), reset(), updateEdgeNeighbors(), updatePhysicalLinksAndFragments(), and ~ElementFragmentAlgorithm().
◆ _embedded_nodes
std::map<unsigned int, EFANode *> ElementFragmentAlgorithm::_embedded_nodes |
|
private |
◆ _embedded_permanent_nodes
std::map<unsigned int, EFANode *> ElementFragmentAlgorithm::_embedded_permanent_nodes |
|
private |
◆ _inverse_connectivity
std::map<EFANode *, std::set<EFAElement *> > ElementFragmentAlgorithm::_inverse_connectivity |
|
private |
◆ _new_nodes
std::vector<EFANode *> ElementFragmentAlgorithm::_new_nodes |
|
private |
◆ _ostream
std::ostream& ElementFragmentAlgorithm::_ostream |
|
private |
◆ _parent_elements
std::vector<EFAElement *> ElementFragmentAlgorithm::_parent_elements |
|
private |
◆ _permanent_nodes
std::map<unsigned int, EFANode *> ElementFragmentAlgorithm::_permanent_nodes |
|
private |
Definition at line 32 of file ElementFragmentAlgorithm.h.
Referenced by add2DElement(), add2DElements(), add3DElement(), addElemNodeIntersection(), clearAncestry(), clearPotentialIsolatedNodes(), connectFragments(), getPermanentNodes(), printMesh(), reset(), updateTopology(), and ~ElementFragmentAlgorithm().
◆ _temp_nodes
std::map<unsigned int, EFANode *> ElementFragmentAlgorithm::_temp_nodes |
|
private |
The documentation for this class was generated from the following files:
void connectFragments(bool mergeUncutVirtualEdges)
EFANode * getNode(unsigned int node_id) const
bool addFragmentEdgeCut(unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes)
void clearPotentialIsolatedNodes()
virtual void initCrackTip(std::set< EFAElement * > &CrackTipElements)=0
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 void restoreFragment(const EFAElement *const from_elem)=0
std::vector< EFAElement * > _child_elements
virtual void clearNeighbors()=0
virtual void printElement(std::ostream &ostream)=0
unsigned int numNodes() const
void setNode(unsigned int node_id, EFANode *node)
std::map< unsigned int, EFAElement * > _elements
std::map< unsigned int, EFANode * > _temp_nodes
void clearParentAndChildren()
virtual void updateFragments(const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes)=0
std::map< unsigned int, EFANode * > _permanent_nodes
void addEdgeCut(unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor)
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)
void createChildElements()
std::map< EFANode *, std::set< EFAElement * > > _inverse_connectivity
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap)=0
std::map< unsigned int, EFANode * > _embedded_nodes
std::map< unsigned int, EFANode * > _embedded_permanent_nodes
virtual bool isCrackTipElement() const =0
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
std::set< EFAElement * > _crack_tip_elements
virtual unsigned int numFragments() const
bool deleteFromMap(std::map< unsigned int, T * > &theMap, T *elemToDelete, bool delete_elem=true)
void addNodeCut(unsigned int node_id, EFANode *embedded_permanent_node, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &EmbeddedPermanentNodes)
unsigned int getNewID(std::map< unsigned int, T * > &theMap)
std::vector< EFAElement * > _parent_elements
void updateCrackTipElements()
virtual void neighborSanityCheck() const =0
std::vector< EFANode * > _new_nodes
virtual void updateFragmentNode()=0