59 int64_t *list,
int ilist,
int improve) {
76 for (k=0; k<ilist; k++) {
86 ppt0->
c[0] += 0.25 * vol*(p0->
c[0] + p1->
c[0] + p2->
c[0] + p3->
c[0]);
87 ppt0->
c[1] += 0.25 * vol*(p0->
c[1] + p1->
c[1] + p2->
c[1] + p3->
c[1]);
88 ppt0->
c[2] += 0.25 * vol*(p0->
c[2] + p1->
c[2] + p2->
c[2] + p3->
c[2]);
95 totvol = 1.0 / totvol;
104 for (k=0; k<ilist; k++) {
114 calnew =
MG_MIN(calnew,callist[k]);
117 for ( iloc = 0; iloc < 3; ++iloc ) {
120 if ( (len1 < MMG3D_LOPTL && len2 >=
MMG3D_LOPTL) ||
133 if (calold <
MMG5_EPSOK && calnew <= calold) {
139 else if ( improve && calnew < 1.02 * calold ) {
142 else if ( calnew < 0.3 * calold ) {
152 p0->
c[0] = ppt0->
c[0];
153 p0->
c[1] = ppt0->
c[1];
154 p0->
c[2] = ppt0->
c[2];
155 for (k=0; k<ilist; k++) {
156 (&
mesh->
tetra[list[k]/4])->qual=callist[k];
186 MMG5_int *list,
int ilist,
int improve) {
191 double x21,y21,z21,x31,y31,z31,nx,ny,nz,bary[3],dd,len;
192 double u10[3],u20[3],u30[3],oldc[3],coe;
193 int k,ifac,iter,maxtou;
204 for (k=0; k<ilist; k++) {
211 memcpy(oldc,p0->
c,3*
sizeof(
double));
221 x21 = p2->
c[0]-p1->
c[0];
222 y21 = p2->
c[1]-p1->
c[1];
223 z21 = p2->
c[2]-p1->
c[2];
225 x31 = p3->
c[0]-p1->
c[0];
226 y31 = p3->
c[1]-p1->
c[1];
227 z31 = p3->
c[2]-p1->
c[2];
229 nx = (y31*z21 - z31*y21);
230 ny = (z31*x21 - x31*z21);
231 nz = (x31*y21 - y31*x21);
233 dd = sqrt(nx*nx+ny*ny+nz*nz);
234 assert ( dd > 0. &&
"degenerated element");
240 u10[0] = p1->
c[0]-p0->
c[0];
241 u10[1] = p1->
c[1]-p0->
c[1];
242 u10[2] = p1->
c[2]-p0->
c[2];
244 u20[0] = p2->
c[0]-p0->
c[0];
245 u20[1] = p2->
c[1]-p0->
c[1];
246 u20[2] = p2->
c[2]-p0->
c[2];
248 u30[0] = p3->
c[0]-p0->
c[0];
249 u30[1] = p3->
c[1]-p0->
c[1];
250 u30[2] = p3->
c[2]-p0->
c[2];
252 assert ( met->
m[pt->
v[
MMG5_idir[ifac][0]]] > 0. &&
"null metric at vertex 0" );
253 assert ( met->
m[pt->
v[
MMG5_idir[ifac][1]]] > 0. &&
"null metric at vertex 1" );
254 assert ( met->
m[pt->
v[
MMG5_idir[ifac][2]]] > 0. &&
"null metric at vertex 2" );
256 len = sqrt(u10[0]*u10[0]+u10[1]*u10[1]+u10[2]*u10[2])/met->
m[pt->
v[
MMG5_idir[ifac][0]]]
257 + sqrt(u20[0]*u20[0]+u20[1]*u20[1]+u20[2]*u20[2])/met->
m[pt->
v[
MMG5_idir[ifac][1]]]
258 + sqrt(u30[0]*u30[0]+u30[1]*u30[1]+u30[2]*u30[2])/met->
m[pt->
v[
MMG5_idir[ifac][2]]];
262 assert ( len>0. &&
"degenerated element" );
267 bary[0] = (p1->
c[0]+p2->
c[0]+p3->
c[0])/3.;
268 bary[1] = (p1->
c[1]+p2->
c[1]+p3->
c[1])/3.;
269 bary[2] = (p1->
c[2]+p2->
c[2]+p3->
c[2])/3.;
273 ppt0->
c[0] += vol* ( bary[0] + nx * len );
274 ppt0->
c[1] += vol* ( bary[1] + ny * len );
275 ppt0->
c[2] += vol* ( bary[2] + nz * len );
282 ppt0->
c[0] *= 1./(double) ilist;
283 ppt0->
c[1] *= 1./(double) ilist;
284 ppt0->
c[2] *= 1./(double) ilist;
290 p0->
c[0] = (1. - coe) *oldc[0] + coe * ppt0->
c[0];
291 p0->
c[1] = (1. - coe) *oldc[1] + coe * ppt0->
c[1];
292 p0->
c[2] = (1. - coe) *oldc[2] + coe * ppt0->
c[2];
296 for (k=0; k<ilist; k++) {
300 callist[k] = MMG5_caltet(
mesh,met,pt0);
301 if (calold <
MMG5_EPSOK && callist[k] <= calold) {
305 }
else if( callist[k] < 0.1) {
306 if (callist[k] < 1.01*calold)
break;
308 if (callist[k] < 1.02*calold)
break;
310 calnew =
MG_MIN(calnew,callist[k]);
317 }
while(++iter <= maxtou );
319 if ( iter > maxtou ) {
320 memcpy(p0->
c,oldc,3*
sizeof(
double));
328 for (k=0; k<ilist; k++) {
329 (&
mesh->
tetra[list[k]/4])->qual=callist[k];
351 double r[3][3],
double *lispoi) {
354 double ux,uy,uz,det2d;
355 MMG5_int k,na,nb,ntempa,ntempb;
360 iface = lists[0] % 4;
365 for (i=0; i<3; i++) {
374 for (l=1; l<ilists; l++) {
376 iface = lists[l] % 4;
379 for (i=0; i<3; i++) {
389 else if ( ntempa == nb )
391 else if ( ntempb == na )
394 assert(ntempb == nb);
397 ux = p1->
c[0] - p0->
c[0];
398 uy = p1->
c[1] - p0->
c[1];
399 uz = p1->
c[2] - p0->
c[2];
401 lispoi[3*l+1] = r[0][0]*ux + r[0][1]*uy + r[0][2]*uz;
402 lispoi[3*l+2] = r[1][0]*ux + r[1][1]*uy + r[1][2]*uz;
403 lispoi[3*l+3] = r[2][0]*ux + r[2][1]*uy + r[2][2]*uz;
411 iface = lists[0] % 4;
414 for (i=0; i<3; i++) {
424 else if ( ntempa == nb )
426 else if ( ntempb == na )
429 assert(ntempb == nb);
433 ux = p1->
c[0] - p0->
c[0];
434 uy = p1->
c[1] - p0->
c[1];
435 uz = p1->
c[2] - p0->
c[2];
437 lispoi[1] = r[0][0]*ux + r[0][1]*uy + r[0][2]*uz;
438 lispoi[2] = r[1][0]*ux + r[1][1]*uy + r[1][2]*uz;
439 lispoi[3] = r[2][0]*ux + r[2][1]*uy + r[2][2]*uz;
442 lispoi[3*ilists+1] = lispoi[1];
443 lispoi[3*ilists+2] = lispoi[2];
444 lispoi[3*ilists+3] = lispoi[3];
450 for (k=0; k<ilists-1; k++) {
451 det2d = lispoi[3*k+1]*lispoi[3*(k+1)+2] - lispoi[3*k+2]*lispoi[3*(k+1)+1];
456 det2d = lispoi[3*(ilists-1)+1]*lispoi[3*0+2] - lispoi[3*(ilists-1)+2]*lispoi[3*0+1];
483 const MMG5_int ip0,
double n[3],
double lambda[3],
double o[3],
491 double uv[2],to[3],detloc;
492 int iel,na,nb,ntempb,ntempc,nxp;
494 static int8_t mmgErr0=0,mmgErr1=0;
496 iel = lists[kel] / 4;
497 iface = lists[kel] % 4;
502 assert( 0<=iface && iface<4 &&
"unexpected local face idx");
508 fprintf(stderr,
"\n ## Error: %s: function MMG5_bezierCP return 0.\n",
520 for( i=0 ; i<4 ; i++ ){
521 if ( (pt->
v[i] != ip0) && (pt->
v[i] != pt->
v[iface]) ) {
537 if ( detloc > 0.0 ) {
540 else if (ntempb == nb )
543 assert(ntempb == ip0);
548 else if (ntempc == nb )
551 assert(ntempc == ip0);
559 else if (ntempb == nb )
562 assert(ntempb == ip0);
567 else if (ntempc == nb )
570 assert(ntempc == ip0);
577 fprintf(stderr,
" ## Error: %s: function MMG3D_bezierInt return 0.\n",
596 "larger xpoint table",
626 int ilistv,MMG5_int *lists,
int ilists,
627 int improveSurf,
int improveVol) {
632 double *n,r[3][3],lispoi[3*
MMG3D_LMAX+1],ux,uy,det2d;
633 double detloc,oppt[2],step,lambda[3];
634 double ll,m[2],o[3],no[3];
635 double calold,calnew,caltmp,callist[
MMG3D_LMAX+2];
644 if ( ilists < 2 )
return 0;
666 for (k=0; k<ilists; k++) {
667 m[0] = 0.5*(lispoi[3*(k+1)+1] + lispoi[3*k+1]);
668 m[1] = 0.5*(lispoi[3*(k+1)+2] + lispoi[3*k+2]);
669 ux = lispoi[3*(k+1)+1] - lispoi[3*k+1];
670 uy = lispoi[3*(k+1)+2] - lispoi[3*k+2];
677 oppt[0] *= (1.0 / nut);
678 oppt[1] *= (1.0 / nut);
681 det2d = lispoi[1]*oppt[1] - lispoi[2]*oppt[0];
683 if ( det2d >= 0.0 ) {
684 for (k=0; k<ilists; k++) {
685 detloc = oppt[0]*lispoi[3*(k+1)+2] - oppt[1]*lispoi[3*(k+1)+1];
686 if ( detloc >= 0.0 ) {
691 if ( k == ilists )
return 0;
694 for (k=ilists-1; k>=0; k--) {
695 detloc = lispoi[3*k+1]*oppt[1] - lispoi[3*k+2]*oppt[0];
696 if ( detloc >= 0.0 ) {
701 if ( k == -1 )
return 0;
705 det2d = -oppt[1]*(lispoi[3*(kel+1)+1] - lispoi[3*(kel)+1]) + \
706 oppt[0]*(lispoi[3*(kel+1)+2] - lispoi[3*(kel)+2]);
712 det2d = lispoi[3*(kel)+1]*(lispoi[3*(kel+1)+2] - lispoi[3*(kel)+2]) - \
713 lispoi[3*(kel)+2 ]*(lispoi[3*(kel+1)+1] - lispoi[3*(kel)+1]);
720 det2d = lispoi[3*kel+1]*lispoi[3*(kel+1)+2] - lispoi[3*kel+2]*lispoi[3*(kel+1)+1];
723 lambda[1] = lispoi[3*(kel+1)+2]*oppt[0] - lispoi[3*(kel+1)+1]*oppt[1];
724 lambda[2] = -lispoi[3*(kel)+2]*oppt[0] + lispoi[3*(kel)+1]*oppt[1];
727 lambda[0] = 1.0 - lambda[1] - lambda[2];
740 calold = calnew = DBL_MAX;
741 for (l=0; l<ilists; l++) {
743 iface = lists[l] % 4;
745 assert( 0<=iface && iface<4 &&
"unexpected local face idx");
747 calold =
MG_MIN(calold,MMG5_caltri(
mesh,met,&tt));
749 for( i=0 ; i<3 ; i++ )
750 if ( tt.
v[i] == ip0 )
break;
752 if ( i==3 )
return 0;
756 caltmp = MMG5_caltri(
mesh,met,&tt);
762 calnew =
MG_MIN(calnew,caltmp);
764 if ( calold <
MMG5_EPSOK && calnew <= calold )
return 0;
766 else if (improveSurf && calnew < 1.02*calold)
return 0;
767 else if ( calnew < 0.3*calold )
return 0;
771 calold = calnew = DBL_MAX;
773 for (l=0; l<ilistv; l++) {
786 calnew =
MG_MIN(calnew,callist[l]);
791 if (calold <
MMG5_EPSOK && calnew <= calold) {
797 else if (improveVol && calnew < calold) {
800 else if (calnew < 0.3*calold) {
816 for(l=0; l<ilistv; l++){
817 (&
mesh->
tetra[listv[l]/4])->qual= callist[l];
846 MMG5_int *ipa,MMG5_int *ipb,
const int16_t edgTag,MMG5_int *ip) {
849 MMG5_int iel,iptmpa,iptmpb;
851 uint8_t i,ie,iface,iea,ieb;
854 iface = lists[l] % 4;
858 assert ( pt->
xt &&
"tetra with boundary face has a xtetra");
862 for (i=0; i<3; i++) {
890 if ( (iptmpa == *ipa) || (iptmpa == *ipb) ) {
892 if ( edgTag & tag ) {
901 if ( (iptmpb == *ipa) || (iptmpb == *ipb) ) {
903 if ( edgTag & tag ) {
937 const int16_t edgTag, MMG5_int ip0,MMG5_int *ip1,
940 MMG5_int iel,ipa,ipb;
958 for (i=0; i<3; i++) {
971 for (l=1; l<ilists; l++) {
992 for (i=0; i<3; i++) {
1005 for (l=ilists-1; l>0; l--) {
1018 if ( (*ip1) == (*ip2) ) {
1051 MMG5_int ip0,uint8_t isrid,
double o[3],
1052 double no[3],
double no2[3],
double to[3]) {
1062 calold = calnew = DBL_MAX;
1064 for( l=0 ; l<ilistv ; l++ ){
1076 calnew =
MG_MIN(calnew,callist[l]);
1078 if ((calold <
MMG5_EPSOK && calnew <= calold) ||
1079 (calnew <
MMG5_EPSOK) || (calnew <= 0.3*calold)) {
1081 }
else if (improve && calnew < calold) {
1105 pxp->
n2[0] = no2[0];
1106 pxp->
n2[1] = no2[1];
1107 pxp->
n2[2] = no2[2];
1110 for( l=0 ; l<ilistv ; l++ ){
1111 (&
mesh->
tetra[listv[l]/4])->qual = callist[l];
1143 MMG5_int ip1,MMG5_int ip2,
double ll1old,
double ll2old,
1144 uint8_t isrid,
const double step,
1145 double o[3],
double no[3],
1146 double no2[3],
double to[3],
1147 const int16_t edgTag) {
1152 if ( ll1old < ll2old ) {
1156 else if ( ll1old > ll2old ) {
1170 else if (
MG_GEO & edgTag ) {
1175 "BezierRidge don't work if both ip0 and ip are singular" );
1180 else if (
MG_REF & edgTag ) {
1186 assert ( 0 &&
"Unexpected edge tag in this function");
1199 MMG5_int nxp =
mesh->
xp + 1;
1202 "larger xpoint table",
1219 pxp->
n2[0] = no2[0];
1220 pxp->
n2[1] = no2[1];
1221 pxp->
n2[2] = no2[2];
1256 int ilistv, MMG5_int *lists,
int ilists,
int improve,
const int16_t edgTag){
1262 double ll1old,ll2old,o[3],no[3],no2[3],to[3];
1263 double calold,calnew,caltmp,hmax,hausd;
1264 MMG5_int iel,ip0,ip1,ip2,ip;
1267 uint8_t i,iface,isrid;
1271 ip0 = pt->
v[listv[0]%4];
1278 assert ( edgTag & p0->
tag );
1296 ll1old = (p1->
c[0] -p0->
c[0])* (p1->
c[0] -p0->
c[0]) \
1297 + (p1->
c[1] -p0->
c[1])* (p1->
c[1] -p0->
c[1]) \
1298 + (p1->
c[2] -p0->
c[2])* (p1->
c[2] -p0->
c[2]);
1299 ll2old = (p2->
c[0] -p0->
c[0])* (p2->
c[0] -p0->
c[0]) \
1300 + (p2->
c[1] -p0->
c[1])* (p2->
c[1] -p0->
c[1]) \
1301 + (p2->
c[2] -p0->
c[2])* (p2->
c[2] -p0->
c[2]);
1320 calold = calnew = DBL_MAX;
1321 for( l=0 ; l<ilists ; l++ ){
1323 iface = lists[l] % 4;
1325 assert( 0<=iface && iface<4 &&
"unexpected local face idx");
1327 caltmp = MMG5_caltri(
mesh,met,&tt);
1328 calold =
MG_MIN(calold,caltmp);
1330 for( i=0 ; i<3 ; i++ ) {
1331 if ( tt.
v[i] == ip0 ) {
1342 caltmp = MMG5_caltri(
mesh,met,&tt);
1348 calnew =
MG_MIN(calnew,caltmp);
1363 if ( par->
ref != pt->
ref )
continue;
1377 if ( par->
ref != tt.
ref )
continue;
1389 if ( par->
ref != tt.
ref )
continue;
1404 if ( calold <
MMG5_EPSOK && calnew <= calold ) {
1407 else if ( calnew < calold ) {
1416 improve,p0,ip0,isrid,o,no,no2,to);
1439 int ilistv, MMG5_int *lists,
int ilists,
int improve){
1463 int ilistv, MMG5_int *lists,
int ilists,
int improve){
1483 int ilistv,
int improve){
1487 double step,ll1old,ll2old,calold,calnew,callist[
MMG3D_LMAX+2];
1488 double o[3],no[3],to[3];
1490 MMG5_int ip0,ip1,ip2,ip,iel,ipa;
1496 ip0 = pt->
v[listv[0]%4];
1502 for (l=0; l<ilistv; l++) {
1506 if ( !pt->
xt )
continue;
1509 for (i=0; i<3; i++) {
1513 if ( !ip1 ) ip1 = ipa;
1514 else if ( !ip2 && ipa != ip1 ) ip2 = ipa;
1518 if ( !(ip1 && ip2 && (ip1 != ip2)) )
return 0;
1524 ll1old = (p1->
c[0] -p0->
c[0])* (p1->
c[0] -p0->
c[0]) \
1525 + (p1->
c[1] -p0->
c[1])* (p1->
c[1] -p0->
c[1]) \
1526 + (p1->
c[2] -p0->
c[2])* (p1->
c[2] -p0->
c[2]);
1527 ll2old = (p2->
c[0] -p0->
c[0])* (p2->
c[0] -p0->
c[0]) \
1528 + (p2->
c[1] -p0->
c[1])* (p2->
c[1] -p0->
c[1]) \
1529 + (p2->
c[2] -p0->
c[2])* (p2->
c[2] -p0->
c[2]);
1531 if ( ll1old < ll2old ) {
1549 calold = calnew = DBL_MAX;
1550 for( l=0 ; l<ilistv ; l++ ){
1562 calnew =
MG_MIN(calnew,callist[l]);
1564 if ((calold <
MMG5_EPSOK && calnew <= calold) ||
1565 (calnew <
MMG5_EPSOK) || (calnew <= 0.3*calold)) {
1567 }
else if (improve && calnew < calold) {
1583 for(l=0; l<ilistv; l++){
1584 (&
mesh->
tetra[listv[l]/4])->qual = callist[l];
1607 int ilistv,MMG5_int *lists,
int ilists,
int improve) {
1629 int j,iter,maxiter,l,lon;
1631 MMG5_int ipb,iadr,i1,i2,i3,iel;
1633 double ax,ay,az,bx,by,bz,nx,ny,nz,dd,len,qual,oldc[3];
1644 iadr = pt->
v[ib]*
sol->size + 0;
1655 ax = p3->
c[0] - p1->
c[0];
1656 ay = p3->
c[1] - p1->
c[1];
1657 az = p3->
c[2] - p1->
c[2];
1659 bx = p2->
c[0] - p1->
c[0];
1660 by = p2->
c[1] - p1->
c[1];
1661 bz = p2->
c[2] - p1->
c[2];
1663 nx = (ay*bz - az*by);
1664 ny = (az*bx - ax*bz);
1665 nz = (ax*by - ay*bx);
1667 dd = sqrt(nx*nx+ny*ny+nz*nz);
1673 for (j=0; j<3; j++) {
1677 ax = ppb->
c[0] - ppa->
c[0];
1678 ay = ppb->
c[1] - ppa->
c[1];
1679 az = ppb->
c[2] - ppa->
c[2];
1681 dd = mp[0]*ax*ax + mp[3]*ay*ay + mp[5]*az*az \
1682 + 2.0*(mp[1]*ax*ay + mp[2]*ax*az + mp[4]*ay*az);
1687 dd = 1.0 / (double)3.;
1690 memcpy(oldc,ppa->
c,3*
sizeof(
double));
1698 ppa->
c[0] = oldc[0] + coe * nx * len;
1699 ppa->
c[1] = oldc[1] + coe * ny * len;
1700 ppa->
c[2] = oldc[2] + coe * nz * len;
1702 for (l=0; l<lon; l++) {
1706 qual = MMG5_caltet(
mesh,
sol,pt1);
1708 if ( qual*1.01 <= pt1->
qual)
break;
1712 if ( l >= lon )
break;
1715 while ( ++iter <= maxiter );
1716 if ( iter > maxiter) {
1717 memcpy(ppa->
c,oldc,3*
sizeof(
double));
1721 for (l=0; l<lon; l++) {
1724 pt1->
qual = qualtet[l];
1749 int j,iter,maxiter,l,lon;
1751 MMG5_int ipb,iel,i1,i2,i3;
1753 double ax,ay,az,bx,by,bz,nx,ny,nz,dd,len,qual,oldc[3],oldp[3];
1773 ax = p3->
c[0] - p1->
c[0];
1774 ay = p3->
c[1] - p1->
c[1];
1775 az = p3->
c[2] - p1->
c[2];
1777 bx = p2->
c[0] - p1->
c[0];
1778 by = p2->
c[1] - p1->
c[1];
1779 bz = p2->
c[2] - p1->
c[2];
1781 nx = (ay*bz - az*by);
1782 ny = (az*bx - ax*bz);
1783 nz = (ax*by - ay*bx);
1785 dd = sqrt(nx*nx+ny*ny+nz*nz);
1791 for (j=0; j<3; j++) {
1795 ax = ppb->
c[0] - ppa->
c[0];
1796 ay = ppb->
c[1] - ppa->
c[1];
1797 az = ppb->
c[2] - ppa->
c[2];
1799 dd = sqrt(ax*ax +ay*ay +az*az);
1803 dd = 1.0 / (double)3.;
1807 memcpy(oldp,ppa->
c,3*
sizeof(
double));
1808 oldc[0] = 1./3.*(p1->
c[0]+p2->
c[0]+p3->
c[0]);
1809 oldc[1] = 1./3.*(p1->
c[1]+p2->
c[1]+p3->
c[1]);
1810 oldc[2] = 1./3.*(p1->
c[2]+p2->
c[2]+p3->
c[2]);
1814 if ( !lon )
return 0;
1818 for (l=1; l<lon; l++) {
1821 if ( pt1->
qual < crit) crit = pt1->
qual;
1827 ppa->
c[0] = oldc[0] + coe * nx * len;
1828 ppa->
c[1] = oldc[1] + coe * ny * len;
1829 ppa->
c[2] = oldc[2] + coe * nz * len;
1830 for (l=0; l<lon; l++) {
1833 qual = MMG5_caltet(
mesh,
sol,pt1);
1834 if ( qual < crit ) {
1840 if ( l >= lon )
break;
1843 while ( ++iter <= maxiter );
1844 if ( iter > maxiter) {
1845 memcpy(ppa->
c,oldp,3*
sizeof(
double));
1849 for (l=0; l<lon; l++) {
1852 pt1->
qual = qualtet[l];
1878 int j,iter,maxiter,l,lon;
1880 MMG5_int ipb,iadr,iel,i1,i2,i3;
1882 double ax,ay,az,bx,by,bz,nx,ny,nz,dd,len,qual,oldc[3];
1893 iadr = (pt->
v[ib])*
sol->size;
1904 ax = p3->
c[0] - p1->
c[0];
1905 ay = p3->
c[1] - p1->
c[1];
1906 az = p3->
c[2] - p1->
c[2];
1908 bx = p2->
c[0] - p1->
c[0];
1909 by = p2->
c[1] - p1->
c[1];
1910 bz = p2->
c[2] - p1->
c[2];
1912 nx = (ay*bz - az*by);
1913 ny = (az*bx - ax*bz);
1914 nz = (ax*by - ay*bx);
1916 dd = sqrt(nx*nx+ny*ny+nz*nz);
1922 for (j=0; j<3; j++) {
1926 ax = ppb->
c[0] - ppa->
c[0];
1927 ay = ppb->
c[1] - ppa->
c[1];
1928 az = ppb->
c[2] - ppa->
c[2];
1930 dd = sqrt(ax*ax +ay*ay +az*az);
1934 dd = 1.0 / (double)3.;
1936 if(len > 0.) len = 1.0 / len;
1938 memcpy(oldc,ppa->
c,3*
sizeof(
double));
1946 for (l=1; l<lon; l++) {
1949 if ( pt1->
qual < crit )
1959 ppa->
c[0] = oldc[0] + coe * nx * len;
1960 ppa->
c[1] = oldc[1] + coe * ny * len;
1961 ppa->
c[2] = oldc[2] + coe * nz * len;
1962 for (l=0; l<lon; l++) {
1965 qual = MMG5_caltet(
mesh,
sol,pt1);
1966 if ( qual < crit )
break;
1970 if ( l >= lon )
break;
1973 while ( ++iter <= maxiter );
1974 if ( iter > maxiter) {
1975 memcpy(ppa->
c,oldc,3*
sizeof(
double));
1979 for (l=0; l<lon; l++) {
1982 pt1->
qual = qualtet[l];
MMG5_pMesh MMG5_pSol * sol
if(!ier) exit(EXIT_FAILURE)
int MMG3D_movePROctree(MMG5_pMesh mesh, MMG3D_pPROctree q, MMG5_int no, double *newVer, double *oldVer)
int MMG3D_bezierInt(MMG5_pBezier pb, double uv[2], double o[3], double no[3], double to[3])
int MMG5_boulevolp(MMG5_pMesh mesh, MMG5_int start, int ip, int64_t *list)
static double MMG5_lenedg_iso(MMG5_pMesh mesh, MMG5_pSol met, int ia, MMG5_pTetra pt)
static double MMG5_orcal(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int iel)
API headers for the mmg3d library.
static const uint8_t MMG5_arpt[4][3]
arpt[i]: edges passing through vertex i
int MMG5_BezierRidge(MMG5_pMesh mesh, MMG5_int ip0, MMG5_int ip1, double s, double *o, double *no1, double *no2, double *to)
int8_t MMG5_chkedg(MMG5_pMesh mesh, MMG5_Tria *pt, int8_t ori, double, double, int)
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
int MMG5_BezierRef(MMG5_pMesh mesh, MMG5_int ip0, MMG5_int ip1, double s, double *o, double *no, double *to)
void MMG5_tet2tri(MMG5_pMesh mesh, MMG5_int k, int8_t ie, MMG5_Tria *ptt)
int MMG5_BezierNom(MMG5_pMesh mesh, MMG5_int ip0, MMG5_int ip1, double s, double *o, double *no, double *to)
static const uint8_t MMG5_idir[4][3]
idir[i]: vertices of face opposite to vertex i
double MMG5_det3pt1vec(double c0[3], double c1[3], double c2[3], double v[3])
double MMG5_det4pt(double c0[3], double c1[3], double c2[3], double c3[3])
#define MMG5_TAB_RECALLOC(mesh, ptr, initSize, wantedGap, type, message, law)
#define MG_GET(flag, bit)
double MMG5_orvol(MMG5_pPoint point, MMG5_int *v)
int MMG5_rotmatrix(double n[3], double r[3][3])
int MMG5_movbdynomintpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, int improve)
int MMG5_movbdyridpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve)
int MMG3D_movnormal_iso(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int k, int ib)
int MMG3D_movbdycurvept_chckAndUpdate(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, int improve, MMG5_pPoint p0, MMG5_int ip0, uint8_t isrid, double o[3], double no[3], double no2[3], double to[3])
int MMG3D_rotate_surfacicBall(MMG5_pMesh mesh, MMG5_int *lists, int ilists, MMG5_int ip0, double r[3][3], double *lispoi)
int MMG3D_movv_ani(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int k, int ib)
static int MMG3D_curveEndingPts_chkEdg(MMG5_pMesh mesh, MMG5_int *lists, int l, MMG5_int ip0, MMG5_int *ipa, MMG5_int *ipb, const int16_t edgTag, MMG5_int *ip)
int MMG5_movbdyregpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improveSurf, int improveVol)
int MMG5_movintpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *list, int ilist, int improve)
int MMG3D_curveEndingPts(MMG5_pMesh mesh, MMG5_int *lists, int ilists, const int16_t edgTag, MMG5_int ip0, MMG5_int *ip1, MMG5_int *ip2)
static int MMG3D_movbdycurvept_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve, const int16_t edgTag)
int MMG3D_movbdycurvept_newPosForSimu(MMG5_pMesh mesh, MMG5_pPoint p0, MMG5_int ip0, MMG5_int ip1, MMG5_int ip2, double ll1old, double ll2old, uint8_t isrid, const double step, double o[3], double no[3], double no2[3], double to[3], const int16_t edgTag)
int MMG3D_movv_iso(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int k, int ib)
int MMG5_movintptLES_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, MMG5_int *list, int ilist, int improve)
int MMG3D_movbdyregpt_geom(MMG5_pMesh mesh, MMG5_int *lists, const MMG5_int kel, const MMG5_int ip0, double n[3], double lambda[3], double o[3], double no[3])
int MMG5_movbdyrefpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve)
int MMG5_movbdynompt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve)
Structure to store points of a MMG mesh.
Structure to store surface points of a MMG mesh.
Structure to store the surface tetrahedra of a MMG mesh.