56 MMG5_int base,*adja,nump,k,k1;
62 assert( 0<=ip && ip<4 &&
"unexpected local index for vertex");
67 list[0] = 4*start + ip;
72 while ( cur < ilist ) {
83 if ( pt1->
flag == base )
continue;
86 if ( pt1->
v[j] == nump )
break;
114 int8_t *mmgWarn,int8_t *ia) {
118 for ((*ia)=0; (*ia)<6; (*ia)++) {
121 if ( (pt->
v[ipa] == na && pt->
v[ipb] == nb) ||
122 (pt->
v[ipa] == nb && pt->
v[ipb] == na))
break;
126 if ( (*ia)<6 )
return 1;
129 fprintf(stderr,
"\n ## Error: %s: wrong edge's shell: "
130 " edge %" MMG5_PRId
" %" MMG5_PRId
" not found in tetra %" MMG5_PRId
".\n",__func__,
133 fprintf(stderr,
" Exit program.\n");
138 fprintf(stderr,
"\n ## Warning: %s: at least one wrong edge's"
139 " shell.\n",__func__);
155 l0 = (ppt->
c[0] - p0->
c[0])*(ppt->
c[0] - p0->
c[0]) \
156 + (ppt->
c[1] - p0->
c[1])*(ppt->
c[1] - p0->
c[1]) + (ppt->
c[2] - p0->
c[2])*(ppt->
c[2] - p0->
c[2]);
157 l1 = (ppt->
c[0] - p1->
c[0])*(ppt->
c[0] - p1->
c[0]) \
158 + (ppt->
c[1] - p1->
c[1])*(ppt->
c[1] - p1->
c[1]) + (ppt->
c[2] - p1->
c[2])*(ppt->
c[2] - p1->
c[2]);
163 for ( i=0; i<3; ++i ) {
164 t[i] = p1->
c[i] - p0->
c[i];
167 else if ( l0 < l1 ) {
169 for ( i=0; i<3; ++i ) {
170 t[i] = dd*(p1->
c[i] - ppt->
c[i]) + ppt->
c[i] - p0->
c[i];
175 for ( i=0; i<3; ++i ) {
176 t[i] = dd*(p0->
c[i] - ppt->
c[i]) + ppt->
c[i] - p1->
c[i];
197 double n[3],
double t[3]) {
201 MMG5_int base,nump,k,*adja,piv,nvstart,aux,na,nb,adj,fstart,ip0,ip1;
203 int8_t iopp,ipiv,indb,inda,i,isface;
204 int8_t indedg[4][4] = { {-1,0,1,2}, {0,-1,3,4}, {1,3,-1,5}, {2,4,5,-1} };
210 memset(n,0x00,3*
sizeof(
double));
211 memset(t,0x00,3*
sizeof(
double));
232 for ( inda=0; inda<4; inda++ ){
233 if ( pt->
v[inda]==na )
break;
235 for ( indb=0; indb<4; indb++ ){
236 if ( pt->
v[indb]==nb )
break;
238 assert( (inda < 4) && (indb < 4));
246 else if ( tag &
MG_NOM ) {
266 if ( pt->
flag != base ) {
268 if ( pt->
v[i] == nump )
break;
289 isface = (adja[iopp] == 0);
291 while ( adj && (adj != nvstart) && !isface );
293 while ( 4*k+iopp != fstart );
295 if ( (nr > 0 && nnm > 0) || nnm != 2 ) {
300 dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2];
307 assert( ip0 && ip1 );
308 if ( ip0 == ip1 )
return 0;
312 dd = t[0]*n[0] + t[1]*n[1] + t[2]*n[2];
317 dd = t[0]*t[0] + t[1]*t[1] + t[2]*t[2];
346 MMG5_int base,k,kk,ip0,ip1,nump,na,nb,list[
MMG3D_LMAX+2],*adja;
357 list[0] = 4*start+ip;
361 while ( cur < ilist ) {
369 for (j=0; j<3; j++) {
376 if ( ip0 == 0 ) ip0 = nb;
377 else if ( ip1 == 0 ) {
378 if ( ip0 != nb ) ip1 = nb;
381 if ( ip0 != nb && ip1 != nb )
return 0;
386 if ( ip0 == 0 ) ip0 = na;
387 else if ( ip1 == 0 ) {
388 if ( ip0 != na ) ip1 = na;
391 if ( ip0 != na && ip1 != na )
return 0;
401 for (j=0; j<3; j++) {
404 assert ( kk &&
"point is not an internal nm-point");
412 if ( pt1->
flag == base )
continue;
414 for (ii=0; ii<4; ii++)
415 if ( pt1->
v[ii] == nump )
break;
418 list[ilist] = 4*kk+ii;
430 dd = t[0]*t[0] + t[1]*t[1] + t[2]*t[2];
459 MMG5_int *adja,nump,k,k1;
461 MMG5_int list[
MMG3D_LMAX+2],base,ia,ib,a,b,key,jj;
466 for ( k=0; k<=hash->
max; ++k ) {
471 for ( k=0; k<=hash->
siz; ++k ) {
474 for (k=hash->
siz; k<hash->max; k++) {
484 list[0] = 4*start + ip;
487 *ng = *nr = *nm = ns = 0;
491 while ( cur < ilist ) {
499 for (l=0; l<3; ++l) {
510 ph = &hash->
item[key];
512 if ( ph->
a == ia && ph->
b == ib )
515 while ( ph->
nxt && ph->
nxt < hash->
max ) {
517 if ( ph->
a == ia && ph->
b == ib )
continue;
522 if ( hash->
nxt >= hash->
max-1 ) {
524 fprintf(stderr,
"\n ## Warning: %s: memory alloc problem (edge):"
525 " %" MMG5_PRId
"\n",__func__,hash->
max);
527 "MMG5_edge",
return -1);
531 for (jj=ph->
nxt; jj<hash->max; jj++) hash->
item[jj].
nxt = jj+1;
562 for (l=0; l<3; l++) {
568 if ( pt1->
flag == base )
continue;
571 if ( pt1->
v[j] == nump )
break;
575 list[ilist] = 4*k1+j;
608 int64_t *listv,
int *ilistv,MMG5_int *lists,
int*ilists,
int isnm)
612 MMG5_int k,*adja,nump,k1,fstart,piv,na,nb,adj,nvstart,aux,cur,base;
613 int8_t iopp,ipiv,i,j,l,isface;
614 static int8_t mmgErr0=0, mmgErr1=0, mmgErr2=0;
616 if ( isnm ) assert(!
mesh->
adja[4*(start-1)+iface+1]);
635 lists[(*ilists)] = 4*k+iopp;
638 assert (
mesh->
tetra[k].
xt &&
"tetra of surfacic ball has a xtetra (bdy face) ");
642 fprintf(stderr,
"\n ## Warning: %s: problem in surface remesh process."
643 " Surface ball of at least 1 point (%" MMG5_PRId
") contains too"
645 " ## Try to modify the hausdorff number "
646 " or/and the maximum edge size.\n",__func__,
665 if ( pt->
flag != base ) {
667 if ( pt->
v[i] == nump )
break;
669 listv[(*ilistv)] = 4*k+i;
681 adj = adja[ iopp ] / 4;
687 adj = adja[ iopp ] / 4;
691 isface = (adja[iopp] == 0);
701 while ( adj && (adj != nvstart) && !isface );
703 while ( 4*k+iopp != fstart );
707 while ( cur < (*ilistv) ) {
712 for (l=0; l<3; l++) {
718 if ( pt1->
flag == base )
continue;
722 if ( pt1->
v[j] == nump )
break;
728 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
729 " Volumic ball of point %" MMG5_PRId
" contains too many elts.\n",
731 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
732 " or/and the maximum mesh.\n");
737 listv[(*ilistv)] = 4*k1+j;
772 int64_t *listv,
int *ilistv,MMG5_int *lists,
int *ilists,
773 MMG5_int *refmin,MMG5_int *refplus,
int isnm)
777 MMG5_int k,k1,nump,*adja,piv,na,nb,adj,cur,nvstart,fstart,aux,base;
778 int8_t iopp,ipiv,i,j,l,isface;
779 static int8_t mmgErr0=0, mmgErr1=0, mmgErr2=0;
781 if ( isnm ) assert(!
mesh->
adja[4*(start-1)+iface+1]);
802 lists[(*ilists)] = 4*k+iopp;
806 fprintf(stderr,
"\n ## Warning: %s: problem in surface remesh process."
807 " Surface ball of at least 1 point (%" MMG5_PRId
") contains too"
809 " ## Try to modify the hausdorff number "
810 " or/and the maximum edge size.\n",__func__,
829 if ( pt->
flag != base ) {
831 if ( pt->
v[i] == nump )
break;
833 listv[(*ilistv)] = 4*k+i;
840 if ( *refplus == -1 ) {
841 if ( pt->
ref != *refmin ) *refplus = pt->
ref;
843 else if ( pt->
ref != *refmin && pt->
ref != *refplus )
return -1;
855 adj = adja[ iopp ] / 4;
861 adj = adja[ iopp ] / 4;
865 isface = (adja[iopp] == 0);
875 while ( adj && (adj != nvstart) && !isface );
877 while ( 4*k+iopp != fstart );
881 while ( cur < (*ilistv) ) {
886 for (l=0; l<3; l++) {
892 if ( pt1->
flag == base )
continue;
896 if ( pt1->
v[j] == nump )
break;
902 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
903 " Volumic ball of point %" MMG5_PRId
" contains too many elts.\n",
905 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
906 " or/and the maximum mesh.\n");
911 listv[(*ilistv)] = 4*k1+j;
918 if ( *refplus == -1 ) {
919 if ( pt1->
ref != *refmin ) *refplus = pt1->
ref;
921 else if ( pt1->
ref != *refmin && pt1->
ref != *refplus )
return -1;
953 int *il2,MMG5_int *l2,MMG5_int *ip0,MMG5_int *ip1)
958 MMG5_int k,*adja,*list1,*list2,aux;
959 MMG5_int na, nb, piv,lists[
MMG3D_LMAX+2], base;
960 MMG5_int idp, fstart, nvstart, adj;
961 int ilists, iopp, ipiv,*ilist1,*ilist2;
962 int ifac,idx,idx2,idx_tmp,i1,isface;
963 double *n1,*n2,nt[3],ps1,ps2;
965 static int8_t mmgErr0=0,mmgErr1=0;
968 if ( !
MG_EOK(pt) )
return 0;
1001 ps1 = n1[0]*nt[0] + n1[1]*nt[1] + n1[2]*nt[2];
1002 ps2 = n2[0]*nt[0] + n2[1]*nt[1] + n2[2]*nt[2];
1004 if ( fabs(ps1) < fabs(ps2) ) {
1023 lists[ilists] = 4*k+iopp;
1027 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
1028 " Volumic ball of point %" MMG5_PRId
" contains too many elts.\n",
1030 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
1031 " or/and the maximum mesh.\n");
1057 adj = adja[ iopp ] / 4;
1063 adj = adja[ iopp ] / 4;
1072 while ( adj && (adj != nvstart) && !isface );
1077 while ( 4*k+iopp != fstart );
1080 for (idx=0; idx!=ilists; ++idx) {
1082 ifac = lists[idx]%4;
1087 for ( i=0; i<3; ++i ) {
1088 if ( pt->
v[
MMG5_idir[ifac][i]] == idp )
break;
1095 assert(idx < ilists);
1100 idx = (idx+1)%ilists;
1101 for (idx2=idx; idx2!=ilists+idx; ++idx2) {
1102 idx_tmp = idx2%ilists;
1103 k = lists[idx_tmp]/4;
1104 ifac = lists[idx_tmp]%4;
1110 list2[(*ilist2)] = 4*k+ifac;
1113 for ( i=0; i<3; ++i ) {
1114 if ( pt->
v[
MMG5_idir[ifac][i]] == idp )
break;
1121 assert(idx2 != ilists+idx);
1126 idx = (idx2+1)%ilists;
1127 for (idx2=idx; idx2 != idx+ilists; ++idx2) {
1128 idx_tmp = idx2%ilists;
1129 k = lists[idx_tmp]/4;
1130 ifac = lists[idx_tmp]%4;
1136 list1[(*ilist1)] = 4*k+ifac;
1139 for ( i=0; i<3; ++i ) {
1140 if ( pt->
v[
MMG5_idir[ifac][i]] == idp )
break;
1147 assert(idx2 != ilists+idx);
1171 int16_t tag,
int edg, MMG5_int piv,MMG5_int adj) {
1178 while ( adj && (adj != start) ) {
1190 taginit = pxt->
tag[i];
1196 pxt->
tag[i] &= ~MG_NOSURF;
1231 MMG5_int na,nb,*adja,adj,piv;
1234 assert( start >= 1 );
1249 taginit = pxt->
tag[ia];
1250 pxt->
tag[ia] |= tag;
1255 pxt->
tag[ia] &= ~MG_NOSURF;
1264 if ( adj == start )
return 1;
1265 else if ( adj < 0 )
return 0;
1276 if ( adj < 0 )
return 0;
1298 int16_t tag,MMG5_int piv,MMG5_int adj) {
1304 while ( adj && (adj != start) ) {
1316 pxt->
tag[i] &= ~tag;
1347 MMG5_int na,nb,*adja,adj,piv;
1350 assert( start >= 1 );
1365 pxt->
tag[ia] &= ~tag;
1372 if ( adj == start )
return 1;
1373 else if ( adj < 0 )
return 0;
1384 if ( adj < 0 )
return 0;
1405 MMG5_int *adja,piv,na,nb,adj;
1408 static int8_t mmgErr0=0, mmgErr1=0;
1410 assert ( start >= 1 );
1417 list[ilist] = 6*(int64_t)start+ia;
1425 while ( adj && (adj != start) ) {
1432 list[ilist] = 6*(int64_t)adj +i;
1437 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
1438 " Coquil of edge %" MMG5_PRId
"-%" MMG5_PRId
" contains too many elts.\n",
1440 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
1441 " or/and the maximum mesh.\n");
1450 if ( pt->
v[ travel_fac ] == piv ) {
1451 adj = adja[ travel_fac ] / 4;
1456 assert(pt->
v[ travel_fac ] == piv );
1457 adj = adja[ travel_fac ] /4;
1472 if ( adj == start )
return 2*ilist;
1475 adj = list[ilist-1] / 6;
1476 i = list[ilist-1] % 6;
1481 list[ilist] = 6*(int64_t)adj + i;
1486 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
1487 " Coquil of edge %" MMG5_PRId
"-%" MMG5_PRId
" contains too many elts.\n",
1489 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
1490 " or/and the maximum mesh.\n");
1514 list[ilist] = 6*(int64_t)adj +i;
1519 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
1520 " Coquil of edge %" MMG5_PRId
"-%" MMG5_PRId
" contains too many elts.\n",
1522 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
1523 " or/and the maximum mesh.\n");
1557 MMG5_int na,nb,adj,piv,*adja;
1573 adj = adja[iadj] / 4;
1576 while( adj && ( adj != start ) ) {
1586 adj = adja[ iadj ] / 4;
1591 adj = adja[ iadj ] /4;
1615 MMG5_int kel1, kel2;
1616 static int8_t mmgErr0;
1618 if ( mmgErr0 )
return;
1622 fprintf(stderr,
"\n ## Error: %s: at least 1 problem in surface"
1623 " remesh process",__func__);
1624 fprintf(stderr,
" (potential creation of a lonely boundary face):\n");
1631 assert ( pt &&
MG_EOK(pt) );
1632 fprintf(stderr,
" look at elt %" MMG5_PRId
":",kel1);
1633 fprintf(stderr,
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
".\n",
MMG3D_indPt(
mesh,pt->
v[0]),
1636 fprintf(stderr,
" adjacent tetras %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",
1641 fprintf(stderr,
" vertex required? %d %d %d %d\n",
1646 }
else if ( kel2 != 0 ) {
1647 fprintf(stderr,
" look at elt %" MMG5_PRId
":",kel2);
1649 assert ( pt &&
MG_EOK(pt) );
1651 fprintf(stderr,
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
".\n\n",
MMG3D_indPt(
mesh,pt->
v[0]),
1655 fprintf(stderr,
"\n ## Try to modify the hausdorff number,");
1656 fprintf(stderr,
" the maximum mesh size or/and the value of angle detection.\n");
1657 fprintf(stderr,
" You can also try to run with -noswap option but probably");
1658 fprintf(stderr,
" the final mesh will have poor quality.\n\n");
1687 int8_t ia,int64_t *list,
int *ilist,MMG5_int *it1,MMG5_int *it2,
1688 MMG5_int *piv,MMG5_int *adj,int8_t *hasadja,
int *nbdy,
int silent) {
1691 MMG5_int pradj,*adja;
1692 int pri,
ier,ifar_idx;
1694 static int8_t mmgErr0 = 0;
1708 ifar_idx = (
MMG5_ifar[ia][0]==iface) ? 1 : 0;
1709 assert ( iface ==
MMG5_ifar[ia][(ifar_idx+1)%2] );
1720 (*it1) = 4*start + iface;
1723 (*hasadja) = (adja[iface] > 0);
1735 list[(*ilist)] = 6*(int64_t)pradj +pri;
1741 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
1742 " Coquil of edge %" MMG5_PRId
"-%" MMG5_PRId
" contains too many elts.\n",
1744 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
1745 " or/and the maximum mesh.\n");
1751 if (
ier<0 )
return -1;
1752 else if ( !
ier )
continue;
1755 *it2 = 4*pradj+iface;
1762 }
while ( (*adj) && ((*adj) != start) );
1764 if ( (*adj) != start ) {
1788 int8_t *ia,int64_t *list,
int *ilist,MMG5_int *it1,
1789 MMG5_int *pradj,MMG5_int *adj) {
1798 (*adj) = list[(*ilist)-1] / 6;
1799 (*ia) = list[(*ilist)-1] % 6;
1818 *it1 = 4*(*pradj) + (*iface);
1844 MMG5_int *it1,MMG5_int *it2,
int silent) {
1846 MMG5_int piv,adj,na,nb,pradj;
1849 static int8_t mmgErr0=0,mmgErr1=0,mmgWarn0=0;
1858 ier =
MMG3D_coquilFaceFirstLoop(
mesh,start,na,nb,iface,ia,list,&ilist,it1,it2,
1859 &piv,&adj,&hasadja,&nbdy,silent);
1861 if (
ier < 0 )
return ier;
1865 if ( adj == start ) {
1868 printf(
" ## Error: %s: Wrong boundary tags: Only 1 boundary face found in"
1869 " the shell of the edge\n",__func__);
1888 printf(
" ## Warning: %s: you have %d boundary triangles in the closed shell"
1889 " of a manifold edge.\n",__func__,nbdy);
1890 printf(
" Problem may occur during remesh process.\n");
1904 if ( !hasadja )
return 2*ilist+1;
1914 if (
ier<0 )
return -1;
1916 list[ilist] = 6*(int64_t)pradj +i;
1921 fprintf(stderr,
"\n ## Warning: %s: problem in remesh process."
1922 " Coquil of edge %" MMG5_PRId
"-%" MMG5_PRId
" contains too many elts.\n",
1924 fprintf(stderr,
"\n ## Try to modify the hausdorff number,"
1925 " or/and the maximum mesh.\n");
1933 *it2 = 4*pradj + iface;
1935 if ( (!(*it1) || !(*it2)) || ((*it1) == (*it2)) ) {
1960 int8_t *iface, int8_t *i )
2012 int8_t *iface, int8_t *i )
2026 *adj = adja[ *iface ] / 4;
2032 *adj = adja[ *iface ] /4;
if(!ier) exit(EXIT_FAILURE)
int MMG5_settag(MMG5_pMesh mesh, MMG5_int start, int ia, int16_t tag, int edg)
int16_t MMG5_coquilTravel(MMG5_pMesh mesh, MMG5_int na, MMG5_int nb, MMG5_int *adj, MMG5_int *piv, int8_t *iface, int8_t *i)
int MMG5_deltag(MMG5_pMesh mesh, MMG5_int start, int ia, int16_t tag)
int MMG5_boulevolp(MMG5_pMesh mesh, MMG5_int start, int ip, int64_t *list)
int MMG5_boulesurfvolp(MMG5_pMesh mesh, MMG5_int start, int ip, int iface, int64_t *listv, int *ilistv, MMG5_int *lists, int *ilists, int isnm)
void MMG3D_coquilFaceSecondLoopInit(MMG5_pMesh mesh, MMG5_int piv, int8_t *iface, int8_t *ia, int64_t *list, int *ilist, MMG5_int *it1, MMG5_int *pradj, MMG5_int *adj)
int MMG3D_findEdge(MMG5_pMesh mesh, MMG5_pTetra pt, MMG5_int k, MMG5_int na, MMG5_int nb, int error, int8_t *mmgWarn, int8_t *ia)
int MMG3D_coquilFaceFirstLoop(MMG5_pMesh mesh, MMG5_int start, MMG5_int na, MMG5_int nb, int8_t iface, int8_t ia, int64_t *list, int *ilist, MMG5_int *it1, MMG5_int *it2, MMG5_int *piv, MMG5_int *adj, int8_t *hasadja, int *nbdy, int silent)
void MMG5_coquilFaceErrorMessage(MMG5_pMesh mesh, MMG5_int k1, MMG5_int k2)
int16_t MMG5_openCoquilTravel(MMG5_pMesh mesh, MMG5_int na, MMG5_int nb, MMG5_int *adj, MMG5_int *piv, int8_t *iface, int8_t *i)
int MMG5_boulenm(MMG5_pMesh mesh, MMG5_int start, int ip, int iface, double n[3], double t[3])
int MMG5_boulesurfvolpNom(MMG5_pMesh mesh, MMG5_int start, int ip, int iface, int64_t *listv, int *ilistv, MMG5_int *lists, int *ilists, MMG5_int *refmin, MMG5_int *refplus, int isnm)
int MMG5_bouletrid(MMG5_pMesh mesh, MMG5_int start, int iface, int ip, int *il1, MMG5_int *l1, int *il2, MMG5_int *l2, MMG5_int *ip0, MMG5_int *ip1)
int MMG5_srcbdy(MMG5_pMesh mesh, MMG5_int start, int ia)
int MMG5_boulernm(MMG5_pMesh mesh, MMG5_Hash *hash, MMG5_int start, int ip, MMG5_int *ng, MMG5_int *nr, MMG5_int *nm)
int MMG5_coquilface(MMG5_pMesh mesh, MMG5_int start, int8_t iface, int ia, int64_t *list, MMG5_int *it1, MMG5_int *it2, int silent)
int MMG5_coquil(MMG5_pMesh mesh, MMG5_int start, int ia, int64_t *list, int8_t *isbdy)
static int MMG3D_settag_oneDir(MMG5_pMesh mesh, MMG5_int start, MMG5_int na, MMG5_int nb, int16_t tag, int edg, MMG5_int piv, MMG5_int adj)
static void MMG3D_compute_tangent(MMG5_pMesh mesh, int nump, int ip0, int ip1, double t[3])
int MMG5_boulenmInt(MMG5_pMesh mesh, MMG5_int start, int ip, double t[3])
static int MMG3D_deltag_oneDir(MMG5_pMesh mesh, MMG5_int start, MMG5_int na, MMG5_int nb, int16_t tag, MMG5_int piv, MMG5_int adj)
API headers for the mmg3d library.
static const int8_t MMG5_idirinv[4][4]
MMG5_int MMG3D_indPt(MMG5_pMesh mesh, MMG5_int kp)
static const uint8_t MMG5_arpt[4][3]
arpt[i]: edges passing through vertex i
static const int8_t MMG5_iarf[4][3]
iarf[i]: edges of face opposite to vertex i
static const uint8_t MMG5_iare[6][2]
vertices of extremities of the edges of the tetra
static const uint8_t MMG5_ifar[6][2]
ifar[i][]: faces sharing the ith edge of the tetra
static const uint8_t MMG5_inxt3[7]
next vertex of tetra: {1,2,3,0,1,2,3}
int MMG5_norface(MMG5_pMesh mesh, MMG5_int k, int iface, double v[3])
static const uint8_t MMG5_idir[4][3]
idir[i]: vertices of face opposite to vertex i
MMG5_int MMG3D_indElt(MMG5_pMesh mesh, MMG5_int kel)
static const uint8_t MMG5_iprv2[3]
#define MMG5_TAB_RECALLOC(mesh, ptr, initSize, wantedGap, type, message, law)
#define MG_GET(flag, bit)
static const uint8_t MMG5_inxt2[6]
int MMG5_norpts(MMG5_pMesh, MMG5_int, MMG5_int, MMG5_int, double *)
Identic as MMG5_HGeom but use MMG5_hedge to store edges instead of MMG5_hgeom (memory economy).
Store input parameters of the run.
Structure to store points of a MMG mesh.
Used to hash edges (memory economy compared to MMG5_hgeom).
Structure to store the surface tetrahedra of a MMG mesh.