92 fprintf(stdout,
"-keep-ref preserve initial domain references in level-set mode.\n");
95 fprintf(stdout,
"-rn [n] Turn on or off the renumbering using SCOTCH [0/1] \n");
106 fprintf(stdout,
"\n\n");
115 fprintf(stdout,
"SCOTCH renumbering : enabled\n");
117 fprintf(stdout,
"SCOTCH renumbering : disabled\n");
119 fprintf(stdout,
"\n\n");
132 for ( i=1; i< argc; ++i ) {
133 if ( !strcmp(argv[i],
"-val") ) {
142 if ( *argv[i] ==
'-' ) {
149 if ( !strcmp(argv[i],
"-ar") && ++i < argc ) {
160 if ( !strcmp(argv[i],
"-hmin") && ++i < argc ) {
165 else if ( !strcmp(argv[i],
"-hmax") && ++i < argc ) {
170 else if ( !strcmp(argv[i],
"-hsiz") && ++i < argc ) {
176 else if ( !strcmp(argv[i],
"-hausd") && ++i <= argc ) {
181 else if ( !strcmp(argv[i],
"-hgradreq") && ++i <= argc ) {
186 else if ( !strcmp(argv[i],
"-hgrad") && ++i <= argc ) {
197 if ( !strcmp(argv[i],
"-default") ) {
206 if ( !strcmp(argv[i],
"-in") ) {
207 if ( ++i < argc && isascii(argv[i][0]) && argv[i][0]!=
'-') {
214 fprintf(stderr,
"Missing filname for %c%c\n",argv[i-1][1],argv[i-1][2]);
219 else if ( !strcmp(argv[i],
"-isoref") && ++i <= argc ) {
230 if ( !strcmp(argv[i],
"-keep-ref") ) {
236 if ( !strcmp(argv[i],
"-ls") ) {
239 if ( ++i < argc && (isdigit(argv[i][0]) ||
240 (argv[i][0]==
'-' && isdigit(argv[i][1])) ) ) {
246 else if ( !strcmp(argv[i],
"-lssurf") ) {
249 if ( ++i < argc && (isdigit(argv[i][0]) ||
250 (argv[i][0]==
'-' && isdigit(argv[i][1])) ) ) {
258 if ( !strcmp(argv[i],
"-met") ) {
260 fprintf(stderr,
"No metric structure allocated for %c%c%c option\n",
261 argv[i-1][1],argv[i-1][2],argv[i-1][3]);
264 if ( ++i < argc && isascii(argv[i][0]) && argv[i][0]!=
'-' ) {
269 fprintf(stderr,
"Missing filname for %c%c%c\n",argv[i-1][1],argv[i-1][2],argv[i-1][3]);
274 else if (!strcmp(argv[i],
"-m") ) {
275 if ( ++i < argc && isdigit(argv[i][0]) ) {
280 fprintf(stderr,
"Missing argument option %c\n",argv[i-1][1]);
287 if ( !strcmp(argv[i],
"-nr") ) {
291 else if ( !strcmp(argv[i],
"-nsd") ) {
292 if ( ++i < argc && isdigit(argv[i][0]) ) {
297 fprintf(stderr,
"Missing argument option %c\n",argv[i-1][1]);
302 else if ( !strcmp(argv[i],
"-noswap") ) {
306 else if( !strcmp(argv[i],
"-noinsert") ) {
310 else if( !strcmp(argv[i],
"-nomove") ) {
314 else if ( !strcmp(argv[i],
"-nreg") ) {
318 else if( !strcmp(argv[i],
"-nosizreq") ) {
325 if ( (!strcmp(argv[i],
"-out")) || (!strcmp(argv[i],
"-o")) ) {
326 if ( ++i < argc && isascii(argv[i][0]) && argv[i][0]!=
'-') {
330 fprintf(stderr,
"Missing filname for %c%c%c\n",
331 argv[i-1][1],argv[i-1][2],argv[i-1][3]);
336 else if( !strcmp(argv[i],
"-optim") ) {
341 fprintf(stderr,
"Unrecognized option %s\n",argv[i]);
347 if ( !strcmp(argv[i],
"-rmc") ) {
350 if ( ++i < argc && (isdigit(argv[i][0]) ) ) {
357 else if ( !strcmp(argv[i],
"-rn") ) {
359 if ( isdigit(argv[i][0]) ) {
364 fprintf(stderr,
"Missing argument option %s\n",argv[i-1]);
370 fprintf(stderr,
"Missing argument option %s\n",argv[i-1]);
377 fprintf(stderr,
"Unrecognized option %s\n",argv[i]);
383 if ( !strcmp(argv[i],
"-sol") ) {
387 if ( ++i < argc && isascii(argv[i][0]) && argv[i][0]!=
'-' ) {
392 fprintf(stderr,
"Missing filname for %c%c%c\n",argv[i-1][1],argv[i-1][2],argv[i-1][3]);
400 if ( argv[i][0] ==
'-' || isdigit(argv[i][0]) ) {
408 fprintf(stderr,
"Missing argument option %c\n",argv[i-1][1]);
414 if ( !strcmp(argv[i],
"-xreg") ) {
420 fprintf(stderr,
"Unrecognized option %s\n",argv[i]);
439 fprintf(stdout,
"Argument %s ignored\n",argv[i]);
449 fprintf(stdout,
"\n -- PRINT (0 10(advised) -10) ?\n");
457 fprintf(stdout,
" -- INPUT MESH NAME ?\n");
480 if (
tmp->namein == NULL ) {
520 MMG5_int *adja,k,j,iel;
528 fprintf(stderr,
"\n ## Error: %s: unable to create "
529 "adjacency table.\n",__func__);
535 for ( k=1; k<=
mesh->
nt; k++ ) {
537 if ( !
MG_EOK(pt) )
continue;
541 for ( i=0; i<3; i++ ) {
550 if ( (!iel) || (pt->
ref != pt1->
ref) ) {
564 printf(
" Exit program.\n");
567 MMG5_Edge,
"non bdy edges arrray",
return 0);
571 printf(
" Exit program.\n");
574 MMG5_Edge,
"non bdy edges arrray",
return 0);
578 for ( k=1; k<=
mesh->
nt; k++ ) {
580 if ( !
MG_EOK(pt) )
continue;
584 for ( i=0; i<3; i++ ) {
595 if ( (!iel) || (pt->
ref != pt1->
ref) ) {
619 fprintf(stderr,
"\n ## Error: %s: edge array is not allocated.\n"
620 " Please, call the MMGS_Get_numberOfNonBdyEdges function"
621 " before the %s one.\n",
626 ptr_c = ptr_c-
sizeof(size_t);
627 na_tot = *((
size_t*)ptr_c);
630 fprintf(stderr,
"\n ## Error: %s: no internal edge.\n"
631 " Please, call the MMGS_Get_numberOfNonBdyEdges function"
632 " before the %s one and check that the number of internal"
633 " edges is non null.\n",
637 if ( (
size_t)
mesh->
namax+idx > na_tot ) {
638 fprintf(stderr,
"\n ## Error: %s: Can't get the internal edge of index %" MMG5_PRId
"."
639 " Index must be between 1 and %zu.\n",
640 __func__,idx,na_tot-(
size_t)
mesh->
namax);
662 listri[0] =
mesh->
adja[3*(kel-1)+1]/3;
663 listri[1] =
mesh->
adja[3*(kel-1)+2]/3;
664 listri[2] =
mesh->
adja[3*(kel-1)+3]/3;
672 MMG5_int k,prevk,*adja;
673 int i,i1,i2,iploc,nbpoi;
677 for ( iploc=0; iploc<3; ++iploc ) {
678 if ( pt->
v[iploc] == ip )
break;
688 fprintf(stderr,
"\n ## Warning: %s: unable to compute adjacent"
689 " vertices of the vertex %" MMG5_PRId
":\nthe ball of point contain too many"
690 " elements.\n",__func__,ip);
703 while ( k && k != start );
705 if ( k > 0 )
return nbpoi;
709 fprintf(stderr,
"\n ## Warning: %s: unable to compute adjacent vertices of the"
710 " vertex %" MMG5_PRId
":\nthe ball of point contain too many elements.\n",
728 fprintf(stderr,
"\n ## Warning: %s: unable to compute adjacent vertices of the"
729 " vertex %" MMG5_PRId
":\nthe ball of point contain too many elements.\n",
766 for (k=1; k<=
mesh->
np; k++) {
771 for (k=1; k<=
mesh->
nt; k++) {
773 if ( !
MG_EOK(ptt) )
continue;
775 for (i=0; i<3; i++) {
818 if ( met->
size!=1 ) {
819 fprintf(stderr,
"\n ## Error: %s: unexpected size of metric: %d.\n",
830 for (k=1; k<=
mesh->
nt; k++) {
832 if ( !
MG_EOK(ptt) )
continue;
834 for (i=0; i<3; i++) {
840 ux = p1->
c[0] - p2->
c[0];
841 uy = p1->
c[1] - p2->
c[1];
842 uz = p1->
c[2] - p2->
c[2];
843 dd = sqrt(ux*ux + uy*uy + uz*uz);
853 for (k=1; k<=
mesh->
np; k++) {
858 met->
m[k] = met->
m[k] / (double)mark[k];
893 fprintf(stderr,
"\n ## Error: %s: unable to compute ball of point.\n",
905 for ( j=0; j<6; ++j ) {
909 for ( j=0; j<ilist; ++j ) {
912 MMG5_int iel = list[j] / 3;
913 int8_t i1 = list[j] % 3;
919 u[0] = p1->
c[0] - p2->
c[0];
920 u[1] = p1->
c[1] - p2->
c[1];
921 u[2] = p1->
c[2] - p2->
c[2];
939 for ( j=0; j<6; ++j ) {
940 if ( !isfinite(tensordot[j]) ) {
948 double lambda[3],vp[3][3];
952 else if ( (!isfinite(lambda[0])) || (!isfinite(lambda[1])) || (!isfinite(lambda[2])) ) {
955 else if ( lambda[0]<=0 || lambda[1]<=0 || lambda[2]<=0 ) {
971 double dd = (double)ilist/3.;
972 for ( j=0; j<6; ++j ) {
973 m[j] = dd*tensordot[j];
997 int ilist,
double r[3][3],
double *lispoi,
double n[3]) {
1001 MMG5_int *adja,kold;
1017 j = (int)adja[i1] % 3;
1023 while ( iel && iel != k );
1036 ux = p2->
c[0] - p0->
c[0];
1037 uy = p2->
c[1] - p0->
c[1];
1038 uz = p2->
c[2] - p0->
c[2];
1040 lispoi[3*idx+1] = r[0][0]*ux + r[0][1]*uy + r[0][2]*uz;
1041 lispoi[3*idx+2] = r[1][0]*ux + r[1][1]*uy + r[1][2]*uz;
1042 lispoi[3*idx+3] = r[2][0]*ux + r[2][1]*uy + r[2][2]*uz;
1045 j = (int)adja[i1] % 3;
1057 ux = p2->
c[0] - p0->
c[0];
1058 uy = p2->
c[1] - p0->
c[1];
1059 uz = p2->
c[2] - p0->
c[2];
1061 lispoi[3*idx+1] = r[0][0]*ux + r[0][1]*uy + r[0][2]*uz;
1062 lispoi[3*idx+2] = r[1][0]*ux + r[1][1]*uy + r[1][2]*uz;
1063 lispoi[3*idx+3] = r[2][0]*ux + r[2][1]*uy + r[2][2]*uz;
1065 assert ( idx == ilist );
1068 for (j=0; j<ilist; j++) {
1069 double area = lispoi[3*j+1]*lispoi[3*(j+1)+2] - lispoi[3*j+2]*lispoi[3*(j+1)+1];
1070 if ( area <= 0.0 ) {
1071 fprintf(stderr,
"\n ## Error: %s: unable to compute ball rotation.\n",
1095 double *m,
double isqhmax) {
1097 double r[3][3],lispoi[3*
MMGS_LMAX+1],b0[3],b1[3],b2[3],dd;
1108 fprintf(stderr,
"\n ## Error: %s: unable to compute ball of point.\n",
1120 double nn[3] = {0.,0.,0.};
1124 for ( j=0; j<ilist; ++j ) {
1129 nn[0] += n[0]; nn[1] += n[1]; nn[2] += n[2];
1132 dd = nn[0]*nn[0] + nn[1]*nn[1] + nn[2]*nn[2];
1134 dd = 1.0 / sqrt(dd);
1142 fprintf(stderr,
"\n ## Error: %s: we should not pass here with a "
1143 "non-manifold point: it sould always be posible to compute the 3D"
1144 " unit tensor on such points.\n",
1156 dd = nn[0]*nn[0] + nn[1]*nn[1] + nn[2]*nn[2];
1158 dd = 1.0 / sqrt(dd);
1173 nn[0] = p1->
n[0]; nn[1] = p1->
n[1]; nn[2] = p1->
n[2];
1180 fprintf(stderr,
"\n ## Error: %s: unable to compute opened ball rotation.\n",
1187 fprintf(stderr,
"\n ## Error: %s: unable to compute ball rotation.\n",
1194 double tensordot[3];
1199 for ( j=0; j<ilist; ++j ) {
1202 tensordot[0] += lispoi[3*j+1]*lispoi[3*j+1];
1203 tensordot[1] += lispoi[3*j+1]*lispoi[3*j+2];
1204 tensordot[2] += lispoi[3*j+2]*lispoi[3*j+2];
1208 dd = 1./(tensordot[0]*tensordot[2] - tensordot[1]*tensordot[1]);
1209 dd *= (double)ilist/2.;
1211 double tmp = tensordot[0];
1213 tensordot[0] = dd*tensordot[2];
1214 tensordot[1] = -dd*tensordot[1];
1215 tensordot[2] = dd*
tmp;
1219 double lambda[2],vp[2][2];
1222 assert (lambda[0] > 0. && lambda[1] > 0. &&
"Negative eigenvalue");
1226 assert (isfinite(lambda[0]) && isfinite(lambda[1]) &&
"wrong eigenvalue");
1242 b0[0] = tensordot[0]*r[0][0] + tensordot[1]*r[1][0];
1243 b0[1] = tensordot[0]*r[0][1] + tensordot[1]*r[1][1];
1244 b0[2] = tensordot[0]*r[0][2] + tensordot[1]*r[1][2];
1245 b1[0] = tensordot[1]*r[0][0] + tensordot[2]*r[1][0];
1246 b1[1] = tensordot[1]*r[0][1] + tensordot[2]*r[1][1];
1247 b1[2] = tensordot[1]*r[0][2] + tensordot[2]*r[1][2];
1249 b2[0] = isqhmax*r[2][0];
1250 b2[1] = isqhmax*r[2][1];
1251 b2[2] = isqhmax*r[2][2];
1253 m[0] = r[0][0] * b0[0] + r[1][0] * b1[0] + r[2][0] * b2[0];
1254 m[1] = r[0][0] * b0[1] + r[1][0] * b1[1] + r[2][0] * b2[1];
1255 m[2] = r[0][0] * b0[2] + r[1][0] * b1[2] + r[2][0] * b2[2];
1257 m[3] = r[0][1] * b0[1] + r[1][1] * b1[1] + r[2][1] * b2[1];
1258 m[4] = r[0][1] * b0[2] + r[1][1] * b1[2] + r[2][1] * b2[2];
1260 m[5] = r[0][2] * b0[2] + r[1][2] * b1[2] + r[2][2] * b2[2];
1283 double *m,tensordot[6];
1288 if ( met->
size!=6 ) {
1289 fprintf(stderr,
"\n ## Error: %s: unexpected size of metric: %d.\n",
1290 __func__,met->
size);
1296 fprintf(stderr,
"\n ## Error: %s: unable to allocate metric.\n",
1305 for (k=1; k<=
mesh->
np; k++) {
1321 for (k=1; k<=
mesh->
nt; k++) {
1323 if ( !
MG_EOK(ptt) )
continue;
1325 for (i=0; i<3; i++) {
1336 u[0] = p1->
c[0] - p2->
c[0];
1337 u[1] = p1->
c[1] - p2->
c[1];
1338 u[2] = p1->
c[2] - p2->
c[2];
1340 tensordot[0] = u[0]*u[0];
1341 tensordot[1] = u[0]*u[1];
1342 tensordot[2] = u[0]*u[2];
1343 tensordot[3] = u[1]*u[1];
1344 tensordot[4] = u[1]*u[2];
1345 tensordot[5] = u[2]*u[2];
1349 for ( j=0; j<6; ++j ) {
1350 met->
m[iadr+j] += tensordot[j];
1357 for ( j=0; j<6; ++j ) {
1358 met->
m[iadr+j] += tensordot[j];
1365 for (k=1; k<=
mesh->
np; k++) {
1380 fprintf(stdout,
" ## Warning: %s: %d: non invertible matrix."
1381 " Impose hmax size at point\n",__func__,__LINE__);
1382 met->
m[iadr+0] = isqhmax;
1384 met->
m[iadr+3] = isqhmax;
1386 met->
m[iadr+5] = isqhmax;
1390 double dd = (double)mark[k]/3.;
1392 for ( j=0; j<6; ++j ) {
1393 met->
m[iadr+j] = dd*tensordot[j];
1404 for (k=1; k<=
mesh->
nt; k++) {
1406 if ( !
MG_EOK(ptt) )
continue;
1408 for (i=0; i<3; i++) {
1434 fprintf(stderr,
"\n ## Error: %s: unable to compute anisotropic unit"
1435 " tensor at corner point %"MMG5_PRId
".\n",__func__,
MMGS_indPt(
mesh,ip));
1444 fprintf(stderr,
"\n ## Error: %s: unable to compute anisotropic unit"
1445 " tensor at required point %"MMG5_PRId
".\n",__func__,
MMGS_indPt(
mesh,ip));
1462 fprintf(stderr,
"\n ## Error: %s: unable to compute anisotropic unit"
1463 " tensor at ridge point %"MMG5_PRId
".\n",__func__,
1475 fprintf(stderr,
"\n ## Error: %s: unable to compute anisotropic unit"
1476 " tensor at required point %"MMG5_PRId
".\n",__func__,
1483 double lambda[3],vp[3][3];
1485 fprintf(stdout,
" ## Warning: %s: %d: non diagonalizable metric.",
1489 assert ( lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.
1490 &&
"Negative eigenvalue" );
1491 assert ( isfinite(lambda[0]) && isfinite(lambda[1]) && isfinite(lambda[2])
1492 &&
"Infinite eigenvalue" );
1498 for (k=1; k<=
mesh->
np; k++) {
1506 double lambda[3],vp[3][3];
1508 fprintf(stdout,
" ## Warning: %s: %d: non diagonalizable metric.",
1512 assert ( lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.
1513 &&
"Negative eigenvalue" );
1514 assert ( isfinite(lambda[0]) && isfinite(lambda[1]) && isfinite(lambda[2])
1515 &&
"Infinite eigenvalue" );
int MMG5_Compute_constantSize(MMG5_pMesh mesh, MMG5_pSol met, double *hsiz)
void MMG5_Set_constantSize(MMG5_pMesh mesh, MMG5_pSol met, double hsiz)
int MMGS_Set_iparameter(MMG5_pMesh mesh, MMG5_pSol sol, int iparam, MMG5_int val)
int MMGS_Set_inputMeshName(MMG5_pMesh mesh, const char *meshin)
int MMGS_Set_inputSolName(MMG5_pMesh mesh, MMG5_pSol sol, const char *solin)
int MMGS_Set_solSize(MMG5_pMesh mesh, MMG5_pSol sol, int typEntity, MMG5_int np, int typSol)
int MMGS_Set_outputMeshName(MMG5_pMesh mesh, const char *meshout)
int MMGS_Set_dparameter(MMG5_pMesh mesh, MMG5_pSol sol, int dparam, double val)
int MMGS_Set_outputSolName(MMG5_pMesh mesh, MMG5_pSol sol, const char *solout)
MMG5_pMesh MMG5_pSol * sol
if(!ier) exit(EXIT_FAILURE)
int movintpt_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *list, int ilist)
int movridpt_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *list, int ilist)
int MMG5_gradsizreq_ani(MMG5_pMesh mesh, MMG5_pSol met)
int MMG5_compute_meanMetricAtMarkedPoints_ani(MMG5_pMesh mesh, MMG5_pSol met)
int MMGS_gradsiz_ani(MMG5_pMesh mesh, MMG5_pSol met)
int MMGS_defsiz_ani(MMG5_pMesh mesh, MMG5_pSol met)
int MMGS_surfballRotation(MMG5_pMesh mesh, MMG5_pPoint p0, MMG5_int *list, int ilist, double r[3][3], double *lispoi, double n[3])
int MMG5_boulet(MMG5_pMesh mesh, MMG5_int start, int ip, MMG5_int *list, int8_t s, int8_t *opn)
int MMG5_eigensym(double m[3], double lambda[2], double vp[2][2])
int MMG5_eigenv3d(int symmat, double *mat, double lambda[3], double v[3][3])
Find eigenvalues and vectors of a 3x3 matrix.
int MMGS_hashTria(MMG5_pMesh mesh)
static double MMG5_lenSurfEdg_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int ip1, MMG5_int ip2, int8_t isedg)
static double MMG5_lenSurfEdg_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int np0, MMG5_int np1, int8_t isedg)
int intmet_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int k, int8_t i, MMG5_int ip, double s)
int intmet_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int k, int8_t i, MMG5_int ip, double s)
int MMG5_gradsiz_iso(MMG5_pMesh mesh, MMG5_pSol met)
int MMG5_compute_meanMetricAtMarkedPoints_iso(MMG5_pMesh mesh, MMG5_pSol met)
int MMG5_gradsizreq_iso(MMG5_pMesh mesh, MMG5_pSol met)
int MMGS_defsiz_iso(MMG5_pMesh mesh, MMG5_pSol met)
LIBMMG_CORE_EXPORT int MMG5_Clean_isoEdges(MMG5_pMesh mesh)
API headers for the mmgs library.
LIBMMGS_EXPORT int(* MMGS_doSol)(MMG5_pMesh mesh, MMG5_pSol met)
@ MMGS_IPARAM_numsubdomain
@ MMGS_DPARAM_angleDetection
int movridpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *list, int ilist)
int movintpt_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int *list, int ilist)
int MMGS_memOption(MMG5_pMesh mesh)
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
int MMG5_3dSolTruncature_ani(MMG5_pMesh mesh, MMG5_pSol met)
double MMG5_caltri_ani(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria ptt)
#define MMG5_ADD_MEM(mesh, size, message, law)
static const uint8_t MMG5_iprv2[3]
static const uint8_t MMG5_inxt2[6]
int MMG5_solTruncature_iso(MMG5_pMesh mesh, MMG5_pSol met)
int MMG5_nortri(MMG5_pMesh mesh, MMG5_pTria pt, double *n)
int MMG5_rotmatrix(double n[3], double r[3][3])
#define MMG5_FILESTR_LGTH
double MMG5_caltri_iso(MMG5_pMesh mesh, MMG5_pSol met, MMG5_pTria ptt)
#define MMG5_SAFE_FREE(ptr)
#define MMG_FSCANF(stream, format,...)
#define MMG5_DEL_MEM(mesh, ptr)
int MMG5_invmat(double *m, double *mi)
#define MMG5_SAFE_RECALLOC(ptr, prevSize, newSize, type, message, law)
Structure to store edges of a MMG mesh.
Store input parameters of the run.
Structure to store points of a MMG mesh.