/** * Example of use of the mmg2d library (basic use of mesh adaptation) * * \author Cécile Dobrzynski (Inria / IMB, Université de Bordeaux) * \version 5 * \copyright GNU Lesser General Public License. */ #include #include #include #include #include #include #include #include /** Include the mmg2d library hader file */ // if the header file is in the "include" directory // #include "libmmg2d.h" // if the header file is in "include/mmg/mmg2d" #include "mmg/mmg2d/libmmg2d.h" int main(int argc,char *argv[]) { MMG5_pMesh mmgMesh; MMG5_pSol mmgSol; int ier; char *pwd,*filename; fprintf(stdout," -- TEST MMG2DLIB \n"); /* Name and path of the mesh file */ pwd = getenv("PWD"); filename = (char *) calloc(strlen(pwd) + 58, sizeof(char)); if ( filename == NULL ) { perror(" ## Memory problem: calloc"); exit(EXIT_FAILURE); } /** ------------------------------ STEP I -------------------------- */ /** 1) Initialisation of mesh and sol structures */ /* args of InitMesh: * MMG5_ARG_start: we start to give the args of a variadic func * MMG5_ARG_ppMesh: next arg will be a pointer over a MMG5_pMesh * &mmgMesh: pointer toward your MMG5_pMesh (that store your mesh) * MMG5_ARG_ppMet: next arg will be a pointer over a MMG5_pSol storing a metric * &mmgSol: pointer toward your MMG5_pSol (that store your metric) */ mmgMesh = NULL; mmgSol = NULL; MMG2D_Init_mesh(MMG5_ARG_start, MMG5_ARG_ppMesh,&mmgMesh,MMG5_ARG_ppMet,&mmgSol, MMG5_ARG_end); /** ------------------------------ STEP II -------------------------- */ sprintf(filename,"out_step=%d.mesh",22); /** with MMG2D_loadMesh function */ if ( MMG2D_loadMesh(mmgMesh,filename) != 1 ) exit(EXIT_FAILURE); /** With MMG2D_loadSol function */ if ( MMG2D_loadSol(mmgMesh,mmgSol,filename) != 1 ) exit(EXIT_FAILURE); ier = MMG2D_mmg2dlib(mmgMesh,mmgSol); if ( ier == MMG5_STRONGFAILURE ) { fprintf(stdout,"BAD ENDING OF MMG2DLIB: UNABLE TO SAVE MESH\n"); return(ier); } else if ( ier == MMG5_LOWFAILURE ) fprintf(stdout,"BAD ENDING OF MMG2DLIB\n"); /** ------------------------------ STEP III -------------------------- */ /*save result*/ int np, nt, na,k; double Point[3]; int Tria[3],Edge[3]; FILE *inm; if( !(inm = fopen("out_step=22.o.mesh.mesh","w")) ) { fprintf(stderr," ** UNABLE TO OPEN result.mesh FILE.\n"); exit(EXIT_FAILURE); } fprintf(inm,"MeshVersionFormatted 2\n"); fprintf(inm,"\nDimension 2\n"); if ( MMG2D_Get_meshSize(mmgMesh,&np,&nt,&na) !=1 ) exit(EXIT_FAILURE); fprintf(inm,"\nVertices\n%d\n",np); for(k=1; k<=np; k++) { /** b) Vertex recovering */ if ( MMG2D_Get_vertex(mmgMesh,&(Point[0]),&(Point[1]), NULL,NULL,NULL) != 1 ) exit(EXIT_FAILURE); fprintf(inm,"%.15lg %.15lg %d \n",Point[0],Point[1],0); } fprintf(inm,"\nTriangles\n%d\n",nt); for(k=1; k<=nt; k++) { /** d) Triangles recovering */ if ( MMG2D_Get_triangle(mmgMesh,&(Tria[0]),&(Tria[1]),&(Tria[2]), NULL,NULL) != 1 ) exit(EXIT_FAILURE); fprintf(inm,"%d %d %d %d \n",Tria[0],Tria[1],Tria[2],0); } fprintf(inm,"\nEdges\n%d\n",na); int count = 0; for(k=1; k<=na; k++) { /** e) Edges recovering */ if ( MMG2D_Get_edge(mmgMesh,&(Edge[0]),&(Edge[1]),&(Edge[2]), NULL,NULL) != 1 ) exit(EXIT_FAILURE); if ( Edge[0] == 468 && Edge[1]==903 ) { ++ count; } fprintf(inm,"%d %d %d \n",Edge[0],Edge[1],Edge[2]); } fprintf(inm,"\nEnd\n"); fclose(inm); printf (" NUMBER OF OCCURENCES OF THE EDGE 468-903 = %d\n",count); /** 3) Free the MMG2D structures */ MMG2D_Free_all(MMG5_ARG_start, MMG5_ARG_ppMesh,&mmgMesh,MMG5_ARG_ppMet,&mmgSol, MMG5_ARG_end); return(0); }