Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
scalem.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 "mmgcommon_private.h"
36#include "mmgexterns_private.h"
37
47 MMG5_pPoint ppt;
48 MMG5_int k,i;
49 double dd;
50
51 /* compute bounding box */
52 for (i=0; i<mesh->dim; i++) {
53 mesh->info.min[i] = DBL_MAX;
54 mesh->info.max[i] = -DBL_MAX;
55 }
56 for (k=1; k<=mesh->np; k++) {
57 ppt = &mesh->point[k];
58 if ( !MG_VOK(ppt) ) continue;
59 for (i=0; i<mesh->dim; i++) {
60 if ( ppt->c[i] > mesh->info.max[i] ) mesh->info.max[i] = ppt->c[i];
61 if ( ppt->c[i] < mesh->info.min[i] ) mesh->info.min[i] = ppt->c[i];
62 }
63 ppt->tmp = 0;
64 }
65 mesh->info.delta = 0.0;
66 for (i=0; i<mesh->dim; i++) {
67 dd = mesh->info.max[i] - mesh->info.min[i];
68 if ( dd > mesh->info.delta ) mesh->info.delta = dd;
69 }
70 if ( mesh->info.delta < MMG5_EPSD ) {
71 fprintf(stderr,"\n ## Error: %s: unable to scale mesh:"
72 " Check that your mesh contains non-zero points and "
73 "valid elements.\n",__func__);
74 return 0;
75 }
76
77 return 1;
78}
79
89void MMG5_check_hminhmax(MMG5_pMesh mesh, int8_t sethmin, int8_t sethmax) {
90
91 if ( !sethmin ) {
92 mesh->info.hmin *=.1;
93 /* Check that user has not given a hmax value lower that the founded
94 * hmin. */
95 if ( mesh->info.hmin > mesh->info.hmax ) {
96 mesh->info.hmin = 0.1*mesh->info.hmax;
97 }
98 }
99 if ( !sethmax ) {
100 mesh->info.hmax *=10.;
101 /* Check that user has not given a hmin value bigger that the founded
102 * hmax. */
103 if ( mesh->info.hmax < mesh->info.hmin ) {
104 mesh->info.hmax = 10.*mesh->info.hmin;
105 }
106 }
107}
108
117
118 if ( mesh->info.hmin < 0 ) {
119 if ( mesh->info.sethmin ) {
120 fprintf(stderr,"\n ## Error: %s: unexpected case (negative user setted"
121 " hmin).\n",__func__);
122 return 0;
123 }
124 }
125
126 if ( mesh->info.hmax < 0 ) {
127 if ( mesh->info.sethmax ) {
128 fprintf(stderr,"\n ## Error: %s: unexpected case (negative user setted"
129 " hmax).\n",__func__);
130 return 0;
131 }
132 }
133
134 return 1;
135}
136
148int MMG5_truncate_met3d(MMG5_pSol met, MMG5_int ip, double isqhmin, double isqhmax) {
149 double v[3][3],lambda[3],*m;
150 int i;
151 static int8_t mmgWarn = 0;
152
153 m = &met->m[(MMG5_int)met->size*ip];
154
155 if ( !MMG5_eigenv3d(1,m,lambda,v) ) {
156 if ( !mmgWarn ) {
157 fprintf(stderr,"\n ## Warning: %s: Unable to diagonalize at least"
158 " 1 metric.\n",__func__);
159 mmgWarn = 1;
160 }
161 return 0;
162 }
163
164 for (i=0; i<3; i++) {
165 if(lambda[i]<=0) {
166 if ( !mmgWarn ) {
167 fprintf(stderr,"\n ## Warning: %s: at least 1 wrong metric "
168 "(eigenvalues : %e %e %e).\n",__func__,lambda[0],
169 lambda[1],lambda[2]);
170 mmgWarn = 1;
171 }
172 return 0;
173 }
174 lambda[i]=MG_MIN(isqhmin,lambda[i]);
175 lambda[i]=MG_MAX(isqhmax,lambda[i]);
176 }
177
178 m[0] = v[0][0]*v[0][0]*lambda[0] + v[1][0]*v[1][0]*lambda[1]
179 + v[2][0]*v[2][0]*lambda[2];
180 m[1] = v[0][0]*v[0][1]*lambda[0] + v[1][0]*v[1][1]*lambda[1]
181 + v[2][0]*v[2][1]*lambda[2];
182 m[2] = v[0][0]*v[0][2]*lambda[0] + v[1][0]*v[1][2]*lambda[1]
183 + v[2][0]*v[2][2]*lambda[2];
184 m[3] = v[0][1]*v[0][1]*lambda[0] + v[1][1]*v[1][1]*lambda[1]
185 + v[2][1]*v[2][1]*lambda[2];
186 m[4] = v[0][1]*v[0][2]*lambda[0] + v[1][1]*v[1][2]*lambda[1]
187 + v[2][1]*v[2][2]*lambda[2];
188 m[5] = v[0][2]*v[0][2]*lambda[0] + v[1][2]*v[1][2]*lambda[1]
189 + v[2][2]*v[2][2]*lambda[2];
190
191 return 1;
192}
193
207 MMG5_int k;
208 int ier;
209 static int8_t mmgWarn0 = 0;
210
211 ++mesh->base;
212
213#ifndef NDEBUG
214 for (k=1; k<=mesh->np; k++) {
215 assert ( mesh->point[k].flag < mesh->base );
216 }
217#endif
218
219 for (k=1; k<=mesh->np; k++) {
220
221 if( !MG_VOK( &mesh->point[k] ) ) {
222 continue;
223 }
224
225 /* Set point flag to base so MMG5_solTruncature function will use its
226 * data to compute the hmin/hmax values if not provided by the user. */
227 mesh->point[k].flag = mesh->base;
228
229 /* Check the metric */
230 if ( met->m[k] <= 0 ) {
231 if ( !mmgWarn0 ) {
232 mmgWarn0 = 1;
233 fprintf(stderr,"\n ## Error: %s: at least 1 wrong metric.\n",
234 __func__);
235 return 0;
236 }
237 }
238 /* normalization */
239 met->m[k] *= dd;
240 }
241
243
244 return ier;
245}
246
247
261 MMG5_int k,iadr;
262 int i,ier;
263
264 dd = 1.0 / (dd*dd);
265
266 ++mesh->base;
267
268 for (k=1; k<=mesh->np; k++) {
269
270 if( !MG_VOK( &mesh->point[k] ) ) {
271 continue;
272 }
273
274 /* Set point flag to base so MMG5_solTruncature function will use its
275 * data to compute the hmin/hmax values if not provided by the user. */
276 mesh->point[k].flag = mesh->base;
277
278 iadr = k*met->size;
279 for (i=0; i<met->size; i++) {
280 met->m[iadr+i] *= dd;
281 }
282 }
283
284 ier = MMG5_solTruncature_ani(mesh, met);
285
286 return ier;
287}
288
300 MMG5_pPoint ppt;
301 double hmin,hmax;
302 MMG5_int k;
303
304 /* Security check: if hmin (resp. hmax) is not setted, it means that sethmin
305 * (resp. sethmax) is not setted too */
307 return 0;
308 }
309
310 /* If not provided by the user, compute hmin/hmax from the metric computed by
311 * the DoSol function. */
312 hmin = FLT_MAX;
313 hmax = 0.;
314 if ( (!mesh->info.sethmin) || (!mesh->info.sethmax) ) {
315 for (k=1; k<=mesh->np; k++) {
316 ppt = &mesh->point[k];
317 if ( (!MG_VOK(ppt)) || (ppt->flag < mesh->base) ) continue;
318 hmin = MG_MIN(hmin,met->m[k]);
319 hmax = MG_MAX(hmax,met->m[k]);
320 }
321 }
322
323 if ( !mesh->info.sethmin ) {
324 mesh->info.hmin = hmin;
325 }
326
327 if ( !mesh->info.sethmax ) {
328 mesh->info.hmax = hmax;
329 }
330
332
333 /* vertex size */
334 for (k=1; k<=mesh->np; k++) {
335 ppt = &mesh->point[k];
336 if ( ppt->flag<mesh->base ) {
337 met->m[k] = mesh->info.hmax;
338 }
339 else {
340 met->m[k] = MG_MIN(mesh->info.hmax,MG_MAX(mesh->info.hmin,met->m[k]));
341 }
342 }
343
344 if ( mesh->info.ddebug ) {
345 /* print unscaled values for debug purpose */
346 fprintf(stdout," After truncature computation: hmin %lf (user setted %d)\n"
347 " hmax %lf (user setted %d)\n",
350 }
351
352 return 1;
353}
354
366 MMG5_pPoint ppt;
367 MMG5_int k,iadr;
368 double isqhmin, isqhmax;
369 double lambda[2],vp[2][2];
370
371 /* Security check: if hmin (resp. hmax) is not setted, it means that sethmin
372 * (resp. sethmax) is not setted too */
374 return 0;
375 }
376
377 /* If not provided by the user, compute hmin/hmax from the metric computed by
378 * the DoSol function. */
379 isqhmin = 0.;
380 isqhmax = FLT_MAX;
381 if ( (!mesh->info.sethmin) || (!mesh->info.sethmax) ) {
382 for (k=1; k<=mesh->np; k++) {
383 ppt = &mesh->point[k];
384 if ( (!MG_VOK(ppt)) || (ppt->flag < mesh->base) ) continue;
385 iadr = met->size*k;
386
387 MMG5_eigensym(met->m+iadr,lambda,vp);
388
389 assert (lambda[0] > 0. && lambda[1] > 0. && "Negative eigenvalue");
390
391 isqhmin = MG_MAX(isqhmin,lambda[0]);
392 isqhmin = MG_MAX(isqhmin,lambda[1]);
393
394 isqhmax = MG_MIN(isqhmax,lambda[0]);
395 isqhmax = MG_MIN(isqhmax,lambda[1]);
396 }
397 }
398
399 if ( !mesh->info.sethmin ) {
400 mesh->info.hmin = 1./sqrt(isqhmin);
401 }
402
403 if ( !mesh->info.sethmax ) {
404 mesh->info.hmax = 1./sqrt(isqhmax);
405 }
406
408
409 /* vertex size */
410 isqhmin = 1./(mesh->info.hmin*mesh->info.hmin);
411 isqhmax = 1./(mesh->info.hmax*mesh->info.hmax);
412
413 for (k=1; k<=mesh->np; k++) {
414 iadr = 3*k;
415
416 ppt = &mesh->point[k];
417 if ( ppt->flag < mesh->base ) {
418 met->m[iadr] = met->m[iadr+2] = isqhmax;
419 met->m[iadr+1] = 0;
420 }
421 else {
422 MMG5_eigensym(met->m+iadr,lambda,vp);
423
424 lambda[0]=MG_MAX(isqhmax,MG_MIN(isqhmin,lambda[0]));
425 lambda[1]=MG_MAX(isqhmax,MG_MIN(isqhmin,lambda[1]));
426
427 met->m[iadr] = vp[0][0]*vp[0][0]*lambda[0] + vp[1][0]*vp[1][0]*lambda[1];
428 met->m[iadr+1] = vp[0][0]*vp[0][1]*lambda[0] + vp[1][0]*vp[1][1]*lambda[1];
429 met->m[iadr+2] = vp[0][1]*vp[0][1]*lambda[0] + vp[1][1]*vp[1][1]*lambda[1];
430 }
431 }
432
433 if ( mesh->info.ddebug ) {
434 /* print unscaled values for debug purpose */
435 fprintf(stdout," After truncature computation: hmin %lf (user setted %d)\n"
436 " hmax %lf (user setted %d)\n",
439 }
440 return 1;
441}
442
454 MMG5_pPoint ppt;
455 MMG5_int k,iadr;
456 double isqhmin, isqhmax, isqhmaxcoe;
457 double lambda[3],vp[3][3];
458
459 /* Security check: if hmin (resp. hmax) is not setted, it means that sethmin
460 * (resp. sethmax) is not setted too */
462 return 0;
463 }
464
465 /* If not provided by the user, compute hmin/hmax from the metric computed by
466 * the DoSol function. */
467 isqhmin = 0.;
468 isqhmax = FLT_MAX;
469 isqhmaxcoe = 1./(MMG5_HMAXCOE*MMG5_HMAXCOE);
470 if ( (!mesh->info.sethmin) || (!mesh->info.sethmax) ) {
471 for (k=1; k<=mesh->np; k++) {
472 ppt = &mesh->point[k];
473 if ( !MG_VOK(ppt) || (ppt->flag < mesh->base) ) {
474 continue;
475 }
476 iadr = met->size*k;
477
478 /* Check metric */
479 if (!MMG5_eigenv3d(1,met->m+iadr,lambda,vp) ) {
480 fprintf(stdout, " ## Warning: %s: %d: non diagonalizable metric."
481 " Impose hmax size at point\n",__func__,__LINE__);
482 met->m[iadr+0] = FLT_MIN;
483 met->m[iadr+1] = 0;
484 met->m[iadr+2] = 0;
485 met->m[iadr+3] = FLT_MIN;
486 met->m[iadr+4] = 0;
487 met->m[iadr+5] = FLT_MIN;
488 continue;
489 }
490 assert ( lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.
491 && "Negative eigenvalue");
492
493 /* Take only meaningful values into account: i.e. values at used points
494 * and eigenvalues not equal to MMG5_HMAXCOE for Mmgs (value used when
495 * length in normal direction can't be computed.) */
496 int j;
497 for ( j=0; j<3; ++j ) {
498 if ( isfinite(lambda[j]) && fabs(lambda[j]-isqhmaxcoe) > MMG5_EPS ) {
499 isqhmax = MG_MIN(isqhmax,lambda[j]);
500 isqhmin = MG_MAX(isqhmin,lambda[j]);
501 }
502 }
503 }
504 }
505
506 if ( !mesh->info.sethmin ) {
507 mesh->info.hmin = 1./sqrt(isqhmin);
508 }
509
510 if ( !mesh->info.sethmax ) {
511 mesh->info.hmax = 1./sqrt(isqhmax);
512 }
513
514 /* Check the compatibility between the user settings and the automatically
515 * computed values */
517
518 /* vertex size */
519 isqhmin = 1./(mesh->info.hmin*mesh->info.hmin);
520 isqhmax = 1./(mesh->info.hmax*mesh->info.hmax);
521
522 for (k=1; k<=mesh->np; k++) {
523 ppt = &mesh->point[k];
524 if ( !MG_VOK(ppt) ) continue;
525
526 if ( (ppt->flag < mesh->base) || !MMG5_truncate_met3d(met,k,isqhmin,isqhmax) ) {
527 /* Fail to diagonalize metric: put hmax */
528 iadr = 6*k;
529 met->m[iadr] = isqhmax;
530 met->m[iadr+1] = 0.;
531 met->m[iadr+2] = 0.;
532 met->m[iadr+3] = isqhmax;
533 met->m[iadr+4] = 0.;
534 met->m[iadr+5] = isqhmax;
535 }
536 }
537
538 if ( mesh->info.ddebug ) {
539 /* print unscaled values for debug purpose */
540 fprintf(stdout," After truncature computation: hmin %lf (user setted %d)\n"
541 " hmax %lf (user setted %d)\n",
544 }
545
546 return 1;
547}
548
562 MMG5_pPoint ppt;
563 MMG5_pPar par;
564 MMG5_int k,i;
565 int8_t hsizOrOptim;
566
567 /* sol is a level-set or a displacement so it cannot be an aniso metric */
568 if ( sol ) { assert ( sol->type == MMG5_Scalar || sol->type == MMG5_Vector ); }
569
570 /* met is a metric so it cannot be a vector */
571 if ( met ) { assert ( met->type != MMG5_Vector ); }
572
573 /* if we are not in iso, isosurf or lagrangian mode, check that sol isn't allocated */
574 if ( (!mesh->info.iso) && (!mesh->info.isosurf) && mesh->info.lag < 0 ) {
575 assert ( !(sol && sol->m) );
576 }
577
578 /* compute bounding box */
579 if ( ! MMG5_boundingBox(mesh) ) return 0;
580
581 /* normalize coordinates */
582 *dd = 1.0 / mesh->info.delta;
583 for (k=1; k<=mesh->np; k++) {
584 ppt = &mesh->point[k];
585 if ( !MG_VOK(ppt) ) continue;
586 for (i=0 ; i<mesh->dim ; i++)
587 ppt->c[i] = (*dd) * (ppt->c[i] - mesh->info.min[i]);
588 }
589
590 mesh->info.hausd *= (*dd);
591 mesh->info.ls *= (*dd);
592 mesh->info.hsiz *= (*dd);
593
594 /* normalize local parameters */
595 for (k=0; k<mesh->info.npar; k++) {
596 par = &mesh->info.par[k];
597 par->hmin *= (*dd);
598 par->hmax *= (*dd);
599 par->hausd *= (*dd);
600 }
601
602 /* Security check: if hmin (resp. hmax) is not setted, it means that sethmin
603 * (resp. sethmax) is not setted too */
605 return 0;
606 }
607
608 if ( mesh->info.sethmin ) {
609 mesh->info.hmin *= (*dd);
610 }
611 if ( mesh->info.sethmax ) {
612 mesh->info.hmax *= (*dd);
613 }
614
615 hsizOrOptim = ( mesh->info.hsiz > 0. || mesh->info.optim )? 1 : 0;
616
617 /* if we are not in optim or hsiz mode and if we don't have a metric, compute
618 * default hmin/hmax */
619 if ( (!hsizOrOptim) && (!(met && met->np)) ) {
620 /* Set default values to hmin/hmax from the bounding box if not provided by
621 * the user */
623 fprintf(stderr,"\n ## Error: %s: Exit program.\n",__func__);
624 return 0;
625 }
626 }
627
628 if ( sol && sol->np ) {
629 for ( k=sol->size; k<sol->size*(mesh->np+1); k++ ) {
630 sol->m[k] *= (*dd);
631 }
632 }
633
634 return 1;
635
636}
650 double dd;
651
652 if ( !MMG5_scale_meshAndSol(mesh,met,sol,&dd) ) {
653 return 0;
654 }
655
656 if ( (!met) || (met && !met->np) || (!met->m) ) {
657 return 1;
658 }
659
660 if ( met->size == 1 ) {
661 /* isotropic metric */
662 if ( !MMG5_scale_scalarMetric ( mesh, met, dd ) ) {
663 return 0;
664 }
665 }
666 else if ( met->size == (mesh->dim-1)*3 ) {
667 /* anisotropic metric: met->size=3 in 2D and 6 in 3D */
668 if ( !MMG5_scale_tensorMetric ( mesh, met, dd ) ) {
669 return 0;
670 }
671 }
672 else {
673 fprintf(stderr,"\n ## Error: %s: unexpected metric size (%d)\n",__func__,met->size);
674 }
675
676 return 1;
677}
678
690 MMG5_pPoint ppt;
691 double dd;
692 int i;
693 MMG5_int k,iadr;
694 MMG5_pPar par;
695
696 /* de-normalize coordinates */
697 dd = mesh->info.delta;
698 for (k=1; k<=mesh->np; k++) {
699 ppt = &mesh->point[k];
700 if ( !MG_VOK(ppt) ) continue;
701 for ( i=0; i<mesh->dim; ++i ) {
702 ppt->c[i] = ppt->c[i] * dd + mesh->info.min[i];
703 }
704 }
705
706 /* unscale paramter values */
707 if ( !mesh->info.sethmin ) {
709 }
710 else {
711 mesh->info.hmin *= dd;
712 }
713
714 if ( !mesh->info.sethmax ) {
716 }
717 else {
718 mesh->info.hmax *= dd;
719 }
720 mesh->info.hausd *= dd;
721 mesh->info.ls *= dd;
722 mesh->info.hsiz *= dd;
723
724 /* normalize local parameters */
725 for (k=0; k<mesh->info.npar; k++) {
726 par = &mesh->info.par[k];
727 par->hmin *= dd;
728 par->hmax *= dd;
729 par->hausd *= dd;
730 }
731
732 /* de-normalize level-set or displacement */
733 if ( sol && sol->np && sol->m ) {
734 assert ( sol->size != MMG5_Tensor );
735 for (k=1; k<=mesh->np; k++) {
736 ppt = &mesh->point[k];
737 if ( !MG_VOK(ppt) ) continue;
738 iadr = k*sol->size;
739 for (i=0; i<sol->size; i++) sol->m[iadr+i] *= dd;
740 }
741 }
742
743 /* reset the scaling data to ensure that if we try to unscale again, we will
744 * do nothing */
745 mesh->info.delta = 1.;
746 mesh->info.min[0]= 0.;
747 mesh->info.min[1]= 0.;
748 mesh->info.min[2]= 0.;
749
750 /* de-normalize metric */
751 if ( !(met && met->np && met->m) ) return 1;
752
753 /* unscale sizes */
754 switch (met->type) {
755 case 1:
756 for (k=1; k<=mesh->np; k++) {
757 ppt = &mesh->point[k];
758 if ( !MG_VOK(ppt) ) continue;
759 met->m[k] *= dd;
760 }
761 break;
762 case 3:
763 dd = 1.0 / (dd*dd);
764 for (k=1; k<=mesh->np; k++) {
765 ppt = &mesh->point[k];
766 if ( !MG_VOK(ppt) ) continue;
767 for (i=0; i<met->size; i++) met->m[met->size*k+i] *= dd;
768 }
769 break;
770 default:
771 fprintf(stderr,"\n ## Error: %s: unexpected metric size (%d)\n",__func__,met->size);
772 break;
773 }
774
775 return 1;
776}
int MMG5_Set_defaultTruncatureSizes(MMG5_pMesh mesh, int8_t sethmin, int8_t sethmax)
int ier
MMG5_pMesh MMG5_pSol * sol
if(!ier) exit(EXIT_FAILURE)
MMG5_pMesh * mesh
int MMG5_eigensym(double m[3], double lambda[2], double vp[2][2])
Definition: eigenv.c:973
int MMG5_eigenv3d(int symmat, double *mat, double lambda[3], double v[3][3])
Find eigenvalues and vectors of a 3x3 matrix.
Definition: eigenv.c:385
#define MMG5_EPSD
#define MMG5_EPS
@ MMG5_Vector
Definition: libmmgtypes.h:214
@ MMG5_Tensor
Definition: libmmgtypes.h:215
@ MMG5_Scalar
Definition: libmmgtypes.h:213
#define MMG5_NONSET_HMIN
#define MG_MIN(a, b)
#define MG_MAX(a, b)
#define MMG5_HMAXCOE
#define MMG5_NONSET_HMAX
#define MG_VOK(ppt)
int MMG5_scale_meshAndSol(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol, double *dd)
Definition: scalem.c:561
int MMG5_3dSolTruncature_ani(MMG5_pMesh mesh, MMG5_pSol met)
Definition: scalem.c:453
int MMG5_boundingBox(MMG5_pMesh mesh)
Definition: scalem.c:46
int MMG5_scaleMesh(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol)
Definition: scalem.c:649
int MMG5_scale_tensorMetric(MMG5_pMesh mesh, MMG5_pSol met, double dd)
Definition: scalem.c:260
void MMG5_check_hminhmax(MMG5_pMesh mesh, int8_t sethmin, int8_t sethmax)
Definition: scalem.c:89
int MMG5_truncate_met3d(MMG5_pSol met, MMG5_int ip, double isqhmin, double isqhmax)
Definition: scalem.c:148
int MMG5_unscaleMesh(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pSol sol)
Definition: scalem.c:689
int MMG5_solTruncature_iso(MMG5_pMesh mesh, MMG5_pSol met)
Definition: scalem.c:299
int MMG5_scale_scalarMetric(MMG5_pMesh mesh, MMG5_pSol met, double dd)
Definition: scalem.c:206
int MMG5_check_setted_hminhmax(MMG5_pMesh mesh)
Definition: scalem.c:116
int MMG5_2dSolTruncature_ani(MMG5_pMesh mesh, MMG5_pSol met)
Definition: scalem.c:365
int8_t iso
Definition: libmmgtypes.h:534
int8_t ddebug
Definition: libmmgtypes.h:532
double delta
Definition: libmmgtypes.h:519
double hsiz
Definition: libmmgtypes.h:518
int8_t isosurf
Definition: libmmgtypes.h:535
int8_t sethmin
Definition: libmmgtypes.h:544
double min[3]
Definition: libmmgtypes.h:519
double hmin
Definition: libmmgtypes.h:518
double max[3]
Definition: libmmgtypes.h:519
double hmax
Definition: libmmgtypes.h:518
double ls
Definition: libmmgtypes.h:519
int8_t lag
Definition: libmmgtypes.h:540
int8_t sethmax
Definition: libmmgtypes.h:545
MMG5_pPar par
Definition: libmmgtypes.h:517
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_pPoint point
Definition: libmmgtypes.h:641
MMG5_int base
Definition: libmmgtypes.h:616
MMG5_int np
Definition: libmmgtypes.h:612
double hmin
Definition: libmmgtypes.h:258
double hmax
Definition: libmmgtypes.h:259
double hausd
Definition: libmmgtypes.h:260
Structure to store points of a MMG mesh.
Definition: libmmgtypes.h:270
MMG5_int tmp
Definition: libmmgtypes.h:280
double c[3]
Definition: libmmgtypes.h:271
MMG5_int flag
Definition: libmmgtypes.h:282
double * m
Definition: libmmgtypes.h:671
MMG5_int np
Definition: libmmgtypes.h:665