Changeset 22085


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

CHG: new bamg version.

Location:
issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg
Files:
18 edited

Legend:

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

    r18064 r22085  
    3434        }
    3535        /*}}}*/
    36         Icoor2 & AdjacentTriangle::det() const {/*{{{*/
     36        long long & AdjacentTriangle::det() const {/*{{{*/
    3737                return t->det;
    3838        }
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/AdjacentTriangle.h

    r16233 r22085  
    3737                        AdjacentTriangle Adj() const;
    3838                        BamgVertex* EdgeVertex(const int & i) const;
    39                         Icoor2& det() const;
     39                        long long& det() const;
    4040        };
    4141}
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/BamgOpts.cpp

    r18064 r22085  
    55BamgOpts::BamgOpts(){/*{{{*/
    66
    7         this->anisomax=0;
    8         this->cutoff=0;
    9         this->coeff=0;
    10         this->errg=0;
    11         this->gradation=0;
    12         this->Hessiantype=0;
    13         this->MaxCornerAngle=0;
    14         this->maxnbv=0;
    15         this->maxsubdiv=0;
    16         this->Metrictype=0;
    17         this->nbjacobi=0;
    18         this->nbsmooth=0;
    19         this->omega=0;
    20         this->power=0;
    21         this->random=0;
    22         this->verbose=0;
     7        this->anisomax          = 0;
     8        this->cutoff            = 0;
     9        this->coeff             = 0;
     10        this->errg              = 0;
     11        this->gradation         = 0;
     12        this->Hessiantype       = 0;
     13        this->maxnbv            = 0;
     14        this->maxsubdiv         = 0;
     15        this->Metrictype        = 0;
     16        this->nbjacobi          = 0;
     17        this->nbsmooth          = 0;
     18        this->omega             = 0;
     19        this->power             = 0;
     20        this->verbose           = 0;
    2321
    24         this->Crack=0;
    25         this->geometricalmetric=0;
    26         this->KeepVertices=0;
    27         this->splitcorners=0;
     22        this->Crack             = 0;
     23        this->KeepVertices      = 0;
     24        this->splitcorners      = 0;
    2825
    29         this->hmin=0;
    30         this->hmax=0;
     26        this->hmin              = 0;
     27        this->hmax              = 0;
    3128        this->hminVertices=NULL; this->hminVerticesSize[0]=this->hminVerticesSize[1]=0;
    3229        this->hmaxVertices=NULL; this->hmaxVerticesSize[0]=this->hmaxVerticesSize[1]=0;
     
    6865        if (this->Crack!=0  && this->Crack!=1) _error_("'Crack' supported options are 0 and 1");
    6966        if (this->KeepVertices!=0 && this->KeepVertices!=1) _error_("'KeepVertices' supported options are 0 and 1");
    70         if (this->geometricalmetric!=0  && this->geometricalmetric!=1) _error_("'geometricalmetric' supported options are 0 and 1");
    7167
    7268        if (this->hmin<=0) _error_("'hmin' option should be >0");
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/BamgOpts.h

    r16967 r22085  
    1717                double  gradation;
    1818                int     Hessiantype;
    19                 double  MaxCornerAngle;
    2019                int     maxnbv;
    2120                double  maxsubdiv;
     
    2524                double  omega;
    2625                double  power;
    27                 bool    random;
    2826                int     verbose;
    2927
    3028                /*Flags*/
    3129                int     Crack;
    32                 int     geometricalmetric;
    3330                int     KeepVertices;
    3431                int     splitcorners;
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/BamgVertex.cpp

    r21759 r22085  
    122122        }
    123123        /*}}}*/
    124         double  BamgVertex::Smoothing(Mesh &Th,const Mesh &BTh,Triangle* &tstart ,double omega){/*{{{*/
     124        double  BamgVertex::Smoothing(Mesh &Th,Mesh &BTh,Triangle* &tstart ,double omega){/*{{{*/
    125125                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Smoothing)*/
    126126
     
    157157                double delta=Norme2_2(Xmove);
    158158
    159                 Icoor2 deta[3];
     159                long long deta[3];
    160160                I2 IBTh  = BTh.R2ToI2(PNew);
    161161
     
    194194                                tria->det =  bamg::det( (*tria)[0],(*tria)[1]  ,(*tria)[2]);
    195195                                if (loop) {
    196                                         BamgVertex *v0,*v1,*v2,*v3;
    197196                                        if (tria->det<0) ok =1;                       
    198197                                        else if ( (double)tria->det < detold/2 ) ok=1;
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/BamgVertex.h

    r21759 r22085  
    4242                        /*methods (No constructor and no destructors...)*/
    4343                        BamgVertex();
    44                         double Smoothing(Mesh & ,const Mesh & ,Triangle  * & ,double =1);
     44                        double Smoothing(Mesh & ,Mesh & ,Triangle  * & ,double =1);
    4545                        void   MetricFromHessian(const double Hxx,const double Hyx, const double Hyy, const double smin,const double smax,const double s,const double err,BamgOpts* bamgopts);
    4646                        void   Echo();
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/GeomEdge.cpp

    r18064 r22085  
    6363                return type &16;
    6464        }/*}}}*/
    65         double GeomEdge::R1tg(double theta,R2 & t) const{/*{{{*/
    66                 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, MeshGeom.cpp/R1tg)*/
    67                 // 1/R of radius of cuvature
    68 
    69                 R2 A=v[0]->r,B=v[1]->r;
    70                 double dca,dcb,dcta,dctb;
    71                 double ddca,ddcb,ddcta,ddctb;
    72                 double tt = theta*theta;
    73 
    74                 //check theta
    75                 _assert_(theta>=0 && theta<=1);
    76 
    77                 if (TgA()){
    78                         if (TgB()){
    79                                 // Tangent A and B provided:
    80                                 // interpolation d'hermite
    81                                 dcb = 6*theta*(1-theta);
    82                                 ddcb = 6*(1-2*theta);
    83                                 dca = -dcb;
    84                                 ddca = -ddcb;
    85                                 dcta =  (3*theta - 4)*theta + 1;
    86                                 ddcta=6*theta-4;
    87                                 dctb = 3*tt - 2*theta;
    88                                 ddctb = 6*theta-2;
    89                         }
    90                         else {
    91                                 //Tangent A provided but tangent B not provided
    92                                 // 1-t*t, t-t*t, t*t
    93                                 double t = theta;
    94                                 dcb = 2*t;
    95                                 ddcb = 2;
    96                                 dca = -dcb;
    97                                 ddca = -2;
    98                                 dcta = 1-dcb;
    99                                 ddcta = -ddcb;
    100                                 dctb=0;   
    101                                 ddctb=0;   
    102                         }
    103                 }
    104                 else{
    105                         if (TgB()){
    106                                 //Tangent B provided but tangent A not provided
    107                                 double t = 1-theta;
    108                                 dca = -2*t;
    109                                 ddca = 2;
    110                                 dcb = -dca;
    111                                 ddcb = -2;
    112                                 dctb = 1+dca;
    113                                 ddctb= ddca;
    114                                 dcta =0;
    115                                 ddcta =0;
    116                         }
    117                         else {
    118                                 //Neither thangent A nor tangent B provided
    119                                 // lagrange P1
    120                                 t=B-A;
    121                                 return 0;
    122                         }
    123                 }
    124                 R2 d  =  A*dca  + B*dcb  + tg[0]* dcta  + tg[1] * dctb;
    125                 R2 dd =  A*ddca + B*ddcb + tg[0]* ddcta + tg[1] * ddctb;
    126                 double d2=(d,d);
    127                 double sd2 = sqrt(d2);
    128                 t=d;
    129                 if(d2>1.0e-20){
    130                         t/=sd2;
    131                         return Abs(Det(d,dd))/(d2*sd2);
    132                 }
    133                 else return 0;
    134         }
    135         /*}}}*/
    13665        int    GeomEdge::Required()       {/*{{{*/
    13766                return type &64;
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/GeomEdge.h

    r16231 r22085  
    2727                        //Methods
    2828                        R2     F(double theta) const ; // parametrization of the curve edge
    29                         double R1tg(double theta,R2 &t) const ; // 1/radius of curvature + tangente
    3029                        int    Cracked() const;
    3130                        int    TgA()     const;
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/Geometry.cpp

    r21759 r22085  
    187187                }
    188188
    189                 //MaxCornerAngle
    190                 if (bamgopts->MaxCornerAngle){
    191                         if(verbose>5) _printf_("      processing MaxCornerAngle\n");
    192                         MaxCornerAngle=bamgopts->MaxCornerAngle*Pi/180;
    193                 }
    194 
    195189                //TangentAtEdges
    196190                if (bamggeom->TangentAtEdges){
     
    401395                _printf_("   pmax (x,y): (" << pmax.x << " " << pmax.y << ")\n");
    402396                _printf_("   coefIcoor: " << coefIcoor << "\n");
    403                 _printf_("   MaxCornerAngle: " << MaxCornerAngle << "\n");
    404397
    405398                return;
     
    419412                nbcurves=0;
    420413                subdomains=NULL;
    421                 MaxCornerAngle = 10*Pi/180; //default is 10 degres
    422414        }
    423415        /*}}}*/
     
    614606                        }
    615607
    616                         // angular test on current vertex to guess whether it is a corner (ord = number of edges holding i)
    617                         if(ord==2) {
     608                        //all vertices provided in geometry are corners (ord = number of edges holding i)
     609                        vertices[i].SetCorner() ;
     610                        if(ord==2){
    618611                                long  n1 = head_v[i];
    619612                                long  n2 = next_p[n1];
    620613                                long  i1 = n1/2, i2 = n2/2; // edge number
    621                                 long  j1 = n1%2, j2 = n2%2; // vertex in the edge
    622                                 float angle1=  j1 ? OppositeAngle(eangle[i1]) : eangle[i1];
    623                                 float angle2= !j2 ? OppositeAngle(eangle[i2]) : eangle[i2];
    624                                 float da12 = Abs(angle2-angle1);
    625                                 if (( da12 >= MaxCornerAngle ) && (da12 <= 2*Pi -MaxCornerAngle)) {
    626                                         vertices[i].SetCorner() ;
    627                                 }
    628                                 // if the edge type/referencenumber a changing then is SetRequired();
     614                                long  j1 = n1%2, j2 = n2%2; // vertex in the edge
     615                                /* if the edge type/referencenumber a changing then is SetRequired();*/
    629616                                if (edges[i1].type != edges[i2].type || edges[i1].Required()){
    630617                                        vertices[i].SetRequired();
     
    634621                                }
    635622                        }
    636                         if(ord != 2) {
    637                                 vertices[i].SetCorner();
    638                         }
    639                         vertices[i].SetCorner();
    640623
    641624                        /*close the list around the vertex to have a circular loop*/
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/Geometry.h

    r21759 r22085  
    3232                        R2             pmin,pmax;             // domain extrema coordinates
    3333                        double         coefIcoor;             // coef to integer coordinates;
    34                         double         MaxCornerAngle;
    3534
    3635                        //Constructor/Destructors
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/ListofIntersectionTriangles.cpp

    r18064 r22085  
    188188        }
    189189        /*}}}*/
    190         void ListofIntersectionTriangles::SplitEdge(const Mesh & Bh, const R2 &A,const R2  &B,int nbegin) {/*{{{*/
     190        void ListofIntersectionTriangles::SplitEdge(Mesh & Bh, const R2 &A,const R2  &B,int nbegin) {/*{{{*/
    191191                /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ListofIntersectionTriangles)*/
    192192
    193193                Triangle *tbegin, *t;
    194194
    195                 Icoor2 deta[3], deti,detj;
     195                long long deta[3], deti,detj;
    196196                double ba[3];
    197197                int ifirst=-1,ilast;
     
    199199                int ocut,i,j,k=-1;
    200200                //  int OnAVertices =0;
    201                 Icoor2 dt[3];
     201                long long dt[3];
    202202                I2 a = Bh.R2ToI2(A) ,b= Bh.R2ToI2(B);// compute  the Icoor a,b
    203203                I2 vi,vj; 
     
    356356                                k = OppositeVertex[ocut];
    357357
    358                                 Icoor2 detbij = bamg::det((*t)[i],(*t)[j],b);
     358                                long long detbij = bamg::det((*t)[i],(*t)[j],b);
    359359
    360360                                if (detbij >= 0) { //we find the triangle contening b
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/ListofIntersectionTriangles.h

    r16233 r22085  
    6363                        int    NewItem(Triangle *tt,double d0,double d1,double d2);
    6464                        int    NewItem(R2 ,const Metric &);
    65                         void   SplitEdge(const Mesh &,const R2 &,const R2 &,int nbegin=0);
     65                        void   SplitEdge(Mesh &,const R2 &,const R2 &,int nbegin=0);
    6666                        double Length();
    6767                        long   NewPoints(BamgVertex *,long &nbv,long maxnbv);
  • TabularUnified 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}
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/Mesh.h

    r21759 r22085  
    3838
    3939                        R2                            pmin,pmax;             // extrema
    40                         double                        coefIcoor;             // coef to integer Icoor1;
     40                        double                        coefIcoor;             // coef to integer
    4141                        ListofIntersectionTriangles   lIntTria;
     42                        int                           randomseed;            //used for random number generation
    4243
    4344                        long                          NbVerticesOnGeomVertex;
     
    7677                        I2 R2ToI2(const R2 & P) const;
    7778                        R2 I2ToR2(const I2 & P) const;
    78                         void AddVertex(BamgVertex & s,Triangle * t,Icoor2 *  =0) ;
    79                         void Insert(bool random);
     79                        void AddVertex(BamgVertex & s,Triangle * t,long long *  =0) ;
     80                        void Insert();
    8081                        void Echo(void);
    8182                        void ForceBoundary();
     
    9192                        void MaxSubDivision(double maxsubdiv);
    9293                        void NewPoints(Mesh &,BamgOpts* bamgopts,int KeepVertices=1);
    93                         long InsertNewPoints(long nbvold,long & NbTSwap,bool random);
     94                        long InsertNewPoints(long nbvold,long & NbTSwap);
    9495                        void TrianglesRenumberBySubDomain(bool justcompress=false);
    9596                        void SmoothingVertex(int =3,double=0.3);
    96                         Metric MetricAt (const R2 &) const;
     97                        Metric MetricAt (const R2 &);
    9798                        GeomEdge* ProjectOnCurve( Edge & AB, BamgVertex &  A, BamgVertex & B,double theta, BamgVertex & R,VertexOnEdge & BR,VertexOnGeom & GR);
    9899                        long GetId(const Triangle & t) const;
     
    103104                        long GetId(const Edge * t) const;
    104105                        BamgVertex* NearestVertex(int i,int j) ;
    105                         Triangle* TriangleFindFromCoord(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;
     106                        Triangle* TriangleFindFromCoord(const I2 & ,long long [3],Triangle *tstart=0);
    106107                        void ReadMesh(int* index,double* x,double* y,int nods,int nels);
    107108                        void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts);
     
    113114                        void BuildMetric0(BamgOpts* bamgopts);
    114115                        void BuildMetric1(BamgOpts* bamgopts);
    115                         void AddGeometryMetric(BamgOpts* bamgopts);
    116116                        void BuildGeometryFromMesh(BamgOpts* bamgopts=NULL);
     117                        int  RandomNumber(int max);
    117118                        void ReconstructExistingMesh();
    118119
     
    143144                        void Triangulate(double* x,double* y,int nods);
    144145                        void Init(long);
     146                        int ForceEdge(BamgVertex &a, BamgVertex & b,AdjacentTriangle & taret) ;
     147                        int SwapForForcingEdge(BamgVertex   *  & pva ,BamgVertex  * &   pvb ,
     148                                                AdjacentTriangle & tt1,long long & dets1,
     149                                                long long & detsa,long long & detsb, int & nbswap);
    145150        };
    146151
     
    149154        void  swap(Triangle *t1,short a1,
    150155                                Triangle *t2,short a2,
    151                                 BamgVertex *s1,BamgVertex *s2,Icoor2 det1,Icoor2 det2);
    152         int SwapForForcingEdge(BamgVertex   *  & pva ,BamgVertex  * &   pvb ,
    153                                 AdjacentTriangle & tt1,Icoor2 & dets1,
    154                                 Icoor2 & detsa,Icoor2 & detsb, int & nbswap);
    155         int ForceEdge(BamgVertex &a, BamgVertex & b,AdjacentTriangle & taret) ;
     156                                BamgVertex *s1,BamgVertex *s2,long long det1,long long det2);
     157
    156158        inline AdjacentTriangle Previous(const AdjacentTriangle & ta){
    157159                return AdjacentTriangle(ta.t,PreviousEdge[ta.a]);
     
    166168                int j=i;i=on->AdjVertexIndex[i];on=on->Adj[j];
    167169        }
    168         inline double qualite(const BamgVertex &va,const BamgVertex &vb,const BamgVertex &vc){
    169                 double ret;
    170                 I2 ia=va,ib=vb,ic=vc;
    171                 I2 ab=ib-ia,bc=ic-ib,ac=ic-ia;
    172                 Icoor2 deta=Det(ab,ac);
    173                 if (deta <=0) ret = -1;
    174                 else {
    175                         double a = sqrt((double) (ac,ac)),
    176                                          b = sqrt((double) (bc,bc)),
    177                                          c = sqrt((double) (ab,ab)),
    178                                          p = a+b+c;
    179                         double h= Max(Max(a,b),c),ro=deta/p;
    180                         ret = ro/h;
    181                 }
    182                 return ret;
    183         }
    184 
    185170}
    186171#endif
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/Triangle.cpp

    r21759 r22085  
    238238                BamgVertex  *s2=t2->vertices[OppositeVertex[a2]];
    239239
    240                 Icoor2 det1=t1->det , det2=t2->det ;
    241                 Icoor2 detT = det1+det2;
    242                 Icoor2 detA = Abs(det1) + Abs(det2);
    243                 Icoor2 detMin = Min(det1,det2);
     240                long long det1=t1->det , det2=t2->det ;
     241                long long detT = det1+det2;
     242                long long detA = Abs(det1) + Abs(det2);
     243                long long detMin = Min(det1,det2);
    244244
    245245                int OnSwap = 0;       
     
    256256                        OnSwap = (Abs(det1) + Abs(det2)) < detA;
    257257
    258                         Icoor2 detMinNew=Min(det1,det2);
    259                         //     if (detMin<0 && (Abs(det1) + Abs(det2) == detA)) OnSwap=BinaryRand();// just for test   
     258                        long long detMinNew=Min(det1,det2);
    260259                        if (! OnSwap &&(detMinNew>0)) {
    261260                                OnSwap = detMin ==0;
     
    265264                                         if(kopt) {
    266265                                                 // critere de Delaunay pure isotrope
    267                                                  Icoor2 xb1 = sb->i.x - s1->i.x,
     266                                                 long long xb1 = sb->i.x - s1->i.x,
    268267                                                                  x21 = s2->i.x - s1->i.x,
    269268                                                                  yb1 = sb->i.y - s1->i.y,
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/Triangle.h

    r21759 r22085  
    2121
    2222                public:
    23                         Icoor2 det; //Integer determinant (twice its area)
     23                        long long det; //Integer determinant (twice its area)
    2424                        union {
    2525                                Triangle *link;
     
    6060
    6161                        //Inline methods
    62                         double qualite() ;
    6362                        void  Set(const Triangle &,const Mesh &,Mesh &);
    6463                        int   In(BamgVertex *v) const { return vertices[0]==v || vertices[1]==v || vertices[2]==v ;}
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/det.h

    r15061 r22085  
    66namespace bamg {
    77
    8         Icoor2 inline det(const I2 &a,const I2 & b,const I2 &c){
    9                 Icoor2 bax = b.x - a.x ,bay = b.y - a.y;
    10                 Icoor2 cax = c.x - a.x ,cay = c.y - a.y;
     8        long long inline det(const I2 &a,const I2 & b,const I2 &c){
     9                long long bax = b.x - a.x ,bay = b.y - a.y;
     10                long long cax = c.x - a.x ,cay = c.y - a.y;
    1111                return  bax*cay - bay*cax;
    1212        }
  • TabularUnified issm/branches/trunk-larour-NatGeoScience2016/src/c/bamg/typedefs.h

    r15101 r22085  
    77
    88        /*Integer coordinates types*/
    9         typedef int  Icoor1;
    10         typedef long long Icoor2;
    119
    1210        /*I2 and R2*/
    13         typedef P2<Icoor1,Icoor2>  I2;
     11        typedef P2<int,long long>  I2;
    1412        typedef P2<double,double>  R2;
    1513}
Note: See TracChangeset for help on using the changeset viewer.