Changeset 5339


Ignore:
Timestamp:
08/18/10 08:32:08 (15 years ago)
Author:
Mathieu Morlighem
Message:

As usual

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/objects/Bamg/Geometry.cpp

    r5208 r5339  
    478478                 * a vertex v?
    479479                 * To do so, we use the same chaining algorithm but there is a difficulty
    480                  * coming from the fact that F we have a couple of vertices and not one
    481                  * vertices.
    482                  * To overcome this difficulty, we use a global indices exactly like in
     480                 * coming from the fact that for F we have a couple of vertices and not one
     481                 * vertex.
     482                 * To overcome this difficulty, we use a global indexing exactly like in
    483483                 * C/C++ so that
    484484                 * a member of a 2-column-table can be described by one index p=i*2+j
    485485                 * i=(int)p/2 line number of p
    486                  * j=p%2       column number of p
     486                 * j=p%2      column number of p
    487487                 *
    488488                 * Algorithm:
     
    506506                        double lv10=Norme2(v10);
    507507                        //check that its length is not 0
    508                         if(lv10==0) {
    509                                 ISSMERROR("Length of edge %i is 0",i);
    510                         }
     508                        if(lv10==0)ISSMERROR("Length of edge %i is 0",i);
    511509                        //compute angle in [-Pi Pi]
    512510                        eangle[i] = atan2(v10.y,v10.x);
     
    521519                //sort head_v by order of increasing edges angle
    522520                for (i=0;i<nbv;i++) {
    523                         int exch=1, ord=0;     
     521                        int exch=1,ord=0;     
    524522
    525523                        //exchange vertices position in head_v and next_p till tey are sorted
    526524                        while (exch){
    527                                 long *p=head_v+i;               // pointer toward head_v[vertex i]
    528                                 long *po=p;                     // copy of pointer p
    529                                 long  n=*p;                     // next value of edge holding i
     525                                long *p=head_v+i;               
     526                                long *po=p;                     
     527                                long  n=*p;                     
    530528                                register float angleold=-1000 ; // angle = - infinity
    531529                                ord=0; exch=0;
    532530
    533                                 // loop over the edges that contain the vertex i
     531                                // loop over the edges that contain the vertex i (till -1)
    534532                                while (n >=0){
    535533                                        ord++;
    536                                         register long  i1=n/2;       // i1 = floor (n/2)
    537                                         register long  j1=n%2;       // j1 = 1 if n is odd
    538                                         register long* pn=next_p+n;  // pointer to next_p[n]
    539 
    540                                         //  n = next_p[n] = position in edge of next vertex i
     534                                        long  i1=n/2;       // i1 = floor (n/2)      -> Edge number
     535                                        long  j1=n%2;       // j1 = 1 if n is odd    -> Vertex index for this edge (0 or 1)
     536                                        long* pn=next_p+n;
     537
     538                                        //Next vertex index
    541539                                        n=*pn;                       
    542540
     
    562560                        }
    563561
    564                         // angular test on current vertex to guess whether it is a corner (ord = number of edges horlding i)
    565                         if(ord == 2) {
     562                        // angular test on current vertex to guess whether it is a corner (ord = number of edges holding i)
     563                        if(ord==2) {
    566564                                long  n1 = head_v[i];
    567565                                long  n2 = next_p[n1];
     
    574572                                        vertices[i].SetCorner() ;
    575573                                }
    576                                 // if the ReferenceNumber a changing then is    SetRequired();
     574                                // if the edge type/referencenumber a changing then is SetRequired();
    577575                                if (edges[i1].type != edges[i2].type || edges[i1].Required()){
    578576                                        vertices[i].SetRequired();
     
    586584                        }
    587585
    588                         // close the list around the vertex
     586                        /*close the list around the vertex to have a circular loop*/
    589587                        long no=-1, ne = head_v[i];
    590588                        while (ne >=0) ne = next_p[no=ne];       
    591589                        if(no>=0) next_p[no] = head_v[i];
    592                         // now the list around the vertex is circular
    593                 }
    594 
     590                }
     591
     592                /*Check that the list makes sense (we have all the time the same vertex)
     593                 * and build adjacent edges*/
    595594                k =0;
    596595                for (i=0;i<nbe;i++){
    597596                        for (j=0;j<2;j++){
     597
    598598                                long n1 = next_p[k++];
    599599                                long i1 = n1/2 ,j1=n1%2;
    600                                 if( edges[i1].v[j1] != edges[i].v[j]) {
    601                                         ISSMERROR("Bug Adj edge");
    602                                 }
     600
     601                                if( edges[i1].v[j1] != edges[i].v[j]) ISSMERROR("Problem while processing edges: check the edge list");
     602
    603603                                edges[i1].Adj[j1] = edges + i;
    604604                                edges[i1].DirAdj[j1] = j;
     
    608608                // generation of  all the tangents
    609609                for (i=0;i<nbe;i++) {
    610                         //Get AB = vertex1->vertex2
    611                         R2    AB =edges[i].v[1]->r -edges[i].v[0]->r;       
    612                         //Get length of AB
    613                         double lAB=Norme2(AB);
    614                         //initialize tangent
    615                         double ltg2[2]={0.0};
     610                        R2    AB =edges[i].v[1]->r -edges[i].v[0]->r;// AB = vertex0 -> vertex1
     611                        double lAB=Norme2(AB);                       // Get length of AB
     612                        double ltg2[2]={0.0};                        // initialize tangent
    616613
    617614                        //loop over the 2 vertices of the edge
    618                         for (jj=0;jj<2;jj++) {
    619                                 R2     tg =edges[i].tg[jj];
     615                        for (j=0;j<2;j++) {
     616                                R2     tg =edges[i].tg[j];
    620617                                double ltg=Norme2(tg);
    621618
    622619                                //by default, tangent=[0 0]
    623                                 if(ltg == 0) {
     620                                if(ltg==0){
    624621                                        //if the current vertex of the edge is not a corner
    625                                         if(!edges[i].v[jj]->Corner()){
    626                                                 tg = edges[i].v[1-jj]->r - edges[i].Adj[jj]->v[1-edges[i].DirAdj[jj]]->r; //previous point and next point on curve
     622                                        if(!edges[i].v[j]->Corner()){
     623                                                /*The tangent is set as the vector between the
     624                                                 * previous and next vertices connected to current vertex
     625                                                 * normed by the edge length*/
     626                                                tg = edges[i].v[1-j]->r - edges[i].Adj[j]->v[1-edges[i].DirAdj[j]]->r;
    627627                                                ltg= Norme2(tg);
    628628                                                tg = tg *(lAB/ltg);
    629629                                                ltg= lAB;
    630630                                        }
    631                                         //else:  a Corner with no tangent => nothing to do   
     631                                        //else:  a Corner no tangent => nothing to do   
    632632                                }
    633633                                else{
     
    636636                                }
    637637
    638                                 ltg2[jj] = ltg;
    639 
    640                                 if ((tg,AB)<0){
    641                                         tg = -tg;
    642                                 }
    643 
    644                                 edges[i].tg[jj] = tg;
     638                                ltg2[j] = ltg;
     639
     640                                if ((tg,AB)<0) tg = -tg;
     641
     642                                edges[i].tg[j]=tg;
    645643                        }
    646644                        if (ltg2[0]!=0) edges[i].SetTgA();
     
    649647
    650648                for (int step=0;step<2;step++){
     649
    651650                        for (i=0;i<nbe;i++) edges[i].SetUnMark();
     651
    652652                        nbcurves = 0;
    653653                        long  nbgem=0;
    654                         for (int level=0;level < 2 && nbgem != nbe;level++)
    655                          for (i=0;i<nbe;i++) {
    656                                  GeometricalEdge & ei = edges[i];   
    657                                  for(jj=0;jj<2;jj++){
    658                                          if (!ei.Mark() && (level || ei[jj].Required())) {
    659                                                  // warning ei.Mark() can be change in loop for(jj=0;jj<2;jj++)
    660                                                  int k0=jj,k1;
    661                                                  GeometricalEdge *e = & ei;
    662                                                  GeometricalVertex *a=(*e)(k0); // begin
    663                                                  if(curves){
    664                                                          curves[nbcurves].be=e;
    665                                                          curves[nbcurves].kb=k0;
    666                                                  }
    667                                                  int nee=0;
    668                                                  for(;;) {
    669                                                          nee++;
    670                                                          k1 = 1-k0; // next vertex of the edge
    671                                                          e->SetMark();
    672                                                          nbgem++;
    673                                                          e->CurveNumber=nbcurves;
    674                                                          if(curves) {
    675                                                                  curves[nbcurves].ee=e;
    676                                                                  curves[nbcurves].ke=k1;
    677                                                          }
    678 
    679                                                          GeometricalVertex *b=(*e)(k1);
    680                                                          if (a == b ||  b->Required() ) break;
    681                                                          k0 = e->DirAdj[k1];//  vertex in next edge
    682                                                          e = e->Adj[k1]; // next edge
    683                                                  }
    684                                                  nbcurves++;
    685                                                  if(level) a->SetRequired();
    686                                          }
    687                                  }
    688                          }
     654
     655                        for (int level=0;level < 2 && nbgem != nbe;level++){
     656                                for (i=0;i<nbe;i++){
     657                                        GeometricalEdge & ei = edges[i];   
     658                                        for(j=0;j<2;j++){
     659                                                if (!ei.Mark() && (level || ei[j].Required())) {
     660                                                        // warning ei.Mark() can be change in loop for(j=0;j<2;j++)
     661                                                        int k0=j,k1;
     662                                                        GeometricalEdge *e = & ei;
     663                                                        GeometricalVertex *a=(*e)(k0); // begin
     664                                                        if(curves){
     665                                                                curves[nbcurves].be=e;
     666                                                                curves[nbcurves].kb=k0;
     667                                                        }
     668                                                        int nee=0;
     669                                                        for(;;) {
     670                                                                nee++;
     671                                                                k1 = 1-k0; // next vertex of the edge
     672                                                                e->SetMark();
     673                                                                nbgem++;
     674                                                                e->CurveNumber=nbcurves;
     675                                                                if(curves) {
     676                                                                        curves[nbcurves].ee=e;
     677                                                                        curves[nbcurves].ke=k1;
     678                                                                }
     679
     680                                                                GeometricalVertex *b=(*e)(k1);
     681                                                                if (a == b ||  b->Required() ) break;
     682                                                                k0 = e->DirAdj[k1];//  vertex in next edge
     683                                                                e = e->Adj[k1]; // next edge
     684                                                        }
     685                                                        nbcurves++;
     686                                                        if(level) a->SetRequired();
     687                                                }
     688                                        }
     689                                }
     690                        }
    689691                        ISSMASSERT(nbgem && nbe);
    690692                        if(step==0){
Note: See TracChangeset for help on using the changeset viewer.