Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
mmgs.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 "libmmgs.h"
36#include "libmmgs_private.h"
37#include <math.h>
38
40
41
45static void MMG5_endcod(void) {
46 char stim[32];
47
48 chrono(OFF,&MMG5_ctim[0]);
49 printim(MMG5_ctim[0].gdif,stim);
50 fprintf(stdout,"\n ELAPSED TIME %s\n",stim);
51}
52
53
65 float fp1,fp2,hausd;
66 int i,j,ret,npar,nbr,split;
67 MMG5_int ref,rin,rex,br;
68 char *ptr,buf[256],data[256];
69 FILE *in;
70 fpos_t position;
71
72 /* check for parameter file */
73 strcpy(data,mesh->namein);
74
75 ptr = MMG5_Get_filenameExt(data);
76
77 if ( ptr ) *ptr = '\0';
78 strcat(data,".mmgs");
79
80 in = fopen(data,"rb");
81 if ( !in ) {
82 sprintf(data,"%s","DEFAULT.mmgs");
83 in = fopen(data,"rb");
84 if ( !in ) {
85 return 1;
86 }
87 }
88 if ( mesh->info.imprim >= 0 ) {
89 fprintf(stdout,"\n %%%% %s OPENED\n",data);
90 }
91
92 /* read parameters */
93 mesh->info.npar = 0;
94 while ( !feof(in) ) {
95 /* scan line */
96 ret = fscanf(in,"%255s",data);
97 if ( !ret || feof(in) ) break;
98 for (i=0; (size_t)i<strlen(data); i++) data[i] = tolower(data[i]);
99
100 /* Read user-defined references for the LS mode */
101 if ( !strcmp(data,"lsreferences") ) {
102 ret = fscanf(in,"%d",&npar);
103 if ( !ret ) {
104 fprintf(stderr," %%%% Wrong format for lsreferences: %d\n",npar);
105 return 0;
106 }
107
109 return 0;
110 }
111 for (i=0; i<mesh->info.nmat; i++) {
112 MMG_FSCANF(in,"%" MMG5_PRId "",&ref);
113 fgetpos(in,&position);
114 MMG_FSCANF(in,"%255s",data);
115 split = MMG5_MMAT_NoSplit;
116 rin = rex = ref;
117 if ( strcmp(data,"nosplit") ) {
118 fsetpos(in,&position);
119 split = MMG5_MMAT_Split;
120 MMG_FSCANF(in,"%" MMG5_PRId "",&rin);
121 MMG_FSCANF(in,"%" MMG5_PRId "",&rex);
122 }
123 if ( !MMGS_Set_multiMat(mesh,met,ref,split,rin,rex) ) {
124 return 0;
125 }
126 }
127 }
128 /* Read user-defined local parameters and store them in the structure info->par */
129 else if ( !strcmp(data,"parameters") ) {
130 MMG_FSCANF(in,"%d",&npar);
131
132 if ( !ret ) {
133 fprintf(stderr," %%%% Wrong format for parameters: %d\n",npar);
134 return 0;
135 }
136 else if ( npar > MMG5_LPARMAX ) {
137 fprintf(stderr," %%%% Too many local parameters %d. Abort\n",npar);
138 return 0;
139 }
140
141 /* Allocate memory and fill the info->par table (adding one, corresponding to the command line data) */
142 if ( npar ) {
144 return 0;
145
146 for (i=0; i<mesh->info.npar; i++) {
147 MMG_FSCANF(in,"%" MMG5_PRId " %255s ",&ref,buf);
148 ret = fscanf(in,"%f %f %f",&fp1,&fp2,&hausd);
149
150 if ( !ret ) {
151 fprintf(stderr," %%%% Wrong format: %s\n",buf);
152 return 0;
153 }
154
155 for (j=0; (size_t)j<strlen(buf); j++) buf[j] = tolower(buf[j]);
156
157 if ( !strcmp(buf,"triangles") || !strcmp(buf,"triangle") ) {
158 if ( !MMGS_Set_localParameter(mesh,met,MMG5_Triangle,ref,fp1,fp2,hausd) ) {
159 return 0;
160 }
161 }
162 else {
163 fprintf(stdout," %%%% Wrong format: %s\n",buf);
164 return 0;
165 }
166 }
167 }
168 }
169 /* Read user-defined references where connected components should stay attached in ls mode */
170 else if ( !strcmp(data,"lsbasereferences") ) {
171 MMG_FSCANF(in,"%d",&nbr);
173 return 0;
174
175 for (i=0; i<mesh->info.nbr; i++) {
176 MMG_FSCANF(in,"%" MMG5_PRId "",&br);
177 if ( !MMGS_Set_lsBaseReference(mesh,met,br) ) {
178 return 0;
179 }
180 }
181 }
182 else {
183 fprintf(stderr," %%%% Wrong format: %s\n",data);
184 return 0;
185 }
186 }
187
188 fclose(in);
189 return 1;
190}
191
200static inline
202 MMG5_iNode *triRefs;
203 int npar;
204 char *ptr,data[MMG5_FILESTR_LGTH];
205 FILE *out;
206
207 strcpy(data,mesh->namein);
208
209 ptr = MMG5_Get_filenameExt(data);
210
211 if ( ptr ) *ptr = '\0';
212
213 strcat(data,".mmgs");
214
216 if ( !(out = fopen(data,"wb")) ) {
217 fprintf(stderr,"\n ** UNABLE TO OPEN %s.\n",data);
218 return 0;
219 }
220
221 fprintf(stdout,"\n %%%% %s OPENED\n",data);
222
223
224 npar = MMG5_countLocalParamAtTri( mesh, &triRefs);
225
226 if ( !npar ) {
227 fclose(out);
228 return 0;
229 }
230
231 fprintf(out,"parameters\n %d\n",npar);
232
233 if ( !MMG5_writeLocalParamAtTri(mesh, triRefs, out) ) {
234 fclose(out);
235 return 0;
236 }
237
238 fclose(out);
239 fprintf(stdout," -- WRITING COMPLETED\n");
240
241 return 1;
242}
243
258static inline
260 mytime ctim[TIMEMAX];
261 double hsiz;
262 char stim[32];
263
265
266 signal(SIGABRT,MMG5_excfun);
267 signal(SIGFPE,MMG5_excfun);
268 signal(SIGILL,MMG5_excfun);
269 signal(SIGSEGV,MMG5_excfun);
270 signal(SIGTERM,MMG5_excfun);
271 signal(SIGINT,MMG5_excfun);
272
273 tminit(ctim,TIMEMAX);
274 chrono(ON,&(ctim[0]));
275
276 if ( mesh->info.npar ) {
277 fprintf(stderr,"\n ## Error: %s: "
278 "unable to save of a local parameter file with"
279 " the default parameters values because local parameters"
280 " are provided.\n",__func__);
282 }
283
284
285 if ( mesh->info.imprim > 0 ) fprintf(stdout,"\n -- INPUT DATA\n");
286 /* load data */
287 chrono(ON,&(ctim[1]));
288
289 if ( met && met->np && (met->np != mesh->np) ) {
290 fprintf(stderr,"\n ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
291 MMG5_DEL_MEM(mesh,met->m);
292 met->np = 0;
293 }
294
295 if ( sol && sol->np && (sol->np != mesh->np) ) {
296 fprintf(stderr,"\n ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
298 sol->np = 0;
299 }
300
301 chrono(OFF,&(ctim[1]));
302 printim(ctim[1].gdif,stim);
303 if ( mesh->info.imprim > 0 )
304 fprintf(stdout," -- INPUT DATA COMPLETED. %s\n",stim);
305
306 /* analysis */
307 chrono(ON,&(ctim[2]));
308 MMGS_setfunc(mesh,met);
309
310 if ( mesh->info.imprim > 0 ) {
311 fprintf(stdout,"\n -- DEFAULT PARAMETERS COMPUTATION\n");
312 }
313
314 /* scaling mesh and hmin/hmax computation*/
316
317 /* Specific meshing + hmin/hmax update */
318 if ( mesh->info.optim ) {
319 if ( !MMGS_doSol(mesh,met) ) {
322 }
323 }
324
325 if ( mesh->info.hsiz > 0. ) {
326 if ( !MMG5_Compute_constantSize(mesh,met,&hsiz) ) {
329 }
330 }
331
332 /* unscaling mesh */
334
335 /* Save the local parameters file */
336 mesh->mark = 0;
337 if ( !MMGS_writeLocalParam(mesh) ) {
338 fprintf(stderr,"\n ## Error: %s: unable to save the local parameters file.\n"
339 " Exit program.\n",__func__);
341 }
342
344}
345
346
347int main(int argc,char *argv[]) {
349 MMG5_pSol sol,met,ls;
350 int ier,ierSave,fmtin,fmtout;
351 char stim[32],*ptr;
352
353 /* Select line buffering even if the output is not a terminal and force stderr
354 * and stdout to print in the same order as the events */
355 setvbuf(stdout, NULL, _IOLBF, 1024);
356 setvbuf(stderr, NULL, _IOLBF, 1024);
357
358 /* Version info */
359#ifndef MMG_COMPARABLE_OUTPUT
360 fprintf(stdout," -- MMGS, Release %s (%s) \n",MMG_VERSION_RELEASE,MMG_RELEASE_DATE);
361 fprintf(stdout," %s\n",MMG_COPYRIGHT);
362 fprintf(stdout," %s %s\n",__DATE__,__TIME__);
363#endif
364
366
367 /* Print timer at exit */
368 atexit(MMG5_endcod);
369
371 chrono(ON,&MMG5_ctim[0]);
372
373 /* assign default values */
374 mesh = NULL;
375 met = NULL;
376 ls = NULL;
377
380 MMG5_ARG_ppLs,&ls,
382
383 /* reset default values for file names */
386 MMG5_ARG_ppLs,&ls,
388
389 /* command line */
390 if ( !MMGS_parsar(argc,argv,mesh,met,ls) ) return MMG5_STRONGFAILURE;
391
392 /* load data */
393 if ( mesh->info.imprim >= 0 )
394 fprintf(stdout,"\n -- INPUT DATA\n");
395 chrono(ON,&MMG5_ctim[1]);
396
397 /* For each mode: pointer over the solution structure to load */
398 if ( mesh->info.iso ) {
399 sol = ls;
400 }
401 else {
402 sol = met;
403 }
404
405 /* read mesh file */
408
409 switch ( fmtin ) {
410
411 case ( MMG5_FMT_GmshASCII ): case ( MMG5_FMT_GmshBinary ):
413 break;
414
415 case ( MMG5_FMT_VtkVtp ):
417 break;
418
419 case ( MMG5_FMT_VtkVtu ):
421 break;
422
423 case ( MMG5_FMT_VtkVtk ):
425 break;
426
427 case ( MMG5_FMT_MeditASCII ): case ( MMG5_FMT_MeditBinary ):
429 if ( ier < 1 ) { break; }
430
431 /* read level-set in iso mode */
432 if ( mesh->info.iso || mesh->info.isosurf ) {
433 if ( MMGS_loadSol(mesh,ls,ls->namein) < 1 ) {
434 fprintf(stderr,"\n ## ERROR: UNABLE TO LOAD LEVEL-SET.\n");
436 }
437 if ( met->namein ) {
438 if ( MMGS_loadSol(mesh,met,met->namein) < 1 ) {
439 fprintf(stdout," ## ERROR: UNABLE TO LOAD METRIC.\n");
441 }
442 }
443 }
444 else {
445 /* read metric if any */
446 if ( MMGS_loadSol(mesh,met,met->namein) == -1 ) {
447 fprintf(stderr,"\n ## ERROR: WRONG DATA TYPE OR WRONG SOLUTION NUMBER.\n");
449 }
450 }
451 break;
452
453 default:
454 fprintf(stderr," ** I/O AT FORMAT %s NOT IMPLEMENTD.\n",MMG5_Get_formatName(fmtin) );
456 }
457
458 if ( ier<1 ) {
459 if ( ier==0 ) {
460 fprintf(stderr," ** %s NOT FOUND.\n",mesh->namein);
461 fprintf(stderr," ** UNABLE TO OPEN INPUT FILE.\n");
462 }
464 }
465
466 /* Check input data */
467 if ( mesh->info.iso || mesh->info.isosurf ) {
468 if ( ls->m==NULL ) {
469 fprintf(stderr,"\n ## ERROR: NO ISOVALUE DATA.\n");
471 }
472 }
473
474 /* Read parameter file */
475 if ( !MMG5_parsop(mesh,met) )
477
478 chrono(OFF,&MMG5_ctim[1]);
479
480 if ( mesh->info.imprim >= 0 ) {
481 printim(MMG5_ctim[1].gdif,stim);
482 fprintf(stdout," -- DATA READING COMPLETED. %s\n",stim);
483 }
484
485 if ( mesh->mark ) {
486 /* Save a local parameters file containing the default parameters */
487 ier = MMGS_defaultOption(mesh,met,ls);
489 }
490 else if ( mesh->info.iso || mesh->info.isosurf ) {
491 ier = MMGS_mmgsls(mesh,ls,met);
492 }
493 else {
494 if ( met && ls && met->namein && ls->namein ) {
495 fprintf(stdout,"\n ## ERROR: IMPOSSIBLE TO PROVIDE BOTH A METRIC"
496 " AND A SOLUTION IN ADAPTATION MODE.\n");
498 }
499
500 ier = MMGS_mmgslib(mesh,met);
501 }
502
503 if ( ier != MMG5_STRONGFAILURE ) {
504 chrono(ON,&MMG5_ctim[1]);
505 if ( mesh->info.imprim > 0 )
506 fprintf(stdout,"\n -- WRITING DATA FILE %s\n",mesh->nameout);
507
509 fmtout = MMG5_Get_format(ptr,fmtin);
510
511 switch ( fmtout ) {
512 case ( MMG5_FMT_GmshASCII ): case ( MMG5_FMT_GmshBinary ):
513 ierSave = MMGS_saveMshMesh(mesh,met,mesh->nameout);
514 break;
515 case ( MMG5_FMT_VtkVtp ):
516 ierSave = MMGS_saveVtpMesh(mesh,met,mesh->nameout);
517 break;
518 case ( MMG5_FMT_VtkVtu ):
519 ierSave = MMGS_saveVtuMesh(mesh,met,mesh->nameout);
520 break;
521 case ( MMG5_FMT_VtkVtk ):
522 ierSave = MMGS_saveVtkMesh(mesh,met,mesh->nameout);
523 break;
524 default:
525 ierSave = MMGS_saveMesh(mesh,mesh->nameout);
526 if ( !ierSave ) {
528 }
529 if ( met && met->np ) {
530 ierSave = MMGS_saveSol(mesh,met,met->nameout);
531 }
532 break;
533 }
534
535 if ( !ierSave )
537
538 chrono(OFF,&MMG5_ctim[1]);
539 if ( mesh->info.imprim > 0 ) fprintf(stdout," -- WRITING COMPLETED\n");
540 }
541
542 /* release memory */
543 /* free mem */
545
546 return 0;
547}
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 MMGS_Set_iparameter(MMG5_pMesh mesh, MMG5_pSol sol, int iparam, MMG5_int val)
int MMGS_Set_localParameter(MMG5_pMesh mesh, MMG5_pSol sol, int typ, MMG5_int ref, double hmin, double hmax, double hausd)
int MMGS_Init_mesh(const int starter,...)
int MMGS_Set_lsBaseReference(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int br)
int MMGS_Set_multiMat(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int ref, int split, MMG5_int rin, MMG5_int rout)
int MMGS_Free_names(const int starter,...)
int ier
MMG5_pMesh MMG5_pSol * sol
MMG5_pMesh * mesh
program main
Example for using mmglib (basic use)
Definition: main.F90:6
int MMG5_countLocalParamAtTri(MMG5_pMesh mesh, MMG5_iNode **bdryRefs)
Definition: apptools.c:142
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 MMGS_loadSol(MMG5_pMesh mesh, MMG5_pSol met, const char *filename)
Definition: inout_s.c:1307
int MMGS_loadMshMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inout_s.c:640
int MMGS_saveMesh(MMG5_pMesh mesh, const char *filename)
Definition: inout_s.c:837
int MMGS_saveMshMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inout_s.c:1297
int MMGS_saveSol(MMG5_pMesh mesh, MMG5_pSol met, const char *filename)
Definition: inout_s.c:1478
int MMGS_loadMesh(MMG5_pMesh mesh, const char *filename)
Definition: inout_s.c:41
int MMGS_loadVtpMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_s.cpp:74
int MMGS_loadVtuMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_s.cpp:222
int MMGS_saveVtuMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_s.cpp:296
int MMGS_loadVtkMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_s.cpp:148
int MMGS_saveVtkMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_s.cpp:326
int MMGS_saveVtpMesh(MMG5_pMesh mesh, MMG5_pSol sol, const char *filename)
Definition: inoutcpp_s.cpp:356
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
int MMGS_mmgsls(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_pSol umet)
Definition: libmmgs.c:298
int MMGS_mmgslib(MMG5_pMesh mesh, MMG5_pSol met)
Definition: libmmgs.c:545
void MMGS_Set_commonFunc(void)
Definition: libmmgs.c:732
API headers for the mmgs library.
LIBMMGS_EXPORT int MMGS_parsar(int argc, char *argv[], MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol)
LIBMMGS_EXPORT int(* MMGS_doSol)(MMG5_pMesh mesh, MMG5_pSol met)
Definition: mmgsexterns.c:9
LIBMMGS_EXPORT void MMGS_setfunc(MMG5_pMesh mesh, MMG5_pSol met)
Definition: libmmgs_tools.c:43
@ MMGS_IPARAM_numberOfLocalParam
Definition: libmmgs.h:76
@ MMGS_IPARAM_numberOfLSBaseReferences
Definition: libmmgs.h:77
@ MMGS_IPARAM_numberOfMat
Definition: libmmgs.h:78
#define MMGS_RETURN_AND_FREE(mesh, met, ls, val)
#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_MMAT_Split
Definition: libmmgtypes.h:205
#define MMG5_STRONGFAILURE
Definition: libmmgtypes.h:59
#define MMG5_LOWFAILURE
Definition: libmmgtypes.h:51
#define MMG5_SUCCESS
Definition: libmmgtypes.h:43
@ MMG5_FMT_MeditBinary
Definition: libmmgtypes.h:236
@ 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_VtkVtp
Definition: libmmgtypes.h:242
@ MMG5_FMT_VtkVtu
Definition: libmmgtypes.h:241
#define MMG5_ARG_start
Definition: libmmgtypes.h:87
#define MMG5_MMAT_NoSplit
Definition: libmmgtypes.h:197
@ MMG5_Triangle
Definition: libmmgtypes.h:226
#define MMG5_ARG_ppMet
Definition: libmmgtypes.h:116
#define _LIBMMG5_RETURN(mesh, sol, met, val)
static void MMG5_excfun(int sigid)
#define MMG5_LPARMAX
#define MMG5_FILESTR_LGTH
#define MMG_FSCANF(stream, format,...)
#define MMG5_DEL_MEM(mesh, ptr)
static int MMGS_defaultOption(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol)
Definition: mmgs.c:259
static int MMGS_writeLocalParam(MMG5_pMesh mesh)
Definition: mmgs.c:201
mytime MMG5_ctim[TIMEMAX]
Definition: mmgs.c:39
static int MMG5_parsop(MMG5_pMesh mesh, MMG5_pSol met)
Definition: mmgs.c:64
static void MMG5_endcod(void)
Definition: mmgs.c:45
int8_t iso
Definition: libmmgtypes.h:534
double hsiz
Definition: libmmgtypes.h:518
int8_t isosurf
Definition: libmmgtypes.h:535
uint8_t optim
Definition: libmmgtypes.h:546
MMG mesh structure.
Definition: libmmgtypes.h:605
MMG5_Info info
Definition: libmmgtypes.h:651
char * nameout
Definition: libmmgtypes.h:653
MMG5_int mark
Definition: libmmgtypes.h:618
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
Cell for linked list of integer value.
Chrono object.