Changeset 2965


Ignore:
Timestamp:
02/05/10 11:05:19 (15 years ago)
Author:
Mathieu Morlighem
Message:

Added comments and renamed some functions and variables

Location:
issm/trunk/src/c/Bamgx
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/Bamgx/Mesh2.h

    r2958 r2965  
    114114                        Direction DirOfSearch;
    115115                        union {
    116                                 Triangle * t; // one triangle which contained  the vertex
     116                                Triangle* t; // one triangle which contained  the vertex
    117117                                Int4 color;
    118118                                Vertex * to;// use in geometry Vertex to now the Mesh Vertex associed
     
    366366                }
    367367
    368                 void SetTriangleContainingTheVertex()
    369                   {
     368                void SetTriangleContainingTheVertex() {
    370369                        if (ns[0]) (ns[0]->t=this,ns[0]->vint=0);
    371370                        if (ns[1]) (ns[1]->t=this,ns[1]->vint=1);
    372371                        if (ns[2]) (ns[2]->t=this,ns[2]->vint=2);
    373                   }
     372                }
    374373
    375374                int swap(Int2 a1,int=0);
     
    782781
    783782                        Vertex * NearestVertex(Icoor1 i,Icoor1 j) ;
    784                         Triangle * FindTriangleContening(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;
     783                        Triangle * FindTriangleContaining(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;
    785784
    786785                        void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts);
  • issm/trunk/src/c/Bamgx/objects/Geometry.cpp

    r2957 r2965  
    234234                Real8 Hmin = HUGE_VAL;// the infinie value
    235235                Int4 hvertices=0;
    236                 int i,j,k,n;
     236                int i,j,k,n,i1,i2;
    237237
    238238                //initialize some variables
     
    290290                //Edges
    291291                if (bamggeom->Edges){
    292                         int i1,i2;
    293                         R2 zero2(0,0);
    294                         Real4 *len =0;
     292                        R2     zero2(0,0);
     293                        Real4* len=NULL;
    295294
    296295                        if(verbose>3) printf("      processing Edges\n");
    297296                        edges = new GeometricalEdge[nbe];
    298297
     298                        //if hvertices==0, initialize len (length of each edge)
    299299                        if (!hvertices) {
    300300                                len = new Real4[nbv];
    301                                 for(i=0;i<nbv;i++)
    302                                  len[i]=0;
     301                                for(i=0;i<nbv;i++) len[i]=0;
    303302                        }
    304303
    305304                        for (i=0;i<nbe;i++){
     305
    306306                                i1=(int)bamggeom->Edges[i*3+0]-1; //-1 for C indexing
    307307                                i2=(int)bamggeom->Edges[i*3+1]-1; //-1 for C indexing
    308308                                edges[i].ref=(Int4)bamggeom->Edges[i*3+2];
    309                                 edges[i].v[0]=  vertices + i1;
    310                                 edges[i].v[1]=  vertices + i2;
    311                                 R2 x12 = vertices[i2].r-vertices[i1].r;
     309
     310                                edges[i].v[0]= vertices + i1;
     311                                edges[i].v[1]= vertices + i2;
     312
     313                                //get length of edge
     314                                R2    x12=vertices[i2].r-vertices[i1].r;
    312315                                Real8 l12=sqrt((x12,x12));
     316                                Hmin=Min(Hmin,l12);
     317
     318                                //initialize other fields
    313319                                edges[i].tg[0]=zero2;
    314320                                edges[i].tg[1]=zero2;
     
    322328                                        len[i2] += l12;
    323329                                }
    324 
    325                                 Hmin = Min(Hmin,l12);
    326330                        }
    327331
     
    330334                                for (i=0;i<nbv;i++)
    331335                                 if (vertices[i].color > 0)
    332                                   vertices[i].m=  Metric(len[i] /(Real4) vertices[i].color);
     336                                  vertices[i].m=Metric(len[i] /(Real4) vertices[i].color);
    333337                                 else
    334                                   vertices[i].m=  Metric(Hmin);
     338                                  vertices[i].m=Metric(Hmin);
    335339                                delete [] len;
    336340                        }
     
    460464                                j=(int)bamggeom->RequiredEdges[i]-1; //for C indexing
    461465                                if (j>nbe-1 || j<0){
    462                                         throw ErrorException(__FUNCT__,exprintf("Bad RequiredEdges definition: should in [0 %i]",nbv));
    463                                 }
    464                                 edges[j].SetRequired();  }
     466                                        throw ErrorException(__FUNCT__,exprintf("Bad RequiredEdges definition: should in [0 %i]",nbe));
     467                                }
     468                                edges[j].SetRequired(); 
     469                        }
    465470                }
    466471                else{
     
    741746                }
    742747
    743                 // generation of  all the tangente
     748                // generation of  all the tangents
    744749                for (i=0;i<nbe;i++) {
    745                         R2 AB = edges[i].v[1]->r -edges[i].v[0]->r;       
    746                         Real8 lAB = Norme2(AB); // length of current edge AB
     750
     751                        //Get AB = vertex1->vertex2
     752                        R2    AB =edges[i].v[1]->r -edges[i].v[0]->r;       
     753                        //Get length of AB
     754                        Real8 lAB=Norme2(AB);
     755                        //initialize tangent
    747756                        Real8 ltg2[2];
    748757                        ltg2[0]=0;ltg2[1]=0;
     758
     759                        //loop over the 2 vertices of the edge
    749760                        for (jj=0;jj<2;jj++) {
    750                                 R2 tg =  edges[i].tg[jj];
    751                                 Real8 ltg = Norme2(tg); // length of tg
    752                                 if(ltg == 0) {// no tg
    753                                         if( ! edges[i].v[jj]->Corner())   { // not a Corner       
    754                                                 tg =  edges[i].v[1-jj]->r
    755                                                   - edges[i].Adj[jj]->v[1-edges[i].DirAdj[jj]]->r;
    756                                                 ltg =  Norme2(tg);
     761                                R2    tg =edges[i].tg[jj];
     762                                Real8 ltg=Norme2(tg);
     763
     764                                //by default, tangent=[0 0]
     765                                if(ltg == 0) {
     766                                        //if the current vertex of the edge is not a corner
     767                                        if(!edges[i].v[jj]->Corner()){
     768                                                tg =  edges[i].v[1-jj]->r - edges[i].Adj[jj]->v[1-edges[i].DirAdj[jj]]->r;
     769                                                ltg=  Norme2(tg);
    757770                                                tg =  tg *(lAB/ltg),ltg=lAB;
    758771                                        }
  • issm/trunk/src/c/Bamgx/objects/ListofIntersectionTriangles.cpp

    r2865 r2965  
    4141                else {// not optimisation
    4242                        init();
    43                         t=tbegin = Bh.FindTriangleContening(a,deta);
     43                        t=tbegin = Bh.FindTriangleContaining(a,deta);
    4444                        if( t->det>=0)
    4545                         ilast=NewItem(t,Real8(deta[0])/t->det,Real8(deta[1])/t->det,Real8(deta[2])/t->det);
  • issm/trunk/src/c/Bamgx/objects/Triangles.cpp

    r2960 r2965  
    730730        /*Methods*/
    731731        /*FUNCTION Triangles::Add{{{1*/
    732         void Triangles::Add( Vertex & s,Triangle * t, Icoor2 * det3) {
     732        void Triangles::Add( Vertex &s,Triangle* t, Icoor2* det3) {
    733733                // -------------------------------------------
    734734                //             s2
     
    746746                //--------------------------------------------
    747747
    748                 Triangle * tt[3]; // the 3 new Triangles
    749                 Vertex &s0 = (* t)[0], &s1=(* t)[1], &s2=(* t)[2];
    750                 Icoor2  det3local[3];
    751                 int infv = &s0 ?  ((  &s1 ? ( &s2  ? -1 : 2) : 1  )) : 0;
    752                 // infv = ordre of the infini vertex (null)
    753                 register int nbd0 =0; // number of zero det3
    754                 register int izerodet=-1,iedge; // izerodet = egde contening the vertex s
     748                //the three triangles tt
     749                Triangle* tt[3];
     750                //three vertices of t
     751                Vertex &s0 = (*t)[0], &s1=(*t)[1], &s2=(*t)[2];
     752                //three determinants
     753                Icoor2 det3local[3];
     754                // number of zero det3
     755                register int nbzerodet =0;
     756                // izerodet = egde contening the vertex s
     757                register int izerodet=-1,iedge;
     758                //determinant of t
    755759                Icoor2 detOld = t->det;
    756760
    757                 if (( infv <0 ) && (detOld <0) ||  ( infv >=0  ) && (detOld >0) ){
    758                         throw ErrorException(__FUNCT__,exprintf("infv=%g det=%g"));
    759                 }
    760 
    761                 // if det3 do not exist then constuct det3
     761                // infinitevertexpos = order of the infinite vertex (NULL)
     762                // if no infinite vertex (NULL) infinitevertexpos=-1
     763                // else if v_i is infinite, infinitevertexpos=i
     764                int infinitevertexpos = &s0 ?  ((  &s1 ? ( &s2  ? -1 : 2) : 1  )) : 0;
     765
     766                //some checks
     767                if (( infinitevertexpos <0 ) && (detOld <0) ||  ( infinitevertexpos >=0  ) && (detOld >0) ){
     768                        throw ErrorException(__FUNCT__,exprintf("bug in Triangles::Add, bad configuration"));
     769                }
     770
     771                // if det3 does not exist, build it
    762772                if (!det3) {
    763                         det3 = det3local; // alloc
    764                         if ( infv<0 ) {
     773                        //allocate
     774                        det3 = det3local;
     775                        //if no infinite vertex
     776                        if (infinitevertexpos<0 ) {
    765777                                det3[0]=bamg::det(s ,s1,s2);
    766778                                det3[1]=bamg::det(s0,s ,s2);
     
    768780                        else {
    769781                                // one of &s1  &s2  &s0 is NULL so (&si || &sj) <=> !&sk
    770                                 det3[0]=  &s0 ? -1  : bamg::det(s ,s1,s2) ;
    771                                 det3[1]=  &s1 ? -1 : bamg::det(s0,s ,s2) ;
    772                                 det3[2]=  &s2 ? -1 : bamg::det(s0,s1,s ) ;}}
    773 
    774 
    775                                 if (!det3[0]) izerodet=0,nbd0++;
    776                                 if (!det3[1]) izerodet=1,nbd0++;
    777                                 if (!det3[2]) izerodet=2,nbd0++;
    778 
    779                                 if  (nbd0 >0 ) // point s on a egde or on a vertex
    780                                  if (nbd0 == 1) {
    781                                          iedge = OppositeEdge[izerodet];
    782                                          TriangleAdjacent ta = t->Adj(iedge);
    783 
    784                                          // the point is on the edge
    785                                          // if the point is one the boundary
    786                                          // add the point in outside part
    787                                          if ( t->det >=0) { // inside triangle
    788                                                  if ((( Triangle *) ta)->det < 0 ) {
    789                                                          // add in outside triangle
    790                                                          Add(s,( Triangle *) ta);
    791                                                          return;}
    792                                          }}
    793                                  else {
    794                                          printf("bug (%i): Bug double points in\n",nbd0);
    795                                          throw ErrorException(__FUNCT__,exprintf("See above"));
    796                                  }
    797 
    798                                 // remove de MarkUnSwap edge
    799                                 t->SetUnMarkUnSwap(0);     
    800                                 t->SetUnMarkUnSwap(1);     
    801                                 t->SetUnMarkUnSwap(2);
    802 
    803                                 tt[0]= t;
    804                                 tt[1]= &triangles[nbt++];
    805                                 tt[2]= &triangles[nbt++];
    806 
    807                                 if (nbt>nbtx) {
    808                                         throw ErrorException(__FUNCT__,exprintf("Not ebough triangles"));
    809                                 }
    810 
    811                                 *tt[1]=   *tt[2]= *t;
    812                                 // gestion of the link
    813                                 tt[0]->link=tt[1];
    814                                 tt[1]->link=tt[2];
    815 
    816                                 (* tt[0])(OppositeVertex[0])=&s;
    817                                 (* tt[1])(OppositeVertex[1])=&s;
    818                                 (* tt[2])(OppositeVertex[2])=&s;
    819 
    820                                 tt[0]->det=det3[0];
    821                                 tt[1]->det=det3[1];
    822                                 tt[2]->det=det3[2];         
    823 
    824                                 //  update adj des triangles externe
    825                                 tt[0]->SetAdjAdj(0);
    826                                 tt[1]->SetAdjAdj(1);
    827                                 tt[2]->SetAdjAdj(2);
    828                                 //  update des adj des 3 triangle interne
    829                                 const int i0 = 0;
    830                                 const int i1= NextEdge[i0];
    831                                 const int i2 = PreviousEdge[i0];
    832 
    833                                 tt[i0]->SetAdj2(i2,tt[i2],i0);
    834                                 tt[i1]->SetAdj2(i0,tt[i0],i1);
    835                                 tt[i2]->SetAdj2(i1,tt[i1],i2);
    836 
    837                                 tt[0]->SetTriangleContainingTheVertex();
    838                                 tt[1]->SetTriangleContainingTheVertex();
    839                                 tt[2]->SetTriangleContainingTheVertex();
    840 
    841 
    842                                 // swap if the point s is on a edge
    843                                 if(izerodet>=0) {
    844                                         int rswap =tt[izerodet]->swap(iedge);
    845 
    846                                         if (!rswap) {
    847                                                 throw ErrorException(__FUNCT__,exprintf("swap the point s is on a edge"));
     782                                det3[0]= &s0 ? -1 : bamg::det(s ,s1,s2) ;
     783                                det3[1]= &s1 ? -1 : bamg::det(s0,s ,s2) ;
     784                                det3[2]= &s2 ? -1 : bamg::det(s0,s1,s ) ;
     785                        }
     786                }
     787
     788                if (!det3[0]) izerodet=0,nbzerodet++;
     789                if (!det3[1]) izerodet=1,nbzerodet++;
     790                if (!det3[2]) izerodet=2,nbzerodet++;
     791
     792                //if nbzerodet>0, point s is on an egde or on a vertex
     793                if  (nbzerodet >0 ){
     794                        if (nbzerodet == 1) {
     795                                iedge = OppositeEdge[izerodet];
     796                                TriangleAdjacent ta = t->Adj(iedge);
     797
     798                                // the point is on the edge
     799                                // if the point is one the boundary
     800                                // add the point in outside part
     801                                if ( t->det >=0) { // inside triangle
     802                                        if ((( Triangle *) ta)->det < 0 ) {
     803                                                // add in outside triangle
     804                                                Add(s,( Triangle *) ta);
     805                                                return;
    848806                                        }
    849807                                }
     808                        }
     809                        else {
     810                                t->Echo();
     811                                printf("\nproblem while trying to add:\n");
     812                                s.Echo();
     813                                throw ErrorException(__FUNCT__,exprintf("Bug in Triangles::Add points duplicated %i times",nbzerodet));
     814                        }
     815                }
     816
     817                // remove de MarkUnSwap edge
     818                t->SetUnMarkUnSwap(0);     
     819                t->SetUnMarkUnSwap(1);     
     820                t->SetUnMarkUnSwap(2);
     821
     822                tt[0]= t;
     823                tt[1]= &triangles[nbt++];
     824                tt[2]= &triangles[nbt++];
     825
     826                if (nbt>nbtx) {
     827                        throw ErrorException(__FUNCT__,exprintf("Not ebough triangles"));
     828                }
     829
     830                *tt[1]=   *tt[2]= *t;
     831                // gestion of the link
     832                tt[0]->link=tt[1];
     833                tt[1]->link=tt[2];
     834
     835                (* tt[0])(OppositeVertex[0])=&s;
     836                (* tt[1])(OppositeVertex[1])=&s;
     837                (* tt[2])(OppositeVertex[2])=&s;
     838
     839                tt[0]->det=det3[0];
     840                tt[1]->det=det3[1];
     841                tt[2]->det=det3[2];         
     842
     843                //  update adj des triangles externe
     844                tt[0]->SetAdjAdj(0);
     845                tt[1]->SetAdjAdj(1);
     846                tt[2]->SetAdjAdj(2);
     847                //  update des adj des 3 triangle interne
     848                const int i0 = 0;
     849                const int i1= NextEdge[i0];
     850                const int i2 = PreviousEdge[i0];
     851
     852                tt[i0]->SetAdj2(i2,tt[i2],i0);
     853                tt[i1]->SetAdj2(i0,tt[i0],i1);
     854                tt[i2]->SetAdj2(i1,tt[i1],i2);
     855
     856                tt[0]->SetTriangleContainingTheVertex();
     857                tt[1]->SetTriangleContainingTheVertex();
     858                tt[2]->SetTriangleContainingTheVertex();
     859
     860
     861                // swap if the point s is on a edge
     862                if(izerodet>=0) {
     863                        int rswap =tt[izerodet]->swap(iedge);
     864
     865                        if (!rswap) {
     866                                throw ErrorException(__FUNCT__,exprintf("swap the point s is on a edge"));
     867                        }
     868                }
    850869        }
    851870        /*}}}1*/
     
    20112030                /*}}}1*/
    20122031        /*FUNCTION Triangles::ForceBoundary{{{1*/
    2013         void Triangles::ForceBoundary() {
    2014                 long int verbosity=2;
    2015                 if (verbosity > 2) printf("   ForceBoundary  nb of edge: %i\n",nbe);
    2016                 int k=0;
    2017                 Int4  nbfe=0,nbswp=0,Nbswap=0;
    2018                 for (Int4 t = 0; t < nbt; t++){
    2019                         if (!triangles[t].det) k++;
    2020                 }
    2021                 if (k!=0) {
    2022                         throw ErrorException(__FUNCT__,exprintf("there is %i triangles of mes = 0",k));
    2023                 }
    2024 
     2032                void Triangles::ForceBoundary() {
     2033                        long int verbosity=2;
     2034                        int k=0;
     2035                        int nbfe=0,nbswp=0,Nbswap=0;
     2036
     2037                        //display
     2038                        if (verbosity > 2) printf("   ForceBoundary  nb of edge: %i\n",nbe);
     2039
     2040                        //check that there is no triangle with 0 determinant
     2041                        for (Int4 t = 0; t < nbt; t++){
     2042                                if (!triangles[t].det) k++;
     2043                        }
     2044                        if (k!=0) {
     2045                                throw ErrorException(__FUNCT__,exprintf("there is %i triangles of mes = 0",k));
     2046                        }
     2047
     2048                        //Force Edges
    20252049                        TriangleAdjacent ta(0,0);
    2026                         for (Int4 i = 0; i < nbe; i++)
    2027                           {
     2050                        for (Int4 i = 0; i < nbe; i++){
    20282051                                nbswp =  ForceEdge(edges[i][0],edges[i][1],ta);
    20292052
     
    20332056                                if ( nbswp < 0 && k < 5){
    20342057                                        throw ErrorException(__FUNCT__,exprintf("Missing  Edge %i, v0=%i,v1=%i",i ,Number(edges[i][0]),Number(edges[i][1])));
    2035                                   }
     2058                                }
    20362059                                if ( nbswp >=0 && edges[i].onGeometry->Cracked())
    20372060                                 ta.SetCracked();
    2038                           }
    2039 
     2061                        }
    20402062
    20412063                        if (k!=0) {
    20422064                                throw ErrorException(__FUNCT__,exprintf("There are %i lost edges, the boundary might be crossing",k));
    20432065                        }
    2044                         for (Int4 j=0;j<nbv;j++)
    2045                          Nbswap +=  vertices[j].Optim(1,0);
     2066                        for (Int4 j=0;j<nbv;j++){
     2067                                Nbswap +=  vertices[j].Optim(1,0);
     2068                        }
    20462069                        if (verbosity > 3) printf("      number of inforced edge = %i, number of swap= %i\n",nbfe,Nbswap);
    2047         }
     2070                }
    20482071        /*}}}1*/
    20492072        /*FUNCTION Triangles::FillHoleInMesh{{{1*/
     
    22092232                                Vertex *vi  = ordre[icount];
    22102233                                Icoor2 dete[3];
    2211                                 Triangle *tcvi = FindTriangleContening(vi->i,dete);
     2234                                Triangle *tcvi = FindTriangleContaining(vi->i,dete);
    22122235                                quadtree->Add(*vi);
    22132236                                Add(*vi,tcvi,dete);
     
    25842607        }
    25852608        /*}}}1*/
    2586         /*FUNCTION Triangles::FindTriangleContening{{{1*/
    2587         Triangle * Triangles::FindTriangleContening(const I2 & B,Icoor2 dete[3], Triangle *tstart) const {
     2609        /*FUNCTION Triangles::FindTriangleContaining{{{1*/
     2610        Triangle * Triangles::FindTriangleContaining(const I2 & B,Icoor2 dete[3], Triangle *tstart) const {
    25882611                Triangle * t=0;
    25892612                int j,jp,jn,jj;
     
    25992622                                        printf("TriangleConteningTheVertex vertex number %i, another call to ReMakeTriangleContainingTheVertex was required\n", Number(a));
    26002623                                }
    2601                                 throw ErrorException(__FUNCT__,exprintf("problem in Triangles::FindTriangleContening"));
     2624                                throw ErrorException(__FUNCT__,exprintf("problem in Triangles::FindTriangleContaining"));
    26022625                        }
    26032626                        if (a<vertices || a>=vertices+nbv){
     
    26822705                Gh.NbRef++;// add a ref to GH
    26832706
    2684                 Int4 i,NbOfCurves=0,NbNewPoints,NbEdgeCurve;
     2707                int i,j,k;
     2708                int NbOfCurves=0,NbNewPoints,NbEdgeCurve;
    26852709                Real8 lcurve,lstep,s;
     2710                const int MaxSubEdge = 10;
    26862711
    26872712                R2 AB;
     
    27102735                }
    27112736
    2712                 //compute nbv (number of vertices)
     2737                //Add all the geometrical vertices to the mesh
    27132738                nbv=0;
    27142739                for (i=0;i<Gh.nbv;i++){
     
    27302755                                Gh[i].to=vertices+nbv;
    27312756
    2732 
    27332757                                //Build VerticesOnGeomVertex for current point
    27342758                                VerticesOnGeomVertex[nbv]= VertexOnGeom(*Gh[i].to,Gh[i]);
     
    27532777                        nbe=0;
    27542778                        Int4 NbVerticesOnGeomEdge0=NbVerticesOnGeomEdge;
    2755 
    2756 
    27572779                        Gh.UnMarkEdges();       
    27582780                        NbOfCurves = 0;
     
    27612783                        for (i=0;i<Gh.nbe;i++) {
    27622784
     2785                                //ei = current Geometrical edge
    27632786                                GeometricalEdge &ei=Gh.edges[i];   
    27642787
     
    27732796                                                        Edge* PreviousNewEdge=NULL;
    27742797
    2775                                                         lstep = -1;//do not create points
     2798                                                        //do not create points if required
     2799                                                        lstep = -1;
    27762800                                                        if(ei.Required()){
    27772801                                                                if (j==0){
     
    27812805                                                                                a=ei(0)->The();
    27822806                                                                                b=ei(1)->The();
     2807
     2808                                                                                //check that edges has been allocated
    27832809                                                                                if (!edges){
    2784                                                                                         throw ErrorException(__FUNCT__,exprintf("!edges"));
     2810                                                                                        throw ErrorException(__FUNCT__,exprintf("edges has not been allocated..."));
    27852811                                                                                }
    27862812                                                                                edges[nbe].v[0]=a->to;
     
    27942820                                                                }
    27952821                                                        }
    2796                                                         else { // on curve ------
     2822
     2823                                                        //if not required: on curve
     2824                                                        else {
    27972825                                                                for ( int kstep=0;kstep<= step;kstep++){
    2798                                                                         // if 2nd step where 2 step
     2826                                                                        //step=0, nohing
     2827                                                                        //step=1,
     2828                                                                        //step=2
    27992829                                                                        // 1 compute the length of the curve
    28002830                                                                        // 2 create the points and edge
     
    28072837                                                                        lcurve =0;
    28082838                                                                        s = lstep;
    2809                                                                         int k=j;
    2810                                                                         e = & ei;
    2811                                                                         a=ei(k)->The();
    2812                                                                         va = a->to;
    2813                                                                         e->SetMark();
    2814 
    2815                                                                         // if SameGeo  We have go in the background geometry
    2816                                                                         // to find the discretisation of the curve
     2839
     2840                                                                        // i = edge number, j=[0;1] vertex number in edge
     2841                                                                       
     2842                                                                        k=j;            // k = vertex number in edge
     2843                                                                        e=&ei;          // e = address of current edge
     2844                                                                        a=ei(k)->The(); // a = pointer toward the kth vertex of the current edge
     2845                                                                        va = a->to;     // va= pointer toward vertex of ???
     2846                                                                        e->SetMark();   // Mark e
     2847
     2848                                                                        //if SameGeo We have go to the background geometry
     2849                                                                        //to find the discretisation of the curve
    28172850                                                                        for(;;){
    28182851                                                                                k = 1-k;
    2819                                                                                 b= (*e)(k)->The();
    2820                                                                                 AB = b->r - a->r;
    2821                                                                                 Metric MA = background ? BTh.MetricAt(a->r) :a->m ;
    2822                                                                                 Metric MB =  background ? BTh.MetricAt(b->r) :b->m ;
    2823                                                                                 Real8 ledge = (MA(AB) + MB(AB))/2;
    2824 
    2825                                                                                 const int MaxSubEdge = 10;
     2852                                                                                b = (*e)(k)->The(); // b = pointer toward the other vertex of the current edge
     2853                                                                                AB = b->r - a->r;   // AB = vector of the current edge
     2854                                                                                Metric MA = background ? BTh.MetricAt(a->r) :a->m ;  //Get metric associated to A
     2855                                                                                Metric MB =  background ? BTh.MetricAt(b->r) :b->m ; //Get metric associated to B
     2856                                                                                Real8 ledge = (MA(AB) + MB(AB))/2;                   //Get edge length in metric
     2857
     2858                                                                                /* We are now creating the edges of the mesh from the
     2859                                                                                 * geometrical edge selected above.
     2860                                                                                 * The edge will be divided according to the metric
     2861                                                                                 * previously computed and cannot be divided more
     2862                                                                                 * than 10 times (MaxSubEdge). */
     2863
     2864                                                                                //By default, there is only one subedge that is the geometrical edge itself
    28262865                                                                                int NbSubEdge = 1;
     2866
     2867                                                                                //initialize lSubEdge, holding the length of each subedge (cannot be higher than 10)
    28272868                                                                                Real8 lSubEdge[MaxSubEdge];
    2828                                                                                 R2 A,B;
     2869
     2870                                                                                //Build Subedges according to the edge length
     2871                                                                                //if ledge < 1.5 (between one and 2), take the edge as is
    28292872                                                                                if (ledge < 1.5) lSubEdge[0] = ledge;
     2873                                                                                //else, divide the edge
    28302874                                                                                else {
     2875                                                                                        //compute number of subedges (division of the edge)
    28312876                                                                                        NbSubEdge = Min( MaxSubEdge, (int) (ledge +0.5));
    2832                                                                                         A= a->r;
    2833                                                                                         Metric MAs =MA,MBs;
    2834                                                                                         ledge = 0;
    2835                                                                                         Real8 x =0, xstep= 1. /  NbSubEdge;
     2877                                                                                        //A and B are the position of points on the edge
     2878                                                                                        R2 A,B;
     2879                                                                                        A=a->r;
     2880                                                                                        Metric MAs=MA,MBs;
     2881                                                                                        ledge=0;
     2882                                                                                        Real8 x =0, xstep= 1./NbSubEdge;
    28362883                                                                                        for (int kk=0; kk < NbSubEdge; kk++,A=B,MAs=MBs ) {
    28372884                                                                                                x += xstep;
     
    28442891
    28452892                                                                                Real8 lcurveb = lcurve+ ledge ;
     2893
     2894                                                                                //Now, create corresponding points
     2895                                                                                //s = lstep
    28462896                                                                                while (lcurve<=s && s <= lcurveb && nbv < nbvend){
    2847                                                                                         // New points
    2848 
    2849                                                                                         // Real8 aa=(lcurveb-s)/ledge;
    2850                                                                                         // Real8 bb=(s-lcurve)/ledge;
    28512897
    28522898                                                                                        Real8 ss = s-lcurve;
    2853                                                                                         // 1) find the SubEdge containing ss by dichotomie
     2899
     2900                                                                                        /*Find the SubEdge containing ss using Dichotomy*/
     2901
    28542902                                                                                        int kk0=-1,kk1=NbSubEdge-1,kkk;
    28552903                                                                                        Real8 ll0=0,ll1=ledge,llk;
    2856                                                                                         while (kk1-kk0>1)
    2857                                                                                           {
     2904                                                                                        while (kk1-kk0>1){
    28582905                                                                                                if (ss < (llk=lSubEdge[kkk=(kk0+kk1)/2]))
    28592906                                                                                                 kk1=kkk,ll1=llk;
    28602907                                                                                                else
    2861                                                                                                  kk0=kkk,ll0=llk;}
    2862                                                                                                 if (kk1 == kk0){
    2863                                                                                                         throw ErrorException(__FUNCT__,exprintf("kk1 == kk0"));
    2864                                                                                                 }
    2865 
    2866                                                                                                 Real8 sbb = (ss-ll0  )/(ll1-ll0);
    2867                                                                                                 Real8 bb = (kk1+sbb)/NbSubEdge, aa=1-bb;
    2868 
    2869                                                                                                 // new vertex on edge
    2870                                                                                                 vb = &vertices[nbv++];
    2871                                                                                                 vb->m = Metric(aa,a->m,bb,b->m);
    2872                                                                                                 vb->ReferenceNumber = e->ref;
    2873                                                                                                 vb->DirOfSearch =NoDirOfSearch;
    2874                                                                                                 Real8 abcisse = k ? bb : aa;
    2875                                                                                                 vb->r =  e->F( abcisse );
    2876                                                                                                 VerticesOnGeomEdge[NbVerticesOnGeomEdge++]= VertexOnGeom(*vb,*e,abcisse);       
    2877 
    2878                                                                                                 // to take into account the direction of the edge
    2879                                                                                                 s += lstep;
    2880                                                                                                 edges[nbe].v[0]=va;
    2881                                                                                                 edges[nbe].v[1]=vb;
    2882                                                                                                 edges[nbe].ref = e->ref;
    2883                                                                                                 edges[nbe].onGeometry = e;
    2884                                                                                                 edges[nbe].adj[0] = PreviousNewEdge;
    2885                                                                                                 if(PreviousNewEdge)
    2886                                                                                                  PreviousNewEdge->adj[1] = &edges[nbe];
    2887                                                                                                 PreviousNewEdge = edges + nbe;
    2888                                                                                                 nbe++;
    2889                                                                                                 va = vb;
     2908                                                                                                 kk0=kkk,ll0=llk;
     2909                                                                                        }
     2910                                                                                        if (kk1 == kk0){
     2911                                                                                                throw ErrorException(__FUNCT__,exprintf("kk1 == kk0"));
     2912                                                                                        }
     2913
     2914                                                                                        Real8 sbb = (ss-ll0  )/(ll1-ll0);
     2915                                                                                        Real8 bb = (kk1+sbb)/NbSubEdge, aa=1-bb;
     2916
     2917                                                                                        // new vertex on edge
     2918                                                                                        vb = &vertices[nbv++];
     2919                                                                                        vb->m = Metric(aa,a->m,bb,b->m);
     2920                                                                                        vb->ReferenceNumber = e->ref;
     2921                                                                                        vb->DirOfSearch =NoDirOfSearch;
     2922                                                                                        Real8 abcisse = k ? bb : aa;
     2923                                                                                        vb->r =  e->F( abcisse );
     2924                                                                                        VerticesOnGeomEdge[NbVerticesOnGeomEdge++]= VertexOnGeom(*vb,*e,abcisse);       
     2925
     2926                                                                                        // to take into account the direction of the edge
     2927                                                                                        s += lstep;
     2928                                                                                        edges[nbe].v[0]=va;
     2929                                                                                        edges[nbe].v[1]=vb;
     2930                                                                                        edges[nbe].ref = e->ref;
     2931                                                                                        edges[nbe].onGeometry = e;
     2932                                                                                        edges[nbe].adj[0] = PreviousNewEdge;
     2933                                                                                        if(PreviousNewEdge) PreviousNewEdge->adj[1]=&edges[nbe];
     2934                                                                                        PreviousNewEdge=edges+nbe;
     2935                                                                                        nbe++;
     2936                                                                                        va = vb;
    28902937                                                                                }
    28912938                                                                                lcurve = lcurveb;
     
    29472994                }
    29482995
     2996                //Insert points inside existing triangles
    29492997                Insert();
     2998
     2999                //Force the boundary
    29503000                ForceBoundary();
     3001
     3002                //Extract SubDomains
    29513003                FindSubDomain();
    29523004
     
    33693421        /*FUNCTION Triangles::Insert{{{1*/
    33703422        void Triangles::Insert() {
     3423                /*Insert points in the existing Geometry*/
     3424
     3425                //Intermediary
     3426                int i;
     3427
     3428                /*Get options*/
    33713429                long int verbosity=2;
     3430
     3431                //Display info
    33723432                if (verbosity>2) printf("   Insert initial %i vertices\n",nbv);
     3433
     3434                //Compute integer coordinates and determinants for the existing vertices (from Geometry)
    33733435                SetIntCoor();
    3374                 Int4 i;
    3375 
    3376                 //fill out ordre with the adresses of each vertex
     3436
     3437                /*Now we want to build a list (ordre) of the vertices in a random
     3438                 * order. To do so, we use the following method:
     3439                 *
     3440                 * From an initial k0 in [0 nbv[ random (vertex number)
     3441                 * the next k (vertex number) is computed using a big
     3442                 * prime number (PN>>nbv) following:
     3443                 *
     3444                 * k_{i+1} = k_i + PN  [nbv]
     3445                 *
     3446                 * let's show that:
     3447                 *
     3448                 *   for all j in [0 nbv[, ∃! i in [0 nbv[ such that k_i=j
     3449                 *
     3450                 * Let's assume that there are 2 distinct j1 and j2 such that
     3451                 * k_j1 = k_j2
     3452                 *
     3453                 * This means that
     3454                 * 
     3455                 *  k0+j1*PN = k0+j2*PN [nbv]
     3456                 *  (j1-j2)*PN =0       [nbv]
     3457                 * since PN is a prime number larger than nbv, and nbv!=1
     3458                 *  j1-j2=0             [nbv]
     3459                 * BUT
     3460                 *  j1 and j2 are in [0 nbv[ which is impossible.
     3461                 *
     3462                 *  We hence have built a random list of nbv elements of
     3463                 *  [0 nbv[ all distincts*/
    33773464                for (i=0;i<nbv;i++) ordre[i]= &vertices[i] ;
    3378 
    3379                 //Build a random order
    33803465                const Int4 PrimeNumber= AGoodNumberPrimeWith(nbv) ;
    3381                 Int4 k3 = rand()%nbv ;
    3382                 for (int is3=0; is3<nbv; is3++)
    3383                  ordre[is3]= &vertices[k3 = (k3 + PrimeNumber)% nbv];
    3384 
     3466                int   k0=rand()%nbv;
     3467                for (int is3=0; is3<nbv; is3++){
     3468                        ordre[is3]= &vertices[k0=(k0+PrimeNumber)%nbv];
     3469                }
     3470
     3471                /*Modify ordre such that the first 3 vertices form a triangle*/
     3472
     3473                //get first vertex i such that [0,1,i] are not aligned
    33853474                for (i=2 ; det( ordre[0]->i, ordre[1]->i, ordre[i]->i ) == 0;){
     3475                        //if i is higher than nbv, it means that all the determinants are 0,
     3476                        //all vertices are aligned!
    33863477                        if  ( ++i >= nbv) {
    33873478                                throw ErrorException(__FUNCT__,exprintf("all the vertices are aligned"));
     
    33893480                }
    33903481                // exchange i et 2 in "ordre" so that
    3391                 // the first 3 vertices are not aligned
     3482                // the first 3 vertices are not aligned (real triangle)
    33923483                Exchange(ordre[2], ordre[i]);
    33933484
    3394                 // We add a vertex at the infinity to build the mesh
    3395                 // so that we have a simple definition of the boundary edges
     3485                /*Take the first edge formed by the first two vertices and build
     3486                 * the initial simple mesh from this edge and 2 boundary triangles*/
     3487
     3488                Vertex *  v0=ordre[0], *v1=ordre[1];
     3489
    33963490                nbt = 2;
    3397 
    3398                 // We build a trivial mesh from one edge
    3399                 // and 2 triangles built with the 2 oriented
    3400                 // et
    3401                 Vertex *  v0=ordre[0], *v1=ordre[1];
    3402 
    34033491                triangles[0](0) = 0; //infinite vertex
    34043492                triangles[0](1) = v0;
    34053493                triangles[0](2) = v1;
    3406 
    34073494                triangles[1](0) = 0;//infinite vertex
    34083495                triangles[1](2) = v0;
    34093496                triangles[1](1) = v1;
     3497
     3498                //Build adjacence
    34103499                const int e0 = OppositeEdge[0];
    34113500                const int e1 = NextEdge[e0];
     
    34293518                quadtree->Add(*v1);
    34303519
    3431                 //the vertices are added one by one
     3520                /*Now, add the vertices One by One*/
     3521
    34323522                Int4 NbSwap=0;
    3433 
    3434 
    34353523                if (verbosity>3) printf("   Begining of insertion process...\n");
    34363524
    34373525                for (Int4 icount=2; icount<nbv; icount++) {
    3438                         Vertex *vi=ordre[icount];
     3526
     3527                        //Get new vertex
     3528                        Vertex *newvertex=ordre[icount];
     3529
     3530                        //Find the triangle in which newvertex is located
    34393531                        Icoor2 dete[3];
    3440                         Triangle *tcvi = FindTriangleContening(vi->i,dete);
    3441                         quadtree->Add(*vi);
    3442                         Add(*vi,tcvi,dete);
    3443                         NbSwap += vi->Optim(1,0);
    3444                 }
     3532                        Triangle* tcvi = FindTriangleContaining(newvertex->i,dete); //(newvertex->i = integer coordinates)
     3533
     3534                        //Add newvertex to the quadtree
     3535                        quadtree->Add(*newvertex);
     3536
     3537                        //Add newvertex to the existing mesh
     3538                        Add(*newvertex,tcvi,dete);
     3539
     3540                        //Make the mesh Delaunay around newvertex by swaping the edges
     3541                        NbSwap += newvertex->Optim(1,0);
     3542                }
     3543
     3544                //Display info
    34453545                if (verbosity>3) {
    34463546                        printf("      NbSwap of insertion: %i\n",NbSwap);
     
    34503550                }
    34513551                NbUnSwap = 0;
    3452                 // construction d'un ordre aleatoire
    3453                 //  const int PrimeNumber= (nbv % 999983) ? 1000003: 999983 ;
     3552
    34543553#ifdef NBLOOPOPTIM
    34553554
    3456                 k3 = rand()%nbv ;
     3555                k0 = rand()%nbv ;
    34573556                for (int is4=0; is4<nbv; is4++)
    3458                  ordre[is4]= &vertices[k3 = (k3 + PrimeNumber)% nbv];
    3459 
    3460                 for(int Nbloop=0;Nbloop<NBLOOPOPTIM;Nbloop++)
    3461                   {
     3557                 ordre[is4]= &vertices[k0 = (k0 + PrimeNumber)% nbv];
     3558
     3559                for(int Nbloop=0;Nbloop<NBLOOPOPTIM;Nbloop++){
    34623560                        Int4  NbSwap = 0;
    34633561                        for (int is1=0; is1<nbv; is1++)
     
    34713569                        NbUnSwap = 0;
    34723570                        if(!NbSwap) break;
    3473                   }
     3571                }
    34743572                ReMakeTriangleContainingTheVertex();
    34753573                // because we break the TriangleContainingTheVertex
     
    35283626                                }
    35293627                                vj.ReferenceNumber=0;
    3530                                 Triangle *tcvj=FindTriangleContening(vj.i,dete);
     3628                                Triangle *tcvj=FindTriangleContaining(vj.i,dete);
    35313629                                if (tcvj && !tcvj->link){
    35323630                                        tcvj->Echo();
     
    37033801                I2 a = toI2(A);
    37043802                Icoor2 deta[3];
    3705                 Triangle * t =FindTriangleContening(a,deta);
     3803                Triangle * t =FindTriangleContaining(a,deta);
    37063804                if (t->det <0) { // outside
    37073805                        double ba,bb;
     
    42214319/*FUNCTION Triangles::SetIntCoor{{{1*/
    42224320void Triangles::SetIntCoor(const char * strfrom) {
     4321        /*Set integer coordinate for existing vertices*/
     4322
     4323        //Get extrema coordinates of the existing vertices
    42234324        pmin =  vertices[0].r;
    42244325        pmax =  vertices[0].r;
    4225 
    4226         // recherche des extrema des vertices pmin,pmax
    42274326        Int4 i;
    42284327        for (i=0;i<nbv;i++) {
     
    42354334        pmin = pmin-DD;
    42364335        pmax = pmax+DD;
     4336
     4337        //Compute coefIcoor
    42374338        coefIcoor= (MaxICoor)/(Max(pmax.x-pmin.x,pmax.y-pmin.y));
    42384339        if (coefIcoor<=0){
    4239                 throw ErrorException(__FUNCT__,exprintf("coefIcoor<=0"));
     4340                throw ErrorException(__FUNCT__,exprintf("coefIcoor should be positive, a problem in the geometry is likely"));
    42404341        }
    42414342
     
    42514352                Vertex & v1 = triangles[i][1];
    42524353                Vertex & v2 = triangles[i][2];
    4253                 if ( &v0 && &v1 &&  &v2 ) // a good triangles;
    4254                   {
     4354
     4355                //If this is not a boundary triangle
     4356                if ( &v0 && &v1 &&  &v2 ){
    42554357                        triangles[i].det= det(v0,v1,v2);
    42564358                        if (triangles[i].det <=0 && Nberr++ <10){
     
    42634365                                 }
    42644366                        }
    4265                   }
    4266                 else triangles[i].det= -1; // Null triangle;
     4367                }
     4368
     4369                //else, set as -1
     4370                else triangles[i].det=-1;
    42674371        }
    42684372}
     
    50435147                        vi.ReferenceNumber=0;
    50445148                        vi.DirOfSearch =NoDirOfSearch;
    5045                         Triangle *tcvi = FindTriangleContening(vi.i,dete);
     5149                        Triangle *tcvi = FindTriangleContaining(vi.i,dete);
    50465150                        if (tcvi && !tcvi->link) {
    50475151                                printf("problem inserting point in SplitInternalEdgeWithBorderVertices (tcvj && !tcvj->link)\n");
     
    52445348                I2 I = Th.toI2(R2(Min(Max(Th.pmin.x,x),Th.pmax.x),Min(Max(Th.pmin.y,y),Th.pmax.y)));
    52455349                Icoor2 dete[3];
    5246                 Triangle & tb = *Th.FindTriangleContening(I,dete);
     5350                Triangle & tb = *Th.FindTriangleContaining(I,dete);
    52475351
    52485352                if  (tb.link)
  • issm/trunk/src/c/Bamgx/objects/Vertex.cpp

    r2944 r2965  
    5555                I2 IBTh  = BTh.toI2(PNew);
    5656
    57                 tstart=BTh.FindTriangleContening(IBTh,deta,tstart); 
     57                tstart=BTh.FindTriangleContaining(IBTh,deta,tstart); 
    5858
    5959                if (tstart->det <0){ // outside
Note: See TracChangeset for help on using the changeset viewer.