From bb377d67b555f56cc7278abb70dd1f42f3cfde4c Mon Sep 17 00:00:00 2001
From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be>
Date: Tue, 22 Mar 2016 11:22:40 +0000
Subject: [PATCH] debugged

---
 Geo/discreteDiskFace.cpp | 379 +++++++++++++--------------------------
 1 file changed, 120 insertions(+), 259 deletions(-)

diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp
index 47085b4491..a055b7b345 100644
--- a/Geo/discreteDiskFace.cpp
+++ b/Geo/discreteDiskFace.cpp
@@ -51,13 +51,6 @@ static void discreteDiskFaceBB(void *a, double*mmin, double*mmax)
   }
   mmin[2] = -1;
   mmax[2] = 1;
-  const double dx = mmax[0] - mmin[0];
-  const double dy = mmax[1] - mmin[1];
-  const double eps = 0.0;//1.e-12;
-  mmin[0] -= eps*dx;
-  mmin[1] -= eps*dy;
-  mmax[0] += eps*dx;
-  mmax[1] += eps*dy;
 }
 
 static void discreteDiskFaceCentroid(void *a, double*c)
@@ -75,8 +68,6 @@ static int discreteDiskFaceInEle(void *a, double*c)// # mark
 
   double X[2];
   const double eps = 1.e-8;
-
-  
   
   if (t->tri->getPolynomialOrder() == 1){
 
@@ -136,7 +127,6 @@ static bool orderVertices(const double &tot_length, const std::vector<MVertex*>
 discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int p) :
   GFace(gf->model(),123), _parent (gf)
 {
-
   _order = p;
   _N = (p+1)*(p+2)/2;
 
@@ -148,21 +138,14 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int
   case 2:
     tagElementOrder = MSH_TRI_6;
     break;
-  case 3:
-    tagElementOrder = MSH_TRI_10;
-    break;
   default:
-    Msg::Error("discreteDiskFace:: builder, tag is not (yet) covered for this order :-) ");
+    tagElementOrder = -1;
+    Msg::Error("discreteDiskFace:: only p=1 or p=2 allowed");
   }
-
   mynodalbasis = BasisFactory::getNodalBasis(tagElementOrder);
-  fullMatrix<double> myNodes;
-  mynodalbasis->getReferenceNodes(myNodes);  
-
-  mybezierbasis = BasisFactory::getBezierBasis(TYPE_TRI,_order);
 
   std::map<MVertex*,MVertex*> v2v;// mesh vertex |-> face vertex 
-  std::map<MEdge,std::vector<MVertex*>,Less_Edge> ed2nodes; // edge to interior node(s) 
+  std::map<MEdge,MVertex*,Less_Edge> ed2nodes; // edge to interior node(s) 
   for (unsigned int i=0;i<mesh.size();i++){ // triangle by triangle
 
     std::vector<MVertex*> vs; // MTriangle vertices
@@ -184,77 +167,32 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int
 	  discreteEdge *de = dynamic_cast<discreteEdge*> (v->onWhat());
 	  vs.push_back(de->getGeometricalVertex(v));
 	}
-	
 	else Msg::Fatal("fatality");
       }
