From 3b2154ad5c43d17b62ebb0c8fe1dfc9185e173e8 Mon Sep 17 00:00:00 2001
From: Emilie Marchandise <emilie.marchandise@uclouvain.be>
Date: Fri, 17 Jun 2011 07:28:49 +0000
Subject: [PATCH] CPM high is working fine now

---
 Geo/GRbf.cpp | 73 +++++++++++++++++++++-------------------------------
 Geo/GRbf.h   |  2 +-
 2 files changed, 30 insertions(+), 45 deletions(-)

diff --git a/Geo/GRbf.cpp b/Geo/GRbf.cpp
index b07b0576ab..56b108c179 100644
--- a/Geo/GRbf.cpp
+++ b/Geo/GRbf.cpp
@@ -548,7 +548,6 @@ void GRbf::RbfLapSurface_local_CPM(bool isLow,
 
 // }
 
-
 //NEW METHOD #1 CPM GLOBAL HIGH
 void GRbf::RbfLapSurface_global_CPM_high(const fullMatrix<double> &cntrs,
 					const fullMatrix<double> &normals,
@@ -576,8 +575,7 @@ void GRbf::RbfLapSurface_global_CPM_high(const fullMatrix<double> &cntrs,
   evalRbfDer(23,extX,cntrs,surf,syz);
   evalRbfDer(33,extX,cntrs,surf,szz);
 	
-  szz.print("szz");
-  // Finds differentiation matrices
+   // Finds differentiation matrices
   A=generateRbfMat(0,extX,extX,0);
   Ax=generateRbfMat(1,extX,cntrs,0);
   Ay=generateRbfMat(2,extX,cntrs,0);
@@ -591,6 +589,7 @@ void GRbf::RbfLapSurface_global_CPM_high(const fullMatrix<double> &cntrs,
   Alap=generateRbfMat(222,extX,cntrs,0);
 
   // Fills up the operator matrix
+  AOper.resize(nnTot, nnTot);
   for (int i=0;i<numNodes ; ++i){
     for (int j=0;j<nnTot ; ++j){
       AOper(i,j) = Alap(i,j);
@@ -770,10 +769,13 @@ void GRbf::solveHarmonicMap(fullMatrix<double> Oper,
  
 }
 
-void GRbf::UVStoXYZ_global(const double  u_eval, const double v_eval,
+bool GRbf::UVStoXYZ_global(const double  u_eval, const double v_eval,
 			  double &XX, double &YY, double &ZZ, 
-			  SVector3 &dXdu, SVector3& dXdv)
+			  SVector3 &dXdu, SVector3& dXdv) 
 {
+
+  bool converged = true;
+
   int numNodes = 3*nbNodes; //WARNING: THIS IS KO FOR PROJECTION ??
   double norm_s = 0.0;
   fullMatrix<double> u_temp(1,3);
@@ -787,7 +789,7 @@ void GRbf::UVStoXYZ_global(const double  u_eval, const double v_eval,
     u_vec(i,1) = UV(i,1);
     u_vec(i,2) = surfInterp(i,0);
   }
-
+ 
   // u_vec_eval = [u_eval v_eval s_eval]
   fullMatrix<double> u_vec_eval(1, 3);
   u_vec_eval(0,0) = u_eval;
@@ -797,15 +799,13 @@ void GRbf::UVStoXYZ_global(const double  u_eval, const double v_eval,
   //Start with the closest point (u,v)
 #if defined (HAVE_ANN)
   double uvw[3] = { u_eval, v_eval, 0.0 };
-  ANNidxArray index1; 
-  ANNdistArray dist1; 
-  UVkdtree->annkSearch(uvw, 1, index1, dist1);
+  UVkdtree->annkSearch(uvw, num_neighbours, index, dist);
 #endif
-  nodes_eval(0,0) = extendedX(index1[0],0);
-  nodes_eval(0,1) = extendedX(index1[0],1);
-  nodes_eval(0,2) = extendedX(index1[0],2); 
-  u_temp(0,0)  = UV(index1[0],0);
-  u_temp(0,1)  = UV(index1[0],1);
+  nodes_eval(0,0) = extendedX(index[0],0);
+  nodes_eval(0,1) = extendedX(index[0],1);
+  nodes_eval(0,2) = extendedX(index[0],2); 
+  u_temp(0,0)  = UV(index[0],0);
+  u_temp(0,1)  = UV(index[0],1);
   u_temp(0,2)  = 0.0;
 
   int incr =0;
@@ -839,8 +839,10 @@ void GRbf::UVStoXYZ_global(const double  u_eval, const double v_eval,
 
     incr++;
   }  
-  if (norm_s < 5 )
+  if (norm_s < 5 ){
     printf("Newton not converged for point (uv)=(%g,%g -> norm_s =%g )\n", u_eval, v_eval, norm_s);
+    converged = false;
+  }
 
   XX = nodes_eval(0,0);
   YY = nodes_eval(0,1);
@@ -849,25 +851,14 @@ void GRbf::UVStoXYZ_global(const double  u_eval, const double v_eval,
   dXdu = SVector3(Jac(0,0), Jac(1,0), Jac(2,0));
   dXdv = SVector3(Jac(0,1), Jac(1,1), Jac(2,1));
 
-  delete [] index1;
-  delete [] dist1;
-  
+  return converged;
+
 }
 
 bool GRbf::UVStoXYZ(const double  u_eval, const double v_eval,
 		   double &XX, double &YY, double &ZZ, 
 		   SVector3 &dXdu, SVector3& dXdv){
 
-
-  fullMatrix<double> vec(3*nbNodes,3);
-  for (int i=0; i<3*nbNodes;i++){
-    vec(i,0) =  normals(i,0);
-    vec(i,1) =  normals(i,1);
-    vec(i,2) =  normals(i,2);
-    printf("%g %g %g\n", vec(i,0),vec(i,1),vec(i,2));
-  }
-  exit(1);
-
   //Finds the U,V,S (in the 0-level set) that are the 'num_neighbours' closest to u_eval and v_eval.
   //Thus in total, we're working with '3*num_neighbours' nodes
   //Say that the vector 'index' gives us the indices of the closest points
@@ -876,9 +867,7 @@ bool GRbf::UVStoXYZ(const double  u_eval, const double v_eval,
 
 #if defined (HAVE_ANN)
    double uvw[3] = { u_eval, v_eval, 0.0 };
-   ANNidxArray index2 = new ANNidx[num_neighbours];
-   ANNdistArray dist2 = new ANNdist[num_neighbours];
-   UVkdtree->annkSearch(uvw, num_neighbours, index2, dist2);
+   UVkdtree->annkSearch(uvw, num_neighbours, index, dist);
 #endif
 
   fullMatrix<double> ux(1,3), uy(1,3), uz(1,3), u_temp(1,3);
@@ -886,7 +875,6 @@ bool GRbf::UVStoXYZ(const double  u_eval, const double v_eval,
   fullMatrix<double> u_vec(3*num_neighbours,3); 
   fullMatrix<double> xyz_local(3*num_neighbours,3); 
 
-
   // u_vec = [u v s] : These are the u,v,s that are on the surface *and* outside of it also! 
   for (int i = 0; i < num_neighbours; i++){
 
@@ -905,17 +893,17 @@ bool GRbf::UVStoXYZ(const double  u_eval, const double v_eval,
 
 
     //THE LOCAL XYZ
-    xyz_local(i,0) = extendedX(index2[i],0);
-    xyz_local(i,1) = extendedX(index2[i],1);
-    xyz_local(i,2) = extendedX(index2[i],2);
+    xyz_local(i,0) = extendedX(index[i],0);
+    xyz_local(i,1) = extendedX(index[i],1);
+    xyz_local(i,2) = extendedX(index[i],2);
 
-    xyz_local(i+num_neighbours,0) = extendedX(index2[i]+nbNodes,0); 
-    xyz_local(i+num_neighbours,1) = extendedX(index2[i]+nbNodes,1);
-    xyz_local(i+num_neighbours,2) = extendedX(index2[i]+nbNodes,2);
+    xyz_local(i+num_neighbours,0) = extendedX(index[i]+nbNodes,0); 
+    xyz_local(i+num_neighbours,1) = extendedX(index[i]+nbNodes,1);
+    xyz_local(i+num_neighbours,2) = extendedX(index[i]+nbNodes,2);
 
-    xyz_local(i+2*num_neighbours,0) = extendedX(index2[i]+2*nbNodes,0);
-    xyz_local(i+2*num_neighbours,1) = extendedX(index2[i]+2*nbNodes,1);
-    xyz_local(i+2*num_neighbours,2) = extendedX(index2[i]+2*nbNodes,2);
+    xyz_local(i+2*num_neighbours,0) = extendedX(index[i]+2*nbNodes,0);
+    xyz_local(i+2*num_neighbours,1) = extendedX(index[i]+2*nbNodes,1);
+    xyz_local(i+2*num_neighbours,2) = extendedX(index[i]+2*nbNodes,2);
 
   }
   // u_vec_eval = [u_eval v_eval s_eval]
@@ -978,9 +966,6 @@ bool GRbf::UVStoXYZ(const double  u_eval, const double v_eval,
   ZZ = nodes_eval(0,2);
   dXdu = SVector3(Jac(0,0), Jac(1,0), Jac(2,0));
   dXdv = SVector3(Jac(0,1), Jac(1,1), Jac(2,1));
-
-   delete [] index2;
-   delete [] dist2;
  
   return converged;
 }
diff --git a/Geo/GRbf.h b/Geo/GRbf.h
index cad135e2b4..39a0d57205 100644
--- a/Geo/GRbf.h
+++ b/Geo/GRbf.h
@@ -132,7 +132,7 @@ class GRbf {
 		 const fullMatrix<double> &node,
 		 fullMatrix<double> &curvature);
 
- void UVStoXYZ_global(const double u_eval, const double v_eval,
+  bool UVStoXYZ_global(const double u_eval, const double v_eval,
 		      double &XX, double &YY, double &ZZ, 
 		      SVector3 &dXdu, SVector3& dxdv);
 
-- 
GitLab