34 std::map<unsigned int, EFANode *>::iterator mit;
38 mit->second =
nullptr;
43 mit->second =
nullptr;
48 mit->second =
nullptr;
53 mit->second =
nullptr;
55 std::map<unsigned int, EFAElement *>::iterator eit;
59 eit->second =
nullptr;
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;
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;
135 unsigned int num_nodes = quad.size();
136 unsigned int num_faces = 0;
137 if (num_nodes == 8 || num_nodes == 20 || num_nodes == 27)
139 else if (num_nodes == 4 || num_nodes == 10 || num_nodes == 14)
142 EFAError(
"In add3DElement element with id: ",
id,
" has invalid num_nodes");
144 std::map<unsigned int, EFAElement *>::iterator mit =
_elements.find(
id);
146 EFAError(
"In add3DElement element with id: ",
id,
" already exists");
149 _elements.insert(std::make_pair(
id, newElem));
151 for (
unsigned int j = 0;
j < num_nodes; ++
j)
154 std::map<unsigned int, EFANode *>::iterator mit =
_permanent_nodes.find(quad[
j]);
161 currNode = mit->second;
173 std::map<unsigned int, EFAElement *>::iterator eit;
209 EFAError(
"Could not find element with id: ", elemid,
" in addEdgeIntersection");
213 EFAError(
"addElemEdgeIntersection: elem ", elemid,
" is not of type EFAelement2D");
223 EFAError(
"Could not find element with id: ", elemid,
" in addElemNodeIntersection");
227 EFAError(
"addElemNodeIntersection: elem ", elemid,
" is not of type EFAelement2D");
236 unsigned int frag_edge_id,
242 EFAError(
"Could not find element with id: ", elemid,
" in addFragEdgeIntersection");
246 EFAError(
"addFragEdgeIntersection: elem ", elemid,
" is not of type EFAelement2D");
253 const std::vector<unsigned int> & edgeid,
254 const std::vector<double> & position)
259 EFAError(
"Could not find element with id: ", elemid,
" in addEdgeIntersection");
263 EFAError(
"addElemEdgeIntersection: elem ", elemid,
" is not of type EFAelement2D");
274 const std::vector<unsigned int> & ,
275 const std::vector<double> & )
284 std::map<unsigned int, EFAElement *>::iterator eit;
311 if (
id >= first_new_node_id)
326 std::map<unsigned int, EFANode *>::iterator mit;
330 mit->second =
nullptr;
337 mit->second =
nullptr;
340 std::map<unsigned int, EFAElement *>::iterator eit;
344 eit->second =
nullptr;
356 EFAError(
"Attempted to delete parent element: ",
358 " from _elements, but couldn't find it");
362 std::map<unsigned int, EFAElement *>::iterator eit;
367 for (
unsigned int j = 0;
j < curr_elem->
numNodes();
j++)
374 std::map<unsigned int, EFANode *>::iterator mit;
376 mit->second->removeParent();
381 mit->second =
nullptr;
403 std::map<unsigned int, EFAElement *> newChildElements;
406 std::map<unsigned int, EFAElement *>::iterator eit;
407 std::map<unsigned int, EFAElement *>::iterator ElementsEnd =
_elements.end();
408 for (eit =
_elements.begin(); eit != ElementsEnd; ++eit)
419 _elements.insert(newChildElements.begin(), newChildElements.end());
426 for (
unsigned int elem_iter = 0; elem_iter <
_child_elements.size(); elem_iter++)
447 throw std::runtime_error(
"_temp_nodes size > 0");
454 std::set<EFAElement *>::iterator sit;
466 for (
unsigned int elem_iter = 0; elem_iter <
_child_elements.size(); elem_iter++)
484 _ostream <<
"============================================================" 485 <<
"==================================================" << std::endl;
486 _ostream <<
" CutElemMesh Data" << std::endl;
487 _ostream <<
"============================================================" 488 <<
"==================================================" << std::endl;
489 _ostream <<
"Permanent Nodes:" << std::endl;
490 std::map<unsigned int, EFANode *>::iterator mit;
491 unsigned int counter = 0;
494 _ostream <<
" " << mit->second->id();
496 if (counter % 10 == 0)
500 _ostream <<
"Temp Nodes:" << std::endl;
504 _ostream <<
" " << mit->second->id();
506 if (counter % 10 == 0)
510 _ostream <<
"Embedded Nodes:" << std::endl;
514 _ostream <<
" " << mit->second->id();
516 if (counter % 10 == 0)
520 _ostream <<
"Embedded Permanent Nodes:" << std::endl;
524 _ostream <<
" " << mit->second->id();
526 if (counter % 10 == 0)
530 _ostream <<
"Parent Elements:" << std::endl;
536 if (counter % 10 == 0)
540 _ostream <<
"Child Elements:" << std::endl;
546 if (counter % 10 == 0)
550 _ostream <<
"Elements:" << std::endl;
553 <<
"| embedded nodes " 554 <<
"| edge neighbors " 556 <<
"| frag link ... " << std::endl;
557 _ostream <<
"------------------------------------------------------------" 558 <<
"--------------------------------------------------" << std::endl;
559 std::map<unsigned int, EFAElement *>::iterator eit;
570 std::map<unsigned int, EFAElement *>::iterator mit =
_elements.find(
id);
572 EFAError(
"in getElemByID() could not find element: ",
id);
579 unsigned int elem_id = std::numeric_limits<unsigned int>::max();
580 std::map<unsigned int, EFAElement *>::iterator eit;
584 unsigned int counter = 0;
585 for (
unsigned int i = 0; i < curr_elem->
numNodes(); ++i)
587 if (curr_elem->
getNode(i)->
id() == node_id[i])
590 if (counter == curr_elem->
numNodes())
592 elem_id = curr_elem->
id();
603 std::set<EFANode *> child_nodes;
606 const auto & nodes = child_element->getNodes();
607 child_nodes.insert(nodes.begin(), nodes.end());
611 std::map<EFANode *, EFANode *> isolate_parent_to_child;
612 for (
unsigned int i = 0; i <
_new_nodes.size(); ++i)
616 EFAError(
"a new permanent node must have a parent node!");
618 auto it = isolate_parent_to_child.lower_bound(parent_node);
619 if (it != isolate_parent_to_child.end() && it->first == parent_node)
622 if (child_nodes.count(parent_node) == 0)
623 isolate_parent_to_child.emplace_hint(it, parent_node,
_new_nodes[i]);
628 for (
const auto [parent_node, child_node] : isolate_parent_to_child)
void clearParentAndChildren()
void addEdgeCut(unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode *> &EmbeddedNodes, bool add_to_neighbor)
void addElemNodeIntersection(unsigned int elemid, unsigned int nodeid)
virtual void printElement(std::ostream &ostream) const =0
bool addFragmentEdgeCut(unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode *> &EmbeddedNodes)
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
void addElemEdgeIntersection(unsigned int elemid, unsigned int edgeid, double position)
unsigned int getNewID(std::map< unsigned int, T *> &theMap)
ElementFragmentAlgorithm(std::ostream &os)
Constructor.
void updateEdgeNeighbors()
void createChildElements()
EFAElement * add3DElement(const std::vector< unsigned int > &quad, unsigned int id)
void clearPotentialIsolatedNodes()
void connectFragments(bool mergeUncutVirtualEdges)
virtual bool isCrackTipElement() const =0
bool deleteFromMap(std::map< unsigned int, T *> &theMap, T *elemToDelete, bool delete_elem=true)
std::basic_ostream< charT, traits > * os
std::vector< EFAElement * > _child_elements
virtual unsigned int numFragments() const
std::vector< EFAElement * > _parent_elements
void updateTopology(bool mergeUncutVirtualEdges=true)
std::map< unsigned int, EFAElement * > _elements
unsigned int add2DElements(std::vector< std::vector< unsigned int >> &quads)
void updatePhysicalLinksAndFragments()
virtual void neighborSanityCheck() const =0
virtual void updateFragmentNode()=0
void addElemFaceIntersection(unsigned int elemid, unsigned int faceid, const std::vector< unsigned int > &edgeid, const std::vector< double > &position)
virtual void setupNeighbors(std::map< EFANode *, std::set< EFAElement *>> &InverseConnectivityMap)=0
bool addFragEdgeIntersection(unsigned int elemid, unsigned int frag_edge_id, double position)
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::map< unsigned int, EFANode * > _embedded_permanent_nodes
EFANode * getNode(unsigned int node_id) const
virtual void restoreFragment(const EFAElement *const from_elem)=0
~ElementFragmentAlgorithm()
std::set< EFAElement * > _crack_tip_elements
virtual void clearNeighbors()=0
void addFragFaceIntersection(unsigned int ElemID, unsigned int FragFaceID, const std::vector< unsigned int > &FragFaceEdgeID, const std::vector< double > &position)
std::vector< EFANode * > _new_nodes
void restoreFragmentInfo(EFAElement *const elem, const EFAElement *const from_elem)
unsigned int getElemIdByNodes(unsigned int *node_id)
std::map< EFANode *, std::set< EFAElement * > > _inverse_connectivity
EFAElement * add2DElement(const std::vector< unsigned int > &quad, unsigned int id)
std::map< unsigned int, EFANode * > _temp_nodes
void addNodeCut(unsigned int node_id, EFANode *embedded_permanent_node, std::map< unsigned int, EFANode *> &PermanentNodes, std::map< unsigned int, EFANode *> &EmbeddedPermanentNodes)
EFAElement * getElemByID(unsigned int id)
virtual void updateFragments(const std::set< EFAElement *> &CrackTipElements, std::map< unsigned int, EFANode *> &EmbeddedNodes)=0
void updateCrackTipElements()
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
unsigned int numNodes() const
std::map< unsigned int, EFANode * > _embedded_nodes
std::map< unsigned int, EFANode * > _permanent_nodes
void initCrackTipTopology()
void setNode(unsigned int node_id, EFANode *node)
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)