Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
mmg2d9.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 "libmmg2d_private.h"
37#define MMG2D_DEGTOL 5.e-1
38
39/* Calculate an estimate of the average (isotropic) length of edges in the mesh */
41 MMG5_pTria pt;
42 MMG5_pPoint p1,p2;
43 MMG5_int k,na;
44 double len,lent,dna;
45 int8_t i,i1,i2;
46
47 na = 0;
48 lent = 0.0;
49
50 for (k=1; k<=mesh->nt; k++) {
51 pt = &mesh->tria[k];
52 for (i=0; i<3; i++) {
53 i1 = MMG5_inxt2[i];
54 i2 = MMG5_iprv2[i];
55
56 p1 = &mesh->point[pt->v[i1]];
57 p2 = &mesh->point[pt->v[i2]];
58
59 len = (p2->c[0]-p1->c[0])*(p2->c[0]-p1->c[0]) + (p2->c[1]-p1->c[1])*(p2->c[1]-p1->c[1]);
60
61 lent += sqrt(len);
62 na++;
63 }
64 }
65
66 dna = (double)na;
67 dna = 1.0 / dna;
68 lent *= dna;
69
70 return lent;
71}
72
86MMG5_int MMG2D_chkmovmesh(MMG5_pMesh mesh,MMG5_pSol disp,short t,MMG5_int *triIdx) {
87 MMG5_pTria pt;
88 MMG5_pPoint ppt;
89 double *v,c[3][2],tau;
90 MMG5_int k,np,idx;
91 int8_t i,j;
92
93 /* Pseudo time-step = fraction of disp to perform */
94 tau = (double)t / MMG2D_SHORTMAX;
95 idx = 0;
96
97 for (k=1; k<=mesh->nt; k++) {
98 pt = &mesh->tria[k];
99 if ( !MG_EOK(pt) ) continue;
100
101 for (i=0; i<3; i++) {
102 np = pt->v[i];
103 ppt = &mesh->point[np];
104 v = &disp->m[2*np];
105 for (j=0; j<2; j++)
106 c[i][j] = ppt->c[j]+tau*v[j];
107 }
108
109 // Other criteria : eg. a rate of degradation, etc... ?
110 if( MMG2D_caltri_iso_3pt(c[0],c[1],c[2]) < MMG2D_NULKAL) {
111 if ( triIdx ) {
112 triIdx[idx++] = k;
113 }
114 else {
115 return 1;
116 }
117 }
118 }
119
120 return idx;
121}
122
124int MMG2D_dispmesh(MMG5_pMesh mesh,MMG5_pSol disp,short t,int itdeg) {
125 MMG5_pTria pt;
126 MMG5_pPoint ppt;
127 double *v,tau,ctau,c[3][2],ocal,ncal;
128 MMG5_int k,np;
129 int8_t i,j;
130
131 tau = (double)t /MMG2D_SHORTMAX;
132 ctau = 1.0 - tau;
133
134 /* Identify elements which are very distorted in the process */
135 for (k=1; k<=mesh->nt; k++) {
136 pt = &mesh->tria[k];
137 if ( !MG_EOK(pt) ) continue;
138
139 for (i=0; i<3; i++) {
140 np = pt->v[i];
141 ppt = &mesh->point[np];
142 for (j=0; j<2; j++)
143 c[i][j] = ppt->c[j];
144 }
145
146 ocal = MMG2D_caltri_iso_3pt(c[0],c[1],c[2]);
147
148 for (i=0; i<3; i++) {
149 np = pt->v[i];
150 v = &disp->m[2*np];
151 for (j=0; j<2; j++)
152 c[i][j] += tau*v[j];
153 }
154
155 ncal = MMG2D_caltri_iso_3pt(c[0],c[1],c[2]);
156
157 if ( ncal < MMG2D_DEGTOL*ocal )
158 pt->cc = itdeg;
159
160 }
161
162 /* Perform physical displacement */
163 for (k=1; k<=mesh->np; k++) {
164 ppt = &mesh->point[k];
165
166 if ( !MG_VOK(ppt) ) continue;
167 v = &disp->m[2*k];
168
169 for (i=0; i<2; i++) {
170 ppt->c[i] = ppt->c[i] + tau*v[i];
171 v[i] *= ctau;
172 }
173 }
174
175 return 1;
176}
177
191MMG5_int MMG2D_spllag(MMG5_pMesh mesh,MMG5_pSol disp,MMG5_pSol met,MMG5_int itdeg,int *warn) {
192 MMG5_pTria pt;
193 MMG5_pPoint p1,p2;
194 double hma2,lmax,len;
195 MMG5_int k,ns,ip,ip1,ip2;
196 int8_t i,i1,i2,imax,ier;
197 static int8_t mmgWarn0=0;
198
199 *warn = 0;
200 ns = 0;
201 hma2 = mesh->info.hmax*mesh->info.hmax;
202
203 for (k=1; k<=mesh->nt; k++) {
204 pt = &mesh->tria[k];
205 if ( !MG_EOK(pt) ) continue;
206 if ( pt->cc != itdeg ) continue;
207
208 /* Find the longest, internal edge */
209 imax = -1;
210 lmax = -1.0;
211
212 for (i=0; i<3; i++) {
213 i1 = MMG5_inxt2[i];
214 i2 = MMG5_iprv2[i];
215 ip1 = pt->v[i1];
216 ip2 = pt->v[i2];
217 p1 = &mesh->point[ip1];
218 p2 = &mesh->point[ip2];
219
220 len = (p2->c[0]-p1->c[0])*(p2->c[0]-p1->c[0]) + (p2->c[1]-p1->c[1])*(p2->c[1]-p1->c[1]);
221
222 if ( len > lmax ) {
223 lmax = len;
224 imax = i;
225 }
226 }
227
228 if ( (imax == -1) && (!mmgWarn0) ) {
229 mmgWarn0=1;
230 fprintf(stderr,"\n ## Warning: %s: at least 1 tria whose all edges"
231 " are required or of length null.\n",__func__);
232 }
233
234 if ( lmax < hma2 ) continue;
235 else if ( MG_SIN(pt->tag[imax]) ) continue;
236
237 /* Check the feasibility of splitting */
238 i1 = MMG5_inxt2[imax];
239 i2 = MMG5_iprv2[imax];
240 ip1 = pt->v[i1];
241 ip2 = pt->v[i2];
242
243 ip = MMG2D_chkspl(mesh,met,k,imax);
244
245 /* Lack of memory; abort the routine */
246 if ( ip < 0 ){
247 return ns;
248 }
249 else if ( ip > 0 ) {
250 ier = MMG2D_split1b(mesh,k,imax,ip);
251
252 /* Lack of memory; abort the routine */
253 if ( !ier ) {
254 MMG2D_delPt(mesh,ip);
255 return ns;
256 }
257
258 /* if we realloc memory in split1b pt pointer is not valid aymore. */
259 ns += ier;
260 }
261
262 /* Interpolate metric, if any */
263 if ( met->m )
264 met->m[ip] = 0.5*(met->m[ip1]+met->m[ip2]);
265
266 /* Interpolate displacement */
267 if ( disp->m ) {
268 for (i=0; i<2; i++)
269 disp->m[2*ip+i] = 0.5*(disp->m[2*ip1+i]+disp->m[2*ip2+i]);
270 }
271 }
272
273 return ns;
274}
275
286static int MMG2D_coleltlag(MMG5_pMesh mesh,MMG5_pSol met,int itdeg) {
287 MMG5_pTria pt;
288 MMG5_pPoint p1,p2;
289 double hmi2,len;
290 MMG5_int nc,k;
291 int ilist;
292 MMG5_int list[MMG5_TRIA_LMAX+2];
293 int8_t i,i1,i2,open;
294
295 nc = 0;
296 hmi2 = mesh->info.hmin*mesh->info.hmin;
297
298 for (k=1; k<=mesh->nt; k++) {
299 pt = &mesh->tria[k];
300 if ( !MG_EOK(pt) ) continue;
301 if ( pt->cc != itdeg ) continue;
302
303 for (i=0; i<3; i++) {
304 if ( MG_SIN(pt->tag[i]) ) continue;
305
306 open = ( mesh->adja[3*(k-1)+1+i] == 0 ) ? 1 : 0;
307
308 i1 = MMG5_inxt2[i];
309 i2 = MMG5_iprv2[i];
310 p1 = &mesh->point[pt->v[i1]];
311 p2 = &mesh->point[pt->v[i2]];
312
313 if ( MG_SIN(p1->tag) ) continue;
314 else if ( p1->tag & MG_GEO ) {
315 if ( ! (p2->tag & MG_GEO) || !(pt->tag[i] & MG_GEO) ) continue;
316 }
317
318 /* Check length */
319 len = (p2->c[0]-p1->c[0])*(p2->c[0]-p1->c[0]) + (p2->c[1]-p1->c[1])*(p2->c[1]-p1->c[1]);
320 if ( len > hmi2 ) continue;
321
322 ilist = MMG2D_chkcol(mesh,met,k,i,list,2);
323 if ( ilist > 3 || ( ilist==3 && open ) ) {
324 nc += MMG2D_colver(mesh,ilist,list);
325 break;
326 }
327 else if ( ilist == 3 ) {
328 nc += MMG2D_colver3(mesh,list);
329 break;
330 }
331 else if ( ilist == 2 ) {
332 nc += MMG2D_colver2(mesh,list);
333 break;
334 }
335 }
336 }
337
338 return nc;
339}
340
350MMG5_int MMG2D_swpmshlag(MMG5_pMesh mesh,MMG5_pSol met,double crit,int itdeg) {
351 MMG5_pTria pt;
352 int it,maxit;
353 int8_t i;
354 MMG5_int k,ns,nns;
355
356 maxit = 2;
357 it = 0;
358 nns = 0;
359
360 do {
361 ns = 0;
362 for (k=1; k<=mesh->nt; k++) {
363 pt = &mesh->tria[k];
364 if ( !MG_EOK(pt) ) continue;
365 if ( pt->cc != itdeg ) continue;
366
367 for (i=0; i<3; i++) {
368 /* Prevent swap of a ref or tagged edge */
369 if ( MG_SIN(pt->tag[i]) || MG_EDG(pt->tag[i]) ) continue;
370
371 else if ( MMG2D_chkswp(mesh,met,k,i,2) ) {
372 ns += MMG2D_swapar(mesh,k,i);
373 break;
374 }
375
376 }
377 }
378 nns += ns;
379 }
380 while ( ++it < maxit && ns > 0 );
381
382 return nns;
383}
384
394MMG5_int MMG2D_movtrilag(MMG5_pMesh mesh,MMG5_pSol met,int itdeg) {
395 MMG5_pTria pt;
396 MMG5_pPoint p0;
397 int it,maxit,ilist;
398 MMG5_int k,base,list[MMG5_TRIA_LMAX+2],nm,nnm;
399 int8_t i,ier;
400
401 nnm = 0;
402 it = 0;
403 maxit = 5;
404
405 /* Reset point flags */
406 base = 1;
407 for (k=1; k<=mesh->np; k++)
408 mesh->point[k].flag = base;
409
410 do {
411 base++;
412 nm = 0;
413
414 for(k=1; k<=mesh->nt; k++) {
415 pt = &mesh->tria[k];
416 if ( !MG_EOK(pt) ) continue;
417 if ( pt->cc != itdeg ) continue;
418
419 for (i=0; i<3; i++) {
420 p0 = &mesh->point[pt->v[i]];
421 if ( p0->flag == base || MG_SIN(p0->tag) || p0->tag & MG_NOM ) continue;
422
423 int8_t dummy;
424 ilist = MMG5_boulet(mesh,k,i,list,0,&dummy);
425
426 if ( MG_EDG(p0->tag) )
427 ier = MMG2D_movedgpt(mesh,met,ilist,list,0);
428 else
429 ier = MMG2D_movintpt(mesh,met,ilist,list,0);
430
431 if ( ier ) {
432 nm++;
433 p0->flag = base;
434 }
435 }
436 }
437 nnm += nm;
438 }
439 while (++it < maxit && nm > 0 );
440
441 return nnm;
442}
443
459int MMG2D_mmg2d9(MMG5_pMesh mesh,MMG5_pSol disp,MMG5_pSol met,MMG5_int **invalidTrias) {
460 double avlen,tau,hmintmp,hmaxtmp;
461 int itmn,itdc,maxitmn,maxitdc,iit,warn;
462 MMG5_int nspl,nnspl,nnnspl,nc,nnc,nnnc,ns,nns,nnns,nm,nnm,nnnm;
463 short t,lastt;
464 int8_t ier;
465 MMG5_int k,ninvalidTrias;
466
467 maxitmn = 10;
468 maxitdc = 100;
469 t = 0;
470 tau = 0.0;
471 ninvalidTrias = 0;
472
473 nnnspl = nnnc = nnns = nnnm = lastt = 0;
474
475 if ( abs(mesh->info.imprim) > 4 || mesh->info.ddebug )
476 fprintf(stdout," ** LAGRANGIAN MOTION\n");
477
478 /* Field cc stores information about whether a triangle has been greatly distorted during current step */
479 for (k=1; k<=mesh->nt; k++)
480 mesh->tria[k].cc = 0;
481
482 /* Estimate of the average, maximum and minimum edge lengths */
483 avlen = MMG2D_estavglen(mesh);
484
485 hmintmp = mesh->info.hmin;
486 hmaxtmp = mesh->info.hmax;
487
488 mesh->info.hmax = MMG2D_LLONG*avlen;
489 mesh->info.hmin = MMG2D_LSHRT*avlen;
490
491 for (itmn=0; itmn<maxitmn; itmn++) {
492
493#ifdef USE_ELAS
494 /* Extension of the displacement field */
495 if ( !MMG2D_velextLS(mesh,disp) ) {
496 fprintf(stderr,"\n ## Problem in func. MMG2D_velextLS. Exit program.\n");
497 return 0;
498 }
499#else
500 fprintf(stderr,"\n ## Error: %s: you need to compile with the USE_ELAS"
501 " CMake's flag set to ON to use the rigidbody movement.\n",__func__);
502 return 0;
503#endif
504
505 // MMG5_saveDisp(mesh,disp);
506
507 /* Sequence of dichotomy loops to find the largest admissible displacements */
508 for (itdc=0; itdc<maxitdc; itdc++) {
509 nnspl = nnc = nns = nnm = 0;
510
512 if ( t == 0 ) {
513 if ( abs(mesh->info.imprim) > 4 || mesh->info.ddebug )
514 fprintf(stderr,"\n *** Stop: impossible to proceed further\n");
515 break;
516 }
517
518 ier = MMG2D_dispmesh(mesh,disp,t,itdc);
519 if ( !ier ) {
520 fprintf(stderr,"\n ** Impossible motion\n");
521 return 0;
522 }
523
524 tau = tau + ((double)t /MMG2D_SHORTMAX)*(1.0-tau);
525 if ( (abs(mesh->info.imprim) > 3 ) || mesh->info.ddebug )
526 printf(" ---> Realized displacement: %f\n",tau);
527
528 /* Local remeshing depending on the option */
529 if ( mesh->info.lag > 0 ) {
530 for (iit=0; iit<5; iit++) {
531
532 nspl = nc = ns = nm = 0;
533
534 if ( mesh->info.lag > 1 ) {
535 if ( !mesh->info.noinsert ) {
536
537 /* Split of points */
538 nspl = MMG2D_spllag(mesh,disp,met,itdc,&warn);
539 if ( nspl < 0 ) {
540 fprintf(stderr,"\n ## Problem in spllag. Exiting.\n");
541 return 0;
542 }
543
544 /* Collapse of points */
545 nc = MMG2D_coleltlag(mesh,met,itdc);
546 if ( nc < 0 ) {
547 fprintf(stderr,"\n ## Problem in coltetlag. Exiting.\n");
548 return 0;
549 }
550 }
551 }
552
553 /* Swap of edges in tria that have resulted distorted from the process */
554 /* I do not know whether it is safe to put NULL in metric here (a
555 * priori ok, since there is no vertex creation or suppression) */
556 if ( !mesh->info.noswap ) {
557 ns = MMG2D_swpmshlag(mesh,met,1.1,itdc);
558 if ( ns < 0 ) {
559 fprintf(stderr," ## Problem in swapeltlag. Exiting.\n");
560 return 0;
561 }
562 }
563 /* Relocate vertices of tria which have been distorted in the displacement process */
564 if ( !mesh->info.nomove ) {
565 nm = MMG2D_movtrilag(mesh,met,itdc);
566 if ( nm < 0 ) {
567 fprintf(stderr," ## Problem in moveltlag. Exiting.\n");
568 return 0;
569 }
570 }
571
572 if ( (abs(mesh->info.imprim) > 4 || mesh->info.ddebug) && (nspl+nc+ns+nm > 0) )
573 printf(" %" MMG5_PRId " edges splitted, %" MMG5_PRId " vertices collapsed, %" MMG5_PRId " elements"
574 " swapped, %" MMG5_PRId " vertices moved.\n",nspl,nc,ns,nm);
575 nnspl+= nspl;
576 nnm += nm;
577 nnc += nc;
578 nns += ns;
579 }
580 /* Five iterations of local remeshing have been performed: print final stats */
581 if ( abs(mesh->info.imprim) > 3 && abs(mesh->info.imprim) < 5 && (nnspl+nnm+nns+nnc > 0) )
582 printf(" %" MMG5_PRId " edges splitted, %" MMG5_PRId " vertices collapsed, %" MMG5_PRId " elements"
583 " swapped, %" MMG5_PRId " vertices moved.\n",nnspl,nnc,nns,nnm);
584
585 }
586
587 nnnspl += nnspl;
588 nnnm += nnm;
589 nnnc += nnc;
590 nnns += nns;
591
592 if ( t == MMG2D_SHORTMAX ) break;
593 }
594 /* End of dichotomy loop: maximal displacement of the extended velocity
595 * field has been performed */
596 if ( mesh->info.imprim > 1 && abs(mesh->info.imprim) < 4 ) {
597 printf(" ---> Realized displacement: %f\n",tau);
598 }
599
600 if ( abs(mesh->info.imprim) > 2 && mesh->info.lag )
601 printf(" %" MMG5_PRId " edges splitted, %" MMG5_PRId " vertices collapsed, %" MMG5_PRId " elements"
602 " swapped, %" MMG5_PRId " vertices moved.\n",nnnspl,nnnc,nnns,nnnm);
603
604 if ( (t == MMG2D_SHORTMAX) || (t==0 && itdc==0) ) break;
605 }
606
607 /* Reinsert standard values for hmin, hmax */
608 mesh->info.hmin = hmintmp;
609 mesh->info.hmax = hmaxtmp;
610
611 /* If mesh optim with insertion and collapse, perform a new analysis of the
612 * MMG2D_DISPREF boundary */
613 if ( mesh->info.lag >= 2 ) {
614 /* Identify singularities in the mesh */
616 fprintf(stderr,"\n ## Problem in identifying singularities. Exit program.\n");
617 return 0;
618 }
619
620 /* Define normal vectors at vertices on curves */
622 fprintf(stderr,"\n ## Problem in calculating normal vectors. Exit program.\n");
623 return 0;
624 }
625 }
626
627 if ( tau < MMG5_EPSD2 ) {
628 MMG5_SAFE_CALLOC(*invalidTrias,mesh->np,MMG5_int,
629 printf("## Warning: Not enough memory to keep track of"
630 " the invalid triangles.\n");
631 MMG5_DEL_MEM(mesh,disp->m);
632 return 1);
633 ninvalidTrias = MMG2D_chkmovmesh(mesh,disp,lastt,*invalidTrias);
634 assert ( ninvalidTrias );
635 }
636
637 /* Clean memory */
638 MMG5_DEL_MEM(mesh,disp->m);
639
640 if ( ninvalidTrias ) {
641 return -ninvalidTrias;
642 }
643 else {
644 return 1;
645 }
646}
int ier
MMG5_pMesh * mesh
int MMG2D_singul(MMG5_pMesh mesh, MMG5_int ref)
Definition: analys_2d.c:276
int MMG2D_norver(MMG5_pMesh mesh, MMG5_int ref)
Definition: analys_2d.c:410
int MMG5_boulet(MMG5_pMesh mesh, MMG5_int start, int ip, MMG5_int *list, int8_t s, int8_t *opn)
Definition: boulep.c:363
int MMG2D_colver(MMG5_pMesh mesh, int ilist, MMG5_int *list)
Definition: colver_2d.c:273
int MMG2D_chkcol(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int k, int8_t i, MMG5_int *list, int8_t typchk)
Definition: colver_2d.c:42
int MMG2D_colver3(MMG5_pMesh mesh, MMG5_int *list)
Definition: colver_2d.c:359
int MMG2D_colver2(MMG5_pMesh mesh, MMG5_int *list)
Definition: colver_2d.c:421
int MMG2D_movintpt(MMG5_pMesh, MMG5_pSol, int, MMG5_int *, int8_t)
Definition: movpt_2d.c:213
double MMG2D_caltri_iso_3pt(double *a, double *b, double *c)
Definition: quality_2d.c:68
int MMG2D_chkswp(MMG5_pMesh, MMG5_pSol, MMG5_int, int8_t, int8_t)
Definition: swapar_2d.c:128
MMG5_int MMG2D_chkspl(MMG5_pMesh, MMG5_pSol, MMG5_int, int8_t)
Definition: split_2d.c:51
int MMG2D_split1b(MMG5_pMesh, MMG5_int, int8_t, MMG5_int)
Definition: split_2d.c:244
#define MMG2D_LLONG
#define MMG2D_NULKAL
void MMG2D_delPt(MMG5_pMesh mesh, MMG5_int ip)
Definition: zaldy_2d.c:57
int MMG2D_swapar(MMG5_pMesh, MMG5_int, int8_t)
Definition: swapar_2d.c:221
int MMG2D_velextLS(MMG5_pMesh, MMG5_pSol)
Definition: velextls_2d.c:340
int MMG2D_movedgpt(MMG5_pMesh, MMG5_pSol, int, MMG5_int *, int8_t)
Definition: movpt_2d.c:53
#define MMG2D_SHORTMAX
#define MMG2D_LSHRT
double MMG2D_estavglen(MMG5_pMesh mesh)
Definition: mmg2d9.c:40
MMG5_int MMG2D_chkmovmesh(MMG5_pMesh mesh, MMG5_pSol disp, short t, MMG5_int *triIdx)
Definition: mmg2d9.c:86
MMG5_int MMG2D_spllag(MMG5_pMesh mesh, MMG5_pSol disp, MMG5_pSol met, MMG5_int itdeg, int *warn)
Definition: mmg2d9.c:191
int MMG2D_dispmesh(MMG5_pMesh mesh, MMG5_pSol disp, short t, int itdeg)
Definition: mmg2d9.c:124
MMG5_int MMG2D_movtrilag(MMG5_pMesh mesh, MMG5_pSol met, int itdeg)
Definition: mmg2d9.c:394
#define MMG2D_DEGTOL
Definition: mmg2d9.c:37
int MMG2D_mmg2d9(MMG5_pMesh mesh, MMG5_pSol disp, MMG5_pSol met, MMG5_int **invalidTrias)
Definition: mmg2d9.c:459
static int MMG2D_coleltlag(MMG5_pMesh mesh, MMG5_pSol met, int itdeg)
Definition: mmg2d9.c:286
MMG5_int MMG2D_swpmshlag(MMG5_pMesh mesh, MMG5_pSol met, double crit, int itdeg)
Definition: mmg2d9.c:350
short MMG5_dikmov(MMG5_pMesh mesh, MMG5_pSol disp, short *lastt, short shortmax, MMG5_int chkmovmesh(MMG5_pMesh, MMG5_pSol, short, MMG5_int *))
common functions for lagrangian meshing.
Definition: mmg3.c:49
#define MG_GEO
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
#define MG_EOK(pt)
#define MMG5_DISPREF
#define MG_EDG(tag)
static const uint8_t MMG5_iprv2[3]
#define MG_SIN(tag)
#define MMG5_TRIA_LMAX
static const uint8_t MMG5_inxt2[6]
#define MG_VOK(ppt)
#define MG_NOM
#define MMG5_EPSD2
#define MMG5_DEL_MEM(mesh, ptr)
int8_t ddebug
Definition: libmmgtypes.h:532
uint8_t noswap
Definition: libmmgtypes.h:546
double hmin
Definition: libmmgtypes.h:518
uint8_t noinsert
Definition: libmmgtypes.h:546
double hmax
Definition: libmmgtypes.h:518
uint8_t nomove
Definition: libmmgtypes.h:546
int8_t lag
Definition: libmmgtypes.h:540
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_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
int16_t tag
Definition: libmmgtypes.h:284
double c[3]
Definition: libmmgtypes.h:271
MMG5_int flag
Definition: libmmgtypes.h:282
double * m
Definition: libmmgtypes.h:671
int16_t tag[3]
Definition: libmmgtypes.h:342
MMG5_int v[3]
Definition: libmmgtypes.h:334
MMG5_int cc
Definition: libmmgtypes.h:337