#include <EFAElement3D.h>
|
| EFAElement3D (unsigned int eid, unsigned int n_nodes, unsigned int n_faces) |
|
| EFAElement3D (const EFAElement3D *from_elem, bool convert_to_local) |
|
| ~EFAElement3D () |
|
virtual unsigned int | numFragments () const |
|
virtual bool | isPartial () const |
|
virtual void | getNonPhysicalNodes (std::set< EFANode * > &non_physical_nodes) const |
|
virtual void | switchNode (EFANode *new_node, EFANode *old_node, bool descend_to_parent) |
|
virtual void | switchEmbeddedNode (EFANode *new_node, EFANode *old_node) |
|
virtual void | updateFragmentNode () |
|
virtual void | getMasterInfo (EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const |
|
virtual unsigned int | numInteriorNodes () const |
|
bool | overlaysElement (const EFAElement3D *other_elem) const |
|
virtual unsigned int | getNeighborIndex (const EFAElement *neighbor_elem) const |
|
virtual void | getNeighborEdgeIndex (const EFAElement3D *neighbor_elem, unsigned int face_id, unsigned int edge_id, unsigned int &neigh_face_id, unsigned int &neigh_edge_id) const |
|
virtual void | clearNeighbors () |
|
virtual void | setupNeighbors (std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivityMap) |
|
virtual void | neighborSanityCheck () const |
|
virtual void | initCrackTip (std::set< EFAElement * > &CrackTipElements) |
|
virtual bool | shouldDuplicateForCrackTip (const std::set< EFAElement * > &CrackTipElements) |
|
virtual bool | shouldDuplicateCrackTipSplitElement (const std::set< EFAElement * > &CrackTipElements) |
|
virtual bool | shouldDuplicateForPhantomCorner () |
|
virtual bool | willCrackTipExtend (std::vector< unsigned int > &split_neighbors) const |
|
virtual bool | isCrackTipElement () const |
|
virtual unsigned int | getNumCuts () const |
|
virtual bool | isFinalCut () const |
|
virtual void | updateFragments (const std::set< EFAElement * > &CrackTipElements, std::map< unsigned int, EFANode * > &EmbeddedNodes) |
|
virtual void | fragmentSanityCheck (unsigned int n_old_frag_faces, unsigned int n_old_frag_cuts) const |
|
virtual void | restoreFragment (const EFAElement *const from_elem) |
|
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) |
|
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_faces) |
|
virtual void | printElement (std::ostream &ostream) |
|
EFAFragment3D * | getFragment (unsigned int frag_id) const |
|
std::set< EFANode * > | getFaceNodes (unsigned int face_id) const |
|
bool | getFaceNodeParametricCoordinates (EFANode *node, std::vector< double > &xi_3d) const |
|
EFAVolumeNode * | getInteriorNode (unsigned int interior_node_id) const |
|
void | removeEmbeddedNode (EFANode *emb_node, bool remove_for_neighbor) |
|
unsigned int | numFaces () const |
|
void | setFace (unsigned int face_id, EFAFace *face) |
|
void | createFaces () |
|
EFAFace * | getFace (unsigned int face_id) const |
|
unsigned int | getFaceID (EFAFace *face) const |
|
std::vector< unsigned int > | getCommonFaceID (const EFAElement3D *other_elem) const |
|
bool | getCommonEdgeID (const EFAElement3D *other_elem, std::vector< unsigned int > &face_id, std::vector< unsigned int > &edge_id) const |
|
unsigned int | getNeighborFaceNodeID (unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const |
|
unsigned int | getNeighborFaceInteriorNodeID (unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const |
|
unsigned int | getNeighborFaceEdgeID (unsigned int face_id, unsigned int edg_id, EFAElement3D *neighbor_elem) const |
|
void | findFacesAdjacentToFaces () |
|
EFAFace * | getAdjacentFace (unsigned int face_id, unsigned int edge_id) const |
|
EFAFace * | getFragmentFace (unsigned int frag_id, unsigned int face_id) const |
|
std::set< EFANode * > | getPhantomNodeOnFace (unsigned int face_id) const |
|
bool | getFragmentFaceID (unsigned int elem_face_id, unsigned int &frag_face_id) const |
|
bool | getFragmentFaceEdgeID (unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, unsigned int &FragFaceID, unsigned int &FragFaceEdgeID) const |
|
bool | isPhysicalEdgeCut (unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, double position) const |
|
bool | isFacePhantom (unsigned int face_id) const |
|
unsigned int | numFaceNeighbors (unsigned int face_id) const |
|
unsigned int | numEdgeNeighbors (unsigned int face_id, unsigned int edge_id) const |
|
EFAElement3D * | getFaceNeighbor (unsigned int face_id, unsigned int neighbor_id) const |
|
EFAElement3D * | getEdgeNeighbor (unsigned int face_id, unsigned int edge_id, unsigned int neighbor_id) const |
|
bool | fragmentHasTipFaces () const |
|
std::vector< unsigned int > | getTipFaceIDs () const |
|
std::set< EFANode * > | getTipEmbeddedNodes () const |
|
bool | faceContainsTip (unsigned int face_id) const |
|
bool | fragmentFaceAlreadyCut (unsigned int ElemFaceID) const |
|
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 | addFragFaceEdgeCut (unsigned int frag_face_id, unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor, bool add_to_adjacent) |
|
std::vector< EFANode * > | getCommonNodes (const EFAElement3D *other_elem) const |
|
unsigned int | id () const |
|
unsigned int | numNodes () const |
|
void | setNode (unsigned int node_id, EFANode *node) |
|
EFANode * | getNode (unsigned int node_id) const |
|
bool | containsNode (EFANode *node) const |
|
void | printNodes (std::ostream &ostream) const |
|
EFANode * | createLocalNodeFromGlobalNode (const EFANode *global_node) const |
|
EFANode * | getGlobalNodeFromLocalNode (const EFANode *local_node) const |
|
unsigned int | getLocalNodeIndex (EFANode *node) const |
|
void | setCrackTipSplit () |
|
bool | isCrackTipSplit () const |
|
unsigned int | numCrackTipNeighbors () const |
|
unsigned int | getCrackTipNeighbor (unsigned int index) const |
|
void | addCrackTipNeighbor (EFAElement *neighbor_elem) |
|
EFAElement * | getParent () const |
|
EFAElement * | getChild (unsigned int child_id) const |
|
void | setParent (EFAElement *parent) |
|
unsigned int | numChildren () const |
|
void | addChild (EFAElement *child) |
|
void | clearParentAndChildren () |
|
void | findGeneralNeighbors (std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivity) |
|
EFAElement * | getGeneralNeighbor (unsigned int index) const |
|
unsigned int | numGeneralNeighbors () const |
|
Definition at line 20 of file EFAElement3D.h.
◆ EFAElement3D() [1/2]
EFAElement3D::EFAElement3D |
( |
unsigned int |
eid, |
|
|
unsigned int |
n_nodes, |
|
|
unsigned int |
n_faces |
|
) |
| |
Definition at line 24 of file EFAElement3D.C.
39 EFAError(
"In EFAelement3D the supported TET element types are TET4 and TET10");
51 EFAError(
"In EFAelement3D the supported HEX element types are HEX8, HEX20 and HEX27");
54 EFAError(
"In EFAelement3D the supported element types are TET4, TET10, HEX8, HEX20 and HEX27");
Referenced by createChild().
◆ EFAElement3D() [2/2]
EFAElement3D::EFAElement3D |
( |
const EFAElement3D * |
from_elem, |
|
|
bool |
convert_to_local |
|
) |
| |
Definition at line 58 of file EFAElement3D.C.
77 EFAError(
"In EFAelement3D ",
79 " the copy constructor must have from_elem w/ global nodes. node: ",
82 from_elem->
_nodes[i]->category());
88 for (
unsigned int i = 0; i < from_elem->
_fragments.size(); ++i)
102 EFAError(
"In EFAelement3D copy constructor this elem's nodes must be local");
113 EFAError(
"this EFAelement3D constructor only converts global nodes to local nodes");
◆ ~EFAElement3D()
EFAElement3D::~EFAElement3D |
( |
| ) |
|
◆ addChild()
◆ addCrackTipNeighbor()
void EFAElement::addCrackTipNeighbor |
( |
EFAElement * |
neighbor_elem | ) |
|
|
inherited |
Definition at line 157 of file EFAElement.C.
162 bool crack_tip_neighbor_exist =
false;
167 crack_tip_neighbor_exist =
true;
171 if (!crack_tip_neighbor_exist)
◆ addFaceEdgeCut()
void EFAElement3D::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 |
|
) |
| |
Definition at line 1994 of file EFAElement3D.C.
2003 EFANode * local_embedded = NULL;
2007 local_embedded = embedded_node;
2011 unsigned int adj_face_id =
getFaceID(adj_face);
2015 bool cut_exist =
false;
2021 if (embedded_node && embedded_node != old_emb)
2022 EFAError(
"Attempting to add edge intersection when one already exists with different node.",
2029 local_embedded = old_emb;
2039 adj_face_id, adj_edge_id, position, edge_node1, embedded_node, local_embedded);
2041 if (!local_embedded)
2045 EmbeddedNodes.insert(std::make_pair(new_node_id, local_embedded));
2051 EFAError(
"element edge can't have >2 embedded nodes");
2055 unsigned int FragFaceID;
2056 unsigned int FragFaceEdgeID;
2061 double xi[2] = {-1.0, -1.0};
2064 double frag_pos = (position - xi[0]) / (xi[1] - xi[0]);
2068 frag_edge->
addIntersection(frag_pos, local_embedded, frag_edge_node1);
2072 if (add_to_adjacent)
2074 double adj_pos = 1.0 - position;
2076 adj_face_id, adj_edge_id, adj_pos, local_embedded, EmbeddedNodes,
false,
false);
2081 if (add_to_neighbor)
2083 for (
unsigned int en_iter = 0; en_iter <
numFaceNeighbors(face_id); ++en_iter)
2088 double neigh_pos = 1.0 - position;
2090 neigh_face_id, neigh_edge_id, neigh_pos, local_embedded, EmbeddedNodes,
false,
true);
2093 for (
unsigned int en_iter = 0; en_iter <
numEdgeNeighbors(face_id, edge_id); ++en_iter)
2096 unsigned int neigh_face_id, neigh_edge_id;
2103 neigh_pos = position;
2104 else if (
_faces[face_id]->getEdge(edge_id)->getNode(1) ==
2106 neigh_pos = 1.0 - position;
2108 EFAError(
"The EFANodes on commaon edge are not matched.");
2111 neigh_face_id, neigh_edge_id, neigh_pos, local_embedded, EmbeddedNodes,
false,
true);
Referenced by ElementFragmentAlgorithm::addElemFaceIntersection(), and addFaceEdgeCut().
◆ addFragFaceEdgeCut()
void EFAElement3D::addFragFaceEdgeCut |
( |
unsigned int |
frag_face_id, |
|
|
unsigned int |
frag_edge_id, |
|
|
double |
position, |
|
|
std::map< unsigned int, EFANode * > & |
EmbeddedNodes, |
|
|
bool |
add_to_neighbor, |
|
|
bool |
add_to_adjacent |
|
) |
| |
◆ checkNeighborFaceCut()
void EFAElement3D::checkNeighborFaceCut |
( |
unsigned int |
face_id, |
|
|
unsigned int |
edge_id, |
|
|
double |
position, |
|
|
EFANode * |
from_node, |
|
|
EFANode * |
embedded_node, |
|
|
EFANode *& |
local_embedded |
|
) |
| |
|
private |
Definition at line 2130 of file EFAElement3D.C.
2141 for (
unsigned int en_iter = 0; en_iter <
numFaceNeighbors(face_id); ++en_iter)
2153 if (embedded_node && embedded_node != old_emb)
2155 "attempting to add edge intersection when one already exists with different node.");
2156 if (local_embedded && local_embedded != old_emb)
2157 EFAError(
"attempting to assign contradictory pointer to local_embedded.");
2159 local_embedded = old_emb;
Referenced by addFaceEdgeCut().
◆ clearNeighbors()
void EFAElement3D::clearNeighbors |
( |
| ) |
|
|
virtual |
Implements EFAElement.
Definition at line 496 of file EFAElement3D.C.
499 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
502 for (
unsigned int edge_iter = 0; edge_iter <
_faces[face_iter]->numEdges(); ++edge_iter)
◆ clearParentAndChildren()
void EFAElement::clearParentAndChildren |
( |
| ) |
|
|
inherited |
◆ connectNeighbors()
void EFAElement3D::connectNeighbors |
( |
std::map< unsigned int, EFANode * > & |
PermanentNodes, |
|
|
std::map< unsigned int, EFANode * > & |
TempNodes, |
|
|
std::map< EFANode *, std::set< EFAElement * >> & |
InverseConnectivityMap, |
|
|
bool |
merge_phantom_faces |
|
) |
| |
|
virtual |
Implements EFAElement.
Definition at line 1141 of file EFAElement3D.C.
1148 EFAError(
"no parent element for child element ",
_id,
" in connect_neighbors");
1151 EFAError(
"cannot dynamic cast to parent3d in connect_neighbors");
1154 for (
unsigned int j = 0; j <
_num_faces; ++j)
1161 if (
_faces[j]->hasIntersection())
1163 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1166 dynamic_cast<EFAElement3D *>(NeighborElem->
getChild(l));
1167 if (!childOfNeighborElem)
1168 EFAError(
"dynamic cast childOfNeighborElem fails");
1171 EFAFace * neighborChildFace = childOfNeighborElem->
getFace(neighbor_face_id);
1172 if (
_faces[j]->equivalent(neighborChildFace))
1177 for (
unsigned int i = 0; i <
_faces[j]->numNodes(); ++i)
1179 unsigned int childNodeIndex = i;
1180 unsigned int neighborChildNodeIndex =
1184 EFANode * childOfNeighborNode = neighborChildFace->
getNode(neighborChildNodeIndex);
1186 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1191 unsigned int childNodeIndex = m;
1192 unsigned int neighborChildNodeIndex =
1195 EFANode * childNode =
_faces[j]->getInteriorFaceNode(childNodeIndex);
1196 EFANode * childOfNeighborNode =
1199 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1207 if (merge_phantom_faces)
1209 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1212 dynamic_cast<EFAElement3D *>(NeighborElem->
getChild(l));
1213 if (!childOfNeighborElem)
1214 EFAError(
"dynamic cast childOfNeighborElem fails");
1216 EFAFace * neighborChildFace = childOfNeighborElem->
getFace(neighbor_face_id);
1217 if (!neighborChildFace
1218 ->hasIntersection())
1222 if (
_faces[j]->equivalent(neighborChildFace))
1225 for (
unsigned int i = 0; i <
_faces[j]->numNodes(); ++i)
1227 unsigned int childNodeIndex = i;
1228 unsigned int neighborChildNodeIndex =
1232 EFANode * childOfNeighborNode = neighborChildFace->
getNode(neighborChildNodeIndex);
1234 if (childNode->
parent() != NULL &&
1239 childOfNeighborNode,
1240 childOfNeighborElem,
1253 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1261 std::set<EFAElement *> patch_elems = InverseConnectivityMap[childNode->
parent()];
1262 if (parent3d->
numFragments() == 1 && patch_elems.size() == 1)
1269 PermanentNodes.insert(std::make_pair(new_node_id, newNode));
1274 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
◆ containsNode()
bool EFAElement::containsNode |
( |
EFANode * |
node | ) |
const |
|
inherited |
Definition at line 52 of file EFAElement.C.
54 for (
unsigned int i = 0; i <
_nodes.size(); ++i)
Referenced by EFAElement2D::branchingSplit(), EFAElement2D::getEdgeNodeParametricCoordinate(), getFaceNodeParametricCoordinates(), EFAElement2D::getMasterInfo(), getMasterInfo(), EFAElement2D::getNonPhysicalNodes(), getNonPhysicalNodes(), EFAElement2D::getPhantomNodeOnEdge(), getPhantomNodeOnFace(), EFAElement2D::getTipEmbeddedNode(), EFAElement2D::isPartial(), isPartial(), EFAElement2D::printElement(), EFAElement2D::removePhantomEmbeddedNode(), removePhantomEmbeddedNode(), and willCrackTipExtend().
◆ createChild()
void EFAElement3D::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 |
|
) |
| |
|
virtual |
Implements EFAElement.
Definition at line 977 of file EFAElement3D.C.
985 EFAError(
"Element cannot have existing children in createChildElements");
990 EFAError(
"More than 2 fragments not yet supported");
993 ParentElements.push_back(
this);
994 for (
unsigned int ichild = 0; ichild <
_fragments.size(); ++ichild)
996 unsigned int new_elem_id;
997 if (newChildElements.size() == 0)
1003 newChildElements.insert(std::make_pair(new_elem_id, childElem));
1005 ChildElements.push_back(childElem);
1009 std::vector<std::vector<EFANode *>> cut_plane_nodes;
1015 std::vector<EFANode *> node_line;
1016 for (
unsigned int j = 0; j < face->
numNodes(); ++j)
1017 node_line.push_back(face->
getNode(j));
1018 cut_plane_nodes.push_back(node_line);
1022 std::vector<EFAPoint> cut_plane_points;
1027 if (cut_plane_nodes.size())
1029 for (
unsigned int i = 0; i < cut_plane_nodes[0].size(); ++i)
1031 std::vector<EFANode *> master_nodes;
1032 std::vector<double> master_weights;
1034 this->
getMasterInfo(cut_plane_nodes[0][i], master_nodes, master_weights);
1036 for (
unsigned int i = 0; i < master_nodes.size(); ++i)
1042 cut_plane_points.push_back(coor);
1044 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
1045 orig += cut_plane_points[i];
1046 orig /= cut_plane_points.size();
1049 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
1050 center += cut_plane_points[i];
1051 center /= cut_plane_points.size();
1053 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
1055 unsigned int iplus1 = i < cut_plane_points.size() - 1 ? i + 1 : 0;
1056 EFAPoint ray1 = cut_plane_points[i] - center;
1057 EFAPoint ray2 = cut_plane_points[iplus1] - center;
1058 normal += ray1.
cross(ray2);
1060 normal /= cut_plane_points.size();
1065 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1069 EFAPoint origin_to_point = p - orig;
1072 else if (origin_to_point * normal <
Xfem::tol)
1078 TempNodes.insert(std::make_pair(new_node_id, newNode));
1079 childElem->
setNode(j, newNode);
1089 for (
unsigned int j = 0; j <
_num_faces; ++j)
◆ createFaces()
void EFAElement3D::createFaces |
( |
| ) |
|
Definition at line 1454 of file EFAElement3D.C.
1457 int hex_local_node_indices[6][4] = {
1458 {0, 3, 2, 1}, {0, 1, 5, 4}, {1, 2, 6, 5}, {2, 3, 7, 6}, {3, 0, 4, 7}, {4, 5, 6, 7}};
1459 int tet_local_node_indices[4][3] = {{0, 2, 1}, {0, 1, 3}, {1, 2, 3}, {2, 0, 3}};
1461 int hex_interior_face_node_indices[6][5] = {{8, 9, 10, 11, 20},
1462 {8, 13, 16, 12, 21},
1463 {9, 14, 17, 13, 22},
1464 {10, 14, 18, 15, 23},
1465 {11, 15, 19, 12, 24},
1466 {16, 17, 18, 19, 25}};
1467 int tet_interior_face_node_indices[4][3] = {{4, 5, 6}, {4, 7, 8}, {5, 8, 9}, {6, 7, 9}};
1473 EFAError(
"num_faces of hexes must be 6");
1474 for (
unsigned int i = 0; i <
_num_faces; ++i)
1477 for (
unsigned int j = 0; j < 4; ++j)
1479 _faces[i]->createEdges();
1481 _faces[i]->setInteriorFaceNode(k,
_nodes[hex_interior_face_node_indices[i][k]]);
1487 EFAError(
"num_faces of tets must be 4");
1488 for (
unsigned int i = 0; i <
_num_faces; ++i)
1491 for (
unsigned int j = 0; j < 3; ++j)
1493 _faces[i]->createEdges();
1495 _faces[i]->setInteriorFaceNode(k,
_nodes[tet_interior_face_node_indices[i][k]]);
1499 EFAError(
"unknown 3D element type in createFaces()");
1501 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
1504 for (
unsigned int edge_iter = 0; edge_iter <
_faces[face_iter]->numEdges(); ++edge_iter)
Referenced by ElementFragmentAlgorithm::add3DElement(), and createChild().
◆ createLocalNodeFromGlobalNode()
EFANode * EFAElement::createLocalNodeFromGlobalNode |
( |
const EFANode * |
global_node | ) |
const |
|
inherited |
◆ faceContainsTip()
bool EFAElement3D::faceContainsTip |
( |
unsigned int |
face_id | ) |
const |
Definition at line 1953 of file EFAElement3D.C.
1955 bool contain_tip =
false;
1958 unsigned int num_frag_faces = 0;
1959 if (
_faces[face_id]->hasIntersection())
1961 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1964 num_frag_faces += 1;
1966 if (num_frag_faces == 2)
Referenced by fragmentFaceAlreadyCut().
◆ findFacesAdjacentToFaces()
void EFAElement3D::findFacesAdjacentToFaces |
( |
| ) |
|
◆ findGeneralNeighbors()
void EFAElement::findGeneralNeighbors |
( |
std::map< EFANode *, std::set< EFAElement * >> & |
InverseConnectivity | ) |
|
|
inherited |
Definition at line 216 of file EFAElement.C.
219 std::set<EFAElement *> patch_elements;
220 for (
unsigned int inode = 0; inode <
_num_nodes; ++inode)
222 std::set<EFAElement *> this_node_connected_elems = InverseConnectivity[
_nodes[inode]];
223 patch_elements.insert(this_node_connected_elems.begin(), this_node_connected_elems.end());
226 std::set<EFAElement *>::iterator eit2;
227 for (eit2 = patch_elements.begin(); eit2 != patch_elements.end(); ++eit2)
230 if (neigh_elem !=
this)
Referenced by EFAElement2D::setupNeighbors(), and setupNeighbors().
◆ fragmentFaceAlreadyCut()
bool EFAElement3D::fragmentFaceAlreadyCut |
( |
unsigned int |
ElemFaceID | ) |
const |
◆ fragmentHasTipFaces()
bool EFAElement3D::fragmentHasTipFaces |
( |
| ) |
const |
Definition at line 1872 of file EFAElement3D.C.
1874 bool has_tip_faces =
false;
1877 for (
unsigned int i = 0; i <
_num_faces; ++i)
1879 unsigned int num_frag_faces = 0;
1880 if (
_faces[i]->hasIntersection())
1882 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1885 num_frag_faces += 1;
1887 if (num_frag_faces == 2)
1889 has_tip_faces =
true;
1895 return has_tip_faces;
Referenced by fragmentSanityCheck(), and isCrackTipElement().
◆ fragmentSanityCheck()
void EFAElement3D::fragmentSanityCheck |
( |
unsigned int |
n_old_frag_faces, |
|
|
unsigned int |
n_old_frag_cuts |
|
) |
| const |
|
virtual |
Implements EFAElement.
Definition at line 916 of file EFAElement3D.C.
919 if (n_interior_nodes > 0 && n_interior_nodes != 1)
920 EFAError(
"After update_fragments this element has ", n_interior_nodes,
" interior nodes");
922 if (n_old_frag_cuts == 0)
925 EFAError(
"Incorrect link size for element with 0 cuts");
930 EFAError(
"Incorrect link size for element with crack-tip faces");
935 n_old_frag_faces + n_old_frag_cuts + 2)
936 EFAError(
"Incorrect link size for element that has been completely cut");
Referenced by updateFragments().
◆ getAdjacentFace()
EFAFace * EFAElement3D::getAdjacentFace |
( |
unsigned int |
face_id, |
|
|
unsigned int |
edge_id |
|
) |
| const |
◆ getChild()
EFAElement * EFAElement::getChild |
( |
unsigned int |
child_id | ) |
const |
|
inherited |
◆ getCommonEdgeID()
bool EFAElement3D::getCommonEdgeID |
( |
const EFAElement3D * |
other_elem, |
|
|
std::vector< unsigned int > & |
face_id, |
|
|
std::vector< unsigned int > & |
edge_id |
|
) |
| const |
Definition at line 1556 of file EFAElement3D.C.
1560 bool has_common_edge =
false;
1561 bool move_to_next_edge =
false;
1564 for (
unsigned int i = 0; i <
_num_faces; ++i)
1565 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
1567 move_to_next_edge =
false;
1568 for (
unsigned int k = 0; k < other_elem->
_num_faces; ++k)
1570 for (
unsigned int l = 0; l < other_elem->
_faces[k]->numEdges(); ++l)
1571 if ((
_faces[i]->getEdge(j)->equivalent(*(other_elem->
_faces[k]->getEdge(l)))) &&
1574 face_id.push_back(i);
1575 edge_id.push_back(j);
1576 move_to_next_edge =
true;
1577 has_common_edge =
true;
1581 if (move_to_next_edge)
1586 return has_common_edge;
Referenced by setupNeighbors().
◆ getCommonFaceID()
std::vector< unsigned int > EFAElement3D::getCommonFaceID |
( |
const EFAElement3D * |
other_elem | ) |
const |
◆ getCommonNodes()
Definition at line 2246 of file EFAElement3D.C.
2248 std::set<EFANode *> e1nodes(
_nodes.begin(),
2250 std::set<EFANode *> e2nodes(other_elem->
_nodes.begin(),
2253 return common_nodes;
◆ getCrackTipNeighbor()
unsigned int EFAElement::getCrackTipNeighbor |
( |
unsigned int |
index | ) |
const |
|
inherited |
Definition at line 148 of file EFAElement.C.
153 EFAError(
"in getCrackTipNeighbor index out of bounds");
◆ getEdgeNeighbor()
EFAElement3D * EFAElement3D::getEdgeNeighbor |
( |
unsigned int |
face_id, |
|
|
unsigned int |
edge_id, |
|
|
unsigned int |
neighbor_id |
|
) |
| const |
◆ getFace()
EFAFace * EFAElement3D::getFace |
( |
unsigned int |
face_id | ) |
const |
Definition at line 1513 of file EFAElement3D.C.
Referenced by addFaceEdgeCut(), checkNeighborFaceCut(), EFAFragment3D::combine_tip_faces(), XFEMCutElem3D::computePhysicalFaceAreaFraction(), connectNeighbors(), EFAFragment3D::EFAFragment3D(), faceContainsTip(), fragmentHasTipFaces(), getFragmentFace(), getFragmentFaceID(), getNeighborEdgeIndex(), getNeighborFaceEdgeID(), getNeighborFaceInteriorNodeID(), getNeighborFaceNodeID(), getTipEmbeddedNodes(), getTipFaceIDs(), EFAFragment3D::isFaceInterior(), isFacePhantom(), and shouldDuplicateForPhantomCorner().
◆ getFaceID()
unsigned int EFAElement3D::getFaceID |
( |
EFAFace * |
face | ) |
const |
Definition at line 1519 of file EFAElement3D.C.
1521 bool found_face_id =
false;
1522 unsigned int face_id;
1523 for (
unsigned int iface = 0; iface <
_num_faces; ++iface)
1525 if (
_faces[iface]->equivalent(face))
1528 found_face_id =
true;
1533 EFAError(
"input face not found in get_face_id()");
Referenced by addFaceEdgeCut(), and overlaysElement().
◆ getFaceNeighbor()
EFAElement3D * EFAElement3D::getFaceNeighbor |
( |
unsigned int |
face_id, |
|
|
unsigned int |
neighbor_id |
|
) |
| const |
◆ getFaceNodeParametricCoordinates()
bool EFAElement3D::getFaceNodeParametricCoordinates |
( |
EFANode * |
node, |
|
|
std::vector< double > & |
xi_3d |
|
) |
| const |
Definition at line 1390 of file EFAElement3D.C.
1393 unsigned int face_id = 99999;
1394 bool face_found =
false;
1395 for (
unsigned int i = 0; i <
_num_faces; ++i)
1406 std::vector<double> xi_2d(2, 0.0);
1407 if (
_faces[face_id]->getFaceNodeParametricCoords(node, xi_2d))
1410 EFAError(
"failed to get the 2D para coords on the face");
◆ getFaceNodes()
std::set< EFANode * > EFAElement3D::getFaceNodes |
( |
unsigned int |
face_id | ) |
const |
◆ getFragment()
EFAFragment3D * EFAElement3D::getFragment |
( |
unsigned int |
frag_id | ) |
const |
Definition at line 1372 of file EFAElement3D.C.
1377 EFAError(
"frag_id out of bounds");
Referenced by XFEMCutElem3D::computePhysicalFaceAreaFraction(), XFEMCutElem3D::computePhysicalVolumeFraction(), connectNeighbors(), createChild(), EFAFragment3D::EFAFragment3D(), XFEMCutElem3D::getCutPlaneNormal(), XFEMCutElem3D::getCutPlaneOrigin(), XFEM::getFragmentFaces(), XFEMCutElem3D::getIntersectionInfo(), XFEM::markCutFacesByGeometry(), XFEMCutElem3D::numCutPlanes(), setupNeighbors(), and willCrackTipExtend().
◆ getFragmentFace()
EFAFace * EFAElement3D::getFragmentFace |
( |
unsigned int |
frag_id, |
|
|
unsigned int |
face_id |
|
) |
| const |
◆ getFragmentFaceEdgeID()
bool EFAElement3D::getFragmentFaceEdgeID |
( |
unsigned int |
ElemFaceID, |
|
|
unsigned int |
ElemFaceEdgeID, |
|
|
unsigned int & |
FragFaceID, |
|
|
unsigned int & |
FragFaceEdgeID |
|
) |
| const |
◆ getFragmentFaceID()
bool EFAElement3D::getFragmentFaceID |
( |
unsigned int |
elem_face_id, |
|
|
unsigned int & |
frag_face_id |
|
) |
| const |
◆ getGeneralNeighbor()
EFAElement * EFAElement::getGeneralNeighbor |
( |
unsigned int |
index | ) |
const |
|
inherited |
◆ getGlobalNodeFromLocalNode()
EFANode * EFAElement::getGlobalNodeFromLocalNode |
( |
const EFANode * |
local_node | ) |
const |
|
inherited |
Definition at line 95 of file EFAElement.C.
99 EFAError(
"In getGlobalNodeFromLocalNode node passed in is not local");
105 EFAError(
"In getGlobalNodeFromLocalNode, the node stored by the element is not global");
◆ getInteriorNode()
EFAVolumeNode * EFAElement3D::getInteriorNode |
( |
unsigned int |
interior_node_id | ) |
const |
◆ getLocalNodeIndex()
unsigned int EFAElement::getLocalNodeIndex |
( |
EFANode * |
node | ) |
const |
|
inherited |
Definition at line 111 of file EFAElement.C.
113 unsigned int local_node_id = 99999;
114 bool found_local_node =
false;
119 found_local_node =
true;
124 if (!found_local_node)
125 EFAError(
"In EFAelement::getLocalNodeIndex, cannot find the given node");
126 return local_node_id;
Referenced by XFEM::getEFANodeCoords().
◆ getMasterInfo()
void EFAElement3D::getMasterInfo |
( |
EFANode * |
node, |
|
|
std::vector< EFANode * > & |
master_nodes, |
|
|
std::vector< double > & |
master_weights |
|
) |
| const |
|
virtual |
Implements EFAElement.
Definition at line 373 of file EFAElement3D.C.
378 master_nodes.clear();
379 master_weights.clear();
380 bool masters_found =
false;
385 masters_found =
_faces[i]->getMasterInfo(node, master_nodes, master_weights);
389 EFAError(
"In getMasterInfo: cannot find master nodes in element faces");
399 std::vector<double> xi_3d(3, -100.0);
400 for (
unsigned int j = 0; j < 3; ++j)
404 master_nodes.push_back(
_nodes[j]);
411 EFAError(
"unknown 3D element");
412 master_weights.push_back(weight);
414 masters_found =
true;
421 EFAError(
"In EFAelement3D::getMaterInfo, cannot find the given EFAnode");
Referenced by createChild(), and XFEMCutElem3D::getNodeCoordinates().
◆ getNeighborEdgeIndex()
void EFAElement3D::getNeighborEdgeIndex |
( |
const EFAElement3D * |
neighbor_elem, |
|
|
unsigned int |
face_id, |
|
|
unsigned int |
edge_id, |
|
|
unsigned int & |
neigh_face_id, |
|
|
unsigned int & |
neigh_edge_id |
|
) |
| const |
|
virtual |
Definition at line 469 of file EFAElement3D.C.
476 for (
unsigned int i = 0; i < neighbor_elem->
numFaces(); ++i)
478 for (
unsigned int j = 0; j < neighbor_elem->
getFace(i)->
numEdges(); ++j)
489 EFAError(
"in getNeighborEdgeIndex() element ",
491 " does not share a common edge with element",
492 neighbor_elem->
id());
Referenced by addFaceEdgeCut().
◆ getNeighborFaceEdgeID()
unsigned int EFAElement3D::getNeighborFaceEdgeID |
( |
unsigned int |
face_id, |
|
|
unsigned int |
edg_id, |
|
|
EFAElement3D * |
neighbor_elem |
|
) |
| const |
Definition at line 1651 of file EFAElement3D.C.
1656 bool found_id =
false;
1657 unsigned int neigh_face_edge_id;
1659 if (common_face_id == face_id)
1663 for (
unsigned int i = 0; i < neigh_face->
numEdges(); ++i)
1665 if (
_faces[face_id]->getEdge(edge_id)->equivalent(*neigh_face->
getEdge(i)))
1667 neigh_face_edge_id = i;
1674 EFAError(
"getNeighborFaceEdgeID: neighbor_elem is not a neighbor on face_id");
1676 EFAError(
"getNeighborFaceEdgeID: could not find neighbor face edge id");
1677 return neigh_face_edge_id;
Referenced by addFaceEdgeCut(), and checkNeighborFaceCut().
◆ getNeighborFaceInteriorNodeID()
unsigned int EFAElement3D::getNeighborFaceInteriorNodeID |
( |
unsigned int |
face_id, |
|
|
unsigned int |
node_id, |
|
|
EFAElement3D * |
neighbor_elem |
|
) |
| const |
Definition at line 1620 of file EFAElement3D.C.
1625 bool found_id =
false;
1626 unsigned int neigh_face_node_id;
1628 if (common_face_id == face_id)
1637 neigh_face_node_id = i;
1644 EFAError(
"getNeighborFaceNodeID: neighbor_elem is not a neighbor on face_id");
1646 EFAError(
"getNeighborFaceNodeID: could not find neighbor face node id");
1647 return neigh_face_node_id;
Referenced by connectNeighbors().
◆ getNeighborFaceNodeID()
unsigned int EFAElement3D::getNeighborFaceNodeID |
( |
unsigned int |
face_id, |
|
|
unsigned int |
node_id, |
|
|
EFAElement3D * |
neighbor_elem |
|
) |
| const |
Definition at line 1590 of file EFAElement3D.C.
1595 bool found_id =
false;
1596 unsigned int neigh_face_node_id;
1598 if (common_face_id == face_id)
1602 for (
unsigned int i = 0; i < neigh_face->
numNodes(); ++i)
1606 neigh_face_node_id = i;
1613 EFAError(
"getNeighborFaceNodeID: neighbor_elem is not a neighbor on face_id");
1615 EFAError(
"getNeighborFaceNodeID: could not find neighbor face node id");
1616 return neigh_face_node_id;
Referenced by connectNeighbors().
◆ getNeighborIndex()
unsigned int EFAElement3D::getNeighborIndex |
( |
const EFAElement * |
neighbor_elem | ) |
const |
|
virtual |
◆ getNode()
EFANode * EFAElement::getNode |
( |
unsigned int |
node_id | ) |
const |
|
inherited |
Definition at line 46 of file EFAElement.C.
Referenced by addFaceEdgeCut(), EFAElement2D::branchingSplit(), ElementFragmentAlgorithm::clearAncestry(), EFAElement2D::createChild(), EFAElement2D::getEdgeNodes(), ElementFragmentAlgorithm::getElemIdByNodes(), EFAElement2D::getMasterInfo(), getMasterInfo(), getNeighborFaceNodeID(), EFAElement2D::getPhantomNodeOnEdge(), getPhantomNodeOnFace(), EFAElement2D::getTipEmbeddedNode(), getTipEmbeddedNodes(), and EFAElement2D::overlaysElement().
◆ getNonPhysicalNodes()
void EFAElement3D::getNonPhysicalNodes |
( |
std::set< EFANode * > & |
non_physical_nodes | ) |
const |
|
virtual |
◆ getNumCuts()
unsigned int EFAElement3D::getNumCuts |
( |
| ) |
const |
|
virtual |
◆ getParent()
◆ getPhantomNodeOnFace()
std::set< EFANode * > EFAElement3D::getPhantomNodeOnFace |
( |
unsigned int |
face_id | ) |
const |
Definition at line 1715 of file EFAElement3D.C.
1717 std::set<EFANode *> phantom_nodes;
1720 for (
unsigned int j = 0; j <
_faces[face_id]->numNodes(); ++j)
1722 bool node_in_frag =
false;
1723 for (
unsigned int k = 0; k <
_fragments.size(); ++k)
1727 node_in_frag =
true;
1735 return phantom_nodes;
Referenced by shouldDuplicateForPhantomCorner().
◆ getTipEmbeddedNodes()
std::set< EFANode * > EFAElement3D::getTipEmbeddedNodes |
( |
| ) |
const |
Definition at line 1924 of file EFAElement3D.C.
1927 std::set<EFANode *> tip_emb;
1930 for (
unsigned int i = 0; i <
_num_faces; ++i)
1932 std::vector<EFAFace *> frag_faces;
1933 if (
_faces[i]->hasIntersection())
1935 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1938 frag_faces.push_back(
_fragments[0]->getFace(j));
1940 if (frag_faces.size() == 2)
1942 unsigned int edge_id = frag_faces[0]->adjacentCommonEdge(frag_faces[1]);
1943 tip_emb.insert(frag_faces[0]->getEdge(edge_id)->
getNode(0));
1944 tip_emb.insert(frag_faces[0]->getEdge(edge_id)->
getNode(1));
◆ getTipFaceIDs()
std::vector< unsigned int > EFAElement3D::getTipFaceIDs |
( |
| ) |
const |
Definition at line 1899 of file EFAElement3D.C.
1902 std::vector<unsigned int> tip_face_id;
1905 for (
unsigned int i = 0; i <
_num_faces; ++i)
1907 unsigned int num_frag_faces = 0;
1908 if (
_faces[i]->hasIntersection())
1910 for (
unsigned int j = 0; j <
_fragments[0]->numFaces(); ++j)
1913 num_frag_faces += 1;
1915 if (num_frag_faces == 2)
1916 tip_face_id.push_back(i);
◆ id()
unsigned int EFAElement::id |
( |
| ) |
const |
|
inherited |
◆ initCrackTip()
void EFAElement3D::initCrackTip |
( |
std::set< EFAElement * > & |
CrackTipElements | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 619 of file EFAElement3D.C.
623 CrackTipElements.insert(
this);
624 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
633 EFAError(
"Element has a neighbor that overlays itself");
637 EFAError(
"crack_tip_split_element already flagged. In elem: ",
◆ isCrackTipElement()
bool EFAElement3D::isCrackTipElement |
( |
| ) |
const |
|
virtual |
◆ isCrackTipSplit()
bool EFAElement::isCrackTipSplit |
( |
| ) |
const |
|
inherited |
◆ isFacePhantom()
bool EFAElement3D::isFacePhantom |
( |
unsigned int |
face_id | ) |
const |
Definition at line 1814 of file EFAElement3D.C.
1816 bool is_phantom =
false;
1819 bool contains_frag_face =
false;
1820 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
1822 for (
unsigned int j = 0; j <
_fragments[i]->numFaces(); ++j)
1826 contains_frag_face =
true;
1830 if (contains_frag_face)
1833 if (!contains_frag_face)
Referenced by XFEM::markCutFacesByGeometry().
◆ isFinalCut()
bool EFAElement3D::isFinalCut |
( |
| ) |
const |
|
virtual |
◆ isPartial()
bool EFAElement3D::isPartial |
( |
| ) |
const |
|
virtual |
◆ isPhysicalEdgeCut()
bool EFAElement3D::isPhysicalEdgeCut |
( |
unsigned int |
ElemFaceID, |
|
|
unsigned int |
ElemFaceEdgeID, |
|
|
double |
position |
|
) |
| const |
Definition at line 1789 of file EFAElement3D.C.
1793 unsigned int FragFaceID = 99999, FragFaceEdgeID = 99999;
1794 bool is_in_real =
false;
1801 EFAEdge * elem_edge =
_faces[ElemFaceID]->getEdge(ElemFaceEdgeID);
1803 double xi[2] = {-1.0, -1.0};
1806 if ((position - xi[0]) * (position - xi[1]) <
Referenced by addFaceEdgeCut().
◆ mapParametricCoordinateFrom2DTo3D()
void EFAElement3D::mapParametricCoordinateFrom2DTo3D |
( |
unsigned int |
face_id, |
|
|
std::vector< double > & |
xi_2d, |
|
|
std::vector< double > & |
xi_3d |
|
) |
| const |
|
private |
Definition at line 2165 of file EFAElement3D.C.
2170 xi_3d.resize(3, 0.0);
2175 xi_3d[0] = xi_2d[1];
2176 xi_3d[1] = xi_2d[0];
2179 else if (face_id == 1)
2181 xi_3d[0] = xi_2d[0];
2183 xi_3d[2] = xi_2d[1];
2185 else if (face_id == 2)
2188 xi_3d[1] = xi_2d[0];
2189 xi_3d[2] = xi_2d[1];
2191 else if (face_id == 3)
2193 xi_3d[0] = -xi_2d[0];
2195 xi_3d[2] = xi_2d[1];
2197 else if (face_id == 4)
2200 xi_3d[1] = -xi_2d[0];
2201 xi_3d[2] = xi_2d[1];
2203 else if (face_id == 5)
2205 xi_3d[0] = xi_2d[0];
2206 xi_3d[1] = xi_2d[1];
2210 EFAError(
"face_id out of bounds");
2216 xi_3d[0] = xi_2d[0];
2217 xi_3d[1] = xi_2d[1];
2220 else if (face_id == 1)
2223 xi_3d[1] = xi_2d[0];
2224 xi_3d[2] = xi_2d[1];
2226 else if (face_id == 2)
2228 xi_3d[0] = xi_2d[1];
2230 xi_3d[2] = xi_2d[0];
2232 else if (face_id == 3)
2234 xi_3d[0] = xi_2d[0];
2235 xi_3d[1] = xi_2d[2];
2236 xi_3d[2] = xi_2d[1];
2239 EFAError(
"face_id out of bounds");
2242 EFAError(
"unknown element for 3D");
Referenced by getFaceNodeParametricCoordinates().
◆ mergeNodes()
void EFAElement::mergeNodes |
( |
EFANode *& |
childNode, |
|
|
EFANode *& |
childOfNeighborNode, |
|
|
EFAElement * |
childOfNeighborElem, |
|
|
std::map< unsigned int, EFANode * > & |
PermanentNodes, |
|
|
std::map< unsigned int, EFANode * > & |
TempNodes |
|
) |
| |
|
protectedinherited |
Definition at line 248 of file EFAElement.C.
256 EFAError(
"no getParent element for child element ",
_id,
" in mergeNodes");
259 if (childNode != childOfNeighborNode)
265 if (childOfNeighborNode->
parent() == childNode)
267 childOfNeighborElem->
switchNode(childNode, childOfNeighborNode,
true);
270 EFAError(
"Attempted to delete node: ",
271 childOfNeighborNode->
id(),
272 " from PermanentNodes, but couldn't find it");
274 childOfNeighborNode = childNode;
276 else if (childNode->
parent() == childOfNeighborNode)
278 childElem->
switchNode(childOfNeighborNode, childNode,
true);
281 EFAError(
"Attempted to delete node: ",
283 " from PermanentNodes, but couldn't find it");
285 childNode = childOfNeighborNode;
287 else if (childNode->
parent() != NULL &&
291 childOfNeighborElem->
switchNode(childNode, childOfNeighborNode,
true);
293 childOfNeighborNode))
295 EFAError(
"Attempted to delete node: ",
296 childOfNeighborNode->
id(),
297 " from PermanentNodes, but couldn't find it");
299 childOfNeighborNode = childNode;
303 EFAError(
"Attempting to merge nodes: ",
306 childOfNeighborNode->
id(),
307 " but both are permanent themselves");
312 if (childOfNeighborNode->
parent() != childNode &&
315 EFAError(
"Attempting to merge nodes ",
319 " but neither the 2nd node nor its parent is parent of the 1st");
321 childOfNeighborElem->
switchNode(childNode, childOfNeighborNode,
true);
323 EFAError(
"Attempted to delete node: ",
324 childOfNeighborNode->
id(),
325 " from TempNodes, but couldn't find it");
326 childOfNeighborNode = childNode;
331 if (childNode->
parent() != childOfNeighborNode &&
334 EFAError(
"Attempting to merge nodes ",
337 childOfNeighborNode->
id(),
338 " but neither the 2nd node nor its parent is parent of the 1st");
340 childElem->
switchNode(childOfNeighborNode, childNode,
true);
343 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
344 childNode = childOfNeighborNode;
351 PermanentNodes.insert(std::make_pair(new_node_id, newNode));
353 childOfNeighborElem->
switchNode(newNode, childOfNeighborNode,
true);
354 childElem->
switchNode(newNode, childNode,
true);
356 if (childNode->
parent() != childOfNeighborNode->
parent())
358 EFAError(
"Attempting to merge nodes ",
361 childOfNeighborNode->
id(),
362 " but they don't share a common parent");
366 EFAError(
"Attempted to delete node: ",
367 childOfNeighborNode->
id(),
368 " from TempNodes, but couldn't find it");
371 "Attempted to delete node: ", childNode->
id(),
" from TempNodes, but couldn't find it");
372 childOfNeighborNode = newNode;
Referenced by EFAElement2D::connectNeighbors(), and connectNeighbors().
◆ neighborSanityCheck()
void EFAElement3D::neighborSanityCheck |
( |
| ) |
const |
|
virtual |
Implements EFAElement.
Definition at line 584 of file EFAElement3D.C.
586 for (
unsigned int face_iter = 0; face_iter <
_num_faces; ++face_iter)
588 for (
unsigned int en_iter = 0; en_iter <
_face_neighbors[face_iter].size(); ++en_iter)
591 if (neigh_elem != NULL)
593 bool found_neighbor =
false;
594 for (
unsigned int face_iter2 = 0; face_iter2 < neigh_elem->
numFaces(); ++face_iter2)
596 for (
unsigned int en_iter2 = 0; en_iter2 < neigh_elem->
numFaceNeighbors(face_iter2);
601 if ((en_iter2 > 1) && (en_iter > 1))
604 "Element and neighbor element cannot both have >1 neighbors on a common face");
606 found_neighbor =
true;
612 EFAError(
"Neighbor element doesn't recognize current element as neighbor");
◆ numChildren()
unsigned int EFAElement::numChildren |
( |
| ) |
const |
|
inherited |
◆ numCrackTipNeighbors()
unsigned int EFAElement::numCrackTipNeighbors |
( |
| ) |
const |
|
inherited |
◆ numEdgeNeighbors()
unsigned int EFAElement3D::numEdgeNeighbors |
( |
unsigned int |
face_id, |
|
|
unsigned int |
edge_id |
|
) |
| const |
◆ numFaceNeighbors()
unsigned int EFAElement3D::numFaceNeighbors |
( |
unsigned int |
face_id | ) |
const |
◆ numFaces()
unsigned int EFAElement3D::numFaces |
( |
| ) |
const |
◆ numFragments()
unsigned int EFAElement3D::numFragments |
( |
| ) |
const |
|
virtual |
◆ numGeneralNeighbors()
unsigned int EFAElement::numGeneralNeighbors |
( |
| ) |
const |
|
inherited |
◆ numInteriorNodes()
unsigned int EFAElement3D::numInteriorNodes |
( |
| ) |
const |
|
virtual |
◆ numNodes()
unsigned int EFAElement::numNodes |
( |
| ) |
const |
|
inherited |
◆ overlaysElement()
bool EFAElement3D::overlaysElement |
( |
const EFAElement3D * |
other_elem | ) |
const |
Definition at line 431 of file EFAElement3D.C.
433 bool overlays =
false;
434 const EFAElement3D * other3d = dynamic_cast<const EFAElement3D *>(other_elem);
436 EFAError(
"failed to dynamic cast to other3d");
440 if (common_face_curr.size() == 1)
442 unsigned int curr_face_id = common_face_curr[0];
444 unsigned int other_face_id = other3d->
getFaceID(curr_face);
449 else if (common_face_curr.size() > 1)
Referenced by initCrackTip(), and setupNeighbors().
◆ printElement()
void EFAElement3D::printElement |
( |
std::ostream & |
ostream | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 1280 of file EFAElement3D.C.
1283 ostream << std::setw(5);
1284 ostream <<
_id <<
"| ";
1285 for (
unsigned int j = 0; j <
_num_faces; ++j)
1287 for (
unsigned int k = 0; k <
_faces[j]->numNodes(); ++k)
1288 ostream << std::setw(5) <<
_faces[j]->getNode(k)->idCatString();
1291 ostream << std::endl;
1294 ostream << std::setw(5);
1297 for (
unsigned int j = 0; j <
_num_faces; ++j)
1299 for (
unsigned int k = 0; k <
_faces[j]->numEdges(); ++k)
1301 ostream << std::setw(4);
1302 if (
_faces[j]->getEdge(k)->hasIntersection())
1304 if (
_faces[j]->getEdge(k)->numEmbeddedNodes() > 1)
1307 for (
unsigned int l = 0; l <
_faces[j]->getEdge(k)->numEmbeddedNodes(); ++l)
1309 ostream <<
_faces[j]->getEdge(k)->getEmbeddedNode(l)->id() <<
" ";
1310 if (l ==
_faces[j]->getEdge(k)->numEmbeddedNodes() - 1)
1317 ostream <<
_faces[j]->getEdge(k)->getEmbeddedNode(0)->id() <<
" ";
1324 ostream << std::endl;
1327 ostream << std::setw(5);
1330 for (
unsigned int j = 0; j <
_num_faces; ++j)
1332 ostream << std::setw(4);
1353 ostream << std::endl;
1356 for (
unsigned int j = 0; j <
_fragments.size(); ++j)
1358 ostream << std::setw(4);
1359 ostream <<
"frag" << j <<
"| ";
1360 for (
unsigned int k = 0; k <
_fragments[j]->numFaces(); ++k)
1362 for (
unsigned int l = 0; l <
_fragments[j]->getFace(k)->numNodes(); ++l)
1363 ostream << std::setw(5) <<
_fragments[j]->getFace(k)->getNode(l)->idCatString();
1366 ostream << std::endl;
1368 ostream << std::endl;
◆ printNodes()
void EFAElement::printNodes |
( |
std::ostream & |
ostream | ) |
const |
|
inherited |
Definition at line 61 of file EFAElement.C.
63 ostream <<
"***** nodes for element " <<
_id <<
" *****" << std::endl;
65 ostream <<
"addr " <<
_nodes[i] <<
", ID " <<
_nodes[i]->idCatString() <<
", category "
66 <<
_nodes[i]->category() << std::endl;
◆ removeEmbeddedNode()
void EFAElement3D::removeEmbeddedNode |
( |
EFANode * |
emb_node, |
|
|
bool |
remove_for_neighbor |
|
) |
| |
◆ removePhantomEmbeddedNode()
void EFAElement3D::removePhantomEmbeddedNode |
( |
| ) |
|
|
virtual |
Implements EFAElement.
Definition at line 1106 of file EFAElement3D.C.
1111 for (
unsigned int i = 0; i <
_num_faces; ++i)
1114 std::vector<EFANode *> nodes_to_delete;
1115 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
1126 for (
unsigned int j = 0; j <
_faces[i]->numInteriorNodes(); ++j)
1128 EFANode * face_node =
_faces[i]->getInteriorNode(j)->getNode();
1130 nodes_to_delete.push_back(face_node);
1134 for (
unsigned int j = 0; j < nodes_to_delete.size(); ++j)
Referenced by createChild().
◆ restoreFragment()
void EFAElement3D::restoreFragment |
( |
const EFAElement *const |
from_elem | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 941 of file EFAElement3D.C.
943 const EFAElement3D * from_elem3d = dynamic_cast<const EFAElement3D *>(from_elem);
945 EFAError(
"from_elem is not of EFAelement3D type");
949 EFAError(
"in restoreFragmentInfo elements must not have any pre-existing fragments");
950 for (
unsigned int i = 0; i < from_elem3d->
numFragments(); ++i)
955 EFAError(
"in restoreFragmentInfo elements must not have any pre-exsiting interior nodes");
961 EFAError(
"In restoreEdgeIntersection: edge cuts already exist in element ",
_id);
966 for (
unsigned int i = 0; i < from_elem3d->
numNodes(); ++i)
972 EFAError(
"In restoreFragmentInfo all of from_elem's nodes must be local");
◆ setCrackTipSplit()
void EFAElement::setCrackTipSplit |
( |
| ) |
|
|
inherited |
◆ setFace()
void EFAElement3D::setFace |
( |
unsigned int |
face_id, |
|
|
EFAFace * |
face |
|
) |
| |
◆ setLocalCoordinates()
void EFAElement3D::setLocalCoordinates |
( |
| ) |
|
|
private |
Definition at line 153 of file EFAElement3D.C.
265 EFAError(
"EFAElement3D: number of faces should be either 4(TET) or 6(HEX).");
Referenced by EFAElement3D().
◆ setNode()
void EFAElement::setNode |
( |
unsigned int |
node_id, |
|
|
EFANode * |
node |
|
) |
| |
|
inherited |
◆ setParent()
◆ setupNeighbors()
void EFAElement3D::setupNeighbors |
( |
std::map< EFANode *, std::set< EFAElement * >> & |
InverseConnectivityMap | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 508 of file EFAElement3D.C.
515 EFAError(
"neighbor_elem is not of EFAelement3D type");
517 std::vector<unsigned int> common_face_id =
getCommonFaceID(neigh_elem);
518 std::vector<unsigned int> face_ids, edge_ids;
519 if (common_face_id.size() == 0 &&
getCommonEdgeID(neigh_elem, face_ids, edge_ids) &&
522 bool is_edge_neighbor =
false;
527 EFAError(
"in updateFaceNeighbors: Cannot have more than 1 fragment");
532 is_edge_neighbor =
true;
535 is_edge_neighbor =
true;
537 if (is_edge_neighbor)
539 for (
unsigned int i = 0; i < face_ids.size(); ++i)
541 unsigned int face_id = face_ids[i];
542 unsigned int edge_id = edge_ids[i];
550 unsigned int face_id = common_face_id[0];
551 bool is_face_neighbor =
false;
556 EFAError(
"in updateFaceNeighbors: Cannot have more than 1 fragment");
561 is_face_neighbor =
true;
564 is_face_neighbor =
true;
566 if (is_face_neighbor)
572 " already has 2 face neighbors: ",
◆ shouldDuplicateCrackTipSplitElement()
bool EFAElement3D::shouldDuplicateCrackTipSplitElement |
( |
const std::set< EFAElement * > & |
CrackTipElements | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 681 of file EFAElement3D.C.
687 bool should_duplicate =
false;
690 std::vector<unsigned int> split_neighbors;
692 should_duplicate =
true;
698 std::set<EFANode *> non_physical_nodes;
705 EFAError(
"general elem is not of type EFAelement3D");
708 std::set<EFAElement *>::iterator sit;
709 sit = CrackTipElements.find(neigh_elem);
710 if (sit != CrackTipElements.end() && neigh_elem->
numFragments() > 1)
712 for (
unsigned int i = 0; i < neigh_elem->
numFaces(); ++i)
714 std::set<EFANode *> neigh_face_nodes = neigh_elem->
getFaceNodes(i);
718 should_duplicate =
true;
723 if (should_duplicate)
728 return should_duplicate;
Referenced by shouldDuplicateForCrackTip().
◆ shouldDuplicateForCrackTip()
bool EFAElement3D::shouldDuplicateForCrackTip |
( |
const std::set< EFAElement * > & |
CrackTipElements | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 657 of file EFAElement3D.C.
665 bool should_duplicate =
false;
668 std::set<EFAElement *>::iterator sit;
669 sit = CrackTipElements.find(
this);
671 should_duplicate =
true;
673 should_duplicate =
true;
675 should_duplicate =
true;
677 return should_duplicate;
Referenced by createChild().
◆ shouldDuplicateForPhantomCorner()
bool EFAElement3D::shouldDuplicateForPhantomCorner |
( |
| ) |
|
|
virtual |
◆ switchEmbeddedNode()
void EFAElement3D::switchEmbeddedNode |
( |
EFANode * |
new_node, |
|
|
EFANode * |
old_node |
|
) |
| |
|
virtual |
◆ switchNode()
void EFAElement3D::switchNode |
( |
EFANode * |
new_node, |
|
|
EFANode * |
old_node, |
|
|
bool |
descend_to_parent |
|
) |
| |
|
virtual |
◆ updateFragmentNode()
void EFAElement3D::updateFragmentNode |
( |
| ) |
|
|
virtual |
◆ updateFragments()
void EFAElement3D::updateFragments |
( |
const std::set< EFAElement * > & |
CrackTipElements, |
|
|
std::map< unsigned int, EFANode * > & |
EmbeddedNodes |
|
) |
| |
|
virtual |
Implements EFAElement.
Definition at line 858 of file EFAElement3D.C.
862 std::set<EFAElement *>::iterator sit;
863 sit = CrackTipElements.find(
this);
864 if (sit != CrackTipElements.end())
869 EFAError(
"crack tip elem ",
_id,
" must have 1 fragment");
875 _fragments[0]->removeInvalidEmbeddedNodes(EmbeddedNodes);
881 EFAError(
"Element ",
_id,
" must have 1 fragment at this point");
884 unsigned int num_cut_frag_faces =
_fragments[0]->getNumCuts();
885 unsigned int num_frag_faces =
_fragments[0]->numFaces();
887 EFAError(
"In element ",
_id,
" there are too many cut fragment faces");
890 if (num_cut_frag_faces == 0)
901 std::vector<EFAFragment3D *> new_frags =
_fragments[0]->split();
902 if (new_frags.size() == 1 || new_frags.size() == 2)
906 for (
unsigned int i = 0; i < new_frags.size(); ++i)
910 EFAError(
"Number of fragments must be 1 or 2 at this point");
◆ willCrackTipExtend()
bool EFAElement3D::willCrackTipExtend |
( |
std::vector< unsigned int > & |
split_neighbors | ) |
const |
|
virtual |
Implements EFAElement.
Definition at line 771 of file EFAElement3D.C.
776 bool will_extend =
false;
783 EFAError(
"in will_crack_tip_extend() element ",
787 " neighbors on face ",
793 EFAError(
"in will_crack_tip_extend() element ",
803 std::vector<EFANode *> neigh_cut_nodes = neigh_frag1->
getCommonNodes(neigh_frag2);
805 for (
unsigned int j = 0; j < neigh_cut_nodes.size(); ++j)
812 split_neighbors.push_back(neigh_idx);
Referenced by shouldDuplicateCrackTipSplitElement().
◆ _children
◆ _crack_tip_neighbors
std::vector<unsigned int> EFAElement::_crack_tip_neighbors |
|
protectedinherited |
◆ _crack_tip_split_element
bool EFAElement::_crack_tip_split_element |
|
protectedinherited |
◆ _face_edge_neighbors
std::vector<std::vector<std::vector<EFAElement3D *> > > EFAElement3D::_face_edge_neighbors |
|
private |
◆ _face_neighbors
std::vector<std::vector<EFAElement3D *> > EFAElement3D::_face_neighbors |
|
private |
◆ _faces
std::vector<EFAFace *> EFAElement3D::_faces |
|
private |
Definition at line 30 of file EFAElement3D.h.
Referenced by addFaceEdgeCut(), clearNeighbors(), connectNeighbors(), createChild(), createFaces(), EFAElement3D(), faceContainsTip(), findFacesAdjacentToFaces(), fragmentHasTipFaces(), getCommonEdgeID(), getCommonFaceID(), getFace(), getFaceID(), getFaceNodeParametricCoordinates(), getFaceNodes(), getFragmentFaceEdgeID(), getFragmentFaceID(), getMasterInfo(), getNeighborFaceEdgeID(), getNeighborFaceInteriorNodeID(), getNeighborFaceNodeID(), getNumCuts(), getPhantomNodeOnFace(), getTipEmbeddedNodes(), getTipFaceIDs(), initCrackTip(), isFacePhantom(), isPhysicalEdgeCut(), numFaces(), overlaysElement(), printElement(), removeEmbeddedNode(), removePhantomEmbeddedNode(), restoreFragment(), setFace(), shouldDuplicateForPhantomCorner(), switchEmbeddedNode(), switchNode(), willCrackTipExtend(), and ~EFAElement3D().
◆ _faces_adjacent_to_faces
std::vector<std::vector<EFAFace *> > EFAElement3D::_faces_adjacent_to_faces |
|
private |
◆ _fragments
Definition at line 34 of file EFAElement3D.h.
Referenced by connectNeighbors(), createChild(), EFAElement3D(), faceContainsTip(), fragmentHasTipFaces(), fragmentSanityCheck(), getFragment(), getFragmentFace(), getFragmentFaceID(), getNonPhysicalNodes(), getPhantomNodeOnFace(), getTipEmbeddedNodes(), getTipFaceIDs(), isFacePhantom(), isFinalCut(), isPartial(), isPhysicalEdgeCut(), numFragments(), printElement(), removeEmbeddedNode(), removePhantomEmbeddedNode(), restoreFragment(), setupNeighbors(), shouldDuplicateCrackTipSplitElement(), shouldDuplicateForCrackTip(), shouldDuplicateForPhantomCorner(), switchEmbeddedNode(), switchNode(), updateFragments(), willCrackTipExtend(), and ~EFAElement3D().
◆ _general_neighbors
std::vector<EFAElement *> EFAElement::_general_neighbors |
|
protectedinherited |
◆ _id
unsigned int EFAElement::_id |
|
protectedinherited |
Definition at line 27 of file EFAElement.h.
Referenced by EFAElement2D::addEdgeCut(), addFaceEdgeCut(), EFAElement2D::addFragmentEdgeCut(), EFAElement2D::connectNeighbors(), connectNeighbors(), EFAElement2D::fragmentSanityCheck(), getNeighborEdgeIndex(), EFAElement2D::getNeighborIndex(), getNeighborIndex(), EFAElement::id(), EFAElement2D::initCrackTip(), initCrackTip(), EFAElement::mergeNodes(), EFAElement2D::printElement(), printElement(), EFAElement::printNodes(), EFAElement2D::restoreFragment(), restoreFragment(), EFAElement2D::setupNeighbors(), setupNeighbors(), EFAElement2D::updateFragments(), updateFragments(), EFAElement2D::willCrackTipExtend(), and willCrackTipExtend().
◆ _interior_nodes
◆ _local_node_coor
std::vector<EFAPoint> EFAElement3D::_local_node_coor |
|
private |
◆ _local_nodes
std::vector<EFANode *> EFAElement::_local_nodes |
|
protectedinherited |
◆ _nodes
std::vector<EFANode *> EFAElement::_nodes |
|
protectedinherited |
Definition at line 29 of file EFAElement.h.
Referenced by EFAElement2D::addNodeCut(), EFAElement2D::connectNeighbors(), connectNeighbors(), EFAElement::containsNode(), EFAElement2D::createChild(), createChild(), EFAElement2D::createEdges(), createFaces(), EFAElement::createLocalNodeFromGlobalNode(), EFAElement2D::EFAElement2D(), EFAElement3D(), EFAElement::findGeneralNeighbors(), EFAElement2D::getCommonNodes(), getCommonNodes(), EFAElement::getGlobalNodeFromLocalNode(), EFAElement::getLocalNodeIndex(), EFAElement2D::getMasterInfo(), getMasterInfo(), EFAElement::getNode(), EFAElement2D::getNonPhysicalNodes(), getNonPhysicalNodes(), EFAElement2D::isPartial(), isPartial(), EFAElement2D::overlaysElement(), EFAElement2D::printElement(), EFAElement::printNodes(), EFAElement2D::restoreFragment(), restoreFragment(), EFAElement::setNode(), EFAElement2D::switchNode(), switchNode(), and EFAElement2D::updateFragmentNode().
◆ _num_faces
unsigned int EFAElement3D::_num_faces |
|
private |
Definition at line 29 of file EFAElement3D.h.
Referenced by clearNeighbors(), connectNeighbors(), createChild(), createFaces(), EFAElement3D(), fragmentHasTipFaces(), getCommonEdgeID(), getCommonFaceID(), getFaceID(), getFaceNodeParametricCoordinates(), getMasterInfo(), getNeighborIndex(), getNumCuts(), getTipEmbeddedNodes(), getTipFaceIDs(), initCrackTip(), mapParametricCoordinateFrom2DTo3D(), neighborSanityCheck(), printElement(), removePhantomEmbeddedNode(), restoreFragment(), setLocalCoordinates(), shouldDuplicateForPhantomCorner(), and switchEmbeddedNode().
◆ _num_interior_face_nodes
unsigned int EFAElement3D::_num_interior_face_nodes |
|
private |
◆ _num_nodes
unsigned int EFAElement::_num_nodes |
|
protectedinherited |
Definition at line 28 of file EFAElement.h.
Referenced by EFAElement2D::connectNeighbors(), connectNeighbors(), EFAElement2D::createChild(), createChild(), EFAElement2D::createEdges(), createFaces(), EFAElement2D::EFAElement2D(), EFAElement3D(), EFAElement::findGeneralNeighbors(), EFAElement::getLocalNodeIndex(), getMasterInfo(), EFAElement::numNodes(), EFAElement2D::printElement(), EFAElement::printNodes(), EFAElement2D::setLocalCoordinates(), setLocalCoordinates(), EFAElement2D::switchNode(), switchNode(), and EFAElement2D::updateFragmentNode().
◆ _num_vertices
unsigned int EFAElement3D::_num_vertices |
|
private |
◆ _parent
The documentation for this class was generated from the following files:
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)=0
EFAEdge * getEdge(unsigned int edge_id) const
bool hasIntersectionAtPosition(double position, EFANode *from_node) const
bool overlaysElement(const EFAElement3D *other_elem) const
EFANode * getNode(unsigned int node_id) const
N_CATEGORY category() const
unsigned int getFaceID(EFAFace *face) const
bool fragmentFaceAlreadyCut(unsigned int ElemFaceID) const
std::vector< EFAFragment3D * > _fragments
EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const
EFAElement * getGeneralNeighbor(unsigned int index) const
unsigned int numFaces() const
bool hasIntersection() const
EFAFace * getFace(unsigned int face_id) const
void removeEmbeddedNode(EFANode *emb_node, bool remove_for_neighbor)
EFAPoint cross(const EFAPoint &point)
EFAFragment3D * getFragment(unsigned int frag_id) const
EFANode * getNode(unsigned int node_id) const
bool getFragmentFaceID(unsigned int elem_face_id, unsigned int &frag_face_id) const
std::vector< std::vector< std::vector< EFAElement3D * > > > _face_edge_neighbors
unsigned int numEdgeNeighbors(unsigned int face_id, unsigned int edge_id) const
std::vector< unsigned int > getCommonFaceID(const EFAElement3D *other_elem) const
void mapParametricCoordinateFrom2DTo3D(unsigned int face_id, std::vector< double > &xi_2d, std::vector< double > &xi_3d) const
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const
std::vector< EFAFace * > _faces
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const
bool equivalent(const EFAEdge &other) const
void mergeNodes(EFANode *&childNode, EFANode *&childOfNeighborNode, EFAElement *childOfNeighborElem, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &TempNodes)
unsigned int numNodes() const
bool isFaceInterior(unsigned int face_id) const
void findGeneralNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivity)
bool getFragmentFaceEdgeID(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, unsigned int &FragFaceID, unsigned int &FragFaceEdgeID) const
void checkNeighborFaceCut(unsigned int face_id, unsigned int edge_id, double position, EFANode *from_node, EFANode *embedded_node, EFANode *&local_embedded)
unsigned int numEmbeddedNodes() const
virtual bool isPartial() const
void addIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
EFANode * createLocalNodeFromGlobalNode(const EFANode *global_node) const
virtual void removePhantomEmbeddedNode()
std::vector< EFANode * > getCommonNodes(EFAFragment *other) const
virtual unsigned int getNumCuts() const
void setLocalCoordinates()
std::vector< unsigned int > _crack_tip_neighbors
void setNode(unsigned int node_id, EFANode *node)
unsigned int numFaceNeighbors(unsigned int face_id) const
std::vector< EFAElement * > _general_neighbors
std::vector< EFANode * > _local_nodes
std::vector< EFAElement * > _children
std::set< EFANode * > getPhantomNodeOnFace(unsigned int face_id) const
std::vector< EFAVolumeNode * > _interior_nodes
bool _crack_tip_split_element
std::string idCatString()
EFAFace * getAdjacentFace(unsigned int face_id, unsigned int edge_id) const
unsigned int numCommonElems(std::set< T > &v1, std::set< T > &v2)
std::set< EFANode * > getFaceNodes(unsigned int face_id) const
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)
EFAFace * getFace(unsigned int face_id) const
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)
bool isPhysicalEdgeCut(unsigned int ElemFaceID, unsigned int ElemFaceEdgeID, double position) const
unsigned int getNeighborFaceEdgeID(unsigned int face_id, unsigned int edg_id, EFAElement3D *neighbor_elem) const
bool hasSameOrientation(const EFAFace *other_face) const
EFAElement3D * getFaceNeighbor(unsigned int face_id, unsigned int neighbor_id) const
bool fragmentHasTipFaces() const
bool isCrackTipSplit() const
virtual unsigned int numInteriorNodes() const
unsigned int numFaces() const
EFANode * getNode(unsigned int index) const
std::vector< std::vector< EFAFace * > > _faces_adjacent_to_faces
unsigned int numChildren() const
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)
virtual void getNeighborEdgeIndex(const EFAElement3D *neighbor_elem, unsigned int face_id, unsigned int edge_id, unsigned int &neigh_face_id, unsigned int &neigh_edge_id) const
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
double linearTetShape3D(unsigned int node_id, std::vector< double > &xi_3d)
EFAElement3D(unsigned int eid, unsigned int n_nodes, unsigned int n_faces)
std::vector< T > getCommonElems(std::set< T > &v1, std::set< T > &v2)
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)
EFANode * getEmbeddedNode(unsigned int index) const
double linearHexShape3D(unsigned int node_id, std::vector< double > &xi_3d)
double distanceFromNode1(EFANode *node) const
EFAElement(unsigned int eid, unsigned int n_nodes)
unsigned int _num_interior_face_nodes
void normalizePoint(Point &p)
virtual bool shouldDuplicateForPhantomCorner()
virtual void fragmentSanityCheck(unsigned int n_old_frag_faces, unsigned int n_old_frag_cuts) const
void findFacesAdjacentToFaces()
virtual unsigned int numFragments() const
unsigned int _num_vertices
bool hasIntersection() const
virtual bool isCrackTipElement() const
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const =0
bool faceContainsTip(unsigned int face_id) const
std::vector< std::vector< EFAElement3D * > > _face_neighbors
bool containsEdge(const EFAEdge &other) const
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const
EFANode * getInteriorFaceNode(unsigned int i) const
EFAElement * getChild(unsigned int child_id) const
unsigned int getNeighborFaceNodeID(unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const
unsigned int numNodes() const
bool deleteFromMap(std::map< unsigned int, T * > &theMap, T *elemToDelete, bool delete_elem=true)
std::vector< EFANode * > _nodes
EFAElement3D * getEdgeNeighbor(unsigned int face_id, unsigned int edge_id, unsigned int neighbor_id) const
std::vector< EFAPoint > _local_node_coor
unsigned int numGeneralNeighbors() const
bool containsNode(EFANode *node) const
unsigned int getEmbeddedNodeIndex(EFANode *node) const
unsigned int getNewID(std::map< unsigned int, T * > &theMap)
unsigned int numEdges() const
void setParent(EFAElement *parent)
unsigned int getNeighborFaceInteriorNodeID(unsigned int face_id, unsigned int node_id, EFAElement3D *neighbor_elem) const
bool equivalent(const EFAFace *other_face) const
bool getCommonEdgeID(const EFAElement3D *other_elem, std::vector< unsigned int > &face_id, std::vector< unsigned int > &edge_id) const
unsigned int adjacentCommonEdge(const EFAFace *other_face) const