From 3bd5e54619d1dd2ef936070f8e55332f1c2b6962 Mon Sep 17 00:00:00 2001 From: Corentin Prigent Date: Tue, 20 Jan 2026 16:56:00 +0100 Subject: [PATCH 1/4] added check of positive eigenvalues of input metric in 2D --- src/mmg2d/inout_2d.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/mmg2d/inout_2d.c b/src/mmg2d/inout_2d.c index 685264ef6..8ad3f048d 100644 --- a/src/mmg2d/inout_2d.c +++ b/src/mmg2d/inout_2d.c @@ -978,6 +978,21 @@ int MMG2D_loadSol(MMG5_pMesh mesh,MMG5_pSol sol,const char *filename) { fclose(inm); + /* For anisotropic metric, check that eigenvalues are stricly positive*/ + if ( sol->size == 3 ) { + for (k=1; k<=sol->np; k++) { + double lambda[2],vp[2][2]; + MMG5_eigensym(sol->m+3*k,lambda,vp); + + if (!(lambda[0] > 0. && lambda[1] > 0.)) { + fprintf(stderr, " ## Error: At least one negative eigenvalue in" + " provided metric file : %lf %lf \n", lambda[0], + lambda[1]); + return -1; + } + } + } + /* stats */ MMG5_printMetStats(mesh,sol); @@ -1092,6 +1107,24 @@ int MMG2D_loadAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) { } fclose(inm); + /* For anisotropic metric, check that eigenvalues are stricly positive*/ + for ( j=0; jsize == 3 ) { + for ( k=1; k<=psl->np; k++ ) { + double lambda[2],vp[2][2]; + MMG5_eigensym(psl->m+3*k,lambda,vp); + + if (!(lambda[0] > 0. && lambda[1] > 0.)) { + fprintf(stderr, " ## Error: At least one negative eigenvalue in" + " provided metric file : %lf %lf \n", lambda[0], + lambda[1]); + return -1; + } + } + } + } + /* stats */ MMG5_printSolStats(mesh,sol); From 3c0e183e5e2c0291db234d8af606eba6ed8a6992 Mon Sep 17 00:00:00 2001 From: Corentin Prigent Date: Tue, 20 Jan 2026 17:43:11 +0100 Subject: [PATCH 2/4] added check of positive eigenvalues of input metric in 3d and S --- src/mmg3d/inout_3d.c | 33 +++++++++++++++++++++++++++++++++ src/mmgs/inout_s.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/mmg3d/inout_3d.c b/src/mmg3d/inout_3d.c index 84701a8b8..f16569f6a 100644 --- a/src/mmg3d/inout_3d.c +++ b/src/mmg3d/inout_3d.c @@ -2207,6 +2207,21 @@ int MMG3D_loadSol(MMG5_pMesh mesh,MMG5_pSol met, const char *filename) { fclose(inm); + /* For anisotropic metric, check that eigenvalues are stricly positive*/ + if ( met->size == 3 ) { + for (k=1; k<=met->np; k++) { + double lambda[3],vp[3][3]; + MMG5_eigenv3d(1,met->m+6*k,lambda,vp); + + if (!(lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.)) { + fprintf(stderr, " ## Error: At least one negative eigenvalue in" + " provided metric file : %lf %lf %lf \n", lambda[0], + lambda[1], lambda[2]); + return -1; + } + } + } + /* stats */ MMG5_printMetStats(mesh,met); @@ -2305,6 +2320,24 @@ int MMG3D_loadAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) { } fclose(inm); + /* For anisotropic metric, check that eigenvalues are stricly positive*/ + for ( j=0; jsize == 3 ) { + for (k=1; k<=psl->np; k++) { + double lambda[3],vp[3][3]; + MMG5_eigenv3d(1,psl->m+6*k,lambda,vp); + + if (!(lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.)) { + fprintf(stderr, " ## Error: At least one negative eigenvalue in" + " provided metric file : %lf %lf %lf \n", lambda[0], + lambda[1], lambda[2]); + return -1; + } + } + } + } + /* stats */ MMG5_printSolStats(mesh,sol); diff --git a/src/mmgs/inout_s.c b/src/mmgs/inout_s.c index 222717b6b..efd280457 100644 --- a/src/mmgs/inout_s.c +++ b/src/mmgs/inout_s.c @@ -1378,6 +1378,21 @@ int MMGS_loadSol(MMG5_pMesh mesh,MMG5_pSol met,const char* filename) { fclose(inm); + /* For anisotropic metric, check that eigenvalues are stricly positive*/ + if ( met->size == 3 ) { + for (k=1; k<=met->np; k++) { + double lambda[3],vp[3][3]; + MMG5_eigenv3d(1,met->m+6*k,lambda,vp); + + if (!(lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.)) { + fprintf(stderr, " ## Error: At least one negative eigenvalue in" + " provided metric file : %lf %lf %lf \n", lambda[0], + lambda[1], lambda[2]); + return -1; + } + } + } + /* stats */ MMG5_printMetStats(mesh,met); @@ -1474,6 +1489,24 @@ int MMGS_loadAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) { } fclose(inm); + /* For anisotropic metric, check that eigenvalues are stricly positive*/ + for ( j=0; jsize == 3 ) { + for (k=1; k<=psl->np; k++) { + double lambda[3],vp[3][3]; + MMG5_eigenv3d(1,psl->m+6*k,lambda,vp); + + if (!(lambda[0] > 0. && lambda[1] > 0. && lambda[2] > 0.)) { + fprintf(stderr, " ## Error: At least one negative eigenvalue in" + " provided metric file : %lf %lf %lf \n", lambda[0], + lambda[1], lambda[2]); + return -1; + } + } + } + } + /* stats */ MMG5_printSolStats(mesh,sol); From 91f792bb5eec90b94b4dc4ff47fad54463998277 Mon Sep 17 00:00:00 2001 From: Corentin Prigent Date: Wed, 21 Jan 2026 13:39:15 +0100 Subject: [PATCH 3/4] correction of size check --- src/mmg3d/inout_3d.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mmg3d/inout_3d.c b/src/mmg3d/inout_3d.c index f16569f6a..3c43de617 100644 --- a/src/mmg3d/inout_3d.c +++ b/src/mmg3d/inout_3d.c @@ -2208,7 +2208,7 @@ int MMG3D_loadSol(MMG5_pMesh mesh,MMG5_pSol met, const char *filename) { fclose(inm); /* For anisotropic metric, check that eigenvalues are stricly positive*/ - if ( met->size == 3 ) { + if ( met->size == 6 ) { for (k=1; k<=met->np; k++) { double lambda[3],vp[3][3]; MMG5_eigenv3d(1,met->m+6*k,lambda,vp); @@ -2323,7 +2323,7 @@ int MMG3D_loadAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) { /* For anisotropic metric, check that eigenvalues are stricly positive*/ for ( j=0; jsize == 3 ) { + if ( psl->size == 6 ) { for (k=1; k<=psl->np; k++) { double lambda[3],vp[3][3]; MMG5_eigenv3d(1,psl->m+6*k,lambda,vp); From 60bd5da660525b8e4a5ca79f1458991417c1d4fc Mon Sep 17 00:00:00 2001 From: Corentin Prigent Date: Wed, 21 Jan 2026 13:54:12 +0100 Subject: [PATCH 4/4] correction of size check in mmgs --- src/mmgs/inout_s.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mmgs/inout_s.c b/src/mmgs/inout_s.c index efd280457..abfbeef4c 100644 --- a/src/mmgs/inout_s.c +++ b/src/mmgs/inout_s.c @@ -1379,7 +1379,7 @@ int MMGS_loadSol(MMG5_pMesh mesh,MMG5_pSol met,const char* filename) { fclose(inm); /* For anisotropic metric, check that eigenvalues are stricly positive*/ - if ( met->size == 3 ) { + if ( met->size == 6 ) { for (k=1; k<=met->np; k++) { double lambda[3],vp[3][3]; MMG5_eigenv3d(1,met->m+6*k,lambda,vp); @@ -1492,7 +1492,7 @@ int MMGS_loadAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) { /* For anisotropic metric, check that eigenvalues are stricly positive*/ for ( j=0; jsize == 3 ) { + if ( psl->size == 6 ) { for (k=1; k<=psl->np; k++) { double lambda[3],vp[3][3]; MMG5_eigenv3d(1,psl->m+6*k,lambda,vp);