508 map<int, int> idealConnec;
509 map<int, int> actualConnec;
510 map<int, vector<EdgeSharedPtr> > nodetoedge;
512 EdgeSet::iterator eit;
515 nodetoedge[(*eit)->m_n1->m_id].push_back(*eit);
516 nodetoedge[(*eit)->m_n2->m_id].push_back(*eit);
518 NodeSet::iterator nit;
526 idealConnec[(*nit)->m_id] = 6;
550 idealConnec[(*nit)->m_id] = 4;
555 actualConnec[(*nit)->m_id] = nodetoedge[(*nit)->m_id].size();
560 for (
int q = 0; q < 4; q++)
566 int swappedEdges = 0;
568 EdgeSet::iterator it;
570 for (it = edges.begin(); it != edges.end(); it++)
588 vector<NodeSharedPtr> nt = tri1->GetVertexList();
592 if (nt[0] != n1 && nt[0] != n2)
598 else if (nt[1] != n1 && nt[1] != n2)
604 else if (nt[2] != n1 && nt[2] != n2)
612 ASSERTL0(
false,
"failed to identify verticies in tri1");
615 nt = tri2->GetVertexList();
617 if (nt[0] != n1 && nt[0] != n2)
621 else if (nt[1] != n1 && nt[1] != n2)
625 else if (nt[2] != n1 && nt[2] != n2)
631 ASSERTL0(
false,
"failed to identify verticies in tri2");
645 Array<OneD, NekDouble> ai, bi, ci, di;
646 ai =
A->GetCADSurfInfo(
m_id);
647 bi = B->GetCADSurfInfo(
m_id);
648 ci = C->GetCADSurfInfo(
m_id);
649 di = D->GetCADSurfInfo(
m_id);
653 CDA = 0.5 * (-di[0] * ci[1] + ai[0] * ci[1] + ci[0] * di[1] -
654 ai[0] * di[1] - ci[0] * ai[1] + di[0] * ai[1]);
656 CBD = 0.5 * (-bi[0] * ci[1] + di[0] * ci[1] + ci[0] * bi[1] -
657 di[0] * bi[1] - ci[0] * di[1] + bi[0] * di[1]);
661 if (!(CDA > 0.001 && CBD > 0.001))
671 int nodedefectbefore = 0;
673 abs(actualConnec[
A->m_id] - idealConnec[
A->m_id]);
675 abs(actualConnec[B->m_id] - idealConnec[B->m_id]);
677 abs(actualConnec[C->m_id] - idealConnec[C->m_id]);
679 abs(actualConnec[D->m_id] - idealConnec[D->m_id]);
681 int nodedefectafter = 0;
683 abs(actualConnec[
A->m_id] - 1 - idealConnec[
A->m_id]);
685 abs(actualConnec[B->m_id] - 1 - idealConnec[B->m_id]);
687 abs(actualConnec[C->m_id] + 1 - idealConnec[C->m_id]);
689 abs(actualConnec[D->m_id] + 1 - idealConnec[D->m_id]);
691 if (nodedefectafter < nodedefectbefore)
699 minanglebefore = min(minanglebefore,
A->Angle(B, C));
700 minanglebefore = min(minanglebefore, B->Angle(
A, C));
701 minanglebefore = min(minanglebefore, B->Angle(
A, D));
702 minanglebefore = min(minanglebefore,
A->Angle(B, D));
703 minanglebefore = min(minanglebefore, D->Angle(
A, B));
705 NekDouble minangleafter = C->Angle(B, D);
706 minangleafter = min(minangleafter, D->Angle(B, C));
707 minangleafter = min(minangleafter, B->Angle(C, D));
708 minangleafter = min(minangleafter, C->Angle(
A, D));
709 minangleafter = min(minangleafter,
A->Angle(C, D));
710 minangleafter = min(minangleafter, D->Angle(
A, C));
712 if (minangleafter > minanglebefore)
720 actualConnec[
A->m_id]--;
721 actualConnec[B->m_id]--;
722 actualConnec[C->m_id]++;
723 actualConnec[D->m_id]++;
727 CAt = std::shared_ptr<Edge>(
new Edge(C,
A));
728 ADt = std::shared_ptr<Edge>(
new Edge(
A, D));
729 DBt = std::shared_ptr<Edge>(
new Edge(D, B));
730 BCt = std::shared_ptr<Edge>(
new Edge(B, C));
732 vector<EdgeSharedPtr> es = tri1->GetEdgeList();
733 for (
int i = 0; i < 3; i++)
744 es = tri2->GetEdgeList();
745 for (
int i = 0; i < 3; i++)
758 vector<pair<ElementSharedPtr, int> > links;
760 links = CA->m_elLink;
761 CA->m_elLink.clear();
762 for (
int i = 0; i < links.size(); i++)
764 if (links[i].first->GetId() == tri1->GetId())
768 CA->m_elLink.push_back(links[i]);
771 links = BC->m_elLink;
772 BC->m_elLink.clear();
773 for (
int i = 0; i < links.size(); i++)
775 if (links[i].first->GetId() == tri1->GetId())
779 BC->m_elLink.push_back(links[i]);
782 links = AD->m_elLink;
783 AD->m_elLink.clear();
784 for (
int i = 0; i < links.size(); i++)
786 if (links[i].first->GetId() == tri2->GetId())
790 AD->m_elLink.push_back(links[i]);
793 links = DB->m_elLink;
794 DB->m_elLink.clear();
795 for (
int i = 0; i < links.size(); i++)
797 if (links[i].first->GetId() == tri2->GetId())
801 DB->m_elLink.push_back(links[i]);
806 vector<NodeSharedPtr> t1, t2;
816 vector<int> tags = tri1->GetTagList();
818 int id1 = tri1->GetId();
819 int id2 = tri2->GetId();
823 tags = tri2->GetTagList();
832 vector<EdgeSharedPtr> t1es = ntri1->GetEdgeList();
833 for (
int i = 0; i < 3; i++)
837 ntri1->SetEdge(i, DB);
838 DB->m_elLink.push_back(
839 pair<ElementSharedPtr, int>(ntri1, i));
841 else if (t1es[i] == BC)
843 ntri1->SetEdge(i, BC);
844 BC->m_elLink.push_back(
845 pair<ElementSharedPtr, int>(ntri1, i));
847 else if (t1es[i] == newe)
849 ntri1->SetEdge(i, newe);
850 newe->m_elLink.push_back(
851 pair<ElementSharedPtr, int>(ntri1, i));
855 ASSERTL0(
false,
"weird edge in new tri 1");
858 vector<EdgeSharedPtr> t2es = ntri2->GetEdgeList();
859 for (
int i = 0; i < 3; i++)
863 ntri2->SetEdge(i, CA);
864 CA->m_elLink.push_back(
865 pair<ElementSharedPtr, int>(ntri2, i));
867 else if (t2es[i] == AD)
869 ntri2->SetEdge(i, AD);
870 AD->m_elLink.push_back(
871 pair<ElementSharedPtr, int>(ntri2, i));
873 else if (t2es[i] == newe)
875 ntri2->SetEdge(i, newe);
876 newe->m_elLink.push_back(
877 pair<ElementSharedPtr, int>(ntri2, i));
881 ASSERTL0(
false,
"weird edge in new tri 2");
#define ASSERTL0(condition, msg)
NodeSet m_inBoundary
set of nodes which are in the boundary (easier to identify conflicts with)
std::unordered_set< EdgeSharedPtr, EdgeHash > EdgeSet