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 /* Hash all edges in the mesh */
301 if ( !MMG5_hashNew(mesh,&hash,mesh->np,7*mesh->np) ) return 0;
302
303 for(k=1; k<=mesh->nt; k++) {
304 pt = &mesh->tria[k];
305 if ( !MG_EOK(pt) ) continue;
306
307 for(ia=0; ia<3; ia++) {
308 i0 = MMG5_iprv2[ia];
309 i1 = MMG5_inxt2[ia];
310 np = pt->v[i0];
311 nq = pt->v[i1];
312
313 if(!MMG5_hashEdge(mesh,&hash,np,nq,0)){
314 fprintf(stderr," ## Error: %s: function MMG5_hashEdge return 0\n",
315 __func__);
316 return 0;
317 }
318 }
319 }
320
321 /* Pop edges from hash table, and analyze their length */
322 for(k=1; k<=mesh->nt; k++) {
323 pt = &mesh->tria[k];
324 if ( !MG_EOK(pt) ) continue;
325
326 for(ia=0; ia<3; ia++) {
327 i0 = MMG5_iprv2[ia];
328 i1 = MMG5_inxt2[ia];
329 np = pt->v[i0];
330 nq = pt->v[i1];
331
332 /* Remove edge from hash */
333 MMG5_hashGet(&hash,np,nq);
334
335 if ( (!metRidTyp) && met->m && met->size>1 ) {
336 len = MMG5_lenSurfEdg33_ani(mesh,met,np,nq,(pt->tag[ia] & MG_GEO));
337 }
338 else
339 len = MMG5_lenSurfEdg(mesh,met,np,nq,(pt->tag[ia] & MG_GEO));
340
341 if ( !len ) {
342 ++nullEdge;
343 }
344 else {
345 ned ++;
346 avlen += len;
347
348 if( len < lmin ) {
349 lmin = len;
350 amin = np;
351 bmin = nq;
352 }
353
354 if ( len > lmax ) {
355 lmax = len;
356 amax = np;
357 bmax = nq;
358 }
359
360 /* Locate size of edge among given table */
361 for(i=0; i<8; i++) {
362 if ( bd[i] <= len && len < bd[i+1] ) {
363 hl[i]++;
364 break;
365 }
366 }
367 if( i == 8 ) hl[8]++;
368 }
369 }
370 }
371
372 /* Display histogram */
373 MMG5_displayLengthHisto(mesh, ned, &avlen, amin, bmin, lmin,
374 amax, bmax, lmax, nullEdge, &bd[0], &hl[0],0);
375
376 MMG5_DEL_MEM(mesh,hash.item);
377 return 1;
378}
379
390 MMG5_pTria pt;
391 double rap,rapmin,rapmax,rapavg,med;
392 MMG5_int his[5],k,iel,nex,ok;
393 int i,ir,imax;
394
395 rapmin = 1.0;
396 rapmax = 0.0;
397 rapavg = med = 0.0;
398 iel = 0;
399
400 for (k=0; k<5; k++) his[k] = 0;
401
402 nex = ok = 0;
403 for (k=1; k<=mesh->nt; k++) {
404 pt = &mesh->tria[k];
405 if ( !MG_EOK(pt) ) {
406 nex++;
407 continue;
408 }
409 ok++;
410
411 if ( met->m && (met->size == 6) ) {
412 rap = MMGS_ALPHAD * MMG5_caltri33_ani(mesh,met,pt);
413 }
414 else {
415 rap = MMGS_ALPHAD * MMG5_caltri_iso (mesh,NULL,pt);
416 }
417
418 if ( rap < rapmin ) {
419 rapmin = rap;
420 iel = ok;
421 }
422 if ( rap > 0.5 ) med++;
423 if ( rap < MMGS_BADKAL ) mesh->info.badkal = 1;
424 rapavg += rap;
425 rapmax = MG_MAX(rapmax,rap);
426 ir = MG_MIN(4,(int)(5.0*rap));
427 his[ir] += 1;
428 }
429
430 fprintf(stdout,"\n -- MESH QUALITY %" MMG5_PRId "\n",mesh->nt - nex);
431 fprintf(stdout," BEST %8.6f AVRG. %8.6f WRST. %8.6f (%" MMG5_PRId ")\n",
432 rapmax,rapavg / (mesh->nt-nex),rapmin,iel);
433
434 if ( mesh->info.imprim >= 3 ){
435
436 /* print histo */
437 fprintf(stdout," HISTOGRAMM: %6.2f %% > 0.5\n",100.0*(med/(float)(mesh->nt-nex)));
438 imax = MG_MIN(4,(int)(5.*rapmax));
439 for (i=imax; i>=(int)(5*rapmin); i--) {
440 fprintf(stdout," %5.1f < Q < %5.1f %7"MMG5_PRId" %6.2f %%\n",
441 i/5.,i/5.+0.2,his[i],100.*(his[i]/(float)(mesh->nt-nex)));
442 }
443 }
444
445 return MMG5_minQualCheck(iel,rapmin,1.);
446}
447
458 MMG5_pTria pt;
459 double rap,rapmin,rapmax,rapavg,med;
460 MMG5_int nex,his[5],k,iel,ok;
461 int i,ir,imax;
462
463 if ( mesh->info.imprim <= 0 ) return 1;
464
465 rapmin = 1.0;
466 rapmax = 0.0;
467 rapavg = med = 0.0;
468 iel = 0;
469
470 for (k=0; k<5; k++) his[k] = 0;
471
472 nex = ok = 0;
473 for (k=1; k<=mesh->nt; k++) {
474 pt = &mesh->tria[k];
475 if ( !MG_EOK(pt) ) {
476 nex++;
477 continue;
478 }
479 ok++;
480
481 rap = MMGS_ALPHAD * MMG5_calelt(mesh,met,pt);
482
483 if ( rap < rapmin ) {
484 rapmin = rap;
485 iel = ok;
486 }
487 if ( rap > 0.5 ) med++;
488 if ( rap < MMGS_BADKAL ) mesh->info.badkal = 1;
489 rapavg += rap;
490 rapmax = MG_MAX(rapmax,rap);
491 ir = MG_MIN(4,(int)(5.0*rap));
492 his[ir] += 1;
493 }
494
495 fprintf(stdout,"\n -- MESH QUALITY %" MMG5_PRId "\n",mesh->nt - nex);
496 fprintf(stdout," BEST %8.6f AVRG. %8.6f WRST. %8.6f (%" MMG5_PRId ")\n",
497 rapmax,rapavg / (mesh->nt-nex),rapmin,iel);
498
499 if ( mesh->info.imprim >= 3 ){
500 /* print histo */
501 fprintf(stdout," HISTOGRAMM: %6.2f %% > 0.5\n",100.0*(med/(float)(mesh->nt-nex)));
502 imax = MG_MIN(4,(int)(5.*rapmax));
503 for (i=imax; i>=(int)(5*rapmin); i--) {
504 fprintf(stdout," %5.1f < Q < %5.1f %7"MMG5_PRId" %6.2f %%\n",
505 i/5.,i/5.+0.2,his[i],100.*(his[i]/(float)(mesh->nt-nex)));
506 }
507 }
508
509 return MMG5_minQualCheck(iel,rapmin,1.);
510}
511
512#define COS145 -0.81915204428899
513
514/* return 0: triangle ok, 1: needle, 2: obtuse; ia: edge problem */
515int8_t typelt(MMG5_pPoint p[3],int8_t *ia) {
516 double h1,h2,h3,hmi,hma,ux,uy,uz,vx,vy,vz,wx,wy,wz,dd;
517
518 ux = p[1]->c[0] - p[0]->c[0];
519 uy = p[1]->c[1] - p[0]->c[1];
520 uz = p[1]->c[2] - p[0]->c[2];
521 h1 = ux*ux + uy*uy + uz*uz;
522
523 vx = p[2]->c[0] - p[0]->c[0];
524 vy = p[2]->c[1] - p[0]->c[1];
525 vz = p[2]->c[2] - p[0]->c[2];
526 h2 = vx*vx + vy*vy + vz*vz;
527 hmi = h1;
528 hma = h2;
529 *ia = 2;
530 if ( h1 > h2 ) {
531 hmi = h2;
532 hma = h1;
533 *ia = 1;
534 }
535 wx = p[2]->c[0] - p[1]->c[0];
536 wy = p[2]->c[1] - p[1]->c[1];
537 wz = p[2]->c[2] - p[1]->c[2];
538 h3 = wx*wx + wy*wy + wz*wz;
539 if ( h3 < hmi ) {
540 hmi = h3;
541 *ia = 0;
542 }
543 else if ( h3 > hma )
544 hma = h3;
545
546 /* needle */
547 if ( hmi < 0.01 * hma ) return 1;
548
549 /* check obtuse angle */
550 dd = (ux*vx + uy*vy + uz*vz) / sqrt(h1*h2);
551 if ( dd < COS145 ) {
552 *ia = 0;
553 return 2;
554 }
555 dd = (vx*wx + vy*wy + vz*wz) / sqrt(h2*h3);
556 if ( dd < COS145 ) {
557 *ia = 2;
558 return 2;
559 }
560 dd = -(ux*wx + uy*wy + uz*wz) / sqrt(h1*h3);
561 if ( dd < COS145 ) {
562 *ia = 1;
563 return 2;
564 }
565
566 return 0;
567}
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:526
MMG5_int MMG5_hashGet(MMG5_Hash *hash, MMG5_int a, MMG5_int b)
Definition: hash.c:495
int MMG5_hashEdge(MMG5_pMesh mesh, MMG5_Hash *hash, MMG5_int a, MMG5_int b, MMG5_int k)
Definition: hash.c:345
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:389
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:515
int MMGS_outqua(MMG5_pMesh mesh, MMG5_pSol met)
Definition: quality_s.c:457
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:512
Identic as MMG5_HGeom but use MMG5_hedge to store edges instead of MMG5_hgeom (memory economy).
Definition: libmmgtypes.h:595
MMG5_hedge * item
Definition: libmmgtypes.h:597
int8_t badkal
Definition: libmmgtypes.h:533
MMG mesh structure.
Definition: libmmgtypes.h:605
MMG5_Info info
Definition: libmmgtypes.h:651
MMG5_pPoint point
Definition: libmmgtypes.h:641
MMG5_pxPoint xpoint
Definition: libmmgtypes.h:642
MMG5_int nt
Definition: libmmgtypes.h:612
MMG5_pTria tria
Definition: libmmgtypes.h:647
MMG5_int np
Definition: libmmgtypes.h:612
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 xp
Definition: libmmgtypes.h:279
double * m
Definition: libmmgtypes.h:671
int16_t tag[3]
Definition: libmmgtypes.h:342
MMG5_int v[3]
Definition: libmmgtypes.h:334
double n2[3]
Definition: libmmgtypes.h:295
double n1[3]
Definition: libmmgtypes.h:295