Changeset 5130
- Timestamp:
- 08/10/10 15:08:05 (15 years ago)
- Location:
- issm/trunk/src/c/objects/Bamg
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/objects/Bamg/BamgVertex.h
r5120 r5130 19 19 public: 20 20 21 /*Fields*/ 21 22 I2 i; // integer coordinates 22 23 R2 r; // real coordinates … … 35 36 }; 36 37 37 / /Operators38 /*Operators*/ 38 39 operator I2() const {return i;} // Cast operator 39 40 operator const R2 & () const {return r;} // Cast operator … … 41 42 double operator()(R2 x) const { return m(x);} // Get x in the metric m 42 43 43 / /methods (No constructor and no destructors...)44 /*methods (No constructor and no destructors...)*/ 44 45 double Smoothing(Mesh & ,const Mesh & ,Triangle * & ,double =1); 45 46 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); -
issm/trunk/src/c/objects/Bamg/Curve.cpp
r3913 r5130 10 10 11 11 /*Constructors/Destructors*/ 12 /*FUNCTION Curve::Curve(){{{1*/ 13 Curve::Curve():be(0),ee(0),kb(0),ke(0),next(0),master(true){ 14 15 } 16 /*}}}*/ 12 17 13 18 /*Methods*/ 19 /*FUNCTION Curve::Reverse {{{1*/ 20 void Curve::Reverse() { 21 /*reverse the direction of the curve */ 22 Exchange(be,ee); 23 Exchange(kb,ke); 24 } 25 /*}}}*/ 14 26 /*FUNCTION Curve::Set {{{1*/ 15 27 void Curve::Set(const Curve & rec,const Geometry & Gh ,Geometry & GhNew){ -
issm/trunk/src/c/objects/Bamg/Curve.h
r4997 r5130 19 19 20 20 //Methods 21 Curve() : be(0),ee(0),kb(0),ke(0),next(0),master(true) {}22 void Reverse( ) { Exchange(be,ee); Exchange(kb,ke);} // revese the sens of the curse21 Curve(); 22 void Reverse(void); 23 23 void Set(const Curve & rec,const Geometry & Th ,Geometry & ThNew); 24 24 }; -
issm/trunk/src/c/objects/Bamg/Direction.cpp
r3913 r5130 9 9 10 10 /*Constructors/Destructors*/ 11 /*FUNCTION Direction() {{{1*/ 12 Direction::Direction(): 13 dir(MaxICoor){ 14 15 }/*}}}*/ 11 16 /*FUNCTION Direction(Icoor1 i,Icoor1 j) {{{1*/ 12 17 Direction::Direction(Icoor1 i,Icoor1 j) { -
issm/trunk/src/c/objects/Bamg/Direction.h
r3913 r5130 13 13 public: 14 14 //Methods 15 Direction() : dir(MaxICoor){}; // no direction set15 Direction(); 16 16 Direction(Icoor1 i,Icoor1 j); 17 17 int sens(Icoor1 i,Icoor1 j); -
issm/trunk/src/c/objects/Bamg/Edge.cpp
r5095 r5130 33 33 } 34 34 /*}}}*/ 35 /*FUNCTION Edge::Renumbering{{{1*/ 36 void Edge::Renumbering(BamgVertex *vb,BamgVertex *ve, long *renu){ 37 38 if (v[0] >=vb && v[0] <ve) v[0] = vb + renu[v[0]-vb]; 39 if (v[1] >=vb && v[1] <ve) v[1] = vb + renu[v[1]-vb]; 40 41 } 42 /*}}}*/ 43 /*FUNCTION Edge::Intersection{{{1*/ 44 int Edge::Intersection(const Edge & e){ 45 46 /*some shecks*/ 47 if (!(adj[0]==&e || adj[1]==&e)){ ISSMERROR("Intersection bug"); } 48 ISSMASSERT(adj[0]==&e || adj[1]==&e); 49 50 return adj[0]==&e?0:1; 51 } 52 /*}}}*/ 35 53 36 54 } -
issm/trunk/src/c/objects/Bamg/Edge.h
r5124 r5130 28 28 29 29 //Methods 30 void Renumbering(BamgVertex *vb,BamgVertex *ve, long *renu){ 31 if (v[0] >=vb && v[0] <ve) v[0] = vb + renu[v[0]-vb]; 32 if (v[1] >=vb && v[1] <ve) v[1] = vb + renu[v[1]-vb]; 33 } 34 int Intersection(const Edge & e) const { 35 if (!(adj[0]==&e || adj[1]==&e)){ 36 ISSMERROR("Intersection bug"); 37 } 38 if (adj[0]!=&e && adj[1]!=&e){ 39 ISSMERROR("adj[0]!=&e && adj[1]!=&e"); 40 } 41 return adj[0]==&e ? 0 : 1; 42 } 30 void Renumbering(BamgVertex *vb,BamgVertex *ve, long *renu); 31 int Intersection(const Edge & e); 43 32 void Set(const Mesh &,long,Mesh &); 44 33 void Echo(void); -
issm/trunk/src/c/objects/Bamg/GeometricalEdge.h
r3913 r5130 30 30 double R1tg(double theta,R2 &t) const ; // 1/radius of curvature + tangente 31 31 int Tg(int i) const{return i==0 ? TgA() : TgB();} 32 int Cracked() const {return flag & 1;}33 int TgA()const {return flag & 4;}34 int TgB()const {return flag & 8;}35 int Mark()const {return flag & 16;}36 int Required() {return flag & 64;}37 void SetCracked() { flag |= 1; 38 void SetTgA() { flag |=4; 39 void SetTgB() { flag |=8; 40 void SetMark() { flag |=16; 32 int Cracked() const{return flag & 1;} 33 int TgA()const{return flag & 4; } 34 int TgB()const {return flag & 8;} 35 int Mark()const {return flag & 16;} 36 int Required() {return flag & 64;} 37 void SetCracked() { flag |= 1;} 38 void SetTgA() { flag |=4; } 39 void SetTgB() { flag |=8; } 40 void SetMark() { flag |=16;} 41 41 void SetUnMark() { flag &= 1007 /* 1023-16*/;} 42 42 void SetRequired() { flag |= 64; } -
issm/trunk/src/c/objects/Bamg/Geometry.cpp
r5124 r5130 13 13 14 14 /*Constructors/Destructors*/ 15 /*FUNCTION Geometry::Geometry(){{{1*/ 15 16 Geometry::Geometry(){ 16 17 Init(); 17 18 } 19 /*}}}*/ 20 /*FUNCTION Geometry::Geometry(BamgGeom* bamggeom, BamgOpts* bamgopts){{{1*/ 18 21 Geometry::Geometry(BamgGeom* bamggeom, BamgOpts* bamgopts){ 19 22 Init(); … … 21 24 AfterRead(); 22 25 } 23 /*FUNCTION Geometry::Geometry(const Geometry & Gh) (COPY operator){{{1*/ 26 /*}}}*/ 27 /*FUNCTION Geometry::Geometry(const Geometry & Gh) (COPY operator){{{1*/ 24 28 Geometry::Geometry(const Geometry & Gh) { 25 29 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, MeshGeom.cpp/Geometry)*/ … … 405 409 406 410 /*Methods*/ 407 /*FUNCTION 411 /*FUNCTION Geometry::AfterRead(){{{1*/ 408 412 void Geometry::AfterRead(){ 409 413 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, MeshGeom.cpp/AfterRead)*/ … … 719 723 } 720 724 /*}}}1*/ 721 /*FUNCTION 725 /*FUNCTION Geometry::Containing{{{1*/ 722 726 GeometricalEdge* Geometry::Containing(const R2 P, GeometricalEdge * start) const { 723 727 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, MeshGeom.cpp/Contening)*/ … … 745 749 } 746 750 /*}}}1*/ 747 /*FUNCTION 751 /*FUNCTION Geometry::Echo {{{1*/ 748 752 749 753 void Geometry::Echo(void){ … … 768 772 } 769 773 /*}}}*/ 770 /*FUNCTION 774 /*FUNCTION Geometry::Init{{{1*/ 771 775 void Geometry::Init(void){ 772 776 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, MeshGeom.cpp/EmptyGeometry)*/ … … 786 790 } 787 791 /*}}}1*/ 788 /*FUNCTION Geometry::ProjectOnCurve {{{1*/ 792 /*FUNCTION Geometry::MinimalHmin{{{1*/ 793 double Geometry::MinimalHmin() { 794 return 2.0/coefIcoor; 795 }/*}}}*/ 796 /*FUNCTION Geometry::MaximalHmax{{{1*/ 797 double Geometry::MaximalHmax() { 798 return Max(pmax.x-pmin.x,pmax.y-pmin.y); 799 }/*}}}*/ 800 /*FUNCTION Geometry::Number(const GeometricalVertex &t){{{1*/ 801 long Geometry::Number(const GeometricalVertex & t) const { 802 return &t - vertices; 803 }/*}}}*/ 804 /*FUNCTION Geometry::Number(const GeometricalVertex * t){{{1*/ 805 long Geometry::Number(const GeometricalVertex * t) const { 806 return t - vertices; 807 }/*}}}*/ 808 /*FUNCTION Geometry::Number(const GeometricalEdge & t){{{1*/ 809 long Geometry::Number(const GeometricalEdge & t) const { 810 return &t - edges; 811 }/*}}}*/ 812 /*FUNCTION Geometry::Number(const GeometricalEdge * t){{{1*/ 813 long Geometry::Number(const GeometricalEdge * t) const { 814 return t - edges; 815 }/*}}}*/ 816 /*FUNCTION Geometry::Number(const Curve * c){{{1*/ 817 long Geometry::Number(const Curve * c) const { 818 return c - curves; 819 }/*}}}*/ 820 /*FUNCTION Geometry::ProjectOnCurve {{{1*/ 789 821 GeometricalEdge* Geometry::ProjectOnCurve(const Edge &e,double s,BamgVertex &V,VertexOnGeom &GV) const { 790 822 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, MeshGeom.cpp/ProjectOnCurve)*/ … … 844 876 printf("To solve the problem do a coarsening of the geometrical mesh or change the constant value of mxe (dangerous)\n"); 845 877 ISSMERROR("see above"); 846 878 } 847 879 NbTry++; 848 880 goto retry; … … 920 952 } 921 953 /*}}}1*/ 922 954 /*FUNCTION Geometry::toI2{{{1*/ 955 I2 Geometry::toI2(const R2 & P) const { 956 return I2( (Icoor1) (coefIcoor*(P.x-pmin.x)) 957 ,(Icoor1) (coefIcoor*(P.y-pmin.y)) ); 958 }/*}}}*/ 959 /*FUNCTION Geometry::UnMarkEdges{{{1*/ 960 void Geometry::UnMarkEdges() { 961 for (int i=0;i<nbe;i++) edges[i].SetUnMark(); 962 }/*}}}*/ 923 963 } -
issm/trunk/src/c/objects/Bamg/Geometry.h
r5120 r5130 42 42 43 43 //Operators 44 const GeometricalVertex & operator[] (long i) const { return vertices[i];};45 GeometricalVertex & operator[](long i) { return vertices[i];};46 const GeometricalEdge & operator() (long i) const { return edges[i];};47 GeometricalEdge & operator()(long i) { return edges[i];};44 const GeometricalVertex &operator[](long i) const { return vertices[i]; }; 45 GeometricalVertex &operator[](long i) { return vertices[i]; }; 46 const GeometricalEdge &operator()(long i) const { return edges[i]; }; 47 GeometricalEdge &operator()(long i) { return edges[i]; }; 48 48 49 49 //Methods 50 void Echo(); 51 I2 toI2(const R2 & P) const { 52 return I2( (Icoor1) (coefIcoor*(P.x-pmin.x)) 53 ,(Icoor1) (coefIcoor*(P.y-pmin.y)) ); 54 } 55 double MinimalHmin() {return 2.0/coefIcoor;} 56 double MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);} 57 void ReadGeometry(BamgGeom* bamggeom, BamgOpts* bamgopts); 58 void Init(void); 59 void AfterRead(); 60 long Number(const GeometricalVertex & t) const { return &t - vertices;} 61 long Number(const GeometricalVertex * t) const { return t - vertices;} 62 long Number(const GeometricalEdge & t) const { return &t - edges;} 63 long Number(const GeometricalEdge * t) const { return t - edges;} 64 long Number(const Curve * c) const { return c - curves;} 65 void UnMarkEdges() {for (int i=0;i<nbe;i++) edges[i].SetUnMark();} 66 GeometricalEdge * ProjectOnCurve(const Edge & ,double,BamgVertex &,VertexOnGeom &) const ; 67 GeometricalEdge * Containing(const R2 P, GeometricalEdge * start) const; 68 void WriteGeometry(BamgGeom* bamggeom, BamgOpts* bamgopts); 50 void Echo(); 51 I2 toI2(const R2 &P) const; 52 double MinimalHmin(); 53 double MaximalHmax(); 54 void ReadGeometry(BamgGeom *bamggeom, BamgOpts*bamgopts); 55 void Init(void); 56 void AfterRead(); 57 long Number(const GeometricalVertex &t) const; 58 long Number(const GeometricalVertex *t) const; 59 long Number(const GeometricalEdge &t) const; 60 long Number(const GeometricalEdge *t) const; 61 long Number(const Curve *c) const; 62 void UnMarkEdges(); 63 GeometricalEdge *ProjectOnCurve(const Edge &,double,BamgVertex &,VertexOnGeom &) const; 64 GeometricalEdge *Containing(const R2 P, GeometricalEdge *start) const; 65 void WriteGeometry(BamgGeom *bamggeom, BamgOpts*bamgopts); 69 66 }; 70 67 -
issm/trunk/src/c/objects/Bamg/ListofIntersectionTriangles.cpp
r5124 r5130 8 8 namespace bamg { 9 9 10 /*Constructors Destructors*/ 11 /*FUNCTION ListofIntersectionTriangles::ListofIntersectionTriangles{{{1*/ 12 ListofIntersectionTriangles::ListofIntersectionTriangles(int n,int m) 13 : MaxSize(n), Size(0), len(-1),state(-1),lIntTria(new IntersectionTriangles[n]) , 14 NbSeg(0), MaxNbSeg(m), lSegsI(new SegInterpolation[m]){ 15 } 16 /*}}}*/ 17 /*FUNCTION ListofIntersectionTriangles::~ListofIntersectionTriangles{{{1*/ 18 ListofIntersectionTriangles::~ListofIntersectionTriangles(){ 19 if (lIntTria) delete [] lIntTria,lIntTria=0; 20 if (lSegsI) delete [] lSegsI,lSegsI=0; 21 } 22 /*}}}*/ 23 10 24 /*Methods*/ 25 /*FUNCTION ListofIntersectionTriangles::Init{{{1*/ 26 void ListofIntersectionTriangles::Init(void){ 27 state=0; 28 len=0; 29 Size=0; 30 } 31 /*}}}*/ 32 /*FUNCTION ListofIntersectionTriangles::Length{{{1*/ 33 double ListofIntersectionTriangles::Length(){ 34 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Length)*/ 35 36 // computation of the length 37 38 // check Size 39 if (Size<=0){ 40 ISSMERROR("Size<=0"); 41 } 42 43 Metric Mx,My; 44 int ii,jj; 45 R2 x,y,xy; 46 47 SegInterpolation* SegI=lSegsI; 48 SegI=lSegsI; 49 lSegsI[NbSeg].last=Size; 50 int EndSeg=Size; 51 52 y = lIntTria[0].x; 53 double sxy, s = 0; 54 lIntTria[0].s =0; 55 SegI->lBegin=s; 56 57 for (jj=0,ii=1;ii<Size;jj=ii++) { 58 // seg jj,ii 59 x = y; 60 y = lIntTria[ii].x; 61 xy = y-x; 62 Mx = lIntTria[ii].m; 63 My = lIntTria[jj].m; 64 sxy= LengthInterpole(Mx,My,xy); 65 s += sxy; 66 lIntTria[ii].s = s; 67 if (ii == EndSeg){ 68 SegI->lEnd=s; 69 SegI++; 70 EndSeg=SegI->last; 71 SegI->lBegin=s; 72 } 73 } 74 len = s; 75 SegI->lEnd=s; 76 77 return s; 78 } 79 /*}}}1*/ 80 /*FUNCTION ListofIntersectionTriangles::NewItem(Triangle * tt,double d0,double d1,double d2) {{{1*/ 81 int ListofIntersectionTriangles::NewItem(Triangle * tt,double d0,double d1,double d2) { 82 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/NewItem)*/ 83 84 register int n; 85 R2 x(0,0); 86 if ( d0) x = (*tt)[0].r * d0; 87 if ( d1) x = x + (*tt)[1].r * d1; 88 if ( d2) x = x + (*tt)[2].r * d2; 89 // newer add same point 90 if(!Size || Norme2_2(lIntTria[Size-1].x-x)) { 91 if (Size==MaxSize) ReShape(); 92 lIntTria[Size].t=tt; 93 lIntTria[Size].bary[0]=d0; 94 lIntTria[Size].bary[1]=d1; 95 lIntTria[Size].bary[2]=d2; 96 lIntTria[Size].x = x; 97 Metric m0,m1,m2; 98 register BamgVertex * v; 99 if ((v=(*tt)(0))) m0 = v->m; 100 if ((v=(*tt)(1))) m1 = v->m; 101 if ((v=(*tt)(2))) m2 = v->m; 102 lIntTria[Size].m = Metric(lIntTria[Size].bary,m0,m1,m2); 103 n=Size++;} 104 else n=Size-1; 105 return n; 106 } 107 /*}}}1*/ 108 /*FUNCTION ListofIntersectionTriangles::NewItem(R2 A,const Metric & mm){{{1*/ 109 int ListofIntersectionTriangles::NewItem(R2 A,const Metric & mm) { 110 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/NewItem)*/ 111 112 register int n; 113 if(!Size || Norme2_2(lIntTria[Size-1].x-A)) { 114 if (Size==MaxSize) ReShape(); 115 lIntTria[Size].t=0; 116 lIntTria[Size].x=A; 117 lIntTria[Size].m=mm; 118 n=Size++; 119 } 120 else n=Size-1; 121 return n; 122 } 123 /*}}}1*/ 124 /*FUNCTION ListofIntersectionTriangles::NewPoints{{{1*/ 125 long ListofIntersectionTriangles::NewPoints(BamgVertex* vertices,long &nbv,long maxnbv){ 126 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/NewPoints)*/ 127 128 //If length<1.5, do nothing 129 double s=Length(); 130 if (s<1.5) return 0; 131 132 const long nbvold=nbv; 133 int ii = 1 ; 134 R2 y,x; 135 Metric My,Mx ; 136 double sx =0,sy; 137 int nbi=Max(2,(int) (s+0.5)); 138 double sint=s/nbi; 139 double si =sint; 140 141 int EndSeg=Size; 142 SegInterpolation* SegI=NULL; 143 if (NbSeg) SegI=lSegsI,EndSeg=SegI->last; 144 145 for (int k=1;k<nbi;k++){ 146 while ((ii < Size) && ( lIntTria[ii].s <= si )){ 147 if (ii++ == EndSeg){ 148 SegI++; 149 EndSeg=SegI->last; 150 } 151 } 152 153 int ii1=ii-1; 154 x =lIntTria[ii1].x; 155 sx =lIntTria[ii1].s; 156 Metric Mx=lIntTria[ii1].m; 157 y =lIntTria[ii].x; 158 sy =lIntTria[ii].s; 159 Metric My=lIntTria[ii].m; 160 double lxy = sy-sx; 161 double cy = abscisseInterpole(Mx,My,y-x,(si-sx)/lxy); 162 163 R2 C; 164 double cx = 1-cy; 165 C = SegI ? SegI->F(si): x * cx + y *cy; 166 //C.Echo(); 167 //x.Echo(); 168 //y.Echo(); 169 //printf("cx = %g, cy=%g\n",cx,cy); 170 171 si += sint; 172 if ( nbv<maxnbv) { 173 vertices[nbv].r = C; 174 vertices[nbv++].m = Metric(cx,lIntTria[ii-1].m,cy,lIntTria[ii].m); 175 } 176 else return nbv-nbvold; 177 } 178 return nbv-nbvold; 179 } 180 /*}}}1*/ 181 /*FUNCTION ListofIntersectionTriangles::NewSubSeg{{{1*/ 182 void ListofIntersectionTriangles::NewSubSeg(GeometricalEdge *e,double s0,double s1){ 183 long int verbosity=0; 184 if (NbSeg>=MaxNbSeg) { 185 int mneo= MaxNbSeg; 186 MaxNbSeg *= 2; 187 if (verbosity>3){ 188 printf(" reshape lSegsI from %i to %i\n",mneo,MaxNbSeg); 189 } 190 SegInterpolation * lEn = new SegInterpolation[MaxNbSeg]; 191 if (!lSegsI || NbSeg>=MaxNbSeg){ 192 ISSMERROR("!lSegsI || NbSeg>=MaxNbSeg"); 193 } 194 for (int i=0;i< NbSeg;i++) 195 lEn[i] = lSegsI[MaxNbSeg]; // copy old to new 196 delete [] lSegsI; // remove old 197 lSegsI = lEn; 198 } 199 if (NbSeg) lSegsI[NbSeg-1].last=Size; 200 lSegsI[NbSeg].e=e; 201 lSegsI[NbSeg].sBegin=s0; 202 lSegsI[NbSeg].sEnd=s1; 203 NbSeg++; 204 } 205 /*}}}*/ 206 /*FUNCTION ListofIntersectionTriangles::ReShape{{{1*/ 207 void ListofIntersectionTriangles::ReShape(){ 208 209 register int newsize = MaxSize*2; 210 IntersectionTriangles* nw = new IntersectionTriangles[newsize]; 211 ISSMASSERT(nw); 212 213 // recopy 214 for (int i=0;i<MaxSize;i++) nw[i] = lIntTria[i]; 215 long int verbosity=0; 216 if(verbosity>3) printf(" ListofIntersectionTriangles ReShape Maxsize %i -> %i\n",MaxSize,MaxNbSeg); 217 MaxSize = newsize; 218 delete [] lIntTria;// remove old 219 lIntTria = nw; // copy pointer 220 } 221 /*}}}*/ 11 222 /*FUNCTION ListofIntersectionTriangles::SplitEdge{{{1*/ 12 223 void ListofIntersectionTriangles::SplitEdge(const Mesh & Bh, const R2 &A,const R2 &B,int nbegin) { … … 33 244 ifirst = ilast;} 34 245 else {// not optimisation 35 init();246 Init(); 36 247 t=tbegin = Bh.TriangleFindFromCoord(a,deta); 37 248 if( t->det>=0) … … 180 391 } 181 392 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 393 k = OppositeVertex[ocut]; 394 395 Icoor2 detbij = bamg::det((*t)[i],(*t)[j],b); 396 397 398 if (detbij >= 0) { //we find the triangle contening b 399 dt[0]=bamg::det((*t)[1],(*t)[2],b); 400 dt[1]=bamg::det((*t)[2],(*t)[0],b); 401 dt[2]=bamg::det((*t)[0],(*t)[1],b); 402 double dd = t->det; 403 NewItem(t,dt[0]/dd,dt[1]/dd,dt[2]/dd); 404 return ;} 405 else { // next triangle by adjacent by edge ocut 406 deti = dt[i]; 407 detj = dt[j]; 408 double dij = detj-deti; 409 ba[i] = detj/dij; 410 ba[j] = -deti/dij; 411 ba[3-i-j ] = 0; 412 ilast=NewItem(t, ba[0],ba[1],ba[2]); 413 414 TriangleAdjacent ta =t->Adj(ocut); 415 t = ta; 416 iedge= ta; 417 if (t->det <= 0) { 418 double ba,bb; 419 TriangleAdjacent edge=CloseBoundaryEdge(b,t,ba,bb); 420 NewItem(B,Metric(ba,*edge.EdgeVertex(0),bb,*edge.EdgeVertex(1))); 421 return; 422 } 423 }// we go outside of omega 213 424 } // for(;;) 214 425 } 215 426 /*}}}1*/ 216 /*FUNCTION ListofIntersectionTriangles::NewItem(Triangle * tt,double d0,double d1,double d2) {{{1*/217 int ListofIntersectionTriangles::NewItem(Triangle * tt,double d0,double d1,double d2) {218 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/NewItem)*/219 220 register int n;221 R2 x(0,0);222 if ( d0) x = (*tt)[0].r * d0;223 if ( d1) x = x + (*tt)[1].r * d1;224 if ( d2) x = x + (*tt)[2].r * d2;225 // newer add same point226 if(!Size || Norme2_2(lIntTria[Size-1].x-x)) {227 if (Size==MaxSize) ReShape();228 lIntTria[Size].t=tt;229 lIntTria[Size].bary[0]=d0;230 lIntTria[Size].bary[1]=d1;231 lIntTria[Size].bary[2]=d2;232 lIntTria[Size].x = x;233 Metric m0,m1,m2;234 register BamgVertex * v;235 if ((v=(*tt)(0))) m0 = v->m;236 if ((v=(*tt)(1))) m1 = v->m;237 if ((v=(*tt)(2))) m2 = v->m;238 lIntTria[Size].m = Metric(lIntTria[Size].bary,m0,m1,m2);239 n=Size++;}240 else n=Size-1;241 return n;242 }243 /*}}}1*/244 /*FUNCTION ListofIntersectionTriangles::NewItem(R2 A,const Metric & mm){{{1*/245 int ListofIntersectionTriangles::NewItem(R2 A,const Metric & mm) {246 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/NewItem)*/247 248 register int n;249 if(!Size || Norme2_2(lIntTria[Size-1].x-A)) {250 if (Size==MaxSize) ReShape();251 lIntTria[Size].t=0;252 lIntTria[Size].x=A;253 lIntTria[Size].m=mm;254 n=Size++;255 }256 else n=Size-1;257 return n;258 }259 /*}}}1*/260 /*FUNCTION ListofIntersectionTriangles::Length{{{1*/261 double ListofIntersectionTriangles::Length(){262 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Length)*/263 264 // computation of the length265 266 // check Size267 if (Size<=0){268 ISSMERROR("Size<=0");269 }270 271 Metric Mx,My;272 int ii,jj;273 R2 x,y,xy;274 275 SegInterpolation* SegI=lSegsI;276 SegI=lSegsI;277 lSegsI[NbSeg].last=Size;278 int EndSeg=Size;279 280 y = lIntTria[0].x;281 double sxy, s = 0;282 lIntTria[0].s =0;283 SegI->lBegin=s;284 285 for (jj=0,ii=1;ii<Size;jj=ii++) {286 // seg jj,ii287 x = y;288 y = lIntTria[ii].x;289 xy = y-x;290 Mx = lIntTria[ii].m;291 My = lIntTria[jj].m;292 sxy= LengthInterpole(Mx,My,xy);293 s += sxy;294 lIntTria[ii].s = s;295 if (ii == EndSeg){296 SegI->lEnd=s;297 SegI++;298 EndSeg=SegI->last;299 SegI->lBegin=s;300 }301 }302 len = s;303 SegI->lEnd=s;304 305 return s;306 }307 /*}}}1*/308 /*FUNCTION ListofIntersectionTriangles::NewPoints{{{1*/309 long ListofIntersectionTriangles::NewPoints(BamgVertex* vertices,long &nbv,long maxnbv){310 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/NewPoints)*/311 312 //If length<1.5, do nothing313 double s=Length();314 if (s<1.5) return 0;315 316 const long nbvold=nbv;317 int ii = 1 ;318 R2 y,x;319 Metric My,Mx ;320 double sx =0,sy;321 int nbi=Max(2,(int) (s+0.5));322 double sint=s/nbi;323 double si =sint;324 325 int EndSeg=Size;326 SegInterpolation* SegI=NULL;327 if (NbSeg) SegI=lSegsI,EndSeg=SegI->last;328 329 for (int k=1;k<nbi;k++){330 while ((ii < Size) && ( lIntTria[ii].s <= si )){331 if (ii++ == EndSeg){332 SegI++;333 EndSeg=SegI->last;334 }335 }336 337 int ii1=ii-1;338 x =lIntTria[ii1].x;339 sx =lIntTria[ii1].s;340 Metric Mx=lIntTria[ii1].m;341 y =lIntTria[ii].x;342 sy =lIntTria[ii].s;343 Metric My=lIntTria[ii].m;344 double lxy = sy-sx;345 double cy = abscisseInterpole(Mx,My,y-x,(si-sx)/lxy);346 347 R2 C;348 double cx = 1-cy;349 C = SegI ? SegI->F(si): x * cx + y *cy;350 //C.Echo();351 //x.Echo();352 //y.Echo();353 //printf("cx = %g, cy=%g\n",cx,cy);354 355 si += sint;356 if ( nbv<maxnbv) {357 vertices[nbv].r = C;358 vertices[nbv++].m = Metric(cx,lIntTria[ii-1].m,cy,lIntTria[ii].m);359 }360 else return nbv-nbvold;361 }362 return nbv-nbvold;363 }364 /*}}}1*/365 427 366 428 } -
issm/trunk/src/c/objects/Bamg/ListofIntersectionTriangles.h
r5120 r5130 11 11 12 12 class IntersectionTriangles { 13 13 14 public: 14 Triangle *t;15 double bary[3];// use if t != 016 R2 x;17 Metric m;18 double s; // curvilinear coordinate19 double sp;// length of the previous segment in m20 double sn;// length of the next segment in m15 Triangle *t; 16 double bary[3]; // use if t != 0 17 R2 x; 18 Metric m; 19 double s; // curvilinear coordinate 20 double sp; // length of the previous segment in m 21 double sn; // length of the next segment in m 21 22 }; 22 23 23 24 class SegInterpolation { 25 24 26 public: 25 GeometricalEdge * 26 double sBegin,sEnd; // abscisse of the seg on edge parameter27 double lBegin,lEnd; // length abscisse set in ListofIntersectionTriangles::Length28 int last;// last indexin ListofIntersectionTriangles for this Sub seg of edge27 GeometricalEdge *e; 28 double sBegin ,sEnd; // abscisse of the seg on edge parameter 29 double lBegin ,lEnd; // length abscisse set in ListofIntersectionTriangles::Length 30 int last; // last index in ListofIntersectionTriangles for this Sub seg of edge 29 31 30 32 //Methods … … 40 42 public: 41 43 42 int MaxSize;43 int Size;44 double len;45 int state;46 IntersectionTriangles * 47 int NbSeg;48 int MaxNbSeg;49 SegInterpolation *lSegsI;44 int MaxSize; 45 int Size; 46 double len; 47 int state; 48 IntersectionTriangles *lIntTria; 49 int NbSeg; 50 int MaxNbSeg; 51 SegInterpolation *lSegsI; 50 52 51 53 //Constructors/Destructors 52 ListofIntersectionTriangles(int n=256,int m=16) 53 : MaxSize(n), Size(0), len(-1),state(-1),lIntTria(new IntersectionTriangles[n]) , 54 NbSeg(0), MaxNbSeg(m), lSegsI(new SegInterpolation[m]){ 55 long int verbosity=0; 56 if (verbosity>9) printf(" construct ListofIntersectionTriangles %i %i\n",MaxSize,MaxNbSeg); 57 } 58 ~ListofIntersectionTriangles(){ 59 if (lIntTria) delete [] lIntTria,lIntTria=0; 60 if (lSegsI) delete [] lSegsI,lSegsI=0; 61 } 54 ListofIntersectionTriangles(int n=256,int m=16); 55 ~ListofIntersectionTriangles(); 62 56 63 57 //Operators … … 66 60 67 61 //Methods 68 void init(){state=0;len=0;Size=0;} 69 int NewItem(Triangle * tt,double d0,double d1,double d2); 70 int NewItem(R2,const Metric & ); 71 void SplitEdge(const Mesh & ,const R2 &,const R2 &,int nbegin=0); 72 double Length(); 73 long NewPoints(BamgVertex *,long & nbv,long maxnbv); 74 void NewSubSeg(GeometricalEdge *e,double s0,double s1){ 75 long int verbosity=0; 76 if (NbSeg>=MaxNbSeg) { 77 int mneo= MaxNbSeg; 78 MaxNbSeg *= 2; 79 if (verbosity>3){ 80 printf(" reshape lSegsI from %i to %i\n",mneo,MaxNbSeg); 81 } 82 SegInterpolation * lEn = new SegInterpolation[MaxNbSeg]; 83 if (!lSegsI || NbSeg>=MaxNbSeg){ 84 ISSMERROR("!lSegsI || NbSeg>=MaxNbSeg"); 85 } 86 for (int i=0;i< NbSeg;i++) 87 lEn[i] = lSegsI[MaxNbSeg]; // copy old to new 88 delete [] lSegsI; // remove old 89 lSegsI = lEn; 90 } 91 if (NbSeg) lSegsI[NbSeg-1].last=Size; 92 lSegsI[NbSeg].e=e; 93 lSegsI[NbSeg].sBegin=s0; 94 lSegsI[NbSeg].sEnd=s1; 95 NbSeg++; 96 } 97 void ReShape(){ 98 register int newsize = MaxSize*2; 99 IntersectionTriangles* nw = new IntersectionTriangles[newsize]; 100 if (!nw) ISSMERROR("!nw"); 101 // recopy 102 for (int i=0;i<MaxSize;i++) nw[i] = lIntTria[i]; 103 long int verbosity=0; 104 if(verbosity>3) printf(" ListofIntersectionTriangles ReShape Maxsize %i -> %i\n",MaxSize,MaxNbSeg); 105 MaxSize = newsize; 106 delete [] lIntTria;// remove old 107 lIntTria = nw; // copy pointer 108 } 62 void Init(); 63 int NewItem(Triangle *tt,double d0,double d1,double d2); 64 int NewItem(R2 ,const Metric &); 65 void SplitEdge(const Mesh &,const R2 &,const R2 &,int nbegin=0); 66 double Length(); 67 long NewPoints(BamgVertex *,long &nbv,long maxnbv); 68 void NewSubSeg(GeometricalEdge *e,double s0,double s1); 69 void ReShape(); 109 70 }; 110 71 -
issm/trunk/src/c/objects/Bamg/Mesh.cpp
r5124 r5130 219 219 220 220 } 221 /*}}}1*/ 222 /*FUNCTION Mesh::Mesh(long maxnbv,Mesh & BT,BamgOpts* bamgopts,int keepBackVertices){{{1*/ 223 Mesh::Mesh(long maxnbv,Mesh & BT,BamgOpts* bamgopts,int keepBackVertices) :Gh(BT.Gh),BTh(BT) { 224 TriangulateFromGeom1(maxnbv,bamgopts,keepBackVertices); 225 } 226 /*}}}1*/ 227 /*FUNCTION Mesh::Mesh(long maxnbv,Geometry & G,BamgOpts* bamgopts){{{1*/ 228 Mesh::Mesh(long maxnbv,Geometry & G,BamgOpts* bamgopts) :Gh(G),BTh(*this){ 229 TriangulateFromGeom0(maxnbv,bamgopts); 230 } 221 231 /*}}}1*/ 222 232 /*FUNCTION Mesh::~Mesh(){{{1*/ -
issm/trunk/src/c/objects/Bamg/Mesh.h
r5124 r5130 62 62 Mesh(Mesh &,Geometry * pGh=0,Mesh* pBTh=0,long maxnbv_in=0 ); //copy operator 63 63 Mesh(const Mesh &,const int *flag,const int *bb,BamgOpts* bamgopts); // truncature 64 Mesh(long maxnbv,Mesh & BT,BamgOpts* bamgopts,int keepBackVertices=1) :Gh(BT.Gh),BTh(BT) { 65 try {TriangulateFromGeom1(maxnbv,bamgopts,keepBackVertices);} 66 catch(...) { this->~Mesh(); throw; } 67 } 68 Mesh(long maxnbv,Geometry & G,BamgOpts* bamgopts) :Gh(G),BTh(*this){ 69 try { TriangulateFromGeom0(maxnbv,bamgopts);} 70 catch(...) { this->~Mesh(); throw; } 71 } 64 Mesh(long maxnbv,Mesh & BT,BamgOpts* bamgopts,int keepBackVertices=1); 65 Mesh(long maxnbv,Geometry & G,BamgOpts* bamgopts); 72 66 ~Mesh(); 73 67 74 68 //Operators 75 const BamgVertex & operator[] (long i) const { return vertices[i];};76 BamgVertex & operator[](long i) { return vertices[i];};77 const Triangle & operator() (long i) const { return triangles[i];};78 Triangle & operator()(long i) { return triangles[i];};69 const BamgVertex &operator[](long i) const { return vertices[i]; }; 70 BamgVertex &operator[](long i) { return vertices[i]; }; 71 const Triangle &operator()(long i) const { return triangles[i]; }; 72 Triangle &operator()(long i) { return triangles[i]; }; 79 73 80 74 //Methods … … 159 153 void TriangulateFromGeom0(long maxnbv,BamgOpts* bamgopts);// the real constructor mesh generator 160 154 void Init(long); 161 162 155 }; 163 156 -
issm/trunk/src/c/objects/Bamg/include.h
r3913 r5130 6 6 #define _INCLUDE2_H_ 7 7 8 9 8 #include "./macros.h" 10 9 #include "./typedefs.h" 11 10 12 13 11 #endif //ifndef _INCLUDE2_H_ 14 -
issm/trunk/src/c/objects/Bamg/macros.h
r3913 r5130 19 19 static const short NextVertex[3] = {1,2,0}; 20 20 static const short PreviousVertex[3] = {2,0,1}; 21 #if LONG_BIT > 6321 #if LONG_BIT > 63 22 22 const Icoor1 MaxICoor = 1073741823; // 2^30-1 =111...111 (29 times) 23 #else23 #else 24 24 const Icoor1 MaxICoor = 8388608; // 2^23 25 #endif25 #endif 26 26 const Icoor2 MaxICoor22 = Icoor2(2)*Icoor2(MaxICoor) * Icoor2(MaxICoor) ; 27 27 }
Note:
See TracChangeset
for help on using the changeset viewer.