Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
anisosiz_2d.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*/
34#include "libmmg2d_private.h"
35#include "libmmg2d.h"
37
51int MMG2D_defaultmet_2d(MMG5_pMesh mesh,MMG5_pSol met,MMG5_int k,int8_t i) {
52 MMG5_pTria pt;
53 double *m,isqhmax;
54 MMG5_int ip;
55
56 isqhmax = mesh->info.hmax;
57
58 isqhmax = 1.0 / (isqhmax*isqhmax);
59 pt = &mesh->tria[k];
60 ip = pt->v[i];
61 m = &met->m[3*ip];
62
63 m[0] = isqhmax;
64 m[1] = 0.0;
65 m[2] = isqhmax;
66
67 mesh->point[ip].flag = 1;
68
69 return 1;
70}
71
86int MMG2D_defmetbdy_2d(MMG5_pMesh mesh,MMG5_pSol met,MMG5_int k,int8_t i) {
87 MMG5_pTria pt;
88 MMG5_pPoint p0,p1,p2;
89 MMG5_pPar ppa;
90 double hausd,hmin,hmax,sqhmin,sqhmax,ux,uy,ll,li,ps1,ps2,lm,ltmp,pv;
91 double M1,M2,t1[2],t2[2],b1[2],b2[2],*n,*m;
92 double gpp1[2],gpp2[2];
93 MMG5_int iel,ip,ip1,ip2,it[2],list[MMG5_TRIA_LMAX+2];
94 int ilist,l;
95 int8_t isloc,hausdloc;
96 int8_t i0,i1,i2,j;
97 static int8_t mmgWarn0=0,mmgWarn1=0,mmgWarn2=0;
98
99 hmin = mesh->info.hmin;
100 hmax = mesh->info.hmax;
101 hausd = mesh->info.hausd;
102
103 pt = &mesh->tria[k];
104 ip = pt->v[i];
105 p0 = &mesh->point[ip];
106 m = &met->m[3*ip];
107
108 ip1 = ip2 = 0;
109 int8_t dummy;
110 ilist = MMG5_boulet(mesh,k,i,list,0,&dummy);
111
112 /* Local parameters if needed: note that the hausdorff param is only looked if
113 * imposed on an edge */
114 isloc = 0;
115 hausdloc = 0;
116 if ( mesh->info.npar ) {
117 /* Minimum size feature imposed by triangles */
118 for (k=0; k<ilist; k++) {
119 iel = list[k]/3;
120 pt = &mesh->tria[iel];
121 assert ( MG_EOK(pt) );
122
123 /* Retrieve local parameters associated to triangle k */
124 for (l=0; l<mesh->info.npar; l++) {
125 ppa = &mesh->info.par[l];
126 if ( ppa->elt == MMG5_Triangle && ppa->ref == pt->ref ) {
127 if ( !isloc ) {
128 hmin = ppa->hmin;
129 hmax = ppa->hmax;
130 isloc = 1;
131 }
132 else {
133 hmin = MG_MAX ( hmin, ppa->hmin );
134 hmax = MG_MIN ( hmax, ppa->hmax );
135 }
136 break;
137 }
138 }
139 /* Minimum size feature imposed by the boundary edge */
140 for ( i=0; i<3; i++ ) {
141 if ( !MG_EDG(pt->tag[i]) ) continue;
142
143 if ( mesh->info.npar ) {
144 for (l=0; l<mesh->info.npar; l++) {
145 ppa = &mesh->info.par[l];
146 if ( ppa->elt == MMG5_Edg && ppa->ref == pt->edg[i] ) {
147 if ( !hausdloc ) {
148 hausd = ppa->hausd;
149 hausdloc = 1;
150 }
151 else {
152 hausd = MG_MIN(hausd,ppa->hausd);
153 }
154 if ( !isloc ) {
155 hmax = ppa->hmax;
156 hmin = ppa->hmin;
157 }
158 else {
159 hmin = MG_MAX ( hmin, ppa->hmin );
160 hmax = MG_MIN ( hmax, ppa->hmax );
161 }
162 break;
163 }
164 }
165 }
166 }
167 }
168
169 /* Minimum size feature imposed by the vertex */
170 for (l=0; l<mesh->info.npar; l++) {
171 ppa = &mesh->info.par[l];
172 if ( ppa->elt == MMG5_Vertex && ppa->ref == p0->ref ) {
173 if ( !isloc ) {
174 hmin = ppa->hmin;
175 hmax = ppa->hmax;
176 isloc = 1;
177 }
178 else {
179 hmin = MG_MAX ( hmin, ppa->hmin );
180 hmax = MG_MIN ( hmax, ppa->hmax );
181 }
182 break;
183 }
184 }
185 }
186
187 if ( hmin > hmax ) {
188 if ( !mmgWarn2 ) {
189 assert ( isloc && "Non compatible local parameters" );
190 fprintf(stderr,"\n ## Warning: %s: Non compatible local parameters:\n"
191 " hmin (%.15lg) > hmax (%.15lg).\nhmax ignored.",__func__,hmin,hmax);
192 hmax = MMG5_HMINMAXGAP*hmin;
193 }
194 mmgWarn2 = 1;
195 }
196 sqhmin = hmin*hmin;
197 sqhmax = hmax*hmax;
198
199 /* Recover the two boundary edges meeting at ip */
200 for (l=0; l<ilist; l++) {
201 iel = list[l] / 3;
202 pt = &mesh->tria[iel];
203
204 i0 = list[l] % 3;
205 i1 = MMG5_inxt2[i0];
206 i2 = MMG5_iprv2[i0];
207
208 if ( MG_EDG(pt->tag[i1]) ) {
209 if ( ip1 == 0 ) {
210 ip1 = pt->v[i2];
211 it[0] = 3*iel+i1;
212 }
213 else if ( ip1 != pt->v[i2] ) {
214 if ( ip2 == 0 ) {
215 ip2 = pt->v[i2];
216 it[1] = 3*iel+i1;
217 }
218 else if ( ip2 != pt->v[i2] ) {
219 if ( !mmgWarn0 ) {
220 mmgWarn0 = 1;
221 fprintf(stderr,"\n ## Warning: %s: at least 1 point at the"
222 " intersection of 3 edges. abort.\n",__func__);
223 }
224 return 0;
225 }
226 }
227 }
228
229 if ( MG_EDG(pt->tag[i2]) ) {
230 if ( ip1 == 0 ) {
231 ip1 = pt->v[i1];
232 it[0] = 3*iel+i2;
233 }
234 else if ( ip1 != pt->v[i1] ) {
235 if ( ip2 == 0 ) {
236 ip2 = pt->v[i1];
237 it[1] = 3*iel+i2;
238 }
239 else if ( ip2 != pt->v[i1] ) {
240 if ( !mmgWarn0 ) {
241 mmgWarn0 = 1;
242 fprintf(stderr,"\n ## Warning: %s: at least 1 point at the"
243 " intersection of 3 edges. abort.\n",__func__);
244 }
245 return 0;
246 }
247 }
248 }
249 }
250
251 /* Check that there are exactly two boundary points connected at p0 */
252 if ( ip1 == 0 || ip2 == 0 ) {
253 if ( !mmgWarn1 ) {
254 mmgWarn1 = 1;
255 fprintf(stderr,"\n ## Warning: %s: at least 1 point that is not"
256 "at the intersection of 2 edges. abort.\n",__func__);
257 }
258 return 0;
259 }
260
261 lm = sqhmax;
262
263 /* Curvature of both boundary edges meeting at ip */
264 for (j=0; j<2; j++) {
265 iel = it[j] / 3;
266 pt = &mesh->tria[iel];
267 i0 = it[j] % 3;
268 i1 = MMG5_inxt2[i0];
269 i2 = MMG5_iprv2[i0];
270 ip1 = pt->v[i1];
271 ip2 = pt->v[i2];
272
273 p1 = &mesh->point[ip1];
274 p2 = &mesh->point[ip2];
275
276 ux = p2->c[0] - p1->c[0];
277 uy = p2->c[1] - p1->c[1];
278 ll = ux*ux + uy*uy;
279 if ( ll < MMG5_EPSD ) continue;
280 li = 1.0 / sqrt(ll);
281
282 /* Tangent vector at p1 */
283 if ( (MG_CRN & p1->tag) || p1->tag & MG_NOM ) {
284 t1[0] = li*ux;
285 t1[1] = li*uy;
286 }
287 else {
288 t1[0] = p1->n[1];
289 t1[1] = -p1->n[0];
290 }
291
292 /* Tangent vector at p2 */
293 if ( (MG_CRN & p2->tag) || p2->tag & MG_NOM ) {
294 t2[0] = li*ux;
295 t2[1] = li*uy;
296 }
297 else {
298 t2[0] = p2->n[1];
299 t2[1] = -p2->n[0];
300 }
301
302 /* Calculation of the two Bezier coefficients along the boundary curve */
303 ps1 = ux*t1[0] + uy*t1[1];
304 b1[0] = p1->c[0] + MMG5_ATHIRD*ps1*t1[0];
305 b1[1] = p1->c[1] + MMG5_ATHIRD*ps1*t1[1];
306
307 ps2 = ux*t2[0] + uy*t2[1];
308 b2[0] = p2->c[0] - MMG5_ATHIRD*ps2*t2[0];
309 b2[1] = p2->c[1] - MMG5_ATHIRD*ps2*t2[1];
310
311 ps1 *= ps1;
312 ps2 *= ps2;
313
314 if ( ps1 < MMG5_EPSD || ps2 < MMG5_EPSD ) continue;
315
316 /* \gamma^{\prime\prime}(0); \gamma^\prime(0) = ps*t1 by construction */
317 gpp1[0] = 6.0*(p1->c[0] - 2.0*b1[0] + b2[0]);
318 gpp1[1] = 6.0*(p1->c[1] - 2.0*b1[1] + b2[1]);
319
320 /* Vector product gpp1 ^ t1 */
321 pv = gpp1[0]*t1[1] - gpp1[1]*t1[0];
322 M1 = fabs(pv)/ps1;
323
324 /* \gamma^{\prime\prime}(1); \gamma^\prime(1) = -ps*t2 by construction */
325 gpp2[0] = 6.0*(p2->c[0] - 2.0*b2[0] + b1[0]);
326 gpp2[1] = 6.0*(p2->c[1] - 2.0*b2[1] + b1[1]);
327
328 /* Vector product gpp2 ^ t2 */
329 pv = gpp2[0]*t2[1] - gpp2[1]*t2[0];
330 M2 = fabs(pv)/ps2;
331
332 M1 = MG_MAX(M1,M2);
333 if ( M1 < MMG5_EPSD) continue;
334 else {
335 ltmp = 8.0*hausd / M1;
336 lm = MG_MAX(sqhmin,MG_MIN(ltmp,lm));
337 }
338 }
339
340 /* Expression of the metric tensor diag(lm,hmax) (in the (tau, n) basis) in the canonical basis */
341 n = &p0->n[0];
342 sqhmax = 1.0 / sqhmax;
343 lm = 1.0 / lm;
344
345 m[0] = lm*n[1]*n[1] + sqhmax*n[0]*n[0];
346 m[1] = n[0]*n[1]*(sqhmax-lm);
347 m[2] = lm*n[0]*n[0] + sqhmax*n[1]*n[1];
348
349 p0->flag = 2;
350
351 return 1;
352}
353
364 MMG5_pTria pt;
365 MMG5_pPoint ppt;
366 MMG5_pPar ppa;
367 double mm[3],mr[3],isqhmax;
368 MMG5_int k,ip;
369 int l;
370 int8_t ismet;
371 int8_t isdef,i;
372
373 if ( !MMG5_defsiz_startingMessage (mesh,met,__func__) ) {
374 return 0;
375 }
376
377 for (k=1; k<=mesh->np; k++) {
378 ppt = &mesh->point[k];
379 ppt->flag = 0;
380 ppt->s = 0;
381 }
382
383 /* Allocate the structure */
384 if ( met->m ) {
385 ismet = 1;
386 }
387 else {
388 ismet = 0;
389 if ( !MMG2D_Set_solSize(mesh,met,MMG5_Vertex,mesh->np,3) ) {
390 return 0;
391 }
392 }
393
397 if ( !mesh->info.nosizreq ) {
398 if ( !MMG2D_set_metricAtPointsOnReqEdges ( mesh,met,ismet ) ) {
399 return 0;
400 }
401 }
402
403 /* Step 2: Travel all the points (via triangles) in the mesh and set metric tensor */
404 for (k=1; k<=mesh->nt; k++) {
405 pt = &mesh->tria[k];
406 if ( !MG_EOK(pt) || pt->ref < 0 ) continue;
407
408 for (i=0; i<3; i++) {
409 ip = pt->v[i];
410 ppt = &mesh->point[ip];
411 if ( !MG_VOK(ppt) || ppt->flag ) continue;
412 if ( ismet )
413 memcpy(mm,&met->m[3*ip],3*sizeof(double));
414
415 isdef = 0;
416 /* Calculation of a metric tensor depending on the anisotropic features of the mesh */
417 /* At a singular point, an isotropic metric with size hmax is defined */
418 if ( (MG_CRN & ppt->tag) || ppt->tag & MG_NOM ) {
419 /* Set the point flag to 1 */
420 if ( MMG2D_defaultmet_2d(mesh,met,k,i) ) isdef = 1;
421 }
422 else if ( MG_EDG(ppt->tag) ) {
423 /* Set the point flag to 2 */
424 if ( MMG2D_defmetbdy_2d(mesh,met,k,i) ) isdef = 1;
425 }
426
427 /* If ppt is an interior point, or if it is a boundary point and the special definition of
428 a metric tensor has failed, define a default isotropic metric at ppt */
429 if ( !isdef ) {
430 MMG2D_defaultmet_2d(mesh,met,k,i);
431 }
432
433 /* If a metric is supplied by the user, intersect it with the geometric one */
434 if ( ismet && MMG5_intersecmet22(mesh,&met->m[3*ip],mm,mr) )
435 memcpy(&met->m[3*ip],mr,3*sizeof(double));
436 }
437 }
438
441 if ( mesh->info.npar ) {
442 /* Minimum size feature imposed by triangles */
443 for (k=1; k<=mesh->nt; k++) {
444 pt = &mesh->tria[k];
445 if ( !MG_EOK(pt) ) continue;
446
447 /* Retrieve local parameters associated to triangle k */
448 for (l=0; l<mesh->info.npar; l++) {
449 ppa = &mesh->info.par[l];
450 if ( ppa->elt == MMG5_Triangle && ppa->ref == pt->ref ) {
451 for (i=0; i<3; i++) {
452 ip = pt->v[i];
453 if ( mesh->point[ip].flag > 1 ) continue;
454
455 isqhmax = 1./(ppa->hmax*ppa->hmax);
456 mm[0] = mm[2] = isqhmax;
457
458 if ( MMG5_intersecmet22(mesh,&met->m[3*ip],mm,mr) ) {
459 memcpy(&met->m[3*ip],mr,3*sizeof(double));
460 }
461 }
462 break;
463 }
464 }
465 }
466 /* Minimum size feature imposed by vertices */
467 for (k=1; k<=mesh->np; k++) {
468 ppt = &mesh->point[k];
469 if ( (!MG_VOK(ppt)) || ppt->flag > 1 ) continue;
470
471 /* Retrieve local parameters associated to vertex k */
472 for (l=0; l<mesh->info.npar; l++) {
473 ppa = &mesh->info.par[l];
474 if ( ppa->elt == MMG5_Vertex && ppa->ref == ppt->ref ) {
475 isqhmax = 1./(ppa->hmax*ppa->hmax);
476 mm[0] = mm[2] = isqhmax;
477
478 if ( MMG5_intersecmet22(mesh,&met->m[3*k],mm,mr) ) {
479 memcpy(&met->m[3*k],mr,3*sizeof(double));
480 }
481 break;
482 }
483 }
484 }
485 }
486
487 return 1;
488}
489
500static inline
501void MMG2D_gradEigenv(double dm[2],double dn[2],double difsiz,int8_t dir,int8_t *ier) {
502 double hm,hn;
503
504 /* Gradation of sizes = 1/sqrt(eigenv of the tensors) in the first direction */
505 hm = 1.0 / sqrt(dm[dir]);
506 hn = 1.0 / sqrt(dn[dir]);
507
508 if ( hn > hm + difsiz + MMG5_EPSOK ) {
509 hn = hm+difsiz;
510 dn[dir] = 1.0 / (hn*hn);
511 (*ier) = (*ier) | 2;
512 }
513 else if ( hm > hn + difsiz + MMG5_EPSOK ) {
514 hm = hn+difsiz;
515 dm[dir] = 1.0 / (hm*hm);
516 (*ier) = (*ier) | 1;
517 }
518}
519
537MMG5_int MMG2D_grad2met_ani(MMG5_pMesh mesh,MMG5_pSol met,MMG5_pTria pt,MMG5_int np1,MMG5_int np2) {
538 MMG5_pPoint p1,p2;
539 double dm[2],dn[2];
540 double vp[2][2],*m,*n,ll,difsiz;
541 int8_t ier;
542
543 ier = 0;
544
545 p1 = &mesh->point[np1];
546 p2 = &mesh->point[np2];
547
548 /* Maximum allowed difference between the prescribed sizes in p1 and p2 */
549 ll = (p2->c[0]-p1->c[0])*(p2->c[0]-p1->c[0])
550 + (p2->c[1]-p1->c[1])*(p2->c[1]-p1->c[1]);
551 ll = sqrt(ll);
552
553 difsiz = ll*mesh->info.hgrad;
554
555 m = &met->m[met->size*np1];
556 n = &met->m[met->size*np2];
557
558 /* Simultaneous reduction of m1 and m2 */
559 if ( !MMG5_simred2d(mesh,m,n,dm,dn,vp) ) {
560 return 0;
561 }
562
563 /* Gradation of sizes = 1/sqrt(eigenv of the tensors) in the first direction */
564 MMG2D_gradEigenv(dm,dn,difsiz,0,&ier);
565
566 /* Gradation of sizes = 1/sqrt(eigenv of the tensors) in the second direction */
567 MMG2D_gradEigenv(dm,dn,difsiz,1,&ier);
568
569 if ( !ier ) {
570 return 0;
571 }
572
573 /* Update of the metrics = tP^-1 diag(d0,d1)P^-1, P = (vp[0], vp[1]) stored in
574 * columns */
575 if ( !MMG5_updatemet2d_ani(m,n,dm,dn,vp,ier ) ) {
576 return 0;
577 }
578
579 return ier;
580
581}
582
601 MMG5_int npmaster,MMG5_int npslave) {
602 MMG5_pPoint p2,p1;
603 double ux,uy,dm[2],dn[2];
604 double vp[2][2],*m,*n,ll,difsiz;
605 int8_t ier;
606
607 ier = 0;
608
609 p1 = &mesh->point[npmaster];
610 p2 = &mesh->point[npslave];
611
612 /* Maximum allowed difference between the prescribed sizes in p1 and p2 */
613 ux = p2->c[0]-p1->c[0];
614 uy = p2->c[1]-p1->c[1];
615
616 ll = ux*ux + uy*uy;
617 ll = sqrt(ll);
618
619 difsiz = ll*mesh->info.hgradreq;
620
621 m = &met->m[met->size*npmaster];
622 n = &met->m[met->size*npslave];
623
624 /* Simultaneous reduction of m1 and m2 */
625 if ( !MMG5_simred2d(mesh,m,n,dm,dn,vp) ) {
626 return 0;
627 }
628
629 /* Gradation of sizes = 1/sqrt(eigenv of the tensors) in the first direction */
630 MMG5_gradEigenvreq(dm,dn,difsiz,0,&ier);
631
632 /* Gradation of sizes = 1/sqrt(eigenv of the tensors) in the second direction */
633 MMG5_gradEigenvreq(dm,dn,difsiz,1,&ier);
634
635 if ( !ier ) {
636 return 0;
637 }
638
639 /* Update of the metrics = tP^-1 diag(d0,d1)P^-1, P = (vp[0], vp[1]) stored in
640 * columns */
641 if ( !MMG5_updatemetreq_ani(n,dn,vp ) ) {
642 return 0;
643 }
644
645 return ier;
646
647}
int MMG2D_Set_solSize(MMG5_pMesh mesh, MMG5_pSol sol, int typEntity, MMG5_int np, int typSol)
int ier
MMG5_pMesh * mesh
int MMG5_updatemetreq_ani(double *n, double dn[2], double vp[2][2])
Definition: anisosiz.c:1914
void MMG5_gradEigenvreq(double *dm, double *dn, double difsiz, int8_t dir, int8_t *ier)
Definition: anisosiz.c:1883
int MMG5_updatemet2d_ani(double *m, double *n, double dm[2], double dn[2], double vp[2][2], int8_t ier)
Definition: anisosiz.c:1742
int MMG5_simred2d(MMG5_pMesh mesh, double *m, double *n, double dm[2], double dn[2], double vp[2][2])
Definition: anisosiz.c:1326
static void MMG2D_gradEigenv(double dm[2], double dn[2], double difsiz, int8_t dir, int8_t *ier)
Definition: anisosiz_2d.c:501
int MMG2D_defsiz_ani(MMG5_pMesh mesh, MMG5_pSol met)
Definition: anisosiz_2d.c:363
int MMG2D_defaultmet_2d(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int k, int8_t i)
Definition: anisosiz_2d.c:51
int MMG2D_defmetbdy_2d(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int k, int8_t i)
Definition: anisosiz_2d.c:86
int MMG2D_grad2metreq_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria pt, MMG5_int npmaster, MMG5_int npslave)
Definition: anisosiz_2d.c:600
MMG5_int MMG2D_grad2met_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria pt, MMG5_int np1, MMG5_int np2)
Definition: anisosiz_2d.c:537
int MMG5_boulet(MMG5_pMesh mesh, MMG5_int start, int ip, MMG5_int *list, int8_t s, int8_t *opn)
Definition: boulep.c:363
#define MMG5_EPSD
int MMG5_defsiz_startingMessage(MMG5_pMesh mesh, MMG5_pSol met, const char *funcname)
Definition: isosiz.c:77
int MMG2D_set_metricAtPointsOnReqEdges(MMG5_pMesh mesh, MMG5_pSol met, int8_t ismet)
Definition: isosiz_2d.c:77
API headers for the mmg2d library.
@ MMG5_Vertex
Definition: libmmgtypes.h:224
@ MMG5_Edg
Definition: libmmgtypes.h:225
@ MMG5_Triangle
Definition: libmmgtypes.h:226
int MMG5_intersecmet22(MMG5_pMesh mesh, double *m, double *n, double *mr)
Definition: mettools.c:814
#define MMG5_EPSOK
#define MG_EOK(pt)
#define MG_MIN(a, b)
#define MG_MAX(a, b)
#define MG_EDG(tag)
static const uint8_t MMG5_iprv2[3]
#define MMG5_ATHIRD
#define MMG5_TRIA_LMAX
static const uint8_t MMG5_inxt2[6]
#define MG_VOK(ppt)
#define MMG5_HMINMAXGAP
#define MG_CRN
#define MG_NOM
double hmin
Definition: libmmgtypes.h:518
double hgrad
Definition: libmmgtypes.h:518
double hmax
Definition: libmmgtypes.h:518
uint8_t nosizreq
Definition: libmmgtypes.h:546
MMG5_pPar par
Definition: libmmgtypes.h:517
double hgradreq
Definition: libmmgtypes.h:518
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 nt
Definition: libmmgtypes.h:612
MMG5_pTria tria
Definition: libmmgtypes.h:647
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
MMG5_int ref
Definition: libmmgtypes.h:261
int8_t elt
Definition: libmmgtypes.h:262
Structure to store points of a MMG mesh.
Definition: libmmgtypes.h:270
double n[3]
Definition: libmmgtypes.h:272
int16_t tag
Definition: libmmgtypes.h:284
double c[3]
Definition: libmmgtypes.h:271
MMG5_int s
Definition: libmmgtypes.h:283
MMG5_int ref
Definition: libmmgtypes.h:278
MMG5_int flag
Definition: libmmgtypes.h:282
double * m
Definition: libmmgtypes.h:671
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