From 9f3b83fbc0f98150f3287e2790b7973f705f1d75 Mon Sep 17 00:00:00 2001
From: Gaetan Bricteux <gaetan.bricteux@uclouvain.be>
Date: Mon, 20 May 2013 15:31:48 +0000
Subject: [PATCH] split with several tags

---
 Geo/MElementCut.cpp | 124 +++++++++++++++++++++++---------------------
 1 file changed, 66 insertions(+), 58 deletions(-)

diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp
index 2618cce1c6..d0c39741e4 100644
--- a/Geo/MElementCut.cpp
+++ b/Geo/MElementCut.cpp
@@ -585,7 +585,8 @@ static int getBorderTag(int lsTag, int count, int &maxTag, std::map<int, int> &b
   return lsTag;
 }
 
-static void elementSplitMesh(MElement *e, fullMatrix<double> &verticesLs,
+static void elementSplitMesh(MElement *e, std::vector<gLevelset *> &RPN,
+                             fullMatrix<double> &verticesLs,
                              GEntity *ge, GModel *GM, int &numEle,
                              std::map<int, MVertex*> &vertexMap,
                              std::map<MElement*, MElement*> &newParents,
@@ -594,39 +595,50 @@ static void elementSplitMesh(MElement *e, fullMatrix<double> &verticesLs,
                              std::map<int, std::map<int, std::string> > physicals[4],
                              std::map<int, int> newElemTags[4],
                              std::map<int, int> newPhysTags[4],
-			     std::map<int, int> borderElemTags[2],
-			     std::map<int, int> borderPhysTags[2],
-			     int gLsTag)
+                             std::map<int, int> borderElemTags[2],
+                             std::map<int, int> borderPhysTags[2])
 {
-
   int elementary = ge->tag();
   int eType = e->getType();
   std::vector<int> gePhysicals = ge->physicals;
+  int iLs = (verticesLs.size1() == 1) ? 0 : verticesLs.size1() - 1;
+  int gLsTag = RPN[RPN.size() - 1]->getTag();
 
   MElement *copy = e->copy(vertexMap, newParents, newDomains);
 
   //split acording to center of gravity
   // double lsMean = 0.;
   // for(int k = 0; k < e->getNumVertices(); k++)
-  //   lsMean += verticesLs(0, e->getVertex(k)->getIndex());
+  //   lsMean += verticesLs(iLs, e->getVertex(k)->getIndex());
   // int lsTag = (lsMean < 0) ? 1 : -1;
 
   //EMI : better for embedded dirichlet with smoothed properties
   //split according to values of vertices (keep +)
   bool splitElem = false;
   double eps = 1.e-9;
-  int lsTag =  (verticesLs(0, e->getVertex(0)->getIndex()) > eps) ? -1 : 1;
-   for(int k = 1; k < e->getNumVertices(); k++){
-    int lsTag2 = (verticesLs(0, e->getVertex(k)->getIndex()) > eps) ? -1: 1;
-     if (lsTag*lsTag2 < 0.0) {
+  int lsTag = (verticesLs(iLs, e->getVertex(0)->getIndex()) > eps) ? -1 : 1;
+  int ils = 0;
+  for(int k = 1; k < e->getNumVertices(); k++){
+    int lsTag2 = (verticesLs(iLs, e->getVertex(k)->getIndex()) > eps) ? -1 : 1;
+    if (lsTag * lsTag2 < 0.0) {
       lsTag = -1;
       splitElem = true;
+      if(RPN.size() > 1){
+        for(; ils < verticesLs.size1() - 1; ils++){
+          int lsT1 = (verticesLs(ils, e->getVertex(0)->getIndex()) > eps) ? -1 : 1;
+          int lsT2 = (verticesLs(ils, e->getVertex(k)->getIndex()) > eps) ? -1 : 1;
+          if(lsT1 * lsT2 < 0.0) break;
+        }
+       for(int i = 0; i <= ils; i++)
+          if(!RPN[i]->isPrimitive()) ils++;
+        gLsTag = RPN[ils]->getTag();
+      }
       break;
     }
   }
   // int lsTag = 1; //negative ls
   // for(int k = 0; k < e->getNumVertices(); k++){
-  //  double val = verticesLs(0, e->getVertex(k)->getIndex());
+  //  double val = verticesLs(iLs, e->getVertex(k)->getIndex());
   //  if (val > 0.0) { lsTag = -1; break; }
   // }
 
@@ -696,9 +708,9 @@ static void elementSplitMesh(MElement *e, fullMatrix<double> &verticesLs,
       MVertex *v1 = me.getVertex(1);
       MVertex *v0N = vertexMap[v0->getNum()];
       MVertex *v1N = vertexMap[v1->getNum()];
-      double val0 = verticesLs(0, v0->getIndex()) - eps;
-      double val1 = verticesLs(0, v1->getIndex()) - eps;
-      if(val0*val1 > 0.0 && val0 < 0.0) {
+      double val0 = verticesLs(iLs, v0->getIndex()) - eps;
+      double val1 = verticesLs(iLs, v1->getIndex()) - eps;
+      if(val0 * val1 > 0.0 && val0 < 0.0) {
         getPhysicalTag(-1, gePhysicals, newPhysTags[1]);
         int c = elements[1].count(gLsTag);
         int reg = getBorderTag(gLsTag, c, newElemTags[1][0], borderElemTags[0]);
@@ -728,9 +740,9 @@ static void elementSplitMesh(MElement *e, fullMatrix<double> &verticesLs,
     for(int k = 0; k < e->getNumFaces(); k++){
       MFace mf = e->getFace(k);
       bool sameSign = true;
-      double val0 = verticesLs(0, mf.getVertex(0)->getIndex()) - eps;
+      double val0 = verticesLs(iLs, mf.getVertex(0)->getIndex()) - eps;
       for (int j = 1; j < mf.getNumVertices(); j++){
-        double valj = verticesLs(0, mf.getVertex(j)->getIndex()) - eps;
+        double valj = verticesLs(iLs, mf.getVertex(j)->getIndex()) - eps;
         if (val0*valj < 0.0){ sameSign = false; break;}
       }
       if(sameSign && val0 < 0.0) {
@@ -861,7 +873,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                    e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
                    e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z(),
                    e->getVertex(3)->x(), e->getVertex(3)->y(), e->getVertex(3)->z());
-	T.setPolynomialOrder(recur+1);
+        T.setPolynomialOrder(recur+1);
         for(int i = 0; i < e->getNumVertices(); i++)
           nodeLs[i] = &verticesLs(0, e->getVertex(i)->getIndex());
         isCut = T.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -876,7 +888,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                   e->getVertex(5)->x(), e->getVertex(5)->y(), e->getVertex(5)->z(),
                   e->getVertex(6)->x(), e->getVertex(6)->y(), e->getVertex(6)->z(),
                   e->getVertex(7)->x(), e->getVertex(7)->y(), e->getVertex(7)->z());
-	H.setPolynomialOrder(recur+1);
+        H.setPolynomialOrder(recur+1);
         for(int i = 0; i < e->getNumVertices(); i++)
           nodeLs[i] = &verticesLs(0, e->getVertex(i)->getIndex());
         isCut = H.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder, integOrder,
@@ -887,7 +899,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                     e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
                     e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z(),
                     e->getVertex(5)->x(), e->getVertex(5)->y(), e->getVertex(5)->z());
-	//T1.setPolynomialOrder(recur+1);
+        //T1.setPolynomialOrder(recur+1);
         for(int i = 0; i < 3; i++) nodeLs[i] = &verticesLs(0, e->getVertex(i)->getIndex());
         nodeLs[3] = &verticesLs(0, e->getVertex(5)->getIndex());
         bool iC1 = T1.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -896,7 +908,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                     e->getVertex(4)->x(), e->getVertex(4)->y(), e->getVertex(4)->z(),
                     e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
                     e->getVertex(5)->x(), e->getVertex(5)->y(), e->getVertex(5)->z());
-	//T2.setPolynomialOrder(recur+1);
+        //T2.setPolynomialOrder(recur+1);
         nodeLs[0] = &verticesLs(0, e->getVertex(0)->getIndex());
         nodeLs[1] = &verticesLs(0, e->getVertex(4)->getIndex());
         nodeLs[2] = &verticesLs(0, e->getVertex(1)->getIndex());
@@ -907,7 +919,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                     e->getVertex(3)->x(), e->getVertex(3)->y(), e->getVertex(3)->z(),
                     e->getVertex(4)->x(), e->getVertex(4)->y(), e->getVertex(4)->z(),
                     e->getVertex(5)->x(), e->getVertex(5)->y(), e->getVertex(5)->z());
-	//T3.setPolynomialOrder(recur+1);
+        //T3.setPolynomialOrder(recur+1);
         for(int i = 1; i < 4; i++) nodeLs[i] = &verticesLs(0, e->getVertex(i+2)->getIndex());
         bool iC3 = T3.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
                           tetras, quads, triangles, recur, nodeLs);
@@ -918,7 +930,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                     e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
                     e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z(),
                     e->getVertex(4)->x(), e->getVertex(4)->y(), e->getVertex(4)->z());
-	//T1.setPolynomialOrder(recur+1);
+        //T1.setPolynomialOrder(recur+1);
         for(int i = 0; i < 3; i++) nodeLs[i] = &verticesLs(0, e->getVertex(i)->getIndex());
         nodeLs[3] = &verticesLs(0, e->getVertex(4)->getIndex());
         bool iC1 = T1.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -927,7 +939,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                     e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z(),
                     e->getVertex(3)->x(), e->getVertex(3)->y(), e->getVertex(3)->z(),
                     e->getVertex(4)->x(), e->getVertex(4)->y(), e->getVertex(4)->z());
-	//T2.setPolynomialOrder(recur+1);
+        //T2.setPolynomialOrder(recur+1);
         nodeLs[0] = &verticesLs(0, e->getVertex(0)->getIndex());
         for(int i = 1; i < 4; i++) nodeLs[i] = &verticesLs(0, e->getVertex(i+1)->getIndex());
         bool iC2 = T2.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -941,7 +953,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                        t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(),
                        t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(),
                        t->getVertex(3)->x(), t->getVertex(3)->y(), t->getVertex(3)->z());
-	  Tet.setPolynomialOrder(recur+1);
+          Tet.setPolynomialOrder(recur+1);
           for(int i = 0; i < t->getNumVertices(); i++)
             nodeLs[i] = &verticesLs(0, t->getVertex(i)->getIndex());
           bool iC = Tet.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -1020,12 +1032,12 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
         if(eParent) {copy->setParent(NULL, false); delete copy;}
       }
       else { // no cut
-	int lsTag;
-	if(eType == TYPE_HEX)
-	  lsTag = hexas[nbH]->lsTag();
-	else
-	  lsTag = tetras[nbTe]->lsTag();
-	int reg = getElementaryTag(lsTag, elementary, newElemTags[3]);
+        int lsTag;
+        if(eType == TYPE_HEX)
+          lsTag = hexas[nbH]->lsTag();
+        else
+          lsTag = tetras[nbTe]->lsTag();
+        int reg = getElementaryTag(lsTag, elementary, newElemTags[3]);
         getPhysicalTag(lsTag, gePhysicals, newPhysTags[3]);
         if(eType == TYPE_TET)
           elements[4][reg].push_back(copy);
@@ -1096,7 +1108,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
         DI_Triangle T(e->getVertex(0)->x(), e->getVertex(0)->y(), e->getVertex(0)->z(),
                       e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
                       e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z());
-	T.setPolynomialOrder(recur+1);
+        T.setPolynomialOrder(recur+1);
         for(int i = 0; i < e->getNumVertices(); i++)
           nodeLs[i] = &verticesLs(0, e->getVertex(i)->getIndex());
         isCut = T.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -1107,7 +1119,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
                   e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
                   e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z(),
                   e->getVertex(3)->x(), e->getVertex(3)->y(), e->getVertex(3)->z());
