22 bool create_boundary_edges,
27 if (create_boundary_edges)
30 EFAError(
"EFAfragment2D constructor must have a from_host to copy from");
31 if (frag_id == std::numeric_limits<unsigned int>::max())
33 for (
unsigned int i = 0; i < from_host->
numEdges(); ++i)
39 EFAError(
"In EFAfragment2D constructor fragment_copy_index out of bounds");
49 for (
unsigned int i = 0; i < from_face->
numEdges(); ++i)
75 bool contains =
false;
90 unsigned int num_cut_edges = 0;
102 unsigned int num_cut_nodes = 0;
106 return num_cut_nodes;
112 std::set<EFANode *> nodes;
124 bool is_connected =
false;
127 EFAError(
"in isConnected other_fragment is not of type EFAfragement2D");
131 for (
unsigned int j = 0;
j < other_frag2d->
numEdges(); ++
j)
157 EFAError(
"host element must have 1 interior node at this point");
174 EFAError(
"In combine_tip_edges() the frag must have host_elem");
176 bool has_tip_edges =
false;
177 unsigned int elem_tip_edge_id = std::numeric_limits<unsigned int>::max();
178 std::vector<unsigned int> frag_tip_edge_id;
181 frag_tip_edge_id.clear();
187 frag_tip_edge_id.push_back(
j);
189 if (frag_tip_edge_id.size() == 2)
191 has_tip_edges =
true;
192 elem_tip_edge_id = i;
200 unsigned int edge0_next(frag_tip_edge_id[0] < (
numEdges() - 1) ? frag_tip_edge_id[0] + 1 : 0);
201 if (edge0_next != frag_tip_edge_id[1])
202 EFAError(
"frag_tip_edge_id[1] must be the next edge of frag_tip_edge_id[0]");
209 EFAError(
"fragment edges are not correctly set up");
216 double position = (xi_emb - xi_node1) / (xi_node2 - xi_node1);
247 EFAError(
"in isEdgeInterior fragment must have host elem");
249 bool edge_in_elem_edge =
false;
255 edge_in_elem_edge =
true;
259 if (!edge_in_elem_edge)
265 std::vector<unsigned int>
268 std::vector<unsigned int> interior_edge_id;
272 interior_edge_id.push_back(i);
274 return interior_edge_id;
280 bool is_second_cut =
false;
282 EFAError(
"in isSecondaryInteriorEdge fragment must have host elem");
288 is_second_cut =
true;
292 return is_second_cut;
305 EFAError(
"in EFAfragment2D::get_edge, index out of bounds");
318 std::set<EFANode *> edge_nodes;
330 std::vector<EFAFragment2D *>
336 std::vector<EFAFragment2D *> new_fragments;
337 std::vector<std::vector<EFANode *>> fragment_nodes(
339 unsigned int frag_number = 0;
340 unsigned int edge_cut_count = 0;
341 unsigned int node_cut_count = 0;
344 fragment_nodes[frag_number].push_back(
_boundary_edges[iedge]->getNode(0));
350 frag_number = 1 - frag_number;
351 fragment_nodes[frag_number].push_back(
_boundary_edges[iedge]->getNode(0));
355 EFAError(
"A fragment boundary edge can't have more than 1 cuts");
359 fragment_nodes[frag_number].push_back(
_boundary_edges[iedge]->getEmbeddedNode(0));
361 frag_number = 1 - frag_number;
362 fragment_nodes[frag_number].push_back(
_boundary_edges[iedge]->getEmbeddedNode(0));
366 if ((edge_cut_count + node_cut_count) > 1)
368 for (
unsigned int frag_idx = 0; frag_idx < 2; ++frag_idx)
370 auto & this_frag_nodes = fragment_nodes[frag_idx];
372 if (this_frag_nodes.size() >= 3)
375 for (
unsigned int inode = 0; inode < this_frag_nodes.size() - 1; inode++)
376 new_frag->
addEdge(
new EFAEdge(this_frag_nodes[inode], this_frag_nodes[inode + 1]));
379 new EFAEdge(this_frag_nodes[this_frag_nodes.size() - 1], this_frag_nodes[0]));
381 new_fragments.push_back(new_frag);
385 else if (edge_cut_count == 1)
388 for (
unsigned int inode = 0; inode < fragment_nodes[0].size() - 1;
390 new_frag->
addEdge(
new EFAEdge(fragment_nodes[0][inode], fragment_nodes[0][inode + 1]));
392 for (
unsigned int inode = 0; inode < fragment_nodes[1].size() - 1;
394 new_frag->
addEdge(
new EFAEdge(fragment_nodes[1][inode], fragment_nodes[1][inode + 1]));
397 new EFAEdge(fragment_nodes[1][fragment_nodes[1].size() - 1], fragment_nodes[0][0]));
399 new_fragments.push_back(new_frag);
401 else if (node_cut_count == 1)
408 new_frag->
addEdge(
new EFAEdge(first_node_on_edge, second_node_on_edge));
411 new_fragments.push_back(new_frag);
414 return new_fragments;
virtual unsigned int getNumCuts() const
unsigned int numEdges() const
EFAElement2D * getHostElement() const
bool isSecondaryInteriorEdge(unsigned int edge_id) const
virtual unsigned int numInteriorNodes() const
std::set< EFANode * > getEdgeNodes(unsigned int edge_id) const
unsigned int numEdges() const
EFAEdge * getEdge(unsigned int edge_id) const
EFAFaceNode * getInteriorNode(unsigned int interior_node_id) const
void addEdge(EFAEdge *new_edge)
bool hasIntersection() const
bool deleteFromMap(std::map< unsigned int, T *> &theMap, T *elemToDelete, bool delete_elem=true)
bool isEdgeInterior(unsigned int edge_id) const
std::vector< unsigned int > getInteriorEdgeID() const
std::vector< EFAFragment2D * > split()
unsigned int numEdges() const
virtual unsigned int numFragments() const
virtual std::set< EFANode * > getAllNodes() const
double distanceFromNode1(EFANode *node) const
virtual unsigned int getNumCutNodes() const
virtual bool isConnected(EFAFragment *other_fragment) const
EFAFragment2D * getFragment(unsigned int frag_id) const
std::vector< EFAEdge * > _boundary_edges
bool containsEdge(const EFAEdge &other) const
EFAEdge * getEdge(unsigned int edge_id) const
virtual void removeInvalidEmbeddedNodes(std::map< unsigned int, EFANode *> &EmbeddedNodes)
virtual void switchNode(EFANode *new_node, EFANode *old_node)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
void addIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
EFAEdge * getEdge(unsigned int edge_id) const
void deleteInteriorNodes()
EFAFragment2D(EFAElement2D *host, bool create_boundary_edges, const EFAElement2D *from_host, unsigned int frag_id=std::numeric_limits< unsigned int >::max())
EFAElement2D * _host_elem
virtual bool containsNode(EFANode *node) const
EFAEdge * getFragmentEdge(unsigned int frag_id, unsigned int edge_id) const