Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions cmake/testing/code/binary-multisols.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/**
* Test binary multi-solution round-trips through the public API.
*/

#include <stdio.h>
#include <stdlib.h>

#if defined(MMG_MULTISOL_2D)
#include "mmg/mmg2d/libmmg2d.h"
#define API(name) MMG2D_##name
#elif defined(MMG_MULTISOL_3D)
#include "mmg/mmg3d/libmmg3d.h"
#define API(name) MMG3D_##name
#elif defined(MMG_MULTISOL_S)
#include "mmg/mmgs/libmmgs.h"
#define API(name) MMGS_##name
#else
#error "An MMG_MULTISOL_* test target must be selected"
#endif

static int set_mesh(MMG5_pMesh mesh) {
#if defined(MMG_MULTISOL_2D)
if ( API(Set_meshSize)(mesh,4,2,0,0) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,0.0,0,1) != 1 ) return 0;
if ( API(Set_vertex)(mesh,1.0,0.0,0,2) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,1.0,0,3) != 1 ) return 0;
if ( API(Set_vertex)(mesh,1.0,1.0,0,4) != 1 ) return 0;
if ( API(Set_triangle)(mesh,1,2,3,0,1) != 1 ) return 0;
if ( API(Set_triangle)(mesh,2,4,3,0,2) != 1 ) return 0;
#elif defined(MMG_MULTISOL_3D)
if ( API(Set_meshSize)(mesh,4,1,0,0,0,0) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,0.0,0.0,0,1) != 1 ) return 0;
if ( API(Set_vertex)(mesh,1.0,0.0,0.0,0,2) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,1.0,0.0,0,3) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,0.0,1.0,0,4) != 1 ) return 0;
if ( API(Set_tetrahedron)(mesh,1,2,3,4,0,1) != 1 ) return 0;
#else
if ( API(Set_meshSize)(mesh,4,2,0) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,0.0,0.0,0,1) != 1 ) return 0;
if ( API(Set_vertex)(mesh,1.0,0.0,0.0,0,2) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,1.0,0.0,0,3) != 1 ) return 0;
if ( API(Set_vertex)(mesh,0.0,0.0,1.0,0,4) != 1 ) return 0;
if ( API(Set_triangle)(mesh,1,2,3,0,1) != 1 ) return 0;
if ( API(Set_triangle)(mesh,1,2,4,0,2) != 1 ) return 0;
#endif
return 1;
}

static int same_values(const double *actual,const double *expected) {
int i;

for ( i=0; i<4; ++i ) {
if ( actual[i] != expected[i] ) return 0;
}
return 1;
}

