Ignore:
Timestamp:
09/15/17 18:44:44 (8 years ago)
Author:
Eric.Larour
Message:

CHG: new bamg version.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/Mesh.cpp

    r21759 r22085  
    133133                                nbt++;           
    134134                          }
    135                   if (nbt==0 && nbv==0) {
     135                  if (nbt==0 && nbv==0){
     136                          delete [] refv;
    136137                          _error_("All triangles have been removed");
    137138                  }
     
    698699                        for (i=0;i<nbsubdomains;i++){
    699700                                bamgmesh->SubDomains[i*4+0]=3;
    700                                 bamgmesh->SubDomains[i*4+1]=reft[GetId(subdomains[i].head)];
     701                                bamgmesh->SubDomains[i*4+1]=reft[GetId(subdomains[i].head)]+1;//MATLAB indexing
    701702                                bamgmesh->SubDomains[i*4+2]=1;
    702703                                bamgmesh->SubDomains[i*4+3]=subdomains[i].ReferenceNumber;
     
    980981
    981982        /*Methods*/
    982         void Mesh::AddGeometryMetric(BamgOpts* bamgopts){/*{{{*/
    983                 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Metric.cpp/IntersectGeomMetric)*/
    984 
    985                 /*Get options*/
    986                 double anisomax = bamgopts->anisomax;
    987                 double errg     = bamgopts->errg;
    988 
    989                 double ss[2]={0.00001,0.99999};
    990                 double errC = 2*sqrt(2*errg);
    991                 double hmax = Gh.MaximalHmax();
    992                 double hmin = Gh.MinimalHmin();
    993 
    994                 //check that hmax is positive
    995                 _assert_(hmax>0);
    996 
    997                 //errC cannot be higher than 1
    998                 if(errC>1) errC=1;
    999 
    1000                 //Set all vertices to "on"
    1001                 SetVertexFieldOn();
    1002 
    1003                 //loop over all the vertices on edges
    1004                 for(int  i=0;i<nbe;i++){
    1005                         for (int j=0;j<2;j++){
    1006 
    1007                                 BamgVertex V;
    1008                                 VertexOnGeom GV;
    1009                                 Gh.ProjectOnCurve(edges[i],ss[j],V,GV);
    1010 
    1011                                 GeomEdge* eg = GV;
    1012                                 double s = GV;
    1013                                 R2 tg;
    1014                                 double  R1= eg->R1tg(s,tg);
    1015                                 double  ht=hmax;
    1016                                 // err relative to the length of the edge
    1017                                 if (R1>1.0e-20) { 
    1018                                         ht = Min(Max(errC/R1,hmin),hmax);
    1019                                 }
    1020                                 double hn=Min(hmax,ht*anisomax);
    1021 
    1022                                 if (ht<=0 || hn<=0){
    1023                                         _error_("ht<=0 || hn<=0");
    1024                                 }
    1025                                 EigenMetric Vp(1/(ht*ht),1/(hn*hn),tg);
    1026                                 Metric MVp(Vp);
    1027                                 edges[i][j].m.IntersectWith(MVp);
    1028                         }
    1029                 }
    1030                 // the problem is for the vertex on vertex
    1031         }
    1032         /*}}}*/
    1033983        void Mesh::AddMetric(BamgOpts* bamgopts){/*{{{*/
    1034984                //  Hessiantype = 0 =>  H is computed using double L2 projection
     
    1049999        }
    10501000        /*}}}*/
    1051         void Mesh::AddVertex( BamgVertex &s,Triangle* t, Icoor2* det3){/*{{{*/
     1001        void Mesh::AddVertex( BamgVertex &s,Triangle* t, long long* det3){/*{{{*/
    10521002                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Add)*/
    10531003                // -------------------------------
     
    10681018                /*Intermediaries*/
    10691019                Triangle* tt[3];       //the three triangles
    1070                 Icoor2 det3local[3];   //three determinants (integer)
     1020                long long det3local[3];   //three determinants (integer)
    10711021                int nbzerodet =0;      //number of zeros in det3
    10721022                int izerodet=-1;       //egde containing the vertex s
     
    10791029
    10801030                //determinant of t
    1081                 Icoor2 detOld=t->det;
     1031                long long detOld=t->det;
    10821032
    10831033                /* infvertexindex = index of the infinite vertex (NULL)
     
    12311181                int i,j,k,kk,it,jt;
    12321182                int    verbose=0;
    1233                 double cutoffradian=10*Pi/180;
    12341183
    12351184                /*Recover options*/
    1236                 if (bamgopts){
     1185                if(bamgopts){
    12371186                        verbose=bamgopts->verbose;
    1238                         cutoffradian=bamgopts->MaxCornerAngle*Pi/180;
    12391187                }
    12401188
     
    12431191
    12441192                //check that the mesh is not empty
    1245                 if (nbt<=0 || nbv <=0 ) {
    1246                         _error_("nbt or nbv is negative (Mesh empty?)");
    1247                 }
    1248 
    1249                 //Gh is the geometry of the mesh (this), initialize MaxCornerAngle
    1250                 if (cutoffradian>=0) Gh.MaxCornerAngle = cutoffradian;
     1193                if(nbt<=0 || nbv <=0 ) _error_("nbt or nbv is negative (Mesh empty?)");
    12511194
    12521195                /*Construction of the edges*/
     
    14471390
    14481391                //check that nbsubdomains is empty
    1449                 if (nbsubdomains){
    1450                         _error_("nbsubdomains should be 0");
    1451                 }
     1392                if(nbsubdomains) _error_("nbsubdomains should be 0");
    14521393                nbsubdomains=0;
    14531394
     
    16531594                        long i1 = GetId(triangles[it][VerticesOfTriangularEdge[j][1]]);
    16541595                        k = edge4->SortAndFind(i0,i1);
    1655                         _assert_(k>=0);
     1596                        if(k<0){
     1597                                delete [] colorV;
     1598                                _error_("This should not happen");
     1599                        }
    16561600                        subdomains[i].direction = (vertices + i0 == edges[k].v[0]) ? 1 : -1;
    16571601                        subdomains[i].edge = edges+k;
     
    21132057                                        else if (xy==1) dd=dxdy;
    21142058                                        else if (xy==2) dd=dydy;
    2115                                         else    _error_("not supported yet");
     2059                                        else{
     2060                                                delete [] detT;
     2061                                                delete [] Mmass;
     2062                                                delete [] workT;
     2063                                                delete [] workV;
     2064                                                delete [] Mmassxx;
     2065                                                delete [] OnBoundary;
     2066                                                _error_("not supported yet");
     2067                                        }
    21162068                                        // do leat 2 iteration for boundary problem
    21172069                                        for (int ijacobi=0;ijacobi<Max(NbJacobi,2);ijacobi++){
     
    21622114                delete [] dxdy;
    21632115                delete [] dydy;
    2164                 delete []  workT;
     2116                delete [] workT;
    21652117                delete [] workV;
    21662118                delete [] Mmassxx;
    2167                 delete []  OnBoundary;
     2119                delete [] OnBoundary;
    21682120
    21692121        }
     
    24532405                        if (nbt == nbtout ||  !NbSubDomTot) {
    24542406                                delete [] HeapArete;
     2407                                delete [] HeapTriangle;
    24552408                                _error_("The boundary is not close: all triangles are outside");
    24562409                        }
     
    26492602                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/PreInit)*/
    26502603
    2651                 /* initialize random seed: */
    2652                 srand(19999999);
    2653 
    26542604                /*Initialize fields*/
    2655                 NbRef=0;
    2656                 quadtree=NULL;
    2657                 nbv=0;
    2658                 nbt=0;
    2659                 nbe=0;
    2660                 edges=NULL;
    2661                 nbsubdomains=0;
    2662                 subdomains=NULL;
    2663                 maxnbv=maxnbv_in;
    2664                 maxnbt=2 *maxnbv_in-2;
    2665                 NbVertexOnBThVertex=0;
    2666                 VertexOnBThVertex=NULL;
    2667                 NbVertexOnBThEdge=0;
    2668                 VertexOnBThEdge=NULL;
    2669                 NbCrackedVertices=0;
    2670                 CrackedVertices =NULL;
    2671                 NbCrackedEdges =0;
    2672                 CrackedEdges =NULL;
    2673                 NbVerticesOnGeomVertex=0;
    2674                 VerticesOnGeomVertex=NULL;
    2675                 NbVerticesOnGeomEdge=0;
    2676                 VerticesOnGeomEdge=NULL;
     2605                this->NbRef                  = 0;
     2606                this->quadtree               = NULL;
     2607                this->nbv                    = 0;
     2608                this->nbt                    = 0;
     2609                this->nbe                    = 0;
     2610                this->edges                  = NULL;
     2611                this->nbsubdomains           = 0;
     2612                this->subdomains             = NULL;
     2613                this->maxnbv                 = maxnbv_in;
     2614                this->maxnbt                 = 2 *maxnbv_in-2;
     2615                this->NbVertexOnBThVertex    = 0;
     2616                this->VertexOnBThVertex      = NULL;
     2617                this->NbVertexOnBThEdge      = 0;
     2618                this->VertexOnBThEdge        = NULL;
     2619                this->NbCrackedVertices      = 0;
     2620                this->CrackedVertices        = NULL;
     2621                this->NbCrackedEdges         = 0;
     2622                this->CrackedEdges           = NULL;
     2623                this->NbVerticesOnGeomVertex = 0;
     2624                this->VerticesOnGeomVertex   = NULL;
     2625                this->NbVerticesOnGeomEdge   = 0;
     2626                this->VerticesOnGeomEdge     = NULL;
     2627
     2628                /*Initialize random seed*/
     2629                this->randomseed = 1;
    26772630
    26782631                /*Allocate if maxnbv_in>0*/
    26792632                if(maxnbv_in){
    2680                         vertices=new BamgVertex[maxnbv];
    2681                         _assert_(vertices);
    2682                         orderedvertices=new BamgVertex* [maxnbv];
    2683                         _assert_(orderedvertices);
    2684                         triangles=new Triangle[maxnbt];
    2685                         _assert_(triangles);
     2633                        this->vertices=new BamgVertex[this->maxnbv];
     2634                        this->orderedvertices=new BamgVertex* [this->maxnbv];
     2635                        this->triangles=new Triangle[this->maxnbt];
     2636         _assert_(this->vertices);
     2637         _assert_(this->orderedvertices);
     2638                        _assert_(this->triangles);
    26862639                }
    26872640                else{
    2688                         vertices=NULL;
    2689                         orderedvertices=NULL;
    2690                         triangles=NULL;
    2691                         maxnbt=0;
     2641                        this->vertices        = NULL;
     2642                        this->orderedvertices = NULL;
     2643                        this->triangles       = NULL;
     2644                        this->maxnbt          = 0;
    26922645                }
    26932646        }
    26942647        /*}}}*/
    2695         void Mesh::Insert(bool random) {/*{{{*/
     2648        void Mesh::Insert(){/*{{{*/
    26962649                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Insert)*/
    26972650
     
    27402693                //Get Prime number
    27412694                const long PrimeNumber= BigPrimeNumber(nbv);
    2742                 int temp = rand(); if(!random) temp = 756804110;
    2743                 int  k0=temp%nbv;
     2695                int  k0=this->RandomNumber(nbv);
    27442696
    27452697                //Build orderedvertices
     
    28052757
    28062758                        //Find the triangle in which newvertex is located
    2807                         Icoor2 det3[3];
     2759                        long long det3[3];
    28082760                        Triangle* tcvi = TriangleFindFromCoord(newvertex->i,det3); //(newvertex->i = integer coordinates)
    28092761
     
    28252777        }
    28262778        /*}}}*/
    2827         long Mesh::InsertNewPoints(long nbvold,long & NbTSwap,bool random) {/*{{{*/
     2779        long Mesh::InsertNewPoints(long nbvold,long & NbTSwap) {/*{{{*/
    28282780                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/InsertNewPoints)*/
    28292781
     
    28322784                long i;
    28332785                long NbSwap=0;
    2834                 Icoor2 det3[3];
     2786                long long det3[3];
    28352787
    28362788                //number of new points
     
    28452797                /*construction of a random order*/
    28462798                const long PrimeNumber= BigPrimeNumber(nbv)  ;
    2847                 //remainder of the division of rand() by nbvnew
    2848                 int  temp = rand(); if(!random) temp = 1098566905;
    2849                 long k3 = temp%nbvnew;
     2799                long k3 = long(this->RandomNumber(nbvnew));
    28502800                //loop over the new points
    28512801                for (int is3=0; is3<nbvnew; is3++){
     
    29452895                        }
    29462896                }
    2947                 if(kk) _error_("See above");
     2897                if(kk){
     2898                        delete [] e;
     2899                        _error_("See above");
     2900                }
    29482901
    29492902                return e;
     
    30132966        }
    30142967        /*}}}*/
    3015         Metric Mesh::MetricAt(const R2 & A) const { /*{{{*/
     2968        Metric Mesh::MetricAt(const R2 & A){ /*{{{*/
    30162969                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/MetricAt)*/
    30172970
    30182971                I2 a = R2ToI2(A);
    3019                 Icoor2 deta[3];
     2972                long long deta[3];
    30202973                Triangle * t =TriangleFindFromCoord(a,deta);
    30212974                if (t->det <0) { // outside
     
    30863039                                }
    30873040                        }
    3088                         if(pointsoutside) _printf_("WARNING: One or more points of the initial mesh fall outside of the geometric boundary\n");
     3041                        //if(pointsoutside) _printf_("WARNING: One or more points of the initial mesh fall outside of the geometric boundary\n");
    30893042                        Bh.CreateSingleVertexToTriangleConnectivity();     
    3090                         InsertNewPoints(nbvold,NbTSwap,bamgopts->random);
     3043                        InsertNewPoints(nbvold,NbTSwap);
    30913044                }
    30923045                else Bh.CreateSingleVertexToTriangleConnectivity();     
     
    31463099                        }// for triangle   
    31473100
    3148                         if (!InsertNewPoints(nbvold,NbTSwap,bamgopts->random)) break;
     3101                        if (!InsertNewPoints(nbvold,NbTSwap)) break;
    31493102                        for (i=nbtold;i<nbt;i++) first_np_or_next_t[i]=iter;
    31503103                        Headt = nbt; // empty list
     
    34763429                for (int icount=2; icount<nbvb; icount++) {
    34773430                        BamgVertex *vi  = orderedvertices[icount];
    3478                         Icoor2 det3[3];
     3431                        long long det3[3];
    34793432                        Triangle *tcvi = TriangleFindFromCoord(vi->i,det3);
    34803433                        quadtree->Add(*vi);
     
    38933846                        long  iv = nbvold;
    38943847                        long NbSwap = 0;
    3895                         Icoor2 det3[3]; 
     3848                        long long det3[3]; 
    38963849                        for (int i=nbvold;i<nbv;i++) {// for all the new point
    38973850                                BamgVertex & vi = vertices[i];
     
    39343887        }
    39353888        /*}}}*/
    3936         Triangle * Mesh::TriangleFindFromCoord(const I2 & B,Icoor2 det3[3], Triangle *tstart) const {/*{{{*/
     3889        Triangle * Mesh::TriangleFindFromCoord(const I2 & B,long long det3[3], Triangle *tstart){/*{{{*/
    39373890                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/FindTriangleContening)*/
    39383891
     
    39633916                }
    39643917
    3965                 Icoor2  detop ;
     3918                long long  detop ;
    39663919
    39673920                /*initialize number of test triangle*/
     
    40093962
    40103963                        if (k==0) break;
    4011                         if (k==2 && BinaryRand()) Exchange(ii[0],ii[1]);
     3964                        if (k==2 && this->RandomNumber(1)) Exchange(ii[0],ii[1]);
    40123965                        _assert_(k<3);
    40133966                        AdjacentTriangle t1 = t->Adj(jj=ii[0]);
     
    40954048
    40964049                /*Insert Vertices*/
    4097                 Insert(true);
     4050                Insert();
    40984051        }
    40994052        /*}}}*/
     
    43964349                if (verbose>3) _printf_("      Creating initial Constrained Delaunay Triangulation...\n");
    43974350                if (verbose>3) _printf_("         Inserting boundary points\n");
    4398                 Insert(bamgopts->random);
     4351                Insert();
    43994352
    44004353                //Force the boundary
     
    44604413                printf("\n");
    44614414                if(NbVerticesOnGeomVertex >= maxnbv){
     4415                        delete [] bcurve;
    44624416                        _error_("too many vertices on geometry: " << NbVerticesOnGeomVertex << " >= " << maxnbv);
    44634417                }
     
    47224676                if (verbose>3) _printf_("      Creating initial Constrained Delaunay Triangulation...\n");
    47234677                if (verbose>3) _printf_("         Inserting boundary points\n");
    4724                 Insert(bamgopts->random);
     4678                Insert();
    47254679
    47264680                //Force the boundary
     
    47354689                NewPoints(BTh,bamgopts,KeepVertices) ;
    47364690                if (verbose>4) _printf_("      -- current number of vertices = " << nbv << "\n");
     4691        }
     4692        /*}}}*/
     4693        int  Mesh::RandomNumber(int max){/*{{{*/
     4694                /*  Generate a random number from 0 to max-1 using linear congruential
     4695                 *  random number generator*/
     4696
     4697                this->randomseed = (this->randomseed * 1366l + 150889l) % 714025l;
     4698                return this->randomseed / (714025l / max + 1);
     4699        } /*}}}*/
     4700        int Mesh::ForceEdge(BamgVertex &a, BamgVertex & b,AdjacentTriangle & taret)  { /*{{{*/
     4701                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ForceEdge)*/
     4702
     4703                int NbSwap =0;
     4704                if (!a.t || !b.t){ // the 2 vertex is in a mesh
     4705                        _error_("!a.t || !b.t");
     4706                }
     4707                int k=0;
     4708                taret=AdjacentTriangle(0,0); // erreur
     4709
     4710                AdjacentTriangle tta(a.t,EdgesVertexTriangle[a.IndexInTriangle][0]);
     4711                BamgVertex   *v1, *v2 = tta.EdgeVertex(0),*vbegin =v2;
     4712                // we turn around a in the  direct direction 
     4713
     4714                long long det2 = v2 ? det(*v2,a,b): -1 , det1;
     4715                if(v2) // normal case
     4716                 det2 = det(*v2,a,b);
     4717                else { // no chance infini vertex try the next
     4718                        tta= Previous(Adj(tta));
     4719                        v2 = tta.EdgeVertex(0);
     4720                        vbegin =v2;
     4721                        if (!v2){
     4722                                _error_("!v2");
     4723                        }
     4724                        det2 = det(*v2,a,b);
     4725                }
     4726
     4727                while (v2 != &b) {
     4728                        AdjacentTriangle tc = Previous(Adj(tta));   
     4729                        v1 = v2;
     4730                        v2 = tc.EdgeVertex(0);
     4731                        det1 = det2;
     4732                        det2 =  v2 ? det(*v2,a,b): det2;
     4733
     4734                        if((det1 < 0) && (det2 >0)) {
     4735                                // try to force the edge
     4736                                BamgVertex * va = &a, *vb = &b;
     4737                                tc = Previous(tc);
     4738                                if (!v1 || !v2){
     4739                                        _error_("!v1 || !v2");
     4740                                }
     4741                                long long detss = 0,l=0;
     4742                                while ((this->SwapForForcingEdge(  va,  vb, tc, detss, det1,det2,NbSwap)))
     4743                                 if(l++ > 10000000) {
     4744                                         _error_("Loop in forcing Egde, nb de swap=" << NbSwap << ", nb of try swap (" << l << ") too big");
     4745                                 }
     4746                                BamgVertex *aa = tc.EdgeVertex(0), *bb = tc.EdgeVertex(1);
     4747                                if (((aa == &a ) && (bb == &b)) ||((bb ==  &a ) && (aa == &b))){
     4748                                        tc.SetLock();
     4749                                        a.Optim(1,0);
     4750                                        b.Optim(1,0);
     4751                                        taret = tc;
     4752                                        return NbSwap;
     4753                                }
     4754                                else
     4755                                  {
     4756                                        taret = tc;
     4757                                        return -2; // error  boundary is crossing
     4758                                  }
     4759                        }
     4760                        tta = tc;
     4761                        k++;
     4762                        if (k>=2000){
     4763                                _error_("k>=2000");
     4764                        }
     4765                        if ( vbegin == v2 ) return -1;// error
     4766                }
     4767
     4768                tta.SetLock();
     4769                taret=tta;
     4770                a.Optim(1,0);
     4771                b.Optim(1,0);
     4772                return NbSwap;
     4773        }
     4774        /*}}}*/
     4775        int Mesh::SwapForForcingEdge(BamgVertex   *  & pva ,BamgVertex  * &   pvb ,AdjacentTriangle & tt1,long long & dets1, long long & detsa,long long & detsb, int & NbSwap) {/*{{{*/
     4776                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/SwapForForcingEdge)*/
     4777                // l'arete ta coupe l'arete pva pvb
     4778                // de cas apres le swap sa coupe toujours
     4779                // on cherche l'arete suivante
     4780                // on suppose que detsa >0 et detsb <0
     4781                // attention la routine echange pva et pvb
     4782
     4783                if(tt1.Locked()) return 0; // frontiere croise
     4784
     4785                AdjacentTriangle tt2 = Adj(tt1);
     4786                Triangle *t1=tt1,*t2=tt2;// les 2 triangles adjacent
     4787                short a1=tt1,a2=tt2;// les 2 numero de l arete dans les 2 triangles
     4788                if ( a1<0 || a1>=3 ){
     4789                        _error_("a1<0 || a1>=3");
     4790                }
     4791
     4792                BamgVertex & sa= (* t1)[VerticesOfTriangularEdge[a1][0]];
     4793                BamgVertex & s1= (*t1)[OppositeVertex[a1]];
     4794                BamgVertex & s2= (*t2)[OppositeVertex[a2]];
     4795
     4796                long long dets2 = det(*pva,*pvb,s2);
     4797                long long det1=t1->det , det2=t2->det ;
     4798                long long detT = det1+det2;
     4799                if ((det1<=0 ) || (det2<=0)){
     4800                        _error_("(det1<=0 ) || (det2<=0)");
     4801                }
     4802                if ( (detsa>=0) || (detsb<=0) ){ // [a,b] cut infinite line va,bb
     4803                        _error_("(detsa>=0) || (detsb<=0)");
     4804                }
     4805                long long ndet1 = bamg::det(s1,sa,s2);
     4806                long long ndet2 = detT - ndet1;
     4807
     4808                int ToSwap =0; //pas de swap
     4809                if ((ndet1 >0) && (ndet2 >0))
     4810                  { // on peut swaper 
     4811                        if ((dets1 <=0 && dets2 <=0) || (dets2 >=0 && detsb >=0))
     4812                         ToSwap =1;
     4813                        else // swap alleatoire
     4814                         if (this->RandomNumber(1))
     4815                          ToSwap =2;
     4816                  }
     4817                if (ToSwap) NbSwap++,
     4818                 bamg::swap(t1,a1,t2,a2,&s1,&s2,ndet1,ndet2);
     4819
     4820                int ret=1;
     4821
     4822                if (dets2 < 0) {// haut
     4823                        dets1 = ToSwap ? dets1 : detsa ;
     4824                        detsa = dets2;
     4825                        tt1 =  Previous(tt2) ;}
     4826                else if (dets2 > 0){// bas
     4827                        dets1 = ToSwap ? dets1 : detsb ;
     4828                        detsb = dets2;
     4829                        //xxxx tt1 = ToSwap ? tt1 : Next(tt2);
     4830                        if(!ToSwap) tt1 =  Next(tt2);
     4831                }
     4832                else { // changement de direction
     4833                        ret = -1;
     4834                        Exchange(pva,pvb);
     4835                        Exchange(detsa,detsb);
     4836                        Exchange(dets1,dets2);
     4837                        Exchange(tt1,tt2);
     4838                        dets1=-dets1;
     4839                        dets2=-dets2;
     4840                        detsa=-detsa;
     4841                        detsb=-detsb;
     4842
     4843                        if(ToSwap){
     4844                                if (dets2 < 0) {// haut
     4845                                        dets1 = (ToSwap ? dets1 : detsa) ;
     4846                                        detsa = dets2;
     4847                                        tt1 =  Previous(tt2) ;}
     4848                                else if(dets2 > 0){// bas
     4849                                        dets1 = (ToSwap ? dets1 : detsb) ;
     4850                                        detsb =  dets2;
     4851                                        if(!ToSwap) tt1 =  Next(tt2);
     4852                                }
     4853                                else {// on a fin ???
     4854                                        tt1 = Next(tt2);
     4855                                        ret =0;}
     4856                        }
     4857
     4858                }
     4859                return ret;
    47374860        }
    47384861        /*}}}*/
     
    47484871                }
    47494872                int kkk=0; 
    4750                 Icoor2 IJ_IA,IJ_AJ;
     4873                long long IJ_IA,IJ_AJ;
    47514874                AdjacentTriangle edge(t,OppositeEdge[k]);         
    47524875                for (;;edge = dir >0 ? Next(Adj(Next(edge))) : Previous(Adj(Previous(edge)))) { 
     
    47784901        }
    47794902        /*}}}*/
    4780         int ForceEdge(BamgVertex &a, BamgVertex & b,AdjacentTriangle & taret)  { /*{{{*/
    4781                 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ForceEdge)*/
    4782 
    4783                 int NbSwap =0;
    4784                 if (!a.t || !b.t){ // the 2 vertex is in a mesh
    4785                         _error_("!a.t || !b.t");
    4786                 }
    4787                 int k=0;
    4788                 taret=AdjacentTriangle(0,0); // erreur
    4789 
    4790                 AdjacentTriangle tta(a.t,EdgesVertexTriangle[a.IndexInTriangle][0]);
    4791                 BamgVertex   *v1, *v2 = tta.EdgeVertex(0),*vbegin =v2;
    4792                 // we turn around a in the  direct direction 
    4793 
    4794                 Icoor2 det2 = v2 ? det(*v2,a,b): -1 , det1;
    4795                 if(v2) // normal case
    4796                  det2 = det(*v2,a,b);
    4797                 else { // no chance infini vertex try the next
    4798                         tta= Previous(Adj(tta));
    4799                         v2 = tta.EdgeVertex(0);
    4800                         vbegin =v2;
    4801                         if (!v2){
    4802                                 _error_("!v2");
    4803                         }
    4804                         det2 = det(*v2,a,b);
    4805                 }
    4806 
    4807                 while (v2 != &b) {
    4808                         AdjacentTriangle tc = Previous(Adj(tta));   
    4809                         v1 = v2;
    4810                         v2 = tc.EdgeVertex(0);
    4811                         det1 = det2;
    4812                         det2 =  v2 ? det(*v2,a,b): det2;
    4813 
    4814                         if((det1 < 0) && (det2 >0)) {
    4815                                 // try to force the edge
    4816                                 BamgVertex * va = &a, *vb = &b;
    4817                                 tc = Previous(tc);
    4818                                 if (!v1 || !v2){
    4819                                         _error_("!v1 || !v2");
    4820                                 }
    4821                                 Icoor2 detss = 0,l=0;
    4822                                 while ((SwapForForcingEdge(  va,  vb, tc, detss, det1,det2,NbSwap)))
    4823                                  if(l++ > 10000000) {
    4824                                          _error_("Loop in forcing Egde, nb de swap=" << NbSwap << ", nb of try swap (" << l << ") too big");
    4825                                  }
    4826                                 BamgVertex *aa = tc.EdgeVertex(0), *bb = tc.EdgeVertex(1);
    4827                                 if (((aa == &a ) && (bb == &b)) ||((bb ==  &a ) && (aa == &b))){
    4828                                         tc.SetLock();
    4829                                         a.Optim(1,0);
    4830                                         b.Optim(1,0);
    4831                                         taret = tc;
    4832                                         return NbSwap;
    4833                                 }
    4834                                 else
    4835                                   {
    4836                                         taret = tc;
    4837                                         return -2; // error  boundary is crossing
    4838                                   }
    4839                         }
    4840                         tta = tc;
    4841                         k++;
    4842                         if (k>=2000){
    4843                                 _error_("k>=2000");
    4844                         }
    4845                         if ( vbegin == v2 ) return -1;// error
    4846                 }
    4847 
    4848                 tta.SetLock();
    4849                 taret=tta;
    4850                 a.Optim(1,0);
    4851                 b.Optim(1,0);
    4852                 return NbSwap;
    4853         }
    4854         /*}}}*/
    4855         void  swap(Triangle *t1,short a1, Triangle *t2,short a2, BamgVertex *s1,BamgVertex *s2,Icoor2 det1,Icoor2 det2){ /*{{{*/
     4903        void  swap(Triangle *t1,short a1, Triangle *t2,short a2, BamgVertex *s1,BamgVertex *s2,long long det1,long long det2){ /*{{{*/
    48564904                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/swap)*/
    48574905                // --------------------------------------------------------------
     
    48974945        } // end swap
    48984946        /*}}}*/
    4899         int SwapForForcingEdge(BamgVertex   *  & pva ,BamgVertex  * &   pvb ,AdjacentTriangle & tt1,Icoor2 & dets1, Icoor2 & detsa,Icoor2 & detsb, int & NbSwap) {/*{{{*/
    4900                 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/SwapForForcingEdge)*/
    4901                 // l'arete ta coupe l'arete pva pvb
    4902                 // de cas apres le swap sa coupe toujours
    4903                 // on cherche l'arete suivante
    4904                 // on suppose que detsa >0 et detsb <0
    4905                 // attention la routine echange pva et pvb
    4906 
    4907                 if(tt1.Locked()) return 0; // frontiere croise
    4908 
    4909                 AdjacentTriangle tt2 = Adj(tt1);
    4910                 Triangle *t1=tt1,*t2=tt2;// les 2 triangles adjacent
    4911                 short a1=tt1,a2=tt2;// les 2 numero de l arete dans les 2 triangles
    4912                 if ( a1<0 || a1>=3 ){
    4913                         _error_("a1<0 || a1>=3");
    4914                 }
    4915 
    4916                 BamgVertex & sa= (* t1)[VerticesOfTriangularEdge[a1][0]];
    4917                 BamgVertex & s1= (*t1)[OppositeVertex[a1]];
    4918                 BamgVertex & s2= (*t2)[OppositeVertex[a2]];
    4919 
    4920                 Icoor2 dets2 = det(*pva,*pvb,s2);
    4921                 Icoor2 det1=t1->det , det2=t2->det ;
    4922                 Icoor2 detT = det1+det2;
    4923                 if ((det1<=0 ) || (det2<=0)){
    4924                         _error_("(det1<=0 ) || (det2<=0)");
    4925                 }
    4926                 if ( (detsa>=0) || (detsb<=0) ){ // [a,b] cut infinite line va,bb
    4927                         _error_("(detsa>=0) || (detsb<=0)");
    4928                 }
    4929                 Icoor2 ndet1 = bamg::det(s1,sa,s2);
    4930                 Icoor2 ndet2 = detT - ndet1;
    4931 
    4932                 int ToSwap =0; //pas de swap
    4933                 if ((ndet1 >0) && (ndet2 >0))
    4934                   { // on peut swaper 
    4935                         if ((dets1 <=0 && dets2 <=0) || (dets2 >=0 && detsb >=0))
    4936                          ToSwap =1;
    4937                         else // swap alleatoire
    4938                          if (BinaryRand())
    4939                           ToSwap =2;
    4940                   }
    4941                 if (ToSwap) NbSwap++,
    4942                  bamg::swap(t1,a1,t2,a2,&s1,&s2,ndet1,ndet2);
    4943 
    4944                 int ret=1;
    4945 
    4946                 if (dets2 < 0) {// haut
    4947                         dets1 = ToSwap ? dets1 : detsa ;
    4948                         detsa = dets2;
    4949                         tt1 =  Previous(tt2) ;}
    4950                 else if (dets2 > 0){// bas
    4951                         dets1 = ToSwap ? dets1 : detsb ;
    4952                         detsb = dets2;
    4953                         //xxxx tt1 = ToSwap ? tt1 : Next(tt2);
    4954                         if(!ToSwap) tt1 =  Next(tt2);
    4955                 }
    4956                 else { // changement de direction
    4957                         ret = -1;
    4958                         Exchange(pva,pvb);
    4959                         Exchange(detsa,detsb);
    4960                         Exchange(dets1,dets2);
    4961                         Exchange(tt1,tt2);
    4962                         dets1=-dets1;
    4963                         dets2=-dets2;
    4964                         detsa=-detsa;
    4965                         detsb=-detsb;
    4966 
    4967                         if(ToSwap){
    4968                                 if (dets2 < 0) {// haut
    4969                                         dets1 = (ToSwap ? dets1 : detsa) ;
    4970                                         detsa = dets2;
    4971                                         tt1 =  Previous(tt2) ;}
    4972                                 else if(dets2 > 0){// bas
    4973                                         dets1 = (ToSwap ? dets1 : detsb) ;
    4974                                         detsb =  dets2;
    4975                                         if(!ToSwap) tt1 =  Next(tt2);
    4976                                 }
    4977                                 else {// on a fin ???
    4978                                         tt1 = Next(tt2);
    4979                                         ret =0;}
    4980                         }
    4981 
    4982                 }
    4983                 return ret;
    4984         }
    4985         /*}}}*/
    49864947}
Note: See TracChangeset for help on using the changeset viewer.