gisfil.c
来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C语言 代码 · 共 194 行
C
194 行
#include "medit.h"#include "extern.h"#include "sproto.h"#define FLOAT_MAX 1.e20int loadGIS(pMesh mesh) { pQuad pq; pPoint ppt; pSolution ps; FILE *fp; double xxm,yym,ggx,ggy,hhz; float *te,cx,cy,cz,gu,hu,xmi,ymi; int i,j,k,sx,sy,ni,ret,bitsize,pos,ref; char *ptr,c,buf[256],data[256]; ubyte ityp; /* default */ strcpy(data,mesh->name); ptr = strstr(data,".gis"); if ( !ptr ) strcat(data,".gis"); fp = fopen(data,"rb"); if ( !fp ) return(0); fprintf(stdout," Reading %s\n",data); if ( !fgets(buf,sizeof(buf),fp) ) { fprintf(stderr," ## Invalid header.\n"); return(0); } /* remove leading spaces */ pos = 0; while ( (buf[0] == ' ') && (buf[0] != 0x0d) && (buf[0] != 0x0a) ) memmove(&buf[0],&buf[1],strlen(buf)); /* check header file */ if ( buf[0] != 'G' ) { fprintf(stderr," ## Invalid format.\n"); return(0); } if ( buf[1] == '1' ) ityp = 1; else if ( buf[1] == '2' ) ityp = 2; else { fprintf(stderr," ## Invalid format ('G?' expected).\n"); return(0); } /* check and strip comments */ do { ret = fscanf(fp,"%s",buf); if ( ret == EOF ) break; if ( buf[0] == '#' ) do c = getc(fp); while ( c != '\n' ); else break; } while (1); /* header */ ret = sscanf(buf,"%d",&sx); ret += fscanf(fp,"%d",&sy); ret += fscanf(fp,"%f %f %f",&cx,&cy,&cz); ret += fscanf(fp,"%f",&gu); ret += fscanf(fp,"%f",&hu); ret += fscanf(fp,"%f %f",&xmi,&ymi); if ( ret != 9 ) { fprintf(stderr," ## Error loading terrain.\n"); free(mesh); return(0); } bitsize = mesh->np*sizeof(float); if ( ddebug ) { fprintf(stdout," header: sx %7d sy %7d\n",sx,sy); fprintf(stdout," cx %7.2f cy %7.2f cz %7.2f\n",cx,cy,cz); fprintf(stdout," units: %7.2f %7.2f\n",gu,hu); fprintf(stdout," min: %7.3e %7.3e\n",xmi,ymi); fprintf(stdout," terrain size: %dx%d %ld bytes\n",sx,sy,(long)bitsize); } mesh->np = sx*sy; mesh->nt = 0; mesh->nq = (sx-1)*(sy-1); mesh->ne = mesh->nq; /* memory allocation for mesh */ if ( !zaldy1(mesh) ) { fclose(fp); return(0); } /* read data */ if ( ityp == 1 ) { xxm = xmi / cx; yym = ymi / cy; ggx = gu * cx; ggy = gu * cy; hhz = hu * cz; for (j=1; j<=sy; j++) for (i=1; i<=sx; i++) { k = (j-1)*sx + i; ppt = &mesh->point[k]; fscanf(fp,"%f",&ppt->c[2]); ppt->c[0] = (float)(ggx*(xxm + i-1)); ppt->c[1] = (float)(ggy*(yym + j-1)); ppt->c[2] = (float)(hhz*ppt->c[2]); } } else { te = (float*)malloc(sx*sizeof(float)); if ( !te ) exit(1); ni = 0; xxm = xmi / cx; yym = ymi / cy; ggx = gu / cx; ggy = gu / cy; hhz = hu / cz; for (j=1; j<=sy; j++) { ret = fread(te,sizeof(int),sx,fp); if ( ret != sx ) { fprintf(stderr," ## Error loading terrain.\n"); free(mesh->point); free(mesh); return(0); } for (i=1; i<=sx; i++) { k = (j-1)*sx + i; ppt = &mesh->point[k]; ppt->c[2] = te[ni++]; ppt->c[0] = ggx*(xxm + i-1); ppt->c[1] = ggy*(yym + j-1); ppt->c[2] = hhz*ppt->c[2]; } } free(te); } /* construct topology */ mesh->dim = 3; for (j=1; j<sy; j++) for (i=1; i<sx; i++) { k = (j-1)*(sx-1) + i; pq = &mesh->quad[k]; pq->v[0] = (j-1)*sx+i; pq->v[1] = pq->v[0]+1; pq->v[2] = j*sx+i+1; pq->v[3] = pq->v[2]-1; pq->ref = 0; } /* read references, if any */ if ( ityp == 1 ) { pos = ftell(fp); ret = fscanf(fp,"%d",&i); if ( ret != EOF ) { fseek(fp,pos,SEEK_SET); for (j=1; j<sy; j++) for (i=1; i<sx; i++) { k = (j-1)*(sx-1) + i; pq = &mesh->quad[k]; fscanf(fp,"%d",&ref); pq->ref = ref; } } } /* solution = elevations */ mesh->nbb = mesh->np; mesh->bbmin = FLOAT_MAX; mesh->bbmax = -FLOAT_MAX; mesh->typage = 2; mesh->nfield = 1; /* allocate memory */ if ( !zaldy2(mesh) ) { mesh->nbb = 0; fclose(fp); return(1); } for (j=1; j<=mesh->np; j++) { ps = &mesh->sol[j]; ppt = &mesh->point[j]; ps->bb = ppt->c[2]; if ( ps->bb < mesh->bbmin ) mesh->bbmin = ps->bb; if ( ps->bb > mesh->bbmax ) mesh->bbmax = ps->bb; } fclose(fp); return(1); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?