Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
libmmgs.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
41#include "libmmgs.h"
42#include "libmmgs_private.h"
43#include "mmgsexterns_private.h"
44#include "mmgexterns_private.h"
45
49#define MMGS_RETURN_AND_PACK(mesh,met,sol,val)do \
50 { \
51 if ( !MMGS_packMesh(mesh,met,sol) ) { \
52 mesh->npi = mesh->np; \
53 mesh->nti = mesh->nt; \
54 mesh->nai = mesh->na; \
55 mesh->nei = mesh->ne; \
56 met->npi = met->np; \
57 if ( met ) { met->npi = met->np; } \
58 if ( sol ) { sol->npi = sol->np; } \
59 return MMG5_LOWFAILURE; \
60 } \
61 _LIBMMG5_RETURN(mesh,met,sol,val); \
62 }while(0)
63
65static inline
67 MMG5_int k;
68
69 mesh->xp = 0;
70 if ( mesh->adja )
72
73 if ( mesh->xpoint )
75
76 for(k=1; k <=mesh->np; k++) {
77 mesh->point[k].xp = 0;
78 }
79
80 return;
81}
82
92static inline
94 MMG5_pTria pt,ptnew;
95 MMG5_pPoint ppt,pptnew;
96 MMG5_int iadr,iadrnew,iadrv,*adjav,*adja,*adjanew,voy;
97 MMG5_int k,nt,np,na,jel,nc,nr,nbl;
98 int imet,imetnew,i;
99 int8_t i1,i2;
100
101 /* Remove non wanted subdomains if needed */
103
104 /* compact vertices */
105 np = nc = nr = 0;
106 for (k=1; k<=mesh->np; k++) {
107 ppt = &mesh->point[k];
108 if ( !MG_VOK(ppt) ) continue;
109 ppt->tmp = ++np;
110 if ( ppt->tag & MG_CRN ) nc++;
111 ppt->ref = MMG5_abs(ppt->ref);
112 }
113
114 /* compact triangles */
115 nt = 0;
116 na = 0;
117 nbl = 1;
118 for (k=1; k<=mesh->nt; k++) {
119 pt = &mesh->tria[k];
120 if ( !MG_EOK(pt) ) continue;
121
122 pt->v[0] = mesh->point[pt->v[0]].tmp;
123 pt->v[1] = mesh->point[pt->v[1]].tmp;
124 pt->v[2] = mesh->point[pt->v[2]].tmp;
125 nt++;
126 if ( k!=nbl ) {
127 ptnew = &mesh->tria[nbl];
128 memcpy(ptnew,pt,sizeof(MMG5_Tria));
129
130 iadr = 3*(k-1) + 1;
131 adja = &mesh->adja[iadr];
132 iadrnew = 3*(nbl-1) + 1;
133 adjanew = &mesh->adja[iadrnew];
134 for(i=0 ; i<3 ; i++) {
135 adjanew[i] = adja[i];
136 if(!adja[i]) continue;
137 iadrv = 3*(adja[i]/3-1) +1;
138 adjav = &mesh->adja[iadrv];
139 voy = i;
140 adjav[adja[i]%3] = 3*nbl + voy;
141 }
142 }
143 nbl++;
144
145 /* Count the edges */
146 for(i=0 ; i<3 ; i++) {
147 if ( !MG_EDG(pt->tag[i]) ) continue;
148
149 adja = &mesh->adja[3*(k-1)+1];
150 jel = adja[i] / 3;
151
152 assert ( jel != k );
153 if ( jel ) {
154 /* If we have an adjacent, treat the edge either from the tria with
155 * higher ref or, if both tria have the same references, from the tria
156 * with higher index */
157 if ( mesh->tria[jel].ref < mesh->tria[k].ref ) {
158 continue;
159 }
160 else if ( (mesh->tria[jel].ref == mesh->tria[k].ref) && (k < jel) ) {
161 continue;
162 }
163 }
164 ++na;
165 }
166
167 }
168 mesh->nt = nt;
169
170 /* compact solutions (metric, level-set, displacement...) */
171 if ( met && met->m ) {
172 nbl = 1;
173 for (k=1; k<=mesh->np; k++) {
174 ppt = &mesh->point[k];
175 if ( !MG_VOK(ppt) ) continue;
176 imet = k * met->size;
177 imetnew = nbl * met->size;
178
179 for (i=0; i<met->size; i++)
180 met->m[imetnew + i] = met->m[imet + i];
181 ++nbl;
182 }
183 }
184
185 if ( sol && sol->m ) {
186 nbl = 1;
187 for (k=1; k<=mesh->np; k++) {
188 ppt = &mesh->point[k];
189 if ( !MG_VOK(ppt) ) continue;
190 imet = k * sol->size;
191 imetnew = nbl * sol->size;
192
193 for (i=0; i<sol->size; i++)
194 sol->m[imetnew + i] = sol->m[imet + i];
195 ++nbl;
196 }
197 }
198
199 /* compact vertices */
200 np = 0;
201 nbl = 1;
202 for (k=1; k<=mesh->np; k++) {
203 ppt = &mesh->point[k];
204 if ( !MG_VOK(ppt) ) continue;
205 np++;
206 if ( k!=nbl ) {
207 pptnew = &mesh->point[nbl];
208 memmove(pptnew,ppt,sizeof(MMG5_Point));
209 memset(ppt,0,sizeof(MMG5_Point));
210 ppt->tag = MG_NUL;
211 }
212 nbl++;
213 }
214 mesh->np = np;
215
216 if ( met && met->m )
217 met->np = np;
218
219 if ( sol && sol->m )
220 sol->np = np;
221
222 /* memory alloc */
223 mesh->na = 0;
224 if ( mesh->edge ) {
227 }
228
229 if ( na ) {
230 MMG5_ADD_MEM(mesh,(na+1)*sizeof(MMG5_Edge),"final edges",
231 na = 0;
232 printf(" ## Warning: uncomplete mesh\n")
233 );
234 }
235
236 if ( na ) {
237 MMG5_SAFE_CALLOC(mesh->edge,na+1,MMG5_Edge,return 0);
238 for (k=1; k<=mesh->nt; k++) {
239 pt = &mesh->tria[k];
240 if ( MG_EOK(pt) ) {
241 for (i=0; i<3; i++) {
242 if ( !MG_EDG(pt->tag[i]) ) continue;
243
244 adja = &mesh->adja[3*(k-1)+1];
245 jel = adja[i] / 3;
246 if ( jel ) {
247 /* If we have an adjacent, treat the edge either from the tria with
248 * higher ref or, if both tria have the same references, from the tria
249 * with higher index */
250 if ( mesh->tria[jel].ref < mesh->tria[k].ref ) {
251 continue;
252 }
253 else if ( (mesh->tria[jel].ref == mesh->tria[k].ref) && (k < jel) ) {
254 continue;
255 }
256 }
257
258 i1 = MMG5_inxt2[i];
259 i2 = MMG5_inxt2[i1];
260 mesh->na++;
261 mesh->edge[mesh->na].a = mesh->point[pt->v[i1]].tmp;
262 mesh->edge[mesh->na].b = mesh->point[pt->v[i2]].tmp;
263 mesh->edge[mesh->na].ref = pt->edg[i];
264 mesh->edge[mesh->na].tag |= pt->tag[i];
265 if ( pt->tag[i] & MG_GEO ) nr++;
266 }
267 }
268 }
269 }
270
271 for(k=1 ; k<=mesh->np ; k++)
272 mesh->point[k].tmp = 0;
273
274 mesh->npnil = mesh->np + 1;
275 for(k=mesh->npnil; k<mesh->npmax-1; k++)
276 mesh->point[k].tmp = k+1;
277
278 mesh->nenil = mesh->nt + 1;
279 for(k=mesh->nenil; k<mesh->ntmax-1; k++)
280 mesh->tria[k].v[2] = k+1;
281
282 /* to could save the mesh, the adjacency have to be correct */
283 if ( mesh->info.ddebug && (!MMG5_chkmsh(mesh,1,1) ) ) {
284 fprintf(stderr,"\n ## Warning: %s: invalid mesh.\n",__func__);
285 return 0;
286 }
287
288 if ( mesh->info.imprim > 0 ) {
289 fprintf(stdout," NUMBER OF VERTICES %8" MMG5_PRId " CORNERS %8" MMG5_PRId "\n",mesh->np,nc);
290 fprintf(stdout," NUMBER OF TRIANGLES %8" MMG5_PRId "\n",mesh->nt);
291
292 if ( mesh->na )
293 fprintf(stdout," NUMBER OF EDGES %8" MMG5_PRId " RIDGES %8" MMG5_PRId "\n",mesh->na,nr);
294 }
295 return 1;
296}
297
299{
300 MMG5_pSol met=NULL;
301 mytime ctim[TIMEMAX];
302 int8_t mettofree = 0;
303 char stim[32];
304
306 assert ( mesh );
307 assert ( sol );
308 assert ( mesh->point );
309 assert ( mesh->tria );
310
311 MMG5_version(mesh,"S");
312
313 if ( (!mesh->info.iso) && (!mesh->info.isosurf) ) {
314 fprintf(stdout,"\n ## WARNING: ISO MODE NOT PROVIDED: ENABLING ISOVALUE DISCRETIZATION MODE (-ls) \n");
315 mesh->info.iso = 1;
316 }
317
318 if ( !umet ) {
319 /* User doesn't provide the metric (library mode only), allocate our own one */
321 mettofree = 1;
322 }
323 else {
324 /* Using appli we always pass here */
325 met = umet;
326 }
327
329
333
334 /* trap exceptions */
335 signal(SIGABRT,MMG5_excfun);
336 signal(SIGFPE,MMG5_excfun);
337 signal(SIGILL,MMG5_excfun);
338 signal(SIGSEGV,MMG5_excfun);
339 signal(SIGTERM,MMG5_excfun);
340 signal(SIGINT,MMG5_excfun);
341
342 tminit(ctim,TIMEMAX);
343 chrono(ON,&(ctim[0]));
344
345#ifdef USE_SCOTCH
347#endif
348
349 /* Check options */
350 /* specific meshing */
351 if ( met && met->np ) {
352 if ( mesh->info.optim ) {
353 printf("\n ## ERROR: MISMATCH OPTIONS: OPTIM OPTION CAN NOT BE USED"
354 " WITH AN INPUT METRIC.\n");
355 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
357 }
358
359 if ( mesh->info.hsiz>0. ) {
360 printf("\n ## ERROR: MISMATCH OPTIONS: HSIZ OPTION CAN NOT BE USED"
361 " WITH AN INPUT METRIC.\n");
362 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
364 }
365 }
366
367 if ( mesh->info.optim && mesh->info.hsiz>0. ) {
368 printf("\n ## ERROR: MISMATCH OPTIONS: HSIZ AND OPTIM OPTIONS CAN NOT BE USED"
369 " TOGETHER.\n");
370 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
372 }
373
374 if ( mesh->info.optim ) {
375 printf("\n ## ERROR: MISMATCH OPTIONS: OPTIM OPTION IS NOT AVAILABLE IN"
376 " SURFACIC LEVEL_SET DISCRETIZATION MODE.\n");
377 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
379 }
380
381 if ( mesh->info.imprim > 0 ) fprintf(stdout,"\n -- MMGSLS: INPUT DATA\n");
382 /* load data */
383 chrono(ON,&(ctim[1]));
384
385 if ( sol->np && (sol->np != mesh->np) ) {
386 fprintf(stderr,"\n ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
387 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
389 }
390 else if ( sol->size!=1 ) {
391 fprintf(stderr,"\n ## ERROR: WRONG DATA TYPE.\n");
392 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
394 }
395 if ( met && met->np && (met->np != mesh->np) ) {
396 fprintf(stdout,"\n ## WARNING: WRONG METRIC NUMBER. IGNORED\n");
397 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
399 }
400
401 /* clean old isosurface */
402 if ( !MMGS_Clean_isoSurf(mesh) ) {
403 fprintf(stderr,"\n ## Unable to clean old isosurface.\n");
405 }
406
407 chrono(OFF,&(ctim[1]));
408 printim(ctim[1].gdif,stim);
409 if ( mesh->info.imprim > 0 )
410 fprintf(stdout," -- INPUT DATA COMPLETED. %s\n",stim);
411
412 /* analysis */
413 chrono(ON,&(ctim[2]));
414
415 if ( mesh->info.imprim > 0 ) {
416 fprintf(stdout,"\n -- PHASE 1 : ISOSURFACE DISCRETIZATION\n");
417 }
418
419 /* scaling mesh */
420 if ( !MMG5_scaleMesh(mesh,met,sol) ) {
421 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
423 }
424 MMGS_setfunc(mesh,met);
425
426 if ( mesh->info.imprim > 0 || mesh->info.imprim < -1 ) {
427 if ( !MMGS_inqua(mesh,met) ) {
428 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
429 if ( !MMG5_unscaleMesh(mesh,met,sol) ) {
431 }
433 }
434 }
435
436 if ( !sol->np ) {
437 fprintf(stderr,"\n ## ERROR: A VALID SOLUTION FILE IS NEEDED \n");
438 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
440 }
441
442 /* Specific meshing: compute optim option here because after isovalue
443 * discretization mesh elements have too bad qualities */
444 if ( mesh->info.optim ) {
445 /* Mean metric computation */
446 if ( !MMGS_doSol(mesh,met) ) {
447 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
448 if ( !MMG5_unscaleMesh(mesh,met,sol) ) {
451 }
452 }
453
454 /* Discretization of the mesh->info.ls isovalue of sol in the mesh */
455 if ( !MMGS_mmgs2(mesh,sol,met) ) {
456 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
458 }
459 chrono(OFF,&(ctim[2]));
460 printim(ctim[2].gdif,stim);
461 if ( mesh->info.imprim > 0 )
462 fprintf(stdout," -- PHASE 1 COMPLETED. %s\n",stim);
463
464 chrono(ON,&(ctim[3]));
465 if ( mesh->info.imprim > 0 ) {
466 fprintf(stdout,"\n -- PHASE 2 : ANALYSIS\n");
467 }
468
469 /* Specific meshing: compute hsiz on mesh after isovalue discretization */
470 if ( mesh->info.hsiz > 0. ) {
471 if ( !MMGS_Set_constantSize(mesh,met) ) {
472 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
475 }
476 }
477
478 /* mesh analysis */
479 if ( !MMGS_analys(mesh) ) {
480 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
481 if ( !MMG5_unscaleMesh(mesh,met,sol) )
484 }
485
486 chrono(OFF,&(ctim[3]));
487 printim(ctim[3].gdif,stim);
488 if ( mesh->info.imprim > 0 )
489 fprintf(stdout," -- PHASE 2 COMPLETED. %s\n",stim);
490
491 /* mesh adaptation */
492 chrono(ON,&(ctim[4]));
493 if ( mesh->info.imprim > 0 ) {
494 fprintf(stdout,"\n -- PHASE 3 : MESH IMPROVEMENT\n");
495 }
496
497 if ( !MMG5_mmgs1(mesh,met,NULL) ) {
498 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
499 if ( (!mesh->adja) && !MMGS_hashTria(mesh) ) {
500 fprintf(stderr,"\n ## Hashing problem. Invalid mesh.\n");
502 }
505 }
506
507 chrono(OFF,&(ctim[4]));
508 printim(ctim[4].gdif,stim);
509 if ( mesh->info.imprim > 0 ) {
510 fprintf(stdout," -- PHASE 3 COMPLETED. %s\n",stim);
511 }
512
513 /* save file */
514 if (!MMGS_outqua(mesh,met) ) {
515 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
518 }
519
520 chrono(ON,&(ctim[1]));
521 if ( mesh->info.imprim > 0 ) fprintf(stdout,"\n -- MESH PACKED UP\n");
522
523 if ( !MMG5_unscaleMesh(mesh,met,sol) ) {
524 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
526 }
527
528 if ( !MMGS_packMesh(mesh,met,sol) ) {
529 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
531 }
532 chrono(OFF,&(ctim[1]));
533
534 chrono(OFF,&ctim[0]);
535 printim(ctim[0].gdif,stim);
536 if ( mesh->info.imprim >= 0 ) {
537 fprintf(stdout,"\n MMGSLS: ELAPSED TIME %s\n",stim);
538 fprintf(stdout,"\n %s\n END OF MODULE MMGS\n %s\n\n",MG_STR,MG_STR);
539 }
540
541 if ( mettofree ) { MMG5_DEL_MEM(mesh,met->m);MMG5_SAFE_FREE (met); }
543}
544
546{
547 MMG5_pSol sol=NULL;
548 mytime ctim[TIMEMAX];
549 char stim[32];
550
552 assert ( mesh );
553 assert ( met );
554 assert ( mesh->point );
555 assert ( mesh->tria );
556
557 MMG5_version(mesh,"S");
558
560
564
565 /* trap exceptions */
566 signal(SIGABRT,MMG5_excfun);
567 signal(SIGFPE,MMG5_excfun);
568 signal(SIGILL,MMG5_excfun);
569 signal(SIGSEGV,MMG5_excfun);
570 signal(SIGTERM,MMG5_excfun);
571 signal(SIGINT,MMG5_excfun);
572
573 tminit(ctim,TIMEMAX);
574 chrono(ON,&(ctim[0]));
575
576 if ( mesh->info.iso || mesh->info.isosurf ) {
577 fprintf(stderr,"\n ## ERROR: LEVEL-SET DISCRETISATION UNAVAILABLE"
578 " (MMGS_IPARAM_iso or MMGS_IPARAM_isosurf):\n"
579 " YOU MUST CALL THE MMGS_MMGSLS FUNCTION TO USE THIS OPTION.\n");
581 }
582
583#ifdef USE_SCOTCH
585#endif
586
587 if ( mesh->info.imprim > 0 ) fprintf(stdout,"\n -- MMGS: INPUT DATA\n");
588
589 /* Check input */
590 chrono(ON,&(ctim[1]));
591
592 if ( met->np && (met->np != mesh->np) ) {
593 fprintf(stdout," ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
594 MMG5_DEL_MEM(mesh,met->m);
595 met->np = 0;
596 }
597 else if ( met->size!=1 && met->size!=6 ) {
598 fprintf(stderr,"\n ## ERROR: WRONG DATA TYPE.\n");
600 }
601 /* specific meshing */
602
603 if ( met->np ) {
604 if ( mesh->info.optim ) {
605 printf("\n ## ERROR: MISMATCH OPTIONS: OPTIM OPTION CAN NOT BE USED"
606 " WITH AN INPUT METRIC.\n");
608 }
609
610 if ( mesh->info.hsiz>0. ) {
611 printf("\n ## ERROR: MISMATCH OPTIONS: HSIZ OPTION CAN NOT BE USED"
612 " WITH AN INPUT METRIC.\n");
614 }
615 }
616 if ( mesh->info.optim && mesh->info.hsiz>0. ) {
617 printf("\n ## ERROR: MISMATCH OPTIONS: HSIZ AND OPTIM OPTIONS CAN NOT BE USED"
618 " TOGETHER.\n");
620 }
621
622 chrono(OFF,&(ctim[1]));
623 printim(ctim[1].gdif,stim);
624 if ( mesh->info.imprim > 0 )
625 fprintf(stdout," -- INPUT DATA COMPLETED. %s\n",stim);
626
627 /* analysis */
628 chrono(ON,&(ctim[2]));
629
630 if ( mesh->info.imprim > 0 ) {
631 fprintf(stdout,"\n -- PHASE 1 : ANALYSIS\n");
632 }
633
634 /* scaling mesh */
636
637 MMGS_setfunc(mesh,met);
638
639 /* specific meshing */
640 if ( mesh->info.hsiz > 0. ) {
641 if ( !MMGS_Set_constantSize(mesh,met) ) {
644 }
645 }
646
647 /* mesh analysis */
648 if ( !MMGS_analys(mesh) ) {
649 if ( !MMG5_unscaleMesh(mesh,met,NULL) )
652 }
653
654 /* specific meshing: optim mode needs normal at vertices */
655 if ( mesh->info.optim ) {
656 if ( !MMGS_doSol(mesh,met) ) {
659 }
660 }
661
662 if ( mesh->info.imprim > 0 || mesh->info.imprim < -1 ) {
663 if ( !MMGS_inqua(mesh,met) ) {
666 }
667 }
668
669 if ( mesh->info.imprim > 1 && met->m ) {
670 MMGS_prilen(mesh,met,0);
671 }
672
673 chrono(OFF,&(ctim[2]));
674 printim(ctim[2].gdif,stim);
675 if ( mesh->info.imprim > 0 )
676 fprintf(stdout," -- PHASE 1 COMPLETED. %s\n",stim);
677
678 /* mesh adaptation */
679 chrono(ON,&(ctim[3]));
680 if ( mesh->info.imprim > 0 ) {
681 fprintf(stdout,"\n -- PHASE 2 : %s MESHING\n",met->size < 6 ? "ISOTROPIC" : "ANISOTROPIC");
682 }
683
684 if ( !MMG5_mmgs1(mesh,met,NULL) ) {
685 if ( (!mesh->adja) && !MMGS_hashTria(mesh) ) {
686 fprintf(stderr,"\n ## Hashing problem. Invalid mesh.\n");
688 }
691 }
692
693 chrono(OFF,&(ctim[3]));
694 printim(ctim[3].gdif,stim);
695 if ( mesh->info.imprim > 0 ) {
696 fprintf(stdout," -- PHASE 2 COMPLETED. %s\n",stim);
697 }
698
699 /* save file */
700 if (!MMGS_outqua(mesh,met) ) {
703 }
704
705 if ( mesh->info.imprim > 4 && met->m )
706 MMGS_prilen(mesh,met,1);
707
708 chrono(ON,&(ctim[1]));
709 if ( mesh->info.imprim > 0 ) fprintf(stdout,"\n -- MESH PACKED UP\n");
710
712
714 chrono(OFF,&(ctim[1]));
715
716 chrono(OFF,&ctim[0]);
717 printim(ctim[0].gdif,stim);
718 if ( mesh->info.imprim >= 0 ) {
719 fprintf(stdout,"\n MMGSLIB: ELAPSED TIME %s\n",stim);
720 fprintf(stdout,"\n %s\n END OF MODULE MMGS\n %s\n\n",MG_STR,MG_STR);
721 }
722
724
725
726}
727
733 MMG5_bezierCP = MMG5_mmgsBezierCP;
734 MMG5_chkmsh = MMG5_mmgsChkmsh;
735 MMG5_indPt = MMGS_indPt;
736 MMG5_indElt = MMGS_indElt;
737 MMG5_grad2met_ani = MMG5_grad2metSurf;
738 MMG5_grad2metreq_ani = MMG5_grad2metSurfreq;
739 MMG5_solTruncature_ani = MMG5_3dSolTruncature_ani;
740
741#ifdef USE_SCOTCH
742 MMG5_renumbering = MMG5_mmgsRenumbering;
743#endif
744}
MMG5_pMesh MMG5_pSol * sol
MMG5_pMesh * mesh
int MMGS_analys(MMG5_pMesh mesh)
Definition: analys_s.c:1094
MMG5_int MMG5_grad2metSurf(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria pt, MMG5_int np1, MMG5_int np2)
Definition: anisosiz.c:975
int MMG5_grad2metSurfreq(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria pt, MMG5_int npmaster, MMG5_int npslave)
Definition: anisosiz.c:1951
int MMG5_mmgsBezierCP(MMG5_pMesh mesh, MMG5_Tria *pt, MMG5_pBezier pb, int8_t ori)
Definition: bezier_s.c:54
int MMG5_mmgsChkmsh(MMG5_pMesh mesh, int severe, MMG5_int base)
Definition: chkmsh_s.c:48
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
MMG5_int MMGS_indPt(MMG5_pMesh mesh, MMG5_int kp)
Definition: gentools_s.c:139
void MMGS_keep_only1Subdomain(MMG5_pMesh mesh, MMG5_int nsd)
Definition: gentools_s.c:161
MMG5_int MMGS_indElt(MMG5_pMesh mesh, MMG5_int kel)
Definition: gentools_s.c:123
int MMGS_hashTria(MMG5_pMesh mesh)
Definition: hash_s.c:77
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
static int MMGS_packMesh(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_pSol met)
Definition: libmmgs.c:93
int MMGS_mmgslib(MMG5_pMesh mesh, MMG5_pSol met)
Definition: libmmgs.c:545
void MMGS_Set_commonFunc(void)
Definition: libmmgs.c:732
static void MMGS_Free_topoTables(MMG5_pMesh mesh)
Definition: libmmgs.c:66
#define MMGS_RETURN_AND_PACK(mesh, met, sol, val)
Definition: libmmgs.c:49
API headers for the mmgs library.
LIBMMGS_EXPORT int MMGS_Clean_isoSurf(MMG5_pMesh mesh)
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
LIBMMGS_EXPORT int MMGS_Set_constantSize(MMG5_pMesh mesh, MMG5_pSol met)
int MMGS_mmgs2(MMG5_pMesh, MMG5_pSol, MMG5_pSol)
Definition: mmgs2.c:241
int MMGS_outqua(MMG5_pMesh, MMG5_pSol)
Definition: quality_s.c:457
int MMGS_inqua(MMG5_pMesh, MMG5_pSol)
Definition: quality_s.c:389
int MMG5_mmgsRenumbering(int, MMG5_pMesh, MMG5_pSol, MMG5_pSol, MMG5_int *)
Definition: librnbg_s.c:80
int MMG5_mmgs1(MMG5_pMesh, MMG5_pSol, MMG5_int *)
Definition: mmgs1.c:1462
int MMGS_prilen(MMG5_pMesh mesh, MMG5_pSol met, int)
Definition: quality_s.c:283
#define MMG5_STRONGFAILURE
Definition: libmmgtypes.h:59
#define MMG5_LOWFAILURE
Definition: libmmgtypes.h:51
#define MMG5_SUCCESS
Definition: libmmgtypes.h:43
void MMG5_version(MMG5_pMesh mesh, char *dim)
Functions needed by libraries API.
Definition: libtools.c:43
#define MG_GEO
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
int MMG5_3dSolTruncature_ani(MMG5_pMesh mesh, MMG5_pSol met)
Definition: scalem.c:453
#define _LIBMMG5_RETURN(mesh, sol, met, val)
#define MG_EOK(pt)
#define MG_NUL
static void MMG5_excfun(int sigid)
#define MMG5_ADD_MEM(mesh, size, message, law)
#define MG_EDG(tag)
static const uint8_t MMG5_inxt2[6]
#define MG_VOK(ppt)
static void MMG5_warnScotch(MMG5_pMesh mesh)
#define MG_CRN
#define MG_STR
#define MMG5_SAFE_FREE(ptr)
#define MMG5_DEL_MEM(mesh, ptr)
Structure to store edges of a MMG mesh.
Definition: libmmgtypes.h:305
MMG5_int b
Definition: libmmgtypes.h:306
MMG5_int ref
Definition: libmmgtypes.h:307
int16_t tag
Definition: libmmgtypes.h:310
MMG5_int a
Definition: libmmgtypes.h:306
int8_t iso
Definition: libmmgtypes.h:534
int8_t ddebug
Definition: libmmgtypes.h:532
double hsiz
Definition: libmmgtypes.h:518
int8_t isosurf
Definition: libmmgtypes.h:535
MMG5_int nsd
Definition: libmmgtypes.h:522
uint8_t optim
Definition: libmmgtypes.h:546
MMG mesh structure.
Definition: libmmgtypes.h:605
MMG5_Info info
Definition: libmmgtypes.h:651
MMG5_pPoint point
Definition: libmmgtypes.h:641
MMG5_int * adja
Definition: libmmgtypes.h:624
MMG5_pxPoint xpoint
Definition: libmmgtypes.h:642
MMG5_int nenil
Definition: libmmgtypes.h:622
MMG5_int xp
Definition: libmmgtypes.h:620
MMG5_int nt
Definition: libmmgtypes.h:612
MMG5_pTria tria
Definition: libmmgtypes.h:647
MMG5_int np
Definition: libmmgtypes.h:612
MMG5_pEdge edge
Definition: libmmgtypes.h:649
MMG5_int na
Definition: libmmgtypes.h:612
MMG5_int npnil
Definition: libmmgtypes.h:621
Structure to store points of a MMG mesh.
Definition: libmmgtypes.h:270
int16_t tag
Definition: libmmgtypes.h:284
MMG5_int tmp
Definition: libmmgtypes.h:280
MMG5_int xp
Definition: libmmgtypes.h:279
MMG5_int ref
Definition: libmmgtypes.h:278
double * m
Definition: libmmgtypes.h:671
MMG5_int np
Definition: libmmgtypes.h:665
MMG5_int edg[3]
Definition: libmmgtypes.h:339
int16_t tag[3]
Definition: libmmgtypes.h:342
MMG5_int ref
Definition: libmmgtypes.h:335
MMG5_int v[3]
Definition: libmmgtypes.h:334
Chrono object.