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

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

Renamed several Bamg routines

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