source: issm/trunk/src/c/objects/Bamg/Mesh.h@ 5143

Last change on this file since 5143 was 5143, checked in by Mathieu Morlighem, 15 years ago

Renamed some Bamg fields and classes

File size: 8.2 KB
RevLine 
[3913]1#ifndef _TRIANGLES_H_
2#define _TRIANGLES_H_
3
4#include "./include.h"
5#include "./BamgOpts.h"
6#include "./BamgMesh.h"
7#include "./BamgGeom.h"
8#include "./Triangle.h"
9#include "./VertexOnGeom.h"
10#include "./VertexOnVertex.h"
11#include "./VertexOnEdge.h"
12#include "./ListofIntersectionTriangles.h"
13
14
15namespace bamg {
16
17 //classes
18 class Geometry;
19 class CrackedEdge;
20 class QuadTree;
21 class SubDomain;
22
[5095]23 class Mesh {
[5120]24
[3913]25 public:
26
[5120]27 Geometry & Gh; // Geometry
28 Mesh & BTh; // Background Mesh Bth== *this =>no background
[5143]29 BamgVertex *vertices;
30 Triangle *triangles;
31 Edge *edges;
32 QuadTree *quadtree;
33 BamgVertex **ordre;
34 SubDomain *subdomains;
[5120]35 long NbRef; // counter of ref on the this class if 0 we can delete
36 long maxnbv,nbtx; // nombre max de sommets , de triangles
37 long nt,nbv,nbt,nbe; // nb of legal triangles, nb of vertex, of triangles, of edges with reference,
38 long NbOfQuad; // nb of quadrangle
39 long NbSubDomains;
40 long NbOutT; // Nb of oudeside triangle
41 long NbOfTriangleSearchFind;
42 long NbOfSwapTriangle;
43 long NbVerticesOnGeomVertex;
44 VertexOnGeom *VerticesOnGeomVertex;
45 long NbVerticesOnGeomEdge;
46 VertexOnGeom *VerticesOnGeomEdge;
47 long NbVertexOnBThVertex;
48 VertexOnVertex *VertexOnBThVertex;
49 long NbVertexOnBThEdge;
50 VertexOnEdge *VertexOnBThEdge;
51 long NbCrackedVertices;
52 long *CrackedVertices;
53 long NbCrackedEdges;
54 CrackedEdge *CrackedEdges;
55 R2 pmin,pmax; // extrema
56 double coefIcoor; // coef to integer Icoor1;
57 ListofIntersectionTriangles lIntTria;
[3913]58
59 //Constructors/Destructors
[5095]60 Mesh(BamgGeom* bamggeom,BamgMesh* bamgmesh,BamgOpts* bamgopts);
61 Mesh(double* index,double* x,double* y,int nods,int nels);
[5120]62 Mesh(Mesh &,Geometry * pGh=0,Mesh* pBTh=0,long maxnbv_in=0 ); //copy operator
[5095]63 Mesh(const Mesh &,const int *flag,const int *bb,BamgOpts* bamgopts); // truncature
[5130]64 Mesh(long maxnbv,Mesh & BT,BamgOpts* bamgopts,int keepBackVertices=1);
65 Mesh(long maxnbv,Geometry & G,BamgOpts* bamgopts);
[5095]66 ~Mesh();
[3913]67
68 //Operators
[5130]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]; };
[3913]73
74 //Methods
75 void SetIntCoor(const char * from =0);
76 double MinimalHmin() {return 2.0/coefIcoor;}
77 double MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);}
78 I2 toI2(const R2 & P) const {
79 return I2( (Icoor1) (coefIcoor*(P.x-pmin.x))
80 ,(Icoor1) (coefIcoor*(P.y-pmin.y)) );}
81 R2 toR2(const I2 & P) const {
82 return R2( (double) P.x/coefIcoor+pmin.x, (double) P.y/coefIcoor+pmin.y);
83 }
[5120]84 void AddVertex(BamgVertex & s,Triangle * t,Icoor2 * =0) ;
[3913]85 void Insert();
86 void ForceBoundary();
87 void FindSubDomain(int OutSide=0);
88 long TriangleReferenceList(long*) const;
89 void TriangleIntNumbering(long* renumbering);
90 void ShowHistogram() const;
91 void CrackMesh(BamgOpts* bamgopts);
92 void ShowRegulaty() const;
93 void SmoothMetric(double raisonmax) ;
94 void BoundAnisotropy(double anisomax,double hminaniso= 1e-100) ;
95 void MaxSubDivision(double maxsubdiv);
96 Edge** MakeGeometricalEdgeToEdge();
97 long SplitInternalEdgeWithBorderVertices();
98 void MakeQuadrangles(double costheta);
99 int SplitElement(int choice);
100 void MakeQuadTree();
[5095]101 void NewPoints(Mesh &,BamgOpts* bamgopts,int KeepVertices=1);
[3913]102 long InsertNewPoints(long nbvold,long & NbTSwap) ;
[5124]103 void TrianglesRenumberBySubDomain(bool justcompress=false);
104 void VerticesRenumber(long * renu);
[3913]105 void SmoothingVertex(int =3,double=0.3);
106 Metric MetricAt (const R2 &) const;
[5120]107 GeometricalEdge* ProjectOnCurve( Edge & AB, BamgVertex & A, BamgVertex & B,double theta, BamgVertex & R,VertexOnEdge & BR,VertexOnGeom & GR);
[3913]108 long Number(const Triangle & t) const { return &t - triangles;}
109 long Number(const Triangle * t) const { return t - triangles;}
[5120]110 long Number(const BamgVertex & t) const { return &t - vertices;}
111 long Number(const BamgVertex * t) const { return t - vertices;}
[3913]112 long Number(const Edge & t) const { return &t - edges;}
113 long Number(const Edge * t) const { return t - edges;}
114 long Number2(const Triangle * t) const { return t - triangles; }
[5120]115 BamgVertex* NearestVertex(Icoor1 i,Icoor1 j) ;
[5124]116 Triangle* TriangleFindFromCoord(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;
[3913]117 void ReadMesh(double* index,double* x,double* y,int nods,int nels);
118 void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts);
119 void WriteMesh(BamgMesh* bamgmesh,BamgOpts* bamgopts);
120 void ReadMetric(const BamgOpts* bamgopts);
121 void WriteMetric(BamgOpts* bamgopts);
122 void AddMetric(BamgOpts* bamgopts);
123 void BuildMetric0(BamgOpts* bamgopts);
124 void BuildMetric1(BamgOpts* bamgopts);
125 void AddGeometryMetric(BamgOpts* bamgopts);
126 int isCracked() const {return NbCrackedVertices != 0;}
127 void BuildGeometryFromMesh(BamgOpts* bamgopts=NULL);
128 void ReconstructExistingMesh();
129
130 //Inline methods
[5124]131 inline void CreateSingleVertexToTriangleConnectivity(){
[3913]132 for (int i=0;i<nbv;i++) vertices[i].vint=0, vertices[i].t=NULL;
[5124]133 for (int i=0;i<nbt;i++) triangles[i].SetSingleVertexToTriangleConnectivity();
[3913]134 }
135 inline void UnMarkUnSwapTriangle(){
136 for (int i=0;i<nbt;i++)
137 for(int j=0;j<3;j++)
138 triangles[i].SetUnMarkUnSwap(j);
139 }
140 inline void SetVertexFieldOn(){
141 for (int i=0;i<nbv;i++) vertices[i].onGeometry=NULL;
142 for (int j=0;j<NbVerticesOnGeomVertex;j++) VerticesOnGeomVertex[j].SetOn();
143 for (int k=0;k<NbVerticesOnGeomEdge;k++ ) VerticesOnGeomEdge[k].SetOn();
144 }
145 inline void SetVertexFieldOnBTh(){
146 for (int i=0;i<nbv;i++) vertices[i].onGeometry=NULL;
147 for (int j=0;j<NbVertexOnBThVertex;j++) VertexOnBThVertex[j].SetOnBTh();
148 for (int k=0;k<NbVertexOnBThEdge;k++ ) VertexOnBThEdge[k].SetOnBTh();
149 }
150
151 private:
[5120]152 void TriangulateFromGeom1(long maxnbv,BamgOpts* bamgopts,int KeepVertices=1);// the real constructor mesh adaption
153 void TriangulateFromGeom0(long maxnbv,BamgOpts* bamgopts);// the real constructor mesh generator
154 void Init(long);
[3913]155 };
156
157 /*Intermediary*/
[5143]158 AdjacentTriangle CloseBoundaryEdge(I2 ,Triangle *, double &,double &) ;
159 AdjacentTriangle CloseBoundaryEdgeV2(I2 A,Triangle *t, double &a,double &b);
[3913]160 void swap(Triangle *t1,short a1,
161 Triangle *t2,short a2,
[5120]162 BamgVertex *s1,BamgVertex *s2,Icoor2 det1,Icoor2 det2);
163 int SwapForForcingEdge(BamgVertex * & pva ,BamgVertex * & pvb ,
[5143]164 AdjacentTriangle & tt1,Icoor2 & dets1,
[3913]165 Icoor2 & detsa,Icoor2 & detsb, int & nbswap);
[5143]166 int ForceEdge(BamgVertex &a, BamgVertex & b,AdjacentTriangle & taret) ;
167 inline AdjacentTriangle Previous(const AdjacentTriangle & ta){
168 return AdjacentTriangle(ta.t,PreviousEdge[ta.a]);
[3913]169 }
[5143]170 inline AdjacentTriangle Next(const AdjacentTriangle & ta){
171 return AdjacentTriangle(ta.t,NextEdge[ta.a]);
[3913]172 }
[5143]173 inline AdjacentTriangle Adj(const AdjacentTriangle & a){
[3913]174 return a.Adj();
175 }
176 inline void Adj(GeometricalEdge * & on,int &i){
177 int j=i;i=on->DirAdj[i];on=on->Adj[j];
178 }
[5120]179 inline double qualite(const BamgVertex &va,const BamgVertex &vb,const BamgVertex &vc){
[3913]180 double ret;
181 I2 ia=va,ib=vb,ic=vc;
182 I2 ab=ib-ia,bc=ic-ib,ac=ic-ia;
183 Icoor2 deta=Det(ab,ac);
184 if (deta <=0) ret = -1;
185 else {
186 double a = sqrt((double) (ac,ac)),
187 b = sqrt((double) (bc,bc)),
188 c = sqrt((double) (ab,ab)),
189 p = a+b+c;
190 double h= Max(Max(a,b),c),ro=deta/p;
191 ret = ro/h;
192 }
193 return ret;
194 }
195
196}
197#endif
Note: See TracBrowser for help on using the repository browser.