Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
quality_s.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
36#include "libmmgs_private.h"
38#include "mmgsexterns_private.h"
39#include "mmgexterns_private.h"
40
41extern int8_t ddb;
42
54double caleltsig_ani(MMG5_pMesh mesh,MMG5_pSol met,MMG5_int iel) {
55 MMG5_pTria pt;
56 MMG5_pPoint pa,pb,pc;
57 double ps1,ps2,abx,aby,abz,acx,acy,acz,dd,rap,anisurf;
58 double n[3],pv[3],l[3],*ncomp,*a,*b,*c;
59 MMG5_int ia,ib,ic;
60
61 pt = &mesh->tria[iel];
62 ia = pt->v[0];
63 ib = pt->v[1];
64 ic = pt->v[2];
65
66 pa = &mesh->point[ia];
67 pb = &mesh->point[ib];
68 pc = &mesh->point[ic];
69
70 a = &pa->c[0];
71 b = &pb->c[0];
72 c = &pc->c[0];
73
74 /* area */
75 abx = b[0] - a[0];
76 aby = b[1] - a[1];
77 abz = b[2] - a[2];
78 acx = c[0] - a[0];
79 acy = c[1] - a[1];
80 acz = c[2] - a[2];
81
82 pv[0] = aby*acz - abz*acy;
83 pv[1] = abz*acx - abx*acz;
84 pv[2] = abx*acy - aby*acx;
85
86 dd = pv[0]*pv[0] + pv[1]*pv[1] + pv[2]*pv[2];
87 if ( dd < MMG5_EPSD2 ) return 0.0;
88 dd = 1.0 / sqrt(dd);
89
90 // If one of the triangle vertex is not REF or GEO, it contains the normal at
91 // the C1 surface.
92 if ( !MG_EDG(pa->tag) ) {
93 memcpy(n,&pa->n[0],3*sizeof(double));
94 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
95 ps1 *= dd;
96 }
97 else if ( !MG_EDG(pb->tag) ) {
98 memcpy(n,&pb->n[0],3*sizeof(double));
99 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
100 ps1 *= dd;
101 }
102 else if ( !MG_EDG(pc->tag) ) {
103 memcpy(n,&pc->n[0],3*sizeof(double));
104 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
105 ps1 *= dd;
106 }
107 else {
108 // We must find the normal at the surface elsewhere. Arbitrary, we take it
109 // at point pa.
110 memcpy(n,&mesh->xpoint[pa->xp].n1[0],3*sizeof(double));
111 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
112 ps1 *= dd;
113
114 if ( (pa->tag & MG_GEO) ) {
115 ncomp = &mesh->xpoint[pa->xp].n2[0];
116 ps2 = ncomp[0]*pv[0]+ncomp[1]*pv[1]+ncomp[2]*pv[2];
117 ps2 *= dd;
118 if ( fabs(1.0-fabs(ps1)) > fabs(1.0-fabs(ps2)) ) {
119 memcpy(n,ncomp,3*sizeof(double));
120 ps1 = ps2;
121 }
122 }
123 }
124
125 /* if orientation is reversed with regards to orientation of vertices */
126 if ( ps1 < 0.0 ) return -1.0;
127
128 anisurf = MMG5_surftri_ani(mesh,met,pt);
129 if ( anisurf == 0.0 ) return -1.0;
130
131 l[0] = MMG5_lenSurfEdg_ani(mesh,met,ib,ic,( pt->tag[0] & MG_GEO ));
132 l[1] = MMG5_lenSurfEdg_ani(mesh,met,ia,ic,( pt->tag[1] & MG_GEO ));
133 l[2] = MMG5_lenSurfEdg_ani(mesh,met,ia,ib,( pt->tag[2] & MG_GEO ));
134
135 rap = l[0]*l[0] + l[1]*l[1] + l[2]*l[2];
136 if ( rap < MMG5_EPSD2 ) return 0.0;
137 return anisurf / rap;
138}
139
140/* Same quality function but puts a sign according to deviation to normal to vertices */
141double caleltsig_iso(MMG5_pMesh mesh,MMG5_pSol met,MMG5_int iel) {
142 MMG5_pTria pt;
143 MMG5_pPoint pa,pb,pc;
144 double *a,*b,*c,cal,abx,aby,abz,acx,acy,acz,bcx,bcy,bcz,rap;
145 double n[3],*ncomp,pv[3],ps1,ps2,sqcal,invsqcal;
146 MMG5_int ia,ib,ic;
147
148 pt = &mesh->tria[iel];
149 ia = pt->v[0];
150 ib = pt->v[1];
151 ic = pt->v[2];
152
153 pa = &mesh->point[ia];
154 pb = &mesh->point[ib];
155 pc = &mesh->point[ic];
156
157 a = &pa->c[0];
158 b = &pb->c[0];
159 c = &pc->c[0];
160
161 /* area */
162 abx = b[0] - a[0];
163 aby = b[1] - a[1];
164 abz = b[2] - a[2];
165 acx = c[0] - a[0];
166 acy = c[1] - a[1];
167 acz = c[2] - a[2];
168 bcx = c[0] - b[0];
169 bcy = c[1] - b[1];
170 bcz = c[2] - b[2];
171
172 pv[0] = aby*acz - abz*acy;
173 pv[1] = abz*acx - abx*acz;
174 pv[2] = abx*acy - aby*acx;
175
176 cal = pv[0]*pv[0] + pv[1]*pv[1] + pv[2]*pv[2];
177 sqcal = sqrt(cal);
178
179 if ( sqcal < MMG5_EPSD2 ) return 0.0;
180 invsqcal = 1.0 / sqcal;
181
182 if ( !MG_EDG(pa->tag) ) {
183 memcpy(n,&pa->n[0],3*sizeof(double));
184 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
185 ps1 *= invsqcal;
186 }
187 else if ( !MG_EDG(pb->tag) ) {
188 memcpy(n,&pb->n[0],3*sizeof(double));
189 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
190 ps1 *= invsqcal;
191 }
192 else if ( !MG_EDG(pc->tag) ) {
193 memcpy(n,&pc->n[0],3*sizeof(double));
194 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
195 ps1 *= invsqcal;
196 }
197 else {
198 memcpy(n,&mesh->xpoint[pa->xp].n1[0],3*sizeof(double));
199 ps1 = n[0]*pv[0]+n[1]*pv[1]+n[2]*pv[2];
200 ps1 *= invsqcal;
201
202 if ( (pa->tag & MG_GEO) ) {
203 ncomp = &mesh->xpoint[pa->xp].n2[0];
204 ps2 = ncomp[0]*pv[0]+ncomp[1]*pv[1]+ncomp[2]*pv[2];
205 ps2 *= invsqcal;
206 if ( fabs(1.0-fabs(ps1)) > fabs(1.0-fabs(ps2)) ) {
207 memcpy(n,ncomp,3*sizeof(double));
208 ps1 = ps2;
209 }
210 }
211 }
212
213 /* if orientation is reversed with regards to orientation of vertex */
214 if ( ps1 < 0.0 ) return -1.0;
215 if ( cal > MMG5_EPSD2 ) {
216 /* qual = 2.*surf / length */
217 rap = abx*abx + aby*aby + abz*abz;
218 rap += acx*acx + acy*acy + acz*acz;
219 rap += bcx*bcx + bcy*bcy + bcz*bcz;
220 if ( rap > MMG5_EPSD2 )
221 return sqrt(cal) / rap;
222 else
223 return 0.0;
224 }
225 else
226 return 0.0;
227}
228
229
230/* coordinates of the center of incircle of p0p1p2 and its 'size' */
231inline double incircle(MMG5_pPoint p0,MMG5_pPoint p1,MMG5_pPoint p2,double *o) {
232 double dd,r,rr;
233
234 dd = 1.0 / 3.0;
235 o[0] = dd * (p0->c[0] + p1->c[0] + p2->c[0]);
236 o[1] = dd * (p0->c[1] + p1->c[1] + p2->c[1]);
237 o[2] = dd * (p0->c[2] + p1->c[2] + p2->c[2]);
238
239 rr = sqrt((p0->c[0]-o[0])*(p0->c[0]-o[0]) + (p0->c[1]-o[1])*(p0->c[1]-o[1]) \
240 + (p0->c[2]-o[2])*(p0->c[2]-o[2]));
241
242 r = sqrt((p1->c[0]-o[0])*(p1->c[0]-o[0]) + (p1->c[1]-o[1])*(p1->c[1]-o[1]) \
243 + (p1->c[2]-o[2])*(p1->c[2]-o[2]));
244 rr = MG_MAX(rr,r);
245
246 r = sqrt((p2->c[0]-o[0])*(p2->c[0]-o[0]) + (p2->c[1]-o[1])*(p2->c[1]-o[1]) \
247 + (p2->c[2]-o[2])*(p2->c[2]-o[2]));
248 rr = MG_MAX(rr,r);
249
250 return rr;
251}
252
254 double di,dd;
255
256 di = (p1->c[0]-p0->c[0])*(p1->c[0]-p0->c[0])
257 + (p1->c[1]-p0->c[1])*(p1->c[1]-p0->c[1])
258 + (p1->c[2]-p0->c[2])*(p1->c[2]-p0->c[2]);
259
260 dd = (p2->c[0]-p0->c[0])*(p2->c[0]-p0->c[0])
261 + (p2->c[1]-p0->c[1])*(p2->c[1]-p0->c[1])
262 + (p2->c[2]-p0->c[2])*(p2->c[2]-p0->c[2]);
263 di = MG_MAX(di,dd);
264
265 dd = (p2->c[0]-p1->c[0])*(p2->c[0]-p1->c[0])
266 + (p2->c[1]-p1->c[1])*(p2->c[1]-p1->c[1])
267 + (p2->c[2]-p1->c[2])*(p2->c[2]-p1->c[2]);
268 di = MG_MAX(di,dd);
269
270 return di;
271}
272
283int MMGS_prilen(MMG5_pMesh mesh, MMG5_pSol met, int metRidTyp) {
284 MMG5_pTria pt;
285 MMG5_Hash hash;
286 double len,avlen,lmin,lmax;
287 MMG5_int ned,hl[9],nullEdge;
288 MMG5_int k,np,nq,amin,bmin,amax,bmax;
289 int8_t ia,i0,i1,i;
290 static double bd[9]= {0.0, 0.3, 0.6, 0.7071, 0.9, 1.3, 1.4142, 2.0, 5.0};
291
292 memset(hl,0,9*sizeof(MMG5_int));
293 ned = 0;
294 avlen = 0.0;
295 lmax = 0.0;
296 lmin = 1.e30;
297 amin = amax = bmin = bmax = 0;
298 nullEdge = 0;
299
300 if ( (!met) || (!met->m) ) {
301 /* the functions that computes the edge length cannot be called without an
302 * allocated metric */
303 return 0;
304 }
305
306 if ( !mesh->nt ) {
307 return 0;
308 }
309
310 /* Hash all edges in the mesh */
311 if ( !MMG5_hashNew(mesh,&hash,mesh->np,7*mesh->np) ) return 0;
312
313 for(k=1; k<=mesh->nt; k++) {
314 pt = &mesh->tria[k];
315 if ( !MG_EOK(pt) ) continue;
316
317 for(ia=0; ia<3; ia++) {
318 i0 = MMG5_iprv2[ia];
319 i1 = MMG5_inxt2[ia];
320 np = pt->v[i0];
321 nq = pt->v[i1];
322
323 if(!MMG5_hashEdge(mesh,&hash,np,nq,0)){
324 fprintf(stderr," ## Error: %s: function MMG5_hashEdge return 0\n",
325 __func__);
326 return 0;
327 }
328 }
329 }
330
331 /* Pop edges from hash table, and analyze their length */
332 for(k=1; k<=mesh->nt; k++) {
333 pt = &mesh->tria[k];
334 if ( !MG_EOK(pt) ) continue;
335
336 for(ia=0; ia<3; ia++) {
337 i0 = MMG5_iprv2[ia];
338 i1 = MMG5_inxt2[ia];
339 np = pt->v[i0];
340 nq = pt->v[i1];
341
342 /* Remove edge from hash */
343 MMG5_hashGet(&hash,np,nq);
344
345 if ( (!metRidTyp) && met->m && met->size>1 ) {
346 len = MMG5_lenSurfEdg33_ani(mesh,met,np,nq,(pt->tag[ia] & MG_GEO));
347 }
348 else
349 len = MMG5_lenSurfEdg(mesh,met,np,nq,(pt->tag[ia] & MG_GEO));
350
351 if ( !len ) {
352 ++nullEdge;
353 }
354 else {
355 ned ++;
356 avlen += len;
357
358 if( len < lmin ) {
359 lmin = len;
360 amin = np;
361 bmin = nq;
362 }
363
364 if ( len > lmax ) {
365 lmax = len;
366 amax = np;
367 bmax = nq;
368 }
369
370 /* Locate size of edge among given table */
371 for(i=0; i<8; i++) {
372 if ( bd[i] <= len && len < bd[i+1] ) {
373 hl[i]++;
374 break;
375 }
376 }
377 if( i == 8 ) hl[8]++;
378 }
379 }
380 }
381
382 /* Display histogram */
383 MMG5_displayLengthHisto(mesh, ned, &avlen, amin, bmin, lmin,
384 amax, bmax, lmax, nullEdge, &bd[0], &hl[0],0);
385
386 MMG5_DEL_MEM(mesh,hash.item);
387 return 1;
388}
389
400 MMG5_pTria pt;
401 double rap,rapmin,rapmax,rapavg,med;
402 MMG5_int his[5],k,iel,nex,ok;
403 int i,ir,imax;
404
405 rapmin = 1.0;
406 rapmax = 0.0;
407 rapavg = med = 0.0;
408 iel = 0;
409
410 for (k=0; k<5; k++) his[k] = 0;
411
412 nex = ok = 0;
413 for (k=1; k<=mesh->nt; k++) {
414 pt = &mesh->tria[k];
415 if ( !MG_EOK(pt) ) {
416 nex++;
417 continue;
418 }
419 ok++;
420
421 if ( met->m && (met->size == 6) ) {
422 rap = MMGS_ALPHAD * MMG5_caltri33_ani(mesh,met,pt);
423 }
424 else {
425 rap = MMGS_ALPHAD * MMG5_caltri_iso (mesh,NULL,pt);
426 }
427
428 if ( rap < rapmin ) {
429 rapmin = rap;
430 iel = ok;
431 }
432 if ( rap > 0.5 ) med++;
433 if ( rap < MMGS_BADKAL ) mesh->info.badkal = 1;
434 rapavg += rap;
435 rapmax = MG_MAX(rapmax,rap);
436 ir = MG_MIN(4,(int)(5.0*rap));
437 his[ir] += 1;
438 }
439
440 fprintf(stdout,"\n -- MESH QUALITY %" MMG5_PRId "\n",mesh->nt - nex);
441 fprintf(stdout," BEST %8.6f AVRG. %8.6f WRST. %8.6f (%" MMG5_PRId ")\n",
442 rapmax,rapavg / (mesh->nt-nex),rapmin,iel);
443
444 if ( mesh->info.imprim >= 3 ){
445
446 /* print histo */
447 fprintf(stdout," HISTOGRAMM: %6.2f %% > 0.5\n",100.0*(med/(float)(mesh->nt-nex)));
448 imax = MG_MIN(4,(int)(5.*rapmax));
449 for (i=imax; i>=(int)(5*rapmin); i--) {
450 fprintf(stdout," %5.1f < Q < %5.1f %7"MMG5_PRId" %6.2f %%\n",
451 i/5.,i/5.+0.2,his[i],100.*(his[i]/(float)(mesh->nt-nex)));
452 }
453 }
454
455 return MMG5_minQualCheck(iel,rapmin,1.);
456}
457
468 MMG5_pTria pt;
469 double rap,rapmin,rapmax,rapavg,med;
470 MMG5_int nex,his[5],k,iel,ok;
471 int i,ir,imax;
472
473 if ( mesh->info.imprim <= 0 ) return 1;
474
475 rapmin = 1.0;
476 rapmax = 0.0;
477 rapavg = med = 0.0;
478 iel = 0;
479
480 for (k=0; k<5; k++) his[k] = 0;
481
482 nex = ok = 0;
483 for (k=1; k<=mesh->nt; k++) {
484 pt = &mesh->tria[k];
485 if ( !MG_EOK(pt) ) {
486 nex++;
487 continue;
488 }
489 ok++;
490
491 rap = MMGS_ALPHAD * MMG5_calelt(mesh,met,pt);
492
493 if ( rap < rapmin ) {
494 rapmin = rap;
495 iel = ok;
496 }
497 if ( rap > 0.5 ) med++;
498 if ( rap < MMGS_BADKAL ) mesh->info.badkal = 1;
499 rapavg += rap;
500 rapmax = MG_MAX(rapmax,rap);
501 ir = MG_MIN(4,(int)(5.0*rap));
502 his[ir] += 1;
503 }
504
505 fprintf(stdout,"\n -- MESH QUALITY %" MMG5_PRId "\n",mesh->nt - nex);
506 fprintf(stdout," BEST %8.6f AVRG. %8.6f WRST. %8.6f (%" MMG5_PRId ")\n",
507 rapmax,rapavg / (mesh->nt-nex),rapmin,iel);
508
509 if ( mesh->info.imprim >= 3 ){
510 /* print histo */
511 fprintf(stdout," HISTOGRAMM: %6.2f %% > 0.5\n",100.0*(med/(float)(mesh->nt-nex)));
512 imax = MG_MIN(4,(int)(5.*rapmax));
513 for (i=imax; i>=(int)(5*rapmin); i--) {
514 fprintf(stdout," %5.1f < Q < %5.1f %7"MMG5_PRId" %6.2f %%\n",
515 i/5.,i/5.+0.2,his[i],100.*(his[i]/(float)(mesh->nt-nex)));
516 }
517 }
518
519 return MMG5_minQualCheck(iel,rapmin,1.);
520}
521
522#define COS145 -0.81915204428899
523
524/* return 0: triangle ok, 1: needle, 2: obtuse; ia: edge problem */
525int8_t typelt(MMG5_pPoint p[3],int8_t *ia) {
526 double h1,h2,h3,hmi,hma,ux,uy,uz,vx,vy,vz,wx,wy,wz,dd;
527
528 ux = p[1]->c[0] - p[0]->c[0];
529 uy = p[1]->c[1] - p[0]->c[1];
530 uz = p[1]->c[2] - p[0]->c[2];
531 h1 = ux*ux + uy*uy + uz*uz;
532
533 vx = p[2]->c[0] - p[0]->c[0];
534 vy = p[2]->c[1] - p[0]->c[1];
535 vz = p[2]->c[2] - p[0]->c[2];
536 h2 = vx*vx + vy*vy + vz*vz;
537 hmi = h1;
538 hma = h2;
539 *ia = 2;
540 if ( h1 > h2 ) {
541 hmi = h2;
542 hma = h1;
543 *ia = 1;
544 }
545 wx = p[2]->c[0] - p[1]->c[0];
546 wy = p[2]->c[1] - p[1]->c[1];
547 wz = p[2]->c[2] - p[1]->c[2];
548 h3 = wx*wx + wy*wy + wz*wz;
549 if ( h3 < hmi ) {
550 hmi = h3;
551 *ia = 0;
552 }
553 else if ( h3 > hma )
554 hma = h3;
555
556 /* needle */
557 if ( hmi < 0.01 * hma ) return 1;
558
559 /* check obtuse angle */
560 dd = (ux*vx + uy*vy + uz*vz) / sqrt(h1*h2);
561 if ( dd < COS145 ) {
562 *ia = 0;
563 return 2;
564 }
565 dd = (vx*wx + vy*wy + vz*wz) / sqrt(h2*h3);
566 if ( dd < COS145 ) {
567 *ia = 2;
568 return 2;
569 }
570 dd = -(ux*wx + uy*wy + uz*wz) / sqrt(h1*h3);
571 if ( dd < COS145 ) {
572 *ia = 1;
573 return 2;
574 }
575
576 return 0;
577}
MMG5_pMesh * mesh
double MMG5_surftri_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria ptt)
Definition: anisosiz.c:124
int MMG5_hashNew(MMG5_pMesh mesh, MMG5_Hash *hash, MMG5_int hsiz, MMG5_int hmax)
Definition: hash.c:532
MMG5_int MMG5_hashGet(MMG5_Hash *hash, MMG5_int a, MMG5_int b)
Definition: hash.c:501
int MMG5_hashEdge(MMG5_pMesh mesh, MMG5_Hash *hash, MMG5_int a, MMG5_int b, MMG5_int k)
Definition: hash.c:346
static double MMG5_lenSurfEdg33_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int np0, MMG5_int np1, int8_t isedg)
static double MMG5_lenSurfEdg_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int np0, MMG5_int np1, int8_t isedg)
#define MMGS_BADKAL
#define MMGS_ALPHAD
#define MG_GEO
int MMG5_minQualCheck(MMG5_int iel, double minqual, double alpha)
Definition: quality.c:343
#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]
void MMG5_displayLengthHisto(MMG5_pMesh, MMG5_int, double *, MMG5_int, MMG5_int, double, MMG5_int, MMG5_int, double, int, double *, MMG5_int *, int8_t)
Definition: quality.c:252
static const uint8_t MMG5_inxt2[6]
double MMG5_caltri_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria ptt)
Definition: quality.c:199
#define MMG5_EPSD2
double MMG5_caltri33_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria pt)
Definition: quality.c:47
#define MMG5_DEL_MEM(mesh, ptr)
int MMGS_inqua(MMG5_pMesh mesh, MMG5_pSol met)
Definition: quality_s.c:399
double caleltsig_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int iel)
Definition: quality_s.c:54
int MMGS_prilen(MMG5_pMesh mesh, MMG5_pSol met, int metRidTyp)
Definition: quality_s.c:283
int8_t typelt(MMG5_pPoint p[3], int8_t *ia)
Definition: quality_s.c:525
int MMGS_outqua(MMG5_pMesh mesh, MMG5_pSol met)
Definition: quality_s.c:467
double incircle(MMG5_pPoint p0, MMG5_pPoint p1, MMG5_pPoint p2, double *o)
Definition: quality_s.c:231
double caleltsig_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int iel)
Definition: quality_s.c:141
int8_t ddb
Definition: mmg3d1_delone.c:42
double diamelt(MMG5_pPoint p0, MMG5_pPoint p1, MMG5_pPoint p2)
Definition: quality_s.c:253
#define COS145
Definition: quality_s.c:522
Identic as MMG5_HGeom but use MMG5_hedge to store edges instead of MMG5_hgeom (memory economy).
Definition: libmmgtypes.h:603
MMG5_hedge * item
Definition: libmmgtypes.h:605
int8_t badkal
Definition: libmmgtypes.h:540
MMG mesh structure.
Definition: libmmgtypes.h:613
MMG5_Info info
Definition: libmmgtypes.h:659
MMG5_pPoint point
Definition: libmmgtypes.h:649
MMG5_pxPoint xpoint
Definition: libmmgtypes.h:650
MMG5_int nt
Definition: libmmgtypes.h:620
MMG5_pTria tria
Definition: libmmgtypes.h:655
MMG5_int np
Definition: libmmgtypes.h:620
Structure to store vertices of an MMG mesh.
Definition: libmmgtypes.h:276
double n[3]
Definition: libmmgtypes.h:278
double c[3]
Definition: libmmgtypes.h:277
uint16_t tag
Definition: libmmgtypes.h:290
MMG5_int xp
Definition: libmmgtypes.h:285
double * m
Definition: libmmgtypes.h:680
Structure to store triangles of a MMG mesh.
Definition: libmmgtypes.h:338
uint16_t tag[3]
Definition: libmmgtypes.h:348
MMG5_int v[3]
Definition: libmmgtypes.h:340
double n2[3]
Definition: libmmgtypes.h:301
double n1[3]
Definition: libmmgtypes.h:301