#include <EFAFragment3D.h>
Definition at line 20 of file EFAFragment3D.h.
◆ EFAFragment3D()
EFAFragment3D::EFAFragment3D |
( |
EFAElement3D * |
host, |
|
|
bool |
create_faces, |
|
|
const EFAElement3D * |
from_host, |
|
|
unsigned int |
frag_id = std::numeric_limits<unsigned int>::max() |
|
) |
| |
Definition at line 20 of file EFAFragment3D.C.
29 EFAError(
"EFAfragment3D constructor must have a from_host to copy from");
30 if (frag_id == std::numeric_limits<unsigned int>::max())
32 for (
unsigned int i = 0; i < from_host->
numFaces(); ++i)
38 EFAError(
"In EFAfragment3D constructor fragment_copy_index out of bounds");
Referenced by connectSubfaces(), and split().
◆ ~EFAFragment3D()
EFAFragment3D::~EFAFragment3D |
( |
| ) |
|
◆ addFace()
void EFAFragment3D::addFace |
( |
EFAFace * |
new_face | ) |
|
◆ combine_tip_faces()
void EFAFragment3D::combine_tip_faces |
( |
| ) |
|
Definition at line 200 of file EFAFragment3D.C.
203 EFAError(
"In combine_tip_faces() the frag must have host_elem");
207 std::vector<unsigned int> frag_tip_face_id;
208 for (
unsigned int j = 0; j <
_faces.size(); ++j)
211 frag_tip_face_id.push_back(j);
213 if (frag_tip_face_id.size() == 2)
◆ combine_two_faces()
void EFAFragment3D::combine_two_faces |
( |
unsigned int |
face_id1, |
|
|
unsigned int |
face_id2, |
|
|
const EFAFace * |
elem_face |
|
) |
| |
|
private |
Definition at line 506 of file EFAFragment3D.C.
515 std::set<EFAFace *> face1_neigh;
518 std::set<EFAFace *> face2_neigh;
521 std::vector<EFAFace *> common_adjacent_faces =
Efa::getCommonElems(face1_neigh, face2_neigh);
523 for (
unsigned int i = 0; i < common_adjacent_faces.size(); ++i)
525 EFAFace * comm_face = common_adjacent_faces[i];
526 if (comm_face != NULL)
538 _faces[face_id1] = full_face;
Referenced by combine_tip_faces().
◆ connectSubfaces()
EFAFragment3D * EFAFragment3D::connectSubfaces |
( |
EFAFace * |
start_face, |
|
|
unsigned int |
startOldFaceID, |
|
|
std::vector< std::vector< EFAFace * >> & |
subfaces |
|
) |
| |
|
private |
Definition at line 428 of file EFAFragment3D.C.
433 std::vector<bool> contributed(subfaces.size(),
false);
434 contributed[startOldFaceID] =
true;
435 unsigned int num_contrib_faces = 1;
436 unsigned int old_num_contrib = 1;
437 std::vector<EFAFace *> frag_faces(1, start_face);
442 old_num_contrib = num_contrib_faces;
443 for (
unsigned int i = 0; i < subfaces.size(); ++i)
447 bool adjacent_found =
false;
448 for (
unsigned int j = 0; j < subfaces[i].size(); ++j)
450 for (
unsigned int k = 0; k < frag_faces.size(); ++k)
452 if (subfaces[i][j]->isAdjacent(frag_faces[k]))
454 adjacent_found =
true;
455 contributed[i] =
true;
456 frag_faces.push_back(subfaces[i][j]);
457 num_contrib_faces += 1;
466 }
while (num_contrib_faces != old_num_contrib);
469 std::vector<EFAEdge *> cut_plane_edges;
471 for (
unsigned int i = 0; i < frag_faces.size(); ++i)
472 new_frag->
addFace(frag_faces[i]);
475 for (
unsigned int i = 0; i < new_frag->
numFaces(); ++i)
478 if (lone_edge != NULL)
479 cut_plane_edges.push_back(
new EFAEdge(*lone_edge));
483 for (
unsigned int i = 0; i < cut_plane_edges.size(); ++i)
484 cut_face->
setEdge(i, cut_plane_edges[i]);
Referenced by split().
◆ containsNode()
bool EFAFragment3D::containsNode |
( |
EFANode * |
node | ) |
const |
|
virtual |
◆ findFacesAdjacentToFaces()
void EFAFragment3D::findFacesAdjacentToFaces |
( |
| ) |
|
◆ get_interior_face_id()
std::vector< unsigned int > EFAFragment3D::get_interior_face_id |
( |
| ) |
const |
Definition at line 241 of file EFAFragment3D.C.
243 std::vector<unsigned int> interior_face_id;
244 for (
unsigned int i = 0; i <
_faces.size(); ++i)
247 interior_face_id.push_back(i);
249 return interior_face_id;
◆ getAdjacentFace()
EFAFace * EFAFragment3D::getAdjacentFace |
( |
unsigned int |
face_id, |
|
|
unsigned int |
edge_id |
|
) |
| const |
◆ getAllNodes()
std::set< EFANode * > EFAFragment3D::getAllNodes |
( |
| ) |
const |
|
virtual |
◆ getCommonNodes()
◆ getFace()
EFAFace * EFAFragment3D::getFace |
( |
unsigned int |
face_id | ) |
const |
◆ getFaceID()
unsigned int EFAFragment3D::getFaceID |
( |
EFAFace * |
face | ) |
const |
◆ getFaceNodes()
std::set< EFANode * > EFAFragment3D::getFaceNodes |
( |
unsigned int |
face_id | ) |
const |
Definition at line 301 of file EFAFragment3D.C.
303 std::set<EFANode *> face_nodes;
304 for (
unsigned int i = 0; i <
_faces[face_id]->numNodes(); ++i)
305 face_nodes.insert(
_faces[face_id]->getNode(i));
◆ getHostElement()
◆ getNodeInfo()
void EFAFragment3D::getNodeInfo |
( |
std::vector< std::vector< unsigned int >> & |
face_node_indices, |
|
|
std::vector< EFANode * > & |
nodes |
|
) |
| const |
Definition at line 404 of file EFAFragment3D.C.
409 nodes.resize(all_node_set.size());
410 std::copy(all_node_set.begin(), all_node_set.end(), nodes.begin());
413 face_node_indices.clear();
414 for (
unsigned int i = 0; i <
_faces.size(); ++i)
416 std::vector<unsigned int> line_face_indices;
417 for (
unsigned int j = 0; j <
_faces[i]->numNodes(); ++j)
420 unsigned int vec_index = std::find(nodes.begin(), nodes.end(), node) - nodes.begin();
421 line_face_indices.push_back(vec_index);
423 face_node_indices.push_back(line_face_indices);
Referenced by XFEMCutElem3D::computePhysicalFaceAreaFraction(), and XFEMCutElem3D::computePhysicalVolumeFraction().
◆ getNumCutNodes()
unsigned int EFAFragment3D::getNumCutNodes |
( |
| ) |
const |
|
virtual |
◆ getNumCuts()
unsigned int EFAFragment3D::getNumCuts |
( |
| ) |
const |
|
virtual |
◆ hasFaceWithOneCut()
bool EFAFragment3D::hasFaceWithOneCut |
( |
| ) |
const |
◆ isConnected()
bool EFAFragment3D::isConnected |
( |
EFAFragment * |
other_fragment | ) |
const |
|
virtual |
Implements EFAFragment.
Definition at line 107 of file EFAFragment3D.C.
109 bool is_connected =
false;
110 EFAFragment3D * other_frag3d = dynamic_cast<EFAFragment3D *>(other_fragment);
112 EFAError(
"in isConnected other_fragment is not of type EFAfragement3D");
114 for (
unsigned int i = 0; i <
_faces.size(); ++i)
116 for (
unsigned int j = 0; j < other_frag3d->
numFaces(); ++j)
◆ isEdgeConnected()
bool EFAFragment3D::isEdgeConnected |
( |
EFAFragment * |
other_fragment | ) |
const |
|
virtual |
Definition at line 131 of file EFAFragment3D.C.
133 EFAFragment3D * other_frag3d = dynamic_cast<EFAFragment3D *>(other_fragment);
135 EFAError(
"in isEdgeConnected other_fragment is not of type EFAfragement3D");
137 for (
unsigned int i = 0; i <
_faces.size(); ++i)
138 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
139 for (
unsigned int k = 0; k < other_frag3d->
numFaces(); ++k)
140 for (
unsigned int l = 0; l < other_frag3d->
_faces[k]->numEdges(); ++l)
141 if (
_faces[i]->getEdge(j)->equivalent(*(other_frag3d->
_faces[k]->getEdge(l))))
◆ isFaceInterior()
bool EFAFragment3D::isFaceInterior |
( |
unsigned int |
face_id | ) |
const |
◆ isThirdInteriorFace()
bool EFAFragment3D::isThirdInteriorFace |
( |
unsigned int |
face_id | ) |
const |
◆ loneEdgeOnFace()
EFAEdge * EFAFragment3D::loneEdgeOnFace |
( |
unsigned int |
face_id | ) |
const |
|
private |
◆ numFaces()
unsigned int EFAFragment3D::numFaces |
( |
| ) |
const |
◆ removeEmbeddedNode()
void EFAFragment3D::removeEmbeddedNode |
( |
EFANode * |
emb_node | ) |
|
◆ removeInvalidEmbeddedNodes()
void EFAFragment3D::removeInvalidEmbeddedNodes |
( |
std::map< unsigned int, EFANode * > & |
EmbeddedNodes | ) |
|
|
virtual |
Implements EFAFragment.
Definition at line 148 of file EFAFragment3D.C.
157 std::map<EFANode *, std::vector<EFAFace *>> emb_inverse_map;
158 for (
unsigned int i = 0; i <
_faces.size(); ++i)
160 for (
unsigned int j = 0; j <
_faces[i]->numEdges(); ++j)
162 if (
_faces[i]->getEdge(j)->hasIntersection())
164 EFANode * emb_node =
_faces[i]->getEdge(j)->getEmbeddedNode(0);
165 emb_inverse_map[emb_node].push_back(
_faces[i]);
171 std::vector<EFANode *> invalid_emb;
172 std::map<EFANode *, std::vector<EFAFace *>>::iterator it;
173 for (it = emb_inverse_map.begin(); it != emb_inverse_map.end(); ++it)
175 EFANode * emb_node = it->first;
176 std::vector<EFAFace *> & emb_faces = it->second;
177 if (emb_faces.size() != 2)
178 EFAError(
"one embedded node must be owned by 2 faces");
180 for (
unsigned int i = 0; i < emb_faces.size(); ++i)
182 unsigned int face_id =
getFaceID(emb_faces[i]);
187 invalid_emb.push_back(emb_node);
191 for (
unsigned int i = 0; i < invalid_emb.size(); ++i)
◆ split()
Definition at line 316 of file EFAFragment3D.C.
319 std::vector<EFAFragment3D *> new_fragments;
320 std::vector<std::vector<EFAFace *>> all_subfaces;
321 for (
unsigned int i = 0; i <
_faces.size(); ++i)
323 std::vector<EFAFace *> subfaces =
_faces[i]->split();
324 all_subfaces.push_back(subfaces);
331 for (
unsigned int i = 0; i < all_subfaces.size(); ++i)
332 for (
unsigned int j = 0; j < all_subfaces[i].size(); ++j)
333 new_frag->
addFace(all_subfaces[i][j]);
335 new_fragments.push_back(new_frag);
342 unsigned int startOldFaceID = 0;
343 for (
unsigned int i = 0; i <
_faces.size(); ++i)
345 if (all_subfaces[i].size() == 2)
347 start_face1 = all_subfaces[i][0];
348 start_face2 = all_subfaces[i][1];
355 new_fragments.push_back(new_frag1);
356 new_fragments.push_back(new_frag2);
358 return new_fragments;
◆ switchNode()
void EFAFragment3D::switchNode |
( |
EFANode * |
new_node, |
|
|
EFANode * |
old_node |
|
) |
| |
|
virtual |
◆ _faces
std::vector<EFAFace *> EFAFragment3D::_faces |
|
private |
Definition at line 31 of file EFAFragment3D.h.
Referenced by addFace(), combine_tip_faces(), combine_two_faces(), containsNode(), EFAFragment3D(), findFacesAdjacentToFaces(), get_interior_face_id(), getAllNodes(), getFace(), getFaceID(), getFaceNodes(), getNodeInfo(), getNumCuts(), hasFaceWithOneCut(), isConnected(), isEdgeConnected(), isFaceInterior(), isThirdInteriorFace(), loneEdgeOnFace(), numFaces(), removeEmbeddedNode(), removeInvalidEmbeddedNodes(), split(), switchNode(), and ~EFAFragment3D().
◆ _faces_adjacent_to_faces
std::vector<std::vector<EFAFace *> > EFAFragment3D::_faces_adjacent_to_faces |
|
private |
◆ _host_elem
The documentation for this class was generated from the following files:
bool containsFace(const EFAFace *other_face) const
virtual bool containsNode(EFANode *node) const
EFAEdge * loneEdgeOnFace(unsigned int face_id) const
EFAFace * getFragmentFace(unsigned int frag_id, unsigned int face_id) const
virtual std::set< EFANode * > getAllNodes() const =0
unsigned int numFaces() const
void combine_two_faces(unsigned int face_id1, unsigned int face_id2, const EFAFace *elem_face)
void removeEmbeddedNode(EFANode *emb_node, bool remove_for_neighbor)
EFAFragment3D * getFragment(unsigned int frag_id) const
EFAVolumeNode * getInteriorNode(unsigned int interior_node_id) const
void removeEmbeddedNode(EFANode *emb_node)
void addFace(EFAFace *new_face)
virtual void switchNode(EFANode *new_node, EFANode *old_node)
void findFacesAdjacentToFaces()
bool isFaceInterior(unsigned int face_id) const
unsigned int getFaceID(EFAFace *face) const
EFAFragment3D * connectSubfaces(EFAFace *start_face, unsigned int startOldFaceID, std::vector< std::vector< EFAFace * >> &subfaces)
virtual unsigned int getNumCuts() const
std::vector< std::vector< EFAFace * > > _faces_adjacent_to_faces
EFAFace * getFace(unsigned int face_id) const
virtual unsigned int numInteriorNodes() const
unsigned int numFaces() const
bool hasFaceWithOneCut() const
std::vector< T > getCommonElems(std::set< T > &v1, std::set< T > &v2)
void resetEdgeIntersection(const EFAFace *ref_face)
EFAFragment3D(EFAElement3D *host, bool create_faces, const EFAElement3D *from_host, unsigned int frag_id=std::numeric_limits< unsigned int >::max())
virtual unsigned int numFragments() const
std::vector< EFAFace * > _faces
void combineTwoEdges(unsigned int edge_id1, unsigned int edge_id2)
virtual std::set< EFANode * > getAllNodes() const
EFAElement3D * _host_elem
bool deleteFromMap(std::map< unsigned int, T * > &theMap, T *elemToDelete, bool delete_elem=true)
void setEdge(unsigned int edge_id, EFAEdge *new_edge)
unsigned int adjacentCommonEdge(const EFAFace *other_face) const