19 _nodes(_num_nodes, nullptr),
21 _crack_tip_split_element(false)
54 for (
const auto element_node :
_nodes)
55 if (element_node == node)
63 ostream <<
"***** nodes for element " <<
_id <<
" *****" << std::endl;
65 ostream <<
"addr " <<
_nodes[i] <<
", ID " <<
_nodes[i]->idCatString() <<
", category " 66 <<
_nodes[i]->category() << std::endl;
76 EFAError(
"In createLocalNodeFromGlobalNode node is not global");
78 EFANode * new_local_node =
nullptr;
79 unsigned int inode = 0;
80 for (; inode <
_nodes.size(); ++inode)
82 if (
_nodes[inode] == global_node)
89 EFAError(
"In createLocalNodeFromGlobalNode could not find global node");
91 return new_local_node;
99 EFAError(
"In getGlobalNodeFromLocalNode node passed in is not local");
105 EFAError(
"In getGlobalNodeFromLocalNode, the node stored by the element is not global");
118 EFAError(
"In EFAelement::getLocalNodeIndex, cannot find the given node");
145 EFAError(
"in getCrackTipNeighbor index out of bounds");
154 bool crack_tip_neighbor_exist =
false;
159 crack_tip_neighbor_exist =
true;
163 if (!crack_tip_neighbor_exist)
179 EFAError(
"child_id out of bounds");
209 const std::map<
EFANode *, std::set<EFAElement *>> & inverse_connectivity)
212 std::set<EFAElement *> patch_elements;
213 for (
unsigned int inode = 0; inode <
_num_nodes; ++inode)
215 auto it = inverse_connectivity.find(
_nodes[inode]);
216 if (it != inverse_connectivity.end())
217 patch_elements.insert(it->second.begin(), it->second.end());
220 std::set<EFAElement *>::iterator eit2;
221 for (eit2 = patch_elements.begin(); eit2 != patch_elements.end(); ++eit2)
224 if (neigh_elem !=
this)
243 EFANode *& childOfNeighborNode,
245 std::map<unsigned int, EFANode *> & PermanentNodes,
246 std::map<unsigned int, EFANode *> & TempNodes)
250 EFAError(
"no getParent element for child element ",
_id,
" in mergeNodes");
253 if (childNode != childOfNeighborNode)
259 if (childOfNeighborNode->
parent() == childNode)
261 childOfNeighborElem->
switchNode(childNode, childOfNeighborNode,
true);
264 EFAError(
"Attempted to delete node: ",
265 childOfNeighborNode->
id(),
266 " from PermanentNodes, but couldn't find it");
268 childOfNeighborNode = childNode;
270 else if (childNode->
parent() == childOfNeighborNode)
272 childElem->
switchNode(childOfNeighborNode, childNode,
true);
275 EFAError(
"Attempted to delete node: ",
277 " from PermanentNodes, but couldn't find it");
279 childNode = childOfNeighborNode;
281 else if (childNode->
parent() !=
nullptr &&
285 childOfNeighborElem->
switchNode(childNode, childOfNeighborNode,
true);
287 childOfNeighborNode))
289 EFAError(
"Attempted to delete node: ",
290 childOfNeighborNode->
id(),
291 " from PermanentNodes, but couldn't find it");
293 childOfNeighborNode = childNode;
297 EFAError(
"Attempting to merge nodes: ",
300 childOfNeighborNode->
id(),
301 " but both are permanent themselves");
306 if (childOfNeighborNode->
parent() != childNode &&
309 EFAError(
"Attempting to merge nodes ",
313 " but neither the 2nd node nor its parent is parent of the 1st");
315 childOfNeighborElem->
switchNode(childNode, childOfNeighborNode,
true);
317 EFAError(
"Attempted to delete node: ",
318 childOfNeighborNode->
id(),
319 " from TempNodes, but couldn't find it");
320 childOfNeighborNode = childNode;
325 if (childNode->
parent() != childOfNeighborNode &&
328 EFAError(
"Attempting to merge nodes ",
331 childOfNeighborNode->
id(),
332 " but neither the 2nd node nor its parent is parent of the 1st");
334 childElem->
switchNode(childOfNeighborNode, childNode,
true);
337 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
338 childNode = childOfNeighborNode;
345 PermanentNodes.insert(std::make_pair(new_node_id, newNode));
347 childOfNeighborElem->
switchNode(newNode, childOfNeighborNode,
true);
348 childElem->
switchNode(newNode, childNode,
true);
350 if (childNode->
parent() != childOfNeighborNode->
parent())
352 EFAError(
"Attempting to merge nodes ",
355 childOfNeighborNode->
id(),
356 " but they don't share a common parent");
360 EFAError(
"Attempted to delete node: ",
361 childOfNeighborNode->
id(),
362 " from TempNodes, but couldn't find it");
365 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
366 childOfNeighborNode = newNode;
void clearParentAndChildren()
bool isCrackTipSplit() const
unsigned int numChildren() const
unsigned int numCrackTipNeighbors() const
unsigned int getNewID(std::map< unsigned int, T *> &theMap)
std::string idCatString()
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const =0
bool deleteFromMap(std::map< unsigned int, T *> &theMap, T *elemToDelete, bool delete_elem=true)
EFAElement(unsigned int eid, unsigned int n_nodes)
void addChild(EFAElement *child)
unsigned int numGeneralNeighbors() const
bool containsNode(EFANode *node) const
EFANode * getGlobalNodeFromLocalNode(const EFANode *local_node) const
EFAElement * getChild(unsigned int child_id) const
const dof_id_type n_nodes
std::vector< EFANode * > _nodes
unsigned int getCrackTipNeighbor(unsigned int index) const
void printNodes(std::ostream &ostream) const
void setParent(EFAElement *parent)
void findGeneralNeighbors(const std::map< EFANode *, std::set< EFAElement *>> &InverseConnectivity)
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)=0
EFANode * getNode(unsigned int node_id) const
EFAElement * getGeneralNeighbor(unsigned int index) const
void mergeNodes(EFANode *&childNode, EFANode *&childOfNeighborNode, EFAElement *childOfNeighborElem, std::map< unsigned int, EFANode *> &PermanentNodes, std::map< unsigned int, EFANode *> &TempNodes)
unsigned int getLocalNodeIndex(EFANode *node) const
EFANode * createLocalNodeFromGlobalNode(const EFANode *global_node) const
unsigned int numNodes() const
void addCrackTipNeighbor(EFAElement *neighbor_elem)
std::vector< EFAElement * > _general_neighbors
std::vector< EFAElement * > _children
EFAElement * getParent() const
bool _crack_tip_split_element
std::vector< unsigned int > _crack_tip_neighbors
void setNode(unsigned int node_id, EFANode *node)
N_CATEGORY category() const