int main(int argc,char **argv) {
MMG5_pMesh mesh;
MMG5_pSol met,written,loaded;
MMG5_int np;
double first[4] = {1.0,2.0,3.0,4.0};
double second[4] = {5.0,6.0,7.0,8.0};
double actual[4];
int nsols,status,types[2],loaded_types[MMG5_NSOLS_MAX];

if ( argc != 2 ) {
fprintf(stderr,"Usage: %s output.solb\n",argv[0]);
return EXIT_FAILURE;
}

mesh = NULL;
met = written = loaded = NULL;
status = EXIT_FAILURE;
types[0] = types[1] = MMG5_Scalar;

if ( API(Init_mesh)(MMG5_ARG_start,MMG5_ARG_ppMesh,&mesh,
MMG5_ARG_ppMet,&met,MMG5_ARG_end) != 1 ) goto cleanup;
if ( !set_mesh(mesh) ) goto cleanup;
if ( API(Set_solsAtVerticesSize)(mesh,&written,2,4,types) != 1 )
goto cleanup;
if ( API(Set_ithSols_inSolsAtVertices)(written,1,first) != 1 )
goto cleanup;
if ( API(Set_ithSols_inSolsAtVertices)(written,2,second) != 1 )
goto cleanup;
if ( API(saveAllSols)(mesh,&written,argv[1]) != 1 ) goto cleanup;
if ( API(loadAllSols)(mesh,&loaded,argv[1]) != 1 ) goto cleanup;
if ( API(Get_solsAtVerticesSize)(mesh,&loaded,&nsols,&np,loaded_types) != 1 )
goto cleanup;
if ( nsols != 2 || np != 4 || loaded_types[0] != MMG5_Scalar ||
loaded_types[1] != MMG5_Scalar ) goto cleanup;
if ( API(Get_ithSols_inSolsAtVertices)(loaded,1,actual) != 1 )
goto cleanup;
if ( !same_values(actual,first) ) goto cleanup;
if ( API(Get_ithSols_inSolsAtVertices)(loaded,2,actual) != 1 )
goto cleanup;
if ( !same_values(actual,second) ) goto cleanup;

status = EXIT_SUCCESS;

cleanup:
if ( loaded ) API(Free_allSols)(mesh,&loaded);
if ( written ) API(Free_allSols)(mesh,&written);
API(Free_all)(MMG5_ARG_start,MMG5_ARG_ppMesh,&mesh,
MMG5_ARG_ppMet,&met,MMG5_ARG_end);
return status;
}
9 changes: 9 additions & 0 deletions cmake/testing/libmmg2d_tests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ SET ( MMG2D_LIB_TESTS
libmmg2d_lsAndMetric_optim
libmmg2d_lsAndMetric_hsiz
libmmg2d_lsAndMetric
test_mmg2d_binary_multisols
)

# Additional tests that needs to download ci meshes
Expand All @@ -60,6 +61,7 @@ SET ( MMG2D_LIB_TESTS_MAIN_PATH
${PROJECT_SOURCE_DIR}/libexamples/mmg2d/IsosurfDiscretization_lsAndMetric/main_optim.c
${PROJECT_SOURCE_DIR}/libexamples/mmg2d/IsosurfDiscretization_lsAndMetric/main_hsiz.c
${PROJECT_SOURCE_DIR}/libexamples/mmg2d/IsosurfDiscretization_lsAndMetric/main.c
${PROJECT_SOURCE_DIR}/cmake/testing/code/binary-multisols.c
)

# Additional tests that needs to download ci meshes
Expand Down Expand Up @@ -141,6 +143,9 @@ FOREACH ( test_idx RANGE ${nbTests} )

ENDFOREACH ( )

TARGET_COMPILE_DEFINITIONS ( test_mmg2d_binary_multisols
PRIVATE MMG_MULTISOL_2D )

