From 830bf561e1236308cdffe0c519c6e779ec0929e3 Mon Sep 17 00:00:00 2001 From: Allen Byrne <50328838+byrnHDF@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:46:15 -0500 Subject: [PATCH] Merge CMake,doxygen changes from develop,1.10 branches (#3578) * Merge CMake,doxygen changes from develop,1.10 branches * revert incorrect option in AT TS build * Use variable for ignore-eol usage. * Add last_test depends logic * Just print status on CMake below 3.14 --- .github/workflows/main.yml | 89 +- .github/workflows/netcdf.yml | 3 + CMakeFilters.cmake | 2 +- CMakeInstallation.cmake | 8 +- config/cmake/fileCompareTest.cmake | 4 +- config/cmake/hdf5-config.cmake.in | 13 +- config/cmake/{patch.xml => patch.xml.in} | 2 +- config/cmake/runTest.cmake | 4 + config/cmake/scripts/HDF5options.cmake | 6 +- config/sanitizer/README.md | 2 +- config/toolchain/build32.cmake | 2 +- config/toolchain/clang.cmake | 16 +- config/toolchain/crayle.cmake | 10 +- config/toolchain/gcc.cmake | 12 +- config/toolchain/mingw64.cmake | 2 +- config/toolchain/pgi.cmake | 12 +- doxygen/dox/ExamplesAPI.dox | 1010 ++++++++++++++++++++++ doxygen/dox/GettingStarted.dox | 4 +- doxygen/dox/IntroHDF5.dox | 2 +- doxygen/dox/IntroParExamples.dox | 569 ++++++++++++ doxygen/dox/IntroParHDF5.dox | 271 ++++++ doxygen/dox/LearnBasics1.dox | 2 +- doxygen/img/pchunk_figa.gif | Bin 0 -> 2754 bytes doxygen/img/pchunk_figb.gif | Bin 0 -> 2094 bytes doxygen/img/pchunk_figc.gif | Bin 0 -> 3194 bytes doxygen/img/pchunk_figd.gif | Bin 0 -> 2984 bytes doxygen/img/pcont_hy_figa.gif | Bin 0 -> 3201 bytes doxygen/img/pcont_hy_figb.gif | Bin 0 -> 2450 bytes doxygen/img/pcont_hy_figc.gif | Bin 0 -> 3694 bytes doxygen/img/pcont_hy_figd.gif | Bin 0 -> 2723 bytes doxygen/img/ppatt_figa.gif | Bin 0 -> 2359 bytes doxygen/img/ppatt_figb.gif | Bin 0 -> 2431 bytes doxygen/img/ppatt_figc.gif | Bin 0 -> 2616 bytes doxygen/img/ppatt_figd.gif | Bin 0 -> 2505 bytes doxygen/img/preg_figa.gif | Bin 0 -> 2359 bytes doxygen/img/preg_figb.gif | Bin 0 -> 2033 bytes doxygen/img/preg_figc.gif | Bin 0 -> 3242 bytes doxygen/img/preg_figd.gif | Bin 0 -> 2367 bytes examples/CMakeTests.cmake | 4 +- java/examples/datasets/CMakeLists.txt | 2 +- tools/test/h5diff/CMakeTests.cmake | 4 +- tools/test/h5dump/CMakeTests.cmake | 8 +- tools/test/misc/CMakeTestsClear.cmake | 8 + 43 files changed, 2004 insertions(+), 67 deletions(-) rename config/cmake/{patch.xml => patch.xml.in} (80%) create mode 100644 doxygen/dox/ExamplesAPI.dox create mode 100644 doxygen/dox/IntroParExamples.dox create mode 100644 doxygen/dox/IntroParHDF5.dox create mode 100644 doxygen/img/pchunk_figa.gif create mode 100644 doxygen/img/pchunk_figb.gif create mode 100644 doxygen/img/pchunk_figc.gif create mode 100644 doxygen/img/pchunk_figd.gif create mode 100644 doxygen/img/pcont_hy_figa.gif create mode 100644 doxygen/img/pcont_hy_figb.gif create mode 100644 doxygen/img/pcont_hy_figc.gif create mode 100644 doxygen/img/pcont_hy_figd.gif create mode 100644 doxygen/img/ppatt_figa.gif create mode 100644 doxygen/img/ppatt_figb.gif create mode 100644 doxygen/img/ppatt_figc.gif create mode 100644 doxygen/img/ppatt_figd.gif create mode 100644 doxygen/img/preg_figa.gif create mode 100644 doxygen/img/preg_figb.gif create mode 100644 doxygen/img/preg_figc.gif create mode 100644 doxygen/img/preg_figd.gif diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e87b62763f6..10b3a9cf2de 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -336,30 +336,31 @@ jobs: - name: Dump matrix context run: echo '${{ toJSON(matrix) }}' - - name: Install CMake Dependencies (Linux) - run: sudo apt-get install ninja-build doxygen graphviz - if: matrix.os == 'ubuntu-latest' - - - name: Install Autotools Dependencies (Linux, serial) + # Only CMake need ninja-build, but we just install it unilaterally + # libssl, etc. are needed for the ros3 VFD + - name: Install Linux Dependencies run: | sudo apt update - sudo apt install automake autoconf libtool libtool-bin - sudo apt install gcc-12 g++-12 gfortran-12 + sudo apt-get install ninja-build doxygen graphviz sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 echo "CC=gcc-12" >> $GITHUB_ENV echo "CXX=g++-12" >> $GITHUB_ENV echo "FC=gfortran-12" >> $GITHUB_ENV + if: matrix.os == 'ubuntu-latest' + + # CMake gets libaec from fetchcontent + - name: Install Autotools Dependencies (Linux) + run: | + sudo apt install automake autoconf libtool libtool-bin sudo apt install libaec0 libaec-dev - if: (matrix.generator == 'autogen') && (matrix.parallel != 'enable') + if: (matrix.generator == 'autogen') - name: Install Autotools Dependencies (Linux, parallel) run: | - sudo apt update - sudo apt install automake autoconf libtool libtool-bin sudo apt install openmpi-bin openmpi-common mpi-default-dev echo "CC=mpicc" >> $GITHUB_ENV echo "FC=mpif90" >> $GITHUB_ENV - sudo apt install libaec0 libaec-dev if: (matrix.generator == 'autogen') && (matrix.parallel == 'enable') - name: Install Dependencies (Windows) @@ -390,7 +391,19 @@ jobs: sh ./autogen.sh mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" - ${{ matrix.flags }} $GITHUB_WORKSPACE/configure --enable-build-mode=${{ matrix.build_mode.autotools }} --${{ matrix.deprec_sym }}-deprecated-symbols --with-default-api-version=${{ matrix.default_api }} --enable-shared --${{ matrix.parallel }}-parallel --${{ matrix.cpp }}-cxx --${{ matrix.fortran }}-fortran --${{ matrix.java }}-java --${{ matrix.mirror_vfd }}-mirror-vfd --${{ matrix.direct_vfd }}-direct-vfd --${{ matrix.ros3_vfd }}-ros3-vfd --with-szlib=${{ matrix.szip }} + ${{ matrix.flags }} $GITHUB_WORKSPACE/configure \ + --enable-build-mode=${{ matrix.build_mode.autotools }} \ + --${{ matrix.deprec_sym }}-deprecated-symbols \ + --with-default-api-version=${{ matrix.default_api }} \ + --enable-shared \ + --${{ matrix.parallel }}-parallel \ + --${{ matrix.cpp }}-cxx \ + --${{ matrix.fortran }}-fortran \ + --${{ matrix.java }}-java \ + --${{ matrix.mirror_vfd }}-mirror-vfd \ + --${{ matrix.direct_vfd }}-direct-vfd \ + --${{ matrix.ros3_vfd }}-ros3-vfd \ + --with-szlib=${{ matrix.szip }} shell: bash if: (matrix.generator == 'autogen') && ! (matrix.thread_safety.enabled) @@ -399,7 +412,15 @@ jobs: sh ./autogen.sh mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" - ${{ matrix.flags }} $GITHUB_WORKSPACE/configure --enable-build-mode=${{ matrix.build_mode.autotools }} --enable-shared --enable-threadsafe --disable-hl --${{ matrix.mirror_vfd }}-mirror-vfd --${{ matrix.direct_vfd }}-direct-vfd --${{ matrix.ros3_vfd }}-ros3-vfd --with-szlib=${{ matrix.szip }} + ${{ matrix.flags }} $GITHUB_WORKSPACE/configure \ + --enable-build-mode=${{ matrix.build_mode.autotools }} \ + --enable-shared \ + --enable-threadsafe \ + --disable-hl \ + --${{ matrix.mirror_vfd }}-mirror-vfd \ + --${{ matrix.direct_vfd }}-direct-vfd \ + --${{ matrix.ros3_vfd }}-ros3-vfd \ + --with-szlib=${{ matrix.szip }} shell: bash if: (matrix.generator == 'autogen') && (matrix.thread_safety.enabled) @@ -411,7 +432,25 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" - cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake ${{ matrix.generator }} -DCMAKE_BUILD_TYPE=${{ matrix.build_mode.cmake }} -DCMAKE_TOOLCHAIN_FILE=${{ matrix.toolchain }} -DBUILD_SHARED_LIBS=ON -DHDF5_ENABLE_ALL_WARNINGS=ON -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} -DHDF5_BUILD_CPP_LIB:BOOL=${{ matrix.cpp }} -DHDF5_BUILD_FORTRAN=${{ matrix.fortran }} -DHDF5_BUILD_JAVA=${{ matrix.java }} -DHDF5_BUILD_DOC=${{ matrix.docs }} -DBUILD_SZIP_WITH_FETCHCONTENT=${{ matrix.libaecfc }} -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} -DBUILD_ZLIB_WITH_FETCHCONTENT=${{ matrix.zlibfc }} -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} -DHDF5_ENABLE_ROS3_VFD:BOOL=${{ matrix.ros3_vfd }} $GITHUB_WORKSPACE + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + ${{ matrix.generator }} \ + -DCMAKE_BUILD_TYPE=${{ matrix.build_mode.cmake }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ matrix.toolchain }} \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ + -DHDF5_BUILD_CPP_LIB:BOOL=${{ matrix.cpp }} \ + -DHDF5_BUILD_FORTRAN=${{ matrix.fortran }} \ + -DHDF5_BUILD_JAVA=${{ matrix.java }} \ + -DHDF5_BUILD_DOC=${{ matrix.docs }} \ + -DBUILD_SZIP_WITH_FETCHCONTENT=${{ matrix.libaecfc }} \ + -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} \ + -DBUILD_ZLIB_WITH_FETCHCONTENT=${{ matrix.zlibfc }} \ + -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=${{ matrix.ros3_vfd }} \ + $GITHUB_WORKSPACE shell: bash if: (matrix.generator != 'autogen') && ! (matrix.thread_safety.enabled) @@ -420,7 +459,27 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" - cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake ${{ matrix.generator }} -DCMAKE_BUILD_TYPE=${{ matrix.build_mode.cmake }} -DCMAKE_TOOLCHAIN_FILE=${{ matrix.toolchain }} -DBUILD_SHARED_LIBS=ON -DHDF5_ENABLE_ALL_WARNINGS=ON -DHDF5_ENABLE_THREADSAFE:BOOL=ON -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} -DHDF5_BUILD_CPP_LIB:BOOL=OFF -DHDF5_BUILD_FORTRAN:BOOL=OFF -DHDF5_BUILD_JAVA:BOOL=OFF -DHDF5_BUILD_HL_LIB:BOOL=OFF -DHDF5_BUILD_DOC=OFF -DBUILD_SZIP_WITH_FETCHCONTENT=${{ matrix.libaecfc }} -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} -DBUILD_ZLIB_WITH_FETCHCONTENT=${{ matrix.zlibfc }} -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} -DHDF5_ENABLE_ROS3_VFD:BOOL=${{ matrix.ros3_vfd }} $GITHUB_WORKSPACE + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + ${{ matrix.generator }} \ + -DCMAKE_BUILD_TYPE=${{ matrix.build_mode.cmake }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ matrix.toolchain }} \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ + -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ + -DHDF5_BUILD_FORTRAN:BOOL=OFF \ + -DHDF5_BUILD_JAVA:BOOL=OFF \ + -DHDF5_BUILD_HL_LIB:BOOL=OFF \ + -DHDF5_BUILD_DOC=OFF \ + -DBUILD_SZIP_WITH_FETCHCONTENT=${{ matrix.libaecfc }} \ + -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} \ + -DBUILD_ZLIB_WITH_FETCHCONTENT=${{ matrix.zlibfc }} \ + -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=${{ matrix.ros3_vfd }} \ + $GITHUB_WORKSPACE shell: bash if: (matrix.generator != 'autogen') && (matrix.thread_safety.enabled) diff --git a/.github/workflows/netcdf.yml b/.github/workflows/netcdf.yml index 0ec7541ee80..5b1ebf265ca 100644 --- a/.github/workflows/netcdf.yml +++ b/.github/workflows/netcdf.yml @@ -14,6 +14,9 @@ on: - 'COPYING**' - '**.md' +permissions: + contents: read + # Using concurrency to cancel any in-progress job or run concurrency: group: ${{ github.workflow }}-${{ github.sha || github.event.pull_request.number }} diff --git a/CMakeFilters.cmake b/CMakeFilters.cmake index 200634e1cb3..3a1a0de3a78 100644 --- a/CMakeFilters.cmake +++ b/CMakeFilters.cmake @@ -9,7 +9,7 @@ # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. # -option (USE_LIBAEC "Use AEC library as SZip Filter" OFF) +option (USE_LIBAEC "Use AEC library as SZip Filter" ON) option (USE_LIBAEC_STATIC "Use static AEC library " OFF) option (ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" 0) option (SZIP_USE_EXTERNAL "Use External Library Building for SZIP" 0) diff --git a/CMakeInstallation.cmake b/CMakeInstallation.cmake index 1fb77141240..3aa79816c8c 100644 --- a/CMakeInstallation.cmake +++ b/CMakeInstallation.cmake @@ -390,7 +390,13 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES) set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT "${HDF5_PACKAGE_URL}") set(CPACK_WIX_PROPERTY_ARPHELPLINK "${HDF5_PACKAGE_BUGREPORT}") if (BUILD_SHARED_LIBS) - set(CPACK_WIX_PATCH_FILE "${HDF_RESOURCES_DIR}/patch.xml") + if (${HDF_CFG_NAME} MATCHES "Debug" OR ${HDF_CFG_NAME} MATCHES "Developer") + set (WIX_CMP_NAME "${HDF5_LIB_NAME}${CMAKE_DEBUG_POSTFIX}") + else () + set (WIX_CMP_NAME "${HDF5_LIB_NAME}") + endif () + configure_file (${HDF_RESOURCES_DIR}/patch.xml.in ${HDF5_BINARY_DIR}/patch.xml @ONLY) + set(CPACK_WIX_PATCH_FILE "${HDF5_BINARY_DIR}/patch.xml") endif () elseif (APPLE) list (APPEND CPACK_GENERATOR "STGZ") diff --git a/config/cmake/fileCompareTest.cmake b/config/cmake/fileCompareTest.cmake index 4a8dc099618..f4c46f60ee7 100644 --- a/config/cmake/fileCompareTest.cmake +++ b/config/cmake/fileCompareTest.cmake @@ -59,7 +59,7 @@ if (TEST_STRINGS STREQUAL "YES") endif () else () if (CMAKE_VERSION VERSION_LESS "3.14.0") - message (FATAL_ERROR "CANNOT get file size, file command SIZE not supported") + message (STATUS "CANNOT get file size, file command SIZE not supported") else () file (SIZE ${TEST_FOLDER}/${TEST_ONEFILE} TEST_ONE_SIZE) file (SIZE ${TEST_FOLDER}/${TEST_TWOFILE} TEST_TWO_SIZE) @@ -74,7 +74,7 @@ else () elseif (TEST_FUNCTION MATCHES "LTEQ") if (TEST_ONE_SIZE LESS_EQUAL TEST_TWO_SIZE) if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.15.0") - message (VERBOSES "Passed: The size of ${TEST_FOLDER}/${TEST_ONEFILE} was less or equal ${TEST_FOLDER}/${TEST_TWOFILE}") + message (VERBOSE "Passed: The size of ${TEST_FOLDER}/${TEST_ONEFILE} was less or equal ${TEST_FOLDER}/${TEST_TWOFILE}") endif () else () message (FATAL_ERROR "The size of ${TEST_FOLDER}/${TEST_ONEFILE} was NOT less or equal ${TEST_FOLDER}/${TEST_TWOFILE}") diff --git a/config/cmake/hdf5-config.cmake.in b/config/cmake/hdf5-config.cmake.in index 699db896476..496d2607db2 100644 --- a/config/cmake/hdf5-config.cmake.in +++ b/config/cmake/hdf5-config.cmake.in @@ -44,6 +44,7 @@ set (${HDF5_PACKAGE_NAME}_ENABLE_PLUGIN_SUPPORT @HDF5_ENABLE_PLUGIN_SUPPORT@) set (${HDF5_PACKAGE_NAME}_ENABLE_Z_LIB_SUPPORT @HDF5_ENABLE_Z_LIB_SUPPORT@) set (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_SUPPORT @HDF5_ENABLE_SZIP_SUPPORT@) set (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_ENCODING @HDF5_ENABLE_SZIP_ENCODING@) +set (${HDF5_PACKAGE_NAME}_ENABLE_ROS3_VFD @HDF5_ENABLE_ROS3_VFD@) set (${HDF5_PACKAGE_NAME}_BUILD_SHARED_LIBS @H5_ENABLE_SHARED_LIB@) set (${HDF5_PACKAGE_NAME}_BUILD_STATIC_LIBS @H5_ENABLE_STATIC_LIB@) set (${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS @HDF5_PACKAGE_EXTLIBS@) @@ -51,7 +52,8 @@ set (${HDF5_PACKAGE_NAME}_EXPORT_LIBRARIES @HDF5_LIBRARIES_TO_EXPORT@) set (${HDF5_PACKAGE_NAME}_ARCHITECTURE "@CMAKE_GENERATOR_ARCHITECTURE@") set (${HDF5_PACKAGE_NAME}_TOOLSET "@CMAKE_GENERATOR_TOOLSET@") set (${HDF5_PACKAGE_NAME}_DEFAULT_API_VERSION "@DEFAULT_API_VERSION@") -set (${HDF5_PACKAGE_NAME}_PARALLEL_FILTERED_WRITES "@PARALLEL_FILTERED_WRITES@") +set (${HDF5_PACKAGE_NAME}_PARALLEL_FILTERED_WRITES @PARALLEL_FILTERED_WRITES@) +set (${HDF5_PACKAGE_NAME}_INSTALL_MOD_FORTRAN "@HDF5_INSTALL_MOD_FORTRAN@") #----------------------------------------------------------------------------- # Dependencies @@ -67,6 +69,11 @@ if (${HDF5_PACKAGE_NAME}_ENABLE_PARALLEL) find_package(MPI QUIET REQUIRED) endif () +if (${HDF5_PACKAGE_NAME}_ENABLE_THREADSAFE) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads QUIET REQUIRED) +endif () + if (${HDF5_PACKAGE_NAME}_BUILD_JAVA) set (${HDF5_PACKAGE_NAME}_JAVA_INCLUDE_DIRS @PACKAGE_CURRENT_BUILD_DIR@/lib/jarhdf5-@HDF5_VERSION_STRING@.jar @@ -143,14 +150,14 @@ foreach (comp IN LISTS ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS) list (REMOVE_ITEM ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS ${comp}) set (${HDF5_PACKAGE_NAME}_LIB_TYPE ${${HDF5_PACKAGE_NAME}_LIB_TYPE} ${comp}) - if (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN) + if (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN AND ${HDF5_PACKAGE_NAME}_INSTALL_MOD_FORTRAN STREQUAL "SHARED") set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_FORTRAN "@PACKAGE_INCLUDE_INSTALL_DIR@/shared") endif () elseif (comp STREQUAL "static") list (REMOVE_ITEM ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS ${comp}) set (${HDF5_PACKAGE_NAME}_LIB_TYPE ${${HDF5_PACKAGE_NAME}_LIB_TYPE} ${comp}) - if (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN) + if (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN AND ${HDF5_PACKAGE_NAME}_INSTALL_MOD_FORTRAN STREQUAL "STATIC") set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_FORTRAN "@PACKAGE_INCLUDE_INSTALL_DIR@/static") endif () endif () diff --git a/config/cmake/patch.xml b/config/cmake/patch.xml.in similarity index 80% rename from config/cmake/patch.xml rename to config/cmake/patch.xml.in index 1bdff3e7c2e..d6843e12697 100644 --- a/config/cmake/patch.xml +++ b/config/cmake/patch.xml.in @@ -1,5 +1,5 @@ - + + +\section sec_exapi_desc Examples Description +The C, FORTRAN and Java examples below point to the examples in the hdf5-examples github repository. Examples for older versions of HDF5 +are handled by setting the appropriate USE_API_xxx definition. HDF5-1.6 examples are in a "16"-named subdirectory. + +The Java examples are in the HDF5-1.10 source code, and the Java Object package examples are in the HDFView source. +Please note that you must comment out the "package" statement at the top when downloading a Java Object example individually. + +The MATLAB and Python examples were generously provided by a user and are not tested. + +Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level), and Python (Low Level APIs). + +\subsection sec_exapi_dsets Datasets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLanguagesHDF5 FileOutputDDL
Set Space Allocation Time for Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_alloc.h5h5ex_d_alloc.tsth5ex_d_alloc.ddl
Read / Write Dataset using Fletcher32 Checksum Filter +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_checksum.h5h5ex_d_checksum.tsth5ex_d_checksum.ddl
Read / Write Chunked Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_chunk.h5h5ex_d_chunk.tsth5ex_d_chunk.ddl
Read / Write Compact Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_compact.h5h5ex_d_compact.tsth5ex_d_compact.ddl
Read / Write to External Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_extern.h5h5ex_d_extern.tsth5ex_d_extern.ddl
Read / Write Dataset w/ Fill Value +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_fillval.h5h5ex_d_fillval.tsth5ex_d_fillval.ddl
Read / Write GZIP Compressed Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_gzip.h5h5ex_d_gzip.tsth5ex_d_gzip.ddl
Read / Write Data by Hyperslabs +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_hyper.h5h5ex_d_hyper.tsth5ex_d_hyper.ddl
Read / Write Dataset with n-bit Filter +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_nbit.h5h5ex_d_nbit.tsth5ex_d_nbit.ddl
Read / Write Integer Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_rdwrc.h5h5ex_d_rdwrc.tsth5ex_d_rdwr.ddl
Read / Write Dataset w/ Shuffle Filter and GZIP Compression +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_shuffle.h5h5ex_d_shuffle.tsth5ex_d_shuffle.ddl
Read / Write Dataset using Scale-Offset Filter (float) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_sofloat.h5h5ex_d_sofloat.tsth5ex_d_sofloat.ddl
Read / Write Dataset using Scale-Offset Filter (integer) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_soint.h5h5ex_d_soint.tsth5ex_d_soint.ddl
Read / Write Dataset using SZIP Compression +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_szip.h5h5ex_d_szip.tsth5ex_d_szip.ddl
Read / Write Dataset using Data Transform Expression +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_transform.h5h5ex_d_transform.tsth5ex_d_transform.ddl
Read / Write Unlimited Dimension Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_unlimadd.h5h5ex_d_unlimadd.tsth5ex_d_unlimadd.ddl
Read / Write GZIP Compressed Unlimited Dimension Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_unlimgzip.h5h5ex_d_unlimgzip.tsth5ex_d_unlimgzip.ddl
Read / Write / Edit Unlimited Dimension Dataset +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_d_unlimmod.h5h5ex_d_unlimmod.tsth5ex_d_unlimmod.ddl
+ +\subsection sec_exapi_grps Groups + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLanguagesHDF5 FileOutputDDL
Create "compact-or-indexed" Format Groups +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_compact.h5h5ex_g_.tsth5ex_g_compact1.ddlh5ex_g_compact2.ddl
Track links in a Group by Creation Order +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_corder.h5h5ex_g_corder.tsth5ex_g_corder.ddl
Create / Open / Close a Group +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_create.h5h5ex_g_create.tsth5ex_g_create.ddl
Create Intermediate Groups +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_intermediate.h5h5ex_g_intermediate.tsth5ex_g_intermediate.ddl
Iterate over Groups w/ H5Literate +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_iterate.h5h5ex_g_iterate.tsth5ex_g_iterate.ddl
Set Conditions to Convert between Compact and Dense Groups +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_phase.h5h5ex_g_phase.tsth5ex_g_phase.ddl
Recursively Traverse a File with H5Literate +C + FORTRAN +Java + JavaObj MATLAB PyHigh PyLow +h5ex_g_traverse.h5h5ex_g_traverse.tsth5ex_g_traverse.ddl
Recursively Traverse a File with H5Ovisit / H5Lvisit +C + FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_g_visit.h5h5ex_g_visit.tsth5ex_g_visit.ddl
+ +\subsection sec_exapi_dtypes Datatypes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLanguagesHDF5 FileOutputDDL
Read / Write Array (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_arrayatt.h5h5ex_t_arrayatt.tsth5ex_t_arrayatt.ddl
Read / Write Array (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_array.h5h5ex_t_array.tsth5ex_t_array.ddl
Read / Write Bitfield (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_bitatt.h5h5ex_t_bitatt.tsth5ex_t_bitatt.ddl
Read / Write Bitfield (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_bit.h5h5ex_t_bit.tsth5ex_t_bit.ddl
Read / Write Compound (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_cmpdatt.h5h5ex_t_cmpdatt.tsth5ex_t_cmpdatt.ddl
Read / Write Compound (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_cmpd.h5h5ex_t_cmpd.tsth5ex_t_cmpd.ddl
Commit Named Datatype and Read Back +C + FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_commit.h5h5ex_t_commit.tsth5ex_t_commit.ddl
Convert Between Datatypes in Memory +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_t_convert.h5h5ex_t_convert.tsth5ex_t_convert.ddl
Read / Write Complex Compound (Attribute) +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_t_cpxcmpdatt.h5h5ex_t_cpxcmpdatt.tsth5ex_t_cpxcmpdatt.ddl
Read / Write Complex Compound (Dataset) +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_t_cpxcmpd.h5h5ex_t_cpxcmpd.tsth5ex_t_cpxcmpd.ddl
Read / Write Enumerated (Attribute) +C +FORTRAN + Java JavaObj MATLAB PyHigh PyLow +h5ex_t_enumatt.h5h5ex_t_enumatt.tsth5ex_t_enumatt.ddl
Read / Write Enumerated (Dataset) +C +FORTRAN + Java JavaObj MATLAB PyHigh PyLow +h5ex_t_enum.h5h5ex_t_enum.tsth5ex_t_enum.ddl
Read / Write Floating Point (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_floatatt.h5h5ex_t_floatatt.tsth5ex_t_floatatt.ddl
Read / Write Floating Point (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_float.h5h5ex_t_float.tsth5ex_t_float.ddl
Read / Write Integer Datatype (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_intatt.h5h5ex_t_intatt.tsth5ex_t_intatt.ddl
Read / Write Integer Datatype (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_int.h5h5ex_t_int.tsth5ex_t_int.ddl
Read / Write Object References (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_objrefatt.h5h5ex_t_objrefatt.tsth5ex_t_objrefatt.ddl
Read / Write Object References (Dataset) +C +FORTRAN +Java + JavaObj + MATLAB PyHigh PyLow +h5ex_t_objref.h5h5ex_t_objref.tsth5ex_t_objref.ddl
Read / Write Opaque (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_opaqueatt.h5h5ex_t_opaqueatt.tsth5ex_t_opaqueatt.ddl
Read / Write Opaque (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_opaque.h5h5ex_t_opaque.tsth5ex_t_opaque.ddl
Read / Write Region References (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_regrefatt.h5h5ex_t_regrefatt.tsth5ex_t_regrefatt.ddl
Read / Write Region References (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_regref.h5h5ex_t_regref.tsth5ex_t_regref.ddl
Read / Write String (Attribute) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_stringatt.h5h5ex_t_stringatt.tsth5ex_t_stringatt.ddl
Read / Write String (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_string.h5h5ex_t_string.tsth5ex_t_string.ddl
Read / Write Variable Length (Attribute) +C +FORTRAN + Java JavaObj MATLAB PyHigh PyLow +h5ex_t_vlenatt.h5h5ex_t_vlenatt.tsth5ex_t_vlenatt.ddl
Read / Write Variable Length (Dataset) +C +FORTRAN + Java JavaObj MATLAB PyHigh PyLow +h5ex_t_vlen.h5h5ex_t_vlen.tsth5ex_t_vlen.ddl
Read / Write Variable Length String (Attribute) +C +FORTRAN + Java JavaObj MATLAB PyHigh PyLow +h5ex_t_vlstringatt.h5h5ex_t_vlstringatt.tsth5ex_t_vlstringatt.ddl
Read / Write Variable Length String (Dataset) +C +FORTRAN +Java +JavaObj + MATLAB PyHigh PyLow +h5ex_t_vlstring.h5h5ex_t_vlstring.tsth5ex_t_vlstring.ddl
+ +\subsection sec_exapi_filts Filters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLanguagesHDF5 FileOutputDDL
Read / Write Dataset using Blosc Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_blosc.h5h5ex_d_blosc.tsth5ex_d_blosc.ddl
Read / Write Dataset using Bit Shuffle Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_bshuf.h5h5ex_d_bshuf.tsth5ex_d_bshuf.ddl
Read / Write Dataset using BZip2 Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_bzip2.h5h5ex_d_bzip2.tsth5ex_d_bzip2.ddl
Read / Write Dataset using JPEG Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_jpeg.h5h5ex_d_jpeg.tsth5ex_d_jpeg.ddl
Read / Write Dataset using LZ4 Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_lz4.h5h5ex_d_lz4.tsth5ex_d_lz4.ddl
Read / Write Dataset using LZF Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_lzf.h5h5ex_d_lzf.tsth5ex_d_lzf.ddl
Read / Write Dataset using MAFISC Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_mafisc.h5h5ex_d_mafisc.tsth5ex_d_mafisc.ddl
Read / Write Dataset using ZFP Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_zfp.h5h5ex_d_zfp.tsth5ex_d_zfp.ddl
Read / Write Dataset using ZStd Compression +C + FORTRAN Java JavaObj MATLAB PyHigh PyLow +h5ex_d_zstd.h5h5ex_d_zstd.tsth5ex_d_zstd.ddl
+ +\subsection sec_exapi_java Java General + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLanguagesOutput
Create/Read/Write an Attribute +Java +JavaObj +HDF5AttributeCreate.txt
Create Datasets +Java +JavaObj +HDF5DatasetCreate.txt
Read/Write Datasets +Java +JavaObj +HDF5DatasetRead.txt
Create an Empty File +Java +JavaObj +HDF5FileCreate.txt
Retrieve the File Structure +Java + JavaObj +HDF5FileStructure.txt
Create Groups +Java +JavaObj +HDF5GroupCreate.txt
Select a Subset of a Dataset +Java + JavaObj +HDF5SubsetSelect.txt
Create Two Datasets Within Groups +Java +JavaObj +HDF5GroupDatasetCreate.txt
+ + +\subsection sec_exapi_par Parallel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLanguagesHDF5 FileOutput
Creating and Accessing a File +C +FORTRAN + MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Creating and Accessing a Dataset +C +FORTRAN + MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Writing and Reading Contiguous Hyperslabs +C +FORTRAN + MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Writing and Reading Regularly Spaced Data Hyperslabs +C +FORTRAN + MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Writing and Reading Pattern Hyperslabs +C +FORTRAN + MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Writing and Reading Chunk Hyperslabs +C +FORTRAN + MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Using the Subfiling VFD to Write a File Striped Across Multiple Subfiles +C + FORTRAN MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Write to Datasets with Filters Applied +C + FORTRAN MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
Collectively Write Datasets with Filters and Not All Ranks have Data +C + FORTRAN MATLAB PyHigh PyLow +ph5_.h5ph5_.tst
+ + +
+Navigate back: \ref index "Main" / \ref GettingStarted + +*/ diff --git a/doxygen/dox/GettingStarted.dox b/doxygen/dox/GettingStarted.dox index 29c503319d0..87f3566361e 100644 --- a/doxygen/dox/GettingStarted.dox +++ b/doxygen/dox/GettingStarted.dox @@ -50,10 +50,10 @@ Parallel HDF5, and the HDF5-1.10 VDS and SWMR new features: -Introduction to Parallel HDF5 +\ref IntroParHDF5 -A brief introduction to Parallel HDF5. If you are new to HDF5 please see the @ref LearnBasics topic first. +A brief introduction to Parallel HDF5. If you are new to HDF5 please see the @ref LearnBasics topic first. diff --git a/doxygen/dox/IntroHDF5.dox b/doxygen/dox/IntroHDF5.dox index 3ca7d00b091..2c25659b8f3 100644 --- a/doxygen/dox/IntroHDF5.dox +++ b/doxygen/dox/IntroHDF5.dox @@ -607,7 +607,7 @@ on the HDF-EOS Tools and Information Center pag \section secHDF5Examples Examples \li \ref LBExamples -\li Examples by API +\li \ref ExAPI \li Examples in the Source Code \li Other Examples diff --git a/doxygen/dox/IntroParExamples.dox b/doxygen/dox/IntroParExamples.dox new file mode 100644 index 00000000000..39291063dc7 --- /dev/null +++ b/doxygen/dox/IntroParExamples.dox @@ -0,0 +1,569 @@ +/** @page IntroParContHyperslab Writing by Contiguous Hyperslab + +Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 +
+ +This example shows how to write a contiguous buffer in memory to a contiguous hyperslab in a file. In this case, +each parallel process writes a contiguous hyperslab to the file. + +In the C example (figure a), each hyperslab in memory consists of an equal number of consecutive rows. In the FORTRAN +90 example (figure b), each hyperslab in memory consists of +an equal number of consecutive columns. This reflects the difference in the storage order for C and FORTRAN 90. + + + + + + + + +
Figure a C ExampleFigure b Fortran Example
+\image html pcont_hy_figa.gif + +\image html pcont_hy_figb.gif +
+ +\section secIntroParContHyperslabC Writing a Contiguous Hyperslab in C +In this example, you have a dataset of 8 (rows) x 5 (columns) and each process writes an equal number +of rows to the dataset. The dataset hyperslab is defined as follows: +\code + count [0] = dimsf [0] / number_processes + count [1] = dimsf [1] +\endcode +where, +\code + dimsf [0] is the number of rows in the dataset + dimsf [1] is the number of columns in the dataset +\endcode +The offset for the hyperslab is different for each process: +\code + offset [0] = k * count[0] + offset [1] = 0 +\endcode +where, +\code + "k" is the process id number + count [0] is the number of rows written in each hyperslab + offset [1] = 0 indicates to start at the beginning of the row +\endcode + +The number of processes that you could use would be 1, 2, 4, or 8. The number of rows that would be written by each slab is as follows: + + + + + + + + + + + + + +
ProcessesSize of count[0](\# of rows)
18
24
42
81
+ +If using 4 processes, then process 1 would look like: + + + + +
+\image html pcont_hy_figc.gif +
+ +The code would look like the following: +\code + 71 /* + 72 * Each process defines dataset in memory and writes it to the hyperslab + 73 * in the file. + 74 */ + 75 count[0] = dimsf[0]/mpi_size; + 76 count[1] = dimsf[1]; + 77 offset[0] = mpi_rank * count[0]; + 78 offset[1] = 0; + 79 memspace = H5Screate_simple(RANK, count, NULL); + 80 + 81 /* + 82 * Select hyperslab in the file. + 83 */ + 84 filespace = H5Dget_space(dset_id); + 85 H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, count, NULL); +\endcode + +Below is the example program: + + + + +
+hyperslab_by_row.c +
+ +If using this example with 4 processes, then, +\li Process 0 writes "10"s to the file. +\li Process 1 writes "11"s. +\li Process 2 writes "12"s. +\li Process 3 writes "13"s. + +The following is the output from h5dump for the HDF5 file created by this example using 4 processes: +\code +HDF5 "SDS_row.h5" { +GROUP "/" { + DATASET "IntArray" { + DATATYPE H5T_STD_I32BE + DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) } + DATA { + 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13 + } + } +} +} +\endcode + + +\section secIntroParContHyperslabFort Writing a Contiguous Hyperslab in Fortran +In this example you have a dataset of 5 (rows) x 8 (columns). Since a contiguous hyperslab in Fortran 90 +consists of consecutive columns, each process will be writing an equal number of columns to the dataset. + +You would define the size of the hyperslab to write to the dataset as follows: +\code + count(1) = dimsf(1) + count(2) = dimsf(2) / number_of_processes +\endcode + +where, +\code + dimsf(1) is the number of rows in the dataset + dimsf(2) is the number of columns +\endcode + +The offset for the hyperslab dimension would be different for each process: +\code + offset (1) = 0 + offset (2) = k * count (2) +\endcode + +where, +\code + offset (1) = 0 indicates to start at the beginning of the column + "k" is the process id number + "count(2) is the number of columns to be written by each hyperslab +\endcode + +The number of processes that could be used in this example are 1, 2, 4, or 8. The number of +columns that could be written by each slab is as follows: + + + + + + + + + + + + + +
ProcessesSize of count (2)(\# of columns)
18
24
42
81
+ +If using 4 processes, the offset and count parameters for Process 1 would look like: + + + + +
+\image html pcont_hy_figd.gif +
+ +The code would look like the following: +\code + 69 ! Each process defines dataset in memory and writes it to the hyperslab + 70 ! in the file. + 71 ! + 72 count(1) = dimsf(1) + 73 count(2) = dimsf(2)/mpi_size + 74 offset(1) = 0 + 75 offset(2) = mpi_rank * count(2) + 76 CALL h5screate_simple_f(rank, count, memspace, error) + 77 ! + 78 ! Select hyperslab in the file. + 79 ! + 80 CALL h5dget_space_f(dset_id, filespace, error) + 81 CALL h5sselect_hyperslab_f (filespace, H5S_SELECT_SET_F, offset, count, error) +\endcode + +Below is the F90 example program which illustrates how to write contiguous hyperslabs by column in Parallel HDF5: + + + + +
+hyperslab_by_col.F90 +
+ +If you run this program with 4 processes and look at the output with h5dump you will notice that the output is +much like the output shown above for the C example. This is because h5dump is written in C. The data would be +displayed in columns if it was printed using Fortran 90 code. + +
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 + +@page IntroParRegularSpaced Writing by Regularly Spaced Data + +Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 +
+ +In this case, each process writes data from a contiguous buffer into disconnected locations in the file, using a regular pattern. + +In C it is done by selecting a hyperslab in a file that consists of regularly spaced columns. In F90, it is done by selecting a +hyperslab in a file that consists of regularly spaced rows. + + + + + + + + +
Figure a C ExampleFigure b Fortran Example
+\image html preg_figa.gif + +\image html preg_figb.gif +
+ +\section secIntroParRegularSpacedC Writing Regularly Spaced Columns in C +In this example, you have two processes that write to the same dataset, each writing to +every other column in the dataset. For each process the hyperslab in the file is set up as follows: +\code + 89 count[0] = 1; + 90 count[1] = dimsm[1]; + 91 offset[0] = 0; + 92 offset[1] = mpi_rank; + 93 stride[0] = 1; + 94 stride[1] = 2; + 95 block[0] = dimsf[0]; + 96 block[1] = 1; +\endcode + +The stride is 2 for dimension 1 to indicate that every other position along this +dimension will be written to. A stride of 1 indicates that every position along a dimension will be written to. + +For two processes, the mpi_rank will be either 0 or 1. Therefore: +\li Process 0 writes to even columns (0, 2, 4...) +\li Process 1 writes to odd columns (1, 3, 5...) + +The block size allows each process to write a column of data to every other position in the dataset. + + + + + +
+\image html preg_figc.gif +
+ +Below is an example program for writing hyperslabs by column in Parallel HDF5: + + + + +
+hyperslab_by_col.c +
+ +The following is the output from h5dump for the HDF5 file created by this example: +\code +HDF5 "SDS_col.h5" { +GROUP "/" { + DATASET "IntArray" { + DATATYPE H5T_STD_I32BE + DATASPACE SIMPLE { ( 8, 6 ) / ( 8, 6 ) } + DATA { + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200, + 1, 2, 10, 20, 100, 200 + } + } +} +} +\endcode + + +\section secIntroParRegularSpacedFort Writing Regularly Spaced Rows in Fortran +In this example, you have two processes that write to the same dataset, each writing to every +other row in the dataset. For each process the hyperslab in the file is set up as follows: + + +You would define the size of the hyperslab to write to the dataset as follows: +\code + 83 ! Each process defines dataset in memory and writes it to + 84 ! the hyperslab in the file. + 85 ! + 86 count(1) = dimsm(1) + 87 count(2) = 1 + 88 offset(1) = mpi_rank + 89 offset(2) = 0 + 90 stride(1) = 2 + 91 stride(2) = 1 + 92 block(1) = 1 + 93 block(2) = dimsf(2) +\endcode + +The stride is 2 for dimension 1 to indicate that every other position along this dimension will +be written to. A stride of 1 indicates that every position along a dimension will be written to. + +For two process, the mpi_rank will be either 0 or 1. Therefore: +\li Process 0 writes to even rows (0, 2, 4 ...) +\li Process 1 writes to odd rows (1, 3, 5 ...) + +The block size allows each process to write a row of data to every other position in the dataset, +rather than just a point of data. + +The following shows the data written by Process 1 to the file: + + + + +
+\image html preg_figd.gif +
+ +Below is the example program for writing hyperslabs by column in Parallel HDF5: + + + + +
+hyperslab_by_row.F90 +
+ +The output for h5dump on the file created by this program will look like the output as shown above for the C example. This is +because h5dump is written in C. The data would be displayed in rows if it were printed using Fortran 90 code. + +
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 + +@page IntroParPattern Writing by Pattern + +Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 +
+ +This is another example of writing data into disconnected locations in a file. Each process writes data from the contiguous +buffer into regularly scattered locations in the file. + +Each process defines a hyperslab in the file as described below and writes data to it. The C and Fortran 90 examples below +result in the same data layout in the file. + + + + + + + + + +
Figure a C ExampleFigure b Fortran Example
+\image html ppatt_figa.gif + +\image html ppatt_figb.gif +
+ +The C and Fortran 90 examples use four processes to write the pattern shown above. Each process defines a hyperslab by: +\li Specifying a stride of 2 for each dimension, which indicates that you wish to write to every other position along a dimension. +\li Specifying a different offset for each process: + + + + + + + + + + + + + + +
CProcess 0Process 1Process 2Process 3
offset[0] = 0offset[0] = 1offset[0] = 0offset[0] = 1
offset[1] = 0offset[1] = 0offset[1] = 1offset[1] = 1
FortranProcess 0Process 1Process 2Process 3
offset(1) = 0offset(1) = 0offset(1) = 1offset(1) = 1
offset(2) = 0offset(2) = 1offset(2) = 0offset(2) = 1
+\li Specifying the size of the slab to write. The count is the number of positions along a dimension to write to. If writing a 4 x 2 slab, +then the count would be: + + + + + + + + +
CFortran
count[0] = 4count(1) = 2
count[1] = 2count(2) = 4
+ +For example, the offset, count, and stride parameters for Process 2 would look like: + + + + + + + + +
Figure a C ExampleFigure b Fortran Example
+\image html ppatt_figc.gif + +\image html ppatt_figd.gif +
+ +Below are example programs for writing hyperslabs by pattern in Parallel HDF5: + + + + + + + +
+hyperslab_by_pattern.c +
+hyperslab_by_pattern.F90 +
+ +The following is the output from h5dump for the HDF5 file created in this example: +\code +HDF5 "SDS_pat.h5" { +GROUP "/" { + DATASET "IntArray" { + DATATYPE H5T_STD_I32BE + DATASPACE SIMPLE { ( 8, 4 ) / ( 8, 4 ) } + DATA { + 1, 3, 1, 3, + 2, 4, 2, 4, + 1, 3, 1, 3, + 2, 4, 2, 4, + 1, 3, 1, 3, + 2, 4, 2, 4, + 1, 3, 1, 3, + 2, 4, 2, 4 + } + } +} +} +\endcode +The h5dump utility is written in C so the output is in C order. + + +
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 + +@page IntroParChunk Writing by Chunk + +Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 +
+ +In this example each process writes a "chunk" of data to a dataset. The C and Fortran 90 +examples result in the same data layout in the file. + + + + + + + + + +
Figure a C ExampleFigure b Fortran Example
+\image html pchunk_figa.gif + +\image html pchunk_figb.gif +
+ +For this example, four processes are used, and a 4 x 2 chunk is written to the dataset by each process. + +To do this, you would: +\li Use the block parameter to specify a chunk of size 4 x 2 (or 2 x 4 for Fortran). +\li Use a different offset (start) for each process, based on the chunk size: + + + + + + + + + + + + + + +
CProcess 0Process 1Process 2Process 3
offset[0] = 0offset[0] = 0offset[0] = 4offset[0] = 4
offset[1] = 0offset[1] = 2offset[1] = 0offset[1] = 2
FortranProcess 0Process 1Process 2Process 3
offset(1) = 0offset(1) = 2offset(1) = 0offset(1) = 2
offset(2) = 0offset(2) = 0offset(2) = 4offset(2) = 4
+ +For example, the offset and block parameters for Process 2 would look like: + + + + + + + + +
Figure a C ExampleFigure b Fortran Example
+\image html pchunk_figc.gif + +\image html pchunk_figd.gif +
+ +Below are example programs for writing hyperslabs by pattern in Parallel HDF5: + + + + + + + +
+hyperslab_by_chunk.c +
+hyperslab_by_chunk.F90 +
+ +The following is the output from h5dump for the HDF5 file created in this example: +\code +HDF5 "SDS_chnk.h5" { +GROUP "/" { + DATASET "IntArray" { + DATATYPE H5T_STD_I32BE + DATASPACE SIMPLE { ( 8, 4 ) / ( 8, 4 ) } + DATA { + 1, 1, 2, 2, + 1, 1, 2, 2, + 1, 1, 2, 2, + 1, 1, 2, 2, + 3, 3, 4, 4, + 3, 3, 4, 4, + 3, 3, 4, 4, + 3, 3, 4, 4 + } + } +} +} +\endcode +The h5dump utility is written in C so the output is in C order. + +
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref IntroParHDF5 + +*/ diff --git a/doxygen/dox/IntroParHDF5.dox b/doxygen/dox/IntroParHDF5.dox new file mode 100644 index 00000000000..1f04e968e44 --- /dev/null +++ b/doxygen/dox/IntroParHDF5.dox @@ -0,0 +1,271 @@ +/** @page IntroParHDF5 A Brief Introduction to Parallel HDF5 + +Navigate back: \ref index "Main" / \ref GettingStarted +
+ +If you are new to HDF5 please see the @ref LearnBasics topic first. + +\section sec_pintro_overview Overview of Parallel HDF5 (PHDF5) Design +There were several requirements that we had for Parallel HDF5 (PHDF5). These were: +\li Parallel HDF5 files had to be compatible with serial HDF5 files and sharable +between different serial and parallel platforms. +\li Parallel HDF5 had to be designed to have a single file image to all processes, +rather than having one file per process. Having one file per process can cause expensive +post processing, and the files are not usable by different processes. +\li A standard parallel I/O interface had to be portable to different platforms. + +With these requirements of HDF5 our initial target was to support MPI programming, but not +for shared memory programming. We had done some experimentation with thread-safe support +for Pthreads and for OpenMP, and decided to use these. + +Implementation requirements were to: +\li Not use Threads, since they were not commonly supported in 1998 when we were looking at this. +\li Not have a reserved process, as this might interfere with parallel algorithms. +\li Not spawn any processes, as this is not even commonly supported now. + +The following shows the Parallel HDF5 implementation layers. + + +\subsection subsec_pintro_prog Parallel Programming with HDF5 +This tutorial assumes that you are somewhat familiar with parallel programming with MPI (Message Passing Interface). + +If you are not familiar with parallel programming, here is a tutorial that may be of interest: +Tutorial on HDF5 I/O tuning at NERSC + +Some of the terms that you must understand in this tutorial are: +
    +
  • +MPI Communicator +Allows a group of processes to communicate with each other. + +Following are the MPI routines for initializing MPI and the communicator and finalizing a session with MPI: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CFortranDescription
    MPI_InitMPI_INITInitialize MPI (MPI_COMM_WORLD usually)
    MPI_Comm_sizeMPI_COMM_SIZEDefine how many processes are contained in the communicator
    MPI_Comm_rankMPI_COMM_RANKDefine the process ID number within the communicator (from 0 to n-1)
    MPI_FinalizeMPI_FINALIZEExiting MPI
    +
  • +
  • +Collective +MPI defines this to mean all processes of the communicator must participate in the right order. +
  • +
+ +Parallel HDF5 opens a parallel file with a communicator. It returns a file handle to be used for future access to the file. + +All processes are required to participate in the collective Parallel HDF5 API. Different files can be opened using different communicators. + +Examples of what you can do with the Parallel HDF5 collective API: +\li File Operation: Create, open and close a file +\li Object Creation: Create, open, and close a dataset +\li Object Structure: Extend a dataset (increase dimension sizes) +\li Dataset Operations: Write to or read from a dataset +(Array data transfer can be collective or independent.) + +Once a file is opened by the processes of a communicator: +\li All parts of the file are accessible by all processes. +\li All objects in the file are accessible by all processes. +\li Multiple processes write to the same dataset. +\li Each process writes to an individual dataset. + +Please refer to the Supported Configuration Features Summary in the release notes for the current release +of HDF5 for an up-to-date list of the platforms that we support Parallel HDF5 on. + + +\subsection subsec_pintro_create_file Creating and Accessing a File with PHDF5 +The programming model for creating and accessing a file is as follows: +
    +
  1. Set up an access template object to control the file access mechanism.
  2. +
  3. Open the file.
  4. +
  5. Close the file.
  6. +
+ +Each process of the MPI communicator creates an access template and sets it up with MPI parallel +access information. This is done with the #H5Pcreate call to obtain the file access property list +and the #H5Pset_fapl_mpio call to set up parallel I/O access. + +Following is example code for creating an access template in HDF5: +C +\code + 23 MPI_Comm comm = MPI_COMM_WORLD; + 24 MPI_Info info = MPI_INFO_NULL; + 25 + 26 /* + 27 * Initialize MPI + 28 */ + 29 MPI_Init(&argc, &argv); + 30 MPI_Comm_size(comm, &mpi_size); + 31 MPI_Comm_rank(comm, &mpi_rank); + 32 + 33 /* + 34 * Set up file access property list with parallel I/O access + 35 */ + 36 plist_id = H5Pcreate(H5P_FILE_ACCESS); 37 H5Pset_fapl_mpio(plist_id, comm, info); +\endcode + +Fortran +\code + 23 comm = MPI_COMM_WORLD + 24 info = MPI_INFO_NULL + 25 + 26 CALL MPI_INIT(mpierror) + 27 CALL MPI_COMM_SIZE(comm, mpi_size, mpierror) + 28 CALL MPI_COMM_RANK(comm, mpi_rank, mpierror) + 29 ! + 30 ! Initialize FORTRAN interface + 31 ! + 32 CALL h5open_f(error) + 33 + 34 ! + 35 ! Setup file access property list with parallel I/O access. + 36 ! + 37 CALL h5pcreate_f(H5P_FILE_ACCESS_F, plist_id, error) 38 CALL h5pset_fapl_mpio_f(plist_id, comm, info, error) +\endcode + +The following example programs create an HDF5 file using Parallel HDF5: +C: file_create.c +F90: file_create.F90 + + +\subsection subsec_pintro_create_dset Creating and Accessing a Dataset with PHDF5 +The programming model for creating and accessing a dataset is as follows: +
    +
  1. +Create or open a Parallel HDF5 file with a collective call to: +#H5Dcreate +#H5Dopen +
  2. +
  3. +Obtain a copy of the file transfer property list and set it to use collective or independent I/O. +
      +
    • +Do this by first passing a data transfer property list class type to: #H5Pcreate +
    • +
    • +Then set the data transfer mode to either use independent I/O access or to use collective I/O, with a call to: #H5Pset_dxpl_mpio + +Following are the parameters required by this call: +C +\code + herr_t H5Pset_dxpl_mpio (hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode ) + dxpl_id IN: Data transfer property list identifier + xfer_mode IN: Transfer mode: + H5FD_MPIO_INDEPENDENT - use independent I/O access + (default) + H5FD_MPIO_COLLECTIVE - use collective I/O access +\endcode + +Fortran +\code + h5pset_dxpl_mpi_f (prp_id, data_xfer_mode, hdferr) + prp_id IN: Property List Identifier (INTEGER (HID_T)) + data_xfer_mode IN: Data transfer mode (INTEGER) + H5FD_MPIO_INDEPENDENT_F (0) + H5FD_MPIO_COLLECTIVE_F (1) + hdferr IN: Error code (INTEGER) +\endcode +
    • +
    • +Access the dataset with the defined transfer property list. +All processes that have opened a dataset may do collective I/O. Each process may do an independent +and arbitrary number of data I/O access calls, using: +#H5Dwrite +#H5Dread + +If a dataset is unlimited, you can extend it with a collective call to: #H5Dextend +
    • +
    +
  4. +
+ +The following code demonstrates a collective write using Parallel HDF5: +C +\code + 95 /* + 96 * Create property list for collective dataset write. + 97 */ + 98 plist_id = H5Pcreate (H5P_DATASET_XFER); 99 H5Pset_dxpl_mpio (plist_id, H5FD_MPIO_COLLECTIVE); + 100 + 101 status = H5Dwrite (dset_id, H5T_NATIVE_INT, memspace, filespace, + 102 plist_id, data); +\endcode + +Fortran +\code + 108 ! Create property list for collective dataset write + 109 ! + 110 CALL h5pcreate_f (H5P_DATASET_XFER_F, plist_id, error) 111 CALL h5pset_dxpl_mpio_f (plist_id, H5FD_MPIO_COLLECTIVE_F, error) + 112 + 113 ! + 114 ! Write the dataset collectively. + 115 ! + 116 CALL h5dwrite_f (dset_id, H5T_NATIVE_INTEGER, data, dimsfi, error, & + 117 file_space_id = filespace, mem_space_id = memspace, xfer_prp = plist_id) +\endcode + +The following example programs create an HDF5 dataset using Parallel HDF5: +C: dataset.c +F90: dataset.F90 + + +\subsubsection subsec_pintro_hyperslabs Hyperslabs +The programming model for writing and reading hyperslabs is: +/li Each process defines the memory and file hyperslabs. +/li Each process executes a partial write/read call which is either collective or independent. + +The memory and file hyperslabs in the first step are defined with the #H5Sselect_hyperslab. + +The start (or offset), count, stride, and block parameters define the portion of the dataset +to write to. By changing the values of these parameters you can write hyperslabs with Parallel +HDF5 by contiguous hyperslab, by regularly spaced data in a column/row, by patterns, and by chunks: + + + + + + + + + + + + + + +
+\li @subpage IntroParContHyperslab +
+\li @subpage IntroParRegularSpaced +
+\li @subpage IntroParPattern +
+\li @subpage IntroParChunk +
+ + +
+Navigate back: \ref index "Main" / \ref GettingStarted + +*/ diff --git a/doxygen/dox/LearnBasics1.dox b/doxygen/dox/LearnBasics1.dox index a9b6d0e71fd..53c8e0aab99 100644 --- a/doxygen/dox/LearnBasics1.dox +++ b/doxygen/dox/LearnBasics1.dox @@ -642,7 +642,7 @@ See the programming example for an illustration of the use of these calls. \subsection subsecLBDsetCreateContent File Contents The contents of the file dset.h5 (dsetf.h5 for FORTRAN) are shown below: - +
Contents of dset.h5 ( dsetf.h5)Contents of dset.h5 (dsetf.h5)
\image html imgLBDsetCreate.gif diff --git a/doxygen/img/pchunk_figa.gif b/doxygen/img/pchunk_figa.gif new file mode 100644 index 0000000000000000000000000000000000000000..90b49c0cda7097d9237a32333130e9dd5dabe9d1 GIT binary patch literal 2754 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 YpZ^RG=s*j4(1b3up%0Dd1rz`PJN;WAMgRZ+ literal 0 HcmV?d00001 diff --git a/doxygen/img/pchunk_figc.gif b/doxygen/img/pchunk_figc.gif new file mode 100644 index 0000000000000000000000000000000000000000..9975a87669d773ab1ef98818c6528af03dd583ed GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/doxygen/img/pchunk_figd.gif b/doxygen/img/pchunk_figd.gif new file mode 100644 index 0000000000000000000000000000000000000000..45da389fa9d2d4b3cc9490313e5f069ec3f2ef24 GIT binary patch literal 2984 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 literal 0 HcmV?d00001 diff --git a/doxygen/img/pcont_hy_figa.gif b/doxygen/img/pcont_hy_figa.gif new file mode 100644 index 0000000000000000000000000000000000000000..1417d1700944ed0976a1be846158dacfb2cb6eca GIT binary patch literal 3201 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 literal 0 HcmV?d00001 diff --git a/doxygen/img/pcont_hy_figb.gif b/doxygen/img/pcont_hy_figb.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3b637b0562eb520c91061d732d29cb84717c852 GIT binary patch literal 2450 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 Qyx|Xz_{1w-0|fv8J6{deLjV8( literal 0 HcmV?d00001 diff --git a/doxygen/img/pcont_hy_figc.gif b/doxygen/img/pcont_hy_figc.gif new file mode 100644 index 0000000000000000000000000000000000000000..91bab7d7f0b3eb2695abb60d0d2feff3ff0db1bf GIT binary patch literal 3694 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 literal 0 HcmV?d00001 diff --git a/doxygen/img/ppatt_figa.gif b/doxygen/img/ppatt_figa.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c86c93855fce2b129e4a0e158c3396448953b08 GIT binary patch literal 2359 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 literal 0 HcmV?d00001 diff --git a/doxygen/img/ppatt_figb.gif b/doxygen/img/ppatt_figb.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe4e350ac9cae9910d0d94d6a3fa0c512435754d GIT binary patch literal 2431 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 literal 0 HcmV?d00001 diff --git a/doxygen/img/ppatt_figc.gif b/doxygen/img/ppatt_figc.gif new file mode 100644 index 0000000000000000000000000000000000000000..aca8ef9d9bbf52c75e64beb351a55f5b1133afd6 GIT binary patch literal 2616 zcmV-83di+FNk%v~VLt)H0Q3L=0000@O-*QMXncHp00960W&n(gjGCI7r>Cc~va-Fs zy~oGL(9qD?+1cUY;pyq=@bK{e|Nj6000000000000000000000000000000000000 z000000000000000EC2ui06zi5000I4U?h%YX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE8PUeJY(8O6RO~z@oaFIdv*Fo?XL=9jk&X*|TQPj!mo9>({noyTK(J zaBf_-cJm&}=Z65_zkmn%3q6hynX+HYkSAZp%o%`Y&44~< z4lSB;^XN-iFK3h&P-_dY|gb?>lVG7c5KYA zY5$HG{1$S}&y(ja4m+k_c-)#ea)?Q`uiT;LOGBYgbMuEfuc-(x(IdtGW|m220sZL}#Zy3G31ggIuJ%U(R7P2t zVQw}7r&P05G~{j);mGW{I0Yy2e{E zvVfbKHr)nz7$*uC8=A^E5WXh|o;2rxZf_)83 ztQ@BT+n=$i{+5}cKF^{fE335!{5Y?)=! zQn74SKvH9!uhun_9P`4TnxJ&MLnR64QG^02cur>f9W>hv7rip%_YF=s%hMfBl-;ZZ zHqN{LfW<49;%~Q5)s@^})lSoe(#Ykl$fBmKf3|UD`O{#P{y9KP#^kNHygC{#?5^@= zD3P0UsXGzBr%OAF->TO;>dOp+&zy<7xV#RaD2wi_jVf3wSRg<3r}A2DPfE(ia_T&N zp#Nlk_UMPLJ`l}I>l?M;yE=O3Sy6{IuE9FD-ERlY1K+aPqrk@PW_msN%J>e5smE#R zd-@ZPj3`Jk_L<9l4Fr|#w8z0N5F;`BQdsB!Cordxu!LRM6X^1Rr_c$`fG`vT(GEtn z66gyR7V{WXXkxh>CLuh2`<2krRn6;Ck{xDQe+6O;r9_ z;L0|+CvwStUL?Z~frc@wl@Vsquwo0vmPR#_aZyV&h1$f(xjL#5X!sJM3bA-GEw=Dd zeiQ>3{gtpKj!|+CLmDCzsY8zaqG}ogBFTivq#{ys2r~@j5I@OJV{C* zY^zh?lX7wRdT?D2SOj#}ACG1$ufgkCV znT1!TDwfgP-!!R-gTvPFU!Af>e?`v9` zU<$aF5E+JY5H8EAd9S!4|Qnl68_jog+7NM zv0+L)n;ygHNPc#Zh+Bgi=Ind@ zup<+N`dS65$^0CLDIUxXfX;b^q%sL*kj#WWCRrxT0uN{;vl$sIr79_*|Vs z+!?<8r4l;f*==Zf>MZfXfwgABCTxWT9lx5;d!50K^Hvlg_ill?Z=@wapW7Y#Rug#5 z6rUfy3m*K?&7#Pg2znRj%R8;tIkV;M);el~#u}uv`SBbba3>GM_OYe=KY7O%}C=k461yIqpC(tS1R+)!LEh6tF!cK~~}ZoC&TXG#i;6v1aj{k~1rn ziD$KQQYpO&(so!Q10?j}{$u(gUa>l?~?x-UtaVHL0rG94$J14E|=!&DmONeQL7 z--No<*L9&{jz=U?kGFd9>V(}8S7Gc`b)Vcbwmrr?I9ub0*tN!Xo|yo)8g+ZykrJr4 zg$?c}kU62L-9uCtM_L3kRwIe8riwe1j%vFy=v)8N;y z7V^Gf?QDB{?IJxMH?VOTV%MXT&uzx=ym*`o==rv7AO7=>9KEvr9`r>G zhurZIoNzi+xJ?+Ia#}z9!j#IcMW2oY#t~ZLk>)kVXMJU*dq~&mHZ9zbNOhJMx>D4Q zdPbSe*si-PcTc^Bc74i&ELm@ExV1af$(wCR2l~MD@bz*33S*Qy+_;M8;Q2CVShi!n z@komGqdzZmBZAuO2*&PK3NNSYPMOMAnfT7BZBO1cedoB(z3z9<``-Kh_rMRn@P|+Q a;v4_?$WOlVm(Tp>JOBC6kG@(%0028vLM?{? literal 0 HcmV?d00001 diff --git a/doxygen/img/ppatt_figd.gif b/doxygen/img/ppatt_figd.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6c55c09fd42fdcccb01afde03ecdf58a9d37a55 GIT binary patch literal 2505 zcmV;)2{!geNk%v~VLt)G0Pz3-000000RR7H0RR90EC2ui06zi400091oR6u??GK}z zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&O5*l90U(QfT7q+DwDSLsoBe0I4g`} zs;4^~F^9a&ynNdX9W6agU2T1hovppi-R=Di9xgskUT%Jlp02*m-tPVmA1^;oUvGbp zpRd2q-|znqFrdJJ1PdBGh%lkTg$x@ydjDy1!T5)B6+KmY?$ zsjA$$swgH(GGo1j@Rey&qhFnV3t*(`0JT@4W`#NF>C>i0kHQJ+3sXlkZMC7LI(6;T zzToNrT0~Ol+>kD=64n+KFyP1k+EQ*9HL%*hD zO}qNK?Hu@OJx#B4Z}hT_=RPl2JjeBd<*Rd#p_W$#_Wlc-&Mr`Yb={(pfZTwGoq^{R zw}~DCFbH9U5>7}SGwMmEpicrAAi#zLbjTT1YZ2k06dk6;##Da+&>@E_X zg9xZtS2WG_mSH(8)>tD^F@|;`jT}}o;t@8^*rFLjcERL}B8u3f690t=kP%T5f#Z-5 z{s3egX~C!@ltBtdCW|hv85xdNSwmcLzZpsAm{We}#FkDTFc_X|0yqYdVbW-4lI&U7 zg=tlCG$@FPk~u}AUk(Xl7=w-(s483fNv3bs?ATg>n{Jrt6GDvo=$&f*$YzXzn)zp` zBQDCrb(_(O3t#v#00>;t(K#bpZcY)vl3_a0{w1G3YI!D~sthKn5W}j7YYqsqB@A6N z`5IpZu-0kl7&Zbssk2ma8f>abjcOyMIW}`4Yt@?6D^T|8$_0Fn@g-@9$dVXqy9rQx zWUP=%g6fS)&Pxn^QZY<|Sa9LnUANpWaL1@gmCCA-EUN2jiO0G-#HOj%*o;0 z%U_o$warjg%_Ub-4_-B52_k;?HMVO0#`iQQ-CBg*R13fx5Or_fc;T86B{!)yW2iaX zmB(YNI9x0nnuA&&*lQ>HGw6me zor>KI*DJgT%)@;g;0}`x`Q)?*zdf|Kk4wGmi1!%t#U_Xkpz$dEcdGOswjNCBM_j2X z;-oqZ1k(j!T)etVDGcK>_mKd9*@I3?{-dSa5wCt*!yR_i!n^QY$!qJ|4pJm09Hk`C zEGC%X>OujF*szOI!&;%Cx)iNWnTuQ%OxDKCgA=i|j4TR_81haCl41}@P7Ko7&Zuxi z36Uf*rosy=aM+7?`4E8e@L>K%++F%}?CiVH%L zzWy|$LdA%8Bb#BLun00GNlK0=Iio0UW{h?)hF5avSBk>5M?;B-GbV$Sj2d;w&;YS9 zKOE0%NC8GW>Jg54R1zHjXUA{FF_e>}Bo*6;o0DuxT8>N}4TW^DOtO%IWK2_3N~y-& zJ5hXcjk!7&B|AZJ8Ybk3AAL~BPa1PrV+0Z(3HHh{QHoidgxbO+ zSINTk2a}D0<&=fwOA|)e-;1rNL8@ zZ;ewM9Q15bL92bLhyl7_$n3{CU1Cdbg!^7bL07)|rLLqYFzBb2NXSF5(QG#Ds03ds zui#njKN;K_{NP5uo^h0@>Dl#w{L|)_qUrpp8 z3BhvG^X*Tiw+m`Z8^=-b`Lh~V<*K*JavB{D60FHV>w{8vzqLAbsCjLxUm=CWg=;5}O) zX==%cmN!55DC~MOa9lJP^}Xy(4|U_4CH!guuJldLGZ&)Wvdz{8G2T{yQZ8HLu{95ujS?hb%+-K~4_>%jYEM&)D^gYro=2S; zTuYj%%5Ju^pAGG3i^9wHA+WS_JwjxI#n#t;AEOVLXuE2gD=O~xAl?$fH%ba&qveKaI_Ru|$)u)QO}?0*Y<-~=B}T(}+Zf-j*gv@TDuh5hXYgpSjI%j`ORW zmkp_AUhH9YzJeI1S+rg?G|-cQz}u#bX>l<~ESB&an@-@_l z;_Iw$02HpsZIu^ebxp%u>^hiqyV(x+xXXR+&5)UjTP&TLzgp;nF8P=BerTGMebGB! z^}C)9YP$2>t7H1*vr1Z1poj$=r_pB literal 0 HcmV?d00001 diff --git a/doxygen/img/preg_figa.gif b/doxygen/img/preg_figa.gif new file mode 100644 index 0000000000000000000000000000000000000000..0929bf4d505ad2a1b0f11b5151d08d6f1cfbe21e GIT binary patch literal 2359 zcmV-73CQ+GNk%v~VLk!I0Pz3-000000RR7H0RR90EC2ui06qc600091oR6u??GK}z zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr^9hYgr&Jx_ zip^@b+^+Wv4sWaEC4hV`tBq-DdkqJ^rSrJmioWZ2b!dMN2va9USZH`?7^qk>`1F_X zxG0Iy=oEQyIjJd8*_1i(xhcxf$@CdInu@7_Di_hJI$COgSZjN08=E={igfy_E6X~3 z^a}wST*ixRWBkCJ>_&_LP2=oP9UZmo3w*3S$zAOI3@$0oMviR`7!UyJKJX525DySv zbls3msRf$FF2$HF0lE;;N9x5DTK^gb0r+p>lY;W*^|DA2AI1J52p90{*NfW66Sq9a$V>mYU7!WE_zEsCbgxu^Z;)-3BO4F@cunXZ}ZcC9P#(pG2iu9Lw3fk zrWJYz0vDcG2ue{NZgV-v*m4uenU=LzmPQm^*`$%)AqnG8TizI^m>+=nQh-6$xq)tJT$z$=Thb^bkvQ7P zk!o3S_oFM_0Wjo?a@9Czl0hvwC!dIFP+^g-QHj%twQLGRhb#G%;&gndx#W-lz9}Q2 zy)daMsaEZYYO1wT!Xlt3zBFS>H5%Hctv_6a{;HavI*JdZ27n2joRxOjAg#vsV5V7R z8YG96kroFXrq5Da(3g^4%Y&(_MTcv*N@6*#o8=BFE2ea!>k(iChJfd*x&qm#uWq&x zY>=SXh~=)kuyvVNibh*udOe6bD!%L$xUUDD%JpfZRqn}VmZ*x`BDu~YtgtK$XI6r` zAD&p{yKKHX@3Zw*TCBzUt))W0x%%u%zy%K+YrO~`s;wvm!4@ZBP0L9u5pMPOQRPve$6lY;Dpv0Bt1SrScSM z0v63UXp~rfiM8IWJe*a;iBCW=B8u1k(Div9%MJ3kS`u#drD#7sxpzUHx?tQB&pmUp z&f4tuteJ*xjlT7v$w#k4$7r+B#DX3=wcGhv7m$wzKJ}4XTAerSZ{6mp=$D_Kx!B+? z#<|I#D{tHA>;4;rvUCfusBw2k$z z3zc8^yfj5GVVmO;tFG5S7Gx`1reWLZWacW>aSm_%OCU+o$FB7OEO>Malyz=5EW}xG zCOm@J*Pxa^so~FflG@+BMwo*Cb&P`_TVKeg=eltn@Nj8^VF+9Xw|1$=eT49#KrqO? z6$uSSf&yWoL}aUP_ow4=F=u=<2NB;_NOmAEg1Na{9

2McR&u zAB@uz6Bfx3u*qiSD_{Mh1}#9A4|x^LUBjOFB6clJ2_H_c#VC!U40I=cE8J&t=S`5prUa+)gERhs=6bplN4v zU|Hb!$G(knkZ4TWHvZ*F&TnGQhMF5^^<-I0fl?ry-i%co_n9VM=FFEKg(EvPYR~)S z^O-}u<`+;pP-$|~buUapbzq9lR;{9X5-mn1GL|u%CV-<&T4ylxVbJ{;NT>r%L#SF>(5uC1*s776A}%mNmzlhxa11k%^4 z#Wu9P^-b^C{=%{m1kSZGA{IVXTU_yA?=%f7fny;>(5WV8wvL%Dav>Yd+s3M>x|J<& zxvMz)fL8;0WSv$)n<4ZXcXGj5F9yVVTC%1#v*+#aar1+M*OnB%+x2gEVYfEz-pR7L z4d`xZD__!Xa=bWmt9c=8UwM=t@43%^4)mZ4edt6ly3vo0^t2WL06X{4n1}!X literal 0 HcmV?d00001 diff --git a/doxygen/img/preg_figb.gif b/doxygen/img/preg_figb.gif new file mode 100644 index 0000000000000000000000000000000000000000..33e57fc56c3dd108556ce6e2ce428975f5b74403 GIT binary patch literal 2033 zcmV{<(xLV=X3~saIfq4c)VQhho&aD1~+K9#;1rxNa*+Y z*XZ~MxoCOR2&twSIGLDt85&d=_jnN5$$6S6+FC}rdFUCN$Le~kC5XG5Ys>o!94tIc zTx@)doUFXe-0b`e9W6agU2T1hovppi-R=Di9xgskUT)rS80UNbksfFXNXt$VU${U%Hs@XkUnarW6fQC9vHle+F6UOXvX*0*QPmK7`1DBE$YY3)Nwa2&&`9kt9o+ zJc%-;%9Sizx_k*Urp%c%YueN!K!Aaq2Y3$9>C@*=oj-@}3`+FqQKCYH$a)Gjs?@0( zp;5hxHS0Yc00IOs;1!V90RhmACEFG3*EMImekEI$?OV5Mw=zQ$6aZ75a`Nu&V-yck zKs?O^1q{UO+qjFvs!ek?Y~wzW%``3x7p&c7Ykcb6OPJ{Aqk5I%Wonr8=~GT0`-zNa zvSQ7VF=u|=Sgty)TB-1s^>_8p)JBC17(KMJXynJ0r*SHKHssu{rI(FGp+eT_w%W;vt+Ka9;md^~uFLMaL-CXofA22!F1+#1+o%w*)mB@exlQJpjh6*n z?y&}^dawkhE*zCp3_pAj2(}cwL%N6B8{WOmVSL)88q0g{fRiG*o|W547aMiA9f;jo z$rUDDM6g9_<=FK_>ZMWS$3tj1lLeJd8 zfov;S-@n_DJ@|p$$sBVIbIUvt$5m_oopIJ)yDPG*m_xU;%XGnYHp`tGeYk#%6AAfN zk8d<|>WUt_df*VxUamt>(=2uCu+#pqHn!7^`|W_=gu(BSI}v;1H5sov1HAX{eD1>& zZvpeu8|>idv~8#Mj_{SfK=RZtuKPU_h0Zp8)1|F)Tk@$KzVyn|WIa_cuk|@&hgU|n zY~7=U4*8AGbj@>~A?70;%d~G;D`U_C3)sBa4RBS*3*RRYr@cLKZ+{Z%ANT|)ya_G~ zcnYgd`aVj30&mz)+m3~tr8AWlbxJlA^0>X1d*;+H{w!|`1B(~ zR*{v3Owq1%)g@1I3xK=Q)-Q#rOFHthkjpw?utJF?FG(g`#|)Nsdi6{@QgWGgI$x(= z^Ql3d(wN2k=Aep|#Z@jdnRXDRk3?0@Y|03oN~=*kRhh|kvh$3Ve33Re$<2)DEoV$p z5^EU6w`X;2LuibkKK@-uAxpWbS`2;Fv#OLNR!P(zn<=9{YsVy8d&oi?gbk>Jy%+uUKK>~=SjQtOc&x*MFJ#kwW(G@m1k6|1ae z(Kj7+XhiJ^wvZT;+V#^#1YGJ%ZMdKe-Vbe{TOt4W7g4VQ)PP^2j)N|vxCR<7Gi>|n zCcWCt1G;r>a3vcHLFc~@4oR(@;A#WKTG#v$j!+#$Ymo?BqUu$9TNT}Rzx?g5fBy^M01J4)1TL_F4~*ahD|o>S zZm@$N4B-e%c)}E}u!YN!j)-0O70U8cf literal 0 HcmV?d00001 diff --git a/doxygen/img/preg_figc.gif b/doxygen/img/preg_figc.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4f98ffb1ed3dba608b2f8efa42a8d292264a5d4 GIT binary patch literal 3242 zcmV;b3{~?-Nk%v~VLt)M0Pz3-000000RR7H0RR90EC2ui06ziA00091oR6u??GK}z zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr^9hYgr_`$T zip^@b+^+Wv4vWX+viXcotJmzd8w7~U2lDv)9=6lz06wd30EjoJV%LYDw=&0fNa$z+ zIA@p$skiuuDPkDd7ui_SImuZk$~fwoiAgz0iV_;?hl(1znfkc;`g!t7+sX>-XKL#x zNNVgF$Qew_2%Jbc9Ni+>+$?%ry(hix)XDw51Pwk;UT%Jlp02*m-tPVmA1^;oUvGbp zpRd2q-`{q52?8`h%LvX8N6=D0e=cxU7}&_*vV*z`1{BATL^1wPi+puVs0(5TkF0wA z`XurI#*85pDpMIT<{_7eLfYi;%w?%-6;r-s32LU$nl(=jC5jX#PLxA;!a{gcDbS!V z9VR=az|zmH6EWm$>g?%Esbsq;W6#q@8<$)@ONcH7ASiia5KqOW~KdmIpEgi+#Y9){rI2k+`DHt z5Fh|}@dE+~Fd*POAoAr8us?4Ne)#bR(x10KApK=>DE{^5hp%3K0>Zb)eFNr49UPSy z)$Ni85Yl=a&>__34IpKA9(* ze{5Q6ct_@FWTE1b$Eb^AmKtHKj@CF%Pj#wS{;8Dz-KSrsg7rzJp{>@KW{*2^*(QmW zF8iOH)nyfEiq;~kW1h}taIOW1L<=a2gSw|=hOd&UXt0gSN-Q{ug}Y|5UZ$7s1p&`i ztBL$R8ERys7JMqRsSeDBY1mowpmYirQt@ONXBQ!Nh(KD~v2R|htd|ha25qfo=7=V| z*7o~rl-tJn@wXw@sc@6!HhS^|Jqx60AjiIoz^;etOmDV}3hOO@tR771wI@2TIvc!mYis zq%9ZvGT$+~=_$>R;*AK@I}0i7MT<z8#}|#f zlLW49o_pyDeX9yxokrKB(kbpYKiMAdn4v!HUGD+xV^9U_(6R40uYk2X)2q-Xz~CKa zBDgS$S>Uq01_)14#Pd(CFvqJYIf;Da>74F1$PHsfk7RwLo(LN_!N^END?lV+@VfWH z?-h!0;=@+7W_CUtZo^nO%bosnnn%ISoMe7zxd>CD!oBXb>q3`1UJ~c^H7r(dicdRW zzl27;)8PO%?Mo8nR2QhNEzxxegq`1{D2<*>OHBu|;s7fHz!pNzjP7BS|K=7Y8`=$! z(a>Sr_NJlfh3#)D8|2{HbGz|%4~onZTlyMT#T`LTfcTQax=J<1|6ER2M_XjQ>UPL{ zaqx<6Y@!0AIEAE<36J7J9*cOmxgs@;Tc+IQRlX-TL$)#sD^!{y-3G(TMYDU7%;g#b z`J9Pe@Mk+%o5+mWI)4T2LR6EZE^`R3RLbyilMH4BjWkXONr;le5TxkdXsLD%%avFo z<_yun@pe~ zHkF9ZP&%epZ{HI)f_szNyjHfFvRc*l55Fg}}&A{LfUyCYjTuX91i zRFGn$&4qT{{?}Qg*tUMTwTN>=qmj3YY@}S8D_ae_&d3@Md|e^Kh<403iP^* zNu)(z7%J-W$efy7){Shyn&v#jz<-6NSTpNblzNh<_MNAr*u}~Vf8n|zMUsSjxXH?7 zce)8X`>JZWl0JjEB0siSY2!uQAxt!=-(VK5MUY(NA9^p`M2WJM1K zVXnQ{c(sDDg=4w}C_hwi8qKPcWnfqDc@V5S^B<1?lwvT0GjEraD{9ZIml^A=#tFU( znRIOax@O9>D8L;q6#zKM^I)`41o9~o8QWxs@>0saL@J&SbI;-$BZCv0YAOV2(a0SX z#N7~as7cJy55AdKarQJ-p;u=fRv15*e!;3McS$~<_SS&zkf4e17BOumxxQ5iedlRr z`3}>_Bz`J>mn_X+1N&zVQSVKc<8&ztSrYH*^4DS9V zZrS8ZV`$1%-k|f^#kj~VOR=Bn!EKVd329EE2j7Kj#7+o8!CM2DdW9)ifzM zecb-qV&m>bHe+kukkxYh$TjU_t*9>NN*;JpeWr4133_ELWm)Iqrf^BCev5Y}{k`%I zrm4SY?+?l<-zblJKMn3;g!^!E?4ohQo2ZRH+kK#DxB8FW>*&H0w8$dopDv#L_GmkP z>~jxP-D_^;n}2(cF+?WM%k56Fe_HSmRr-((Pw!Jhou1edW2@iEMmir{*4CvwEG_7Qiq`@e{!alL#n(|j_PQ+sxK$---!2YAGgeZ>@dXQynOl31WJa$kaatY3wnGAV zXU+#%&}U52mw^AWfW*)r^0Zh>S6APsedt7TGQ@M`hkS!pATvig>xXwD=zg?^Ygi?J zGeU3FC(dTgArGQgtBVNZFTjhs= zs6oMTZ9OJ1=n`}9@KGvgSnJklgfWPUs0q1&R)}a1m6$~lLx|`S{&fAPVPkM+pO_Dr zmooh3ig2u5P?igkru{#HcDNMOa7jNr(6 zH(*=-_6!-4=K- zaF4rFSO%$(@^FqoG>x>Qh@GZx$5oLNX^pOU6eyGy)X;BS!I7mH59{c19wBrj`HrXL z4k-C=z_XHFQIRhBl0j!&kzfkN5r!5ikc5U<|Hyzp85=~8S(HYJlu46A~o z6vkK-DwL1D2$fdnEXE;|#dwv%B~Co?KDo7#3E7pqP$eZKL?0OzEID3f>6Ig-Syhpf zY{`{wxm6OB44xs5ddZD;`Ia)lMfA8u_-Ji@sS5sBl7^|6i^-Uc>6niRnUN`(lS!GC cX_=RanVG4Xo5`7->6xDinxQG07*GHJJEfpV4*&oF literal 0 HcmV?d00001 diff --git a/doxygen/img/preg_figd.gif b/doxygen/img/preg_figd.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe345fbca8171cd36da4da658e66004643d68f36 GIT binary patch literal 2367 zcmV-F3BdM8Nk%v~VLt)B0Pz3-000000RR7H0RR90EC2ui06zh~00091oR6u??GK}z zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr^9hYgr_`$T zip^@b+^+Wv4vWX+viXcotJmzd`wfrF=k&V$j?e4&{J#GW7&r$&SU6yqPzYe4Cs#DwOMIvsqiV_fs{|^H8T*WDd}+$u%xbI&{5ySMD-2p2EBiXmy)vEss5wcl3JslZ zTHd~UOAEf|X`jFu>;@V9*VjWb@4nrebV1;Ma}6~NRyt6m%v(Ce z2DO*$e0n7`K8!q>=)tk!c4ul~c@Oz@;Rkwe9}fQfZvOV$_pb$jObJ-jJYW!bAR7jL zfgpnlQg=mzUPwp3f zjFHqxh>I}NXuys=&gc#uv7wRTkBro~B9AgIgJdN;(x~GhNT#SGiykso$AT?@^G^fQ z`4wYbRTkOgl%(LOWRfcCxMq(~{&=OAS(Ye*YZTzMm1JU8c_xr$8kr-TeZDv-lWYb# zr#q3U_svwZ{pQVAWV$FNphil`XPc5#S?Q96#>oJv7xILfINFs8W@&i3dFh)ra;j;H zg9h3orf|ZFXhqI}iC%G?+4Ws`Bo0e#uqTMx{>QF@<#`+W>em2t;N=_xZRNvMi(<89^3Vzrxt z+98Z1cik)=9_HbCyNS3ki0AlXUUXL@*ucY+eL0U=V!J!_u_fi`U;SoYy5}4 z86TiJzpLX+ZR}Cs}LX&+9$o`IbEXx%zu|mi_qYs+_OOP)FVH z)lfez1ot3sfW`s{IjnZFsfA2s_WPE=z^ASNx}|^KvR?(S6|RR>kb)^=og^}ttqo%D z4kE)J%3?G!f3eJ57DM0&bwHg{BoKr$TvrBb_(9f1f`%Xr+7Fa6G+vn}f+=ia_aOE? z6N>MInTyYBa(2VmU9ehH8`hPV&>CusNd96h;}3!A1WX^Bo#Ua*uF92o1)$x9k6 z=PD3wpQR?6(OA`UQ+$#rAMzN`WQs7LIW^|FcAC?jGSmhu-4mQF8dG^rsvnqT z%>m+Id9O(-JdX;~c`~(CPEFQ0vzXI^7Ib9_6>C{{D$U%5N&+oC(n}*6&#ihYrZzR8 z_NJB4ZQ&Jz4%DmhVz*bk@=UPS0<1t)8mjk1b+LB!>G-x7P_v#jvLak)Bb#9_3OE*n zRdgm=!+KCHb~d3eltWbf3ckGhm9HryEEF9muEMUCAlunbYFCC@*0K<=|4JxpD;8Vb z4v&y+C}CK`{)$$#PS&&0Ol~(msaejN6tc{9CTIsLUCS~`Sc^^MRPUu%k_9%lyX6^c z^T%7)3ir7}GY>6tOJ4L2mb~J%7Px#H-}|yMDc*f$Zn}HT7ud;(0n4s|lN;IVX7Rw3 z8GW*?0Co;FtP#h#N-nX>nABDDoXs> zrJ|XpDJNOa4^#RUlWe1Wk0{BI$lPM9lqk!QQY(Z<66N^}assR3B>ig4pDnr9#MpV1 zS_Vx1Tps6{RPGIqZmwe+Q>ALHgWggMQFZ9!#29N-PI9ARmgVgD(l+Ms6`(I&gEN<+ zSA9MYq~jImjr63=rQMj7#fX#XYC>t9FQ}WGr{DzBpOg-?tA7pb zWuax*zf!cZ*@bK&2m3F~1~RXkXzMFSM$Pt^SEMzwi)haW)&kx$x9Pmw_%Y5cEuer@{j`Ja$ l>wM=t@43%^4)mZ4edt6ly3vo0^rS0&=}d3B(-~3#06TV5otyvw literal 0 HcmV?d00001 diff --git a/examples/CMakeTests.cmake b/examples/CMakeTests.cmake index 30f73c436b2..e2cd8266db0 100644 --- a/examples/CMakeTests.cmake +++ b/examples/CMakeTests.cmake @@ -117,8 +117,8 @@ if (H5_HAVE_PARALLEL AND HDF5_TEST_PARALLEL AND NOT WIN32) add_test (NAME MPI_TEST_EXAMPLES-${parallel_example} COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${NUMPROCS} ${MPIEXEC_PREFLAGS} $ ${MPIEXEC_POSTFLAGS}) else () add_test (NAME MPI_TEST_EXAMPLES-${parallel_example} COMMAND "${CMAKE_COMMAND}" - -D "TEST_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};${NUMPROCS};${MPIEXEC_PREFLAGS};$;${MPIEXEC_POSTFLAGS}" - -D "TEST_ARGS:STRING=" + -D "TEST_PROGRAM=${MPIEXEC_EXECUTABLE}" + -D "TEST_ARGS:STRING=${MPIEXEC_NUMPROC_FLAG};${NUMPROCS};${MPIEXEC_PREFLAGS};$;${MPIEXEC_POSTFLAGS}" -D "TEST_EXPECT=0" -D "TEST_SKIP_COMPARE=TRUE" -D "TEST_OUTPUT=${parallel_example}.out" diff --git a/java/examples/datasets/CMakeLists.txt b/java/examples/datasets/CMakeLists.txt index 6ed03cabce0..7542e8e1288 100644 --- a/java/examples/datasets/CMakeLists.txt +++ b/java/examples/datasets/CMakeLists.txt @@ -80,7 +80,7 @@ endforeach () if (BUILD_TESTING AND HDF5_TEST_EXAMPLES AND HDF5_TEST_SERIAL) get_property (target_name TARGET ${HDF5_JAVA_JNI_LIB_TARGET} PROPERTY OUTPUT_NAME) - set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=${target_name}$<$:${CMAKE_DEBUG_POSTFIX}>;") + set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=${target_name}$<$,$>:${CMAKE_DEBUG_POSTFIX}>;") set (last_test "") foreach (example ${HDF_JAVA_EXAMPLES}) diff --git a/tools/test/h5diff/CMakeTests.cmake b/tools/test/h5diff/CMakeTests.cmake index 7e437af09ca..ccb938088f4 100644 --- a/tools/test/h5diff/CMakeTests.cmake +++ b/tools/test/h5diff/CMakeTests.cmake @@ -422,8 +422,8 @@ add_test ( NAME MPI_TEST_H5DIFF-${resultfile} COMMAND "${CMAKE_COMMAND}" - -D "TEST_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};${MPIEXEC_MAX_NUMPROCS};${MPIEXEC_PREFLAGS};$;${MPIEXEC_POSTFLAGS}" - -D "TEST_ARGS:STRING=${ARGN}" + -D "TEST_PROGRAM=${MPIEXEC_EXECUTABLE}" + -D "TEST_ARGS:STRING=${MPIEXEC_NUMPROC_FLAG};${MPIEXEC_MAX_NUMPROCS};${MPIEXEC_PREFLAGS};$;${MPIEXEC_POSTFLAGS};${ARGN}" -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/PAR/testfiles" -D "TEST_OUTPUT=${resultfile}.out" -D "TEST_EXPECT=0" diff --git a/tools/test/h5dump/CMakeTests.cmake b/tools/test/h5dump/CMakeTests.cmake index 0ae7bbdb3ab..cdc3be83bdf 100644 --- a/tools/test/h5dump/CMakeTests.cmake +++ b/tools/test/h5dump/CMakeTests.cmake @@ -580,7 +580,7 @@ ) add_test ( NAME H5DUMP-${resultfile}-output-cmp - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${resultfile}.txt ${resultfile}.exp + COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_IGNORE_EOL} ${resultfile}.txt ${resultfile}.exp ) set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES DEPENDS H5DUMP-${resultfile} @@ -645,7 +645,7 @@ ) add_test ( NAME H5DUMP-${resultfile}-output-cmp - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${resultfile}.txt ${resultfile}.exp + COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_IGNORE_EOL} ${resultfile}.txt ${resultfile}.exp ) set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES DEPENDS H5DUMP-${resultfile} @@ -653,7 +653,7 @@ ) add_test ( NAME H5DUMP-${resultfile}-output-cmp-ddl - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${ddlfile}.txt ${ddlfile}.exp + COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_IGNORE_EOL} ${ddlfile}.txt ${ddlfile}.exp ) set_tests_properties (H5DUMP-${resultfile}-output-cmp-ddl PROPERTIES DEPENDS H5DUMP-${resultfile}-output-cmp @@ -699,7 +699,7 @@ ) add_test ( NAME H5DUMP-output-cmp-${resultfile} - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${resultfile}.txt ${resultfile}.exp + COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_IGNORE_EOL} ${resultfile}.txt ${resultfile}.exp ) set_tests_properties (H5DUMP-output-cmp-${resultfile} PROPERTIES DEPENDS H5DUMP-output-${resultfile} diff --git a/tools/test/misc/CMakeTestsClear.cmake b/tools/test/misc/CMakeTestsClear.cmake index 5e307aa3fcc..a5549724cf4 100644 --- a/tools/test/misc/CMakeTestsClear.cmake +++ b/tools/test/misc/CMakeTestsClear.cmake @@ -99,6 +99,10 @@ -D "TEST_REFERENCE=${resultfile}.ddl" -P "${HDF_RESOURCES_DIR}/runTest.cmake" ) + if (last_test) + set_tests_properties (H5CLEAR_CMP-${testname} PROPERTIES DEPENDS ${last_test}) + endif () + set (last_test "H5CLEAR_CMP-${testname}") endif () endmacro () @@ -117,6 +121,10 @@ -D "TEST_ERRREF=${resultfile}.err" -P "${HDF_RESOURCES_DIR}/runTest.cmake" ) + if (last_test) + set_tests_properties (H5CLEAR_CMP-${testname} PROPERTIES DEPENDS ${last_test}) + endif () + set (last_test "H5CLEAR_CMP-${testname}") endif () endmacro ()