#include <EFAElement2D.h>
|
| EFAElement2D (unsigned int eid, unsigned int n_nodes) |
|
| EFAElement2D (const EFAElement2D *from_elem, bool convert_to_local) |
|
| EFAElement2D (const EFAFace *from_face) |
|
| ~EFAElement2D () |
|
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 EFAElement2D *other_elem) const |
|
virtual unsigned int | getNeighborIndex (const EFAElement *neighbor_elem) 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_edges, 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_edges) |
|
virtual void | printElement (std::ostream &ostream) |
|
EFAFragment2D * | getFragment (unsigned int frag_id) const |
|
std::set< EFANode * > | getEdgeNodes (unsigned int edge_id) const |
|
bool | getEdgeNodeParametricCoordinate (EFANode *node, std::vector< double > ¶_coor) const |
|
EFAFaceNode * | getInteriorNode (unsigned int interior_node_id) const |
|
void | deleteInteriorNodes () |
|
unsigned int | numEdges () const |
|
void | setEdge (unsigned int edge_id, EFAEdge *edge) |
|
void | createEdges () |
|
EFAEdge * | getEdge (unsigned int edge_id) const |
|
EFAEdge * | getFragmentEdge (unsigned int frag_id, unsigned int edge_id) const |
|
std::set< EFANode * > | getPhantomNodeOnEdge (unsigned int edge_id) const |
|
bool | getFragmentEdgeID (unsigned int elem_edge_id, unsigned int &frag_edge_id) const |
|
bool | isEdgePhantom (unsigned int edge_id) const |
|
unsigned int | numEdgeNeighbors (unsigned int edge_id) const |
|
EFAElement2D * | getEdgeNeighbor (unsigned int edge_id, unsigned int neighbor_id) const |
|
unsigned int | getCrackTipSplitElementID () const |
|
bool | fragmentHasTipEdges () const |
|
unsigned int | getTipEdgeID () const |
|
EFANode * | getTipEmbeddedNode () const |
|
bool | edgeContainsTip (unsigned int edge_id) const |
|
bool | fragmentEdgeAlreadyCut (unsigned int ElemEdgeID) const |
|
void | addEdgeCut (unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor) |
|
void | addNodeCut (unsigned int node_id, EFANode *embedded_permanent_node, std::map< unsigned int, EFANode * > &PermanentNodes, std::map< unsigned int, EFANode * > &EmbeddedPermanentNodes) |
|
bool | addFragmentEdgeCut (unsigned int frag_edge_id, double position, std::map< unsigned int, EFANode * > &EmbeddedNodes) |
|
std::vector< EFAFragment2D * > | branchingSplit (std::map< unsigned int, EFANode * > &EmbeddedNodes) |
|
std::vector< EFANode * > | getCommonNodes (const EFAElement2D *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 EFAElement2D.h.
◆ EFAElement2D() [1/3]
EFAElement2D::EFAElement2D |
( |
unsigned int |
eid, |
|
|
unsigned int |
n_nodes |
|
) |
| |
Definition at line 23 of file EFAElement2D.C.
25 if (n_nodes == 4 || n_nodes == 8 || n_nodes == 9)
27 else if (n_nodes == 3 || n_nodes == 6)
30 EFAError(
"In EFAelement2D the supported element types are QUAD4, QUAD8, QUAD9, TRI3 and TRI6");
34 std::vector<std::vector<EFAElement2D *>>(
_num_edges, std::vector<EFAElement2D *>(1, NULL));
Referenced by createChild().
◆ EFAElement2D() [2/3]
EFAElement2D::EFAElement2D |
( |
const EFAElement2D * |
from_elem, |
|
|
bool |
convert_to_local |
|
) |
| |
Definition at line 37 of file EFAElement2D.C.
56 EFAError(
"In EFAelement2D ",
58 " the copy constructor must have from_elem w/ global nodes. node: ",
61 from_elem->
_nodes[i]->category());
67 for (
unsigned int i = 0; i < from_elem->
_fragments.size(); ++i)
81 EFAError(
"In EFAelement2D copy constructor this elem's nodes must be local");
87 EFAError(
"this EFAelement2D constructor only converts global nodes to local nodes");
◆ EFAElement2D() [3/3]
EFAElement2D::EFAElement2D |
( |
const EFAFace * |
from_face | ) |
|
◆ ~EFAElement2D()
EFAElement2D::~EFAElement2D |
( |
| ) |
|
◆ 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)
◆ addEdgeCut()
void EFAElement2D::addEdgeCut |
( |
unsigned int |
edge_id, |
|
|
double |
position, |
|
|
EFANode * |
embedded_node, |
|
|
std::map< unsigned int, EFANode * > & |
EmbeddedNodes, |
|
|
bool |
add_to_neighbor |
|
) |
| |
Definition at line 1710 of file EFAElement2D.C.
1716 EFANode * local_embedded = NULL;
1719 local_embedded = embedded_node;
1721 if (
_edges[edge_id]->hasIntersectionAtPosition(position, edge_node1) && position >
Xfem::tol &&
1724 unsigned int emb_id =
_edges[edge_id]->getEmbeddedNodeIndex(position, edge_node1);
1725 EFANode * old_emb =
_edges[edge_id]->getEmbeddedNode(emb_id);
1726 if (embedded_node && embedded_node != old_emb)
1728 EFAError(
"Attempting to add edge intersection when one already exists with different node.",
1736 local_embedded = old_emb;
1740 bool add2elem =
true;
1743 unsigned int frag_edge_id = 99999;
1745 EFANode * frag_edge_node1 = NULL;
1746 double frag_pos = -1.0;
1747 bool add2frag =
false;
1754 double xi[2] = {-1.0, -1.0};
1755 xi[0] =
_edges[edge_id]->distanceFromNode1(frag_edge->
getNode(0));
1756 xi[1] =
_edges[edge_id]->distanceFromNode1(frag_edge->
getNode(1));
1757 if ((position - xi[0]) * (position - xi[1]) <
1760 frag_edge_node1 = frag_edge->
getNode(0);
1761 frag_pos = (position - xi[0]) / (xi[1] - xi[0]);
1769 EFAWarning(
"attempting to add new cut to a cut fragment edge");
1779 if (!local_embedded)
1783 EmbeddedNodes.insert(std::make_pair(new_node_id, local_embedded));
1785 _edges[edge_id]->addIntersection(position, local_embedded, edge_node1);
1786 if (
_edges[edge_id]->numEmbeddedNodes() > 2)
1787 EFAError(
"element edge can't have >2 embedded nodes");
1793 frag_edge->
addIntersection(frag_pos, local_embedded, frag_edge_node1);
1795 EFAError(
"fragment edge can't have >1 embedded nodes");
1799 if (add_to_neighbor)
1801 for (
unsigned int en_iter = 0; en_iter <
numEdgeNeighbors(edge_id); ++en_iter)
1805 if (edge_neighbor->
getEdge(neighbor_edge_id)->
getNode(0) == edge_node1)
1806 EFAError(
"neighbor edge has the same direction as this edge");
1807 double neigh_pos = 1.0 - position;
1808 edge_neighbor->
addEdgeCut(neighbor_edge_id, neigh_pos, local_embedded, EmbeddedNodes,
false);
Referenced by addEdgeCut(), and ElementFragmentAlgorithm::addElemEdgeIntersection().
◆ addFragmentEdgeCut()
bool EFAElement2D::addFragmentEdgeCut |
( |
unsigned int |
frag_edge_id, |
|
|
double |
position, |
|
|
std::map< unsigned int, EFANode * > & |
EmbeddedNodes |
|
) |
| |
Definition at line 1837 of file EFAElement2D.C.
1842 EFAError(
"Element: ",
_id,
" should have only 1 fragment in addFragEdgeIntersection");
1843 EFANode * local_embedded = NULL;
1846 bool isValidIntersection =
true;
1851 (std::abs(1.0 - position) <
Xfem::tol &&
1853 isValidIntersection =
false;
1857 isValidIntersection =
false;
1860 if (isValidIntersection)
1865 EFAError(
"Attempting to add fragment edge intersection when one already exists with "
1866 "different position.",
1878 if (!
_fragments[0]->isEdgeInterior(frag_edge_id) ||
1879 _fragments[0]->isSecondaryInteriorEdge(frag_edge_id))
1880 EFAError(
"Attemping to add intersection to an invalid fragment edge. Element: ",
1888 EmbeddedNodes.insert(std::make_pair(new_node_id, local_embedded));
1895 std::vector<double> node1_para_coor(2, 0.0);
1896 std::vector<double> node2_para_coor(2, 0.0);
1900 double xi = (1.0 - position) * node1_para_coor[0] + position * node2_para_coor[0];
1901 double eta = (1.0 - position) * node1_para_coor[1] + position * node2_para_coor[1];
1905 EFAError(
"elem: ",
_id,
" cannot get the parametric coords of two end embedded nodes");
1912 return isValidIntersection;
Referenced by ElementFragmentAlgorithm::addFragEdgeIntersection().
◆ addNodeCut()
void EFAElement2D::addNodeCut |
( |
unsigned int |
node_id, |
|
|
EFANode * |
embedded_permanent_node, |
|
|
std::map< unsigned int, EFANode * > & |
PermanentNodes, |
|
|
std::map< unsigned int, EFANode * > & |
EmbeddedPermanentNodes |
|
) |
| |
Definition at line 1814 of file EFAElement2D.C.
1819 EFANode * local_embedded_permanent = NULL;
1821 if (embedded_permanent_node)
1822 local_embedded_permanent = embedded_permanent_node;
1827 local_embedded_permanent = node;
1828 EmbeddedPermanentNodes.insert(std::make_pair(node->
id(), local_embedded_permanent));
1830 EFAError(
"Attempted to delete node: ",
1831 local_embedded_permanent->
id(),
1832 " from PermanentNodes, but couldn't find it");
Referenced by ElementFragmentAlgorithm::addElemNodeIntersection().
◆ branchingSplit()
std::vector< EFAFragment2D * > EFAElement2D::branchingSplit |
( |
std::map< unsigned int, EFANode * > & |
EmbeddedNodes | ) |
|
Definition at line 1916 of file EFAElement2D.C.
1919 EFAError(
"branching is only allowed for an uncut element");
1922 std::vector<EFANode *> three_nodes;
1923 for (
unsigned int i = 0; i <
_edges.size(); ++i)
1926 if (
_edges[i]->numEmbeddedNodes() == 1)
1927 three_nodes.push_back(
_edges[i]->getEmbeddedNode(0));
1928 else if (
_edges[i]->numEmbeddedNodes() == 2)
1931 _edges[i]->getIntersection(0, node1) <
_edges[i]->getIntersection(1, node1) ? 0 : 1);
1932 unsigned int id1 = 1 - id0;
1933 three_nodes.push_back(
_edges[i]->getEmbeddedNode(id0));
1934 three_nodes.push_back(
_edges[i]->getEmbeddedNode(id1));
1937 if (three_nodes.size() != 3)
1938 EFAError(
"three_nodes.size() != 3");
1942 std::vector<double> center_xi(2, 0.0);
1943 for (
unsigned int i = 0; i < 3; ++i)
1945 std::vector<double> xi_2d(2, 0.0);
1947 center_xi[0] += xi_2d[0];
1948 center_xi[1] += xi_2d[1];
1950 center_xi[0] /= 3.0;
1951 center_xi[1] /= 3.0;
1956 EmbeddedNodes.insert(std::make_pair(new_node_id, new_emb));
1960 std::vector<EFAFragment2D *> new_fragments;
1961 for (
unsigned int i = 0; i < 3; ++i)
1964 unsigned int iplus1(i < 2 ? i + 1 : 0);
1968 unsigned int iedge = 0;
1969 bool add_more_edges =
true;
1970 for (
unsigned int j = 0; j <
_edges.size(); ++j)
1976 new_frag->
addEdge(
new EFAEdge(three_nodes[i], three_nodes[iplus1]));
1977 add_more_edges =
false;
1987 while (add_more_edges)
1990 if (iedge ==
_edges.size())
1995 add_more_edges =
false;
2000 new_fragments.push_back(new_frag);
2002 return new_fragments;
Referenced by updateFragments().
◆ clearNeighbors()
void EFAElement2D::clearNeighbors |
( |
| ) |
|
|
virtual |
◆ clearParentAndChildren()
void EFAElement::clearParentAndChildren |
( |
| ) |
|
|
inherited |
◆ connectNeighbors()
void EFAElement2D::connectNeighbors |
( |
std::map< unsigned int, EFANode * > & |
PermanentNodes, |
|
|
std::map< unsigned int, EFANode * > & |
TempNodes, |
|
|
std::map< EFANode *, std::set< EFAElement * >> & |
InverseConnectivityMap, |
|
|
bool |
merge_phantom_edges |
|
) |
| |
|
virtual |
Implements EFAElement.
Definition at line 1171 of file EFAElement2D.C.
1178 EFAError(
"no parent element for child element ",
_id,
" in connect_neighbors");
1181 EFAError(
"cannot dynamic cast to parent2d in connect_neighbors");
1184 for (
unsigned int j = 0; j <
_num_edges; ++j)
1191 if (
_edges[j]->hasIntersection())
1193 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1196 dynamic_cast<EFAElement2D *>(NeighborElem->
getChild(l));
1197 if (!childOfNeighborElem)
1198 EFAError(
"dynamic cast childOfNeighborElem fails");
1201 EFAEdge * neighborChildEdge = childOfNeighborElem->
getEdge(neighbor_edge_id);
1202 if (
_edges[j]->equivalent(*neighborChildEdge))
1207 unsigned int num_edge_nodes = 2;
1208 for (
unsigned int i = 0; i < num_edge_nodes; ++i)
1210 unsigned int childNodeIndex = i;
1211 unsigned int neighborChildNodeIndex = num_edge_nodes - 1 - childNodeIndex;
1214 EFANode * childOfNeighborNode = neighborChildEdge->
getNode(neighborChildNodeIndex);
1217 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1224 childNode, childOfNeighborNode, childOfNeighborElem, PermanentNodes, TempNodes);
1231 if (merge_phantom_edges)
1233 for (
unsigned int l = 0; l < NeighborElem->
numChildren(); ++l)
1236 dynamic_cast<EFAElement2D *>(NeighborElem->
getChild(l));
1237 if (!childOfNeighborElem)
1238 EFAError(
"dynamic cast childOfNeighborElem fails");
1240 EFAEdge * neighborChildEdge = childOfNeighborElem->
getEdge(neighbor_edge_id);
1246 unsigned int num_edge_nodes = 2;
1247 for (
unsigned int i = 0; i < num_edge_nodes; ++i)
1249 unsigned int childNodeIndex = i;
1250 unsigned int neighborChildNodeIndex = num_edge_nodes - 1 - childNodeIndex;
1253 EFANode * childOfNeighborNode = neighborChildEdge->
getNode(neighborChildNodeIndex);
1255 if (childNode->
parent() != NULL &&
1260 childOfNeighborNode,
1261 childOfNeighborElem,
1274 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1282 std::set<EFAElement *> patch_elems = InverseConnectivityMap[childNode->
parent()];
1283 if (parent2d->
numFragments() == 1 && patch_elems.size() == 1)
1290 PermanentNodes.insert(std::make_pair(new_node_id, newNode));
1295 "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 branchingSplit(), getEdgeNodeParametricCoordinate(), EFAElement3D::getFaceNodeParametricCoordinates(), getMasterInfo(), EFAElement3D::getMasterInfo(), getNonPhysicalNodes(), EFAElement3D::getNonPhysicalNodes(), getPhantomNodeOnEdge(), EFAElement3D::getPhantomNodeOnFace(), getTipEmbeddedNode(), isPartial(), EFAElement3D::isPartial(), printElement(), removePhantomEmbeddedNode(), EFAElement3D::removePhantomEmbeddedNode(), and EFAElement3D::willCrackTipExtend().
◆ createChild()
void EFAElement2D::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 985 of file EFAElement2D.C.
993 EFAError(
"Element cannot have existing children in createChildElements");
995 bool shouldDuplicateForCutNodeElement =
false;
999 shouldDuplicateForCutNodeElement =
true;
1003 shouldDuplicateForCutNodeElement)
1006 EFAError(
"More than 3 fragments not yet supported");
1009 ParentElements.push_back(
this);
1010 for (
unsigned int ichild = 0; ichild <
_fragments.size(); ++ichild)
1012 unsigned int new_elem_id;
1013 if (newChildElements.size() == 0)
1019 newChildElements.insert(std::make_pair(new_elem_id, childElem));
1021 ChildElements.push_back(childElem);
1025 std::vector<EFAPoint> local_embedded_node_coor;
1031 std::vector<EFANode *> master_nodes;
1032 std::vector<double> master_weights;
1034 for (
unsigned int j = 0; j < 2; ++j)
1039 for (
unsigned int k = 0; k < master_nodes.size(); ++k)
1045 local_embedded_node_coor.push_back(coor);
1055 if (local_embedded_node_coor.size())
1057 EFAPoint cut_line = local_embedded_node_coor[1] - local_embedded_node_coor[0];
1058 normal =
EFAPoint(cut_line(1), -cut_line(0), 0.0);
1060 origin = (local_embedded_node_coor[0] + local_embedded_node_coor[1]) * 0.5;
1063 if (local_embedded_node_coor.size() == 4)
1065 EFAPoint cut_line = local_embedded_node_coor[3] - local_embedded_node_coor[2];
1066 normal2 =
EFAPoint(cut_line(1), -cut_line(0), 0.0);
1068 origin2 = (local_embedded_node_coor[2] + local_embedded_node_coor[3]) * 0.5;
1072 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1077 EFAPoint origin_to_point = p - origin;
1078 EFAPoint origin2_to_point = p - origin2;
1087 TempNodes.insert(std::make_pair(new_node_id, newNode));
1088 childElem->
setNode(j, newNode);
1094 else if (std::abs(origin_to_point * normal) <
Xfem::tol &&
1099 TempNodes.insert(std::make_pair(new_node_id, newNode));
1100 childElem->
setNode(j, newNode);
1102 else if (origin_to_point * normal <
Xfem::tol && origin2_to_point * normal2 <
Xfem::tol &&
1118 TempNodes.insert(std::make_pair(new_node_id, newNode));
1119 childElem->
setNode(j, newNode);
1128 for (
unsigned int j = 0; j <
_num_edges; ++j)
1130 unsigned int jplus1(j < (
_num_edges - 1) ? j + 1 : 0);
1132 if (
_edges[j]->hasIntersection())
1136 childElem->
setEdge(j, new_edge);
◆ createEdges()
void EFAElement2D::createEdges |
( |
| ) |
|
◆ createLocalNodeFromGlobalNode()
EFANode * EFAElement::createLocalNodeFromGlobalNode |
( |
const EFANode * |
global_node | ) |
const |
|
inherited |
◆ deleteInteriorNodes()
void EFAElement2D::deleteInteriorNodes |
( |
| ) |
|
◆ edgeContainsTip()
bool EFAElement2D::edgeContainsTip |
( |
unsigned int |
edge_id | ) |
const |
Definition at line 1669 of file EFAElement2D.C.
1671 bool contains_tip =
false;
1674 unsigned int num_frag_edges = 0;
1675 if (
_edges[edge_id]->hasIntersection())
1677 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1680 num_frag_edges += 1;
1682 if (num_frag_edges == 2)
1683 contains_tip =
true;
1686 return contains_tip;
Referenced by fragmentEdgeAlreadyCut().
◆ 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 setupNeighbors(), and EFAElement3D::setupNeighbors().
◆ fragmentEdgeAlreadyCut()
bool EFAElement2D::fragmentEdgeAlreadyCut |
( |
unsigned int |
ElemEdgeID | ) |
const |
◆ fragmentHasTipEdges()
bool EFAElement2D::fragmentHasTipEdges |
( |
| ) |
const |
Definition at line 1581 of file EFAElement2D.C.
1583 bool has_tip_edges =
false;
1586 for (
unsigned int i = 0; i <
_num_edges; ++i)
1588 unsigned int num_frag_edges = 0;
1589 if (
_edges[i]->hasIntersection())
1591 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1594 num_frag_edges += 1;
1596 if (num_frag_edges == 2)
1598 has_tip_edges =
true;
1604 return has_tip_edges;
Referenced by isCrackTipElement().
◆ fragmentSanityCheck()
void EFAElement2D::fragmentSanityCheck |
( |
unsigned int |
n_old_frag_edges, |
|
|
unsigned int |
n_old_frag_cuts |
|
) |
| const |
|
virtual |
Implements EFAElement.
Definition at line 871 of file EFAElement2D.C.
873 if (n_old_frag_cuts > 3)
874 EFAError(
"Sanity check: in element ",
_id,
" frag has more than 3 cut edges");
877 std::vector<unsigned int> num_emb;
878 std::vector<unsigned int> num_perm;
879 std::vector<unsigned int> num_emb_perm;
880 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
882 num_emb.push_back(0);
883 num_perm.push_back(0);
884 num_emb_perm.push_back(0);
885 std::set<EFANode *> perm_nodes;
886 std::set<EFANode *> emb_nodes;
887 std::set<EFANode *> emb_perm_nodes;
888 for (
unsigned int j = 0; j <
_fragments[i]->numEdges(); ++j)
890 for (
unsigned int k = 0; k < 2; ++k)
894 perm_nodes.insert(temp_node);
896 emb_nodes.insert(temp_node);
898 emb_perm_nodes.insert(temp_node);
900 EFAError(
"Invalid node category");
903 num_perm[i] = perm_nodes.size();
904 num_emb[i] = emb_nodes.size();
905 num_emb_perm[i] = emb_perm_nodes.size();
909 for (
unsigned int i = 0; i <
_fragments.size(); ++i)
910 if (num_emb_perm[i] != 0)
914 if (n_interior_nodes > 0 && n_interior_nodes != 1)
915 EFAError(
"After update_fragments this element has ", n_interior_nodes,
" interior nodes");
917 if (n_old_frag_cuts == 0)
920 EFAError(
"Incorrect link size for element with 0 cuts");
922 else if (n_old_frag_cuts == 1)
925 EFAError(
"Incorrect link size for element with 1 cut");
927 else if (n_old_frag_cuts == 2)
931 EFAError(
"Incorrect link size for element with 2 cuts");
933 else if (n_old_frag_cuts == 3)
936 _fragments[2]->numEdges()) != n_old_frag_edges + 9)
937 EFAError(
"Incorrect link size for element with 3 cuts");
940 EFAError(
"Unexpected number of old fragment cuts");
Referenced by updateFragments().
◆ getChild()
EFAElement * EFAElement::getChild |
( |
unsigned int |
child_id | ) |
const |
|
inherited |
◆ getCommonNodes()
◆ 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");
◆ getCrackTipSplitElementID()
unsigned int EFAElement2D::getCrackTipSplitElementID |
( |
| ) |
const |
◆ getEdge()
EFAEdge * EFAElement2D::getEdge |
( |
unsigned int |
edge_id | ) |
const |
Definition at line 1475 of file EFAElement2D.C.
Referenced by addEdgeCut(), EFAFragment2D::combineTipEdges(), XFEMCutElem2D::computePhysicalFaceAreaFraction(), connectNeighbors(), XFEM::correctCrackExtensionDirection(), edgeContainsTip(), EFAFragment2D::EFAFragment2D(), fragmentHasTipEdges(), getFragmentEdge(), getFragmentEdgeID(), getTipEdgeID(), getTipEmbeddedNode(), EFAFragment2D::isEdgeInterior(), isEdgePhantom(), XFEM::markCutEdgesByState(), and shouldDuplicateForPhantomCorner().
◆ getEdgeNeighbor()
EFAElement2D * EFAElement2D::getEdgeNeighbor |
( |
unsigned int |
edge_id, |
|
|
unsigned int |
neighbor_id |
|
) |
| const |
◆ getEdgeNodeParametricCoordinate()
bool EFAElement2D::getEdgeNodeParametricCoordinate |
( |
EFANode * |
node, |
|
|
std::vector< double > & |
para_coor |
|
) |
| const |
◆ getEdgeNodes()
std::set< EFANode * > EFAElement2D::getEdgeNodes |
( |
unsigned int |
edge_id | ) |
const |
◆ getFragment()
EFAFragment2D * EFAElement2D::getFragment |
( |
unsigned int |
frag_id | ) |
const |
Definition at line 1388 of file EFAElement2D.C.
1393 EFAError(
"frag_id out of bounds");
Referenced by XFEMCutElem2D::computePhysicalFaceAreaFraction(), XFEMCutElem2D::computePhysicalVolumeFraction(), connectNeighbors(), createChild(), EFAFragment2D::EFAFragment2D(), XFEMCutElem2D::getCrackTipOriginAndDirection(), XFEMCutElem2D::getCutPlaneNormal(), XFEMCutElem2D::getCutPlaneOrigin(), XFEM::getFragmentEdges(), XFEMCutElem2D::getFragmentFaces(), XFEMCutElem2D::getIntersectionInfo(), XFEMCutElem2D::getPhysicalQuadraturePoints(), XFEM::markCutEdgesByGeometry(), XFEM::markCutEdgesByState(), XFEMCutElem2D::numCutPlanes(), setupNeighbors(), and willCrackTipExtend().
◆ getFragmentEdge()
EFAEdge * EFAElement2D::getFragmentEdge |
( |
unsigned int |
frag_id, |
|
|
unsigned int |
edge_id |
|
) |
| const |
Definition at line 1481 of file EFAElement2D.C.
1486 EFAError(
"frag_id out of bounds in get_frag_edge()");
Referenced by addEdgeCut(), addFragmentEdgeCut(), XFEMCutElem2D::computePhysicalFaceAreaFraction(), XFEMCutElem2D::computePhysicalVolumeFraction(), createChild(), EFAFragment2D::EFAFragment2D(), fragmentEdgeAlreadyCut(), XFEMCutElem2D::getCrackTipOriginAndDirection(), XFEMCutElem2D::getCutPlaneNormal(), XFEMCutElem2D::getCutPlaneOrigin(), XFEM::getFragmentEdges(), XFEMCutElem2D::getFragmentFaces(), XFEMCutElem2D::getIntersectionInfo(), XFEM::markCutEdgesByState(), and printElement().
◆ getFragmentEdgeID()
bool EFAElement2D::getFragmentEdgeID |
( |
unsigned int |
elem_edge_id, |
|
|
unsigned int & |
frag_edge_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()
EFAFaceNode * EFAElement2D::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 EFAElement2D::getMasterInfo |
( |
EFANode * |
node, |
|
|
std::vector< EFANode * > & |
master_nodes, |
|
|
std::vector< double > & |
master_weights |
|
) |
| const |
|
virtual |
Implements EFAElement.
Definition at line 300 of file EFAElement2D.C.
306 master_nodes.clear();
307 master_weights.clear();
308 bool masters_found =
false;
313 masters_found =
_edges[i]->getNodeMasters(node, master_nodes, master_weights);
317 EFAError(
"In getMasterInfo: cannot find master nodes in element edges");
327 std::vector<double> emb_xi(2, 0.0);
332 master_nodes.push_back(
_nodes[j]);
339 EFAError(
"unknown 2D element");
340 master_weights.push_back(weight);
342 masters_found =
true;
349 EFAError(
"In EFAelement2D::getMaterInfo, cannot find the given EFAnode");
Referenced by createChild(), and XFEMCutElem2D::getNodeCoordinates().
◆ getNeighborIndex()
unsigned int EFAElement2D::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 EFAElement3D::addFaceEdgeCut(), branchingSplit(), ElementFragmentAlgorithm::clearAncestry(), createChild(), getEdgeNodes(), ElementFragmentAlgorithm::getElemIdByNodes(), getMasterInfo(), EFAElement3D::getMasterInfo(), EFAElement3D::getNeighborFaceNodeID(), getPhantomNodeOnEdge(), EFAElement3D::getPhantomNodeOnFace(), getTipEmbeddedNode(), EFAElement3D::getTipEmbeddedNodes(), and overlaysElement().
◆ getNonPhysicalNodes()
void EFAElement2D::getNonPhysicalNodes |
( |
std::set< EFANode * > & |
non_physical_nodes | ) |
const |
|
virtual |
◆ getNumCuts()
unsigned int EFAElement2D::getNumCuts |
( |
| ) |
const |
|
virtual |
◆ getParent()
◆ getPhantomNodeOnEdge()
std::set< EFANode * > EFAElement2D::getPhantomNodeOnEdge |
( |
unsigned int |
edge_id | ) |
const |
Definition at line 1490 of file EFAElement2D.C.
1492 std::set<EFANode *> phantom_nodes;
1495 for (
unsigned int j = 0; j < 2; ++j)
1497 bool node_in_frag =
false;
1498 for (
unsigned int k = 0; k <
_fragments.size(); ++k)
1502 node_in_frag =
true;
1510 return phantom_nodes;
Referenced by shouldDuplicateForPhantomCorner().
◆ getTipEdgeID()
unsigned int EFAElement2D::getTipEdgeID |
( |
| ) |
const |
Definition at line 1608 of file EFAElement2D.C.
1611 unsigned int tip_edge_id = 99999;
1614 for (
unsigned int i = 0; i <
_num_edges; ++i)
1616 unsigned int num_frag_edges = 0;
1617 if (
_edges[i]->hasIntersection())
1619 for (
unsigned int j = 0; j <
_fragments[0]->numEdges(); ++j)
1622 num_frag_edges += 1;
1624 if (num_frag_edges == 2)
Referenced by XFEM::markCutEdgesByState().
◆ getTipEmbeddedNode()
EFANode * EFAElement2D::getTipEmbeddedNode |
( |
| ) |
const |
◆ id()
unsigned int EFAElement::id |
( |
| ) |
const |
|
inherited |
◆ initCrackTip()
void EFAElement2D::initCrackTip |
( |
std::set< EFAElement * > & |
CrackTipElements | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 556 of file EFAElement2D.C.
560 CrackTipElements.insert(
this);
561 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
570 EFAError(
"Element has a neighbor that overlays itself");
574 EFAError(
"crack_tip_split_element already flagged. In elem: ",
◆ isCrackTipElement()
bool EFAElement2D::isCrackTipElement |
( |
| ) |
const |
|
virtual |
◆ isCrackTipSplit()
bool EFAElement::isCrackTipSplit |
( |
| ) |
const |
|
inherited |
◆ isEdgePhantom()
bool EFAElement2D::isEdgePhantom |
( |
unsigned int |
edge_id | ) |
const |
◆ isFinalCut()
bool EFAElement2D::isFinalCut |
( |
| ) |
const |
|
virtual |
◆ isPartial()
bool EFAElement2D::isPartial |
( |
| ) |
const |
|
virtual |
◆ mapParametricCoordFrom1Dto2D()
void EFAElement2D::mapParametricCoordFrom1Dto2D |
( |
unsigned int |
edge_id, |
|
|
double |
xi_1d, |
|
|
std::vector< double > & |
para_coor |
|
) |
| const |
|
private |
Definition at line 2006 of file EFAElement2D.C.
2010 para_coor.resize(2, 0.0);
2015 para_coor[0] = xi_1d;
2016 para_coor[1] = -1.0;
2018 else if (edge_id == 1)
2021 para_coor[1] = xi_1d;
2023 else if (edge_id == 2)
2025 para_coor[0] = -xi_1d;
2028 else if (edge_id == 3)
2030 para_coor[0] = -1.0;
2031 para_coor[1] = -xi_1d;
2034 EFAError(
"edge_id out of bounds");
2040 para_coor[0] = 0.5 * (1.0 - xi_1d);
2041 para_coor[1] = 0.5 * (1.0 + xi_1d);
2043 else if (edge_id == 1)
2046 para_coor[1] = 0.5 * (1.0 - xi_1d);
2048 else if (edge_id == 2)
2050 para_coor[0] = 0.5 * (1.0 + xi_1d);
2054 EFAError(
"edge_id out of bounds");
2057 EFAError(
"unknown element for 2D");
Referenced by getEdgeNodeParametricCoordinate().
◆ 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 connectNeighbors(), and EFAElement3D::connectNeighbors().
◆ neighborSanityCheck()
void EFAElement2D::neighborSanityCheck |
( |
| ) |
const |
|
virtual |
Implements EFAElement.
Definition at line 523 of file EFAElement2D.C.
525 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
527 for (
unsigned int en_iter = 0; en_iter <
_edge_neighbors[edge_iter].size(); ++en_iter)
530 if (neigh_elem != NULL)
532 bool found_neighbor =
false;
533 for (
unsigned int edge_iter2 = 0; edge_iter2 < neigh_elem->
numEdges(); ++edge_iter2)
535 for (
unsigned int en_iter2 = 0; en_iter2 < neigh_elem->
numEdgeNeighbors(edge_iter2);
540 if ((en_iter2 > 1) && (en_iter > 1))
542 "Element and neighbor element cannot both have >1 neighbors on a common edge");
543 found_neighbor =
true;
549 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 EFAElement2D::numEdgeNeighbors |
( |
unsigned int |
edge_id | ) |
const |
◆ numEdges()
unsigned int EFAElement2D::numEdges |
( |
| ) |
const |
◆ numFragments()
unsigned int EFAElement2D::numFragments |
( |
| ) |
const |
|
virtual |
Implements EFAElement.
Definition at line 202 of file EFAElement2D.C.
Referenced by ElementFragmentAlgorithm::addElemNodeIntersection(), connectNeighbors(), EFAFragment2D::EFAFragment2D(), GeometricCutUserObject::execute(), XFEM::getFragmentEdges(), XFEM::markCutEdgesByState(), restoreFragment(), setupNeighbors(), shouldDuplicateCrackTipSplitElement(), shouldDuplicateForPhantomCorner(), and willCrackTipExtend().
◆ numGeneralNeighbors()
unsigned int EFAElement::numGeneralNeighbors |
( |
| ) |
const |
|
inherited |
◆ numInteriorNodes()
unsigned int EFAElement2D::numInteriorNodes |
( |
| ) |
const |
|
virtual |
◆ numNodes()
unsigned int EFAElement::numNodes |
( |
| ) |
const |
|
inherited |
◆ overlaysElement()
bool EFAElement2D::overlaysElement |
( |
const EFAElement2D * |
other_elem | ) |
const |
Definition at line 359 of file EFAElement2D.C.
361 bool overlays =
false;
369 if (common_nodes.size() == 2)
371 std::vector<EFANode *> common_nodes_vec(common_nodes.begin(), common_nodes.end());
377 if (
_nodes[i] == common_nodes_vec[0])
381 else if (
_nodes[i] == common_nodes_vec[1])
388 EFAError(
"in overlays_elem() couldn't find common node");
390 bool e1ascend =
false;
391 unsigned int e1n1idx_plus1(e1n1idx < (
_num_edges - 1) ? e1n1idx + 1 : 0);
392 unsigned int e1n1idx_minus1(e1n1idx > 0 ? e1n1idx - 1 :
_num_edges - 1);
393 if (e1n2idx == e1n1idx_plus1)
399 if (e1n2idx != e1n1idx_minus1)
400 EFAError(
"in overlays_elem() common nodes must be adjacent to each other");
407 if (other_elem->
getNode(i) == common_nodes_vec[0])
411 else if (other_elem->
getNode(i) == common_nodes_vec[1])
417 EFAError(
"in overlays_elem() couldn't find common node");
419 bool e2ascend =
false;
420 unsigned int e2n1idx_plus1(e2n1idx < (
_num_edges - 1) ? e2n1idx + 1 : 0);
421 unsigned int e2n1idx_minus1(e2n1idx > 0 ? e2n1idx - 1 :
_num_edges - 1);
422 if (e2n2idx == e2n1idx_plus1)
428 if (e2n2idx != e2n1idx_minus1)
429 EFAError(
"in overlays_elem() common nodes must be adjacent to each other");
433 if ((e1ascend && e2ascend) || (!e1ascend && !e2ascend))
438 else if (common_nodes.size() > 2)
Referenced by initCrackTip(), and setupNeighbors().
◆ printElement()
void EFAElement2D::printElement |
( |
std::ostream & |
ostream | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 1312 of file EFAElement2D.C.
1314 ostream << std::setw(4);
1315 ostream <<
_id <<
" | ";
1316 for (
unsigned int j = 0; j <
_num_nodes; ++j)
1318 ostream << std::setw(5) <<
_nodes[j]->idCatString();
1322 for (
unsigned int j = 0; j <
_num_edges; ++j)
1324 ostream << std::setw(4);
1325 if (
_edges[j]->hasIntersection())
1327 if (
_edges[j]->numEmbeddedNodes() > 1)
1330 for (
unsigned int k = 0; k <
_edges[j]->numEmbeddedNodes(); ++k)
1332 ostream <<
_edges[j]->getEmbeddedNode(k)->id();
1333 if (k ==
_edges[j]->numEmbeddedNodes() - 1)
1340 ostream <<
_edges[j]->getEmbeddedNode(0)->id() <<
" ";
1346 for (
unsigned int j = 0; j <
_num_edges; ++j)
1363 ostream << std::setw(4);
1371 for (
unsigned int j = 0; j <
_fragments.size(); ++j)
1373 ostream << std::setw(4);
1374 ostream <<
" " << j <<
" | ";
1375 for (
unsigned int k = 0; k <
_fragments[j]->numEdges(); ++k)
1381 ostream << std::setw(5) << prt_node->
idCatString();
1384 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;
◆ removePhantomEmbeddedNode()
void EFAElement2D::removePhantomEmbeddedNode |
( |
| ) |
|
|
virtual |
Implements EFAElement.
Definition at line 1151 of file EFAElement2D.C.
1156 for (
unsigned int i = 0; i <
_num_edges; ++i)
1158 std::vector<EFANode *> nodes_to_delete;
1159 for (
unsigned int j = 0; j <
_edges[i]->numEmbeddedNodes(); ++j)
1162 nodes_to_delete.push_back(
_edges[i]->getEmbeddedNode(j));
1164 for (
unsigned int j = 0; j < nodes_to_delete.size(); ++j)
1165 _edges[i]->removeEmbeddedNode(nodes_to_delete[j]);
Referenced by createChild().
◆ restoreFragment()
void EFAElement2D::restoreFragment |
( |
const EFAElement *const |
from_elem | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 944 of file EFAElement2D.C.
946 const EFAElement2D * from_elem2d = dynamic_cast<const EFAElement2D *>(from_elem);
948 EFAError(
"from_elem is not of EFAelement2D type");
952 EFAError(
"in restoreFragmentInfo elements must not have any pre-existing fragments");
953 for (
unsigned int i = 0; i < from_elem2d->
numFragments(); ++i)
958 EFAError(
"in restoreFragmentInfo elements must not have any pre-exsiting interior nodes");
964 EFAError(
"In restoreEdgeIntersection: edge cuts already exist in element ",
_id);
967 if (from_elem2d->
_edges[i]->hasIntersection())
968 _edges[i]->copyIntersection(*from_elem2d->
_edges[i], 0);
969 if (
_edges[i]->numEmbeddedNodes() > 2)
970 EFAError(
"elem ",
_id,
" has an edge with >2 cuts");
974 for (
unsigned int i = 0; i < from_elem2d->
numNodes(); ++i)
980 EFAError(
"In restoreFragmentInfo all of from_elem's nodes must be local");
◆ setCrackTipSplit()
void EFAElement::setCrackTipSplit |
( |
| ) |
|
|
inherited |
◆ setEdge()
void EFAElement2D::setEdge |
( |
unsigned int |
edge_id, |
|
|
EFAEdge * |
edge |
|
) |
| |
◆ setLocalCoordinates()
void EFAElement2D::setLocalCoordinates |
( |
| ) |
|
|
private |
◆ setNode()
void EFAElement::setNode |
( |
unsigned int |
node_id, |
|
|
EFANode * |
node |
|
) |
| |
|
inherited |
◆ setParent()
◆ setupNeighbors()
void EFAElement2D::setupNeighbors |
( |
std::map< EFANode *, std::set< EFAElement * >> & |
InverseConnectivityMap | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 467 of file EFAElement2D.C.
474 EFAError(
"neighbor_elem is not of EFAelement2D type");
477 if (common_nodes.size() >= 2)
479 for (
unsigned int edge_iter = 0; edge_iter <
_num_edges; ++edge_iter)
481 std::set<EFANode *> edge_nodes =
getEdgeNodes(edge_iter);
482 bool is_edge_neighbor =
false;
489 EFAError(
"in updateEdgeNeighbors: Cannot have more than 1 fragment");
493 is_edge_neighbor =
true;
496 is_edge_neighbor =
true;
499 if (is_edge_neighbor)
507 " already has 2 edge neighbors: ",
◆ shouldDuplicateCrackTipSplitElement()
bool EFAElement2D::shouldDuplicateCrackTipSplitElement |
( |
const std::set< EFAElement * > & |
CrackTipElements | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 639 of file EFAElement2D.C.
645 bool should_duplicate =
false;
648 std::vector<unsigned int> split_neighbors;
650 should_duplicate =
true;
656 std::set<EFANode *> non_physical_nodes;
663 EFAError(
"general elem is not of type EFAelement2D");
666 std::set<EFAElement *>::iterator sit;
667 sit = CrackTipElements.find(neigh_elem);
668 if (sit != CrackTipElements.end() && neigh_elem->
numFragments() > 1)
670 for (
unsigned int i = 0; i < neigh_elem->
numEdges(); ++i)
672 std::set<EFANode *> neigh_edge_nodes = neigh_elem->
getEdgeNodes(i);
676 should_duplicate =
true;
681 if (should_duplicate)
686 return should_duplicate;
Referenced by shouldDuplicateForCrackTip().
◆ shouldDuplicateForCrackTip()
bool EFAElement2D::shouldDuplicateForCrackTip |
( |
const std::set< EFAElement * > & |
CrackTipElements | ) |
|
|
virtual |
Implements EFAElement.
Definition at line 615 of file EFAElement2D.C.
623 bool should_duplicate =
false;
626 std::set<EFAElement *>::iterator sit;
627 sit = CrackTipElements.find(
this);
629 should_duplicate =
true;
631 should_duplicate =
true;
633 should_duplicate =
true;
635 return should_duplicate;
Referenced by createChild().
◆ shouldDuplicateForPhantomCorner()
bool EFAElement2D::shouldDuplicateForPhantomCorner |
( |
| ) |
|
|
virtual |
◆ switchEmbeddedNode()
void EFAElement2D::switchEmbeddedNode |
( |
EFANode * |
new_node, |
|
|
EFANode * |
old_node |
|
) |
| |
|
virtual |
◆ switchNode()
void EFAElement2D::switchNode |
( |
EFANode * |
new_node, |
|
|
EFANode * |
old_node, |
|
|
bool |
descend_to_parent |
|
) |
| |
|
virtual |
◆ updateFragmentNode()
void EFAElement2D::updateFragmentNode |
( |
| ) |
|
|
virtual |
◆ updateFragments()
void EFAElement2D::updateFragments |
( |
const std::set< EFAElement * > & |
CrackTipElements, |
|
|
std::map< unsigned int, EFANode * > & |
EmbeddedNodes |
|
) |
| |
|
virtual |
Implements EFAElement.
Definition at line 810 of file EFAElement2D.C.
814 std::set<EFAElement *>::iterator sit;
815 sit = CrackTipElements.find(
this);
816 if (sit != CrackTipElements.end())
821 EFAError(
"crack tip elem ",
_id,
" must have 1 fragment");
827 _fragments[0]->removeInvalidEmbeddedNodes(EmbeddedNodes);
833 EFAError(
"Element ",
_id,
" must have 1 fragment at this point");
836 unsigned int num_cut_frag_edges =
_fragments[0]->getNumCuts();
837 unsigned int num_cut_nodes =
_fragments[0]->getNumCutNodes();
838 unsigned int num_frag_edges =
_fragments[0]->numEdges();
839 if (num_cut_frag_edges > 3)
840 EFAError(
"In element ",
_id,
" there are more than 2 cut fragment edges");
842 if (num_cut_frag_edges == 0 && num_cut_nodes == 0)
856 std::vector<EFAFragment2D *> new_frags;
857 if (num_cut_frag_edges == 3)
864 for (
unsigned int i = 0; i < new_frags.size(); ++i)
◆ willCrackTipExtend()
bool EFAElement2D::willCrackTipExtend |
( |
std::vector< unsigned int > & |
split_neighbors | ) |
const |
|
virtual |
Implements EFAElement.
Definition at line 729 of file EFAElement2D.C.
734 bool will_extend =
false;
741 EFAError(
"in will_crack_tip_extend() element: ",
750 EFAError(
"in will_crack_tip_extend() element: ",
759 std::vector<EFANode *> neigh_cut_nodes = frag1->
getCommonNodes(frag2);
760 if (neigh_cut_nodes.size() != 2)
761 EFAError(
"2 frags in a elem does not share 2 common nodes");
762 if (
_edges[neigh_idx]->isEmbeddedNode(neigh_cut_nodes[0]) ||
763 _edges[neigh_idx]->isEmbeddedNode(neigh_cut_nodes[1]))
765 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 |
◆ _edge_neighbors
std::vector<std::vector<EFAElement2D *> > EFAElement2D::_edge_neighbors |
|
private |
Definition at line 33 of file EFAElement2D.h.
Referenced by clearNeighbors(), EFAElement2D(), getCrackTipSplitElementID(), getEdgeNeighbor(), getNeighborIndex(), initCrackTip(), neighborSanityCheck(), numEdgeNeighbors(), setupNeighbors(), shouldDuplicateForPhantomCorner(), and willCrackTipExtend().
◆ _edges
std::vector<EFAEdge *> EFAElement2D::_edges |
|
private |
Definition at line 31 of file EFAElement2D.h.
Referenced by addEdgeCut(), branchingSplit(), connectNeighbors(), createChild(), createEdges(), edgeContainsTip(), EFAElement2D(), fragmentHasTipEdges(), getCrackTipSplitElementID(), getEdge(), getEdgeNodeParametricCoordinate(), getEdgeNodes(), getFragmentEdgeID(), getMasterInfo(), getNumCuts(), getPhantomNodeOnEdge(), getTipEdgeID(), getTipEmbeddedNode(), initCrackTip(), isEdgePhantom(), printElement(), removePhantomEmbeddedNode(), restoreFragment(), setEdge(), shouldDuplicateForPhantomCorner(), switchEmbeddedNode(), switchNode(), willCrackTipExtend(), and ~EFAElement2D().
◆ _fragments
Definition at line 34 of file EFAElement2D.h.
Referenced by addFragmentEdgeCut(), connectNeighbors(), createChild(), edgeContainsTip(), EFAElement2D(), fragmentHasTipEdges(), fragmentSanityCheck(), getFragment(), getFragmentEdge(), getFragmentEdgeID(), getNonPhysicalNodes(), getPhantomNodeOnEdge(), getTipEdgeID(), getTipEmbeddedNode(), isEdgePhantom(), isFinalCut(), isPartial(), numFragments(), printElement(), removePhantomEmbeddedNode(), restoreFragment(), setupNeighbors(), shouldDuplicateCrackTipSplitElement(), shouldDuplicateForCrackTip(), shouldDuplicateForPhantomCorner(), switchEmbeddedNode(), switchNode(), updateFragments(), willCrackTipExtend(), and ~EFAElement2D().
◆ _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 addEdgeCut(), EFAElement3D::addFaceEdgeCut(), addFragmentEdgeCut(), connectNeighbors(), EFAElement3D::connectNeighbors(), fragmentSanityCheck(), EFAElement3D::getNeighborEdgeIndex(), getNeighborIndex(), EFAElement3D::getNeighborIndex(), EFAElement::id(), initCrackTip(), EFAElement3D::initCrackTip(), EFAElement::mergeNodes(), printElement(), EFAElement3D::printElement(), EFAElement::printNodes(), restoreFragment(), EFAElement3D::restoreFragment(), setupNeighbors(), EFAElement3D::setupNeighbors(), updateFragments(), EFAElement3D::updateFragments(), willCrackTipExtend(), and EFAElement3D::willCrackTipExtend().
◆ _interior_nodes
std::vector<EFAFaceNode *> EFAElement2D::_interior_nodes |
|
private |
Definition at line 32 of file EFAElement2D.h.
Referenced by addFragmentEdgeCut(), branchingSplit(), createChild(), deleteInteriorNodes(), EFAElement2D(), getInteriorNode(), getMasterInfo(), numInteriorNodes(), restoreFragment(), switchEmbeddedNode(), and ~EFAElement2D().
◆ _local_node_coor
std::vector<EFAPoint> EFAElement2D::_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 addNodeCut(), connectNeighbors(), EFAElement3D::connectNeighbors(), EFAElement::containsNode(), createChild(), EFAElement3D::createChild(), createEdges(), EFAElement3D::createFaces(), EFAElement::createLocalNodeFromGlobalNode(), EFAElement2D(), EFAElement3D::EFAElement3D(), EFAElement::findGeneralNeighbors(), getCommonNodes(), EFAElement3D::getCommonNodes(), EFAElement::getGlobalNodeFromLocalNode(), EFAElement::getLocalNodeIndex(), getMasterInfo(), EFAElement3D::getMasterInfo(), EFAElement::getNode(), getNonPhysicalNodes(), EFAElement3D::getNonPhysicalNodes(), isPartial(), EFAElement3D::isPartial(), overlaysElement(), printElement(), EFAElement::printNodes(), restoreFragment(), EFAElement3D::restoreFragment(), EFAElement::setNode(), switchNode(), EFAElement3D::switchNode(), and updateFragmentNode().
◆ _num_edges
unsigned int EFAElement2D::_num_edges |
|
private |
Definition at line 30 of file EFAElement2D.h.
Referenced by clearNeighbors(), connectNeighbors(), createChild(), createEdges(), EFAElement2D(), fragmentHasTipEdges(), getCommonNodes(), getCrackTipSplitElementID(), getEdgeNodeParametricCoordinate(), getMasterInfo(), getNeighborIndex(), getNumCuts(), getTipEdgeID(), getTipEmbeddedNode(), initCrackTip(), isPartial(), mapParametricCoordFrom1Dto2D(), neighborSanityCheck(), numEdges(), overlaysElement(), printElement(), removePhantomEmbeddedNode(), restoreFragment(), setLocalCoordinates(), setupNeighbors(), shouldDuplicateForPhantomCorner(), and switchEmbeddedNode().
◆ _num_nodes
unsigned int EFAElement::_num_nodes |
|
protectedinherited |
Definition at line 28 of file EFAElement.h.
Referenced by connectNeighbors(), EFAElement3D::connectNeighbors(), createChild(), EFAElement3D::createChild(), createEdges(), EFAElement3D::createFaces(), EFAElement2D(), EFAElement3D::EFAElement3D(), EFAElement::findGeneralNeighbors(), EFAElement::getLocalNodeIndex(), EFAElement3D::getMasterInfo(), EFAElement::numNodes(), printElement(), EFAElement::printNodes(), setLocalCoordinates(), EFAElement3D::setLocalCoordinates(), switchNode(), EFAElement3D::switchNode(), and updateFragmentNode().
◆ _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
virtual void switchNode(EFANode *new_node, EFANode *old_node, bool descend_to_parent)
bool fragmentHasTipEdges() const
virtual bool shouldDuplicateCrackTipSplitElement(const std::set< EFAElement * > &CrackTipElements)
EFANode * getNode(unsigned int node_id) const
N_CATEGORY category() const
EFAEdge * getEdge(unsigned int edge_id) const
void setLocalCoordinates()
EFAElement * getGeneralNeighbor(unsigned int index) const
virtual void removePhantomEmbeddedNode()
std::vector< EFAPoint > _local_node_coor
std::vector< EFAEdge * > _edges
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
double linearTriShape2D(unsigned int node_id, std::vector< double > &xi_2d)
virtual bool shouldDuplicateForCrackTip(const std::set< EFAElement * > &CrackTipElements)
bool overlaysElement(const EFAElement2D *other_elem) const
EFANode * getNode(unsigned int node_id) const
EFAElement2D * getEdgeNeighbor(unsigned int edge_id, unsigned int neighbor_id) const
unsigned int numEdgeNeighbors(unsigned int edge_id) const
std::set< EFANode * > getPhantomNodeOnEdge(unsigned int edge_id) const
virtual bool isPartial() 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
void findGeneralNeighbors(std::map< EFANode *, std::set< EFAElement * >> &InverseConnectivity)
EFANode * getInteriorNode() const
void copyIntersection(const EFAEdge &other, unsigned int from_node_id)
unsigned int numEmbeddedNodes() const
void addIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
void setCategory(EFANode::N_CATEGORY category)
double linearQuadShape2D(unsigned int node_id, std::vector< double > &xi_2d)
virtual unsigned int getNumCuts() const
EFANode * createLocalNodeFromGlobalNode(const EFANode *global_node) const
std::vector< EFANode * > getCommonNodes(EFAFragment *other) const
std::vector< unsigned int > _crack_tip_neighbors
EFAEdge * getFragmentEdge(unsigned int frag_id, unsigned int edge_id) const
void setNode(unsigned int node_id, EFANode *node)
std::vector< EFAElement * > _general_neighbors
std::vector< EFANode * > _local_nodes
std::vector< EFAFragment2D * > branchingSplit(std::map< unsigned int, EFANode * > &EmbeddedNodes)
std::vector< EFAElement * > _children
std::set< EFANode * > getEdgeNodes(unsigned int edge_id) const
virtual void getNonPhysicalNodes(std::set< EFANode * > &non_physical_nodes) const
bool _crack_tip_split_element
std::vector< EFAFragment2D * > _fragments
double getIntersection(unsigned int emb_id, EFANode *from_node) const
std::string idCatString()
unsigned int numCommonElems(std::set< T > &v1, std::set< T > &v2)
std::vector< EFANode * > getCommonNodes(const EFAElement2D *other_elem) const
void addEdgeCut(unsigned int edge_id, double position, EFANode *embedded_node, std::map< unsigned int, EFANode * > &EmbeddedNodes, bool add_to_neighbor)
void mapParametricCoordFrom1Dto2D(unsigned int edge_id, double xi_1d, std::vector< double > ¶_coor) const
bool isCrackTipSplit() const
virtual void fragmentSanityCheck(unsigned int n_old_frag_edges, unsigned int n_old_frag_cuts) const
bool getEdgeNodeParametricCoordinate(EFANode *node, std::vector< double > ¶_coor) const
EFANode * getNode(unsigned int index) const
EFAFragment2D * getFragment(unsigned int frag_id) const
std::vector< std::vector< EFAElement2D * > > _edge_neighbors
unsigned int numChildren() const
std::vector< T > getCommonElems(std::set< T > &v1, std::set< T > &v2)
unsigned int numInteriorNodes() const
EFAElement2D(unsigned int eid, unsigned int n_nodes)
bool fragmentEdgeAlreadyCut(unsigned int ElemEdgeID) const
virtual bool isCrackTipElement() const
std::vector< EFAFaceNode * > _interior_nodes
virtual bool shouldDuplicateForPhantomCorner()
EFAElement(unsigned int eid, unsigned int n_nodes)
void setInteriorNode(EFANode *node)
void normalizePoint(Point &p)
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const
bool hasIntersection() const
virtual unsigned int getNeighborIndex(const EFAElement *neighbor_elem) const =0
void setEdge(unsigned int edge_id, EFAEdge *edge)
virtual unsigned int numFragments() const
EFAElement * getChild(unsigned int child_id) const
bool edgeContainsTip(unsigned int edge_id) const
unsigned int numEdges() const
unsigned int numNodes() const
bool deleteFromMap(std::map< unsigned int, T * > &theMap, T *elemToDelete, bool delete_elem=true)
void addEdge(EFAEdge *new_edge)
std::vector< EFANode * > _nodes
unsigned int numGeneralNeighbors() const
bool containsNode(EFANode *node) const
unsigned int numEdges() const
unsigned int getNewID(std::map< unsigned int, T * > &theMap)
virtual bool willCrackTipExtend(std::vector< unsigned int > &split_neighbors) const
unsigned int numEdges() const
bool isEdgeInterior(unsigned int edge_id) const
void setParent(EFAElement *parent)
bool getFragmentEdgeID(unsigned int elem_edge_id, unsigned int &frag_edge_id) const
virtual unsigned int numInteriorNodes() const
EFAFaceNode * getInteriorNode(unsigned int index) const