-      else vs.push_back(v);
-
-      
-    }// end loop over vertices and edges
-    if (_order >= 2) {// then, interior nodes :-)
-      double Xi, Eta, X, Y,Z;
-      
+      else vs.push_back(v);      
+    }
+    if (_order == 2) {// then, interior nodes :-)
       for (unsigned int ie=0; ie<3; ie++){ // firstly, edge interior nodes :-)
-
 	MEdge me = mesh[i]->getEdge(ie); // check if edge already visited
-	if(ed2nodes.find(me) == ed2nodes.end()){
-	  
-	  for(unsigned int iev=3+ie*(p-1);iev<3+(ie+1)*(p-1);iev++){
-	    Xi = myNodes(iev,0);
-	    Eta = myNodes(iev,1);
-	
-	    X = vs[0]->x()*(1.-Xi-Eta) + vs[1]->x()*Xi + vs[2]->x()*Eta;
-	    Y = vs[0]->y()*(1.-Xi-Eta) + vs[1]->y()*Xi + vs[2]->y()*Eta;
-	    Z = vs[0]->z()*(1.-Xi-Eta) + vs[1]->z()*Xi + vs[2]->z()*Eta;
-
-	    MVertex* mv = new MVertex(X,Y,Z,gf);
-	    vs.push_back(mv);
-	    ed2nodes[me].push_back(mv);
-	  }	  
-	}
+	std::map<MEdge,MVertex*,Less_Edge>::iterator it = ed2nodes.find(me);
+	if(it == ed2nodes.end()){
+	  SPoint3 c = me.barycenter();
+	  MVertex* mv = new MVertex(c.x(),c.y(),c.z(),gf);
+	  vs.push_back(mv);
+	  discrete_vertices.push_back(mv);
+	  ed2nodes[me]=mv;
+	}	  
 	else{
-	  std::vector<MVertex*> vecmv = ed2nodes[me];
-	  for(unsigned int iev=0; iev<(p-1); iev++)
-	    vs.push_back(vecmv[iev]);	  
+	  vs.push_back(it->second);	  
 	}
       }
-      
-      for (unsigned int iv=3*_order; iv<_N; iv++){ // then, volume nodes
-	
-	Xi = myNodes(iv,0);
-	Eta = myNodes(iv,1);
-	
-	X = vs[0]->x()*(1.-Xi-Eta) + vs[1]->x()*Xi + vs[2]->x()*Eta;
-	Y = vs[0]->y()*(1.-Xi-Eta) + vs[1]->y()*Xi + vs[2]->y()*Eta;
-	Z = vs[0]->z()*(1.-Xi-Eta) + vs[1]->z()*Xi + vs[2]->z()*Eta;
-	
-	vs.push_back(new MVertex(X,Y,Z,gf));
-      }
-    }// end order > 2
-
+    }// end order == 2
     if (_order==1)
       discrete_triangles.push_back(new MTriangle (vs));
-
-    if (_order==2)
+    else if (_order==2)
       discrete_triangles.push_back(new MTriangle6 (vs));
-    
-    if (_order > 2)
-      discrete_triangles.push_back(new MTriangleN (vs,(char)_order));
-
-    for(unsigned int check=0; check<_N; check++)
-      std::cout << "(" << vs[check]->x() << ";" << vs[check]->y() << ")\t";
-    std::cout << "\n";
-    for(unsigned int check=0; check<_N; check++)  
-      std::cout << "(" << myNodes(check,0) << ";" << myNodes(check,1) << ")\t";
-    std::cout << "\n";    
-    
   }// end loop over triangles
-
-  // delete MTriangle* and MVertex ?  Y E S # mark
-
-
-  uv_kdtree = NULL;
-  kdtree = NULL; 
+  
   std::cout << "buildAllNodes" << std::endl;
   buildAllNodes();
   std::cout << "getBoundingEdges" << std::endl;
