93 int ilists,
double hmin,
double hmax,
double hausd) {
99 double ux,uy,uz,det2d,h,isqhmin,isqhmax,ll,lmin,lmax,hnm,s;
100 double *n,*t,r[3][3],lispoi[3*
MMG3D_LMAX+1],intm[3],b0[3],b1[3],c[3],tAA[6],tAb[3],d[3];
101 double kappa[2],vp[2][2];
102 MMG5_int k,na,nb,ntempa,ntempb,iel,ip0;
104 static int8_t mmgWarn0=0,mmgWarn1=0,mmgWarn2=0,mmgWarn3=0;
106 p0 = &
mesh->point[nump];
111 fprintf(stderr,
"\n ## Error: %s: at least 1 wrong point"
112 " qualification : xp ? %" MMG5_PRId
".\n",__func__,p0->
xp);
119 assert ( (!(
MG_CRN & p0->
tag)) &&
"We should not pass here with corner points" );
121 isqhmin = 1.0 / (hmin*hmin);
122 isqhmax = 1.0 / (hmax*hmax);
124 n = &
mesh->xpoint[p0->
xp].n1[0];
131 fprintf(stderr,
"\n ## Warning: %s: function MMG5_rotmatrix return 0.\n",
140 iface = lists[0] % 4;
141 pt = &
mesh->tetra[iel];
146 for (i=0; i<3; i++) {
155 for (k=1; k<ilists; k++) {
157 iface = lists[k] % 4;
158 pt = &
mesh->tetra[iel];
160 for (i=0; i<3; i++) {
169 p1 = &
mesh->point[na];
170 else if ( ntempa == nb )
171 p1 = &
mesh->point[nb];
172 else if ( ntempb == na )
173 p1 = &
mesh->point[na];
175 assert(ntempb == nb);
176 p1 = &
mesh->point[nb];
178 ux = p1->
c[0] - p0->
c[0];
179 uy = p1->
c[1] - p0->
c[1];
180 uz = p1->
c[2] - p0->
c[2];
182 lispoi[3*k+1] = r[0][0]*ux + r[0][1]*uy + r[0][2]*uz;
183 lispoi[3*k+2] = r[1][0]*ux + r[1][1]*uy + r[1][2]*uz;
184 lispoi[3*k+3] = r[2][0]*ux + r[2][1]*uy + r[2][2]*uz;
186 ll = lispoi[3*k+1]*lispoi[3*k+1] + lispoi[3*k+2]*lispoi[3*k+2] + lispoi[3*k+3]*lispoi[3*k+3];
196 iface = lists[0] % 4;
197 pt = &
mesh->tetra[iel];
199 for (i=0; i<3; i++) {
208 p1 = &
mesh->point[na];
209 else if ( ntempa == nb )
210 p1 = &
mesh->point[nb];
211 else if ( ntempb == na )
212 p1 = &
mesh->point[na];
214 assert(ntempb == nb);
215 p1 = &
mesh->point[nb];
218 ux = p1->
c[0] - p0->
c[0];
219 uy = p1->
c[1] - p0->
c[1];
220 uz = p1->
c[2] - p0->
c[2];
222 lispoi[1] = r[0][0]*ux + r[0][1]*uy + r[0][2]*uz;
223 lispoi[2] = r[1][0]*ux + r[1][1]*uy + r[1][2]*uz;
224 lispoi[3] = r[2][0]*ux + r[2][1]*uy + r[2][2]*uz;
226 ll = lispoi[1]*lispoi[1] + lispoi[2]*lispoi[2] + lispoi[3]*lispoi[3];
231 lispoi[3*ilists+1] = lispoi[1];
232 lispoi[3*ilists+2] = lispoi[2];
233 lispoi[3*ilists+3] = lispoi[3];
237 if ( lmax/lmin > 4.0*hmax*hmax/(hmin*hmin) )
return hmax;
240 for (k=0; k<ilists-1; k++) {
241 det2d = lispoi[3*k+1]*lispoi[3*(k+1)+2] - lispoi[3*k+2]*lispoi[3*(k+1)+1];
242 if ( det2d < 0.0 )
return hmax;
244 det2d = lispoi[3*(ilists-1)+1]*lispoi[3*0+2] - lispoi[3*(ilists-1)+2]*lispoi[3*0+1];
245 if ( det2d < 0.0 )
return hmax;
249 memset(intm,0x00,3*
sizeof(
double));
250 memset(tAA,0x00,6*
sizeof(
double));
251 memset(tAb,0x00,3*
sizeof(
double));
253 for (k=0; k<ilists; k++) {
255 iface = lists[k] % 4;
257 assert( 0<=iface && iface<4 &&
"unexpected local face idx");
260 pxt = &
mesh->xtetra[
mesh->tetra[iel].xt];
264 fprintf(stderr,
"\n ## Warning: %s: function MMG5_bezierCP return 0.\n",
270 for (i0=0; i0<3; i0++) {
271 if ( tt.
v[i0] == nump )
break;
275 for (j=0; j<10; j++) {
276 c[0] = b.
b[j][0] - p0->
c[0];
277 c[1] = b.
b[j][1] - p0->
c[1];
278 c[2] = b.
b[j][2] - p0->
c[2];
280 b.
b[j][0] = r[0][0]*c[0] + r[0][1]*c[1] + r[0][2]*c[2];
281 b.
b[j][1] = r[1][0]*c[0] + r[1][1]*c[1] + r[1][2]*c[2];
282 b.
b[j][2] = r[2][0]*c[0] + r[2][1]*c[1] + r[2][2]*c[2];
287 memcpy(b0,&(b.
b[7][0]),3*
sizeof(
double));
288 memcpy(b1,&(b.
b[8][0]),3*
sizeof(
double));
290 else if ( i0 == 1 ) {
291 memcpy(b0,&(b.
b[3][0]),3*
sizeof(
double));
292 memcpy(b1,&(b.
b[4][0]),3*
sizeof(
double));
295 memcpy(b0,&(b.
b[5][0]),3*
sizeof(
double));
296 memcpy(b1,&(b.
b[6][0]),3*
sizeof(
double));
301 c[0] = 3.0*s*(1.0-s)*(1.0-s)*b0[0] + 3.0*s*s*(1.0-s)*b1[0] + s*s*s*lispoi[3*k+1];
302 c[1] = 3.0*s*(1.0-s)*(1.0-s)*b0[1] + 3.0*s*s*(1.0-s)*b1[1] + s*s*s*lispoi[3*k+2];
303 c[2] = 3.0*s*(1.0-s)*(1.0-s)*b0[2] + 3.0*s*s*(1.0-s)*b1[2] + s*s*s*lispoi[3*k+3];
306 tAA[0] += c[0]*c[0]*c[0]*c[0];
307 tAA[1] += c[0]*c[0]*c[1]*c[1];
308 tAA[2] += c[0]*c[0]*c[0]*c[1];
309 tAA[3] += c[1]*c[1]*c[1]*c[1];
310 tAA[4] += c[0]*c[1]*c[1]*c[1];
311 tAA[5] += c[0]*c[0]*c[1]*c[1];
313 tAb[0] += c[0]*c[0]*c[2];
314 tAb[1] += c[1]*c[1]*c[2];
315 tAb[2] += c[0]*c[1]*c[2];
319 c[0] = 3.0*s*(1.0-s)*(1.0-s)*b0[0] + 3.0*s*s*(1.0-s)*b1[0] + s*s*s*lispoi[3*k+1];
320 c[1] = 3.0*s*(1.0-s)*(1.0-s)*b0[1] + 3.0*s*s*(1.0-s)*b1[1] + s*s*s*lispoi[3*k+2];
321 c[2] = 3.0*s*(1.0-s)*(1.0-s)*b0[2] + 3.0*s*s*(1.0-s)*b1[2] + s*s*s*lispoi[3*k+3];
324 tAA[0] += c[0]*c[0]*c[0]*c[0];
325 tAA[1] += c[0]*c[0]*c[1]*c[1];
326 tAA[2] += c[0]*c[0]*c[0]*c[1];
327 tAA[3] += c[1]*c[1]*c[1]*c[1];
328 tAA[4] += c[0]*c[1]*c[1]*c[1];
329 tAA[5] += c[0]*c[0]*c[1]*c[1];
331 tAb[0] += c[0]*c[0]*c[2];
332 tAb[1] += c[1]*c[1]*c[2];
333 tAb[2] += c[0]*c[1]*c[2];
337 c[0] =
A64TH*(b.
b[1][0] + b.
b[2][0] + 3.0*(b.
b[3][0] + b.
b[4][0])) \
338 + 3.0*
A16TH*(b.
b[6][0] + b.
b[7][0] + b.
b[9][0]) +
A32TH*(b.
b[5][0] + b.
b[8][0]);
339 c[1] =
A64TH*(b.
b[1][1] + b.
b[2][1] + 3.0*(b.
b[3][1] + b.
b[4][1])) \
340 + 3.0*
A16TH*(b.
b[6][1] + b.
b[7][1] + b.
b[9][1]) +
A32TH*(b.
b[5][1] + b.
b[8][1]);
341 c[2] =
A64TH*(b.
b[1][2] + b.
b[2][2] + 3.0*(b.
b[3][2] + b.
b[4][2])) \
342 + 3.0*
A16TH*(b.
b[6][2] + b.
b[7][2] + b.
b[9][2]) +
A32TH*(b.
b[5][2] + b.
b[8][2]);
344 d[0] = 0.125*b.
b[1][0] + 0.375*(b.
b[3][0] + b.
b[4][0]) + 0.125*b.
b[2][0];
345 d[1] = 0.125*b.
b[1][1] + 0.375*(b.
b[3][1] + b.
b[4][1]) + 0.125*b.
b[2][1];
346 d[2] = 0.125*b.
b[1][2] + 0.375*(b.
b[3][2] + b.
b[4][2]) + 0.125*b.
b[2][2];
349 c[0] =
A64TH*(b.
b[0][0] + b.
b[2][0] + 3.0*(b.
b[5][0] + b.
b[6][0])) \
350 + 3.0*
A16TH*(b.
b[3][0] + b.
b[8][0] + b.
b[9][0]) +
A32TH*(b.
b[4][0] + b.
b[7][0]);
351 c[1] =
A64TH*(b.
b[0][1] + b.
b[2][1] + 3.0*(b.
b[5][1] + b.
b[6][1])) \
352 + 3.0*
A16TH*(b.
b[3][1] + b.
b[8][1] + b.
b[9][1]) +
A32TH*(b.
b[4][1] + b.
b[7][1]);
353 c[2] =
A64TH*(b.
b[0][2] + b.
b[2][2] + 3.0*(b.
b[5][2] + b.
b[6][2])) \
354 + 3.0*
A16TH*(b.
b[3][2] + b.
b[8][2] + b.
b[9][2]) +
A32TH*(b.
b[4][2] + b.
b[7][2]);
356 d[0] = 0.125*b.
b[2][0] + 0.375*(b.
b[5][0] + b.
b[6][0]) + 0.125*b.
b[0][0];
357 d[1] = 0.125*b.
b[2][1] + 0.375*(b.
b[5][1] + b.
b[6][1]) + 0.125*b.
b[0][1];
358 d[2] = 0.125*b.
b[2][2] + 0.375*(b.
b[5][2] + b.
b[6][2]) + 0.125*b.
b[0][2];
361 c[0] =
A64TH*(b.
b[0][0] + b.
b[1][0] + 3.0*(b.
b[7][0] + b.
b[8][0])) \
362 + 3.0*
A16TH*(b.
b[4][0] + b.
b[5][0] + b.
b[9][0]) +
A32TH*(b.
b[3][0] + b.
b[6][0]);
363 c[1] =
A64TH*(b.
b[0][1] + b.
b[1][1] + 3.0*(b.
b[7][1] + b.
b[8][1])) \
364 + 3.0*
A16TH*(b.
b[4][1] + b.
b[5][1] + b.
b[9][1]) +
A32TH*(b.
b[3][1] + b.
b[6][1]);
365 c[2] =
A64TH*(b.
b[0][2] + b.
b[1][2] + 3.0*(b.
b[7][2] + b.
b[8][2])) \
366 + 3.0*
A16TH*(b.
b[4][2] + b.
b[5][2] + b.
b[9][2]) +
A32TH*(b.
b[3][2] + b.
b[6][2]);
368 d[0] = 0.125*b.
b[0][0] + 0.375*(b.
b[7][0] + b.
b[8][0]) + 0.125*b.
b[1][0];
369 d[1] = 0.125*b.
b[0][1] + 0.375*(b.
b[7][1] + b.
b[8][1]) + 0.125*b.
b[1][1];
370 d[2] = 0.125*b.
b[0][2] + 0.375*(b.
b[7][2] + b.
b[8][2]) + 0.125*b.
b[1][2];
374 tAA[0] += c[0]*c[0]*c[0]*c[0];
375 tAA[1] += c[0]*c[0]*c[1]*c[1];
376 tAA[2] += c[0]*c[0]*c[0]*c[1];
377 tAA[3] += c[1]*c[1]*c[1]*c[1];
378 tAA[4] += c[0]*c[1]*c[1]*c[1];
379 tAA[5] += c[0]*c[0]*c[1]*c[1];
381 tAb[0] += c[0]*c[0]*c[2];
382 tAb[1] += c[1]*c[1]*c[2];
383 tAb[2] += c[0]*c[1]*c[2];
385 tAA[0] += d[0]*d[0]*d[0]*d[0];
386 tAA[1] += d[0]*d[0]*d[1]*d[1];
387 tAA[2] += d[0]*d[0]*d[0]*d[1];
388 tAA[3] += d[1]*d[1]*d[1]*d[1];
389 tAA[4] += d[0]*d[1]*d[1]*d[1];
390 tAA[5] += d[0]*d[0]*d[1]*d[1];
392 tAb[0] += d[0]*d[0]*d[2];
393 tAb[1] += d[1]*d[1]*d[2];
394 tAb[2] += d[0]*d[1]*d[2];
409 fprintf(stderr,
"\n # Warning: %s: function MMG5_eigensym return 0.\n",
416 kappa[0] = 2.0/9.0 * fabs(kappa[0]) / hausd;
417 kappa[0] =
MG_MIN(kappa[0],isqhmin);
418 kappa[0] =
MG_MAX(kappa[0],isqhmax);
420 kappa[1] = 2.0/9.0 * fabs(kappa[1]) / hausd;
421 kappa[1] =
MG_MIN(kappa[1],isqhmin);
422 kappa[1] =
MG_MAX(kappa[1],isqhmax);
424 kappa[0] = 1.0 / sqrt(kappa[0]);
425 kappa[1] = 1.0 / sqrt(kappa[1]);
427 h =
MG_MIN(kappa[0],kappa[1]);
431 for (k=0; k<ilists; k++) {
432 iface = lists[k] % 4;
434 for (j=0; j<3; j++) {
437 p1 = &
mesh->point[ip0];
451 memcpy(c,t,3*
sizeof(
double));
453 d[0] = r[0][0]*c[0] + r[0][1]*c[1] + r[0][2]*c[2];
454 d[1] = r[1][0]*c[0] + r[1][1]*c[1] + r[1][2]*c[2];
456 hnm = intm[0]*d[0]*d[0] + 2.0*intm[1]*d[0]*d[1] + intm[2]*d[1]*d[1];
457 hnm = 2.0/9.0 * fabs(hnm) / hausd;
458 hnm =
MG_MIN(hnm,isqhmin);
459 hnm =
MG_MAX(hnm,isqhmax);
460 hnm = 1.0 / sqrt(hnm);
461 met->
m[ip0] =
MG_MIN(met->
m[ip0],hnm);
667 double hp,v[3],b0[3],b1[3],b0p0[3],b1b0[3],p1b1[3],hausd,hmin,hmax;
668 double secder0[3],secder1[3],kappa,tau[3],gammasec[3],ntau2,intau,ps,lm;
674 int8_t i,j,ia,ised,i0,i1;
681 for (k=1; k<=
mesh->np; k++) {
682 p0 = &
mesh->point[k];
708 if ( !
mesh->info.nosizreq ) {
717 for (k=1; k<=
mesh->ne; k++) {
718 pt = &
mesh->tetra[k];
719 if ( !
MG_EOK(pt) )
continue;
721 for (i=0; i<4; i++) {
723 p0 = &
mesh->point[ip0];
725 if ( p0->
flag )
continue;
729 hmax =
mesh->info.hmax;
733 for (l=0; l<
mesh->info.npar; l++) {
735 par = &
mesh->info.par[l];
752 par = &
mesh->info.par[l];
755 for ( kk=0; kk<ilistv; ++kk ) {
756 ptloc = &
mesh->tetra[listv[kk]/4];
757 if ( par->
ref == ptloc->
ref ) {
763 }
while ( ++l<mesh->
info.npar );
765 for ( ; l<
mesh->info.npar; ++l ) {
766 par = &
mesh->info.par[l];
769 for ( kk=0; kk<ilistv; ++kk ) {
770 ptloc = &
mesh->tetra[listv[kk]/4];
771 if ( par->
ref == ptloc->
ref ) {
785 for (k=1; k<=
mesh->nprism; k++) {
786 pp = &
mesh->prism[k];
787 if ( !
MG_EOK(pp) )
continue;
789 for (i=0; i<6; i++) {
791 p0 = &
mesh->point[ip0];
793 if ( p0->
flag )
continue;
803 for (k=1; k<=
mesh->ne; k++) {
804 pt = &
mesh->tetra[k];
805 if ( !
MG_EOK(pt) )
continue;
807 for (i=0; i<4; i++) {
809 p0 = &
mesh->point[ip0];
811 if ( p0->
flag )
continue;
815 hmin =
mesh->info.hmin;
816 hmax =
mesh->info.hmax;
820 for (l=0; l<
mesh->info.npar; l++) {
821 par = &
mesh->info.par[l];
839 par = &
mesh->info.par[l];
842 for ( kk=0; kk<ilistv; ++kk ) {
843 ptloc = &
mesh->tetra[listv[kk]/4];
844 if ( par->
ref == ptloc->
ref ) {
851 }
while ( ++l<mesh->
info.npar );
853 for ( ; l<
mesh->info.npar; ++l ) {
854 par = &
mesh->info.par[l];
857 for ( kk=0; kk<ilistv; ++kk ) {
858 ptloc = &
mesh->tetra[listv[kk]/4];
859 if ( par->
ref == ptloc->
ref ) {
874 for (k=1; k<=
mesh->nprism; k++) {
875 pp = &
mesh->prism[k];
876 if ( !
MG_EOK(pp) )
continue;
878 for (i=0; i<6; i++) {
880 p0 = &
mesh->point[ip0];
882 if ( p0->
flag )
continue;
891 for (k=1; k<=
mesh->ne; k++) {
892 pt = &
mesh->tetra[k];
895 else if ( !pt->
xt )
continue;
897 pxt = &
mesh->xtetra[pt->
xt];
898 for (i=0; i<4; i++) {
902 for (j=0; j<3; j++) {
905 p0 = &
mesh->point[ip0];
907 if ( p0->
flag>1 )
continue;
917 &hausd,&hmin,&hmax) ) {
918 hmin =
mesh->info.hmin;
919 hmax =
mesh->info.hmax;
920 hausd =
mesh->info.hausd;
929 met->
m[ip0] =
MG_MIN(met->
m[ip0],hp);
939 for (k=1; k<=
mesh->ne; k++) {
941 pt = &
mesh->tetra[k];
943 else if ( !pt->
xt )
continue;
944 pxt = &
mesh->xtetra[pt->
xt];
946 for (i=0; i<4; i++) {
950 for (j=0; j<3; j++) {
956 p0 = &
mesh->point[ip0];
957 p1 = &
mesh->point[ip1];
960 if ( p0->
flag == 3 && p1->
flag == 3 )
continue;
967 hausd =
mesh->info.hausd;
968 hmin =
mesh->info.hmin;
969 hmax =
mesh->info.hmax;
977 b0p0[0] = b0[0] - p0->
c[0];
978 b0p0[1] = b0[1] - p0->
c[1];
979 b0p0[2] = b0[2] - p0->
c[2];
981 b1b0[0] = b1[0] - b0[0];
982 b1b0[1] = b1[1] - b0[1];
983 b1b0[2] = b1[2] - b0[2];
985 p1b1[0] = p1->
c[0] - b1[0];
986 p1b1[1] = p1->
c[1] - b1[1];
987 p1b1[2] = p1->
c[2] - b1[2];
989 secder0[0] = p0->
c[0] + b1[0] - 2.0*b0[0];
990 secder0[1] = p0->
c[1] + b1[1] - 2.0*b0[1];
991 secder0[2] = p0->
c[2] + b1[2] - 2.0*b0[2];
993 secder1[0] = p1->
c[0] + b0[0] - 2.0*b1[0];
994 secder1[1] = p1->
c[1] + b0[1] - 2.0*b1[1];
995 secder1[2] = p1->
c[2] + b0[2] - 2.0*b1[2];
998 for (l=0; l<4; l++) {
1010 ntau2 = tau[0]*tau[0] + tau[1]*tau[1] + tau[2]*tau[2];
1012 intau = 1.0/sqrt(ntau2);
1018 ps = gammasec[0]*tau[0] + gammasec[1]*tau[1] + gammasec[2]*tau[2];
1019 gammasec[0] = gammasec[0]*ntau2 - ps*ntau2*tau[0];
1020 gammasec[1] = gammasec[1]*ntau2 - ps*ntau2*tau[1];
1021 gammasec[2] = gammasec[2]*ntau2 - ps*ntau2*tau[2];
1022 kappa =
MG_MAX(kappa,gammasec[0]*gammasec[0] + gammasec[1]*gammasec[1] + gammasec[2]*gammasec[2] );
1024 kappa = sqrt(kappa);
1028 lm = sqrt(8.0*hausd / kappa);