Changeset 3126
- Timestamp:
- 02/24/10 15:57:47 (15 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 1 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/Bamgx/Bamgx.cpp
r3022 r3126 166 166 Th.ReNumberingTheTriangleBySubDomain(); 167 167 if(NbSmooth>0) Th.SmoothingVertex(NbSmooth,omega); 168 Th.BTh.ReMakeTriangleContainingTheVertex();169 168 170 169 //display info -
issm/trunk/src/c/Bamgx/Mesh2.h
r3022 r3126 648 648 Triangles(const char * ,Real8=-1) ; 649 649 Triangles(BamgMesh* bamgmesh,BamgOpts* bamgopts); 650 Triangles(double* index,double* x,double* y,int nods,int nels); 650 651 651 652 Triangles(Int4 nbvx,Triangles & BT,int keepBackVertices=1) :Gh(BT.Gh),BTh(BT) { … … 724 725 Triangle * FindTriangleContaining(const I2 & ,Icoor2 [3],Triangle *tstart=0) const; 725 726 727 void ReadMesh(double* index,double* x,double* y,int nods,int nels); 726 728 void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts); 727 729 void WriteMesh(BamgMesh* bamgmesh,BamgOpts* bamgopts); … … 738 740 int UnCrack(); 739 741 740 void BuildGeometryFromMesh(BamgOpts* bamgopts );742 void BuildGeometryFromMesh(BamgOpts* bamgopts=NULL); 741 743 void FillHoleInMesh() ; 742 744 int CrackMesh(); -
issm/trunk/src/c/Bamgx/objects/Triangles.cpp
r3031 r3126 27 27 PreInit(0); 28 28 ReadMesh(bamgmesh,bamgopts); 29 SetIntCoor(); 30 FillHoleInMesh(); 31 } 32 /*}}}1*/ 33 /*FUNCTION Triangles::Triangles(double* index,double* x,double* y,int nods,int nels){{{1*/ 34 Triangles::Triangles(double* index,double* x,double* y,int nods,int nels):Gh(*(new Geometry())),BTh(*this){ 35 36 PreInit(0); 37 ReadMesh(index,x,y,nods,nels); 29 38 SetIntCoor(); 30 39 FillHoleInMesh(); … … 226 235 227 236 /*IO*/ 228 /*FUNCTION Triangles::ReadMesh{{{1*/ 237 /*FUNCTION Triangles::ReadMesh(double* index,double* x,double* y,int nods,int nels){{{1*/ 238 void Triangles::ReadMesh(double* index,double* x,double* y,int nods,int nels){ 239 240 Real8 Hmin = HUGE_VAL;// the infinie value 241 Int4 i1,i2,i3,iref; 242 Int4 i,j; 243 Int4 hvertices =0; 244 Metric M1(1); 245 int Version=1,dim=2; 246 int verbose=0; 247 248 nbv=nods; 249 nbvx=nbv; 250 nbt=nels; 251 nbiv=nbvx; 252 253 //Vertices 254 if (verbose) printf("Reading vertices (%i)\n",nbv); 255 vertices=(Vertex*)xmalloc(nbv*sizeof(Vertex)); 256 ordre=(Vertex**)xmalloc(nbv*sizeof(Vertex*)); 257 for (i=0;i<nbv;i++){ 258 vertices[i].r.x=x[i]; 259 vertices[i].r.y=y[i]; 260 vertices[i].ReferenceNumber=1; 261 vertices[i].DirOfSearch =NoDirOfSearch; 262 vertices[i].m=M1; 263 } 264 nbtx=2*nbvx-2; // for filling The Holes and quadrilaterals 265 266 //Triangles 267 if (verbose) printf("Reading triangles (%i)\n",nbt); 268 triangles =new Triangle[nbtx]; //we cannot allocate only nbt triangles since 269 //other triangles will be added for each edge 270 for (i=0;i<nbt;i++){ 271 Triangle & t = triangles[i]; 272 i1=(Int4)index[i*3+0]-1; //for C indexing 273 i2=(Int4)index[i*3+1]-1; //for C indexing 274 i3=(Int4)index[i*3+2]-1; //for C indexing 275 t=Triangle(this,i1,i2,i3); 276 t.color=i; 277 } 278 279 /*Recreate geometry: */ 280 if (verbose) printf("Building Geometry\n"); 281 BuildGeometryFromMesh(); 282 if (verbose) printf("Completing geometry\n"); 283 Gh.AfterRead(); 284 } 285 /*}}}1*/ 286 /*FUNCTION Triangles::ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts){{{1*/ 229 287 void Triangles::ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts){ 230 288 … … 997 1055 /*Intermediary*/ 998 1056 int i,j,k,kk,it,jt; 1057 int verbosity=0; 1058 double cutoffradian=10*Pi/180; 999 1059 1000 1060 /*Recover options*/ 1001 int verbosity=bamgopts->verbose; 1002 double cutoffradian=bamgopts->MaximalAngleOfCorner*Pi/180; 1061 if (bamgopts){ 1062 verbosity=bamgopts->verbose; 1063 cutoffradian=bamgopts->MaximalAngleOfCorner*Pi/180; 1064 } 1003 1065 1004 1066 //display info … … 2716 2778 t = a->t; 2717 2779 if (t<triangles || t>=triangles+nbt){ 2780 a->Echo(); 2718 2781 throw ErrorException(__FUNCT__,exprintf("t<triangles || t>=triangles+nbt")); 2719 2782 } -
issm/trunk/src/c/Bamgx/objects/Vertex.cpp
r2965 r3126 207 207 printf(" Euclidean coordinates r.x: %g, r.y: %g\n",r.x,r.y); 208 208 printf(" ReferenceNumber = %i\n",ReferenceNumber); 209 m.Echo(); 209 210 210 211 return; -
issm/trunk/src/c/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp
r2418 r3126 1 /*!\file: InterpFromMeshToMesh2dx.cpp 2 * \brief "c" core code for interpolating values from a structured grid. 3 */ 4 5 6 #ifdef HAVE_CONFIG_H 7 #include "config.h" 8 #else 9 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" 10 #endif 1 /*!\file InterpFromMeshToMesh2dx 2 */ 11 3 12 4 #include "./InterpFromMeshToMesh2dx.h" 13 #include "../shared/shared.h"14 5 15 6 #undef __FUNCT__ 16 7 #define __FUNCT__ "InterpFromMeshToMesh2dx" 17 int InterpFromMeshToMesh2dx( Vec* pdata_prime,double* index_data, double* x_data, double* y_data, int nods_data,int nels_data, double* data, int data_length, double* x_prime, double* y_prime, int nods_prime,double default_value){ 8 9 #include "../shared/shared.h" 10 #include "../include/macros.h" 11 #include "../toolkits/toolkits.h" 12 13 /*Bamg: */ 14 #include <unistd.h> 15 #include <stdlib.h> 16 #include <stdio.h> 17 #include <string.h> 18 #include "../Bamgx/Mesh2.h" 19 #include "../Bamgx/QuadTree.h" 20 21 using namespace bamg; 22 using namespace std; 23 24 int InterpFromMeshToMesh2dx(double** pdata_interp,double* index_data,double* x_data,double* y_data,int nods_data,int nels_data, 25 double* data,int data_rows,int data_cols,double* x_interp,double* y_interp,int nods_interp,double default_value){ 18 26 19 27 /*Output*/ 20 Vec data_prime=NULL; 28 double* data_interp=NULL; 29 int noerr; 21 30 22 31 /*Intermediary*/ 23 int i; 24 int interpolation_type; 25 bool debug; 26 double x_prime_min,x_prime_max; 27 double y_prime_min,y_prime_max; 32 R2 r; 33 I2 I; 34 int i,j,k; 35 int it; 36 int i0,i1,i2; 37 double areacoord[3]; 38 double aa,bb; 39 double data_value; 40 Icoor2 dete[3]; 41 int verbose=0; 28 42 29 /*threading: */ 30 InterpFromMeshToMesh2dxThreadStruct gate; 31 int num=1; 32 #ifdef _MULTITHREADING_ 33 num=_NUMTHREADS_; 34 #endif 35 36 /*some checks*/ 37 if (nels_data<1 || nods_data<3 || nods_prime==0){ 38 throw ErrorException(__FUNCT__,"nothing to be done according to the mesh given in input"); 43 /*Checks*/ 44 if (data_cols<=0){ 45 throw ErrorException(__FUNCT__,exprintf("data provided has a negative number of columns")); 39 46 } 40 41 /*Set debug to 1 if there are lots of elements*/ 42 debug=(bool)((double)nels_data*(double)nods_prime >= pow((double)10,(double)9)); 43 44 /*figure out what kind of interpolation is needed*/ 45 if (data_length==nods_data){ 46 interpolation_type=1; 47 } 48 else if (data_length==nels_data){ 49 interpolation_type=2; 50 } 51 else{ 52 throw ErrorException(__FUNCT__,"length of vector data not supported yet. It should be of length (number of nodes) or (number of elements)!"); 53 } 54 55 /*Get prime mesh extrema coordinates*/ 56 x_prime_min=x_prime[0]; x_prime_max=x_prime[0];y_prime_min=y_prime[0]; y_prime_max=y_prime[0]; 57 for (i=1;i<nods_prime;i++){ 58 if (x_prime[i]<x_prime_min) x_prime_min=x_prime[i]; 59 if (x_prime[i]>x_prime_max) x_prime_max=x_prime[i]; 60 if (y_prime[i]<y_prime_min) y_prime_min=y_prime[i]; 61 if (y_prime[i]>y_prime_max) y_prime_max=y_prime[i]; 47 if (data_rows!=nods_data && data_rows!=nels_data){ 48 throw ErrorException(__FUNCT__,exprintf("data provided should have either %i or %i lines (not %i)",nods_data,nels_data,data_rows)); 62 49 } 63 50 64 51 /*Initialize output*/ 65 data_prime=NewVec(nods_prime);66 for (i=0;i<nods_prime;i++) VecSetValue(data_prime,i,default_value,INSERT_VALUES);52 if (verbose) printf("Initializing output vector\n"); 53 data_interp=(double*)xmalloc(nods_interp*data_cols*sizeof(double)); 67 54 68 /*initialize thread parameters: */ 69 gate.debug=debug; 70 gate.nods_prime=nods_prime; 71 gate.nels_data=nels_data; 72 gate.x_data=x_data; 73 gate.y_data=y_data; 74 gate.index_data=index_data; 75 gate.x_prime=x_prime; 76 gate.y_prime=y_prime; 77 gate.data=data; 78 gate.interpolation_type=interpolation_type; 79 gate.default_value=default_value; 80 gate.data_prime=data_prime; 81 gate.x_prime_min=x_prime_min; 82 gate.x_prime_max=x_prime_max; 83 gate.y_prime_min=y_prime_min; 84 gate.y_prime_max=y_prime_max; 55 // read background mesh 56 if (verbose) printf("Reading mesh\n"); 57 Triangles Th(index_data,x_data,y_data,nods_data,nels_data); 58 Th.ReMakeTriangleContainingTheVertex(); 85 59 86 /*launch the thread manager with InterpFromMeshToMesh2dxt as a core: */ 87 LaunchThread(InterpFromMeshToMesh2dxt,(void*)&gate,num); 60 //Loop over output nodes 61 if (verbose) printf("Loop over the nodes\n"); 62 for(i=0;i<nods_interp;i++){ 63 64 //Get current point coordinates 65 r.x=x_interp[i]; r.y=y_interp[i]; 66 I2 I=Th.toI2(r); 67 68 //Find triangle holding r/I 69 Triangle &tb=*Th.FindTriangleContaining(I,dete); 70 71 // internal point 72 if (tb.det>0){ 73 //Area coordinate 74 areacoord[0]= (Real8) dete[0]/ tb.det; 75 areacoord[1]= (Real8) dete[1] / tb.det; 76 areacoord[2]= (Real8) dete[2] / tb.det; 77 //3 vertices of the triangle 78 i0=Th.Number(tb[0]); 79 i1=Th.Number(tb[1]); 80 i2=Th.Number(tb[2]); 81 //triangle number 82 it=Th.Number(tb); 83 } 84 85 //external point 86 else { 87 //Get closest adjacent triangle (inside the mesh) 88 TriangleAdjacent ta=CloseBoundaryEdge(I,&tb,aa,bb).Adj(); 89 int k=ta; 90 Triangle &tc=*(Triangle*)ta; 91 //Area coordinate 92 areacoord[VerticesOfTriangularEdge[k][1]] = aa; 93 areacoord[VerticesOfTriangularEdge[k][0]] = bb; 94 areacoord[OppositeVertex[k]] = 1 - aa -bb; 95 //3 vertices of the triangle 96 i0=Th.Number(tc[0]); 97 i1=Th.Number(tc[1]); 98 i2=Th.Number(tc[2]); 99 //triangle number 100 it=Th.Number(tc); 101 } 102 103 /*Last step, P1 interpolation*/ 104 if (data_rows==nods_data){ 105 for (j=0;j<data_cols;j++){ 106 data_interp[i*data_cols+j]=areacoord[0]*data[data_cols*i0+j]+areacoord[1]*data[data_cols*i1+j]+areacoord[2]*data[data_cols*i2+j]; 107 } 108 } 109 else{ 110 for (j=0;j<data_cols;j++){ 111 if (it<0 || it>=nels_data){ 112 throw ErrorException(__FUNCT__,exprintf("Triangle number %i not in [0 %i], because not correctly implemented yet... interpolate on grid first",it,nels_data)); 113 } 114 data_interp[i*data_cols+j]=data[data_cols*it+j]; 115 } 116 } 117 118 } 88 119 89 120 /*Assign output pointers:*/ 90 *pdata_prime=data_prime; 121 if (verbose) printf("Assigning output\n"); 122 *pdata_interp=data_interp; 123 124 /*No error return*/ 125 return noerr; 126 91 127 } 92 93 94 -
issm/trunk/src/c/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h
r2417 r3126 1 /*!\file InterpFromMeshToMesh2dx.h2 * \brief : header file for Data interpolation routines.3 */ 1 /*!\file: InterpFromMeshToMesh2dx.h 2 * \brief header file for Bamg module 3 */ 4 4 5 5 #ifndef _INTERPFROMMESHTOMESH2DX_H 6 6 #define _INTERPFROMMESHTOMESH2DX_H 7 7 8 #include "../ toolkits/toolkits.h"8 #include "../objects/objects.h" 9 9 10 /* local prototypes: */ 11 int InterpFromMeshToMesh2dx(double** pdata_interp,double* index_data,double* x_data,double* y_data,int nods_data,int nels_data, 12 double* data,int data_rows,int data_cols,double* x_interp,double* y_interp,int nods_interp,double default_value); 10 13 11 12 /*threading: */ 13 typedef struct{ 14 15 int debug; 16 int nels_data; 17 double* x_data; 18 double* y_data; 19 double* index_data; 20 int nods_prime; 21 double* x_prime; 22 double* y_prime; 23 double* data; 24 int interpolation_type; 25 double default_value; 26 Vec data_prime; 27 double x_prime_min; 28 double x_prime_max; 29 double y_prime_min; 30 double y_prime_max; 31 32 } InterpFromMeshToMesh2dxThreadStruct; 33 34 35 int InterpFromMeshToMesh2dx( Vec* pdata_prime,double* index_data, double* x_data, double* y_data, int nods_data,int nels_data, double* data, int data_length, double* x_prime, double* y_prime, int nods_prime,double default_value); 36 void* InterpFromMeshToMesh2dxt(void* vInterpFromMeshToMesh2dxThreadStruct); 37 38 39 #endif /* _INTERPFROMMESHTOMESH2DX_H */ 40 14 #endif -
issm/trunk/src/c/Makefile.am
r3086 r3126 260 260 ./InterpFromGridToMeshx/InterpFromGridToMeshxt.cpp\ 261 261 ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp\ 262 ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dxt.cpp\263 262 ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h\ 264 263 ./InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp\ … … 587 586 ./InterpFromGridToMeshx/InterpFromGridToMeshxt.cpp\ 588 587 ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp\ 589 ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dxt.cpp\590 588 ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h\ 591 589 ./InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp\ -
issm/trunk/src/c/issm.h
r2892 r3126 63 63 #include "./MassFluxx/MassFluxx.h" 64 64 #include "./Bamgx/Bamgx.h" 65 #include "./Bamgx/InterpBamgx.h" 65 66 66 67
Note:
See TracChangeset
for help on using the changeset viewer.