Changeset 5124
- Timestamp:
- 08/10/10 14:26:35 (15 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/modules/Bamgx/Bamgx.cpp
r5095 r5124 67 67 68 68 //Renumbering 69 Th. ReNumberingTheTriangleBySubDomain();69 Th.TrianglesRenumberBySubDomain(); 70 70 71 71 //Crack mesh if requested … … 177 177 178 178 //Renumber by subdomain 179 Th. ReNumberingTheTriangleBySubDomain();179 Th.TrianglesRenumberBySubDomain(); 180 180 181 181 //Smooth vertices -
issm/trunk/src/c/modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp
r5095 r5124 61 61 if (verbose) printf("Reading mesh\n"); 62 62 Mesh Th(index_data,x_data,y_data,nods_data,nels_data); 63 Th. ReMakeTriangleContainingTheVertex();63 Th.CreateSingleVertexToTriangleConnectivity(); 64 64 65 65 //Loop over output nodes … … 85 85 86 86 //Find triangle holding r/I 87 Triangle &tb=*Th. FindTriangleContaining(I,dete);87 Triangle &tb=*Th.TriangleFindFromCoord(I,dete); 88 88 89 89 // internal point -
issm/trunk/src/c/objects/Bamg/BamgVertex.cpp
r5120 r5124 48 48 I2 IBTh = BTh.toI2(PNew); 49 49 50 tstart=BTh. FindTriangleContaining(IBTh,deta,tstart);50 tstart=BTh.TriangleFindFromCoord(IBTh,deta,tstart); 51 51 52 52 if (tstart->det <0){ // outside -
issm/trunk/src/c/objects/Bamg/Edge.h
r5120 r5124 28 28 29 29 //Methods 30 void Re Numbering(BamgVertex *vb,BamgVertex *ve, long *renu){30 void Renumbering(BamgVertex *vb,BamgVertex *ve, long *renu){ 31 31 if (v[0] >=vb && v[0] <ve) v[0] = vb + renu[v[0]-vb]; 32 32 if (v[1] >=vb && v[1] <ve) v[1] = vb + renu[v[1]-vb]; -
issm/trunk/src/c/objects/Bamg/GeometricalVertex.cpp
r3913 r5124 16 16 /*FUNCTION GeometricalVertex::Corner {{{1*/ 17 17 int GeometricalVertex::Corner() const { 18 return cas& 4;18 return type & 4; 19 19 } 20 20 /*}}}*/ … … 22 22 int GeometricalVertex::Required()const { 23 23 // a corner is required 24 return cas& 6;24 return type & 6; 25 25 } 26 /*}}}*/27 /*FUNCTION GeometricalVertex::IsThe {{{1*/28 int GeometricalVertex::IsThe() const {29 return link == this;30 }31 26 /*}}}*/ 32 27 /*FUNCTION GeometricalVertex::SetCorner {{{1*/ 33 28 void GeometricalVertex::SetCorner(){ 34 cas|= 4;29 type |= 4; 35 30 } 36 31 /*}}}*/ 37 32 /*FUNCTION GeometricalVertex::SetRequired {{{1*/ 38 33 void GeometricalVertex::SetRequired(){ 39 cas|= 2;34 type |= 2; 40 35 } 41 36 /*}}}*/ 42 /*FUNCTION GeometricalVertex::Set {{{1*/43 void GeometricalVertex::Set(){44 cas=0;45 }46 /*}}}*/47 /*FUNCTION GeometricalVertex::The {{{1*/48 GeometricalVertex* GeometricalVertex::The(){49 // return a unique vertex50 ISSMASSERT(link);51 return link;52 }/*}}}*/53 37 54 38 } -
issm/trunk/src/c/objects/Bamg/GeometricalVertex.h
r5120 r5124 14 14 friend class Geometry; 15 15 16 int cas; 17 GeometricalVertex* link; // link all the same GeometricalVertex circular (Crack) 16 int type; 18 17 19 18 //Constructors 20 GeometricalVertex() :cas(0), link(this){};19 GeometricalVertex():type(0){}; 21 20 22 21 //Methods 23 22 int Corner() const; 24 23 int Required()const; 25 int IsThe() const;26 24 void SetCorner(); 27 25 void SetRequired(); 28 void Set();29 GeometricalVertex* The();30 26 31 //Inline methods32 inline void Set(const GeometricalVertex & rec,const Geometry & ,const Geometry & ){33 *this=rec;34 }35 27 }; 36 28 -
issm/trunk/src/c/objects/Bamg/Geometry.cpp
r5120 r5124 33 33 curves= NbOfCurves ? new Curve[NbOfCurves]:NULL; 34 34 subdomains = NbSubDomains ? new GeometricalSubDomain[NbSubDomains]:NULL; 35 for (i=0;i<nbv;i++)36 vertices[i].Set(Gh.vertices[i],Gh,*this);37 35 for (i=0;i<nbe;i++) 38 36 edges[i].Set(Gh.edges[i],Gh,*this); … … 89 87 vertices[i].DirOfSearch=NoDirOfSearch; 90 88 vertices[i].color =0; 91 vertices[i]. Set();89 vertices[i].type=0; 92 90 } 93 91 /*find domain extrema (pmin,pmax) that will define the square box used for by the quadtree*/ … … 424 422 425 423 k=0; 426 //link all vertices to themselves by default427 for (i=0;i<nbv;i++) vertices[i].link = vertices+i;428 424 429 425 //build quadtree for this geometry … … 443 439 //if there is a vertex found that is to close to vertices[i] -> error 444 440 if( v && Norme1(v->r - vertices[i]) < eps ){ 445 // mama's old trick to get j 446 GeometricalVertex* vg=(GeometricalVertex*) (void*)v; 447 j=vg-v0g; 448 //check that the clostest vertex is not itself... 449 if ( v != &(BamgVertex &) vertices[j]){ 450 ISSMERROR(" v != &(BamgVertex &) vertices[j]"); 451 } 452 vertices[i].link = vertices + j; 453 k++; 454 } 455 456 //The nearest vertex was non existent or far enough from vertices[i] 441 printf("WARNING: two points of the geometry are very closed to each other\n"); 442 } 443 457 444 //Add vertices[i] to the quadtree 458 elsequadtree.Add(vertices[i]);445 quadtree.Add(vertices[i]); 459 446 } 460 447 … … 463 450 printf("number of distinct vertices= %i, over %i\n",nbv - k,nbv); 464 451 printf("List of duplicate vertices:\n"); 465 for (i=0;i<nbv;i++){466 if (!vertices[i].IsThe()) printf(" %i and %i\n",i,Number(vertices[i].The()));467 }468 452 ISSMERROR("See above"); 469 453 } -
issm/trunk/src/c/objects/Bamg/ListofIntersectionTriangles.cpp
r5120 r5124 34 34 else {// not optimisation 35 35 init(); 36 t=tbegin = Bh. FindTriangleContaining(a,deta);36 t=tbegin = Bh.TriangleFindFromCoord(a,deta); 37 37 if( t->det>=0) 38 38 ilast=NewItem(t,double(deta[0])/t->det,double(deta[1])/t->det,double(deta[2])/t->det); -
issm/trunk/src/c/objects/Bamg/Mesh.cpp
r5120 r5124 1188 1188 tt[i2]->SetAdj2(i1,tt[i1],i2); 1189 1189 1190 tt[0]->Set TriangleContainingTheVertex();1191 tt[1]->Set TriangleContainingTheVertex();1192 tt[2]->Set TriangleContainingTheVertex();1190 tt[0]->SetSingleVertexToTriangleConnectivity(); 1191 tt[1]->SetSingleVertexToTriangleConnectivity(); 1192 tt[2]->SetSingleVertexToTriangleConnectivity(); 1193 1193 1194 1194 … … 2256 2256 2257 2257 //Now, find the triangles that hold a cracked edge 2258 ReMakeTriangleContainingTheVertex();2258 CreateSingleVertexToTriangleConnectivity(); 2259 2259 2260 2260 long* Edgeflags=new long[NbCrackedEdges]; … … 2537 2537 NbSubDomains =Gh.NbSubDomains; 2538 2538 long err=0; 2539 ReMakeTriangleContainingTheVertex();2539 CreateSingleVertexToTriangleConnectivity(); 2540 2540 long * mark = new long[nbt]; 2541 2541 Edge **GeometricalEdgetoEdge = MakeGeometricalEdgeToEdge(); … … 2623 2623 } 2624 2624 /*}}}1*/ 2625 /*FUNCTION Mesh::FindTriangleContaining{{{1*/2626 Triangle * Mesh::FindTriangleContaining(const I2 & B,Icoor2 dete[3], Triangle *tstart) const {2627 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/FindTriangleContening)*/2628 2629 Triangle * t=0;2630 int j,jp,jn,jj;2631 int counter;2632 2633 /*Get starting triangle. Take tsart if provided*/2634 if (tstart){2635 t=tstart;2636 }2637 /*Else find the closest Triangle using the quadtree*/2638 else {2639 2640 /*Check that the quadtree does exist*/2641 if (!quadtree) ISSMERROR("no starting triangle provided and no quadtree available");2642 2643 /*Call NearestVertex*/2644 BamgVertex *a = quadtree->NearestVertex(B.x,B.y) ;2645 2646 /*Check output (Vertex a)*/2647 if (!a) ISSMERROR("problem while trying to find nearest vertex from a given point. No output found");2648 if (!a->t) ISSMERROR("no triangle is associated to vertex number %i (another call to ReMakeTriangleContainingTheVertex is required)",Number(a)+1);2649 ISSMASSERT(a>=vertices && a<vertices+nbv);2650 2651 /*Get starting triangle*/2652 t = a->t;2653 ISSMASSERT(t>=triangles && t<triangles+nbt);2654 }2655 2656 Icoor2 detop ;2657 2658 /*initialize number of test triangle*/2659 counter=0;2660 2661 /*The initial triangle might be outside*/2662 while (t->det < 0){2663 2664 /*Get a real vertex from this triangle (k0)*/2665 int k0=(*t)(0)?(((*t)(1)?((*t)(2)?-1:2):1)):0;2666 ISSMASSERT(k0>=0);// k0 the NULL vertex2667 int k1=NextVertex[k0],k2=PreviousVertex[k0];2668 dete[k0]=det(B,(*t)[k1],(*t)[k2]);2669 dete[k1]=dete[k2]=-1;2670 if (dete[k0] > 0) // outside B2671 return t;2672 t = t->TriangleAdj(OppositeEdge[k0]);2673 counter++;2674 ISSMASSERT(counter<2);2675 }2676 2677 jj=0;2678 detop = det(*(*t)(VerticesOfTriangularEdge[jj][0]),*(*t)(VerticesOfTriangularEdge[jj][1]),B);2679 2680 while(t->det>0) {2681 2682 /*Increase counter*/2683 if (++counter>=10000) ISSMERROR("Maximum number of iteration reached (threshold = %i).",counter);2684 2685 j= OppositeVertex[jj];2686 dete[j] = detop; //det(*b,*s1,*s2);2687 jn = NextVertex[j];2688 jp = PreviousVertex[j];2689 dete[jp]= det(*(*t)(j),*(*t)(jn),B);2690 dete[jn] = t->det-dete[j] -dete[jp];2691 2692 // count the number k of dete <02693 int k=0,ii[3];2694 if (dete[0] < 0 ) ii[k++]=0;2695 if (dete[1] < 0 ) ii[k++]=1;2696 if (dete[2] < 0 ) ii[k++]=2;2697 // 0 => ok2698 // 1 => go in way 12699 // 2 => two way go in way 1 or 2 randomly2700 2701 if (k==0) break;2702 if (k == 2 && BinaryRand()) Exchange(ii[0],ii[1]);2703 if ( k>=3){2704 ISSMERROR("k>=3");2705 }2706 TriangleAdjacent t1 = t->Adj(jj=ii[0]);2707 if ((t1.det() < 0 ) && (k == 2))2708 t1 = t->Adj(jj=ii[1]);2709 t=t1;2710 j=t1;// for optimisation we now the -det[OppositeVertex[j]];2711 detop = -dete[OppositeVertex[jj]];2712 jj = j;2713 }2714 2715 if (t->det<0) // outside triangle2716 dete[0]=dete[1]=dete[2]=-1,dete[OppositeVertex[jj]]=detop;2717 // NbOfTriangleSearchFind += counter;2718 return t;2719 }2720 /*}}}1*/2721 2625 /*FUNCTION Mesh::Init{{{1*/ 2722 2626 void Mesh::Init(long maxnbv_in) { … … 2861 2765 triangles[1].det = -1; //boundary triangle: det = -1 2862 2766 2863 triangles[0].Set TriangleContainingTheVertex();2864 triangles[1].Set TriangleContainingTheVertex();2767 triangles[0].SetSingleVertexToTriangleConnectivity(); 2768 triangles[1].SetSingleVertexToTriangleConnectivity(); 2865 2769 2866 2770 triangles[0].link=&triangles[1]; … … 2884 2788 //Find the triangle in which newvertex is located 2885 2789 Icoor2 dete[3]; 2886 Triangle* tcvi = FindTriangleContaining(newvertex->i,dete); //(newvertex->i = integer coordinates)2790 Triangle* tcvi = TriangleFindFromCoord(newvertex->i,dete); //(newvertex->i = integer coordinates) 2887 2791 2888 2792 //Add newvertex to the quadtree … … 2918 2822 if(!NbSwap) break; 2919 2823 } 2920 ReMakeTriangleContainingTheVertex();2824 CreateSingleVertexToTriangleConnectivity(); 2921 2825 // because we break the TriangleContainingTheVertex 2922 2826 #endif … … 2975 2879 } 2976 2880 vj.ReferenceNumber=0; 2977 Triangle *tcvj= FindTriangleContaining(vj.i,dete);2881 Triangle *tcvj=TriangleFindFromCoord(vj.i,dete); 2978 2882 if (tcvj && !tcvj->link){ 2979 2883 tcvj->Echo(); … … 3155 3059 I2 a = toI2(A); 3156 3060 Icoor2 deta[3]; 3157 Triangle * t = FindTriangleContaining(a,deta);3061 Triangle * t =TriangleFindFromCoord(a,deta); 3158 3062 if (t->det <0) { // outside 3159 3063 double ba,bb; … … 3202 3106 } 3203 3107 } 3204 Bh. ReMakeTriangleContainingTheVertex();3108 Bh.CreateSingleVertexToTriangleConnectivity(); 3205 3109 InsertNewPoints(nbvold,NbTSwap) ; 3206 3110 } 3207 else Bh. ReMakeTriangleContainingTheVertex();3111 else Bh.CreateSingleVertexToTriangleConnectivity(); 3208 3112 3209 3113 // generation of the list of next Triangle … … 3370 3274 double abscisse = -1; 3371 3275 3372 for (int cas=0;cas<2;cas++){3276 for (int step=0;step<2;step++){ 3373 3277 // 2 times algo: 3374 3278 // 1 for computing the length l … … 3385 3289 3386 3290 kkk=kkk+1; 3387 if (kkk>=100){ 3388 ISSMERROR("kkk>=100"); 3389 } 3390 if (!eee){ 3391 ISSMERROR("!eee"); 3392 } 3291 ISSMASSERT(kkk<100); 3292 ISSMASSERT(eee); 3393 3293 double lg0 = lg; 3394 3294 double dp = LengthInterpole(v0->m,v1->m,(R2) *v1 - (R2) *v0); 3395 3295 lg += dp; 3396 if ( cas&& abscisse <= lg) { // ok we find the geom edge3296 if (step && abscisse <= lg) { // ok we find the geom edge 3397 3297 double sss = (abscisse-lg0)/dp; 3398 3298 double thetab = te0*(1-sss)+ sss*iii; 3399 if (thetab<0 || thetab>1){ 3400 ISSMERROR("thetab<0 || thetab>1"); 3401 } 3299 ISSMASSERT(thetab>=0 && thetab<=1); 3402 3300 BR = VertexOnEdge(&R,eee,thetab); 3403 3301 return Gh.ProjectOnCurve(*eee,thetab,R,GR); … … 3410 3308 3411 3309 double lg0 = lg; 3412 if (!eee){ 3413 ISSMERROR("!eee"); 3414 } 3310 ISSMASSERT(eee); 3415 3311 v1 = pvB; 3416 3312 double dp = LengthInterpole(v0->m,v1->m,(R2) *v1 - (R2) *v0); … … 3421 3317 double sss = (abscisse-lg0)/dp; 3422 3318 double thetab = te0*(1-sss)+ sss*tB; 3423 if (thetab<0 || thetab>1){ 3424 ISSMERROR("thetab<0 || thetab>1"); 3425 } 3319 ISSMASSERT(thetab>=0 && thetab<=1); 3426 3320 BR = VertexOnEdge(&R,eee,thetab); 3427 3321 return Gh.ProjectOnCurve(*eee,thetab,R,GR); … … 3594 3488 triangles[1].det = -1; // boundary triangles 3595 3489 3596 triangles[0].Set TriangleContainingTheVertex();3597 triangles[1].Set TriangleContainingTheVertex();3490 triangles[0].SetSingleVertexToTriangleConnectivity(); 3491 triangles[1].SetSingleVertexToTriangleConnectivity(); 3598 3492 3599 3493 triangles[0].link=&triangles[1]; … … 3610 3504 BamgVertex *vi = ordre[icount]; 3611 3505 Icoor2 dete[3]; 3612 Triangle *tcvi = FindTriangleContaining(vi->i,dete);3506 Triangle *tcvi = TriangleFindFromCoord(vi->i,dete); 3613 3507 quadtree->Add(*vi); 3614 3508 AddVertex(*vi,tcvi,dete); … … 3742 3636 } 3743 3637 /*}}}1*/ 3744 /*FUNCTION Mesh:: ReNumberingTheTriangleBySubDomain{{{1*/3745 void Mesh:: ReNumberingTheTriangleBySubDomain(bool justcompress){3638 /*FUNCTION Mesh::TrianglesRenumberBySubDomain{{{1*/ 3639 void Mesh::TrianglesRenumberBySubDomain(bool justcompress){ 3746 3640 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ReNumberingTheTriangleBySubDomain)*/ 3747 3641 … … 3786 3680 // do the change on all the pointeur 3787 3681 for ( it=0;it<nbt;it++) 3788 triangles[it].Re Numbering(triangles,te,renu);3682 triangles[it].Renumbering(triangles,te,renu); 3789 3683 3790 3684 for ( i=0;i<NbSubDomains;i++) … … 3812 3706 } 3813 3707 /*}}}1*/ 3814 /*FUNCTION Mesh:: ReNumberingVertex{{{1*/3815 void Mesh:: ReNumberingVertex(long * renu) {3708 /*FUNCTION Mesh::VerticesRenumber{{{1*/ 3709 void Mesh::VerticesRenumber(long * renu) { 3816 3710 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ReNumberingVertex)*/ 3817 3711 … … 3824 3718 printf("renumbering triangles\n"); 3825 3719 for ( it=0;it<nbt;it++) 3826 triangles[it].Re Numbering(vertices,ve,renu);3720 triangles[it].Renumbering(vertices,ve,renu); 3827 3721 3828 3722 printf("renumbering edges\n"); 3829 3723 for ( ie=0;ie<nbe;ie++) 3830 edges[ie].Re Numbering(vertices,ve,renu);3724 edges[ie].Renumbering(vertices,ve,renu); 3831 3725 3832 3726 printf("renumbering vertices on geom\n"); … … 4067 3961 if (quadtree) delete quadtree; 4068 3962 quadtree=0; 4069 ReMakeTriangleContainingTheVertex();3963 CreateSingleVertexToTriangleConnectivity(); 4070 3964 Triangle vide; // a triangle to mark the boundary vertex 4071 3965 Triangle ** tstart= new Triangle* [nbv]; … … 4109 4003 if(raisonmax<1.1) return; 4110 4004 if(verbose > 1) printf(" Mesh::SmoothMetric raisonmax = %g\n",raisonmax); 4111 ReMakeTriangleContainingTheVertex();4005 CreateSingleVertexToTriangleConnectivity(); 4112 4006 long i,j,kch,kk,ip; 4113 4007 long *first_np_or_next_t0 = new long[nbv]; … … 4188 4082 const int withBackground = &BTh != this && &BTh; 4189 4083 4190 ReNumberingTheTriangleBySubDomain();4084 TrianglesRenumberBySubDomain(); 4191 4085 //int nswap =0; 4192 4086 const long nfortria( choice ? 4 : 6); … … 4638 4532 SetIntCoor("In SplitElement"); 4639 4533 4640 ReMakeTriangleContainingTheVertex();4534 CreateSingleVertexToTriangleConnectivity(); 4641 4535 if(withBackground) 4642 BTh. ReMakeTriangleContainingTheVertex();4536 BTh.CreateSingleVertexToTriangleConnectivity(); 4643 4537 4644 4538 delete [] edges; … … 4662 4556 NbVerticesOnGeomEdge = newNbVerticesOnGeomEdge; 4663 4557 NbVertexOnBThEdge=newNbVertexOnBThEdge; 4664 // ReMakeTriangleContainingTheVertex();4558 // CreateSingleVertexToTriangleConnectivity(); 4665 4559 4666 4560 ReconstructExistingMesh(); … … 4721 4615 } 4722 4616 } 4723 ReMakeTriangleContainingTheVertex();4617 CreateSingleVertexToTriangleConnectivity(); 4724 4618 if (nbvold!=nbv){ 4725 4619 long iv = nbvold; … … 4734 4628 vi.ReferenceNumber=0; 4735 4629 vi.DirOfSearch =NoDirOfSearch; 4736 Triangle *tcvi = FindTriangleContaining(vi.i,dete);4630 Triangle *tcvi = TriangleFindFromCoord(vi.i,dete); 4737 4631 if (tcvi && !tcvi->link) { 4738 4632 printf("problem inserting point in SplitInternalEdgeWithBorderVertices (tcvj && !tcvj->link)\n"); … … 4758 4652 4759 4653 return NbSplitEdge; 4654 } 4655 /*}}}1*/ 4656 /*FUNCTION Mesh::TriangleFindFromCoord{{{1*/ 4657 Triangle * Mesh::TriangleFindFromCoord(const I2 & B,Icoor2 dete[3], Triangle *tstart) const { 4658 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/FindTriangleContening)*/ 4659 4660 Triangle * t=0; 4661 int j,jp,jn,jj; 4662 int counter; 4663 4664 /*Get starting triangle. Take tsart if provided*/ 4665 if (tstart) t=tstart; 4666 4667 /*Else find the closest Triangle using the quadtree*/ 4668 else { 4669 4670 /*Check that the quadtree does exist*/ 4671 if (!quadtree) ISSMERROR("no starting triangle provided and no quadtree available"); 4672 4673 /*Call NearestVertex*/ 4674 BamgVertex *a = quadtree->NearestVertex(B.x,B.y) ; 4675 4676 /*Check output (Vertex a)*/ 4677 if (!a) ISSMERROR("problem while trying to find nearest vertex from a given point. No output found"); 4678 if (!a->t) ISSMERROR("no triangle is associated to vertex number %i (orphan?)",Number(a)+1); 4679 ISSMASSERT(a>=vertices && a<vertices+nbv); 4680 4681 /*Get starting triangle*/ 4682 t = a->t; 4683 ISSMASSERT(t>=triangles && t<triangles+nbt); 4684 } 4685 4686 Icoor2 detop ; 4687 4688 /*initialize number of test triangle*/ 4689 counter=0; 4690 4691 /*The initial triangle might be outside*/ 4692 while (t->det < 0){ 4693 4694 /*Get a real vertex from this triangle (k0)*/ 4695 int k0=(*t)(0)?(((*t)(1)?((*t)(2)?-1:2):1)):0; 4696 ISSMASSERT(k0>=0);// k0 the NULL vertex 4697 int k1=NextVertex[k0],k2=PreviousVertex[k0]; 4698 dete[k0]=det(B,(*t)[k1],(*t)[k2]); 4699 dete[k1]=dete[k2]=-1; 4700 if (dete[k0] > 0) // outside B 4701 return t; 4702 t = t->TriangleAdj(OppositeEdge[k0]); 4703 counter++; 4704 ISSMASSERT(counter<2); 4705 } 4706 4707 jj=0; 4708 detop = det(*(*t)(VerticesOfTriangularEdge[jj][0]),*(*t)(VerticesOfTriangularEdge[jj][1]),B); 4709 4710 while(t->det>0) { 4711 4712 /*Increase counter*/ 4713 if (++counter>=10000) ISSMERROR("Maximum number of iteration reached (threshold = %i).",counter); 4714 4715 j= OppositeVertex[jj]; 4716 dete[j] = detop; //det(*b,*s1,*s2); 4717 jn = NextVertex[j]; 4718 jp = PreviousVertex[j]; 4719 dete[jp]= det(*(*t)(j),*(*t)(jn),B); 4720 dete[jn] = t->det-dete[j] -dete[jp]; 4721 4722 // count the number k of dete <0 4723 int k=0,ii[3]; 4724 if (dete[0] < 0 ) ii[k++]=0; 4725 if (dete[1] < 0 ) ii[k++]=1; 4726 if (dete[2] < 0 ) ii[k++]=2; 4727 // 0 => ok 4728 // 1 => go in way 1 4729 // 2 => two way go in way 1 or 2 randomly 4730 4731 if (k==0) break; 4732 if (k == 2 && BinaryRand()) Exchange(ii[0],ii[1]); 4733 if ( k>=3){ 4734 ISSMERROR("k>=3"); 4735 } 4736 TriangleAdjacent t1 = t->Adj(jj=ii[0]); 4737 if ((t1.det() < 0 ) && (k == 2)) 4738 t1 = t->Adj(jj=ii[1]); 4739 t=t1; 4740 j=t1;// for optimisation we now the -det[OppositeVertex[j]]; 4741 detop = -dete[OppositeVertex[jj]]; 4742 jj = j; 4743 } 4744 4745 if (t->det<0) // outside triangle 4746 dete[0]=dete[1]=dete[2]=-1,dete[OppositeVertex[jj]]=detop; 4747 // NbOfTriangleSearchFind += counter; 4748 return t; 4749 } 4750 /*}}}1*/ 4751 /*FUNCTION Mesh::TriangleIntNumbering{{{1*/ 4752 void Mesh::TriangleIntNumbering(long* renumbering){ 4753 4754 long num=0; 4755 for (int i=0;i<nbt;i++){ 4756 if (triangles[i].det>0) renumbering[i]=num++; 4757 else renumbering[i]=-1; 4758 } 4759 return; 4760 } 4761 /*}}}1*/ 4762 /*FUNCTION Mesh::TriangleReferenceList{{{1*/ 4763 long Mesh::TriangleReferenceList(long* reft) const { 4764 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ConsRefTriangle)*/ 4765 4766 long int verbose=0; 4767 register Triangle *t0,*t; 4768 register long k=0, num; 4769 4770 //initialize all triangles as -1 (outside) 4771 for (int it=0;it<nbt;it++) reft[it]=-1; 4772 4773 //loop over all subdomains 4774 for (int i=0;i<NbSubDomains;i++){ 4775 4776 //first triangle of the subdomain i 4777 t=t0=subdomains[i].head; 4778 4779 //check that the subdomain is not empty 4780 if (!t0){ ISSMERROR("At least one subdomain is empty");} 4781 4782 //loop 4783 do{ 4784 k++; 4785 4786 //get current triangle number 4787 num = Number(t); 4788 4789 //check that num is in [0 nbt[ 4790 if (num<0 || num>=nbt){ ISSMERROR("num<0 || num>=nbt");} 4791 4792 //reft of this triangle is the subdomain number 4793 reft[num]=i; 4794 4795 } while (t0 != (t=t->link)); 4796 //stop when all triangles of subdomains have been tagged 4797 4798 } 4799 return k; 4760 4800 } 4761 4801 /*}}}1*/ … … 4793 4833 //Compute number of vertices on geometrical vertex 4794 4834 for (i=0;i<Gh.nbv;i++){ 4795 if (Gh[i].Required() && Gh[i].IsThe()) NbVerticesOnGeomVertex++;4835 if (Gh[i].Required()) NbVerticesOnGeomVertex++; 4796 4836 } 4797 4837 … … 4805 4845 nbv=0; 4806 4846 for (i=0;i<Gh.nbv;i++){ 4807 /* Add vertex only if required and not duplicate 4808 * (IsThe is a method of GeometricalVertex that checks 4809 * that we are taking into acount only one vertex is 4810 * 2 vertices are superimposed) */ 4811 if (Gh[i].Required() && Gh[i].IsThe()) {//Gh vertices Required 4847 /* Add vertex only if required*/ 4848 if (Gh[i].Required()) {//Gh vertices Required 4812 4849 4813 4850 //Add the vertex (provided that nbv<maxnbv) … … 4873 4910 else{ 4874 4911 e=&ei; 4875 a=ei(0) ->The();4876 b=ei(1) ->The();4912 a=ei(0); 4913 b=ei(1); 4877 4914 4878 4915 //check that edges has been allocated … … 4906 4943 k=j; // k = vertex number in edge (0 or 1) 4907 4944 e=&ei; // e = reference of current edge 4908 a=ei(k) ->The();// a = pointer toward the kth vertex of the current edge4945 a=ei(k); // a = pointer toward the kth vertex of the current edge 4909 4946 va = a->to; // va = pointer toward vertex associated 4910 4947 e->SetMark(); // Mark edge … … 4914 4951 for(;;){ 4915 4952 k = 1-k; 4916 b = (*e)(k) ->The();// b = pointer toward the other vertex of the current edge4953 b = (*e)(k);// b = pointer toward the other vertex of the current edge 4917 4954 AB= b->r - a->r; // AB = vector of the current edge 4918 4955 Metric MA = background ? BTh.MetricAt(a->r) :a->m ; //Get metric associated to A … … 5403 5440 } 5404 5441 /*}}}1*/ 5405 /*FUNCTION Mesh::TriangleReferenceList{{{1*/5406 long Mesh::TriangleReferenceList(long* reft) const {5407 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ConsRefTriangle)*/5408 5409 long int verbose=0;5410 register Triangle *t0,*t;5411 register long k=0, num;5412 5413 //initialize all triangles as -1 (outside)5414 for (int it=0;it<nbt;it++) reft[it]=-1;5415 5416 //loop over all subdomains5417 for (int i=0;i<NbSubDomains;i++){5418 5419 //first triangle of the subdomain i5420 t=t0=subdomains[i].head;5421 5422 //check that the subdomain is not empty5423 if (!t0){ ISSMERROR("At least one subdomain is empty");}5424 5425 //loop5426 do{5427 k++;5428 5429 //get current triangle number5430 num = Number(t);5431 5432 //check that num is in [0 nbt[5433 if (num<0 || num>=nbt){ ISSMERROR("num<0 || num>=nbt");}5434 5435 //reft of this triangle is the subdomain number5436 reft[num]=i;5437 5438 } while (t0 != (t=t->link));5439 //stop when all triangles of subdomains have been tagged5440 5441 }5442 return k;5443 }5444 /*}}}1*/5445 /*FUNCTION Mesh::TriangleIntNumbering{{{1*/5446 void Mesh::TriangleIntNumbering(long* renumbering){5447 5448 long num=0;5449 for (int i=0;i<nbt;i++){5450 if (triangles[i].det>0) renumbering[i]=num++;5451 else renumbering[i]=-1;5452 }5453 return;5454 }5455 /*}}}1*/5456 5442 5457 5443 /*Intermediary*/ … … 5762 5748 t2->det = det2; 5763 5749 5764 t1->Set TriangleContainingTheVertex();5765 t2->Set TriangleContainingTheVertex();5750 t1->SetSingleVertexToTriangleConnectivity(); 5751 t2->SetSingleVertexToTriangleConnectivity(); 5766 5752 } // end swap 5767 5753 /*}}}1*/ -
issm/trunk/src/c/objects/Bamg/Mesh.h
r5120 r5124 107 107 void NewPoints(Mesh &,BamgOpts* bamgopts,int KeepVertices=1); 108 108 long InsertNewPoints(long nbvold,long & NbTSwap) ; 109 void ReNumberingTheTriangleBySubDomain(bool justcompress=false);110 void ReNumberingVertex(long * renu);109 void TrianglesRenumberBySubDomain(bool justcompress=false); 110 void VerticesRenumber(long * renu); 111 111 void SmoothingVertex(int =3,double=0.3); 112 112 Metric MetricAt (const R2 &) const; … … 120 120 long Number2(const Triangle * t) const { return t - triangles; } 121 121 BamgVertex* NearestVertex(Icoor1 i,Icoor1 j) ; 122 Triangle* FindTriangleContaining(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;122 Triangle* TriangleFindFromCoord(const I2 & ,Icoor2 [3],Triangle *tstart=0) const; 123 123 void ReadMesh(double* index,double* x,double* y,int nods,int nels); 124 124 void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts); … … 135 135 136 136 //Inline methods 137 inline void ReMakeTriangleContainingTheVertex(){137 inline void CreateSingleVertexToTriangleConnectivity(){ 138 138 for (int i=0;i<nbv;i++) vertices[i].vint=0, vertices[i].t=NULL; 139 for (int i=0;i<nbt;i++) triangles[i].Set TriangleContainingTheVertex();139 for (int i=0;i<nbt;i++) triangles[i].SetSingleVertexToTriangleConnectivity(); 140 140 } 141 141 inline void UnMarkUnSwapTriangle(){ -
issm/trunk/src/c/objects/Bamg/Metric.h
r3913 r5124 13 13 class Metric; 14 14 class MatVVP2x2; 15 16 15 17 16 class Metric{ -
issm/trunk/src/c/objects/Bamg/R2.h
r5120 r5124 7 7 namespace bamg { 8 8 9 template <class R,class RR> class P2 9 template <class R,class RR> class P2{ 10 10 11 11 public: … … 37 37 }; 38 38 39 template <class R,class RR> class P2xP2 39 template <class R,class RR> class P2xP2{ 40 40 41 41 private: -
issm/trunk/src/c/objects/Bamg/Triangle.h
r5120 r5124 53 53 Triangle* TriangleAdj(int i) const {return TriaAdjTriangles[i&3];} 54 54 Triangle* Quadrangle(BamgVertex * & v0,BamgVertex * & v1,BamgVertex * & v2,BamgVertex * & v3) const ; 55 void Re Numbering(Triangle *tb,Triangle *te, long *renu){55 void Renumbering(Triangle *tb,Triangle *te, long *renu){ 56 56 if (link >=tb && link <te) link = tb + renu[link -tb]; 57 57 if (TriaAdjTriangles[0] >=tb && TriaAdjTriangles[0] <te) TriaAdjTriangles[0] = tb + renu[TriaAdjTriangles[0]-tb]; … … 59 59 if (TriaAdjTriangles[2] >=tb && TriaAdjTriangles[2] <te) TriaAdjTriangles[2] = tb + renu[TriaAdjTriangles[2]-tb]; 60 60 } 61 void Re Numbering(BamgVertex *vb,BamgVertex *ve, long *renu){61 void Renumbering(BamgVertex *vb,BamgVertex *ve, long *renu){ 62 62 if (TriaVertices[0] >=vb && TriaVertices[0] <ve) TriaVertices[0] = vb + renu[TriaVertices[0]-vb]; 63 63 if (TriaVertices[1] >=vb && TriaVertices[1] <ve) TriaVertices[1] = vb + renu[TriaVertices[1]-vb]; … … 81 81 } 82 82 } 83 void Set TriangleContainingTheVertex() {83 void SetSingleVertexToTriangleConnectivity() { 84 84 if (TriaVertices[0]) (TriaVertices[0]->t=this,TriaVertices[0]->vint=0); 85 85 if (TriaVertices[1]) (TriaVertices[1]->t=this,TriaVertices[1]->vint=1); -
issm/trunk/src/c/objects/Bamg/typedefs.h
r5120 r5124 16 16 /*I2 and R2*/ 17 17 typedef P2<Icoor1,Icoor2> I2; 18 typedef P2xP2<short,long> I2xI2;19 18 typedef P2<double,double> R2; 20 typedef P2<double,double> R2xR2;21 19 } 22 20
Note:
See TracChangeset
for help on using the changeset viewer.