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

Last change on this file since 8722 was 8722, checked in by Mathieu Morlighem, 14 years ago

removed not needed code

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