59 for (k=1; k<=
mesh->
ne; k++) {
61 if( !
MG_EOK(pt) )
continue;
63 if ( !metRidTyp && met->
size == 6 && met->
m ) {
66 else if ( !(met && met->
m) ) {
77 for ( i=0; i<4; ++i ) {
86 if ( i < 4 && pt->qual < minqual ) {
110 double cal,abx,aby,abz,acx,acy,acz,adx,ady,adz;
111 double bcx,bcy,bcz,bdx,bdy,bdz,cdx,cdy,cdz;
112 double h1,h2,h3,h4,h5,h6,det,vol,rap,v1,v2,v3,num;
115 int iad0,iad1,iad2,iad3;
123 iad0 = met->
size * ip[0];
124 iad1 = met->
size * ip[1];
125 iad2 = met->
size * ip[2];
126 iad3 = met->
size * ip[3];
130 mm[k] = 0.25 * (met->
m[iad0+k]+met->
m[iad1+k]+met->
m[iad2+k]+met->
m[iad3+k]);
162 v1 = acy*adz - acz*ady;
163 v2 = acz*adx - acx*adz;
164 v3 = acx*ady - acy*adx;
165 vol = abx * v1 + aby * v2 + abz * v3;
166 if ( vol <= 0. )
return 0.0;
168 det = mm[0] * ( mm[3]*mm[5] - mm[4]*mm[4]) \
169 - mm[1] * ( mm[1]*mm[5] - mm[2]*mm[4]) \
170 + mm[2] * ( mm[1]*mm[4] - mm[2]*mm[3]);
174 det = sqrt(det) * vol;
177 h1 = mm[0]*abx*abx + mm[3]*aby*aby + mm[5]*abz*abz
178 + 2.0*(mm[1]*abx*aby + mm[2]*abx*abz + mm[4]*aby*abz);
179 h2 = mm[0]*acx*acx + mm[3]*acy*acy + mm[5]*acz*acz
180 + 2.0*(mm[1]*acx*acy + mm[2]*acx*acz + mm[4]*acy*acz);
181 h3 = mm[0]*adx*adx + mm[3]*ady*ady + mm[5]*adz*adz
182 + 2.0*(mm[1]*adx*ady + mm[2]*adx*adz + mm[4]*ady*adz);
183 h4 = mm[0]*bcx*bcx + mm[3]*bcy*bcy + mm[5]*bcz*bcz
184 + 2.0*(mm[1]*bcx*bcy + mm[2]*bcx*bcz + mm[4]*bcy*bcz);
185 h5 = mm[0]*bdx*bdx + mm[3]*bdy*bdy + mm[5]*bdz*bdz
186 + 2.0*(mm[1]*bdx*bdy + mm[2]*bdx*bdz + mm[4]*bdy*bdz);
187 h6 = mm[0]*cdx*cdx + mm[3]*cdy*cdy + mm[5]*cdz*cdz
188 + 2.0*(mm[1]*cdx*cdy + mm[2]*cdx*cdz + mm[4]*cdy*cdz);
191 rap = h1 + h2 + h3 + h4 + h5 + h6;
192 num = sqrt(rap) * rap;
222 double* lmin,
double* lmax, MMG5_int* ned, MMG5_int* amin,
223 MMG5_int* bmin, MMG5_int* amax,
224 MMG5_int* bmax, MMG5_int* nullEdge, int8_t metRidTyp,
225 double** bd_in, MMG5_int hl[9] )
232 int8_t ia,i0,i1,
ier,i;
233 static double bd[9]= {0.0, 0.3, 0.6, 0.7071, 0.9, 1.3, 1.4142, 2.0, 5.0};
236 memset(hl,0,9*
sizeof(
int));
241 *amin = *amax = *bmin = *bmax = 0;
247 for(k=1; k<=
mesh->
ne; k++) {
249 if ( !
MG_EOK(pt) )
continue;
251 for(ia=0; ia<6; ia++) {
258 fprintf(stderr,
" ## Error: %s: function MMG5_hashEdge return 0\n",
266 for(k=1; k<=
mesh->
ne; k++) {
268 if ( !
MG_EOK(pt) )
continue;
270 for(i=0 ; i<4 ; i++) {
278 for(ia=0; ia<6; ia++) {
287 if ( (!metRidTyp) && met->
size==6 && met->
m ) {
291 len = MMG5_lenedg(
mesh,met,ia,pt);
301 if( len < (*lmin) ) {
307 if ( len > (*lmax) ) {
315 if ( bd[i] <= len && len < bd[i+1] ) {
320 if( i == 8 ) hl[8]++;
342 double avlen, lmin, lmax;
343 MMG5_int ned, nullEdge;
344 MMG5_int amin, bmin, amax, bmax, hl[9];
348 &bmin, &amax, &bmax, &nullEdge, metRidTyp, &bd, hl ) )
353 amax, bmax, lmax,nullEdge, &bd[0], &hl[0],1);
377 double *min,MMG5_int *iel,MMG5_int *good,MMG5_int *med,MMG5_int his[5],
int imprim) {
381 static int8_t mmgWarn0=0;
384 for (k=1; k<=
mesh->
ne; k++) {
386 if( !
MG_EOK(pt) )
continue;
394 (*min) = (*avg) = 0.0;
397 (*med) = (*good) = 0;
399 for (k=0; k<5; k++) his[k] = 0;
402 for (k=1; k<=
mesh->
ne; k++) {
411 fprintf(stderr,
" ## Warning: %s: at least 1 negative volume.\n",
415 if ( rap > (*min) ) {
419 if ( rap < 0.9 ) (*med)++;
420 if ( rap < 0.6 ) (*good)++;
423 (*max) =
MG_MIN((*max),rap);
461 MMG5_int good,MMG5_int med,MMG5_int his[5],MMG5_int nrid,
int optimLES,
464 fprintf(stdout,
"\n -- MESH QUALITY");
466 fprintf(stdout,
" (LES)");
467 fprintf(stdout,
" %" MMG5_PRId
"\n",ne);
469 fprintf(stdout,
" BEST %8.6f AVRG. %8.6f WRST. %8.6f (%" MMG5_PRId
")\n",
470 max,avg / ne,min,iel);
473 nrid,optimLES,imprim) );
495 MMG5_int good,MMG5_int med,MMG5_int his[5],MMG5_int nrid,
int optimLES,
498 const double les_ticks[6] = {0,0.6,0.9,0.93,0.99,1};
501 if ( abs(imprim) >= 3 ){
504 fprintf(stdout,
" HISTOGRAMM:");
505 fprintf(stdout,
" %6.2f %% < 0.6\n",100.0*((
float)good/(
float)ne));
506 if ( abs(imprim) > 3 ) {
507 fprintf(stdout,
" %6.2f %% < 0.9\n",100.0*( (
float)med/(
float)ne));
509 assert ( min >= max );
510 for ( i=0; i<5; ++i ) {
511 if ( max < les_ticks[i+1] && min >= les_ticks[i] ) {
512 fprintf(stdout,
" %5.2f < Q < %5.2f %7"MMG5_PRId
" %6.2f %%\n",
513 les_ticks[i],les_ticks[i+1],his[i],
514 100.*((
float)his[i]/(
float)ne));
522 fprintf(stdout,
" HISTOGRAMM:");
523 fprintf(stdout,
" %6.2f %% > 0.12\n",100.0*((
float)good/(
float)ne));
524 if ( abs(imprim) > 3 ) {
525 fprintf(stdout,
" %6.2f %% > 0.5\n",100.0*( (
float)med/(
float)ne));
526 imax =
MG_MIN(4,(
int)(5.*max));
527 for (i=imax; i>=(int)(5*min); i--) {
528 fprintf(stdout,
" %5.1f < Q < %5.1f %7"MMG5_PRId
" %6.2f %%\n",
529 i/5.,i/5.+0.2,his[i],100.*((
float)his[i]/(
float)ne));
532 fprintf(stdout,
"\n ## WARNING: %" MMG5_PRId
" TETRA WITH 4 RIDGES POINTS:"
533 " UNABLE TO COMPUTE ANISO QUALITY.\n",nrid);
560 double *min,MMG5_int *iel,MMG5_int *good,MMG5_int *med,MMG5_int his[5],
int imprim) {
565 static int8_t mmgWarn0 = 0;
568 for (k=1; k<=
mesh->
ne; k++) {
570 if( !
MG_EOK(pt) )
continue;
573 if ( met->
size == 6) {
582 if ( imprim <= 0 )
return;
585 (*max) = (*avg) = 0.0;
587 (*med) = (*good) = 0;
589 for (k=0; k<5; k++) his[k] = 0;
592 for (k=1; k<=
mesh->
ne; k++) {
601 fprintf(stderr,
" ## Warning: %s: at least 1 negative volume\n",
605 if ( rap < (*min) ) {
609 if ( rap > 0.5 ) (*med)++;
610 if ( rap > 0.12 ) (*good)++;
613 (*max) =
MG_MAX((*max),rap);
614 ir =
MG_MIN(4,(
int)(5.0*rap));
632 double rapmin,rapmax,rapavg;
634 MMG5_int med,good,iel,ne,his[5];
636 ne = iel = good = med = 0;
637 for ( k=0; k<5; ++k ) {
681 double *min,MMG5_int *iel,MMG5_int *good,MMG5_int *med,MMG5_int his[5],
682 MMG5_int *nrid,
int imprim) {
688 static int8_t mmgWarn0 = 0;
691 for (k=1; k<=
mesh->
ne; k++) {
693 if( !
MG_EOK(pt) )
continue;
701 (*max) = (*avg) = 0.0;
703 (*med) = (*good) = 0;
705 for (k=0; k<5; k++) his[k] = 0;
707 nex = ok = (*nrid) = 0;
708 for (k=1; k<=
mesh->
ne; k++) {
717 fprintf(stderr,
" ## Warning: %s: at least 1 negative volume\n",
725 for(i=0 ; i<4 ; i++) {
737 if ( rap < (*min) ) {
741 if ( rap > 0.5 ) (*med)++;
742 if ( rap > 0.12 ) (*good)++;
745 (*max) =
MG_MAX((*max),rap);
746 ir =
MG_MIN(4,(
int)(5.0*rap));
765 double rapmin,rapmax,rapavg;
768 MMG5_int med,good,iel,ne,nrid;
770 nrid = ne = iel = good = med = 0;
771 for ( k=0; k<5; ++k ) {
811 int ia,ipa,ipb,lon,l;
813 int lenint,loc,nedel,longen;
814 double dned,dnface,dnint,w,lenavg,lent[6];
815 double dnpdel,dnadd,leninv,dnaddloc,dnpdelloc;
822 pdel = (MMG5_int*) calloc(
mesh->
np+1,
sizeof(MMG5_int));
838 for (k=1; k<=
mesh->
ne; k++) {
840 if ( !
MG_EOK(pt) )
continue;
845 for(ib=0 ; ib<6 ; ib++) {
848 lent[ib] = MMG5_lenedg(
mesh,
sol,ib,pt);
849 if ( lent[ib]==0 ) nv--;
853 lenavg /= (double)nv;
862 for (ia=0; ia<6; ia++) {
875 for (l=1; l<lon; l++)
876 if ( list[l] < 6*k )
break;
890 if(ddebug) printf(
"len %e\n",len);
894 lenint = ((int) len);
895 if(fabs(lenint -len) > 0.5) lenint++;
900 dnface = (lenint+2)*(lenint+1) / 2. - 3 - 3*dned;
902 dnint = (lenint+3)*(lenint+2)*(lenint+1) / 6. - 4 - 4*dnface - 6*dned;
908 dnaddloc = dned + lon*(2*dnface/3. + dnint/6.);
917 dnaddloc = dned / lon + 2*dnface/3.;
919 dnaddloc = dned / lon ;
926 dnaddloc = 0.2*dnaddloc;
928 dnaddloc = dnaddloc*0.3 + dnaddloc;
929 else if(len < 6 && len>3)
930 dnaddloc = 0.7*dnaddloc;
935 }
else if(len > 2.8) {
949 }
else if(len > 1.41) {
957 }
else if(len < 0.6) {
961 if(pt->
v[ipa]<pt->
v[ipb]) {
962 if(!pdel[pt->
v[ipa]]) {
964 dnpdelloc = (leninv - 1.)/leninv;
972 }
else if(!pdel[pt->
v[ipb]]) {
974 dnpdelloc = (leninv - 1.)/leninv;
984 if(!pdel[pt->
v[ipb]]) {
986 dnpdelloc = (leninv - 1.)/leninv;
994 }
else if(!pdel[pt->
v[ipa]]) {
996 dnpdelloc = (leninv - 1.)/leninv;
1012 if(ddebug) printf(
"on ajoute %e\n",dnaddloc);
1016 if(ddebug) printf(
"on soustrait %d\n",nedel);
1025 weightelt[k] = 10*w;
1029 nptot += (long) dnadd - (
long) dnpdel;
1031 fprintf(stdout,
" ** ESTIMATION OF THE FINAL NUMBER OF NODES : %ld \n",nptot);
1033 fprintf(stdout,
" ** %lf ADD DEL %lf\n",dnadd,dnpdel);
MMG5_pMesh MMG5_pSol * sol
int MMG5_coquil(MMG5_pMesh mesh, MMG5_int start, int ia, int64_t *list, int8_t *isbdy)
int MMG5_hashNew(MMG5_pMesh mesh, MMG5_Hash *hash, MMG5_int hsiz, MMG5_int hmax)
int MMG5_hashEdge(MMG5_pMesh mesh, MMG5_Hash *hash, MMG5_int a, MMG5_int b, MMG5_int k)
int MMG5_hashPop(MMG5_Hash *hash, MMG5_int a, MMG5_int b)
static double MMG5_caltet_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTetra pt)
static double MMG5_lenedg33_ani(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_iare[6][2]
vertices of extremities of the edges of the tetra
int MMG5_minQualCheck(MMG5_int iel, double minqual, double alpha)
void MMG5_displayLengthHisto(MMG5_pMesh, MMG5_int, double *, MMG5_int, MMG5_int, double, MMG5_int, MMG5_int, double, int, double *, MMG5_int *, int8_t)
double MMG5_orvol(MMG5_pPoint point, MMG5_int *v)
#define MMG5_SAFE_FREE(ptr)
#define MMG5_DEL_MEM(mesh, ptr)
int MMG3D_prilen(MMG5_pMesh mesh, MMG5_pSol met, int8_t metRidTyp)
void MMG3D_computeLESqua(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *ne, double *max, double *avg, double *min, MMG5_int *iel, MMG5_int *good, MMG5_int *med, MMG5_int his[5], int imprim)
int MMG3D_displayQualHisto(MMG5_int ne, double max, double avg, double min, MMG5_int iel, MMG5_int good, MMG5_int med, MMG5_int his[5], MMG5_int nrid, int optimLES, int imprim)
void MMG3D_computeOutqua(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *ne, double *max, double *avg, double *min, MMG5_int *iel, MMG5_int *good, MMG5_int *med, MMG5_int his[5], MMG5_int *nrid, int imprim)
int MMG3D_displayQualHisto_internal(MMG5_int ne, double max, double avg, double min, MMG5_int iel, MMG5_int good, MMG5_int med, MMG5_int his[5], MMG5_int nrid, int optimLES, int imprim)
int MMG3D_computePrilen(MMG5_pMesh mesh, MMG5_pSol met, double *avlen, double *lmin, double *lmax, MMG5_int *ned, MMG5_int *amin, MMG5_int *bmin, MMG5_int *amax, MMG5_int *bmax, MMG5_int *nullEdge, int8_t metRidTyp, double **bd_in, MMG5_int hl[9])
int MMG5_countelt(MMG5_pMesh mesh, MMG5_pSol sol, double *weightelt, long *npcible)
void MMG3D_computeInqua(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *ne, double *max, double *avg, double *min, MMG5_int *iel, MMG5_int *good, MMG5_int *med, MMG5_int his[5], int imprim)
int MMG3D_tetraQual(MMG5_pMesh mesh, MMG5_pSol met, int8_t metRidTyp)
double MMG5_caltet33_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTetra pt)
int MMG3D_outqua(MMG5_pMesh mesh, MMG5_pSol met)
int MMG3D_inqua(MMG5_pMesh mesh, MMG5_pSol met)
Identic as MMG5_HGeom but use MMG5_hedge to store edges instead of MMG5_hgeom (memory economy).
Structure to store points of a MMG mesh.