SET ( src_test_met2d
${PROJECT_SOURCE_DIR}/src/common/bezier.c
${PROJECT_SOURCE_DIR}/src/common/eigenv.c
Expand Down Expand Up @@ -195,6 +200,10 @@ ADD_TEST(NAME libmmg2d_ls0_io_1
"${PROJECT_SOURCE_DIR}/libexamples/mmg2d/io_multisols_example0/naca-multiSols.mesh"
"${CTEST_OUTPUT_DIR}/libmmg2d_io_0-naca.o" "1"
)
ADD_TEST(NAME test_mmg2d_binary_multisols
COMMAND ${EXECUTABLE_OUTPUT_PATH}/test_mmg2d_binary_multisols
"${CTEST_OUTPUT_DIR}/test_mmg2d_binary_multisols.solb"
)
ADD_TEST(NAME libmmg2d_lsOnly
COMMAND ${EXECUTABLE_OUTPUT_PATH}/libmmg2d_lsOnly
"${PROJECT_SOURCE_DIR}/libexamples/mmg2d/IsosurfDiscretization_lsOnly/multi-mat.mesh"
Expand Down
9 changes: 9 additions & 0 deletions cmake/testing/libmmg3d_tests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ SET ( MMG3D_LIB_TESTS
libmmg3d_lsAndMetric_hsiz
libmmg3d_lsAndMetric
libmmg3d_generic_io
test_mmg3d_binary_multisols
)

# Additional tests that needs to download ci meshes
Expand Down Expand Up @@ -71,6 +72,7 @@ SET ( MMG3D_LIB_TESTS_MAIN_PATH
${PROJECT_SOURCE_DIR}/libexamples/mmg3d/IsosurfDiscretization_lsAndMetric/main_hsiz.c
${PROJECT_SOURCE_DIR}/libexamples/mmg3d/IsosurfDiscretization_lsAndMetric/main.c
${PROJECT_SOURCE_DIR}/libexamples/mmg3d/io_generic_and_get_adja/genericIO.c
${PROJECT_SOURCE_DIR}/cmake/testing/code/binary-multisols.c
)

# Additional library tests that needs to download ci meshes to be run
Expand Down Expand Up @@ -153,6 +155,9 @@ FOREACH ( test_idx RANGE ${nbTests} )

ENDFOREACH ( )

TARGET_COMPILE_DEFINITIONS ( test_mmg3d_binary_multisols
PRIVATE MMG_MULTISOL_3D )

# Following source files are needed to find non exported symbols on windows
SET ( src_test_met3d
${PROJECT_SOURCE_DIR}/src/common/bezier.c
Expand Down Expand Up @@ -234,6 +239,10 @@ ADD_TEST(NAME libmmg3d_example6_io_1
"${PROJECT_SOURCE_DIR}/libexamples/mmg3d/io_multisols_example6/torus.mesh"
"${CTEST_OUTPUT_DIR}/libmmg3d_io_6-naca.o" "1"
)
ADD_TEST(NAME test_mmg3d_binary_multisols
COMMAND ${EXECUTABLE_OUTPUT_PATH}/test_mmg3d_binary_multisols
"${CTEST_OUTPUT_DIR}/test_mmg3d_binary_multisols.solb"
)
ADD_TEST(NAME libmmg3d_lsOnly
COMMAND ${EXECUTABLE_OUTPUT_PATH}/libmmg3d_lsOnly
"${PROJECT_SOURCE_DIR}/libexamples/mmg3d/IsosurfDiscretization_lsOnly/plane.mesh"
Expand Down
9 changes: 9 additions & 0 deletions cmake/testing/libmmgs_tests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ SET ( MMGS_LIB_TESTS
libmmgs_lsAndMetric_optim
libmmgs_lsAndMetric_hsiz
libmmgs_lsAndMetric
test_mmgs_binary_multisols
)
SET ( MMGS_LIB_TESTS_MAIN_PATH
${PROJECT_SOURCE_DIR}/libexamples/mmgs/adaptation_example0/example0_a/main.c
Expand All @@ -52,6 +53,7 @@ SET ( MMGS_LIB_TESTS_MAIN_PATH
${PROJECT_SOURCE_DIR}/libexamples/mmgs/IsosurfDiscretization_lsAndMetric/main_optim.c
${PROJECT_SOURCE_DIR}/libexamples/mmgs/IsosurfDiscretization_lsAndMetric/main_hsiz.c
${PROJECT_SOURCE_DIR}/libexamples/mmgs/IsosurfDiscretization_lsAndMetric/main.c
${PROJECT_SOURCE_DIR}/cmake/testing/code/binary-multisols.c
)

# Additional tests that needs to download ci meshes
Expand Down Expand Up @@ -124,6 +126,9 @@ FOREACH ( test_idx RANGE ${nbTests} )

ENDFOREACH ( )

TARGET_COMPILE_DEFINITIONS ( test_mmgs_binary_multisols
PRIVATE MMG_MULTISOL_S )

ADD_TEST(NAME libmmgs_example0_a
COMMAND ${EXECUTABLE_OUTPUT_PATH}/libmmgs_example0_a
"${PROJECT_SOURCE_DIR}/libexamples/mmgs/adaptation_example0/example0_a/cube.mesh"
Expand Down Expand Up @@ -154,6 +159,10 @@ ADD_TEST(NAME libmmgs_example3_io_1
"${PROJECT_SOURCE_DIR}/libexamples/mmgs/io_multisols_example3/torus.mesh"
"${CTEST_OUTPUT_DIR}/libmmgs_io_3-naca.o" "1"
)
ADD_TEST(NAME test_mmgs_binary_multisols
COMMAND ${EXECUTABLE_OUTPUT_PATH}/test_mmgs_binary_multisols
"${CTEST_OUTPUT_DIR}/test_mmgs_binary_multisols.solb"
)
ADD_TEST(NAME libmmgs_lsOnly
COMMAND ${EXECUTABLE_OUTPUT_PATH}/libmmgs_lsOnly
"${PROJECT_SOURCE_DIR}/libexamples/mmgs/IsosurfDiscretization_lsOnly/multi-mat.mesh"
Expand Down
6 changes: 3 additions & 3 deletions src/mmg2d/inout_2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -1650,7 +1650,7 @@ int MMG2D_saveSol(MMG5_pMesh mesh,MMG5_pSol sol,const char *filename) {
if ( !MG_VOK(ppt) ) continue;

MMG2D_writeDoubleSol(sol,inm,bin,k,gmsh);
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

/* End file */
Expand Down Expand Up @@ -1741,7 +1741,7 @@ int MMG2D_saveAllSols(MMG5_pMesh mesh,MMG5_pSol *sol,const char *filename) {
MMG2D_writeDoubleSol(psl,inm,bin,k,gmsh);
}
}
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

MMG5_saveSolAtTrianglesHeader( mesh,inm,(*sol)[0].ver,bin,&bpos,mesh->nsols,
Expand All @@ -1757,7 +1757,7 @@ int MMG2D_saveAllSols(MMG5_pMesh mesh,MMG5_pSol *sol,const char *filename) {
MMG2D_writeDoubleSol(psl,inm,bin,k,gmsh);
}
}
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

MMG5_SAFE_FREE(type);
Expand Down
6 changes: 3 additions & 3 deletions src/mmg3d/inout_3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -2335,7 +2335,7 @@ int MMG3D_saveSol(MMG5_pMesh mesh,MMG5_pSol met, const char *filename) {
if ( !MG_VOK(ppt) ) continue;

MMG5_writeDoubleSol3D(mesh,met,inm,bin,k,1);
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

/* End file */
Expand Down Expand Up @@ -2403,7 +2403,7 @@ int MMG3D_saveAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) {
MMG5_writeDoubleSol3D(mesh,psl,inm,bin,k,0);
}
}
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

MMG5_saveSolAtTetrahedraHeader( mesh,inm,(*sol)[0].ver,bin,&bpos,mesh->nsols,
Expand All @@ -2419,7 +2419,7 @@ int MMG3D_saveAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) {
MMG5_writeDoubleSol3D(mesh,psl,inm,bin,k,0);
}
}
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}


Expand Down
6 changes: 3 additions & 3 deletions src/mmgs/inout_s.c
Original file line number Diff line number Diff line change
Expand Up @@ -1503,7 +1503,7 @@ int MMGS_saveSol(MMG5_pMesh mesh,MMG5_pSol met, const char *filename) {
if ( !MG_VOK(ppt) ) continue;

MMG5_writeDoubleSol3D(mesh,met,inm,bin,k,1);
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

/* end of file */
Expand Down Expand Up @@ -1572,7 +1572,7 @@ int MMGS_saveAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) {
MMG5_writeDoubleSol3D(mesh,psl,inm,bin,k,0);
}
}
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

MMG5_saveSolAtTrianglesHeader( mesh,inm,(*sol)[0].ver,bin,&bpos,mesh->nsols,
Expand All @@ -1588,7 +1588,7 @@ int MMGS_saveAllSols(MMG5_pMesh mesh,MMG5_pSol *sol, const char *filename) {
MMG5_writeDoubleSol3D(mesh,psl,inm,bin,k,0);
}
}
fprintf(inm,"\n");
if ( !bin ) fprintf(inm,"\n");
}

MMG5_SAFE_FREE(type);
Expand Down