-	Q.setPolynomialOrder(recur+1);
+        Q.setPolynomialOrder(recur+1);
         for(int i = 0; i < e->getNumVertices(); i++)
           nodeLs[i] = &verticesLs(0, e->getVertex(i)->getIndex());
         isCut = Q.cut(RPN, ipV, ipS, cp, integOrder,integOrder,integOrder,
@@ -1119,7 +1131,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
           DI_Triangle Tri(t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z(),
                           t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(),
                           t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z());
-	  Tri.setPolynomialOrder(recur+1);
+          Tri.setPolynomialOrder(recur+1);
           for(int i = 0; i < t->getNumVertices(); i++)
             nodeLs[i] = &verticesLs(0, t->getVertex(i)->getIndex());
           bool iC = Tri.cut(RPN, ipV, ipS, cp, integOrder, integOrder, integOrder,
@@ -1158,7 +1170,7 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
           else
             poly[1].push_back(mt);
         }
-	//if quads
+        //if quads
         for (unsigned int i = nbQ; i < quads.size(); i++){
           MVertex *mv[4] = {NULL, NULL, NULL, NULL};
           for(int j = 0; j < 4; j++){
@@ -1170,15 +1182,15 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
               if (!it.second) newv->deleteLast();
             }
             else {
-	      std::map<int, MVertex*>::iterator it = vertexMap.find(numV);
-	      if(it == vertexMap.end()) {
+              std::map<int, MVertex*>::iterator it = vertexMap.find(numV);
+              if(it == vertexMap.end()) {
                 mv[j] = new MVertex(quads[i]->x(j), quads[i]->y(j),
                                     quads[i]->z(j), 0, numV);
                 vertexMap[numV] = mv[j];
               }
               else mv[j] = it->second;
             }
-	  }
+          }
           MTriangle *mt0 = new MTriangle(mv[0], mv[1], mv[2], 0, 0);
           MTriangle *mt1 = new MTriangle(mv[0], mv[2], mv[3], 0, 0);
           if(quads[i]->lsTag() < 0){
@@ -1243,12 +1255,12 @@ static void elementCutMesh(MElement *e, std::vector<gLevelset *> &RPN,
         if(eParent) {copy->setParent(NULL, false); delete copy;}
       }
       else { // no cut
-	int lsTag;
-	if(eType == TYPE_QUA)
-	  lsTag = quads[nbQ]->lsTag();
-	else
-	  lsTag = triangles[nbTr]->lsTag();
-	int reg = getElementaryTag(lsTag, elementary, newElemTags[2]);
+        int lsTag;
+        if(eType == TYPE_QUA)
+          lsTag = quads[nbQ]->lsTag();
+        else
+          lsTag = triangles[nbTr]->lsTag();
+        int reg = getElementaryTag(lsTag, elementary, newElemTags[2]);
         getPhysicalTag(lsTag, gePhysicals, newPhysTags[2]);
         if(eType == TYPE_TRI)
           elements[2][reg].push_back(copy);
@@ -1411,8 +1423,10 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
   std::vector<gLevelset *> primitives;
   ls->getPrimitivesPO(primitives);
   int primS = primitives.size();
+  std::vector<gLevelset *> RPN;
+  ls->getRPN(RPN);
   int numVert = gm->indexMeshVertices(true);
-  int nbLs = (cutElem) ? ((primS > 1) ? primS + 1 : 1) : 1;
+  int nbLs = (primS > 1) ? primS + 1 : 1;
   fullMatrix<double> verticesLs(nbLs, numVert + 1);
 
  //compute all at once for ls POINTS (type = 11)
@@ -1423,7 +1437,7 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
     }
   }
   for(int k = 0; k < primS; k++){
-    if (primitives[k]->type() == 11){
+    if (primitives[k]->type() == LSPOINTS){
       ((gLevelsetPoints*)primitives[k])->computeLS(vert);
     }
   }
@@ -1433,15 +1447,11 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
     for(unsigned int j = 0; j < gmEntities[i]->getNumMeshVertices(); j++) {
       MVertex *vi = gmEntities[i]->getMeshVertex(j);
       if(vi->getIndex() < 0) continue;
-      if(cutElem){
-        int k = 0;
-        for(; k < primS; k++)
-          verticesLs(k, vi->getIndex()) = (*primitives[k])(vi->x(), vi->y(), vi->z());
-        if(primS > 1)
-          verticesLs(k, vi->getIndex()) = (*ls)(vi->x(), vi->y(), vi->z());
-      }
-      else
-        verticesLs(0, vi->getIndex()) = (*ls)(vi->x(), vi->y(), vi->z());
+      int k = 0;
+      for(; k < primS; k++)
+        verticesLs(k, vi->getIndex()) = (*primitives[k])(vi->x(), vi->y(), vi->z());
+      if(primS > 1)
+        verticesLs(k, vi->getIndex()) = (*ls)(vi->x(), vi->y(), vi->z());
     }
   }
 
@@ -1475,9 +1485,9 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
       for(unsigned int j = 0; j < gmEntities[i]->getNumMeshElements(); j++) {
         MElement *e = gmEntities[i]->getMeshElement(j);
         e->setVolumePositive();
-        elementSplitMesh(e, verticesLs, gmEntities[i], gm, numEle, vertexMap, newParents,
+        elementSplitMesh(e, RPN, verticesLs, gmEntities[i], gm, numEle, vertexMap, newParents,
                          newDomains, elements, physicals, newElemTags, newPhysTags,
-			 borderElemTags, borderPhysTags, ls->getTag());
+                         borderElemTags, borderPhysTags);
         cutGM->getMeshPartitions().insert(e->getPartition());
       }
     }
@@ -1493,8 +1503,6 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
   std::vector<DI_Quad *> quads;
   std::vector<DI_Tetra *> tetras;
   std::vector<DI_Hexa *> hexas;
-  std::vector<gLevelset *> RPN;
-  ls->getRPN(RPN);
   std::vector<int> lsLineRegs;
   for(unsigned int i = 0; i < gmEntities.size(); i++) {
     std::vector<int> oldLineRegs;
-- 
GitLab