Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
mmg2d2.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*/
33#include "libmmg2d_private.h"
34#include "mmgexterns_private.h"
35
44 MMG5_pTria pt;
45 MMG5_int ip1,ip2,ip3,ip4,k,iadr,*adja,iadr2,*adja2,iel,nd;
46 int8_t i,ii;
47 static int8_t mmgWarn0=0;
48
49 /* Bounding Box vertices */
50 ip1 = mesh->np-3;
51 ip2 = mesh->np-2;
52 ip3 = mesh->np-1;
53 ip4 = mesh->np;
54
55 nd = 0;
56 for(k=1; k<=mesh->nt; k++) {
57 pt = &mesh->tria[k];
58 if ( !MG_EOK(pt) ) continue;
59
60 if ( pt->base < 0 ) {
61 iadr = 3*(k-1) + 1;
62 adja = &mesh->adja[iadr];
63 for(i=0; i<3; i++) {
64 if ( !adja[i] ) continue;
65 iel = adja[i] / 3;
66 ii = adja[i] % 3;
67 iadr2 = 3*(iel-1) + 1;
68 adja2 = &mesh->adja[iadr2];
69 adja2 [ii] = 0;
70 }
72 continue;
73 }
74 else if ( !pt->base ) {
75 if ( !mmgWarn0 ) {
76 mmgWarn0 = 1;
77 fprintf(stderr,"\n ## Warning: %s: at least 1 undetermined"
78 " triangle.\n",__func__);
79 }
80 nd++;
81 }
82 }
83
84 if ( !nd ) {
85 MMG2D_delPt(mesh,ip1);
86 MMG2D_delPt(mesh,ip2);
87 MMG2D_delPt(mesh,ip3);
88 MMG2D_delPt(mesh,ip4);
89 }
90 else {
91 fprintf(stderr,"\n ## Error: %s: procedure failed :"
92 " %" MMG5_PRId " indetermined triangles.\n",__func__,nd);
93 return 0;
94 }
95 return 1;
96}
97
98/* Set tag to triangles in the case where there are no constrained edge
99 in the supplied mesh: in = base ; out = -base ; undetermined = 0*/
101 MMG5_pTria pt;
102 int iter,maxiter;
103 MMG5_int base,nd,k,ip1,ip2,ip3,ip4;
104
105 /*BB vertex*/
106 ip1=(mesh->np-3);
107 ip2=(mesh->np-2);
108 ip3=(mesh->np-1);
109 ip4=(mesh->np);
110
111 base = ++mesh->base;
112 iter = 0;
113 maxiter = 3;
114 do {
115 nd = 0;
116 for(k=1; k<=mesh->nt; k++) {
117 pt = &mesh->tria[k];
118 if ( !MG_EOK(pt) ) continue;
119 if ( !MMG2D_findtrianglestate(mesh,k,ip1,ip2,ip3,ip4,base) ) nd++ ;
120 }
121
122 if(mesh->info.ddebug) {
123 printf(" ** how many undetermined triangles ? %" MMG5_PRId "\n",nd);
124 }
125 }
126 while (nd && ++iter<maxiter);
127
128 return 1;
129}
130
131/* Find out whether triangle pt is inside or outside (i.e. contains bb points or not) */
132/* Return <0 value if triangle outside ; > 0 if triangle inside */
133MMG5_int MMG2D_findtrianglestate(MMG5_pMesh mesh,MMG5_int k,MMG5_int ip1,MMG5_int ip2,MMG5_int ip3,MMG5_int ip4,MMG5_int base) {
134 MMG5_pTria pt;
135 int nb;
136 int8_t i;
137
138 pt = &mesh->tria[k];
139
140 /* Count how many vertices of pt are vertices of the boundary box */
141 nb = 0;
142 for(i=0; i<3; i++)
143 if ( pt->v[i] == ip1 || pt->v[i] == ip2 || pt->v[i] == ip3 || pt->v[i] == ip4 ) nb++;
144
145 /* Triangle to be deleted */
146 if ( nb ) {
147 pt->base = -base;
148 pt->ref = 3;
149 return -base;
150 }
151 else {
152 pt->base = base;
153 return base;
154 }
155}
156
165static inline
167 MMG5_pPoint ppt = &mesh->point[k];
168 static int8_t mmgWarn0=0;
169
170 /* Find the triangle lel of the mesh containing ppt */
171 MMG5_int lel = MMG2D_findTria(mesh,k);
172
173 /* Exhaustive search if not found */
174 if ( !lel ) {
175 if ( mesh->info.ddebug ) {
176 printf(" ** exhaustive search of point location.\n");
177 }
178
179 int kk;
180 for(kk=1; kk<=mesh->nt; kk++) {
181 lel = MMG2D_isInTriangle(mesh,kk,&ppt->c[0]);
182 if ( lel ) break;
183 }
184
185 if ( kk>mesh->nt ) {
186 if ( !mmgWarn0 ) {
187 mmgWarn0 = 1;
188 fprintf(stderr,"\n ## Error: %s: unable to find triangle"
189 " for at least vertex %" MMG5_PRId ".\n",__func__,k);
190 }
191 return 0;
192 }
193 }
194 return lel;
195}
196
197
208 MMG5_pPoint ppt;
209 int lon;
210 MMG5_int k,kk,ns,nus,nu,nud;
211 int iter,maxiter;
212 static int8_t mmgWarn0=0,mmgWarn1=0,mmgWarn2=0;
213 MMG5_int list[MMG5_TRIA_LMAX];
214 const int flag=-10;
215
216 for(k=1; k<=mesh->np-4; k++) {
217 ppt = &mesh->point[k];
218 ppt->flag = flag;
219 }
220 iter = 0;
221 maxiter = 10;
222
223 do {
224 ns = nus = 0;
225 nu = nud = 0;
226 mmgWarn1 = mmgWarn2 = 0;
227 for(k=1; k<=mesh->np-4; k++) {
228 ppt = &mesh->point[k];
229 if(ppt->flag != flag) continue;
230 nus++;
231
232 list[0] = MMG2D_findTria_exhaust(mesh,k);
233 if ( !list[0] ) {
234 return 0;
235 }
236
237 /* Create the cavity of point k starting from list[0] */
238 lon = MMG2D_cavity(mesh,sol,k,list);
239
240 if ( lon < 1 ) {
241 nu++;
242 if ( !mmgWarn1 ) {
243 mmgWarn1 = 1;
244 if ( mesh->info.imprim > 6 || mesh->info.ddebug )
245 fprintf(stderr,"\n ## Warning: %s: unable to insert "
246 "at least 1 vertex. (%" MMG5_PRId ")\n",__func__,k);
247 }
248 continue;
249 } else {
250 if(!MMG2D_delone(mesh,sol,k,list,lon)) {
251 if ( abs(mesh->info.imprim) > 4) {
252 nud++;
253 if ( !mmgWarn2 ) {
254 mmgWarn2 = 1;
255 if(mesh->info.imprim > 6 || mesh->info.ddebug)
256 fprintf(stderr,"\n ## Warning: %s: unable to"
257 " insert at least 1 point with Delaunay (%" MMG5_PRId ")\n",__func__,k);
258 }
259 }
260 } else {
261 ppt->flag = 0;
262 ns++;
263 }
264 }
265 }
266
267 if ( abs(mesh->info.imprim) > 4)
268 fprintf(stdout," %8" MMG5_PRId " vertex inserted %8" MMG5_PRId " not inserted\n",ns,nu+nud);
269 if ( mesh->info.imprim >6 || mesh->info.ddebug )
270 fprintf(stdout," unable to insert %8" MMG5_PRId " vertex : cavity %8" MMG5_PRId " -- delaunay %8" MMG5_PRId " \n",nu+nud,nu,nud);
271 } while (ns && ++iter<maxiter);
272
273 if(MMG5_abs(nus-ns)) {
274 if ( mesh->info.imprim > 6 || mesh->info.ddebug ) {
275 fprintf(stderr,"\n ## Warning: %s: unable to"
276 " insert %8" MMG5_PRId " point with Delaunay \n",__func__,MMG5_abs(nus-ns));
277 fprintf(stdout," try to insert with splitbar\n");
278 }
279 mmgWarn2 = 0;
280 nus = ns = 0;
281 /*try to insert using splitbar*/
282 for(k=1; k<=mesh->np-4; k++) {
283 ppt = &mesh->point[k];
284 if(ppt->flag != flag) continue;
285 nus++;
286
287 list[0] = MMG2D_findTria_exhaust(mesh,k);
288 if ( !list[0] ) {
289 return 0;
290 }
291
292 if(!MMG2D_splitbar(mesh,list[0],k)) {
293 if ( !mmgWarn2 ) {
294 mmgWarn2 = 1;
295 if ( mesh->info.imprim >6 || mesh->info.ddebug )
296 fprintf(stderr,"\n ## Warning: %s: unable to"
297 " insert at least 1 point with splitbar (%" MMG5_PRId ")\n",__func__,k);
298 }
299 } else {
300 ns++;
301 }
302 }
303 if ( MMG5_abs(nus-ns) ) {
304 fprintf(stderr," ## Warning: %s: %" MMG5_PRId " point(s) not "
305 "inserted. Check your output mesh\n",__func__,MMG5_abs(nus-ns));
306 return 0;
307 }
308 }
309 return 1;
310}
311
321 MMG5_pTria pt,pt1;
322 MMG5_pEdge ped;
323 MMG5_pPoint ppt;
324 MMG5_int k,l,iadr,*adja,ped0,ped1,ipil,ncurc,nref;
325 MMG5_int kinit,nt,nsd,ip1,ip2,ip3,ip4,ned,iel;
326 int voy;
327 int8_t i,i1,i2;
328 MMG5_int *list;
329
330 /* Reset flag field for triangles */
331 for(k=1 ; k<=mesh->nt ; k++)
332 mesh->tria[k].flag = mesh->mark;
333
334 MMG5_SAFE_CALLOC(list,mesh->nt,MMG5_int,return 0);
335 kinit = 0;
336 nref = 0;
337 ip1 = mesh->np;
338
339 /* Catch first triangle with vertex ip1 */
340 for(k=1; k<=mesh->nt; k++) {
341 pt = &mesh->tria[k];
342 if ( !MG_EOK(pt) ) continue;
343 pt->flag = mesh->mark;
344 pt->ref = 0;
345 if ( (!kinit) && ( pt->v[0]==ip1 || pt->v[1]==ip1 || pt->v[2]==ip1) ) kinit = k;
346 }
347
348 /* Travel mesh by adjacencies to set references on triangles as long as no boundary is met */
349 do {
350 nref++;
351 list[0] = kinit;
352 ipil = 0;
353 ncurc = 0;
354 do {
355 k = list[ipil];
356 pt = &mesh->tria[k];
357 pt->ref = nref;
358 iadr = 3*(k-1) + 1;
359 adja = &mesh->adja[iadr];
360 for(i=0; i<3; i++) {
361 iel = adja[i] / 3;
362 pt1 = &mesh->tria[iel];
363
364 if( !iel || pt1->ref == nref ) continue;
365
366 i1 = MMG5_inxt2[i];
367 i2 = MMG5_iprv2[i];
368 ped0 = pt->v[i1];
369 ped1 = pt->v[i2];
370
371 /* WARNING: exhaustive search among edges, to be optimized with a hashing structure */
372 for(l=1; l<=mesh->na; l++) {
373 ped = &mesh->edge[l];
374 if( ( ped->a == ped0 && ped->b == ped1 ) || ( ped->b == ped0 && ped->a == ped1 ) ) break;
375 }
376 if ( l <= mesh->na ) continue;
377
378 pt1->ref = nref;
379 list[++ncurc] = iel;
380 }
381 ++ipil ;
382 }
383 while ( ipil <= ncurc );
384
385 kinit = 0;
386 for(k=1; k<=mesh->nt; k++) {
387 pt = &mesh->tria[k];
388 if ( !MG_EOK(pt) ) continue;
389 pt->flag = mesh->mark;
390 if ( !kinit && !(mesh->tria[k].ref) ) kinit = k;
391 }
392 }
393 while ( kinit );
394
395 if ( mesh->info.imprim > 0 ) {
396 /* nref - 1 subdomains because Bounding Box triangles have been counted */
397 fprintf(stdout," %8" MMG5_PRId " sub-domains\n",nref-1);
398 }
399
400 MMG5_SAFE_FREE(list);
401
402 /* Remove BB triangles and vertices */
403 /*BB vertex*/
404 ip1=(mesh->np-3);
405 ip2=(mesh->np-2);
406 ip3=(mesh->np-1);
407 ip4=(mesh->np);
408
409 /* Case when there are inner and outer triangles */
410 if ( nref != 1 ) {
411 nt = mesh->nt;
412 for(k=1; k<=nt; k++) {
413 pt = &mesh->tria[k];
414 if ( !MG_EOK(pt) ) continue;
415
416 if ( pt->ref != 1 ) continue;
417 /*update adjacencies*/
418 iadr = 3*(k-1)+1;
419 adja = &mesh->adja[iadr];
420 for(i=0; i<3; i++) {
421 if ( !adja[i] ) continue;
422 iel = adja[i] / 3;
423 voy = adja[i] % 3;
424 (&mesh->adja[3*(iel-1)+1])[voy] = 0;
425 }
427 }
428 }
429 /* Remove only the triangles containing one of the BB vertex*/
430 else {
431 nt = mesh->nt;
432 for(k=1 ; k<=nt ; k++) {
433 pt = &mesh->tria[k];
434 if ( !MG_EOK(pt) ) continue;
435
436 if( !(pt->v[0]==ip1 || pt->v[1]==ip1 || pt->v[2]==ip1 ||
437 pt->v[0]==ip2 || pt->v[1]==ip2 || pt->v[2]==ip2 ||
438 pt->v[0]==ip3 || pt->v[1]==ip3 || pt->v[2]==ip3 ||
439 pt->v[0]==ip4 || pt->v[1]==ip4 || pt->v[2]==ip4 ) ) continue;
440
441 /*update adjacencies*/
442 iadr = 3*(k-1)+1;
443 adja = &mesh->adja[iadr];
444 for(i=0 ; i<3 ; i++) {
445 if(!adja[i]) continue;
446 iel = adja[i]/3;
447 voy = adja[i]%3;
448 (&mesh->adja[3*(iel-1)+1])[voy] = 0;
449 }
451 }
452 }
453
454 MMG2D_delPt(mesh,ip1);
455 MMG2D_delPt(mesh,ip2);
456 MMG2D_delPt(mesh,ip3);
457 MMG2D_delPt(mesh,ip4);
458
459 if(mesh->info.nsd) {
460 nsd = mesh->info.nsd;
461 nt = mesh->nt;
462 for(k=1 ; k<=nt ; k++) {
463 pt = &mesh->tria[k];
464 if ( !MG_EOK(pt) ) continue;
465 pt->ref--;
466 if ( pt->ref == nsd ) continue;
468 }
469 }
470
471 /* Remove vertex*/
472 for (k=1; k<=mesh->nt; k++) {
473 pt = &mesh->tria[k];
474 if ( !MG_EOK(pt) ) continue;
475 for (i=0; i<3; i++) {
476 ppt = &mesh->point[ pt->v[i] ];
477 ppt->tag &= ~MG_NUL;
478 }
479 }
480 /* Remove edge*/
481 ned = mesh->na;
482 for (k=1; k<=ned; k++) {
483 ped = &mesh->edge[k];
484 if ( !ped->a ) continue;
485 ppt = &mesh->point[ ped->a ];
486 if ( !MG_VOK(ppt) ) {
488 continue;
489 }
490 ppt = &mesh->point[ ped->b ];
491 if ( !MG_VOK(ppt) ) {
493 continue;
494 }
495 }
496
497 return 1;
498}
499
509 MMG5_pTria pt;
510 double c[2];
511 MMG5_int ip1,ip2,ip3,ip4,jel,kel,iadr,*adja;
512
513 mesh->base = 0;
514 assert ( !mesh->nt );
515
516 /* Create the 4 vertices of the bounding box */
517 /* Bottom left corner */
518 c[0] = -0.5; //mesh->info.min[0] - 1.;
519 c[1] = -0.5; // mesh->info.min[1] - 1.;
520 ip1 = MMG2D_newPt(mesh,c,0);
521 if ( !ip1 ) {
522 /* reallocation of point table */
524 fprintf(stderr,"\n ## Error: %s: unable to allocate"
525 " a new point.\n",__func__);
526 MMG5_INCREASE_MEM_MESSAGE();return 0;,
527 c,0);
528 }
529
530 /* Top left corner */
531 c[0] = -0.5; //mesh->info.min[0] - 1.;
532 c[1] = MMG2D_PRECI / mesh->info.delta *(mesh->info.max[1]-mesh->info.min[1]) + 0.5;//mesh->info.max[1] + 1.;
533 ip2 = MMG2D_newPt(mesh,c,0);
534 if ( !ip2 ) {
535 /* reallocation of point table */
537 fprintf(stderr,"\n ## Error: %s: unable to allocate"
538 " a new point.\n",__func__);
539 MMG5_INCREASE_MEM_MESSAGE();return 0;,
540 c,0);
541 }
542
543 /* Bottom right corner */
544 c[0] = MMG2D_PRECI / mesh->info.delta *(mesh->info.max[0]-mesh->info.min[0]) + 0.5;//mesh->info.max[0] + 1.;
545 c[1] = -0.5;//mesh->info.min[1] - 1.;
546 ip3 = MMG2D_newPt(mesh,c,0);
547 if ( !ip3 ) {
548 /* reallocation of point table */
550 fprintf(stderr,"\n ## Error: %s: unable to allocate a "
551 " new point.\n",__func__);
552 MMG5_INCREASE_MEM_MESSAGE(); return 0;,
553 c,0);
554 }
555
556 /* Top right corner */
557 c[0] = MMG2D_PRECI / mesh->info.delta *(mesh->info.max[0]-mesh->info.min[0]) + 0.5;//mesh->info.max[0] + 1.;
558 c[1] = MMG2D_PRECI / mesh->info.delta *(mesh->info.max[1]-mesh->info.min[1]) + 0.5;//mesh->info.max[1] + 1.;
559 ip4 = MMG2D_newPt(mesh,c,0);
560 if ( !ip4 ) {
561 /* reallocation of point table */
563 fprintf(stderr,"\n ## Error: %s: unable to allocate a"
564 " new point.\n",__func__);
565 MMG5_INCREASE_MEM_MESSAGE(); return 0;,
566 c,0);
567 }
568
569 assert ( ip1 == mesh->np-3 );
570 assert ( ip2 == mesh->np-2 );
571 assert ( ip3 == mesh->np-1 );
572 assert ( ip4 == mesh->np );
573
574 /* Create the first two triangles in the mesh and the adjacency relations */
575 jel = MMG2D_newElt(mesh);
576 if ( !jel ) {
578 fprintf(stderr,"\n ## Error: %s: unable to allocate a"
579 " new element.\n",__func__);
581 printf(" Exit program.\n");return 0);
582 }
583 pt = &mesh->tria[jel];
584 pt->v[0] = ip1;
585 pt->v[1] = ip4;
586 pt->v[2] = ip2;
587 pt->base = mesh->base;
588
589 kel = MMG2D_newElt(mesh);
590 if ( !kel ) {
592 fprintf(stderr,"\n ## Error: %s: unable to allocate"
593 " a new element.\n",__func__);
595 printf(" Exit program.\n");return 0);
596 }
597 pt = &mesh->tria[kel];
598 pt->v[0] = ip1;
599 pt->v[1] = ip3;
600 pt->v[2] = ip4;
601 pt->base = mesh->base;
602
603 iadr = 3*(jel-1) + 1;
604 adja = &mesh->adja[iadr];
605 adja[2] = 3*kel + 1;
606
607 iadr = 3*(kel-1) + 1;
608 adja = &mesh->adja[iadr];
609 adja[1] = 3*jel + 2;
610
611 /* Insertion of vertices in the mesh */
612 if ( !MMG2D_insertpointdelone(mesh,sol) ) return 0;
613
614 if ( mesh->info.imprim > 0 )
615 fprintf(stdout," Insertion succeed\n");
616
617 /* Enforcement of the boundary edges */
619 fprintf(stderr,"\n ## Error: %s: unable to enforce the boundaries.\n",
620 __func__);
621 return 0;
622 }
623
624 if(mesh->info.ddebug)
625 if ( !MMG5_chkmsh(mesh,1,0) ) return 0;
626
627 /* Mark SubDomains and remove the bounding box triangles */
628 if ( mesh->na ) {
629 if ( ! MMG2D_markSD(mesh) ) return 0;
630 }
631 else {
632 /* Tag triangles : in = base ; out = -base ; Undetermined = 0*/
633 if ( !MMG2D_settagtriangles(mesh,sol) ) return 0;
634 if ( !MMG2D_removeBBtriangles(mesh) ) return 0;
635 }
636
637 return 1;
638}
MMG5_pMesh MMG5_pSol * sol
MMG5_pMesh * mesh
int MMG2D_delone(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int ip, MMG5_int *list, int ilist)
Definition: delone_2d.c:251
int MMG2D_cavity(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int ip, MMG5_int *list)
Definition: delone_2d.c:149
int MMG2D_bdryenforcement(MMG5_pMesh mesh, MMG5_pSol sol)
#define MMG2D_POINT_REALLOC(mesh, sol, ip, wantedGap, law, o, tag)
void MMG5_delEdge(MMG5_pMesh mesh, MMG5_int iel)
Definition: zaldy_2d.c:70
MMG5_int MMG2D_isInTriangle(MMG5_pMesh, MMG5_int, double c[2])
Definition: locate_2d.c:69
MMG5_int MMG2D_findTria(MMG5_pMesh, MMG5_int)
Definition: locate_2d.c:221
int MMG2D_splitbar(MMG5_pMesh, MMG5_int, MMG5_int)
Definition: split_2d.c:721
#define MMG2D_PRECI
int MMG2D_delElt(MMG5_pMesh mesh, MMG5_int iel)
Definition: zaldy_2d.c:105
#define MMG2D_TRIA_REALLOC(mesh, jel, wantedGap, law)
void MMG2D_delPt(MMG5_pMesh mesh, MMG5_int ip)
Definition: zaldy_2d.c:57
MMG5_int MMG2D_newPt(MMG5_pMesh mesh, double c[2], int16_t tag)
Definition: zaldy_2d.c:38
MMG5_int MMG2D_newElt(MMG5_pMesh mesh)
Definition: zaldy_2d.c:85
int MMG2D_settagtriangles(MMG5_pMesh mesh, MMG5_pSol sol)
Definition: mmg2d2.c:100
MMG5_int MMG2D_findtrianglestate(MMG5_pMesh mesh, MMG5_int k, MMG5_int ip1, MMG5_int ip2, MMG5_int ip3, MMG5_int ip4, MMG5_int base)
Definition: mmg2d2.c:133
static MMG5_int MMG2D_findTria_exhaust(MMG5_pMesh mesh, MMG5_int k)
Definition: mmg2d2.c:166
int MMG2D_markSD(MMG5_pMesh mesh)
Definition: mmg2d2.c:320
int MMG2D_mmg2d2(MMG5_pMesh mesh, MMG5_pSol sol)
Definition: mmg2d2.c:508
int MMG2D_insertpointdelone(MMG5_pMesh mesh, MMG5_pSol sol)
Definition: mmg2d2.c:207
int MMG2D_removeBBtriangles(MMG5_pMesh mesh)
Definition: mmg2d2.c:43
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
#define MG_EOK(pt)
#define MMG5_INCREASE_MEM_MESSAGE()
static const uint8_t MMG5_iprv2[3]
#define MMG5_TRIA_LMAX
static const uint8_t MMG5_inxt2[6]
#define MG_VOK(ppt)
#define MMG5_SAFE_FREE(ptr)
Structure to store edges of a MMG mesh.
Definition: libmmgtypes.h:305
MMG5_int b
Definition: libmmgtypes.h:306
MMG5_int a
Definition: libmmgtypes.h:306
int8_t ddebug
Definition: libmmgtypes.h:532
double delta
Definition: libmmgtypes.h:519
double min[3]
Definition: libmmgtypes.h:519
double max[3]
Definition: libmmgtypes.h:519
MMG5_int nsd
Definition: libmmgtypes.h:522
MMG mesh structure.
Definition: libmmgtypes.h:605
MMG5_Info info
Definition: libmmgtypes.h:651
MMG5_pPoint point
Definition: libmmgtypes.h:641
MMG5_int mark
Definition: libmmgtypes.h:618
MMG5_int * adja
Definition: libmmgtypes.h:624
double gap
Definition: libmmgtypes.h:608
MMG5_int base
Definition: libmmgtypes.h:616
MMG5_int nt
Definition: libmmgtypes.h:612
MMG5_pTria tria
Definition: libmmgtypes.h:647
MMG5_int np
Definition: libmmgtypes.h:612
MMG5_pEdge edge
Definition: libmmgtypes.h:649
MMG5_int na
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
MMG5_int ref
Definition: libmmgtypes.h:335
MMG5_int flag
Definition: libmmgtypes.h:341
MMG5_int base
Definition: libmmgtypes.h:336
MMG5_int v[3]
Definition: libmmgtypes.h:334