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/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 9d07bc3..023fd2c 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 " --parallel, -j 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 ;; + -j|--parallel) parallel_jobs="$2"; shift ;; *) echo "Unknown parameter passed: $1"; exit 1 ;; esac shift @@ -319,6 +310,15 @@ else fi mkdir -p "${cmake_install_dir}" +if [[ -z "${parallel_jobs}" ]]; then + 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 # @@ -336,6 +336,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} ) 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