diff --git a/cmake/testing/code/binary-multisols.c b/cmake/testing/code/binary-multisols.c new file mode 100644 index 000000000..758969032 --- /dev/null +++ b/cmake/testing/code/binary-multisols.c @@ -0,0 +1,107 @@ +/** + * Test binary multi-solution round-trips through the public API. + */ + +#include +#include + +#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; +} diff --git a/cmake/testing/libmmg2d_tests.cmake b/cmake/testing/libmmg2d_tests.cmake index 025a747a5..4cc9cf2f5 100644 --- a/cmake/testing/libmmg2d_tests.cmake +++ b/cmake/testing/libmmg2d_tests.cmake @@ -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 @@ -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 @@ -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 @@ -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" diff --git a/cmake/testing/libmmg3d_tests.cmake b/cmake/testing/libmmg3d_tests.cmake index 38580ff29..cf8c4f6b6 100644 --- a/cmake/testing/libmmg3d_tests.cmake +++ b/cmake/testing/libmmg3d_tests.cmake @@ -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 @@ -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 @@ -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 @@ -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" diff --git a/cmake/testing/libmmgs_tests.cmake b/cmake/testing/libmmgs_tests.cmake index 549b5f74f..64ebc4e13 100644 --- a/cmake/testing/libmmgs_tests.cmake +++ b/cmake/testing/libmmgs_tests.cmake @@ -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 @@ -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 @@ -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" @@ -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" diff --git a/src/mmg2d/inout_2d.c b/src/mmg2d/inout_2d.c index 685264ef6..3d2185bd3 100644 --- a/src/mmg2d/inout_2d.c +++ b/src/mmg2d/inout_2d.c @@ -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 */ @@ -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, @@ -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); diff --git a/src/mmg3d/inout_3d.c b/src/mmg3d/inout_3d.c index 84701a8b8..612318489 100644 --- a/src/mmg3d/inout_3d.c +++ b/src/mmg3d/inout_3d.c @@ -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 */ @@ -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, @@ -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"); } diff --git a/src/mmgs/inout_s.c b/src/mmgs/inout_s.c index 222717b6b..25ccc0c6a 100644 --- a/src/mmgs/inout_s.c +++ b/src/mmgs/inout_s.c @@ -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 */ @@ -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, @@ -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);