From 5864241091216150ef4d71fc1e48a5a2b88d5a40 Mon Sep 17 00:00:00 2001 From: Marco van Hulten Date: Fri, 15 Aug 2025 13:28:57 +0200 Subject: [PATCH 01/10] Enable CMake parallel build For components using the CMake build tool; tested with ParFlow. Four threads appears to be the sweet spot. Walltimes (ParFlow only): -j 1 -> 164 s -j 2 -> 100 s -j 4 -> 64 s -j 8 -> 50 s --- build_tsmp2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_tsmp2.sh b/build_tsmp2.sh index 9d07bc3..a942ece 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -349,7 +349,7 @@ message "== CMAKE GENERATE PROJECT finished" message "CMAKE build:" message "cmake --build ${cmake_build_dir} |& tee -a $build_log" message "== CMAKE BUILD start" -cmake --build ${cmake_build_dir} |& tee -a $build_log +cmake --build ${cmake_build_dir} --parallel 4 |& tee -a $build_log message "== CMAKE BUILD finished" message "CMAKE install:" From bb2377473df174c60a74445c991f70e94e82d9bf Mon Sep 17 00:00:00 2001 From: Marco van Hulten Date: Mon, 18 Aug 2025 16:14:19 +0200 Subject: [PATCH 02/10] Revert "Enable CMake parallel build" This reverts commit 7c7b3032eb5fa8fb0332b7e91086800d3bcb398e, because it would pose a problem for coupled builds. --- build_tsmp2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_tsmp2.sh b/build_tsmp2.sh index a942ece..9d07bc3 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -349,7 +349,7 @@ message "== CMAKE GENERATE PROJECT finished" message "CMAKE build:" message "cmake --build ${cmake_build_dir} |& tee -a $build_log" message "== CMAKE BUILD start" -cmake --build ${cmake_build_dir} --parallel 4 |& tee -a $build_log +cmake --build ${cmake_build_dir} |& tee -a $build_log message "== CMAKE BUILD finished" message "CMAKE install:" From 8d3995ddd169c02da705cccc6e924f2e411a42c2 Mon Sep 17 00:00:00 2001 From: Marco van Hulten Date: Mon, 18 Aug 2025 16:56:46 +0200 Subject: [PATCH 03/10] Enable CMake parallel build as a user option Resolves: #62, #89 --- build_tsmp2.sh | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/build_tsmp2.sh b/build_tsmp2.sh index 9d07bc3..1d1b67f 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -41,17 +41,7 @@ function help_tsmp2() { echo " --install_dir Set install dir cmake, if not set bin/_ is used. Model executables and libraries will be installed here" echo " --clean_first Delete build_dir if it already exists" echo " --env Set model environment." - echo " --version Print $0 scipt version" - echo " -q, --quiet Write less output during shell execution" - echo " -v, --verbose Enable verbose output from Makefile builds using CMAKE_VERBOSE_MAKEFILE" - echo "" - echo "Examples:" - echo "" - echo " ./build_tsmp2.sh icon eclm parflow" - echo " ./build_tsmp2.sh eclm parflowGPU" - echo " ./build_tsmp2.sh iconGPU" - echo " ./build_tsmp2.sh icon eclm" - echo " ./build_tsmp2.sh eclm pdaf" + echo " --max_jobs Set the maximum number of jobs to build the code, if not set compilation is serial." echo "" exit 1 } @@ -144,6 +134,7 @@ while [[ "$#" -gt 0 ]]; do --build_dir) build_dir="$2"; shift ;; --install_dir) install_dir="$2"; shift ;; --env) env="$2"; shift ;; + --max_jobs) max_jobs="$2"; shift ;; *) echo "Unknown parameter passed: $1"; exit 1 ;; esac shift @@ -319,6 +310,8 @@ else fi mkdir -p "${cmake_install_dir}" +cmake_max_jobs="${max_jobs:-1}" + # # 5. CMake configure # @@ -347,7 +340,7 @@ message "== CMAKE GENERATE PROJECT finished" # 6. CMake build and install # message "CMAKE build:" -message "cmake --build ${cmake_build_dir} |& tee -a $build_log" +message "cmake --build ${cmake_build_dir} --parallel ${cmake_max_jobs} |& tee -a $build_log" message "== CMAKE BUILD start" cmake --build ${cmake_build_dir} |& tee -a $build_log message "== CMAKE BUILD finished" From ab916e19e211430c5127e821bafee72851dd8080 Mon Sep 17 00:00:00 2001 From: Marco van Hulten Date: Mon, 18 Aug 2025 17:31:41 +0200 Subject: [PATCH 04/10] Fixed the last commit --- build_tsmp2.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build_tsmp2.sh b/build_tsmp2.sh index 1d1b67f..a563b6b 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -310,7 +310,9 @@ else fi mkdir -p "${cmake_install_dir}" -cmake_max_jobs="${max_jobs:-1}" +if [ -v max_jobs ]; then + export CMAKE_BUILD_PARALLEL_LEVEL=${max_jobs} +fi # # 5. CMake configure @@ -340,7 +342,7 @@ message "== CMAKE GENERATE PROJECT finished" # 6. CMake build and install # message "CMAKE build:" -message "cmake --build ${cmake_build_dir} --parallel ${cmake_max_jobs} |& tee -a $build_log" +message "cmake --build ${cmake_build_dir} |& tee -a $build_log" message "== CMAKE BUILD start" cmake --build ${cmake_build_dir} |& tee -a $build_log message "== CMAKE BUILD finished" From 81b177817ca1b3f75ba194c9ea40d42218b13dcf Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 7 Oct 2026 10:11:16 +0200 Subject: [PATCH 05/10] build_tsmp2: Introduced -j/--parallel switch --- CMakeLists.txt | 8 ++++--- build_tsmp2.sh | 10 ++++---- cmake/BuildICON.cmake | 2 +- cmake/BuildOASIS3MCT.cmake | 2 +- cmake/BuildPDAF.cmake | 2 +- cmake/BuildPDAFFRAMEWORK.cmake | 2 +- cmake/BuildPDAFMODEL.cmake | 2 +- cmake/BuildParFlow.cmake | 44 ++++++++++++++++++---------------- cmake/BuildeCLM.cmake | 4 +--- 9 files changed, 39 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 90ad5fe..601cab6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.21.1) +cmake_minimum_required (VERSION 3.29.3) project(TSMP2 LANGUAGES C CXX Fortran) include(ExternalProject) @@ -24,6 +24,10 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "DEBUG" "RELEASE") endif() +if(NOT DEFINED PARALLEL_JOBS) + set(PARALLEL_JOBS "1" CACHE STRING "Number of parallel make jobs for building model components." FORCE) +endif() + # init CMAKE internal variables string(TOUPPER $ENV{SYSTEMNAME} SYSTEMNAME) set(MODEL_ID "") @@ -144,5 +148,3 @@ if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) endif() print_model_versions("${COMPONENT_MODELS}" "${TSMP2_MODEL_VERSIONS}") - -#message(FATAL_ERROR "at the end of script") diff --git a/build_tsmp2.sh b/build_tsmp2.sh index a563b6b..9b8bd7a 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -41,7 +41,7 @@ function help_tsmp2() { echo " --install_dir Set install dir cmake, if not set bin/_ is used. Model executables and libraries will be installed here" echo " --clean_first Delete build_dir if it already exists" echo " --env Set model environment." - echo " --max_jobs Set the maximum number of jobs to build the code, if not set compilation is serial." + echo " --parallel, -j Set the maximum number of jobs to build the code, if not set compilation is serial." echo "" exit 1 } @@ -134,7 +134,7 @@ while [[ "$#" -gt 0 ]]; do --build_dir) build_dir="$2"; shift ;; --install_dir) install_dir="$2"; shift ;; --env) env="$2"; shift ;; - --max_jobs) max_jobs="$2"; shift ;; + -j|--parallel) parallel_jobs="$2"; shift ;; *) echo "Unknown parameter passed: $1"; exit 1 ;; esac shift @@ -310,10 +310,9 @@ else fi mkdir -p "${cmake_install_dir}" -if [ -v max_jobs ]; then - export CMAKE_BUILD_PARALLEL_LEVEL=${max_jobs} +if [[ -z "${parallel_jobs}" ]]; then + parallel_jobs=1 fi - # # 5. CMake configure # @@ -331,6 +330,7 @@ cmake_conf="-S ${cmake_tsmp2_dir} -B ${cmake_build_dir}" cmake_conf+=" -DCMAKE_BUILD_TYPE=${cmake_build_type}" cmake_conf+=" -DCMAKE_INSTALL_PREFIX=${cmake_install_dir}" cmake_conf+=" -DCMAKE_VERBOSE_MAKEFILE=${cmake_verbose_makefile}" +cmake_conf+=" -DPARALLEL_JOBS=${parallel_jobs}" cmake_conf+=" ${cmake_comp_str}" cmake_conf+=" ${cmake_compsrc_str}" message "cmake ${cmake_conf}" |& tee "${build_log}" diff --git a/cmake/BuildICON.cmake b/cmake/BuildICON.cmake index 12867db..adea7ba 100644 --- a/cmake/BuildICON.cmake +++ b/cmake/BuildICON.cmake @@ -144,7 +144,7 @@ ExternalProject_Add(ICON MPI_LAUNCH=${MPIEXEC_EXECUTABLE} --prefix=${CMAKE_INSTALL_PREFIX} ${EXTRA_CONFIG_ARGS} - BUILD_COMMAND make -j8 install + BUILD_COMMAND make -j ${PARALLEL_JOBS} install INSTALL_COMMAND "" BUILD_ALWAYS YES DEPENDS ${MODEL_DEPENDENCIES} diff --git a/cmake/BuildOASIS3MCT.cmake b/cmake/BuildOASIS3MCT.cmake index c66840f..7ad86c9 100644 --- a/cmake/BuildOASIS3MCT.cmake +++ b/cmake/BuildOASIS3MCT.cmake @@ -24,7 +24,7 @@ file(APPEND ${OASIS_MAKE_INC} "ARCHDIR = ${OASIS_INSTALL_PREFIX}\n") file(APPEND ${OASIS_MAKE_INC} "NETCDF_INCLUDE = ${NetCDF_F90_ROOT}/include\n") file(APPEND ${OASIS_MAKE_INC} "NETCDF_LIBRARY = ${NetCDF_LIBRARIES}\n") file(APPEND ${OASIS_MAKE_INC} "MPI_INCLUDE = ${MPI_Fortran_INCLUDE_DIRS}\n") -file(APPEND ${OASIS_MAKE_INC} "MAKE = make\n") +file(APPEND ${OASIS_MAKE_INC} "MAKE = make -j ${PARALLEL_JOBS}\n") file(APPEND ${OASIS_MAKE_INC} "F90 = ${CMAKE_Fortran_COMPILER}\n") file(APPEND ${OASIS_MAKE_INC} "F = $(F90)\n") file(APPEND ${OASIS_MAKE_INC} "f90 = $(F90)\n") diff --git a/cmake/BuildPDAF.cmake b/cmake/BuildPDAF.cmake index a653e44..7d39088 100644 --- a/cmake/BuildPDAF.cmake +++ b/cmake/BuildPDAF.cmake @@ -279,7 +279,7 @@ ExternalProject_Add(PDAF SOURCE_DIR ${PDAF_SRC} BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAF_ENV_VARS} clean directories libpdaf + BUILD_COMMAND make ${PDAF_ENV_VARS} clean directories libpdaf -j ${PARALLEL_JOBS} INSTALL_COMMAND "" DEPENDS ${PDAF_DEPENDENCIES} ) diff --git a/cmake/BuildPDAFFRAMEWORK.cmake b/cmake/BuildPDAFFRAMEWORK.cmake index 81652f8..a76202d 100644 --- a/cmake/BuildPDAFFRAMEWORK.cmake +++ b/cmake/BuildPDAFFRAMEWORK.cmake @@ -34,7 +34,7 @@ ExternalProject_Add(PDAF-Framework SOURCE_DIR ${PDAF_SRC}/interface/framework BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAFFRAMEWORK_ENV_VARS} clean all + BUILD_COMMAND make ${PDAFFRAMEWORK_ENV_VARS} clean all -j ${PARALLEL_JOBS} INSTALL_COMMAND "" DEPENDS PDAF-Model ) diff --git a/cmake/BuildPDAFMODEL.cmake b/cmake/BuildPDAFMODEL.cmake index 49345e6..f92fafa 100644 --- a/cmake/BuildPDAFMODEL.cmake +++ b/cmake/BuildPDAFMODEL.cmake @@ -214,7 +214,7 @@ ExternalProject_Add(PDAF-Model SOURCE_DIR ${PDAF_SRC}/interface/model BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAFMODEL_ENV_VARS} clean all + BUILD_COMMAND make ${PDAFMODEL_ENV_VARS} clean all -j ${PARALLEL_JOBS} INSTALL_COMMAND "" DEPENDS PDAF ) diff --git a/cmake/BuildParFlow.cmake b/cmake/BuildParFlow.cmake index 8171145..4f5531d 100644 --- a/cmake/BuildParFlow.cmake +++ b/cmake/BuildParFlow.cmake @@ -77,27 +77,29 @@ endif() # Pass options to ParFlow CMake ExternalProject_Add(ParFlow - PREFIX ParFlow - SOURCE_DIR ${PARFLOW_SRC} - CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_C_FLAGS=${PF_CFLAGS} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} - -DCMAKE_Fortran_FLAGS=${PF_FFLAGS} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DPARFLOW_ENABLE_HYPRE=ON - -DPARFLOW_ENABLE_NETCDF=ON - -DPARFLOW_AMPS_SEQUENTIAL_IO=ON - -DPARFLOW_ENABLE_TIMING=TRUE - -DPARFLOW_ACCELERATOR_BACKEND=${PF_ACC_BACKEND} - -DMPIEXEC_EXECUTABLE=${MPIEXEC_EXECUTABLE} - -DMPIEXEC_NUMPROC_FLAG=${MPIEXEC_NUMPROC_FLAG} - -DPARFLOW_ENABLE_SLURM=${ENABLE_SLURM} - ${PF_UMPIRE_FLAG} - ${PF_SUNDIALS_FLAG} - ${PF_CLM_FLAGS} - DEPENDS ${MODEL_DEPENDENCIES} + PREFIX ParFlow + SOURCE_DIR ${PARFLOW_SRC} + CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${PF_CFLAGS} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} + -DCMAKE_Fortran_FLAGS=${PF_FFLAGS} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DPARFLOW_ENABLE_HYPRE=ON + -DPARFLOW_ENABLE_NETCDF=ON + -DPARFLOW_AMPS_SEQUENTIAL_IO=ON + -DPARFLOW_ENABLE_TIMING=TRUE + -DPARFLOW_ACCELERATOR_BACKEND=${PF_ACC_BACKEND} + -DMPIEXEC_EXECUTABLE=${MPIEXEC_EXECUTABLE} + -DMPIEXEC_NUMPROC_FLAG=${MPIEXEC_NUMPROC_FLAG} + -DPARFLOW_ENABLE_SLURM=${ENABLE_SLURM} + ${PF_UMPIRE_FLAG} + ${PF_SUNDIALS_FLAG} + ${PF_CLM_FLAGS} + BUILD_COMMAND make -j ${PARALLEL_JOBS} install + INSTALL_COMMAND "" + DEPENDS ${MODEL_DEPENDENCIES} ) get_model_version(${PARFLOW_SRC} PARFLOW_VERSION) diff --git a/cmake/BuildeCLM.cmake b/cmake/BuildeCLM.cmake index 42f0f64..28ca83e 100644 --- a/cmake/BuildeCLM.cmake +++ b/cmake/BuildeCLM.cmake @@ -26,9 +26,7 @@ ExternalProject_Add(eCLM ${COUP_OAS_FLAGS} ${PDAF_FLAGS} BUILD_ALWAYS YES - BUILD_COMMAND "" # This needs to be empty to avoid building eCLM twice. - # This happens because INSTALL_COMMAND triggers rebuild - # which is abnormal. This is a problem in eCLM and should be fixed. + BUILD_COMMAND make -j ${PARALLEL_JOBS} install DEPENDS ${MODEL_DEPENDENCIES} ) From 21c93240a371a054410497d004bc06a422e0f76c Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 7 Oct 2026 10:34:31 +0200 Subject: [PATCH 06/10] Implemented TSMP2_PARALLEL_JOBS in env files --- .github/workflows/CI.yml | 13 +++++++------ build_tsmp2.sh | 8 +++++++- env/jsc.2025.gnu.openmpi | 1 + env/jsc.2025.gnu.psmpi | 1 + env/jsc.2025.intel.psmpi | 1 + env/jsc.2026.gnu.openmpi | 1 + env/jsc.2026.nvhpc.openmpi | 1 + env/ubuntu.gnu.openmpi | 1 + env/uni-bonn.gnu.openmpi | 1 + 9 files changed, 21 insertions(+), 7 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index a71a236..25ab893 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -69,6 +69,7 @@ jobs: VER_ECCODES: 2.40.0 VER_OASIS: tsmp-patches-v0.1 VER_ICON_UPSTREAM: release-2026.04-public + MAKE_JOBS: 4 steps: - uses: actions/checkout@v4 @@ -131,7 +132,7 @@ jobs: export CPPFLAGS=-I/usr/include/hdf5/openmpi export LDFLAGS=-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi ./configure --prefix=${DEPENDENCIES_ROOT}/netcdf-c-${VER_NETCDF_C} - make -j4 install + make -j${MAKE_JOBS} install # Verify tree -L 2 ${DEPENDENCIES_ROOT}/netcdf-c-${VER_NETCDF_C} @@ -166,7 +167,7 @@ jobs: export CPPFLAGS=-I${DEPENDENCIES_ROOT}/netcdf-c-${VER_NETCDF_C}/include export LDFLAGS=-L${DEPENDENCIES_ROOT}/netcdf-c-${VER_NETCDF_C}/lib ./configure --prefix=${DEPENDENCIES_ROOT}/netcdf-f90-${VER_NETCDF_F90} - make -j4 install + make -j${MAKE_JOBS} install # Verify tree -L 2 ${DEPENDENCIES_ROOT}/netcdf-f90-${VER_NETCDF_F90} @@ -204,7 +205,7 @@ jobs: -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \ -DMPI_INCLUDE_DIR="${MPI_HOME}/include" \ -DHYPRE_ENABLE_OPENMP="ON" - cmake --build bld --parallel 4 + cmake --build bld --parallel ${MAKE_JOBS} cmake --install bld # Verify @@ -243,7 +244,7 @@ jobs: -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \ -DMPI_INCLUDE_DIR="${MPI_HOME}/include" \ -DHYPRE_ENABLE_CUDA="ON" - cmake --build bld --parallel 4 + cmake --build bld --parallel ${MAKE_JOBS} cmake --install bld # Verify @@ -278,7 +279,7 @@ jobs: # Install cmake -S . -B bld -DCMAKE_INSTALL_PREFIX=${DEPENDENCIES_ROOT}/eccodes-${VER_ECCODES} - cmake --build bld --parallel 4 + cmake --build bld --parallel ${MAKE_JOBS} cmake --install bld # Verify @@ -471,7 +472,7 @@ jobs: if [[ "${{ matrix.config.name }}" == "ICON standalone" ]]; then MODEL_OPTS="${MODEL_OPTS} --ICON_SRC ${TSMP2_ROOT}/models/icon-model" fi - BUILD_TSMP2_CMD="./build_tsmp2.sh ${MODEL_OPTS} --no_update" + BUILD_TSMP2_CMD="./build_tsmp2.sh ${MODEL_OPTS} --no_update --parallel ${MAKE_JOBS}" echo $BUILD_TSMP2_CMD && echo "" eval $BUILD_TSMP2_CMD diff --git a/build_tsmp2.sh b/build_tsmp2.sh index 9b8bd7a..023fd2c 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -311,8 +311,14 @@ fi mkdir -p "${cmake_install_dir}" if [[ -z "${parallel_jobs}" ]]; then - parallel_jobs=1 + if [[ ! -z "${TSMP2_PARALLEL_JOBS}" ]]; then + parallel_jobs=${TSMP2_PARALLEL_JOBS} + else + parallel_jobs=1 + fi fi +message "Parallel make jobs set to ${parallel_jobs}" + # # 5. CMake configure # diff --git a/env/jsc.2025.gnu.openmpi b/env/jsc.2025.gnu.openmpi index b74707e..a3e705f 100644 --- a/env/jsc.2025.gnu.openmpi +++ b/env/jsc.2025.gnu.openmpi @@ -61,6 +61,7 @@ export FC=mpif90 export CXX=mpicxx export MPI_HOME=$EBROOTOPENMPI export MPIEXEC_EXECUTABLE=$(which srun) +export TSMP2_PARALLEL_JOBS=16 # Display compiler settings module list diff --git a/env/jsc.2025.gnu.psmpi b/env/jsc.2025.gnu.psmpi index 2776ccf..fc7c8ba 100644 --- a/env/jsc.2025.gnu.psmpi +++ b/env/jsc.2025.gnu.psmpi @@ -57,6 +57,7 @@ export CC=mpicc export FC=mpif90 export CXX=mpicxx export MPI_HOME=$EBROOTPSMPI +export TSMP2_PARALLEL_JOBS=16 # Display compiler settings module list diff --git a/env/jsc.2025.intel.psmpi b/env/jsc.2025.intel.psmpi index 710f41f..ec424cd 100644 --- a/env/jsc.2025.intel.psmpi +++ b/env/jsc.2025.intel.psmpi @@ -67,6 +67,7 @@ export FC=mpif90 export CXX=mpicxx export MPI_HOME=$EBROOTPSMPI export MPIEXEC_EXECUTABLE=$(which srun) +export TSMP2_PARALLEL_JOBS=16 # Display compiler settings module list diff --git a/env/jsc.2026.gnu.openmpi b/env/jsc.2026.gnu.openmpi index d006c93..c09c171 100644 --- a/env/jsc.2026.gnu.openmpi +++ b/env/jsc.2026.gnu.openmpi @@ -60,6 +60,7 @@ export CXX=mpicxx export MPI_HOME=$EBROOTOPENMPI export UMPIRE_ROOT=$EBROOTUMPIRE export SUNDIALS_ROOT=$EBROOTSUNDIALS +export TSMP2_PARALLEL_JOBS=16 # Display compiler settings module list diff --git a/env/jsc.2026.nvhpc.openmpi b/env/jsc.2026.nvhpc.openmpi index 8196102..0606c81 100644 --- a/env/jsc.2026.nvhpc.openmpi +++ b/env/jsc.2026.nvhpc.openmpi @@ -53,6 +53,7 @@ export CUDACXX=nvcc export MPI_HOME=$EBROOTOPENMPI export UMPIRE_ROOT=$EBROOTUMPIRE export SUNDIALS_ROOT=$EBROOTSUNDIALS +export TSMP2_PARALLEL_JOBS=16 # Display compiler settings module list diff --git a/env/ubuntu.gnu.openmpi b/env/ubuntu.gnu.openmpi index 4875ecf..16fcda7 100644 --- a/env/ubuntu.gnu.openmpi +++ b/env/ubuntu.gnu.openmpi @@ -13,6 +13,7 @@ export MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi export MPIEXEC_EXECUTABLE=$(which srun) export SYSTEMNAME="UBUNTU" export STAGE=$(lsb_release -sr) +export TSMP2_PARALLEL_JOBS=8 # ParFlow additional libraries if [[ "$1" == "--parflowgpu" ]]; then diff --git a/env/uni-bonn.gnu.openmpi b/env/uni-bonn.gnu.openmpi index a3be772..47e6895 100644 --- a/env/uni-bonn.gnu.openmpi +++ b/env/uni-bonn.gnu.openmpi @@ -42,6 +42,7 @@ export FC=mpif90 export CXX=mpicxx export MPI_HOME=$EBROOTOPENMPI export MPIEXEC_EXECUTABLE=$(which mpirun) +export TSMP2_PARALLEL_JOBS=8 # Display compiler settings module list From 05a72552e07816ef8bbbb35b246ca3b5d27fa590 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 7 Oct 2026 13:08:16 +0200 Subject: [PATCH 07/10] PDAF fails to build in parallel. --- cmake/BuildPDAF.cmake | 2 +- cmake/BuildPDAFFRAMEWORK.cmake | 2 +- cmake/BuildPDAFMODEL.cmake | 2 +- cmake/BuildeCLM.cmake | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmake/BuildPDAF.cmake b/cmake/BuildPDAF.cmake index 7d39088..a653e44 100644 --- a/cmake/BuildPDAF.cmake +++ b/cmake/BuildPDAF.cmake @@ -279,7 +279,7 @@ ExternalProject_Add(PDAF SOURCE_DIR ${PDAF_SRC} BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAF_ENV_VARS} clean directories libpdaf -j ${PARALLEL_JOBS} + BUILD_COMMAND make ${PDAF_ENV_VARS} clean directories libpdaf INSTALL_COMMAND "" DEPENDS ${PDAF_DEPENDENCIES} ) diff --git a/cmake/BuildPDAFFRAMEWORK.cmake b/cmake/BuildPDAFFRAMEWORK.cmake index a76202d..7f4359e 100644 --- a/cmake/BuildPDAFFRAMEWORK.cmake +++ b/cmake/BuildPDAFFRAMEWORK.cmake @@ -34,7 +34,7 @@ ExternalProject_Add(PDAF-Framework SOURCE_DIR ${PDAF_SRC}/interface/framework BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAFFRAMEWORK_ENV_VARS} clean all -j ${PARALLEL_JOBS} + BUILD_COMMAND make ${PDAFFRAMEWORK_ENV_VARS} clean all INSTALL_COMMAND "" DEPENDS PDAF-Model ) diff --git a/cmake/BuildPDAFMODEL.cmake b/cmake/BuildPDAFMODEL.cmake index f92fafa..aafd14a 100644 --- a/cmake/BuildPDAFMODEL.cmake +++ b/cmake/BuildPDAFMODEL.cmake @@ -214,7 +214,7 @@ ExternalProject_Add(PDAF-Model SOURCE_DIR ${PDAF_SRC}/interface/model BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAFMODEL_ENV_VARS} clean all -j ${PARALLEL_JOBS} + BUILD_COMMAND make ${PDAFMODEL_ENV_VARS} clean all INSTALL_COMMAND "" DEPENDS PDAF ) diff --git a/cmake/BuildeCLM.cmake b/cmake/BuildeCLM.cmake index 28ca83e..d11854a 100644 --- a/cmake/BuildeCLM.cmake +++ b/cmake/BuildeCLM.cmake @@ -26,7 +26,8 @@ ExternalProject_Add(eCLM ${COUP_OAS_FLAGS} ${PDAF_FLAGS} BUILD_ALWAYS YES - BUILD_COMMAND make -j ${PARALLEL_JOBS} install + BUILD_COMMAND "" + INSTALL_COMMAND make -j ${PARALLEL_JOBS} install DEPENDS ${MODEL_DEPENDENCIES} ) From c44170968f01cc530724dedcc263dba10cb7a0e9 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 7 Oct 2026 13:09:27 +0200 Subject: [PATCH 08/10] Downgrade min CMake version to 3.28; added GitHub CI debugging statements --- .github/workflows/CI.yml | 6 ++++++ CMakeLists.txt | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 25ab893..75e37b4 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -476,6 +476,12 @@ jobs: echo $BUILD_TSMP2_CMD && echo "" eval $BUILD_TSMP2_CMD + - if: always() && matrix.config.name == 'ICON-eCLM-ParFlow' + name: Debug ICON-eCLM-Parflow failure + run: | + cat /home/runner/work/TSMP2/TSMP2/bld/UBUNTU_ICON-eCLM-ParFlow/OASIS3_MCT/bld/COMP.log + cat /home/runner/work/TSMP2/TSMP2/bld/UBUNTU_ICON-eCLM-ParFlow/OASIS3_MCT/bld/COMP.err + - name: Check installed binaries working-directory: ${{ env.TSMP2_ROOT }}/bin run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 601cab6..d077b8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.29.3) +cmake_minimum_required (VERSION 3.28) project(TSMP2 LANGUAGES C CXX Fortran) include(ExternalProject) From 78db77d482f1ea89a59b05c764ae481b431c36e5 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 7 Oct 2026 13:32:30 +0200 Subject: [PATCH 09/10] BuildOASIS3MCT: parallel jobs should be passed to top-level make command --- .github/workflows/CI.yml | 6 ------ cmake/BuildOASIS3MCT.cmake | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 75e37b4..25ab893 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -476,12 +476,6 @@ jobs: echo $BUILD_TSMP2_CMD && echo "" eval $BUILD_TSMP2_CMD - - if: always() && matrix.config.name == 'ICON-eCLM-ParFlow' - name: Debug ICON-eCLM-Parflow failure - run: | - cat /home/runner/work/TSMP2/TSMP2/bld/UBUNTU_ICON-eCLM-ParFlow/OASIS3_MCT/bld/COMP.log - cat /home/runner/work/TSMP2/TSMP2/bld/UBUNTU_ICON-eCLM-ParFlow/OASIS3_MCT/bld/COMP.err - - name: Check installed binaries working-directory: ${{ env.TSMP2_ROOT }}/bin run: | diff --git a/cmake/BuildOASIS3MCT.cmake b/cmake/BuildOASIS3MCT.cmake index 7ad86c9..0dcbfab 100644 --- a/cmake/BuildOASIS3MCT.cmake +++ b/cmake/BuildOASIS3MCT.cmake @@ -24,7 +24,7 @@ file(APPEND ${OASIS_MAKE_INC} "ARCHDIR = ${OASIS_INSTALL_PREFIX}\n") file(APPEND ${OASIS_MAKE_INC} "NETCDF_INCLUDE = ${NetCDF_F90_ROOT}/include\n") file(APPEND ${OASIS_MAKE_INC} "NETCDF_LIBRARY = ${NetCDF_LIBRARIES}\n") file(APPEND ${OASIS_MAKE_INC} "MPI_INCLUDE = ${MPI_Fortran_INCLUDE_DIRS}\n") -file(APPEND ${OASIS_MAKE_INC} "MAKE = make -j ${PARALLEL_JOBS}\n") +file(APPEND ${OASIS_MAKE_INC} "MAKE = make\n") file(APPEND ${OASIS_MAKE_INC} "F90 = ${CMAKE_Fortran_COMPILER}\n") file(APPEND ${OASIS_MAKE_INC} "F = $(F90)\n") file(APPEND ${OASIS_MAKE_INC} "f90 = $(F90)\n") @@ -68,7 +68,7 @@ ExternalProject_Add(OASIS3_MCT SOURCE_DIR ${OASIS_SRC} BUILD_IN_SOURCE FALSE CONFIGURE_COMMAND "" - BUILD_COMMAND make -f ${OASIS_SRC}/util/make_dir/TopMakefileOasis3 static-libs -C ${OASIS_BLD_DIR} + BUILD_COMMAND make -j ${PARALLEL_JOBS} -f ${OASIS_SRC}/util/make_dir/TopMakefileOasis3 static-libs -C ${OASIS_BLD_DIR} INSTALL_COMMAND "" ) From f4e6fc6d870ff4a71eb66587b3a1df03baf48b1e Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 7 Oct 2026 13:36:27 +0200 Subject: [PATCH 10/10] Removed unnecessary whitespaces and returned deleted lines in build_tsmp2.sh --- build_tsmp2.sh | 12 +++++++++++- cmake/BuildPDAFFRAMEWORK.cmake | 2 +- cmake/BuildPDAFMODEL.cmake | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/build_tsmp2.sh b/build_tsmp2.sh index 023fd2c..915bf31 100755 --- a/build_tsmp2.sh +++ b/build_tsmp2.sh @@ -41,7 +41,17 @@ function help_tsmp2() { echo " --install_dir Set install dir cmake, if not set bin/_ is used. Model executables and libraries will be installed here" echo " --clean_first Delete build_dir if it already exists" echo " --env Set model environment." - echo " --parallel, -j Set the maximum number of jobs to build the code, if not set compilation is serial." + echo " -j, --parallel Set the maximum number of jobs to build the code, if not set compilation is serial." + echo " -q, --quiet Write less output during shell execution" + echo " -v, --verbose Enable verbose output from Makefile builds using CMAKE_VERBOSE_MAKEFILE" + echo "" + echo "Examples:" + echo "" + echo " ./build_tsmp2.sh icon eclm parflow" + echo " ./build_tsmp2.sh eclm parflowGPU" + echo " ./build_tsmp2.sh iconGPU" + echo " ./build_tsmp2.sh icon eclm" + echo " ./build_tsmp2.sh eclm pdaf" echo "" exit 1 } diff --git a/cmake/BuildPDAFFRAMEWORK.cmake b/cmake/BuildPDAFFRAMEWORK.cmake index 7f4359e..81652f8 100644 --- a/cmake/BuildPDAFFRAMEWORK.cmake +++ b/cmake/BuildPDAFFRAMEWORK.cmake @@ -34,7 +34,7 @@ ExternalProject_Add(PDAF-Framework SOURCE_DIR ${PDAF_SRC}/interface/framework BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAFFRAMEWORK_ENV_VARS} clean all + BUILD_COMMAND make ${PDAFFRAMEWORK_ENV_VARS} clean all INSTALL_COMMAND "" DEPENDS PDAF-Model ) diff --git a/cmake/BuildPDAFMODEL.cmake b/cmake/BuildPDAFMODEL.cmake index aafd14a..49345e6 100644 --- a/cmake/BuildPDAFMODEL.cmake +++ b/cmake/BuildPDAFMODEL.cmake @@ -214,7 +214,7 @@ ExternalProject_Add(PDAF-Model SOURCE_DIR ${PDAF_SRC}/interface/model BUILD_IN_SOURCE TRUE CONFIGURE_COMMAND "" - BUILD_COMMAND make ${PDAFMODEL_ENV_VARS} clean all + BUILD_COMMAND make ${PDAFMODEL_ENV_VARS} clean all INSTALL_COMMAND "" DEPENDS PDAF )