Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
mmg3d.c
Go to the documentation of this file.
1/* =============================================================================
2** This file is part of the mmg software package for the tetrahedral
3** mesh modification.
4** Copyright (c) Bx INP/CNRS/Inria/UBordeaux/UPMC, 2004-
5**
6** mmg is free software: you can redistribute it and/or modify it
7** under the terms of the GNU Lesser General Public License as published
8** by the Free Software Foundation, either version 3 of the License, or
9** (at your option) any later version.
10**
11** mmg is distributed in the hope that it will be useful, but WITHOUT
12** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13** FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14** License for more details.
15**
16** You should have received a copy of the GNU Lesser General Public
17** License and of the GNU General Public License along with mmg (in
18** files COPYING.LESSER and COPYING). If not, see
19** <http://www.gnu.org/licenses/>. Please read their terms carefully and
20** use this copy of the mmg distribution only if you accept them.
21** =============================================================================
22*/
23
35#include "libmmg3d_private.h"
36#include "libmmg3d.h"
37
39
43static void MMG5_endcod(void) {
44 char stim[32];
45
46 chrono(OFF,&MMG5_ctim[0]);
47 printim(MMG5_ctim[0].gdif,stim);
48 fprintf(stdout,"\n ELAPSED TIME %s\n",stim);
49}
50
62 int npar,ier;
63 MMG5_int k;
64
66 (*bdyRefs) = NULL;
67
68 k = mesh->ne? mesh->tetra[1].ref : 0;
69
70 /* Try to alloc the first node */
71 ier = MMG5_Add_inode( mesh, bdyRefs, k );
72 if ( ier < 0 ) {
73 fprintf(stderr,"\n ## Error: %s: unable to allocate the first boundary"
74 " reference node.\n",__func__);
75 return 0;
76 }
77 else {
78 assert(ier);
79 npar = 1;
80 }
81
82 for ( k=1; k<=mesh->ne; ++k ) {
83 ier = MMG5_Add_inode( mesh, bdyRefs, mesh->tetra[k].ref );
84
85 if ( ier < 0 ) {
86 fprintf(stderr, "\n ## Warning: %s: unable to list the tetra references.\n"
87 " Uncomplete parameters file.\n",__func__ );
88 break;
89 }
90 else if ( ier ) ++npar;
91 }
92
93 return npar;
94}
95
106 FILE *out ) {
107 MMG5_iNode *cur;
108
109 cur = bdryRefs;
110 while( cur ) {
111 fprintf(out,"%"MMG5_PRId" Tetrahedron %e %e %e \n",cur->val,
113 cur = cur->nxt;
114 }
115
116 MMG5_Free_ilinkedList(mesh,bdryRefs);
117
118 return 1;
119}
120
121
131 MMG5_iNode *triRefs,*tetRefs;
132 int nparTri,nparTet;
133 char *ptr,data[MMG5_FILESTR_LGTH];
134 FILE *out;
135
137 strcpy(data,mesh->namein);
138
139 ptr = MMG5_Get_filenameExt(data);
140
141 if ( ptr ) *ptr = '\0';
142 strcat(data,".mmg3d");
143
144 if ( !(out = fopen(data,"wb")) ) {
145 fprintf(stderr,"\n ** UNABLE TO OPEN %s.\n",data);
146 return 0;
147 }
148
149 fprintf(stdout,"\n %%%% %s OPENED\n",data);
150
151 nparTri = MMG5_countLocalParamAtTri( mesh, &triRefs);
152 if ( !nparTri ) {
153 fclose(out);
154 return 0;
155 }
156
157 nparTet = MMG5_countLocalParamAtTet( mesh, &tetRefs);
158 if ( !nparTet ) {
159 fclose(out);
160 return 0;
161 }
162
163 fprintf(out,"parameters\n %d\n",nparTri+nparTet);
164
166 if (! MMG5_writeLocalParamAtTri(mesh,triRefs,out) ) {
167 fclose(out);
168 return 0;
169 }
170
172 if (! MMG5_writeLocalParamAtTet(mesh,tetRefs,out) ) {
173 fclose(out);
174 return 0;
175 }
176
177 fclose(out);
178 fprintf(stdout," -- WRITING COMPLETED\n");
179
180 return 1;
181}
182
197static inline
199 mytime ctim[TIMEMAX];
200 double hsiz;
201 char stim[32];
202
204
205 signal(SIGABRT,MMG5_excfun);
206 signal(SIGFPE,MMG5_excfun);
207 signal(SIGILL,MMG5_excfun);
208 signal(SIGSEGV,MMG5_excfun);
209 signal(SIGTERM,MMG5_excfun);
210 signal(SIGINT,MMG5_excfun);
211
212 tminit(ctim,TIMEMAX);
213 chrono(ON,&(ctim[0]));
214
215 if ( mesh->info.npar ) {
216 fprintf(stderr,"\n ## Error: %s: "
217 "unable to save of a local parameter file with"
218 " the default parameters values because local parameters"
219 " are provided.\n",__func__);
221 }
222
223
224 if ( mesh->info.imprim > 0 ) fprintf(stdout,"\n -- INPUT DATA\n");
225
226 /* load data */
227 chrono(ON,&(ctim[1]));
228
229 if ( met && met->np && (met->np != mesh->np) ) {
230 fprintf(stderr,"\n ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
231 MMG5_DEL_MEM(mesh,met->m);
232 met->np = 0;
233 }
234
235 if ( sol && sol->np && (sol->np != mesh->np) ) {
236 fprintf(stderr,"\n ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
238 sol->np = 0;
239 }
240
241 chrono(OFF,&(ctim[1]));
242 printim(ctim[1].gdif,stim);
243 if ( mesh->info.imprim > 0 )
244 fprintf(stdout," -- INPUT DATA COMPLETED. %s\n",stim);
245
246 /* analysis */
247 chrono(ON,&(ctim[2]));
248 MMG3D_setfunc(mesh,met);
249
250 if ( mesh->info.imprim > 0 ) {
251 fprintf(stdout,"\n -- DEFAULT PARAMETERS COMPUTATION\n");
252 }
253
254 /* scaling mesh + hmin/hmax computation*/
256
257 /* specific meshing + hmin/hmax update */
258 if ( mesh->info.optim ) {
259 if ( !MMG3D_doSol(mesh,met) ) {
262 }
263 }
264
265 if ( mesh->info.hsiz > 0. ) {
266 if ( !MMG5_Compute_constantSize(mesh,met,&hsiz) ) {
269 }
270 }
271
272 /* unscaling mesh */
274
275 /* Save the local parameters file */
276 mesh->mark = 0;
277 if ( !MMG3D_writeLocalParam(mesh) ) {
278 fprintf(stderr,"\n ## Error: %s: Unable to save the local parameters file.\n"
279 " Exit program.\n",__func__);
281 }
282
284}
285
286
297int main(int argc,char *argv[]) {
298
300 MMG5_pSol sol,met,disp,ls;
301 int ier,ierSave,fmtin,fmtout;
302 char stim[32],*ptr;
303
304 /* Select line buffering even if the output is not a terminal and force stderr
305 * and stdout to print in the same order as the events */
306 setvbuf(stdout, NULL, _IOLBF, 1024);
307 setvbuf(stderr, NULL, _IOLBF, 1024);
308
309 /* Version info */
310#ifndef MMG_COMPARABLE_OUTPUT
311 fprintf(stdout," -- MMG3D, Release %s (%s) \n",MMG_VERSION_RELEASE,MMG_RELEASE_DATE);
312 fprintf(stdout," %s\n",MMG_COPYRIGHT);
313 fprintf(stdout," %s %s\n",__DATE__,__TIME__);
314#endif
315
317
318 /* Print timer at exit */
319 atexit(MMG5_endcod);
320
322 chrono(ON,&MMG5_ctim[0]);
323
324 /* assign default values */
325 mesh = NULL;
326 met = NULL;
327 disp = NULL;
328 ls = NULL;
329
332 MMG5_ARG_ppDisp,&disp,
333 MMG5_ARG_ppLs,&ls,
335
336 /* reset default values for file names */
339 MMG5_ARG_ppDisp,&disp,
340 MMG5_ARG_ppLs,&ls,
341 MMG5_ARG_end) )
342 return MMG5_STRONGFAILURE;
343
344
345 /* Set default metric size */
348
349 /* Read command line */
350 if ( !MMG3D_parsar(argc,argv,mesh,met,ls) ) return MMG5_STRONGFAILURE;
351
352 /* load data */
353 if ( mesh->info.imprim >= 0 )
354 fprintf(stdout,"\n -- INPUT DATA\n");
355 chrono(ON,&MMG5_ctim[1]);
356
357 /* For each mode: pointer over the solution structure to load */
358 if ( mesh->info.lag >= 0 ) {
359 sol = disp;
360 }
361 else if ( mesh->info.iso || mesh->info.isosurf ) {
362 sol = ls;
363 }
364 else {
365 sol = met;
366 }
367
368 /* read mesh/sol files */
371
372 switch ( fmtin ) {
373
374 case ( MMG5_FMT_GmshASCII ): case ( MMG5_FMT_GmshBinary ):
376 break;
377
378 case ( MMG5_FMT_VtkVtu ):
380 break;
381
382 case ( MMG5_FMT_VtkVtk ):
384 break;
385
386 case ( MMG5_FMT_MeditASCII ): case ( MMG5_FMT_MeditBinary ):
388 if ( ier < 1 ) { break; }
389
390 /* In Lagrangian mode, the name of the displacement file has been parsed in ls */
391 if ( mesh->info.lag >= 0 ) {
392 if ( !MMG3D_Set_inputSolName(mesh,disp,ls->namein) ) {
394 }
396 }
397
398 if ( mesh->info.lag >= 0 || mesh->info.iso || mesh->info.isosurf ) {
399 /* displacement or isovalue are mandatory */
400 if ( MMG3D_loadSol(mesh,sol,sol->namein) < 1 ) {
401 fprintf(stdout," ## ERROR: UNABLE TO LOAD SOLUTION FILE.\n");
403 }
404 }
405 else {
406 /* Facultative metric */
407 if ( MMG3D_loadSol(mesh,met,met->namein) == -1 ) {
408 fprintf(stderr,"\n ## ERROR: WRONG DATA TYPE OR WRONG SOLUTION NUMBER.\n");
410 }
411 }
412 /* In iso mode: read metric if any */
413 if ( mesh->info.iso && met->namein ) {
414 if ( MMG3D_loadSol(mesh,met,met->namein) < 1 ) {
415 fprintf(stdout," ## ERROR: UNABLE TO LOAD METRIC.\n");
417 }
418 }
419 break;
420
421 default:
422 fprintf(stderr," ** I/O AT FORMAT %s NOT IMPLEMENTED.\n",MMG5_Get_formatName(fmtin) );
424 }
425
426 if ( ier < 1 ) {
427 if ( ier == 0 ) {
428 fprintf(stderr," ** %s NOT FOUND.\n",mesh->namein);
429 fprintf(stderr," ** UNABLE TO OPEN INPUT FILE.\n");
430 }
432 }
433
434 /* Check input data */
435 if ( mesh->info.lag > -1 ) {
436 if ( met->namein ) {
437 fprintf(stdout," ## WARNING: MESH ADAPTATION UNAVAILABLE IN"
438 " LAGRANGIAN MODE. METRIC IGNORED.\n");
440 }
441 }
442 else if ( mesh->info.iso || mesh->info.isosurf ) {
443 if ( ls == NULL || ls->m == NULL ) {
444 fprintf(stderr,"\n ## ERROR: NO ISOVALUE DATA.\n");
446 }
447 }
448
449 /* Read parameter file */
450 if ( !MMG3D_parsop(mesh,met) )
452
453 chrono(OFF,&MMG5_ctim[1]);
454 if ( mesh->info.imprim >= 0 ) {
455 printim(MMG5_ctim[1].gdif,stim);
456 fprintf(stdout," -- DATA READING COMPLETED. %s\n",stim);
457 }
458
459 if ( mesh->mark ) {
460 /* Save a local parameters file containing the default parameters */
461 ier = MMG3D_defaultOption(mesh,met,disp);
462 MMG5_RETURN_AND_FREE(mesh,met,ls,disp,ier);
463 }
464 /* Lagrangian mode */
465 else if ( mesh->info.lag > -1 ) {
466 ier = MMG3D_mmg3dmov(mesh,met,disp);
467 }
468 /* Level Set mode */
469 else if ( mesh->info.iso || mesh->info.isosurf ) {
470 ier = MMG3D_mmg3dls(mesh,ls,met);
471 }
472 /* Remeshing mode */
473 else {
474 if ( met && ls && met->namein && ls->namein ) {
475 fprintf(stdout,"\n ## ERROR: IMPOSSIBLE TO PROVIDE BOTH A METRIC"
476 " AND A SOLUTION IN ADAPTATION MODE.\n");
478 }
479 ier = MMG3D_mmg3dlib(mesh,met);
480 }
481
482 if ( ier != MMG5_STRONGFAILURE ) {
484 chrono(ON,&MMG5_ctim[1]);
485 if ( mesh->info.imprim > 0 )
486 fprintf(stdout,"\n -- WRITING DATA FILE %s\n",mesh->nameout);
487
489 fmtout = MMG5_Get_format(ptr,fmtin);
490 switch ( fmtout ) {
491 case ( MMG5_FMT_GmshASCII ): case ( MMG5_FMT_GmshBinary ):
492 ierSave = MMG3D_saveMshMesh(mesh,met,mesh->nameout);
493 break;
494 case ( MMG5_FMT_VtkVtu ):
495 ierSave = MMG3D_saveVtuMesh(mesh,met,mesh->nameout);
496 break;
497 case ( MMG5_FMT_VtkVtk ):
498 ierSave = MMG3D_saveVtkMesh(mesh,met,mesh->nameout);
499 break;
500 case ( MMG5_FMT_Tetgen ):
502 /* This format dont allow to save a solution: use a .sol file */
503 if ( !ierSave ) {
505 }
506 if ( met && met->np ) {
507 ierSave = MMG3D_saveSol(mesh,met,met->nameout);
508 }
509 break;
510
511 default:
512 ierSave = MMG3D_saveMesh(mesh,mesh->nameout);
513 if ( !ierSave ) {
515 }
516 if ( met && met->np ) {
517 ierSave = MMG3D_saveSol(mesh,met,met->nameout);
518 }
519 break;
520 }
521
522 if ( !ierSave )
524
525 chrono(OFF,&MMG5_ctim[1]);
526 if ( mesh->info.imprim > 0 )
527 fprintf(stdout," -- WRITING COMPLETED\n");
528 }
529
530 /* free mem */
531 MMG5_RETURN_AND_FREE(mesh,met,ls,disp,ier);
532}
int MMG5_Compute_constantSize(MMG5_pMesh mesh, MMG5_pSol met, double *hsiz)
const char * MMG5_Get_formatName(enum MMG5_Format fmt)
int MMG5_Get_format(char *ptr, int fmt)
char * MMG5_Get_filenameExt(char *filename)
int MMG3D_Init_mesh(const int starter,...)
int MMG3D_Set_inputSolName(MMG5_pMesh mesh, MMG5_pSol sol, const char *solin)
int MMG3D_Free_names(const int starter,...)
int MMG3D_Set_solSize(MMG5_pMesh mesh, MMG5_pSol sol, int typEntity, MMG5_int np, int typSol)
int ier
MMG5_pMesh MMG5_pSol * sol
MMG5_pMesh * mesh
program main
Example for using mmglib (basic use)
Definition: main.F90:6
int MMG5_Add_inode(MMG5_pMesh mesh, MMG5_iNode **liLi, int val)
Definition: apptools.c:68
int MMG5_countLocalParamAtTri(MMG5_pMesh mesh, MMG5_iNode **bdryRefs)
Definition: apptools.c:142
void MMG5_Free_ilinkedList(MMG5_pMesh mesh, MMG5_iNode *liLi)
Definition: apptools.c:120
int MMG5_writeLocalParamAtTri(MMG5_pMesh mesh, MMG5_iNode *bdryRefs, FILE *out)
Definition: apptools.c:186
void tminit(mytime *t, int maxtim)
Initialize mytime object.
Definition: chrono.c:120
void printim(double elps, char *stim)
Print real time.
Definition: chrono.c:160
void chrono(int cmode, mytime *ptt)
Function to measure time.
Definition: chrono.c:49
#define TIMEMAX
int MMG3D_saveMesh(MMG5_pMesh mesh, const char *filename)
Definition: inout_3d.c:1259
int MMG3D_loadSol(MMG5_pMesh mesh, MMG5_pSol met, const char *filename)
Definition: inout_3d.c:2129
int MMG3D_loadMesh(MMG5_pMesh mesh, const char *filename)
Definition: inout_3d.c:1044
int MMG3D_loadMshMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inout_3d.c:1058
int MMG3D_saveTetgenMesh(MMG5_pMesh mesh, const char *filename)
Definition: inout_3d.c:2644
int MMG3D_saveSol(MMG5_pMesh mesh, MMG5_pSol met, const char *filename)
Definition: inout_3d.c:2300
int MMG3D_saveMshMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inout_3d.c:2119
int MMG3D_loadVtkMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
int MMG3D_loadVtuMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_3d.cpp:73
int MMG3D_saveVtkMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
int MMG3D_saveVtuMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
void MMG3D_Set_commonFunc(void)
Definition: libmmg3d.c:1745
int MMG3D_mmg3dls(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_pSol umet)
Definition: libmmg3d.c:1192
int MMG3D_mmg3dlib(MMG5_pMesh mesh, MMG5_pSol met)
Definition: libmmg3d.c:975
int MMG3D_mmg3dmov(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol disp)
Definition: libmmg3d.c:1475
API headers for the mmg3d library.
LIBMMG3D_EXPORT int MMG3D_parsop(MMG5_pMesh mesh, MMG5_pSol met)
LIBMMG3D_EXPORT int(* MMG3D_doSol)(MMG5_pMesh mesh, MMG5_pSol met)
Definition: mmg3dexterns.c:11
LIBMMG3D_EXPORT int MMG3D_parsar(int argc, char *argv[], MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol)
LIBMMG3D_EXPORT void MMG3D_setfunc(MMG5_pMesh mesh, MMG5_pSol met)
#define MMG5_RETURN_AND_FREE(mesh, met, ls, disp, val)
LIBMMG_CORE_EXPORT int MMG5_unscaleMesh(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol ls)
Definition: scalem.c:689
LIBMMG_CORE_EXPORT int MMG5_scaleMesh(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol ls)
Definition: scalem.c:649
#define MMG5_ARG_ppMesh
Definition: libmmgtypes.h:96
#define MMG5_ARG_end
Definition: libmmgtypes.h:173
#define MMG5_ARG_ppLs
Definition: libmmgtypes.h:106
#define MMG5_STRONGFAILURE
Definition: libmmgtypes.h:59
#define MMG5_LOWFAILURE
Definition: libmmgtypes.h:51
#define MMG5_SUCCESS
Definition: libmmgtypes.h:43
@ MMG5_Scalar
Definition: libmmgtypes.h:213
@ MMG5_FMT_MeditBinary
Definition: libmmgtypes.h:236
@ MMG5_FMT_Tetgen
Definition: libmmgtypes.h:244
@ MMG5_FMT_VtkVtk
Definition: libmmgtypes.h:243
@ MMG5_FMT_GmshBinary
Definition: libmmgtypes.h:238
@ MMG5_FMT_GmshASCII
Definition: libmmgtypes.h:237
@ MMG5_FMT_MeditASCII
Definition: libmmgtypes.h:235
@ MMG5_FMT_VtkVtu
Definition: libmmgtypes.h:241
#define MMG5_ARG_ppDisp
Definition: libmmgtypes.h:126
#define MMG5_ARG_start
Definition: libmmgtypes.h:87
@ MMG5_Vertex
Definition: libmmgtypes.h:224
#define MMG5_ARG_ppMet
Definition: libmmgtypes.h:116
static int MMG3D_defaultOption(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol)
Definition: mmg3d.c:198
int MMG5_writeLocalParamAtTet(MMG5_pMesh mesh, MMG5_iNode *bdryRefs, FILE *out)
Definition: mmg3d.c:105
int MMG3D_writeLocalParam(MMG5_pMesh mesh)
Definition: mmg3d.c:130
mytime MMG5_ctim[TIMEMAX]
Definition: mmg3d.c:38
static void MMG5_endcod(void)
Definition: mmg3d.c:43
int MMG5_countLocalParamAtTet(MMG5_pMesh mesh, MMG5_iNode **bdyRefs)
Definition: mmg3d.c:61
#define _LIBMMG5_RETURN(mesh, sol, met, val)
static void MMG5_excfun(int sigid)
#define MMG5_FILESTR_LGTH
#define MMG5_DEL_MEM(mesh, ptr)
int8_t iso
Definition: libmmgtypes.h:534
double hsiz
Definition: libmmgtypes.h:518
int8_t isosurf
Definition: libmmgtypes.h:535
double hmin
Definition: libmmgtypes.h:518
double hmax
Definition: libmmgtypes.h:518
int8_t lag
Definition: libmmgtypes.h:540
uint8_t optim
Definition: libmmgtypes.h:546
double hausd
Definition: libmmgtypes.h:518
MMG mesh structure.
Definition: libmmgtypes.h:605
MMG5_Info info
Definition: libmmgtypes.h:651
MMG5_int ne
Definition: libmmgtypes.h:612
char * nameout
Definition: libmmgtypes.h:653
MMG5_int mark
Definition: libmmgtypes.h:618
MMG5_pTetra tetra
Definition: libmmgtypes.h:643
MMG5_int np
Definition: libmmgtypes.h:612
char * namein
Definition: libmmgtypes.h:652
char * nameout
Definition: libmmgtypes.h:674
char * namein
Definition: libmmgtypes.h:673
double * m
Definition: libmmgtypes.h:671
MMG5_int np
Definition: libmmgtypes.h:665
MMG5_int ref
Definition: libmmgtypes.h:404
Cell for linked list of integer value.
Chrono object.