Changeset 3263
- Timestamp:
- 03/11/10 15:13:57 (15 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 13 added
- 7 deleted
- 29 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/Bamgx/Bamgx.cpp
r3243 r3263 17 17 #include <stdio.h> 18 18 #include <string.h> 19 #include "BamgObjects.h" 20 #include "objects/QuadTree.h" 19 #include "objects/BamgObjects.h" 21 20 22 21 using namespace bamg; -
issm/trunk/src/c/Bamgx/objects/CrackedEdge.h
r3243 r3263 12 12 #include "Edge.h" 13 13 #include "Triangle.h" 14 #include "../shared/TheVertex.h"15 #include "../shared/FindTriangleAdjacent.h"16 14 17 15 namespace bamg { … … 37 35 38 36 //Methods 39 void Crack(){ 40 Triangle & T(*t); 41 int i0=VerticesOfTriangularEdge[i][0]; 42 int i1=VerticesOfTriangularEdge[i][0]; 43 if (!New[0] && !New[1]){ 44 throw ErrorException(__FUNCT__,exprintf("!New[0] && !New[1]")); 45 } 46 T(i0) = New[0]; 47 T(i1) = New[1]; 48 } 49 void UnCrack(){ 50 Triangle & T(*t); 51 int i0=VerticesOfTriangularEdge[i][0]; 52 int i1=VerticesOfTriangularEdge[i][0]; 53 if (!New[0] && !New[1]){ 54 throw ErrorException(__FUNCT__,exprintf("!New[0] && !New[1]")); 55 } 56 T(i0) = TheVertex(T(i0)); 57 T(i1) = TheVertex(T(i1)); 58 } 59 void Set() { 60 TriangleAdjacent ta ( FindTriangleAdjacent(*edge)); 61 t = ta; 62 i = ta; 63 64 New[0] = ta.EdgeVertex(0); 65 New[1] = ta.EdgeVertex(1); 66 // warning the ref 67 } 37 void Crack(); 38 void UnCrack(); 39 void Set(); 68 40 }; 69 41 … … 77 49 78 50 //Methods 79 void Crack() { a.Crack(); b.Crack();}80 void UnCrack() { a.UnCrack(); b.UnCrack();}81 void Set() { a.Set(), b.Set();}51 void Crack(); 52 void UnCrack(); 53 void Set(); 82 54 }; 55 56 /*Intermediary*/ 57 inline TriangleAdjacent FindTriangleAdjacent(Edge &E){ 58 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp)*/ 59 60 Vertex * a = E.v[0]; 61 Vertex * b = E.v[1]; 62 63 Triangle * t = a->t; 64 int i = a->vint; 65 TriangleAdjacent ta(t,EdgesVertexTriangle[i][0]); // Previous edge 66 if (!t || i<0 || i>=3){ 67 throw ErrorException(__FUNCT__,exprintf("!t || i<0 !! i>=3")); 68 } 69 if ( a!=(*t)(i)){ 70 throw ErrorException(__FUNCT__,exprintf("a!=(*t)(i)")); 71 } 72 int k=0; 73 do { // turn around vertex in direct sens (trigo) 74 k++; 75 if (k>=20000){ 76 throw ErrorException(__FUNCT__,exprintf("k>=20000")); 77 } 78 // in no crack => ta.EdgeVertex(1) == a otherwise ??? 79 if (ta.EdgeVertex(1) == a && ta.EdgeVertex(0) == b) return ta; // find 80 ta = ta.Adj(); 81 if (ta.EdgeVertex(0) == a && ta.EdgeVertex(1) == b) return ta; // find 82 --ta; 83 } while (t != (Triangle *)ta); 84 throw ErrorException(__FUNCT__,exprintf("FindTriangleAdjacent: triangle not found")); 85 return TriangleAdjacent(0,0);//for compiler 86 } 87 inline Vertex* TheVertex(Vertex * a){// for remove crak in mesh 88 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp)*/ 89 90 // give a unique vertex with smallest number 91 // in case on crack in mesh 92 Vertex * r(a), *rr; 93 Triangle * t = a->t; 94 int i = a->vint; 95 TriangleAdjacent ta(t,EdgesVertexTriangle[i][0]); // Previous edge 96 if (!t || i<0 || i>=3){ 97 throw ErrorException(__FUNCT__,exprintf("!t || i<0 !! i>=3")); 98 } 99 if ( a!=(*t)(i)){ 100 throw ErrorException(__FUNCT__,exprintf("a!=(*t)(i)")); 101 } 102 int k=0; 103 do { // turn around vertex in direct sens (trigo) 104 k++; 105 if (k>=20000){ 106 throw ErrorException(__FUNCT__,exprintf("k>=20000")); 107 } 108 // in no crack => ta.EdgeVertex(1) == a 109 if ((rr=ta.EdgeVertex(0)) < r) r = rr; 110 ta = ta.Adj(); 111 if ((rr=ta.EdgeVertex(1)) < r) r =rr; 112 --ta; 113 } while (t != (Triangle*) ta); 114 return r; 115 } 83 116 84 117 } -
issm/trunk/src/c/Bamgx/objects/Curve.h
r3232 r3263 25 25 Curve() : be(0),ee(0),kb(0),ke(0),next(0),master(true) {} 26 26 void Reverse() { Exchange(be,ee); Exchange(kb,ke);} // revese the sens of the curse 27 28 //Inline methods 29 inline void Set(const Curve & rec,const Geometry & Th ,Geometry & ThNew); 27 void Set(const Curve & rec,const Geometry & Th ,Geometry & ThNew); 30 28 }; 31 29 -
issm/trunk/src/c/Bamgx/objects/Direction.h
r3232 r3263 13 13 //Methods 14 14 Direction(): dir(MaxICoor){}; // no direction set 15 Direction(Icoor1 i,Icoor1 j) { 16 Icoor2 n2 = 2*(Abs(i)+Abs(j)); 17 Icoor2 r = MaxICoor* (Icoor2) i; 18 Icoor1 r1 = (Icoor1) (2*(r/ n2)); // odd number 19 dir = (j>0) ? r1 : r1+1; // odd-> j>0 even-> j<0 20 } 21 int sens(Icoor1 i,Icoor1 j) { 22 int r =1; 23 if (dir!= MaxICoor) { 24 Icoor2 x(dir/2),y1(MaxICoor/2-Abs(x)),y(dir%2?-y1:y1); 25 r = (x*i + y*j) >=0; 26 } 27 return r; 28 } 15 Direction(Icoor1 i,Icoor1 j); 16 int sens(Icoor1 i,Icoor1 j); 29 17 }; 30 18 } -
issm/trunk/src/c/Bamgx/objects/Edge.h
r3243 r3263 45 45 return adj[0]==&e ? 0 : 1; 46 46 } 47 48 //Inline methods 49 inline void Set(const Triangles &,long,Triangles &); 47 void Set(const Triangles &,long,Triangles &); 50 48 51 49 }; -
issm/trunk/src/c/Bamgx/objects/GeometricalEdge.cpp
r3246 r3263 5 5 6 6 #include "GeometricalEdge.h" 7 #include "Geometry.h" 7 8 8 9 #undef __FUNCT__ … … 133 134 } 134 135 /*}}}1*/ 136 /*FUNCTION GeometricalEdge::Set {{{1*/ 137 void GeometricalEdge::Set(const GeometricalEdge & rec,const Geometry & Gh ,Geometry & GhNew){ 138 *this = rec; 139 v[0] = GhNew.vertices + Gh.Number(v[0]); 140 v[1] = GhNew.vertices + Gh.Number(v[1]); 141 if (Adj[0]) Adj[0] = GhNew.edges + Gh.Number(Adj[0]); 142 if (Adj[1]) Adj[1] = GhNew.edges + Gh.Number(Adj[1]); 143 } 144 /*}}}*/ 135 145 136 146 } -
issm/trunk/src/c/Bamgx/objects/GeometricalEdge.h
r3243 r3263 55 55 void SetRequired() { flag |= 64;} 56 56 void SetReverseEqui() {flag |= 128;} 57 58 //Inline methods 59 inline void Set(const GeometricalEdge & rec,const Geometry & Th ,Geometry & ThNew); 57 void Set(const GeometricalEdge & rec,const Geometry & Th ,Geometry & ThNew); 60 58 }; 61 59 -
issm/trunk/src/c/Bamgx/objects/GeometricalSubDomain.h
r3243 r3263 21 21 long ref; 22 22 23 // Inline methods24 inlinevoid Set(const GeometricalSubDomain &,const Geometry & ,const Geometry &);23 //Methods 24 void Set(const GeometricalSubDomain &,const Geometry & ,const Geometry &); 25 25 }; 26 26 -
issm/trunk/src/c/Bamgx/objects/GeometricalVertex.h
r3252 r3263 8 8 9 9 #include "../meshtype.h" 10 #include "Vertex.h" 10 11 11 12 namespace bamg { … … 22 23 GeometricalVertex* link; // link all the same GeometricalVertex circular (Crack) 23 24 25 //Constructors 26 GeometricalVertex() :cas(0), link(this) {}; 27 24 28 //Methods 25 int Corner() const {return cas&4;} 26 int Required()const {return cas&6;}// a corner is required 27 int IsThe() const { return link == this;} 28 void SetCorner(){ cas |= 4;} 29 void SetRequired(){ cas |= 2;} 30 void Set(){cas=0;} 31 GeometricalVertex() :cas(0), link(this) {}; 32 GeometricalVertex* The() { 33 if (!link){ throw ErrorException(__FUNCT__,exprintf("!link"));} 34 return link; 35 }// return a unique vertex 29 int Corner() const; 30 int Required()const; 31 int IsThe() const; 32 void SetCorner(); 33 void SetRequired(); 34 void Set(); 35 GeometricalVertex* The(); 36 36 37 37 //Inline methods 38 inline void Set(const GeometricalVertex & rec,const Geometry & ,const Geometry & ){ 39 *this =rec;38 inline void Set(const GeometricalVertex & rec,const Geometry & ,const Geometry & ){ 39 *this=rec; 40 40 } 41 41 }; -
issm/trunk/src/c/Bamgx/objects/Geometry.cpp
r3246 r3263 4 4 #include <ctime> 5 5 6 #include " ../BamgObjects.h"6 #include "BamgObjects.h" 7 7 8 8 #undef __FUNCT__ -
issm/trunk/src/c/Bamgx/objects/ListofIntersectionTriangles.cpp
r3246 r3263 4 4 #include <ctime> 5 5 6 #include " ../BamgObjects.h"6 #include "BamgObjects.h" 7 7 #include "../shared/shared.h" 8 8 -
issm/trunk/src/c/Bamgx/objects/QuadTree.cpp
r3246 r3263 4 4 5 5 //#include "QuadTree.h" 6 #include " ../BamgObjects.h"6 #include "BamgObjects.h" 7 7 8 8 #undef __FUNCT__ … … 11 11 namespace bamg { 12 12 13 / /INTER_SEG(a,b,x,y) returns 1 if [x y] is included in [a b]13 /*MACROS {{{1*/ 14 14 #define INTER_SEG(a,b,x,y) (((y) > (a)) && ((x) <(b))) 15 //ABS(i) retruns |i|16 15 #define ABS(i) ((i)<0 ?-(i) :(i)) 17 //MAX1(i,j) returns max(i,j)18 16 #define MAX1(i,j) ((i)>(j) ?(i) :(j)) 19 //NORM(i1,j1,i2,j2) returns max(|i1-j1|,|i2-j2|)20 17 #define NORM(i1,j1,i2,j2) MAX1(ABS((i1)-(j1)),ABS((i2)-(j2))) 21 18 //IJ(i,j,l) returns the box number of i and j with respect to l … … 29 26 //J_IJ(k,l) returns l if second bit of k is 1, else 0 30 27 #define J_IJ(k,l) ((k&2) ? l:0) 31 32 /* What is a QuadTree?28 /*}}}*/ 29 /*DOCUMENTATION What is a QuadTree? {{{1 33 30 * A Quadtree is a very simple way to group the vertices according 34 31 * to their location. A square that holds all the points of the mesh … … 76 73 * Using the binaries is therefor very easy to locate a vertex in a box: 77 74 * we just need to look at the bits from the left to the right (See ::Add) 78 */75 }}}1*/ 79 76 80 77 /*Constructors/Destructors*/ -
issm/trunk/src/c/Bamgx/objects/SetOfE4.cpp
r3246 r3263 1 1 2 #include " ../BamgObjects.h"2 #include "BamgObjects.h" 3 3 4 4 #undef __FUNCT__ -
issm/trunk/src/c/Bamgx/objects/SubDomain.h
r3243 r3263 23 23 Edge* edge; // to geometrical 24 24 25 // Inline methods26 inlinevoid Set(const Triangles &,long,Triangles &);25 //Methods 26 void Set(const Triangles &,long,Triangles &); 27 27 }; 28 28 -
issm/trunk/src/c/Bamgx/objects/Triangle.cpp
r3246 r3263 4 4 #include <ctime> 5 5 6 #include " ../BamgObjects.h"6 #include "BamgObjects.h" 7 7 #include "../shared/shared.h" 8 8 … … 12 12 namespace bamg { 13 13 14 /*Constructors/Destructors*/ 15 /*FUNCTION Triangle(Triangles *Th,long i,long j,long k) {{{1*/ 16 Triangle::Triangle(Triangles *Th,long i,long j,long k) { 17 Vertex *v=Th->vertices; 18 long nbv = Th->nbv; 19 if (i<0 || j<0 || k<0){ 20 throw ErrorException(__FUNCT__,exprintf("i<0 || j<0 || k<0")); 21 } 22 if (i>=nbv || j>=nbv || k>=nbv){ 23 throw ErrorException(__FUNCT__,exprintf("i>=nbv || j>=nbv || k>=nbv")); 24 } 25 TriaVertices[0]=v+i; 26 TriaVertices[1]=v+j; 27 TriaVertices[2]=v+k; 28 TriaAdjTriangles[0]=TriaAdjTriangles[1]=TriaAdjTriangles[2]=0; 29 TriaAdjSharedEdge[0]=TriaAdjSharedEdge[1]=TriaAdjSharedEdge[2]=0; 30 det=0; 31 } 32 /*}}}*/ 33 /*FUNCTION Triangle(Vertex *v0,Vertex *v1,Vertex *v2) {{{1*/ 34 Triangle::Triangle(Vertex *v0,Vertex *v1,Vertex *v2){ 35 TriaVertices[0]=v0; 36 TriaVertices[1]=v1; 37 TriaVertices[2]=v2; 38 TriaAdjTriangles[0]=TriaAdjTriangles[1]=TriaAdjTriangles[2]=0; 39 TriaAdjSharedEdge[0]=TriaAdjSharedEdge[1]=TriaAdjSharedEdge[2]=0; 40 if (v0) det=0; 41 else { 42 det=-1; 43 link=NULL;}; 44 } 45 /*}}}*/ 46 14 47 /*Methods*/ 48 /*FUNCTION Triangle::Echo {{{1*/ 49 void Triangle::Echo(void){ 50 51 int i; 52 53 printf("Triangle:\n"); 54 printf(" TriaVertices pointer towards three vertices\n"); 55 printf(" TriaVertices[0] TriaVertices[1] TriaVertices[2] = %p %p %p\n",TriaVertices[0],TriaVertices[1],TriaVertices[2]); 56 printf(" TriaAdjTriangles pointer towards three adjacent triangles\n"); 57 printf(" TriaAdjTriangles[0] TriaAdjTriangles[1] TriaAdjTriangles[2] = %p %p %p\n",TriaAdjTriangles[0],TriaAdjTriangles[1],TriaAdjTriangles[2]); 58 printf(" det (integer triangle determinant) = %i\n",det); 59 if (link){ 60 printf(" link (pointer toward duplicate triangle)= %p\n",link); 61 } 62 else{ 63 printf(" color = %i\n",color); 64 } 65 66 printf("\nThree vertices:\n"); 67 for(i=0;i<3;i++){ 68 if (TriaVertices[i]){ 69 TriaVertices[i]->Echo(); 70 } 71 else{ 72 printf(" vertex %i does not exist\n",i+1); 73 } 74 } 75 76 return; 77 } 78 /*}}}*/ 15 79 /*FUNCTION Triangle::FindBoundaryEdge{{{1*/ 16 80 TriangleAdjacent Triangle::FindBoundaryEdge(int i) const{ … … 60 124 } 61 125 /*}}}1*/ 62 /*FUNCTION Triangle::Echo {{{1*/63 void Triangle::Echo(void){64 65 int i;66 67 printf("Triangle:\n");68 printf(" TriaVertices pointer towards three vertices\n");69 printf(" TriaVertices[0] TriaVertices[1] TriaVertices[2] = %p %p %p\n",TriaVertices[0],TriaVertices[1],TriaVertices[2]);70 printf(" TriaAdjTriangles pointer towards three adjacent triangles\n");71 printf(" TriaAdjTriangles[0] TriaAdjTriangles[1] TriaAdjTriangles[2] = %p %p %p\n",TriaAdjTriangles[0],TriaAdjTriangles[1],TriaAdjTriangles[2]);72 printf(" det (integer triangle determinant) = %i\n",det);73 if (link){74 printf(" link (pointer toward duplicate triangle)= %p\n",link);75 }76 else{77 printf(" color = %i\n",color);78 }79 80 printf("\nThree vertices:\n");81 for(i=0;i<3;i++){82 if (TriaVertices[i]){83 TriaVertices[i]->Echo();84 }85 else{86 printf(" vertex %i does not exist\n",i+1);87 }88 }89 90 return;91 }92 /*}}}*/93 126 /*FUNCTION Triangle::Optim{{{1*/ 94 127 long Triangle::Optim(short i,int koption) { … … 124 157 } 125 158 /*}}}1*/ 159 /*FUNCTION Triangle::Quadrangle {{{1*/ 160 Triangle* Triangle::Quadrangle(Vertex * & v0,Vertex * & v1,Vertex * & v2,Vertex * & v3) const{ 161 // return the other triangle of the quad if a quad or 0 if not a quat 162 Triangle * t =0; 163 if (link) { 164 int a=-1; 165 if (TriaAdjSharedEdge[0] & 16 ) a=0; 166 if (TriaAdjSharedEdge[1] & 16 ) a=1; 167 if (TriaAdjSharedEdge[2] & 16 ) a=2; 168 if (a>=0) { 169 t = TriaAdjTriangles[a]; 170 // if (t-this<0) return 0; 171 v2 = TriaVertices[VerticesOfTriangularEdge[a][0]]; 172 v0 = TriaVertices[VerticesOfTriangularEdge[a][1]]; 173 v1 = TriaVertices[OppositeEdge[a]]; 174 v3 = t->TriaVertices[OppositeEdge[TriaAdjSharedEdge[a]&3]]; 175 } 176 } 177 return t; 178 } 179 /*}}}*/ 180 /*FUNCTION Triangle::QualityQuad {{{1*/ 181 double Triangle::QualityQuad(int a,int option) const{ 182 double q; 183 if (!link || TriaAdjSharedEdge[a] &4) 184 q= -1; 185 else { 186 Triangle * t = TriaAdjTriangles[a]; 187 if (t-this<0) q= -1;// because we do 2 times 188 else if (!t->link ) q= -1; 189 else if (TriaAdjSharedEdge[0] & 16 || TriaAdjSharedEdge[1] & 16 || TriaAdjSharedEdge[2] & 16 || t->TriaAdjSharedEdge[0] & 16 || t->TriaAdjSharedEdge[1] & 16 || t->TriaAdjSharedEdge[2] & 16 ) 190 q= -1; 191 else if(option){ 192 const Vertex & v2 = *TriaVertices[VerticesOfTriangularEdge[a][0]]; 193 const Vertex & v0 = *TriaVertices[VerticesOfTriangularEdge[a][1]]; 194 const Vertex & v1 = *TriaVertices[OppositeEdge[a]]; 195 const Vertex & v3 = * t->TriaVertices[OppositeEdge[TriaAdjSharedEdge[a]&3]]; 196 q = QuadQuality(v0,v1,v2,v3); // do the float part 197 } 198 else q= 1; 199 } 200 return q; 201 } 202 /*}}}*/ 203 /*FUNCTION Triangle::Set {{{1*/ 204 void Triangle::Set(const Triangle & rec,const Triangles & Th ,Triangles & ThNew){ 205 *this = rec; 206 if ( TriaVertices[0] ) TriaVertices[0] = ThNew.vertices + Th.Number(TriaVertices[0]); 207 if ( TriaVertices[1] ) TriaVertices[1] = ThNew.vertices + Th.Number(TriaVertices[1]); 208 if ( TriaVertices[2] ) TriaVertices[2] = ThNew.vertices + Th.Number(TriaVertices[2]); 209 if(TriaAdjTriangles[0]) TriaAdjTriangles[0] = ThNew.triangles + Th.Number(TriaAdjTriangles[0]); 210 if(TriaAdjTriangles[1]) TriaAdjTriangles[1] = ThNew.triangles + Th.Number(TriaAdjTriangles[1]); 211 if(TriaAdjTriangles[2]) TriaAdjTriangles[2] = ThNew.triangles + Th.Number(TriaAdjTriangles[2]); 212 if (link >= Th.triangles && link < Th.triangles + Th.nbt) 213 link = ThNew.triangles + Th.Number(link); 214 } 215 /*}}}*/ 126 216 /*FUNCTION Triangle::swap{{{1*/ 127 217 int Triangle::swap(short a,int koption){ … … 226 316 OnSwap = som < 2; 227 317 break; 228 318 } 229 319 230 320 } // OnSwap -
issm/trunk/src/c/Bamgx/objects/Triangle.h
r3243 r3263 126 126 127 127 //Inline methods 128 inlinedouble qualite() ;129 inlinevoid Set(const Triangle &,const Triangles &,Triangles &);130 in line int In(Vertex *v) const { return TriaVertices[0]==v || TriaVertices[1]==v || TriaVertices[2]==v ;}128 double qualite() ; 129 void Set(const Triangle &,const Triangles &,Triangles &); 130 int In(Vertex *v) const { return TriaVertices[0]==v || TriaVertices[1]==v || TriaVertices[2]==v ;} 131 131 132 132 }; -
issm/trunk/src/c/Bamgx/objects/TriangleAdjacent.h
r3232 r3263 33 33 34 34 //Methods 35 int swap();36 35 37 // Inline methods38 in line TriangleAdjacent Adj() const;39 in line void SetAdj2(const TriangleAdjacent& , int =0);40 in line Vertex * EdgeVertex(const int &) const;41 in line Vertex * OppositeVertex() const;42 inline Icoor2 & det() const;43 inline int Locked() const;44 inline int GetAllFlag_UnSwap() const;45 in line void SetLock();46 inline int MarkUnSwap()const;47 inline void SetMarkUnSwap();48 inline void SetCracked();49 inline int Cracked() const;36 //Methods 37 int Locked() const; 38 int MarkUnSwap() const; 39 int Cracked() const; 40 int GetAllFlag_UnSwap() const; 41 void SetLock(); 42 void SetCracked(); 43 void SetAdj2(const TriangleAdjacent &ta, int l=0); 44 int swap(); 45 TriangleAdjacent Adj() const; 46 Vertex* EdgeVertex(const int & i) const; 47 Vertex* OppositeVertex() const; 48 Icoor2& det() const; 50 49 }; 51 50 } -
issm/trunk/src/c/Bamgx/objects/Triangles.cpp
r3252 r3263 4 4 #include <ctime> 5 5 6 #include " ../BamgObjects.h"6 #include "BamgObjects.h" 7 7 #include "../shared/shared.h" 8 8 #include "QuadTree.h" … … 5421 5421 5422 5422 /*Intermediary*/ 5423 /*FUNCTION swap{{{1*/5424 void swap(Triangle *t1,short a1, Triangle *t2,short a2, Vertex *s1,Vertex *s2,Icoor2 det1,Icoor2 det2){5425 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/swap)*/5426 // --------------------------------------------------------------5427 // short a2=aa[a];// les 2 numero de l arete dans les 2 triangles5428 //5429 // sb sb5430 // / | \ / \ !5431 // as1/ | \ /a2 \ !5432 // / | \ / t2 \ !5433 // s1 /t1 | t2 \s2 --> s1 /___as2___\s2 !5434 // \ a1|a2 / \ as1 /5435 // \ | / \ t1 /5436 // \ | / as2 \ a1/5437 // \ | / \ /5438 // sa sa5439 // -------------------------------------------------------------5440 int as1 = NextEdge[a1];5441 int as2 = NextEdge[a2];5442 int ap1 = PreviousEdge[a1];5443 int ap2 = PreviousEdge[a2];5444 (*t1)(VerticesOfTriangularEdge[a1][1]) = s2 ; // avant sb5445 (*t2)(VerticesOfTriangularEdge[a2][1]) = s1 ; // avant sa5446 // mise a jour des 2 adjacences externes5447 TriangleAdjacent taas1 = t1->Adj(as1),5448 taas2 = t2->Adj(as2),5449 tas1(t1,as1), tas2(t2,as2),5450 ta1(t1,a1),ta2(t2,a2);5451 // externe haut gauche5452 taas1.SetAdj2(ta2, taas1.GetAllFlag_UnSwap());5453 // externe bas droite5454 taas2.SetAdj2(ta1, taas2.GetAllFlag_UnSwap());5455 // remove the Mark UnMarkSwap5456 t1->SetUnMarkUnSwap(ap1);5457 t2->SetUnMarkUnSwap(ap2);5458 // interne5459 tas1.SetAdj2(tas2);5460 5461 t1->det = det1;5462 t2->det = det2;5463 5464 t1->SetTriangleContainingTheVertex();5465 t2->SetTriangleContainingTheVertex();5466 } // end swap5467 /*}}}1*/5468 5423 /*FUNCTION CloseBoundaryEdge{{{1*/ 5469 5424 TriangleAdjacent CloseBoundaryEdge(I2 A,Triangle *t, double &a,double &b) { … … 5655 5610 } 5656 5611 /*}}}1*/ 5612 /*FUNCTION ForceEdge{{{1*/ 5613 int ForceEdge(Vertex &a, Vertex & b,TriangleAdjacent & taret) { 5614 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ForceEdge)*/ 5615 5616 int NbSwap =0; 5617 if (!a.t || !b.t){ // the 2 vertex is in a mesh 5618 throw ErrorException(__FUNCT__,exprintf("!a.t || !b.t")); 5619 } 5620 int k=0; 5621 taret=TriangleAdjacent(0,0); // erreur 5622 5623 TriangleAdjacent tta(a.t,EdgesVertexTriangle[a.vint][0]); 5624 Vertex *v1, *v2 = tta.EdgeVertex(0),*vbegin =v2; 5625 // we turn around a in the direct sens 5626 5627 Icoor2 det2 = v2 ? det(*v2,a,b): -1 , det1; 5628 if(v2) // normal case 5629 det2 = det(*v2,a,b); 5630 else { // no chance infini vertex try the next 5631 tta= Previous(Adj(tta)); 5632 v2 = tta.EdgeVertex(0); 5633 vbegin =v2; 5634 if (!v2){ 5635 throw ErrorException(__FUNCT__,exprintf("!v2")); 5636 } 5637 det2 = det(*v2,a,b); 5638 } 5639 5640 while (v2 != &b) { 5641 TriangleAdjacent tc = Previous(Adj(tta)); 5642 v1 = v2; 5643 v2 = tc.EdgeVertex(0); 5644 det1 = det2; 5645 det2 = v2 ? det(*v2,a,b): det2; 5646 5647 if((det1 < 0) && (det2 >0)) { 5648 // try to force the edge 5649 Vertex * va = &a, *vb = &b; 5650 tc = Previous(tc); 5651 if (!v1 || !v2){ 5652 throw ErrorException(__FUNCT__,exprintf("!v1 || !v2")); 5653 } 5654 Icoor2 detss = 0,l=0,ks; 5655 while ((ks=SwapForForcingEdge( va, vb, tc, detss, det1,det2,NbSwap))) 5656 if(l++ > 10000000) { 5657 throw ErrorException(__FUNCT__,exprintf("Loop in forcing Egde, nb de swap=%i, nb of try swap (%i) too big",NbSwap,l)); 5658 } 5659 Vertex *aa = tc.EdgeVertex(0), *bb = tc.EdgeVertex(1); 5660 if (( aa == &a ) && (bb == &b) || (bb == &a ) && (aa == &b)) { 5661 tc.SetLock(); 5662 a.Optim(1,0); 5663 b.Optim(1,0); 5664 taret = tc; 5665 return NbSwap; 5666 } 5667 else 5668 { 5669 taret = tc; 5670 return -2; // error boundary is crossing 5671 } 5672 } 5673 tta = tc; 5674 k++; 5675 if (k>=2000){ 5676 throw ErrorException(__FUNCT__,exprintf("k>=2000")); 5677 } 5678 if ( vbegin == v2 ) return -1;// error 5679 } 5680 5681 tta.SetLock(); 5682 taret=tta; 5683 a.Optim(1,0); 5684 b.Optim(1,0); 5685 return NbSwap; 5686 } 5687 /*}}}1*/ 5688 /*FUNCTION swap{{{1*/ 5689 void swap(Triangle *t1,short a1, Triangle *t2,short a2, Vertex *s1,Vertex *s2,Icoor2 det1,Icoor2 det2){ 5690 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/swap)*/ 5691 // -------------------------------------------------------------- 5692 // short a2=aa[a];// les 2 numero de l arete dans les 2 triangles 5693 // 5694 // sb sb 5695 // / | \ / \ ! 5696 // as1/ | \ /a2 \ ! 5697 // / | \ / t2 \ ! 5698 // s1 /t1 | t2 \s2 --> s1 /___as2___\s2 ! 5699 // \ a1|a2 / \ as1 / 5700 // \ | / \ t1 / 5701 // \ | / as2 \ a1/ 5702 // \ | / \ / 5703 // sa sa 5704 // ------------------------------------------------------------- 5705 int as1 = NextEdge[a1]; 5706 int as2 = NextEdge[a2]; 5707 int ap1 = PreviousEdge[a1]; 5708 int ap2 = PreviousEdge[a2]; 5709 (*t1)(VerticesOfTriangularEdge[a1][1]) = s2 ; // avant sb 5710 (*t2)(VerticesOfTriangularEdge[a2][1]) = s1 ; // avant sa 5711 // mise a jour des 2 adjacences externes 5712 TriangleAdjacent taas1 = t1->Adj(as1), 5713 taas2 = t2->Adj(as2), 5714 tas1(t1,as1), tas2(t2,as2), 5715 ta1(t1,a1),ta2(t2,a2); 5716 // externe haut gauche 5717 taas1.SetAdj2(ta2, taas1.GetAllFlag_UnSwap()); 5718 // externe bas droite 5719 taas2.SetAdj2(ta1, taas2.GetAllFlag_UnSwap()); 5720 // remove the Mark UnMarkSwap 5721 t1->SetUnMarkUnSwap(ap1); 5722 t2->SetUnMarkUnSwap(ap2); 5723 // interne 5724 tas1.SetAdj2(tas2); 5725 5726 t1->det = det1; 5727 t2->det = det2; 5728 5729 t1->SetTriangleContainingTheVertex(); 5730 t2->SetTriangleContainingTheVertex(); 5731 } // end swap 5732 /*}}}1*/ 5657 5733 /*FUNCTION SwapForForcingEdge{{{1*/ 5658 5734 int SwapForForcingEdge(Vertex * & pva ,Vertex * & pvb ,TriangleAdjacent & tt1,Icoor2 & dets1, Icoor2 & detsa,Icoor2 & detsb, int & NbSwap) { … … 5743 5819 } 5744 5820 /*}}}1*/ 5745 /*FUNCTION ForceEdge{{{1*/5746 int ForceEdge(Vertex &a, Vertex & b,TriangleAdjacent & taret) {5747 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/ForceEdge)*/5748 5749 int NbSwap =0;5750 if (!a.t || !b.t){ // the 2 vertex is in a mesh5751 throw ErrorException(__FUNCT__,exprintf("!a.t || !b.t"));5752 }5753 int k=0;5754 taret=TriangleAdjacent(0,0); // erreur5755 5756 TriangleAdjacent tta(a.t,EdgesVertexTriangle[a.vint][0]);5757 Vertex *v1, *v2 = tta.EdgeVertex(0),*vbegin =v2;5758 // we turn around a in the direct sens5759 5760 Icoor2 det2 = v2 ? det(*v2,a,b): -1 , det1;5761 if(v2) // normal case5762 det2 = det(*v2,a,b);5763 else { // no chance infini vertex try the next5764 tta= Previous(Adj(tta));5765 v2 = tta.EdgeVertex(0);5766 vbegin =v2;5767 if (!v2){5768 throw ErrorException(__FUNCT__,exprintf("!v2"));5769 }5770 det2 = det(*v2,a,b);5771 }5772 5773 while (v2 != &b) {5774 TriangleAdjacent tc = Previous(Adj(tta));5775 v1 = v2;5776 v2 = tc.EdgeVertex(0);5777 det1 = det2;5778 det2 = v2 ? det(*v2,a,b): det2;5779 5780 if((det1 < 0) && (det2 >0)) {5781 // try to force the edge5782 Vertex * va = &a, *vb = &b;5783 tc = Previous(tc);5784 if (!v1 || !v2){5785 throw ErrorException(__FUNCT__,exprintf("!v1 || !v2"));5786 }5787 Icoor2 detss = 0,l=0,ks;5788 while ((ks=SwapForForcingEdge( va, vb, tc, detss, det1,det2,NbSwap)))5789 if(l++ > 10000000) {5790 throw ErrorException(__FUNCT__,exprintf("Loop in forcing Egde, nb de swap=%i, nb of try swap (%i) too big",NbSwap,l));5791 }5792 Vertex *aa = tc.EdgeVertex(0), *bb = tc.EdgeVertex(1);5793 if (( aa == &a ) && (bb == &b) || (bb == &a ) && (aa == &b)) {5794 tc.SetLock();5795 a.Optim(1,0);5796 b.Optim(1,0);5797 taret = tc;5798 return NbSwap;5799 }5800 else5801 {5802 taret = tc;5803 return -2; // error boundary is crossing5804 }5805 }5806 tta = tc;5807 k++;5808 if (k>=2000){5809 throw ErrorException(__FUNCT__,exprintf("k>=2000"));5810 }5811 if ( vbegin == v2 ) return -1;// error5812 }5813 5814 tta.SetLock();5815 taret=tta;5816 a.Optim(1,0);5817 b.Optim(1,0);5818 return NbSwap;5819 }5820 /*}}}1*/5821 5821 5822 5822 } -
issm/trunk/src/c/Bamgx/objects/Triangles.h
r3245 r3263 106 106 void ShowHistogram() const; 107 107 void ShowRegulaty() const; 108 void ReMakeTriangleContainingTheVertex();109 void UnMarkUnSwapTriangle();110 108 void SmoothMetric(double raisonmax) ; 111 109 void BoundAnisotropy(double anisomax,double hminaniso= 1e-100) ; 112 110 void MaxSubDivision(double maxsubdiv); 113 111 Edge** MakeGeometricalEdgeToEdge(); 114 void SetVertexFieldOn();115 void SetVertexFieldOnBTh();116 112 long SplitInternalEdgeWithBorderVertices(); 117 113 void MakeQuadrangles(double costheta); … … 152 148 int CrackMesh(); 153 149 150 //Inline methods 151 inline void ReMakeTriangleContainingTheVertex(){ 152 for (int i=0;i<nbv;i++) vertices[i].vint=0, vertices[i].t=0; 153 for (int i=0;i<nbt;i++) triangles[i].SetTriangleContainingTheVertex(); 154 } 155 inline void UnMarkUnSwapTriangle(){ 156 for (int i=0;i<nbt;i++) 157 for(int j=0;j<3;j++) 158 triangles[i].SetUnMarkUnSwap(j); 159 } 160 inline void SetVertexFieldOn(){ 161 for (int i=0;i<nbv;i++) vertices[i].onGeometry=0; 162 for (int j=0;j<NbVerticesOnGeomVertex;j++) VerticesOnGeomVertex[j].SetOn(); 163 for (int k=0;k<NbVerticesOnGeomEdge;k++ ) VerticesOnGeomEdge[k].SetOn(); 164 } 165 inline void SetVertexFieldOnBTh(){ 166 for (int i=0;i<nbv;i++) vertices[i].onGeometry=0; 167 for (int j=0;j<NbVertexOnBThVertex;j++) VertexOnBThVertex[j].SetOnBTh(); 168 for (int k=0;k<NbVertexOnBThEdge;k++ ) VertexOnBThEdge[k].SetOnBTh(); 169 } 170 154 171 private: 155 172 void GeomToTriangles1(long nbvx,BamgOpts* bamgopts,int KeepVertices=1);// the real constructor mesh adaption … … 159 176 }; 160 177 178 /*Intermediary*/ 179 TriangleAdjacent CloseBoundaryEdge(I2 ,Triangle *, double &,double &) ; 180 TriangleAdjacent CloseBoundaryEdgeV2(I2 A,Triangle *t, double &a,double &b); 181 void swap(Triangle *t1,short a1, 182 Triangle *t2,short a2, 183 Vertex *s1,Vertex *s2,Icoor2 det1,Icoor2 det2); 184 int SwapForForcingEdge(Vertex * & pva ,Vertex * & pvb , 185 TriangleAdjacent & tt1,Icoor2 & dets1, 186 Icoor2 & detsa,Icoor2 & detsb, int & nbswap); 187 int ForceEdge(Vertex &a, Vertex & b,TriangleAdjacent & taret) ; 188 inline TriangleAdjacent Previous(const TriangleAdjacent & ta){ 189 return TriangleAdjacent(ta.t,PreviousEdge[ta.a]); 190 } 191 inline TriangleAdjacent Next(const TriangleAdjacent & ta){ 192 return TriangleAdjacent(ta.t,NextEdge[ta.a]); 193 } 194 inline TriangleAdjacent Adj(const TriangleAdjacent & a){ 195 return a.Adj(); 196 } 197 inline void Adj(GeometricalEdge * & on,int &i){ 198 int j=i;i=on->DirAdj[i];on=on->Adj[j]; 199 } 200 inline double qualite(const Vertex &va,const Vertex &vb,const Vertex &vc){ 201 double ret; 202 I2 ia=va,ib=vb,ic=vc; 203 I2 ab=ib-ia,bc=ic-ib,ac=ic-ia; 204 Icoor2 deta=Det(ab,ac); 205 if (deta <=0) ret = -1; 206 else { 207 double a = sqrt((double) (ac,ac)), 208 b = sqrt((double) (bc,bc)), 209 c = sqrt((double) (ab,ab)), 210 p = a+b+c; 211 double h= Max(Max(a,b),c),ro=deta/p; 212 ret = ro/h; 213 } 214 return ret; 215 } 216 161 217 } 162 218 #endif -
issm/trunk/src/c/Bamgx/objects/Vertex.cpp
r3246 r3263 4 4 #include <ctime> 5 5 6 #include " ../BamgObjects.h"6 #include "BamgObjects.h" 7 7 #include "../shared/shared.h" 8 8 … … 209 209 } 210 210 /*}}}*/ 211 /*FUNCTION Vertex::Optim {{{1*/ 212 long Vertex::Optim(int i,int koption){ 213 long ret=0; 214 if ( t && (vint >= 0 ) && (vint <3) ){ 215 ret = t->Optim(vint,koption); 216 if(!i){ 217 t =0; // for no future optime 218 vint= 0; 219 } 220 } 221 return ret; 222 } 223 /*}}}*/ 211 224 212 225 /*Intermediary*/ -
issm/trunk/src/c/Bamgx/objects/Vertex.h
r3243 r3263 48 48 void Echo(); 49 49 int ref() const { return ReferenceNumber;} 50 long Optim(int =1,int =0); 50 51 51 52 //inline functions 52 inline long Optim(int =1,int =0); 53 inline void Set(const Vertex & rec,const Triangles &,Triangles &); 53 inline void Set(const Vertex &rec,const Triangles & ,Triangles & ){*this=rec;} 54 54 }; 55 55 -
issm/trunk/src/c/Bamgx/objects/VertexOnEdge.h
r3243 r3263 35 35 //Methods 36 36 void SetOnBTh(){v->onBackgroundEdge=this;v->vint=IsVertexOnEdge;} 37 38 //Inline methods 39 inline void Set(const Triangles &,long,Triangles &); 37 void Set(const Triangles &,long,Triangles &); 40 38 }; 41 39 -
issm/trunk/src/c/Bamgx/objects/VertexOnGeom.h
r3243 r3263 46 46 47 47 //Inline methods 48 inline void Set(const Triangles &,long,Triangles &);49 inlinevoid Set(const VertexOnGeom&,const Triangles &,Triangles &);48 //inline void Set(const Triangles &,long,Triangles &); 49 void Set(const VertexOnGeom&,const Triangles &,Triangles &); 50 50 51 51 }; -
issm/trunk/src/c/Bamgx/objects/VertexOnVertex.h
r3243 r3263 27 27 //Methods 28 28 void SetOnBTh(){v->onBackgroundVertex=bv;v->vint=IsVertexOnVertex;} 29 30 //Inline methods 31 inline void Set(const Triangles &,long,Triangles &); 29 void Set(const Triangles &,long,Triangles &); 32 30 }; 33 31 -
issm/trunk/src/c/Bamgx/shared/shared.h
r3254 r3263 8 8 9 9 #include "BigPrimeNumber.h" 10 #include "qualite.h"11 #include "Next.h"12 #include "Previous.h"13 #include "Adj.h"14 #include "TheVertex.h"15 #include "FindTriangleAdjacent.h"16 10 17 11 #endif -
issm/trunk/src/c/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp
r3244 r3263 16 16 #include <stdio.h> 17 17 #include <string.h> 18 #include "../Bamgx/BamgObjects.h" 19 #include "../Bamgx/objects/QuadTree.h" 18 #include "../Bamgx/objects/BamgObjects.h" 20 19 21 20 using namespace bamg; -
issm/trunk/src/c/Makefile.am
r3254 r3263 334 334 ./Bamgx/meshtype.h\ 335 335 ./Bamgx/objects/CrackedEdge.h\ 336 ./Bamgx/objects/CrackedEdge.cpp\ 337 ./Bamgx/objects/CrackedTriangle.h\ 338 ./Bamgx/objects/CrackedTriangle.cpp\ 336 339 ./Bamgx/objects/Curve.h\ 340 ./Bamgx/objects/Curve.cpp\ 337 341 ./Bamgx/objects/Direction.h\ 342 ./Bamgx/objects/Direction.cpp\ 338 343 ./Bamgx/objects/DoubleAndInt.h\ 339 344 ./Bamgx/objects/Edge.h\ 345 ./Bamgx/objects/Edge.cpp\ 346 ./Bamgx/objects/GeometricalEdge.h\ 340 347 ./Bamgx/objects/GeometricalEdge.cpp\ 341 ./Bamgx/objects/GeometricalEdge.h\342 348 ./Bamgx/objects/GeometricalSubDomain.h\ 349 ./Bamgx/objects/GeometricalSubDomain.cpp\ 343 350 ./Bamgx/objects/GeometricalVertex.h\ 351 ./Bamgx/objects/GeometricalVertex.cpp\ 344 352 ./Bamgx/objects/Geometry.cpp\ 345 353 ./Bamgx/objects/Geometry.h\ … … 355 363 ./Bamgx/objects/SetOfE4.h\ 356 364 ./Bamgx/objects/SubDomain.h\ 365 ./Bamgx/objects/SubDomain.cpp\ 357 366 ./Bamgx/objects/TriangleAdjacent.h\ 367 ./Bamgx/objects/TriangleAdjacent.cpp\ 358 368 ./Bamgx/objects/Triangle.cpp\ 359 369 ./Bamgx/objects/Triangle.h\ 360 370 ./Bamgx/shared/BigPrimeNumber.h\ 361 371 ./Bamgx/shared/BigPrimeNumber.cpp\ 362 ./Bamgx/shared/Adj.h\363 ./Bamgx/shared/Next.h\364 ./Bamgx/shared/Previous.h\365 ./Bamgx/shared/qualite.h\366 372 ./Bamgx/objects/Triangles.cpp\ 367 373 ./Bamgx/objects/Triangles.h\ … … 369 375 ./Bamgx/objects/Vertex.h\ 370 376 ./Bamgx/objects/VertexOnEdge.h\ 377 ./Bamgx/objects/VertexOnEdge.cpp\ 371 378 ./Bamgx/objects/VertexOnGeom.h\ 379 ./Bamgx/objects/VertexOnGeom.cpp\ 372 380 ./Bamgx/objects/VertexOnVertex.h\ 373 ./Bamgx/shared/FindTriangleAdjacent.h\ 374 ./Bamgx/shared/shared.h\ 375 ./Bamgx/shared/TheVertex.h 381 ./Bamgx/objects/VertexOnVertex.cpp\ 382 ./Bamgx/shared/shared.h 376 383 377 384 … … 706 713 ./Bamgx/meshtype.h\ 707 714 ./Bamgx/objects/CrackedEdge.h\ 715 ./Bamgx/objects/CrackedEdge.cpp\ 716 ./Bamgx/objects/CrackedTriangle.h\ 717 ./Bamgx/objects/CrackedTriangle.cpp\ 708 718 ./Bamgx/objects/Curve.h\ 719 ./Bamgx/objects/Curve.cpp\ 709 720 ./Bamgx/objects/Direction.h\ 721 ./Bamgx/objects/Direction.cpp\ 710 722 ./Bamgx/objects/DoubleAndInt.h\ 711 723 ./Bamgx/objects/Edge.h\ 724 ./Bamgx/objects/Edge.cpp\ 725 ./Bamgx/objects/GeometricalEdge.h\ 712 726 ./Bamgx/objects/GeometricalEdge.cpp\ 713 ./Bamgx/objects/GeometricalEdge.h\714 727 ./Bamgx/objects/GeometricalSubDomain.h\ 728 ./Bamgx/objects/GeometricalSubDomain.cpp\ 715 729 ./Bamgx/objects/GeometricalVertex.h\ 730 ./Bamgx/objects/GeometricalVertex.cpp\ 716 731 ./Bamgx/objects/Geometry.cpp\ 717 732 ./Bamgx/objects/Geometry.h\ … … 727 742 ./Bamgx/objects/SetOfE4.h\ 728 743 ./Bamgx/objects/SubDomain.h\ 744 ./Bamgx/objects/SubDomain.cpp\ 729 745 ./Bamgx/objects/TriangleAdjacent.h\ 746 ./Bamgx/objects/TriangleAdjacent.cpp\ 730 747 ./Bamgx/objects/Triangle.cpp\ 731 748 ./Bamgx/objects/Triangle.h\ 732 749 ./Bamgx/shared/BigPrimeNumber.h\ 733 750 ./Bamgx/shared/BigPrimeNumber.cpp\ 734 ./Bamgx/shared/Adj.h\735 ./Bamgx/shared/Next.h\736 ./Bamgx/shared/Previous.h\737 ./Bamgx/shared/qualite.h\738 751 ./Bamgx/objects/Triangles.cpp\ 739 752 ./Bamgx/objects/Triangles.h\ … … 741 754 ./Bamgx/objects/Vertex.h\ 742 755 ./Bamgx/objects/VertexOnEdge.h\ 756 ./Bamgx/objects/VertexOnEdge.cpp\ 743 757 ./Bamgx/objects/VertexOnGeom.h\ 758 ./Bamgx/objects/VertexOnGeom.cpp\ 744 759 ./Bamgx/objects/VertexOnVertex.h\ 745 ./Bamgx/shared/FindTriangleAdjacent.h\ 746 ./Bamgx/shared/shared.h\ 747 ./Bamgx/shared/TheVertex.h 760 ./Bamgx/objects/VertexOnVertex.cpp\ 761 ./Bamgx/shared/shared.h 748 762 749 763 libpISSM_a_CXXFLAGS = -fPIC -D_PARALLEL_ -D_C_ $(CXXOPTFLAGS) -
issm/trunk/src/c/include/macros.h
r3252 r3263 3 3 */ 4 4 5 6 5 #ifndef _MACROS_H_ 7 6 #define _MACROS_H_ 8 7 9 10 8 /*Printing macro: */ 11 9 #define _printf_(...) PrintfFunction(__VA_ARGS__) 12 13 10 14 11 /*The following macros hide the error exception handling in a matlab module. Just put … … 31 28 } 32 29 33 34 35 30 #else 36 37 31 38 32 #define MODULEBOOT(); \ … … 52 46 53 47 #endif 54 -
issm/trunk/src/c/include/types.h
r2333 r3263 5 5 #ifndef _TYPES_H_ 6 6 #define _TYPES_H_ 7 8 7 9 8 /*Define abstract type for I/O: */ … … 19 18 20 19 #endif //ifndef _TYPES_H_ 21
Note:
See TracChangeset
for help on using the changeset viewer.