@@ -292,7 +230,7 @@ void discreteDiskFace::getBoundingEdges()
   std::map<MElement*,std::vector<MElement*> > neighbors;
   for (unsigned int i=0; i<discrete_triangles.size(); ++i){
     MElement* e = discrete_triangles[i];
-    for( unsigned int j=0; j<e->getNumEdges(); j++){ // #fixme: efficiency could be improved by setting neighbors mutually
+    for(int j=0; j<e->getNumEdges(); j++){ // #fixme: efficiency could be improved by setting neighbors mutually
       std::vector<MElement*> my_mt = ed2tri[e->getEdge(j)];
       if (my_mt.size() > 1){// my_mt.size() = {1;2}
 	MElement* neighTri  = my_mt[0] == e ? my_mt[1] : my_mt[0];
@@ -301,7 +239,6 @@ void discreteDiskFace::getBoundingEdges()
     }
   }
 
-
   // queue: first in, first out
   std::queue<MElement*> checkList; // element for reference orientation
   std::queue< std::vector<MElement*> > checkLists; // corresponding neighbor element to be checked for its orientation
@@ -405,7 +342,7 @@ void discreteDiskFace::getBoundingEdges()
 
       MVertex* previous = first;
 
-      for(int i=0; i<=myV.size()-1; i++){ 
+      for(unsigned int i=0; i<=myV.size()-1; i++){ 
 
 	MVertex* current = myV[i];
 	
@@ -434,153 +371,30 @@ void discreteDiskFace::getBoundingEdges()
 
 void discreteDiskFace::buildOct() const
 {
-  SBoundingBox3d bb;
-  int count = 0;
-  for(unsigned int i = 0; i < discrete_triangles.size(); ++i){
-    MTriangle *t = discrete_triangles[i];
-    //create bounding box
-    for(int j = 0; j < t->getNumVertices(); j++){
-      std::map<MVertex*,SPoint3>::const_iterator itj = coordinates.find(t->getVertex(j));
-      _coordPoints.insert(std::make_pair(t->getVertex(j)->point(), itj->second));// <tr(x;y;z);tr(u;v)>     
-      if (_order == 2 && j>2){
-	int ij = j == 5 ? 0 : j-2;
-	double du = itj->second.x() - (t->getVertex(j-3)->x()+t->getVertex(ij)->x())/2.;
-	double dv = itj->second.y() - (t->getVertex(j-3)->y()+t->getVertex(ij)->y())/2.;
-	bb += SPoint3(itj->second.x()+du,itj->second.y()+dv,0.);
-      }
-      else
-	bb += SPoint3(itj->second.x(), itj->second.y(),0.);
-    }
-    count++;
-  }
-
-  // ANN octree
-  ANNpointArray nodes = annAllocPts(count, _N);
-
-  // make bounding box
-  SPoint3 bbmin = bb.min(), bbmax = bb.max();
-  double origin[3] = {bbmin.x(), bbmin.y(), bbmin.z()};
-  double ssize[3] = {bbmax.x() - bbmin.x(),
-                     bbmax.y() - bbmin.y(),
-                     bbmax.z() - bbmin.z()};
 
-  _ddft = new discreteDiskFaceTriangle[count];
+  double origin[3] = {-1.01,-1.01,-1.0};
+  double ssize[3] = {2.02,2.02,2.0};
   const int maxElePerBucket = 15;
   oct = Octree_Create(maxElePerBucket, origin, ssize, discreteDiskFaceBB,
                       discreteDiskFaceCentroid, discreteDiskFaceInEle);
-
-  count = 0;
+  
+  _ddft = new discreteDiskFaceTriangle[discrete_triangles.size()];
   for(unsigned int i = 0; i < discrete_triangles.size(); ++i){
     MTriangle *t = discrete_triangles[i];
-    discreteDiskFaceTriangle* my_ddft = &_ddft[count];
-    init_ddft(my_ddft); // #fixme destructor
-    for(unsigned int io=0; io<_N; io++){
-      std::map<MVertex*,SPoint3>::const_iterator it =
-	coordinates.find(t->getVertex(io));
-      my_ddft->p[io] = it->second;
-    }
-    if(geomType() != GEntity::DiscreteDiskSurface){// CAD
-      if (t->getVertex(0)->onWhat()->dim() == 2){
-	for(unsigned int io=1; io<_N; io++)
-	  reparamMeshEdgeOnFace(t->getVertex(0), t->getVertex(io), _parent,
-			      my_ddft->gfp[0], my_ddft->gfp[io]);	
-      }
-      else if (t->getVertex(1)->onWhat()->dim() == 2){
-	for(unsigned int io=0; io<_N; io++)
-	  if (io != 1)
-	    reparamMeshEdgeOnFace(t->getVertex(1), t->getVertex(io), _parent,
-				  my_ddft->gfp[1], my_ddft->gfp[io]);	
-      }
-      else if (t->getVertex(2)->onWhat()->dim() == 2){
-	for(unsigned int io=0; io<_N; io++)
-	  if (io != 2)
-	    reparamMeshEdgeOnFace(t->getVertex(2), t->getVertex(io), _parent,
-				  my_ddft->gfp[2], my_ddft->gfp[io]);	
-      }
-      else {// quid interior vertices ?
-	for(unsigned int io=0; io<_N; io++)
-	  reparamMeshVertexOnFace(t->getVertex(io), _parent, my_ddft->gfp[io]);
-      }
-    }
-    for(unsigned int io=0; io<_N; io++)
-      my_ddft->v[io] = SPoint3(t->getVertex(io)->x(), t->getVertex(io)->y(),
-				   t->getVertex(io)->z());
-
+    discreteDiskFaceTriangle* my_ddft = &_ddft[i];
+    for(int io=0; io<_N; io++)my_ddft->p[io] = coordinates[t->getVertex(io)];    
     my_ddft->gf = _parent;
-    my_ddft->tri = t;
-  
-    SVector3 dXdxi (my_ddft->v[1] - my_ddft->v[0]); // constant
-    SVector3 dXdeta(my_ddft->v[2] - my_ddft->v[0]); // constant
-
-    double grads[_N][3];// u,v,w=0,grads    
-    for(unsigned int myI=0; myI<t->getNumVertices(); myI++){
-      double U,V,W;
-      t->getNode(myI,U,V,W); // Xi Eta
-      mynodalbasis->df(U,V,0,grads);
-      
-      //compute first derivatives for every triangle 
-      // (dXi/dU)^-1 = dU/dXi
-      double mat[2][2] = {{0.,0.},{0.,0.}};
-      for(unsigned int io=0; io<_N; io++){
-	for (unsigned int ic=0; ic<2; ic++){
-	  mat[0][ic] += my_ddft->p[io].x() * grads[io][ic];
-	  mat[1][ic] += my_ddft->p[io].y() * grads[io][ic];
-	}
-      }
-      
-      double inv[2][2];
-      inv2x2(mat,inv);      
-      
-      SVector3 dXdu(dXdxi * inv[0][0] + dXdeta * inv[1][0]);
-      SVector3 dXdv(dXdxi * inv[0][1] + dXdeta * inv[1][1]);
-      firstElemDerivatives[(MElement*)t].push_back(Pair<SVector3,SVector3>(dXdu,dXdv));
-    }
-    nodes[count][0] = 0.;
-    nodes[count][1] = 0.;
-    nodes[count][2] = 0.;
-    for(unsigned int io=0; io<_N; io++){     
-      nodes[count][0] +=  my_ddft->p[io].x();
-      nodes[count][1] +=  my_ddft->p[io].y();
-    } 
-    nodes[count][0] /= (double) _N;// #notsure
-    nodes[count][1] /= (double) _N; 
-
+    my_ddft->tri = t;    
     Octree_Insert(my_ddft, oct);
-    count++;
-  }// end big for over mesh[i]
-
-  Octree_Arrange(oct);
-
-  //smooth first derivatives at vertices
-  if(adjv.size() == 0){
-    std::vector<MTriangle*> allTri; // 
-    allTri.insert(allTri.end(), discrete_triangles.begin(), discrete_triangles.end() );
-    buildVertexToTriangle(allTri, adjv);
   }
-  for(v2t_cont::iterator it = adjv.begin(); it!= adjv.end(); ++it){
-    MVertex *v = it->first;
-    std::vector<MElement*> vTri = it->second;
-    SVector3 dXdu(0.0), dXdv(0.0);
-    int nbTri = vTri.size();
-    for (int j = 0; j < nbTri; j++){ // elements's contribution for a vertex
-      std::vector<Pair<SVector3,SVector3> > myVec = firstElemDerivatives[vTri[j]];      
-      dXdu += myVec[nodeLocalNum(vTri[j],v)].first();
-      dXdv += myVec[nodeLocalNum(vTri[j],v)].second();
-    }
-    dXdu *= 1./nbTri;
-    dXdv *= 1./nbTri;
-    firstDerivatives[v] = Pair<SVector3, SVector3>(dXdu, dXdv);
-  }
-
-  kdtree = new ANNkd_tree(nodes, count, _N); // #notsure
-
+  Octree_Arrange(oct);
 }
 
 
 bool discreteDiskFace::parametrize() const
 { // mark, to improve
 
-  Msg::Info("Parametrizing surface %d with 'harmonic map'", tag());
+  Msg::Info("Parametrizing surface %d with 'one-to-one map'", tag());
 
   linearSystem<double> *lsys_u;
   linearSystem<double> *lsys_v;
@@ -591,6 +405,8 @@ bool discreteDiskFace::parametrize() const
   dofManager<double> myAssemblerU(lsys_u);   // hashing
   dofManager<double> myAssemblerV(lsys_v);
 
+  // FIXME problem here : boundary conditions are wrong for 2nd order nodes
+
   for(size_t i = 0; i < _U0.size(); i++){
     MVertex *v = _U0[i];
     const double theta = 2 * M_PI * _coords[i];
@@ -600,7 +416,7 @@ bool discreteDiskFace::parametrize() const
 
   for(size_t i = 0; i < discrete_triangles.size(); ++i){
     MTriangle *t = discrete_triangles[i];
-    for(unsigned int j=0; j<t->getNumVertices(); j++){
+    for(int j=0; j<t->getNumVertices(); j++){
       myAssemblerU.numberVertex(t->getVertex(j), 0, 1);
       myAssemblerV.numberVertex(t->getVertex(j), 0, 1);
     }
@@ -678,11 +494,25 @@ void discreteDiskFace::getTriangleUV(const double u,const double v,
     _v = X[1];// eta
   }
   else{// newton raphson
-    discreteDiskFaceTriangle *my_ddft = *mt;
-    double Xi[3];
-    my_ddft->tri->xyz2uvw(uv,Xi);
-    _u = Xi[0];
-    _v = Xi[1];
+    std::vector<MVertex*> vs; 
+    MVertex v0  ((*mt)->p[0].x(),(*mt)->p[0].y(),0);
+    MVertex v1  ((*mt)->p[1].x(),(*mt)->p[1].y(),0);
+    MVertex v2  ((*mt)->p[2].x(),(*mt)->p[2].y(),0);
+    MVertex v3  ((*mt)->p[3].x(),(*mt)->p[3].y(),0);
+    MVertex v4  ((*mt)->p[4].x(),(*mt)->p[4].y(),0);
+    MVertex v5  ((*mt)->p[5].x(),(*mt)->p[5].y(),0);
+    vs.push_back(&v0);
+    vs.push_back(&v1);
+    vs.push_back(&v2);
+    vs.push_back(&v3);
+    vs.push_back(&v4);
+    vs.push_back(&v5);
+    MTriangle6 t (vs);
+    double xyz[3] = {u,v,0};
+    double uv[2];
+    t.xyz2uvw(xyz,uv);
+    _u = uv[0];// xi
+    _v = uv[1];// eta    
   }  
 }
 
@@ -727,11 +557,13 @@ GPoint discreteDiskFace::point(const double par1, const double par2) const
   //polynomialBasis myPolynomial = polynomialBasis(dt->tri->getTypeForMSH());
   double eval[_N]; 
   mynodalbasis->f(U,V,0.,eval);//#mark
-  SPoint3 p;
-  for(int io=0; io<_N; io++)
-    p += dt->v[io]*eval[io];
-
-  return GPoint(p.x(),p.y(),p.z(),_parent,par);
+  double X=0,Y=0,Z=0;
+  for(int io=0; io<_N; io++){
+    X += dt->tri->getVertex(io)->x()*eval[io];
+    Y += dt->tri->getVertex(io)->y()*eval[io];
+    Z += dt->tri->getVertex(io)->z()*eval[io];
+  }
+  return GPoint(X,Y,Z,_parent,par);
 }
 
 SPoint2 discreteDiskFace::parFromVertex(MVertex *v) const
@@ -766,7 +598,7 @@ SPoint2 discreteDiskFace::parFromVertex(MVertex *v) const
   else if (v->onWhat()->dim()==0){
     Msg::Fatal("discreteDiskFace::parFromVertex vertex classified on a model vertex that is not part of the face");
   }
-
+  return SPoint2(0,0);
 }
 
 SVector3 discreteDiskFace::normal(const SPoint2 &param) const
@@ -800,26 +632,55 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 &param) const
     return Pair<SVector3, SVector3>(SVector3(1,0,0), SVector3(0,1,0));
   }
   
-  SVector3 dXdU = 0.;//dXdu1*(1.-U-V) + dXdu2*U + dXdu3*V;
-  SVector3 dXdV = 0.;//dXdv1*(1.-U-V) + dXdv2*U + dXdv3*V;
 
-  double eval[_N]; 
-  mynodalbasis->f(U,V,0.,eval); //#mark
-
-  for (unsigned int io=0; io<_N; io++){
-    std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it =
-      firstDerivatives.find(tri->getVertex(io));
-    if (it == firstDerivatives.end()) Msg::Fatal ("Vertex %d (%d) has no firstDerivatives",
-						  tri->getVertex(io)->getNum(),io);
-    SVector3 dXdu = it->second.first();
-    SVector3 dXdv = it->second.second();
-
-    dXdU += dXdu * eval[io];
-    dXdV += dXdv * eval[io];
+  double df[_N][3]; 
+  mynodalbasis->df(U,V,0.,df); 
+ 
+  double dxdxi[3][2] = {{0,0},{0,0},{0,0}};
+
+  double dudxi[2][2] = {{0,0},{0,0}};
+
+  for (int io=0; io<_N; io++){
+    double X = tri->getVertex(io)->x();
+    double Y = tri->getVertex(io)->y();
+    double Z = tri->getVertex(io)->z();
+
+    double U = ddft->p[io].x();
+    double V = ddft->p[io].y();
+
+    dxdxi[0][0] += X*df[io][0];
+    dxdxi[0][1] += X*df[io][1];
+ 
+    dxdxi[1][0] += Y*df[io][0];
+    dxdxi[1][1] += Y*df[io][1];
+
+    dxdxi[2][0] += Z*df[io][0];
+    dxdxi[2][1] += Z*df[io][1];
+
+    dudxi[0][0] += U*df[io][0];
+    dudxi[0][1] += U*df[io][1];
+
+    dudxi[1][0] += V*df[io][0];
+    dudxi[1][1] += V*df[io][1];
   }
+  
 
-  return Pair<SVector3, SVector3>(dXdU,dXdV);
+  double dxidu[2][2];
+  inv2x2(dudxi,dxidu);
+  
+  double dxdu[3][2];
 
+  for (int i=0;i<3;i++){
+    for (int j=0;j<2;j++){
+      dxdu[i][j]=0.0;
+      for (int k=0;k<2;k++){
+	dxdu[i][j] += dxdxi[i][k]*dxidu[k][j];
+      }
+    }
+  }
+    
+  return Pair<SVector3, SVector3>(SVector3(dxdu[0][0],dxdu[1][0],dxdu[2][0]),
+				  SVector3(dxdu[0][1],dxdu[1][1],dxdu[2][1]));
 }
 
 void discreteDiskFace::secondDer(const SPoint2 &param,
@@ -846,9 +707,6 @@ void discreteDiskFace::buildAllNodes()
 
 void discreteDiskFace::putOnView()
 {
-
-
-
   FILE* view_u = Fopen("param_u.pos","w");
   FILE* view_v = Fopen("param_v.pos","w");
   FILE* UVxyz = Fopen("UVxyz.pos","w");
@@ -868,22 +726,22 @@ void discreteDiskFace::putOnView()
 	fprintf(view_v,"ST%d(",_order);
 	fprintf(UVxyz,"ST%d(",_order);
       }
-      for (unsigned int j=0; j<_N-1; j++){
-	fprintf(view_u,"%g,%g,%g,",my_ddft->v[j].x(),my_ddft->v[j].y(),my_ddft->v[j].z());
-	fprintf(view_v,"%g,%g,%g,",my_ddft->v[j].x(),my_ddft->v[j].y(),my_ddft->v[j].z());
+      for (int j=0; j<_N-1; j++){
+	fprintf(view_u,"%g,%g,%g,",my_ddft->tri->getVertex(j)->x(),my_ddft->tri->getVertex(j)->y(),my_ddft->tri->getVertex(j)->z());
+	fprintf(view_v,"%g,%g,%g,",my_ddft->tri->getVertex(j)->x(),my_ddft->tri->getVertex(j)->y(),my_ddft->tri->getVertex(j)->z());
 	fprintf(UVxyz,"%g,%g,%g,",my_ddft->p[j].x(),my_ddft->p[j].y(),0.);
       }      
-      fprintf(view_u,"%g,%g,%g){",my_ddft->v[_N-1].x(),my_ddft->v[_N-1].y(),my_ddft->v[_N-1].z());
-      fprintf(view_v,"%g,%g,%g){",my_ddft->v[_N-1].x(),my_ddft->v[_N-1].y(),my_ddft->v[_N-1].z());
+      fprintf(view_u,"%g,%g,%g){",my_ddft->tri->getVertex(_N-1)->x(),my_ddft->tri->getVertex(_N-1)->y(),my_ddft->tri->getVertex(_N-1)->z());
+      fprintf(view_v,"%g,%g,%g){",my_ddft->tri->getVertex(_N-1)->x(),my_ddft->tri->getVertex(_N-1)->y(),my_ddft->tri->getVertex(_N-1)->z());
       fprintf(UVxyz,"%g,%g,%g){",my_ddft->p[_N-1].x(),my_ddft->p[_N-1].y(),0.);
-      for (unsigned int j=0; j<_N-1; j++){
+      for (int j=0; j<_N-1; j++){
 	fprintf(view_u,"%g,",my_ddft->p[j].x());
 	fprintf(view_v,"%g,",my_ddft->p[j].y());
-	fprintf(UVxyz,"%g,",sqrt(my_ddft->v[j].x()*my_ddft->v[j].x()+my_ddft->v[j].z()*my_ddft->v[j].z()+my_ddft->v[j].y()*my_ddft->v[j].y()));
+	fprintf(UVxyz,"%g,",sqrt(my_ddft->tri->getVertex(j)->x()*my_ddft->tri->getVertex(j)->x()+my_ddft->tri->getVertex(j)->z()*my_ddft->tri->getVertex(j)->z()+my_ddft->tri->getVertex(j)->y()*my_ddft->tri->getVertex(j)->y()));
       }
       fprintf(view_u,"%g};\n",my_ddft->p[_N-1].x());
       fprintf(view_v,"%g};\n",my_ddft->p[_N-1].y());
-      fprintf(UVxyz,"%g};\n",sqrt(my_ddft->v[_N-1].x()*my_ddft->v[_N-1].x()+my_ddft->v[_N-1].z()*my_ddft->v[_N-1].z()+my_ddft->v[_N-1].y()*my_ddft->v[_N-1].y()));
+      fprintf(UVxyz,"%g};\n",sqrt(my_ddft->tri->getVertex(_N-1)->x()*my_ddft->tri->getVertex(_N-1)->x()+my_ddft->tri->getVertex(_N-1)->z()*my_ddft->tri->getVertex(_N-1)->z()+my_ddft->tri->getVertex(_N-1)->y()*my_ddft->tri->getVertex(_N-1)->y()));
     }
     fprintf(view_u,"};\n");
     fprintf(view_v,"};\n");
@@ -936,8 +794,11 @@ GPoint discreteDiskFace::intersectionWithCircle(const SVector3 &n1, const SVecto
     // the point is situated in the half plane defined
     // by direction n1 and point p (exclude the one on the
     // other side)
-    SVector3 t1  = ct->v[1] - ct->v[0];
-    SVector3 t2  = ct->v[2] - ct->v[0];
+    SVector3 v0(ct->tri->getVertex(0)->x(),ct->tri->getVertex(0)->y(),ct->tri->getVertex(0)->z());
+    SVector3 v1(ct->tri->getVertex(1)->x(),ct->tri->getVertex(1)->y(),ct->tri->getVertex(1)->z());
+    SVector3 v2(ct->tri->getVertex(2)->x(),ct->tri->getVertex(2)->y(),ct->tri->getVertex(2)->z());
+    SVector3 t1  = v1 - v0;
+    SVector3 t2  = v2 - v0;
     // let us first compute point q to be the intersection
     // of the plane of the triangle with the line L = p + t n1
     // Compute w = t1 x t2 = (a,b,c) and write a point of the plabe as
@@ -950,7 +811,7 @@ GPoint discreteDiskFace::intersectionWithCircle(const SVector3 &n1, const SVecto
     double t = d;
     // if everything is not coplanar ...
     if (fabs(dot(n1,w)) > 1.e-12){
-      t = dot(ct->v[0]-p,w)/dot(n1,w);
+      t = dot(v0-p,w)/dot(n1,w);
     }
     SVector3 q = p + n1*t;
     // consider the line that intersects both planes in its
@@ -997,8 +858,8 @@ GPoint discreteDiskFace::intersectionWithCircle(const SVector3 &n1, const SVecto
       mat[0][0] = dot(t1,t1);
       mat[1][1] = dot(t2,t2);
       mat[0][1] = mat[1][0] = dot(t1,t2);
-      b[0] = dot(s-ct->v[0],t1) ;
-      b[1] = dot(s-ct->v[0],t2) ;
+      b[0] = dot(s-v0,t1) ;
+      b[1] = dot(s-v0,t2) ;
       sys2x2(mat,b,uv);
       // check now if the point is inside the triangle
       if (uv[0] >= -1.e-6 && uv[1] >= -1.e-6 &&
-- 
GitLab