/* =============================================================================
** This file is part of the mmg software package for the tetrahedral
** mesh modification.
** Copyright (c) Bx INP/Inria/UBordeaux/UPMC, 2004- .
**
** mmg is free software: you can redistribute it and/or modify it
** under the terms of the GNU Lesser General Public License as published
** by the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** mmg is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
** License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License and of the GNU General Public License along with mmg (in
** files COPYING.LESSER and COPYING). If not, see
** . Please read their terms carefully and
** use this copy of the mmg distribution only if you accept them.
** =============================================================================
*/
/**
* Example of use of the mmg3d library (basic use of mesh adaptation)
*
* \author Charles Dapogny (LJLL, UPMC)
* \author Cécile Dobrzynski (Inria / IMB, Université de Bordeaux)
* \author Pascal Frey (LJLL, UPMC)
* \author Algiane Froehly (Inria / IMB, Université de Bordeaux)
* \version 5
* \copyright GNU Lesser General Public License.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
/** Include the mmg3d library hader file */
// if the header file is in the "include" directory
// #include "libmmg3d.h"
// if the header file is in "include/mmg/mmg3d"
#include "mmg/mmg3d/libmmg3d.h"
int main(int argc,char *argv[]) {
MMG5_pMesh mmgMesh;
MMG5_pSol mmgSol;
int ier, np, ne, nt, na;
char *filename, *fileout;
fprintf(stdout," -- TEST MMG3DLIB \n");
if ( argc != 3 ) {
printf(" Usage: %s filein fileout \n",argv[0]);
return(1);
}
/* Name and path of the mesh file */
filename = (char *) calloc(strlen(argv[1]) + 1, sizeof(char));
if ( filename == NULL ) {
perror(" ## Memory problem: calloc");
exit(EXIT_FAILURE);
}
strcpy(filename,argv[1]);
fileout = (char *) calloc(strlen(argv[2]) + 1, sizeof(char));
if ( fileout == NULL ) {
perror(" ## Memory problem: calloc");
exit(EXIT_FAILURE);
}
strcpy(fileout,argv[2]);
/** ------------------------------ 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;
MMG3D_Init_mesh(MMG5_ARG_start,
MMG5_ARG_ppMesh,&mmgMesh,MMG5_ARG_ppMet,&mmgSol,
MMG5_ARG_end);
/** 2) Build mesh in MMG5 format */
/** Two solutions: just use the MMG3D_loadMesh function that will read a .mesh(b)
file formatted or manually set your mesh using the MMG3D_Set* functions */
/** with MMG3D_loadMesh function */
if ( MMG3D_loadMshMesh(mmgMesh, mmgSol, filename) != 1 ) exit(EXIT_FAILURE);
/** Get the size of the mesh: vertices, tetra, triangles, edges */
ier = MMG3D_Get_meshSize(mmgMesh,&np,&ne,NULL,&nt,NULL,&na);
printf("Nb of Tetra : %d\n", ne);
for (int i=0; itetra[i];
if (pt->ref>0)
printf("%d\n",pt->ref);
}
/** 3) Build sol in MMG5 format */
/** Two solutions: just use the MMG3D_loadSol function that will read a .sol(b)
file formatted or manually set your sol using the MMG3D_Set* functions */
/** With MMG3D_loadSol function */
//if ( MMG3D_loadSol(mmgMesh,mmgSol,filename) != 1 )
// exit(EXIT_FAILURE);
/** 4) (not mandatory): check if the number of given entities match with mesh size */
//if ( MMG3D_Chk_meshData(mmgMesh,mmgSol) != 1 ) exit(EXIT_FAILURE);
/** ------------------------------ STEP II -------------------------- */
/** Set parmeter - no remesh on surfaces **/
ier = MMG3D_Set_iparameter(mmgMesh, mmgSol, MMG3D_IPARAM_nosurf, 1);
/** remesh function */
ier = MMG3D_mmg3dlib(mmgMesh,mmgSol);
if ( ier == MMG5_STRONGFAILURE ) {
fprintf(stdout,"BAD ENDING OF MMG3DLIB: UNABLE TO SAVE MESH\n");
return(ier);
} else if ( ier == MMG5_LOWFAILURE )
fprintf(stdout,"BAD ENDING OF MMG3DLIB\n");
/** ------------------------------ STEP III -------------------------- */
/** get results */
/** Two solutions: just use the MMG3D_saveMesh/MMG3D_saveSol functions
that will write .mesh(b)/.sol formatted files or manually get your mesh/sol
using the MMG3D_getMesh/MMG3D_getSol functions */
/** 1) Automatically save the mesh */
if ( MMG3D_saveMshMesh(mmgMesh,mmgSol, fileout) != 1 ) {
fprintf(stdout,"UNABLE TO SAVE MESH\n");
return(MMG5_STRONGFAILURE);
}
/** 2) Automatically save the solution */
//if ( MMG3D_saveSol(mmgMesh,mmgSol,fileout) != 1 ) {
// fprintf(stdout,"UNABLE TO SAVE SOL\n");
// return(MMG5_LOWFAILURE);
//}
/** 3) Free the MMG3D5 structures */
MMG3D_Free_all(MMG5_ARG_start,
MMG5_ARG_ppMesh,&mmgMesh,MMG5_ARG_ppMet,&mmgSol,
MMG5_ARG_end);
free(filename);
filename = NULL;
free(fileout);
fileout = NULL;
return(ier);
}