From e67ea5a9e68927965f70084514410784cf5d1382 Mon Sep 17 00:00:00 2001
From: Emilie Marchandise <emilie.marchandise@uclouvain.be>
Date: Thu, 11 Mar 2010 13:22:13 +0000
Subject: [PATCH]

---
 Solver/multiscaleLaplace.cpp | 90 +++++++++++++++++++++++++-----------
 Solver/multiscaleLaplace.h   |  2 +-
 2 files changed, 65 insertions(+), 27 deletions(-)

diff --git a/Solver/multiscaleLaplace.cpp b/Solver/multiscaleLaplace.cpp
index 60575ca8d5..953dcdc192 100644
--- a/Solver/multiscaleLaplace.cpp
+++ b/Solver/multiscaleLaplace.cpp
@@ -215,7 +215,9 @@ static int intersection_segments (SPoint2 &p1, SPoint2 &p2,
 }
 //--------------------------------------------------------------
 static void recur_compute_centers_ (double R, double a1, double a2,
-				    multiscaleLaplaceLevel * root ){
+				    multiscaleLaplaceLevel * root, int &nbElems ){
+  
+  nbElems += root->elements.size();
 
   root->radius = R;
   std::vector<std::pair<SPoint2,multiscaleLaplaceLevel*> > &centers = root->cut;
@@ -227,9 +229,10 @@ static void recur_compute_centers_ (double R, double a1, double a2,
   centers.push_back(std::make_pair(PL,zero));  
   centers.push_back(std::make_pair(PR,zero)); 
  
-  std::map<SPoint2, double> CR;
+  //std::map<SPoint2, double> CR;
   for (int i=0;i<root->children.size();i++){
-    multiscaleLaplaceLevel* m = root->children[i];    
+    multiscaleLaplaceLevel* m = root->children[i]; 
+    if( !m) printf("no child \n");
     centers.push_back(std::make_pair(m->center,m));   
     m->radius = 0.0;
     for (std::map<MVertex*,SPoint2>::iterator it = m->coordinates.begin();
@@ -238,7 +241,7 @@ static void recur_compute_centers_ (double R, double a1, double a2,
       m->radius = std::max(m->radius,sqrt ((m->center.x() - p.x())*(m->center.x() - p.x())+
 					   (m->center.y() - p.y())*(m->center.y() - p.y())));
     }
-    CR.insert(std::make_pair(m->center, m->radius));
+    //CR.insert(std::make_pair(m->center, m->radius));
   }
 
   //add the center of real holes ... 
@@ -278,6 +281,24 @@ static void recur_compute_centers_ (double R, double a1, double a2,
   //sort centers
   std::sort(centers.begin(),centers.end(), sort_pred());
 
+  int nbrecur = 0;
+  for (int i=1;i<centers.size()-1;i++){
+    multiscaleLaplaceLevel* m1 = centers[i-1].second;
+    multiscaleLaplaceLevel* m2 = centers[i].second;
+    multiscaleLaplaceLevel* m3 = centers[i+1].second;
+    if (m2) {
+      nbrecur ++;
+    }
+  }
+  if (root->children.size()!= nbrecur) {
+    printf("children =%d nbrecur =%d \n", root->children.size(), nbrecur);
+    for (int i=0;i<centers.size();i++){
+      printf("center i=%d (%g %g)\n", i, centers[i].first.x(), centers[i].first.x());
+      if(centers[i].second) printf(" level %d recur %d elems =%d\n", centers[i].second->recur, centers[i].second->region );
+    }
+  }
+
+
   for (int i=1;i<centers.size()-1;i++){
     multiscaleLaplaceLevel* m1 = centers[i-1].second;
     multiscaleLaplaceLevel* m2 = centers[i].second;
@@ -285,7 +306,7 @@ static void recur_compute_centers_ (double R, double a1, double a2,
     if (m2){
       a1 = myatan2 (centers[i-1].first.y()- m2->center.y() , centers[i-1].first.x()-m2->center.x()); 
       a2 = myatan2 (centers[i+1].first.y()- m2->center.y() , centers[i+1].first.x()-m2->center.x()); 
-      recur_compute_centers_ (m2->radius, a1, a2, m2);
+      recur_compute_centers_ (m2->radius, a1, a2, m2, nbElems);
     }
   }
 
@@ -486,8 +507,9 @@ static void connectedRegions (std::vector<MElement*> &elements,
 static void recur_cut_ (double R, double a1, double a2,
 			multiscaleLaplaceLevel * root, 
 			std::vector<MElement *> &left, 
-			std::vector<MElement *> &right ){
+			std::vector<MElement *> &right , int &totNbElems){
 
+  totNbElems += root->elements.size();
 
   SPoint2 PL (R*cos(a1),R*sin(a1));
   SPoint2 PR (R*cos(a2),R*sin(a2));
@@ -516,11 +538,11 @@ static void recur_cut_ (double R, double a1, double a2,
 // 	right.push_back(root->elements[i]);
 //     }
 //     else{
-      if (nbIntersect %2 != 0)
-	left.push_back(root->elements[i]);
-      else
-	right.push_back(root->elements[i]);
- //    }
+    if (nbIntersect %2 != 0)
+      left.push_back(root->elements[i]);
+    else
+      right.push_back(root->elements[i]);
+    //}
   }
   
   for (int i = 1; i < centers.size() - 1; i++){
@@ -530,7 +552,7 @@ static void recur_cut_ (double R, double a1, double a2,
     if (m2){
       a1 = myatan2 (centers[i-1].first.y() - m2->center.y() , centers[i-1].first.x() - m2->center.x() ); 
       a2 = myatan2 (centers[i+1].first.y() - m2->center.y() , centers[i+1].first.x() - m2->center.x() );
-      recur_cut_ (m2->radius, a1, a2, m2, left, right);
+      recur_cut_ (m2->radius, a1, a2, m2, left, right, totNbElems);
     }
   }
 }
@@ -783,7 +805,10 @@ multiscaleLaplace::multiscaleLaplace (std::vector<MElement *> &elements,
   root->recur = 0;
   root->region = 0;
   root->scale = 1.0;
-  parametrize(*root);
+
+  int totNbElems = 0;
+  parametrize(*root, totNbElems);
+  printf("PARAM:  elements =%d, totNbElems = %d \n", elements.size(), totNbElems); 
 
   //fill the coordinates
   std::vector<double> iScale; 
@@ -791,7 +816,9 @@ multiscaleLaplace::multiscaleLaplace (std::vector<MElement *> &elements,
   fillCoordinates(*root, allCoordinates, iScale, iCenter);
 
   //Compute centers for the cut
-  recur_compute_centers_ (1.0, M_PI, 0.0, root);
+  int nbElems = 0;
+  recur_compute_centers_ (1.0, M_PI, 0.0, root, nbElems);
+  printf("CENTERS: elements =%d, bElems = %d \n", elements.size(), nbElems);
 
   //Partition the mesh in left and right
   cut (elements); 
@@ -879,7 +906,7 @@ void multiscaleLaplace::fillCoordinates (multiscaleLaplaceLevel & level,
   
 }
 
-void multiscaleLaplace::parametrize (multiscaleLaplaceLevel & level){
+void multiscaleLaplace::parametrize (multiscaleLaplaceLevel & level, int &totNbElems){
 
 
   //Compute all nodes for the level
@@ -938,8 +965,7 @@ void multiscaleLaplace::parametrize (multiscaleLaplaceLevel & level){
       else  tooSmall.insert(tooSmall.begin(), regGoodSize[i].begin(),  regGoodSize[i].end());
     }
   }
-  level.elements.clear();
-  level.elements = goodSize;
+
 
   //Add the not too small regions to the level.elements 
   std::vector<std::vector<MElement*> >  regions_, regions ;
@@ -955,9 +981,20 @@ void multiscaleLaplace::parametrize (multiscaleLaplaceLevel & level){
     }
     if(really_small_elements ) regions.push_back(regions_[i]);
     else
-      level.elements.insert(level.elements.begin(), regions_[i].begin(), regions_[i].end() );
+      goodSize.insert(goodSize.begin(), regions_[i].begin(), regions_[i].end() );
   }  
 
+  int nbsmall = 0;
+  for (unsigned int i = 0; i < regions.size(); i++)   
+  nbsmall += regions[i].size() ;
+  if(level.elements.size() != goodSize.size()+ nbsmall) {
+    printf("allNodes =%d, good =%d + small= %d \n", allNodes.size(), goodSize.size(), nbsmall);
+    exit(1);
+  }
+
+  level.elements.clear();
+  level.elements = goodSize;
+
   //Fill level.coordinates
   std::set<MVertex*> goodSizev;
   for(unsigned int i = 0; i < level.elements.size(); ++i){
@@ -969,6 +1006,8 @@ void multiscaleLaplace::parametrize (multiscaleLaplaceLevel & level){
     }
   }
 
+  totNbElems += level.elements.size();
+
   //Save multiscale meshes
   char name[245];
   sprintf(name,"multiscale_%d_%d_real.msh",level.recur, level.region);
@@ -1011,7 +1050,7 @@ void multiscaleLaplace::parametrize (multiscaleLaplaceLevel & level){
     if (!tooSmallv.empty()){
       Msg::Info("Level (%d-%d) Multiscale Laplace (reg[%d] =  %d too small)",level.recur,level.region, i, tooSmallv.size());
       level.children.push_back(nextLevel);
-      parametrize (*nextLevel);
+      parametrize (*nextLevel, totNbElems);
     }
   }
 
@@ -1075,16 +1114,15 @@ void multiscaleLaplace::cut (std::vector<MElement *> &elements)
 {
 
   std::vector<MElement*> left,right;
-  recur_cut_ (1.0, M_PI, 0.0, root,left,right);
-  if ( elements.size() != left.size()+right.size()) 
-    Msg::Error("Cutting laplace wrong nb elements (%d) != left + right (%d)",  elements.size(), left.size()+right.size());
-
-  connected_left_right(left, right);
-
+  int totNbElems = 0;
+  recur_cut_ (1.0, M_PI, 0.0, root,left,right, totNbElems);
   if ( elements.size() != left.size()+right.size()) {
-    Msg::Error("Cutting laplace wrong nb elements (%d) != left + right (%d)",  elements.size(), left.size()+right.size());
+    Msg::Error("Cutting laplace wrong nb elements (%d) != left + right (%d) TOTRECUR=%d",  elements.size(), left.size()+right.size(), totNbElems);
     exit(1);
   }
+  connected_left_right(left, right);
+
+
 
   elements.clear();
   elements.insert(elements.end(),left.begin(),left.end());
diff --git a/Solver/multiscaleLaplace.h b/Solver/multiscaleLaplace.h
index 0bb5c6eec2..7f309fadd2 100644
--- a/Solver/multiscaleLaplace.h
+++ b/Solver/multiscaleLaplace.h
@@ -35,7 +35,7 @@ public:
 			std::map<MVertex*, SPoint3> &allCoordinates,
 			std::vector<double> &iScale, 
 			std::vector<SPoint2> &iCenter);
-  void parametrize (multiscaleLaplaceLevel &); 
+  void parametrize (multiscaleLaplaceLevel &, int &totNbElems); 
   void parametrize_method (multiscaleLaplaceLevel & level, 
 			   std::set<MVertex*> &allNodes,
 			   std::map<MVertex*,SPoint2> &solution, 
-- 
GitLab