Changeset 2865
- Timestamp:
- 01/20/10 08:08:23 (15 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 1 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/Bamgx/Bamgx.cpp
r2864 r2865 17 17 #include <stdio.h> 18 18 #include <string.h> 19 #include "Mesh2.h" 19 20 #include "QuadTree.h" 20 21 -
issm/trunk/src/c/Bamgx/Bamgx.h
r2864 r2865 7 7 8 8 #include "../objects/objects.h" 9 #include "../shared/shared.h"10 #include "../include/macros.h"11 #include "../toolkits/toolkits.h"12 13 //From MeshIo14 #include <cstdio>15 #include <cstring>16 #include <cstdlib>17 #include <cctype>18 #include <stdlib.h>19 #include <math.h>20 #include <limits.h>21 #include <time.h>22 23 #if (defined(unix) || defined(__unix)) && !defined(__AIX)24 #define SYSTIMES25 #include <sys/times.h>26 #include <unistd.h>27 #endif28 29 #include "meshtype.h"30 #include "R2.h"31 9 32 10 /* local prototypes: */ 33 11 int Bamgx(BamgMesh* bamgmesh,BamgGeom* bamggeom,BamgOpts* bamgopts); 34 12 35 /*Others*/36 using namespace std;37 namespace bamg {38 39 const double Pi = 3.14159265358979323846264338328;40 const float fPi = 3.14159265358979323846264338328;41 42 extern int hinterpole;43 44 typedef P2<Icoor1,Icoor2> I2;45 46 inline int BinaryRand(){47 #ifdef RAND_MAX48 const long HalfRandMax = RAND_MAX/2;49 return rand() < HalfRandMax;50 #else51 return rand() & 16384; // 2^14 (for sun because RAND_MAX is not def in stdlib.h)52 #endif53 54 }55 typedef P2<Real8,Real8> R2;56 typedef P2xP2<Int2,Int4> I2xI2;57 typedef P2<Real4,Real8> R2xR2;58 }59 60 #include "Metric.h"61 62 namespace bamg {63 inline float OppositeAngle(float a)64 {return a<0 ? fPi + a :a - fPi ;}65 inline double OppositeAngle(double a)66 {return a<0 ? Pi + a :a - Pi ;}67 68 Icoor2 inline det(const I2 &a,const I2 & b,const I2 &c)69 {70 register Icoor2 bax = b.x - a.x ,bay = b.y - a.y;71 register Icoor2 cax = c.x - a.x ,cay = c.y - a.y;72 return bax*cay - bay*cax;}73 74 75 // def de numerotation dans un triangles76 static const Int2 VerticesOfTriangularEdge[3][2] = {{1,2},{2,0},{0,1}};77 static const Int2 EdgesVertexTriangle[3][2] = {{1,2},{2,0},{0,1}};78 static const Int2 OppositeVertex[3] = {0,1,2};79 static const Int2 OppositeEdge[3] = {0,1,2};80 static const Int2 NextEdge[3] = {1,2,0};81 static const Int2 PreviousEdge[3] = {2,0,1};82 static const Int2 NextVertex[3] = {1,2,0};83 static const Int2 PreviousVertex[3] = {2,0,1};84 85 Int4 AGoodNumberPrimeWith(Int4 n);86 87 // remark all the angle are in radian beetwen [-Pi,Pi]88 89 90 class Geometry;91 //static Geometry *NULLGeometry=0;92 class Triangles;93 class Triangle;94 class QuadTree;95 class GeometricalEdge;96 class VertexOnGeom;97 class VertexOnEdge;98 /////////////////////////////////////////////////////////////////////////////////////99 const int IsVertexOnGeom = 8;100 const int IsVertexOnVertex = 16;101 const int IsVertexOnEdge = 32;102 /////////////////////////////////////////////////////////////////////////////////////103 104 //class from MeshGeom105 class DoubleAndInt4 {106 public: double q; Int4 i3j;107 int operator<(DoubleAndInt4 a){return q > a.q;}108 };// to sort by decroissant109 template<class T> inline void HeapSort(T *c,long n){110 long l,j,r,i;111 T crit;112 c--; // on decale de 1 pour que le tableau commence a 1113 if( n <= 1) return;114 l = n/2 + 1;115 r = n;116 while (1) { // label 2117 if(l <= 1 ) { // label 20118 crit = c[r];119 c[r--] = c[1];120 if ( r == 1 ) { c[1]=crit; return;}121 } else crit = c[--l];122 j=l;123 while (1) {// label 4124 i=j;125 j=2*j;126 if (j>r) {c[i]=crit;break;} // L8 -> G2127 if ((j<r) && (c[j] < c[j+1])) j++; // L5128 if (crit < c[j]) c[i]=c[j]; // L6+1 G4129 else {c[i]=crit;break;} //L8 -> G2130 }131 }132 }133 //End from MeshGeom134 135 136 class Direction { //137 private:138 Icoor1 dir;139 public:140 Direction(): dir(MaxICoor){}; // no direction set141 Direction(Icoor1 i,Icoor1 j) { Icoor2 n2 = 2*(Abs(i)+Abs(j));142 Icoor2 r = MaxICoor* (Icoor2) i;143 Icoor1 r1 = (Icoor1) (2*(r/ n2)); // odd number144 dir = (j>0) ? r1 : r1+1; // odd -> j>0 even -> j<0145 }146 int sens( Icoor1 i,Icoor1 j) { int r =1;147 if (dir!= MaxICoor) {148 Icoor2 x(dir/2),y1(MaxICoor/2-Abs(x)),y(dir%2?-y1:y1);149 r = (x*i + y*j) >=0;}150 return r;}151 };152 /////////////////////////////////////////////////////////////////////////////////////153 class Vertex {public:154 I2 i; // allow to use i.x, and i.y in long int (beware of scale and centering)155 R2 r; // allow to use r.x, and r.y in double156 Metric m;157 Int4 ReferenceNumber;158 Direction DirOfSearch;159 union {160 Triangle * t; // one triangle which contained the vertex161 Int4 color;162 Vertex * to;// use in geometry Vertex to now the Mesh Vertex associed163 VertexOnGeom * on; // if vint 8; // set with Triangles::SetVertexFieldOn()164 Vertex * onbv; // if vint == 16 on Background vertex Triangles::SetVertexFieldOnBTh()165 VertexOnEdge * onbe; // if vint == 32 on Background edge166 };167 Int1 vint; // the vertex number in triangle; varies between 0 and 2 in t168 operator I2 () const {return i;} // operator de cast169 operator const R2 & () const {return r;}// operator de cast170 // operator R2 & () {return r;}// operator de cast171 Real8 operator()(R2 x) const { return m(x);}172 operator Metric () const {return m;}// operator de cast173 Int4 Optim(int = 1,int =0);174 // Vertex(){}175 // ~Vertex(){}176 Real8 Smoothing(Triangles & ,const Triangles & ,Triangle * & ,Real8 =1);177 int ref() const { return ReferenceNumber;}178 179 inline void Set(const Vertex & rec,const Triangles &,Triangles &);180 };181 182 double QuadQuality(const Vertex &,const Vertex &,const Vertex &,const Vertex &);183 184 class TriangleAdjacent {185 186 public:187 Triangle * t; // le triangle188 int a; // le numero de l arete189 190 TriangleAdjacent(Triangle * tt,int aa): t(tt),a(aa &3) {};191 TriangleAdjacent() {};192 193 operator Triangle * () const {return t;}194 operator Triangle & () const {return *t;}195 operator int() const {return a;}196 TriangleAdjacent & operator++()197 {198 a= NextEdge[a];199 return *this;}200 TriangleAdjacent operator--()201 {202 a= PreviousEdge[a];203 return *this;}204 inline TriangleAdjacent Adj() const ;205 int swap();206 inline void SetAdj2(const TriangleAdjacent& , int =0);207 inline Vertex * EdgeVertex(const int &) const ;208 inline Vertex * OppositeVertex() const ;209 inline Icoor2 & det() const;210 inline int Locked() const ;211 inline int GetAllFlag_UnSwap() const ;212 inline void SetLock();213 inline int MarkUnSwap() const;214 inline void SetMarkUnSwap();215 inline void SetCracked();216 inline int Cracked() const ;217 };// end of Vertex class218 219 class Edge { public:220 Vertex * v[2];221 Int4 ref;222 GeometricalEdge * on;223 Vertex & operator[](int i){return *v[i];};224 Vertex * operator()(int i){return v[i];};225 226 void ReNumbering(Vertex *vb,Vertex *ve, Int4 *renu)227 {228 if (v[0] >=vb && v[0] <ve) v[0] = vb + renu[v[0]-vb];229 if (v[1] >=vb && v[1] <ve) v[1] = vb + renu[v[1]-vb];230 }231 232 const Vertex & operator[](int i) const { return *v[i];};233 R2 operator()(double t) const; // return the point234 // on the curve edge a t in [0:1]235 Edge * adj[2]; // the 2 adj edges if on the same curve236 237 int Intersection(const Edge & e) const {238 if (!(adj[0]==&e || adj[1]==&e)){239 throw ErrorException(__FUNCT__,exprintf("Intersection bug"));240 }241 if (adj[0]!=&e && adj[1]!=&e){242 throw ErrorException(__FUNCT__,exprintf("adj[0]!=&e && adj[1]!=&e"));243 }244 return adj[0]==&e ? 0 : 1;245 }246 Real8 MetricLength() const ;247 inline void Set(const Triangles &,Int4,Triangles &);248 249 }; // end of Edge class250 251 class GeometricalVertex :public Vertex {252 int cas;253 friend class Geometry;254 GeometricalVertex * link; // link all the same GeometricalVertex circular (Crack)255 public:256 int Corner() const {return cas&4;}257 int Required()const {return cas&6;}// a corner is required258 void SetCorner(){ cas |= 4;}259 void SetRequired(){ cas |= 2;}260 void Set(){cas=0;}261 GeometricalVertex() :cas(0), link(this) {};262 263 GeometricalVertex * The() {264 if (!link){265 throw ErrorException(__FUNCT__,exprintf("!link"));266 }267 return link;268 }// return a unique vertices269 270 int IsThe() const { return link == this;}271 272 inline void Set(const GeometricalVertex & rec,const Geometry & Gh ,const Geometry & GhNew);273 };274 275 class GeometricalEdge {276 public:277 GeometricalVertex * v[2];278 Int4 ref;279 Int4 CurveNumber;280 R2 tg[2]; // the 2 tangente281 // if tg[0] =0 => no continuite282 GeometricalEdge * Adj [2];283 int SensAdj[2];284 // private:285 int flag ;286 public:287 GeometricalEdge * link; // if Cracked() or Equi()288 289 // end of data290 291 GeometricalVertex & operator[](int i){return *v[i];};292 const GeometricalVertex & operator[](int i) const { return *v[i];};293 GeometricalVertex * operator()(int i){return v[i];};294 // inline void Set(const Geometry &,Int4,Geometry &);295 296 R2 F(Real8 theta) const ; // parametrization of the curve edge297 Real8 R1tg(Real8 theta,R2 &t) const ; // 1/radius of curvature + tangente298 int Cracked() const {return flag & 1;}299 int Dup() const { return flag & 32;}300 int Equi()const {return flag & 2;}301 int ReverseEqui()const {return flag & 128;}302 int TgA()const {return flag &4;}303 int TgB()const {return flag &8;}304 int Tg(int i) const{return i==0 ? TgA() : TgB();}305 int Mark()const {return flag &16;}306 int Required() { return flag & 64;}307 void SetCracked() { flag |= 1;}308 void SetDup() { flag |= 32;} // not a real edge309 void SetEqui() { flag |= 2;}310 void SetTgA() { flag|=4;}311 void SetTgB() { flag|=8;}312 void SetMark() { flag|=16;}313 void SetUnMark() { flag &= 1007 /* 1023-16*/;}314 void SetRequired() { flag |= 64;}315 void SetReverseEqui() {flag |= 128;}316 317 inline void Set(const GeometricalEdge & rec,const Geometry & Th ,Geometry & ThNew);318 319 };320 321 class Curve {public:322 GeometricalEdge * be,*ee; // begin et end edge323 int kb,ke; // begin vetex and end vertex324 Curve *next; // next curve equi to this325 bool master; // true => of equi curve point on this curve326 inline void Set(const Curve & rec,const Geometry & Th ,Geometry & ThNew);327 Curve() : be(0),ee(0),kb(0),ke(0),next(0),master(true) {}328 void Reverse() { Exchange(be,ee); Exchange(kb,ke);} // revese the sens of the curse329 };330 331 class Triangle {332 friend class TriangleAdjacent;333 334 335 private: // les arete sont opposes a un sommet336 Vertex * ns [3]; // 3 vertices if t is triangle, t[i] allowed by access function, (*t)[i] if pointer337 Triangle * at [3]; // nu triangle adjacent338 Int1 aa[3]; // les nu des arete dans le triangles (mod 4)339 public:340 Icoor2 det; // determinant du triangle (2 fois l aire des vertices entieres)341 union {342 Triangle * link ;343 Int4 color;344 };345 void SetDet() {346 if(ns[0] && ns[1] && ns[2]) det = bamg::det(*ns[0],*ns[1],*ns[2]);347 else det = -1; }348 Triangle() {}349 Triangle(Triangles *Th,Int4 i,Int4 j,Int4 k);350 Triangle(Vertex *v0,Vertex *v1,Vertex *v2);351 inline void Set(const Triangle &,const Triangles &,Triangles &);352 inline int In(Vertex *v) const { return ns[0]==v || ns[1]==v || ns[2]==v ;}353 TriangleAdjacent FindBoundaryEdge(int ) const;354 355 void ReNumbering(Triangle *tb,Triangle *te, Int4 *renu)356 {357 if (link >=tb && link <te) link = tb + renu[link -tb];358 if (at[0] >=tb && at[0] <te) at[0] = tb + renu[at[0]-tb];359 if (at[1] >=tb && at[1] <te) at[1] = tb + renu[at[1]-tb];360 if (at[2] >=tb && at[2] <te) at[2] = tb + renu[at[2]-tb];361 }362 void ReNumbering(Vertex *vb,Vertex *ve, Int4 *renu)363 {364 if (ns[0] >=vb && ns[0] <ve) ns[0] = vb + renu[ns[0]-vb];365 if (ns[1] >=vb && ns[1] <ve) ns[1] = vb + renu[ns[1]-vb];366 if (ns[2] >=vb && ns[2] <ve) ns[2] = vb + renu[ns[2]-vb];367 }368 369 370 const Vertex & operator[](int i) const {return *ns[i];};371 Vertex & operator[](int i) {return *ns[i];};372 373 const Vertex * operator()(int i) const {return ns[i];};374 Vertex * & operator()(int i) {return ns[i];};375 376 TriangleAdjacent Adj(int i) const // triangle adjacent + arete377 { return TriangleAdjacent(at[i],aa[i]&3);};378 379 Triangle * TriangleAdj(int i) const380 {return at[i&3];} // triangle adjacent + arete381 Int1 NuEdgeTriangleAdj(int i) const382 {return aa[i&3]&3;} // Number of the adjacent edge in adj tria383 384 inline Real4 qualite() ;385 386 387 void SetAdjAdj(Int1 a)388 { a &= 3;389 register Triangle *tt=at[a];390 aa [a] &= 55; // remove MarkUnSwap391 register Int1 aatt = aa[a] & 3;392 if(tt){393 tt->at[aatt]=this;394 tt->aa[aatt]=a + (aa[a] & 60 ) ;}// Copy all the mark395 }396 397 void SetAdj2(Int1 a,Triangle *t,Int1 aat)398 { at[a]=t;aa[a]=aat;399 if(t) {t->at[aat]=this;t->aa[aat]=a;}400 }401 402 void SetTriangleContainingTheVertex()403 {404 if (ns[0]) (ns[0]->t=this,ns[0]->vint=0);405 if (ns[1]) (ns[1]->t=this,ns[1]->vint=1);406 if (ns[2]) (ns[2]->t=this,ns[2]->vint=2);407 }408 409 int swap(Int2 a1,int=0);410 Int4 Optim(Int2 a,int =0);411 412 int Locked(int a)const { return aa[a]&4;}413 int Hidden(int a)const { return aa[a]&16;}414 int Cracked(int a) const { return aa[a] & 32;}415 // for optimisation416 int GetAllflag(int a){return aa[a] & 1020;}417 void SetAllFlag(int a,int f){aa[a] = (aa[a] &3) + (1020 & f);}418 419 void SetHidden(int a){420 register Triangle * t = at[a];421 if(t) t->aa[aa[a] & 3] |=16;422 aa[a] |= 16;}423 void SetCracked(int a){424 register Triangle * t = at[a];425 if(t) t->aa[aa[a] & 3] |=32;426 aa[a] |= 32;}427 428 double QualityQuad(int a,int option=1) const;429 Triangle * Quadrangle(Vertex * & v0,Vertex * & v1,Vertex * & v2,Vertex * & v3) const ;430 431 void SetLocked(int a){432 register Triangle * t = at[a];433 t->aa[aa[a] & 3] |=4;434 aa[a] |= 4;}435 436 void SetMarkUnSwap(int a){437 register Triangle * t = at[a];438 t->aa[aa[a] & 3] |=8;439 aa[a] |=8 ;}440 441 442 void SetUnMarkUnSwap(int a){443 register Triangle * t = at[a];444 t->aa[aa[a] & 3] &=55; // 23 + 32445 aa[a] &=55 ;}446 447 }; // end of Triangle class448 449 class ListofIntersectionTriangles {450 /////////////////////////////////////////////////////////////////////////////////////451 class IntersectionTriangles {452 public:453 Triangle *t;454 Real8 bary[3]; // use if t != 0455 R2 x;456 Metric m;457 Real8 s;// abscisse curviline458 Real8 sp; // len of the previous seg in m459 Real8 sn;// len of the next seg in m460 };461 /////////////////////////////////////////////////////////////////////////////////////462 class SegInterpolation {463 public:464 GeometricalEdge * e;465 Real8 sBegin,sEnd; // abscisse of the seg on edge parameter466 Real8 lBegin,lEnd; // length abscisse set in ListofIntersectionTriangles::Length467 int last;// last index in ListofIntersectionTriangles for this Sub seg of edge468 R2 F(Real8 s){469 Real8 c01=lEnd-lBegin, c0=(lEnd-s)/c01, c1=(s-lBegin)/c01;470 if (lBegin>s || s>lEnd){471 throw ErrorException(__FUNCT__,exprintf("lBegin>s || s>lEnd"));472 }473 return e->F(sBegin*c0+sEnd*c1);}474 };475 476 int MaxSize; //477 int Size; //478 Real8 len; //479 int state;480 IntersectionTriangles * lIntTria;481 int NbSeg;482 int MaxNbSeg;483 SegInterpolation * lSegsI;484 public:485 IntersectionTriangles & operator[](int i) {return lIntTria[i];}486 operator int&() {return Size;}487 488 ListofIntersectionTriangles(int n=256,int m=16)489 : MaxSize(n), Size(0), len(-1),state(-1),lIntTria(new IntersectionTriangles[n]) ,490 NbSeg(0), MaxNbSeg(m), lSegsI(new SegInterpolation[m])491 {492 long int verbosity=0;493 if (verbosity>9) printf(" construct ListofIntersectionTriangles %i %i\n",MaxSize,MaxNbSeg);494 };495 496 ~ListofIntersectionTriangles(){497 if (lIntTria) delete [] lIntTria,lIntTria=0;498 if (lSegsI) delete [] lSegsI,lSegsI=0;}499 void init(){state=0;len=0;Size=0;}500 501 int NewItem(Triangle * tt,Real8 d0,Real8 d1,Real8 d2);502 int NewItem(R2,const Metric & );503 void NewSubSeg(GeometricalEdge *e,Real8 s0,Real8 s1)504 {505 long int verbosity=0;506 507 if (NbSeg>=MaxNbSeg) {508 int mneo= MaxNbSeg;509 MaxNbSeg *= 2;510 if (verbosity>3){511 printf(" reshape lSegsI from %i to %i\n",mneo,MaxNbSeg);512 }513 SegInterpolation * lEn = new SegInterpolation[MaxNbSeg];514 if (!lSegsI || NbSeg>=MaxNbSeg){515 throw ErrorException(__FUNCT__,exprintf("!lSegsI || NbSeg>=MaxNbSeg"));516 }517 for (int i=0;i< NbSeg;i++)518 lEn[i] = lSegsI[MaxNbSeg]; // copy old to new519 delete [] lSegsI; // remove old520 lSegsI = lEn;521 }522 if (NbSeg)523 lSegsI[NbSeg-1].last=Size;524 lSegsI[NbSeg].e=e;525 lSegsI[NbSeg].sBegin=s0;526 lSegsI[NbSeg].sEnd=s1;527 NbSeg++;528 }529 530 // void CopyMetric(int i,int j){ lIntTria[j].m=lIntTria[i].m;}531 // void CopyMetric(const Metric & mm,int j){ lIntTria[j].m=mm;}532 533 void ReShape() {534 register int newsize = MaxSize*2;535 IntersectionTriangles* nw = new IntersectionTriangles[newsize];536 if (!nw){537 throw ErrorException(__FUNCT__,exprintf("!nw"));538 }539 for (int i=0;i<MaxSize;i++) // recopy540 nw[i] = lIntTria[i];541 long int verbosity=0;542 if(verbosity>3) printf(" ListofIntersectionTriangles ReShape Maxsize %i -> %i\n",MaxSize,MaxNbSeg);543 MaxSize = newsize;544 delete [] lIntTria;// remove old545 lIntTria = nw; // copy pointer546 }547 548 void SplitEdge(const Triangles & ,const R2 &,const R2 &,int nbegin=0);549 Real8 Length();550 Int4 NewPoints(Vertex *,Int4 & nbv,Int4 nbvx);551 };552 553 554 /////////////////////////////////////////////////////////////////////////////////////555 class GeometricalSubDomain {556 public:557 GeometricalEdge *edge;558 int sens; // -1 or 1559 Int4 ref;560 inline void Set(const GeometricalSubDomain &,const Geometry & ,const Geometry &);561 562 };563 /////////////////////////////////////////////////////////////////////////////////////564 class SubDomain {565 public:566 Triangle * head;567 Int4 ref;568 int sens; // -1 or 1569 Edge * edge; // to geometrical570 inline void Set(const Triangles &,Int4,Triangles &);571 572 };573 /////////////////////////////////////////////////////////////////////////////////////574 class VertexOnGeom { public:575 576 Vertex * mv;577 Real8 abscisse;578 union{579 GeometricalVertex * gv; // if abscisse <0;580 GeometricalEdge * ge; // if abscisse in [0..1]581 };582 inline void Set(const VertexOnGeom&,const Triangles &,Triangles &);583 int OnGeomVertex()const {return this? abscisse <0 :0;}584 int OnGeomEdge() const {return this? abscisse >=0 :0;}585 VertexOnGeom(): mv(0),abscisse(0){gv=0;}586 VertexOnGeom(Vertex & m,GeometricalVertex &g) : mv(&m),abscisse(-1){gv=&g;}587 VertexOnGeom(Vertex & m,GeometricalEdge &g,Real8 s) : mv(&m),abscisse(s){ge=&g;}588 operator Vertex * () const {return mv;}589 operator GeometricalVertex * () const {return gv;}590 operator GeometricalEdge * () const {return ge;}591 operator const Real8 & () const {return abscisse;}592 int IsRequiredVertex(){ return this? (( abscisse<0 ? (gv?gv->Required():0):0 )) : 0;}593 void SetOn(){mv->on=this;mv->vint=IsVertexOnGeom;}594 inline void Set(const Triangles &,Int4,Triangles &);595 596 };597 /////////////////////////////////////////////////////////////////////////////////////598 class VertexOnVertex {public:599 Vertex * v, *bv;600 VertexOnVertex(Vertex * w,Vertex *bw) :v(w),bv(bw){}601 VertexOnVertex() {};602 inline void Set(const Triangles &,Int4,Triangles &);603 void SetOnBTh(){v->onbv=bv;v->vint=IsVertexOnVertex;}604 };605 /////////////////////////////////////////////////////////////////////////////////////606 class VertexOnEdge {public:607 Vertex * v;608 Edge * be;609 Real8 abcisse;610 VertexOnEdge( Vertex * w, Edge *bw,Real8 s) :v(w),be(bw),abcisse(s) {}611 VertexOnEdge(){}612 inline void Set(const Triangles &,Int4,Triangles &);613 void SetOnBTh(){v->onbe=this;v->vint=IsVertexOnEdge;}614 Vertex & operator[](int i) const { return (*be)[i];}615 operator Real8 () const { return abcisse;}616 operator Vertex * () const { return v;}617 operator Edge * () const { return be;}618 };619 620 inline TriangleAdjacent FindTriangleAdjacent(Edge &E);621 inline Vertex * TheVertex(Vertex * a); // for remove crak in mesh622 /////////////////////////////////////////////////////////////////////////////////////623 624 class CrackedEdge { // a small class to store on crack an uncrack information625 friend class Triangles;626 class CrackedTriangle {627 friend class Triangles;628 friend class CrackedEdge;629 Triangle * t; // edge of triangle t630 int i; // edge number of in triangle631 Edge *edge; // the 2 edge632 Vertex *New[2]; // new vertex number633 CrackedTriangle() : t(0),i(0),edge(0) { New[0]=New[1]=0;}634 CrackedTriangle(Edge * a) : t(0),i(0),edge(a) { New[0]=New[1]=0;}635 void Crack(){636 Triangle & T(*t);637 int i0=VerticesOfTriangularEdge[i][0];638 int i1=VerticesOfTriangularEdge[i][0];639 if (!New[0] && !New[1]){640 throw ErrorException(__FUNCT__,exprintf("!New[0] && !New[1]"));641 }642 T(i0) = New[0];643 T(i1) = New[1];}644 void UnCrack(){645 Triangle & T(*t);646 int i0=VerticesOfTriangularEdge[i][0];647 int i1=VerticesOfTriangularEdge[i][0];648 if (!New[0] && !New[1]){649 throw ErrorException(__FUNCT__,exprintf("!New[0] && !New[1]"));650 }651 T(i0) = TheVertex(T(i0));652 T(i1) = TheVertex(T(i1));}653 void Set() {654 TriangleAdjacent ta ( FindTriangleAdjacent(*edge));655 t = ta;656 i = ta;657 658 New[0] = ta.EdgeVertex(0);659 New[1] = ta.EdgeVertex(1);660 // warning the ref661 662 }663 664 }; // end of class CrackedTriangle665 public:666 CrackedTriangle a,b;667 CrackedEdge() :a(),b() {}668 CrackedEdge(Edge * start, Int4 i,Int4 j) : a(start+i),b(start+j) {};669 CrackedEdge(Edge * e0, Edge * e1 ) : a(e0),b(e1) {};670 671 void Crack() { a.Crack(); b.Crack();}672 void UnCrack() { a.UnCrack(); b.UnCrack();}673 void Set() { a.Set(), b.Set();}674 };675 676 /////////////////////////////////////////////////////////////////////////////////////677 class Triangles {678 public:679 680 enum TypeFileMesh {681 AutoMesh=0,BDMesh=1,NOPOMesh=2,amMesh=3,am_fmtMesh=4,amdbaMesh=5,682 ftqMesh=6,mshMesh=7};683 684 int static counter; // to kown the number of mesh in memory685 int OnDisk; // true if on disk686 Geometry & Gh; // Geometry687 Triangles & BTh; // Background Mesh Bth==*this =>no background688 689 Int4 NbRef; // counter of ref on the this class if 0 we can delete690 Int4 nbvx,nbtx; // nombre max de sommets , de triangles691 692 Int4 nt,nbv,nbt,nbiv,nbe; // nb of legal triangles, nb of vertex, of triangles,693 // of initial vertices, of edges with reference,694 Int4 NbOfQuad; // nb of quadrangle695 696 Int4 NbSubDomains; //697 Int4 NbOutT; // Nb of oudeside triangle698 Int4 NbOfTriangleSearchFind;699 Int4 NbOfSwapTriangle;700 char * name, *identity;701 Vertex * vertices; // data of vertices des sommets702 703 Int4 NbVerticesOnGeomVertex;704 VertexOnGeom * VerticesOnGeomVertex;705 706 Int4 NbVerticesOnGeomEdge;707 VertexOnGeom * VerticesOnGeomEdge;708 709 Int4 NbVertexOnBThVertex;710 VertexOnVertex *VertexOnBThVertex;711 712 Int4 NbVertexOnBThEdge;713 VertexOnEdge *VertexOnBThEdge;714 715 716 Int4 NbCrackedVertices;717 718 719 Int4 NbCrackedEdges;720 CrackedEdge *CrackedEdges;721 722 723 R2 pmin,pmax; // extrema724 Real8 coefIcoor; // coef to integer Icoor1;725 726 Triangle * triangles;727 Edge * edges;728 729 QuadTree *quadtree;730 Vertex ** ordre;731 SubDomain * subdomains;732 ListofIntersectionTriangles lIntTria;733 // end of variable734 735 Triangles(Int4 i);//:BTh(*this),Gh(*new Geometry()){PreInit(i);}736 737 738 ~Triangles();739 Triangles(const char * ,Real8=-1) ;740 Triangles(BamgMesh* bamgmesh,BamgOpts* bamgopts);741 742 Triangles(Int4 nbvx,Triangles & BT,int keepBackVertices=1)743 :Gh(BT.Gh),BTh(BT) {744 try {GeomToTriangles1(nbvx,keepBackVertices);}745 catch(...) { this->~Triangles(); throw; } }746 747 Triangles(Int4 nbvx,Geometry & G)748 :Gh(G),BTh(*this){749 try { GeomToTriangles0(nbvx);}750 catch(...) { this->~Triangles(); throw; } }751 Triangles(Triangles &,Geometry * pGh=0,Triangles* pBTh=0,Int4 nbvxx=0 ); // COPY OPERATEUR752 Triangles(const Triangles &,const int *flag,const int *bb); // truncature753 754 void SetIntCoor(const char * from =0);755 756 // void RandomInit();757 // void CubeInit(int ,int);758 759 Real8 MinimalHmin() {return 2.0/coefIcoor;}760 Real8 MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);}761 const Vertex & operator[] (Int4 i) const { return vertices[i];};762 Vertex & operator[](Int4 i) { return vertices[i];};763 const Triangle & operator() (Int4 i) const { return triangles[i];};764 Triangle & operator()(Int4 i) { return triangles[i];};765 I2 toI2(const R2 & P) const {766 return I2( (Icoor1) (coefIcoor*(P.x-pmin.x))767 ,(Icoor1) (coefIcoor*(P.y-pmin.y)) );}768 R2 toR2(const I2 & P) const {769 return R2( (double) P.x/coefIcoor+pmin.x, (double) P.y/coefIcoor+pmin.y);}770 void Add( Vertex & s,Triangle * t,Icoor2 * =0) ;771 void Insert();772 // void InsertOld();773 void ForceBoundary();774 void Heap();775 void FindSubDomain(int );776 Int4 ConsRefTriangle(Int4 *) const;777 void ShowHistogram() const;778 void ShowRegulaty() const; // Add FH avril 2007779 // void ConsLinkTriangle();780 781 void ReMakeTriangleContainingTheVertex();782 void UnMarkUnSwapTriangle();783 void SmoothMetric(Real8 raisonmax) ;784 void BoundAnisotropy(Real8 anisomax,double hminaniso= 1e-100) ;785 void MaxSubDivision(Real8 maxsubdiv);786 Edge** MakeGeometricalEdgeToEdge();787 void SetVertexFieldOn();788 void SetVertexFieldOnBTh();789 Int4 SplitInternalEdgeWithBorderVertices();790 void MakeQuadrangles(double costheta);791 int SplitElement(int choice);792 void MakeQuadTree();793 void NewPoints( Triangles &,int KeepBackVertex =1 );794 Int4 InsertNewPoints(Int4 nbvold,Int4 & NbTSwap) ;795 void NewPoints(int KeepBackVertex=1){ NewPoints(*this,KeepBackVertex);}796 void ReNumberingTheTriangleBySubDomain(bool justcompress=false);797 void ReNumberingVertex(Int4 * renu);798 void SmoothingVertex(int =3,Real8=0.3);799 Metric MetricAt (const R2 &) const;800 GeometricalEdge * ProjectOnCurve( Edge & AB, Vertex & A, Vertex & B,Real8 theta,801 Vertex & R,VertexOnEdge & BR,VertexOnGeom & GR);802 803 Int4 Number(const Triangle & t) const { return &t - triangles;}804 Int4 Number(const Triangle * t) const { return t - triangles;}805 Int4 Number(const Vertex & t) const { return &t - vertices;}806 Int4 Number(const Vertex * t) const { return t - vertices;}807 Int4 Number(const Edge & t) const { return &t - edges;}808 Int4 Number(const Edge * t) const { return t - edges;}809 Int4 Number2(const Triangle * t) const {810 // if(t>= triangles && t < triangles + nbt )811 return t - triangles;812 // else return t - OutSidesTriangles;813 }814 815 Vertex * NearestVertex(Icoor1 i,Icoor1 j) ;816 Triangle * FindTriangleContening(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;817 818 void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts);819 void WriteMesh(BamgMesh* bamgmesh,BamgOpts* bamgopts);820 821 void ReadMetric(BamgOpts* bamgopts,const Real8 hmin,const Real8 hmax,const Real8 coef);822 void WriteMetric(BamgOpts* bamgopts);823 void IntersectConsMetric(const double * s,const Int4 nbsol,const int * typsols,824 const Real8 hmin,const Real8 hmax, const Real8 coef,825 const Real8 anisomax,const Real8 CutOff=1.e-4,const int NbJacobi=1,826 const int DoNormalisation=1,827 const double power=1.0,828 const int choise=0);829 void IntersectGeomMetric(const Real8 err,const int iso);830 831 832 int isCracked() const {return NbCrackedVertices != 0;}833 int Crack();834 int UnCrack();835 836 void ConsGeometry(Real8 =-1.0,int *equiedges=0); // construct a geometry if no geo837 void FillHoleInMesh() ;838 int CrackMesh();839 private:840 void GeomToTriangles1(Int4 nbvx,int KeepBackVertices=1);// the real constructor mesh adaption841 void GeomToTriangles0(Int4 nbvx);// the real constructor mesh generator842 void PreInit(Int4,char * =0 );843 844 }; // End Class Triangles845 846 847 /////////////////////////////////////////////////////////////////////////////////////848 class Geometry {849 public:850 int OnDisk;851 Int4 NbRef; // counter of ref on the this class if 0 we can delete852 853 char *name;854 Int4 nbvx,nbtx; // nombre max de sommets , de Geometry855 Int4 nbv,nbt,nbiv,nbe; // nombre de sommets, de Geometry, de sommets initiaux,856 Int4 NbSubDomains; //857 Int4 NbEquiEdges;858 Int4 NbCrackedEdges;859 // Int4 nbtf;// de triangle frontiere860 Int4 NbOfCurves;861 int empty(){return (nbv ==0) && (nbt==0) && (nbe==0) && (NbSubDomains==0); }862 GeometricalVertex * vertices; // data of vertices des sommets863 Triangle * triangles;864 GeometricalEdge * edges;865 QuadTree *quadtree;866 GeometricalSubDomain *subdomains;867 Curve *curves;868 ~Geometry();869 Geometry(const Geometry & Gh); //Copy Operator870 Geometry(int nbg,const Geometry ** ag); // intersection operator871 872 R2 pmin,pmax; // extrema873 Real8 coefIcoor; // coef to integer Icoor1;874 Real8 MaximalAngleOfCorner;875 876 // end of data877 878 879 I2 toI2(const R2 & P) const {880 return I2( (Icoor1) (coefIcoor*(P.x-pmin.x))881 ,(Icoor1) (coefIcoor*(P.y-pmin.y)) );}882 883 Real8 MinimalHmin() {return 2.0/coefIcoor;}884 Real8 MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);}885 void ReadGeometry(BamgGeom* bamggeom, BamgOpts* bamgopts);886 void EmptyGeometry();887 Geometry() {EmptyGeometry();}// empty Geometry888 void AfterRead();889 Geometry(BamgGeom* bamggeom, BamgOpts* bamgopts) {EmptyGeometry();OnDisk=1;ReadGeometry(bamggeom,bamgopts);AfterRead();}890 891 const GeometricalVertex & operator[] (Int4 i) const { return vertices[i];};892 GeometricalVertex & operator[](Int4 i) { return vertices[i];};893 const GeometricalEdge & operator() (Int4 i) const { return edges[i];};894 GeometricalEdge & operator()(Int4 i) { return edges[i];};895 Int4 Number(const GeometricalVertex & t) const { return &t - vertices;}896 Int4 Number(const GeometricalVertex * t) const { return t - vertices;}897 Int4 Number(const GeometricalEdge & t) const { return &t - edges;}898 Int4 Number(const GeometricalEdge * t) const { return t - edges;}899 Int4 Number(const Curve * c) const { return c - curves;}900 901 void UnMarkEdges() {902 for (Int4 i=0;i<nbe;i++) edges[i].SetUnMark();}903 904 GeometricalEdge * ProjectOnCurve(const Edge & ,Real8,Vertex &,VertexOnGeom &) const ;905 GeometricalEdge * Contening(const R2 P, GeometricalEdge * start) const;906 void WriteGeometry(BamgGeom* bamggeom, BamgOpts* bamgopts);907 }; // End Class Geometry908 909 //From Metric.cpp910 inline Real8 det3x3(Real8 A[3] ,Real8 B[3],Real8 C[3])911 { return A[0] * ( B[1]*C[2]-B[2]*C[1])912 - A[1] * ( B[0]*C[2]-B[2]*C[0])913 + A[2] * ( B[0]*C[1]-B[1]*C[0]);914 }915 916 /////////////////////////////////////////////////////////////////////////////////////917 /////////////////////////////////////////////////////////////////////////////////////918 /////////////////// END CLASS ////////////////////////////////////919 /////////////////////////////////////////////////////////////////////////////////////920 /////////////////////////////////////////////////////////////////////////////////////921 922 inline Triangles::Triangles(Int4 i) :Gh(*new Geometry()),BTh(*this){PreInit(i);}923 924 extern Triangles * CurrentTh;925 926 TriangleAdjacent CloseBoundaryEdge(I2 ,Triangle *, double &,double &) ;927 TriangleAdjacent CloseBoundaryEdgeV2(I2 A,Triangle *t, double &a,double &b);928 929 Int4 FindTriangle(Triangles &Th, Real8 x, Real8 y, double* a,int & inside);930 931 932 933 inline Triangle * Triangle::Quadrangle(Vertex * & v0,Vertex * & v1,Vertex * & v2,Vertex * & v3) const934 {935 // return the other triangle of the quad if a quad or 0 if not a quat936 Triangle * t =0;937 if (link) {938 int a=-1;939 if (aa[0] & 16 ) a=0;940 if (aa[1] & 16 ) a=1;941 if (aa[2] & 16 ) a=2;942 if (a>=0) {943 t = at[a];944 // if (t-this<0) return 0;945 v2 = ns[VerticesOfTriangularEdge[a][0]];946 v0 = ns[VerticesOfTriangularEdge[a][1]];947 v1 = ns[OppositeEdge[a]];948 v3 = t->ns[OppositeEdge[aa[a]&3]];949 }950 }951 return t;952 }953 954 inline double Triangle::QualityQuad(int a,int option) const955 { // first do the logique part956 double q;957 if (!link || aa[a] &4)958 q= -1;959 else {960 Triangle * t = at[a];961 if (t-this<0) q= -1;// because we do 2 times962 else if (!t->link ) q= -1;963 else if (aa[0] & 16 || aa[1] & 16 || aa[2] & 16 || t->aa[0] & 16 || t->aa[1] & 16 || t->aa[2] & 16 )964 q= -1;965 else if(option)966 {967 const Vertex & v2 = *ns[VerticesOfTriangularEdge[a][0]];968 const Vertex & v0 = *ns[VerticesOfTriangularEdge[a][1]];969 const Vertex & v1 = *ns[OppositeEdge[a]];970 const Vertex & v3 = * t->ns[OppositeEdge[aa[a]&3]];971 q = QuadQuality(v0,v1,v2,v3); // do the float part972 }973 else q= 1;974 }975 return q;976 }977 978 979 inline void Vertex::Set(const Vertex & rec,const Triangles & ,Triangles & )980 {981 *this = rec;982 }983 inline void GeometricalVertex::Set(const GeometricalVertex & rec,const Geometry & ,const Geometry & )984 {985 *this = rec;986 }987 inline void Edge::Set(const Triangles & Th ,Int4 i,Triangles & ThNew)988 {989 *this = Th.edges[i];990 v[0] = ThNew.vertices + Th.Number(v[0]);991 v[1] = ThNew.vertices + Th.Number(v[1]);992 if (on)993 on = ThNew.Gh.edges+Th.Gh.Number(on);994 if (adj[0]) adj[0] = ThNew.edges + Th.Number(adj[0]);995 if (adj[1]) adj[1] = ThNew.edges + Th.Number(adj[1]);996 997 }998 inline void GeometricalEdge::Set(const GeometricalEdge & rec,const Geometry & Gh ,Geometry & GhNew)999 {1000 *this = rec;1001 v[0] = GhNew.vertices + Gh.Number(v[0]);1002 v[1] = GhNew.vertices + Gh.Number(v[1]);1003 if (Adj[0]) Adj[0] = GhNew.edges + Gh.Number(Adj[0]);1004 if (Adj[1]) Adj[1] = GhNew.edges + Gh.Number(Adj[1]);1005 }1006 1007 inline void Curve::Set(const Curve & rec,const Geometry & Gh ,Geometry & GhNew)1008 {1009 *this = rec;1010 be = GhNew.edges + Gh.Number(be);1011 ee = GhNew.edges + Gh.Number(ee);1012 if(next) next= GhNew.curves + Gh.Number(next);1013 }1014 1015 inline void Triangle::Set(const Triangle & rec,const Triangles & Th ,Triangles & ThNew)1016 {1017 *this = rec;1018 if ( ns[0] ) ns[0] = ThNew.vertices + Th.Number(ns[0]);1019 if ( ns[1] ) ns[1] = ThNew.vertices + Th.Number(ns[1]);1020 if ( ns[2] ) ns[2] = ThNew.vertices + Th.Number(ns[2]);1021 if(at[0]) at[0] = ThNew.triangles + Th.Number(at[0]);1022 if(at[1]) at[1] = ThNew.triangles + Th.Number(at[1]);1023 if(at[2]) at[2] = ThNew.triangles + Th.Number(at[2]);1024 if (link >= Th.triangles && link < Th.triangles + Th.nbt)1025 link = ThNew.triangles + Th.Number(link);1026 }1027 inline void VertexOnVertex::Set(const Triangles & Th ,Int4 i,Triangles & ThNew)1028 {1029 *this = Th.VertexOnBThVertex[i];1030 v = ThNew.vertices + Th.Number(v);1031 1032 }1033 inline void SubDomain::Set(const Triangles & Th ,Int4 i,Triangles & ThNew)1034 {1035 *this = Th.subdomains[i];1036 if ( head-Th.triangles<0 || head-Th.triangles>=Th.nbt){1037 throw ErrorException(__FUNCT__,exprintf("head-Th.triangles<0 || head-Th.triangles>=Th.nbt"));1038 }1039 head = ThNew.triangles + Th.Number(head) ;1040 if (edge-Th.edges<0 || edge-Th.edges>=Th.nbe);{1041 throw ErrorException(__FUNCT__,exprintf("edge-Th.edges<0 || edge-Th.edges>=Th.nbe"));1042 }1043 edge = ThNew.edges+ Th.Number(edge);1044 }1045 inline void GeometricalSubDomain::Set(const GeometricalSubDomain & rec,const Geometry & Gh ,const Geometry & GhNew)1046 {1047 *this = rec;1048 edge = Gh.Number(edge) + GhNew.edges;1049 }1050 inline void VertexOnEdge::Set(const Triangles & Th ,Int4 i,Triangles & ThNew)1051 {1052 *this = Th.VertexOnBThEdge[i];1053 v = ThNew.vertices + Th.Number(v);1054 }1055 1056 inline void VertexOnGeom::Set(const VertexOnGeom & rec,const Triangles & Th ,Triangles & ThNew)1057 {1058 *this = rec;1059 mv = ThNew.vertices + Th.Number(mv);1060 if (gv)1061 if (abscisse < 0 )1062 gv = ThNew.Gh.vertices + Th.Gh.Number(gv);1063 else1064 ge = ThNew.Gh.edges + Th.Gh.Number(ge);1065 1066 }1067 inline Real8 Edge::MetricLength() const1068 {1069 return LengthInterpole(v[0]->m,v[1]->m,v[1]->r - v[0]->r) ;1070 }1071 1072 inline void Triangles::ReMakeTriangleContainingTheVertex()1073 {1074 register Int4 i;1075 for ( i=0;i<nbv;i++)1076 {1077 vertices[i].vint = 0;1078 vertices[i].t=0;1079 }1080 for ( i=0;i<nbt;i++)1081 triangles[i].SetTriangleContainingTheVertex();1082 }1083 1084 inline void Triangles::UnMarkUnSwapTriangle()1085 {1086 register Int4 i;1087 for ( i=0;i<nbt;i++)1088 for(int j=0;j<3;j++)1089 triangles[i].SetUnMarkUnSwap(j);1090 }1091 1092 inline void Triangles::SetVertexFieldOn()1093 {1094 for (Int4 i=0;i<nbv;i++)1095 vertices[i].on=0;1096 for (Int4 j=0;j<NbVerticesOnGeomVertex;j++ )1097 VerticesOnGeomVertex[j].SetOn();1098 for (Int4 k=0;k<NbVerticesOnGeomEdge;k++ )1099 VerticesOnGeomEdge[k].SetOn();1100 }1101 inline void Triangles::SetVertexFieldOnBTh()1102 {1103 for (Int4 i=0;i<nbv;i++)1104 vertices[i].on=0;1105 for (Int4 j=0;j<NbVertexOnBThVertex;j++ )1106 VertexOnBThVertex[j].SetOnBTh();1107 for (Int4 k=0;k<NbVertexOnBThEdge;k++ )1108 VertexOnBThEdge[k].SetOnBTh();1109 1110 }1111 1112 inline void TriangleAdjacent::SetAdj2(const TriangleAdjacent & ta, int l )1113 { // set du triangle adjacent1114 if(t) {1115 t->at[a]=ta.t;1116 t->aa[a]=ta.a|l;}1117 if(ta.t) {1118 ta.t->at[ta.a] = t ;1119 ta.t->aa[ta.a] = a| l ;1120 }1121 }1122 1123 1124 inline int TriangleAdjacent::Locked() const1125 { return t->aa[a] &4;}1126 inline int TriangleAdjacent::Cracked() const1127 { return t->aa[a] &32;}1128 inline int TriangleAdjacent::GetAllFlag_UnSwap() const1129 { return t->aa[a] & 1012;} // take all flag except MarkUnSwap1130 1131 inline int TriangleAdjacent::MarkUnSwap() const1132 { return t->aa[a] &8;}1133 1134 inline void TriangleAdjacent::SetLock(){ t->SetLocked(a);}1135 1136 inline void TriangleAdjacent::SetCracked() { t->SetCracked(a);}1137 1138 inline TriangleAdjacent TriangleAdjacent::Adj() const1139 { return t->Adj(a);}1140 1141 inline Vertex * TriangleAdjacent::EdgeVertex(const int & i) const1142 {return t->ns[VerticesOfTriangularEdge[a][i]]; }1143 inline Vertex * TriangleAdjacent::OppositeVertex() const1144 {return t->ns[bamg::OppositeVertex[a]]; }1145 inline Icoor2 & TriangleAdjacent::det() const1146 { return t->det;}1147 inline TriangleAdjacent Adj(const TriangleAdjacent & a)1148 { return a.Adj();}1149 1150 inline TriangleAdjacent Next(const TriangleAdjacent & ta)1151 { return TriangleAdjacent(ta.t,NextEdge[ta.a]);}1152 1153 inline TriangleAdjacent Previous(const TriangleAdjacent & ta)1154 { return TriangleAdjacent(ta.t,PreviousEdge[ta.a]);}1155 1156 inline void Adj(GeometricalEdge * & on,int &i)1157 {int j=i;i=on->SensAdj[i];on=on->Adj[j];}1158 1159 inline Real4 qualite(const Vertex &va,const Vertex &vb,const Vertex &vc)1160 {1161 Real4 ret;1162 I2 ia=va,ib=vb,ic=vc;1163 I2 ab=ib-ia,bc=ic-ib,ac=ic-ia;1164 Icoor2 deta=Det(ab,ac);1165 if (deta <=0) ret = -1;1166 else {1167 Real8 a = sqrt((Real8) (ac,ac)),1168 b = sqrt((Real8) (bc,bc)),1169 c = sqrt((Real8) (ab,ab)),1170 p = a+b+c;1171 Real8 h= Max(Max(a,b),c),ro=deta/p;1172 ret = ro/h;}1173 return ret;1174 }1175 1176 1177 inline Triangle::Triangle(Triangles *Th,Int4 i,Int4 j,Int4 k) {1178 Vertex *v=Th->vertices;1179 Int4 nbv = Th->nbv;1180 if (i<0 || j<0 || k<0){1181 throw ErrorException(__FUNCT__,exprintf("i<0 || j<0 || k<0"));1182 }1183 if (i>=nbv || j>=nbv || k>=nbv){1184 throw ErrorException(__FUNCT__,exprintf("i>=nbv || j>=nbv || k>=nbv"));1185 }1186 ns[0]=v+i;1187 ns[1]=v+j;1188 ns[2]=v+k;1189 at[0]=at[1]=at[2]=0;1190 aa[0]=aa[1]=aa[2]=0;1191 det=0;1192 }1193 1194 inline Triangle::Triangle(Vertex *v0,Vertex *v1,Vertex *v2){1195 ns[0]=v0;1196 ns[1]=v1;1197 ns[2]=v2;1198 at[0]=at[1]=at[2]=0;1199 aa[0]=aa[1]=aa[2]=0;1200 if (v0) det=0;1201 else {1202 det=-1;1203 link=NULL;};1204 }1205 1206 inline Real4 Triangle::qualite()1207 {1208 return det < 0 ? -1 : bamg::qualite(*ns[0],*ns[1],*ns[2]);1209 }1210 1211 Int4 inline Vertex::Optim(int i,int koption)1212 {1213 Int4 ret=0;1214 if ( t && (vint >= 0 ) && (vint <3) )1215 {1216 ret = t->Optim(vint,koption);1217 if(!i)1218 {1219 t =0; // for no future optime1220 vint= 0; }1221 }1222 return ret;1223 }1224 1225 Icoor2 inline det(const Vertex & a,const Vertex & b,const Vertex & c)1226 {1227 register Icoor2 bax = b.i.x - a.i.x ,bay = b.i.y - a.i.y;1228 register Icoor2 cax = c.i.x - a.i.x ,cay = c.i.y - a.i.y;1229 return bax*cay - bay*cax;}1230 1231 1232 void swap(Triangle *t1,Int1 a1,1233 Triangle *t2,Int1 a2,1234 Vertex *s1,Vertex *s2,Icoor2 det1,Icoor2 det2);1235 1236 1237 1238 int inline TriangleAdjacent::swap()1239 { return t->swap(a);}1240 1241 1242 1243 int SwapForForcingEdge(Vertex * & pva ,Vertex * & pvb ,1244 TriangleAdjacent & tt1,Icoor2 & dets1,1245 Icoor2 & detsa,Icoor2 & detsb, int & nbswap);1246 1247 int ForceEdge(Vertex &a, Vertex & b,TriangleAdjacent & taret) ;1248 1249 // inline bofbof FH1250 inline TriangleAdjacent FindTriangleAdjacent(Edge &E)1251 {1252 Vertex * a = E.v[0];1253 Vertex * b = E.v[1];1254 1255 Triangle * t = a->t;1256 int i = a->vint;1257 TriangleAdjacent ta(t,EdgesVertexTriangle[i][0]); // Previous edge1258 if (!t || i<0 || i>=3){1259 throw ErrorException(__FUNCT__,exprintf("!t || i<0 !! i>=3"));1260 }1261 if ( a!=(*t)(i)){1262 throw ErrorException(__FUNCT__,exprintf("a!=(*t)(i)"));1263 }1264 int k=0;1265 do { // turn around vertex in direct sens (trigo)1266 k++;1267 if (k>=20000){1268 throw ErrorException(__FUNCT__,exprintf("k>=20000"));1269 }1270 // in no crack => ta.EdgeVertex(1) == a otherwise ???1271 if (ta.EdgeVertex(1) == a && ta.EdgeVertex(0) == b) return ta; // find1272 ta = ta.Adj();1273 if (ta.EdgeVertex(0) == a && ta.EdgeVertex(1) == b) return ta; // find1274 --ta;1275 } while (t != (Triangle *)ta);1276 throw ErrorException(__FUNCT__,exprintf("FindTriangleAdjacent: triangle not found"));1277 return TriangleAdjacent(0,0);//for compiler1278 }1279 1280 inline Vertex * TheVertex(Vertex * a) // give a unique vertex with smallest number1281 { // in case on crack in mesh1282 Vertex * r(a), *rr;1283 Triangle * t = a->t;1284 int i = a->vint;1285 TriangleAdjacent ta(t,EdgesVertexTriangle[i][0]); // Previous edge1286 if (!t || i<0 || i>=3){1287 throw ErrorException(__FUNCT__,exprintf("!t || i<0 !! i>=3"));1288 }1289 if ( a!=(*t)(i)){1290 throw ErrorException(__FUNCT__,exprintf("a!=(*t)(i)"));1291 }1292 int k=0;1293 do { // turn around vertex in direct sens (trigo)1294 k++;1295 if (k>=20000){1296 throw ErrorException(__FUNCT__,exprintf("k>=20000"));1297 }1298 // in no crack => ta.EdgeVertex(1) == a1299 if ((rr=ta.EdgeVertex(0)) < r) r = rr;1300 ta = ta.Adj();1301 if ((rr=ta.EdgeVertex(1)) < r) r =rr;1302 --ta;1303 } while (t != (Triangle*) ta);1304 return r;1305 }1306 1307 inline double CPUtime(){1308 #ifdef SYSTIMES1309 struct tms buf;1310 if (times(&buf)!=-1)1311 return ((double)buf.tms_utime+(double)buf.tms_stime)/(long) sysconf(_SC_CLK_TCK);1312 else1313 #endif1314 return ((double) clock())/CLOCKS_PER_SEC;1315 }1316 1317 }1318 13 #endif /* _BAMGX_H */ -
issm/trunk/src/c/Bamgx/objects/GeometricalEdge.cpp
r2864 r2865 4 4 #include <time.h> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/Geometry.cpp
r2864 r2865 4 4 #include <ctime> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/ListofIntersectionTriangles.cpp
r2864 r2865 4 4 #include <ctime> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/MatVVP2x2.cpp
r2864 r2865 4 4 #include <ctime> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/MetricAnIso.cpp
r2864 r2865 4 4 #include <time.h> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/QuadTree.cpp
r2864 r2865 3 3 #include <stdlib.h> 4 4 5 #include "../ Bamgx.h"5 #include "../Mesh2.h" 6 6 #include "../QuadTree.h" 7 7 -
issm/trunk/src/c/Bamgx/objects/Triangle.cpp
r2864 r2865 4 4 #include <ctime> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/Triangles.cpp
r2864 r2865 4 4 #include <ctime> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Bamgx/objects/Vertex.cpp
r2864 r2865 4 4 #include <ctime> 5 5 6 #include "../ Bamgx.h"6 #include "../Mesh2.h" 7 7 #include "../QuadTree.h" 8 8 #include "../SetOfE4.h" -
issm/trunk/src/c/Makefile.am
r2864 r2865 320 320 ./Bamgx/Bamgx.h\ 321 321 ./Bamgx/Bamgx.cpp\ 322 ./Bamgx/Mesh2.h \ 322 323 ./Bamgx/meshtype.h \ 323 324 ./Bamgx/objects/MatVVP2x2.cpp \ … … 660 661 ./Bamgx/Bamgx.h\ 661 662 ./Bamgx/Bamgx.cpp\ 663 ./Bamgx/Mesh2.h \ 662 664 ./Bamgx/meshtype.h \ 663 665 ./Bamgx/objects/MatVVP2x2.cpp \
Note:
See TracChangeset
for help on using the changeset viewer.