animat.c
来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C语言 代码 · 共 248 行
C
248 行
#include "medit.h"#include "extern.h"#include "sproto.h"extern void resetLists(pScene ,pMesh );static int getmesh(pMesh mesh,int range) { int k,ret; char *ptr,data[256]; static char base[256]; /* allocate mesh structure */ if ( ddebug ) fprintf(stdout,"getmesh: create mesh %d\n",range); if ( mesh->tria ) M_free(mesh->tria); if ( mesh->quad ) M_free(mesh->quad); if ( mesh->edge ) M_free(mesh->edge); if ( mesh->tetra ) M_free(mesh->tetra); if ( mesh->hexa ) M_free(mesh->hexa); if ( mesh->adja ) M_free(mesh->adja); if ( mesh->voy ) M_free(mesh->voy); if ( mesh->point ) M_free(mesh->point); if ( mesh->extra ) { if ( mesh->extra->iv ) M_free(mesh->extra->nv); if ( mesh->extra->it ) M_free(mesh->extra->nt); if ( mesh->extra->iq ) M_free(mesh->extra->nq); if ( mesh->extra->n ) M_free(mesh->extra->n); M_free(mesh->extra); mesh->extra = (void*)0; } if ( mesh->sol && mesh->nbb ) { if ( (mesh->dim==2 && mesh->nfield==3) || (mesh->dim==3 && mesh->nfield==6) ) for (k=1; k<=mesh->nbb; k++) free(mesh->sol[k].m); M_free(mesh->sol); mesh->sol = (void*)0; } mesh->point = (void*)0; mesh->tria = (void*)0; mesh->quad = (void*)0; mesh->edge = (void*)0; mesh->tetra = (void*)0; mesh->hexa = (void*)0; mesh->adja = (void*)0; mesh->voy = (void*)0; mesh->np = mesh->nt = mesh->nq = mesh->ne = 0; mesh->ntet = mesh->nhex = mesh->nbb = 0; if ( animdep == range ) { sprintf(data,".%d",range); ptr = (char *)strstr(mesh->name,data); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); } /* adjust file name */ sprintf(mesh->name,"%s.%d",base,range); if ( ddebug ) fprintf(stdout,"load %s\n",mesh->name); /* read mesh */ if ( quiet ) { fprintf(stdout," Loading %s \r",mesh->name); fflush(stdout); } mesh->typ = 0; ret = loadMesh(mesh); if ( ret < 1 ) { mesh->typ = 1; ret = inmsh2(mesh); if ( !ret ) { mesh->typ = 2; ret = loadGIS(mesh); if ( !ret ) return(0); } } if ( (mesh->ntet && !mesh->nt) || (mesh->nhex && !mesh->nq) ) meshSurf(mesh); meshBox(mesh,animdep==range); if ( !quiet ) meshInfo(mesh); /* read metric */ if ( !loadSol(mesh,mesh->name,1) ) bbfile(mesh); if ( !quiet && mesh->nbb ) fprintf(stdout," Solutions %8d\n",mesh->nbb); return(1);}int loadNextMesh(pMesh mesh,int k,int parse) { pScene sc; int is; if ( !getmesh(mesh,k) ) return(0); if ( ddebug ) printf("loadNextMesh: create %d window(s)\n",cv.nbs); /* compute mesh box */ is = currentScene(); if ( !cv.scene[is] ) { cv.scene[is] = (pScene)M_calloc(1,sizeof(Scene),"loadNextMesh.scene"); if ( !cv.scene[is] ) return(0); } sc = cv.scene[is]; if ( parse ) { parsop(sc,mesh); } setupPalette(sc,mesh); meshRef(sc,mesh); matSort(sc); return(1);}int playAnim(pScene sc,pMesh mesh,int deb,int fin) { int k; char *ptr,data[256],base[256]; /* get basename */ sprintf(data,".%d",deb); ptr = (char *)strstr(mesh->name,data); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); if ( saveimg ) { glDrawBuffer(GL_BACK_LEFT); } /* start animation */ for (k=deb; k<=fin; k++) { strcpy(mesh->name,base); resetLists(sc,mesh); if ( !loadNextMesh(mesh,k,0) ) return(0); doLists(sc,mesh); sc->glist = geomList(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,1); if ( !saveimg ) { sprintf(data,"Medit - [%s] #%d",mesh->name,sc->idwin); glutSetWindowTitle(data); } glClearColor(sc->par.back[0],sc->par.back[1],sc->par.back[2],sc->par.back[3]); if ( sc->type & S_SCISSOR ) scissorScene(); else redrawScene(); } fprintf(stdout,"\n Done.\n"); strcpy(mesh->name,base); if ( saveimg ) { glDrawBuffer(GL_FRONT | GL_BACK); if ( saveimg ) { sprintf(data,"Medit - [%s] #%d",mesh->name,sc->idwin); glutSetWindowTitle(data); } glutPostRedisplay(); saveimg = 0; } return(1);}int animParticle(pScene sc,pMesh mesh) { int cur; char *ptr,data[256],base[256]; /* get basename */ strcpy(base,mesh->name); ptr = (char *)strstr(base,"."); sscanf(ptr,".%d",&cur); cur++; if ( cur > animfin ) return(0); if ( ptr ) ptr[0] = '\0'; sprintf(data,"%s.%.3d",base,cur); strcpy(mesh->name,base); resetLists(sc,mesh); if ( !loadNextMesh(mesh,cur,1) ) return(0); doLists(sc,mesh); sc->glist = geomList(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,2); if ( !advectParticle(sc,mesh) ) return(0); return(1);}int animat() { pMesh mesh; pScene sc; char data[128],*name; /* default */ if ( ddebug ) printf("animat: read file(s)\n"); /* enter basename */ if ( !cv.nbm ) { fprintf(stdout," File name(s) missing. Please enter : "); fflush(stdout); fflush(stdin); fgets(data,120,stdin); if ( !strlen(data) ) { fprintf(stdout," ## Error\n"); return(0); } fprintf(stdout," Enter range [start,end] :"); fflush(stdout); fflush(stdin); fscanf(stdin,"%d %d",&animdep,&animfin); /* parse file name(s) */ name = strtok(data," \n"); while( name ) { if ( !cv.mesh[cv.nbm] ) { cv.mesh[cv.nbm] = (pMesh)M_calloc(1,sizeof(Mesh),"animat.mesh"); if ( !cv.mesh[cv.nbm] ) return(0); } /*(cv.mesh[cv.nbm])->name = calloc(strlen(name)+15,sizeof(char));*/ strcpy(cv.mesh[cv.nbm]->name,name); break; } if ( !cv.nbm ) return(0); } cv.nbs = cv.nbm; /* read initial mesh */ mesh = cv.mesh[0]; if ( !loadNextMesh(mesh,animdep,1) ) return(0); /* create grafix */ sc = cv.scene[0]; if ( !createScene(sc,0) ) { fprintf(stderr," ## Unable to create scene\n"); return(0); } quiet = 1; return(1);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?