Skip to content

Commit

Permalink
Supported Stages/2024 and added a basic CI test (#27)
Browse files Browse the repository at this point in the history
Supported Stages/2024 and added a basic CI test

Summary of changes:

- Added `Stages/2024` environment script `env/jsc.2024_Intel.sh`.
- Added basic CI test for verifying eCLM-ParFlow build on GNU toolchain.
- Updates to the ff. model components, mostly to fix IntelLLVM 2023.2.0 compiler (e.g. `icx`, `ifx`) issues:
  * parflow @ ed39749
  * CLM3.5 @ 15dba17
  * parflow_pdaf @ 24fd719
  * pdaf @ 555d5b4
- Various minor changes to `build_tsmp2.sh`:
  * Align y/n input to the same line as question
  * Only source env file if on JSC or --tsmp2_env is supplied
  * Added flag `-v` for enabling verbose output from Makefile builds
  * Fixed checking for alternative `parflow`
- README updates corresponding to the changes above.

Co-authored-by: Johannes Keller <[email protected]>
Co-authored-by: Johannes Keller <[email protected]>
  • Loading branch information
3 people authored Dec 5, 2024
1 parent 79869ff commit 5b29084
Show file tree
Hide file tree
Showing 17 changed files with 451 additions and 47 deletions.
235 changes: 235 additions & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
name: TSMP2 Build

# Controls when the action will run.
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:
eclm_build_job:
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-22.04 ]
config:
- {
name: "eCLM-ParFlow",
}

env:
CC: mpicc
CXX: mpicxx
FC: mpifort
F77: mpif77
BUILD_DIR: bld
INSTALL_DIR: install
MODEL_DIR: ${{ github.workspace }}/component-models
VER_OASIS: tsmp-patches-v0.1
VER_eCLM: beta-0.1
VER_PARFLOW: ed3974987902ef24c1f7519eb0ba5f8f66380c8c # points to commit "Supported Ubuntu 24.04 and added LLVM to CI"
VER_HYPRE: 2.26.0
VER_NETCDF_C: 4.9.2
VER_NETCDF_F90: 4.6.1
CMAKE_PREFIX_PATH: ${{ github.workspace }}/dependencies
SYSTEMNAME: ${{ matrix.os }}

steps:
- uses: actions/checkout@v4

- name: Install TSMP2 dependencies on Ubuntu
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libxml++2.6-dev pylint wget cmake libpnetcdf-dev tcl-dev tk-dev
version: 1.0
execute_install_scripts: true

- name: Download HDF5 headers and MPI Fortran compiler
run: |
sudo apt-get update
sudo apt-get install gfortran openmpi-bin libopenmpi-dev libhdf5-openmpi-dev libhdf5-openmpi-103 hdf5-helpers
- name: Create directories for component model and dependencies
run: |
mkdir -p ${CMAKE_PREFIX_PATH} ${MODEL_DIR}
#
# NetCDF C
#
- name: Restore cached NetCDF C ${{ env.VER_NETCDF_C }}
uses: actions/cache/restore@v4
id: cache-netcdf-restore
with:
path: ${{ env.CMAKE_PREFIX_PATH }}
key: cache-${{ matrix.config.name }}-${{ env.VER_NETCDF_C }}

- if: steps.cache-netcdf-restore.outputs.cache-hit != 'true'
name: Install NetCDF C ${{ env.VER_NETCDF_C }}
run: |
wget https://github.com/Unidata/netcdf-c/archive/v${VER_NETCDF_C}.tar.gz
tar xf v${VER_NETCDF_C}.tar.gz
cd netcdf-c-${VER_NETCDF_C}
export CPPFLAGS=-I/usr/include/hdf5/openmpi
export LDFLAGS=-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi
./configure --prefix=$(realpath $CMAKE_PREFIX_PATH)
make -j4 install
- if: steps.cache-netcdf-restore.outputs.cache-hit != 'true'
name: Cache NetCDF ${{ env.VER_NETCDF_C }}
uses: actions/cache/save@v4
with:
path: ${{ env.CMAKE_PREFIX_PATH }}
key: cache-${{ matrix.config.name }}-${{ env.VER_NETCDF_C }}

#
# NetCDF Fortran
#
- name: Restore cached NetCDF Fortran ${{ env.VER_NETCDF_F90 }}
uses: actions/cache/restore@v4
id: cache-netcdff90-restore
with:
path: ${{ env.CMAKE_PREFIX_PATH }}
key: cache-${{ matrix.config.name }}-${{ env.VER_NETCDF_F90 }}

- if: steps.cache-netcdff90-restore.outputs.cache-hit != 'true'
name: Install NetCDF Fortran ${{ env.VER_NETCDF_F90 }}
run: |
wget https://github.com/Unidata/netcdf-fortran/archive/v${VER_NETCDF_F90}.tar.gz
tar xf v${VER_NETCDF_F90}.tar.gz
cd netcdf-fortran-${VER_NETCDF_F90}
export CPPFLAGS=-I${CMAKE_PREFIX_PATH}/include
export LDFLAGS=-L${CMAKE_PREFIX_PATH}/lib
./configure --prefix=$(realpath $CMAKE_PREFIX_PATH)
make -j4 install
- if: steps.cache-netcdff90-restore.outputs.cache-hit != 'true'
name: Cache NetCDF Fortran ${{ env.VER_NETCDF_F90 }}
uses: actions/cache/save@v4
with:
path: ${{ env.CMAKE_PREFIX_PATH }}
key: cache-${{ matrix.config.name }}-${{ env.VER_NETCDF_F90 }}

#
# OASIS3-MCT
#
- name: Restore cached OASIS3-MCT ${{ env.VER_OASIS }}
uses: actions/cache/restore@v4
id: cache-oasis-restore
with:
path: ${{ env.MODEL_DIR }}/oasis3-mct
key: cache-${{ matrix.config.name }}-${{ env.VER_OASIS }}

- if: steps.cache-oasis-restore.outputs.cache-hit != 'true'
name: Download OASIS3-MCT ${{ env.VER_OASIS }}
working-directory: ${{ env.MODEL_DIR }}
run: |
git clone -b $VER_OASIS https://icg4geo.icg.kfa-juelich.de/ExternalReposPublic/oasis3-mct.git
echo "OASIS3-MCT version: $(cd oasis3-mct && git describe --tags --always)"
- if: steps.cache-oasis-restore.outputs.cache-hit != 'true'
name: Cache OASIS3-MCT ${{ env.VER_OASIS }}
uses: actions/cache/save@v4
with:
path: ${{ env.MODEL_DIR }}/oasis3-mct
key: cache-${{ matrix.config.name }}-${{ env.VER_OASIS }}

#
# eCLM
#
- name: Restore cached eCLM ${{ env.VER_eCLM }}
uses: actions/cache/restore@v4
id: cache-eclm-restore
with:
path: ${{ env.MODEL_DIR }}/eCLM
key: cache-${{ matrix.config.name }}-${{ env.VER_eCLM }}

- if: steps.cache-eclm-restore.outputs.cache-hit != 'true'
name: Download eCLM ${{ env.VER_eCLM }}
working-directory: ${{ env.MODEL_DIR }}
run: |
git clone -b $VER_eCLM https://github.com/HPSCTerrSys/eCLM.git
echo "eCLM version: $(cd eCLM && git describe --tags --always)"
- if: steps.cache-eclm-restore.outputs.cache-hit != 'true'
name: Cache eCLM ${{ env.VER_eCLM }}
uses: actions/cache/save@v4
with:
path: ${{ env.MODEL_DIR }}/eCLM
key: cache-${{ matrix.config.name }}-${{ env.VER_eCLM }}

#
# ParFlow
#
- name: Restore cached ParFlow ${{ env.VER_PARFLOW }}
uses: actions/cache/restore@v4
id: cache-parflow-restore
with:
path: ${{ env.MODEL_DIR }}/parflow
key: cache-${{ matrix.config.name }}-${{ env.VER_PARFLOW }}

# TODO: Must use upstream repo https://github.com/parflow/parflow.git
- if: steps.cache-parflow-restore.outputs.cache-hit != 'true'
name: Download ParFlow ${{ env.VER_PARFLOW }}
working-directory: ${{ env.MODEL_DIR }}
run: |
git clone https://github.com/parflow/parflow.git
cd parflow
git checkout $VER_PARFLOW
echo "ParFlow version: $(git describe --tags --always)"
- if: steps.cache-parflow-restore.outputs.cache-hit != 'true'
name: Cache ParFlow ${{ env.VER_PARFLOW }}
uses: actions/cache/save@v4
with:
path: ${{ env.MODEL_DIR }}/parflow
key: cache-${{ matrix.config.name }}-${{ env.VER_PARFLOW }}

#
# Hypre
#
- name: Restore cached Hypre ${{ env.VER_HYPRE }}
uses: actions/cache/restore@v4
id: cache-hypre-restore
with:
path: ${{ env.CMAKE_PREFIX_PATH }}
key: cache-${{ matrix.config.name }}-${{ env.VER_HYPRE }}

- if: steps.cache-hypre-restore.outputs.cache-hit != 'true'
name: Install Hypre ${{ env.VER_HYPRE }}
run: |
wget https://github.com/hypre-space/hypre/archive/v${VER_HYPRE}.tar.gz
tar xf v${VER_HYPRE}.tar.gz
cd hypre-${VER_HYPRE}/src
./configure --prefix=$(realpath $CMAKE_PREFIX_PATH)
make -j4 install
- if: steps.cache-hypre-restore.outputs.cache-hit != 'true'
name: Cache Hypre ${{ env.VER_HYPRE }}
uses: actions/cache/save@v4
with:
path: ${{ env.CMAKE_PREFIX_PATH }}
key: cache-${{ matrix.config.name }}-${{ env.VER_HYPRE }}

#
# TSMP2
#
- name: Configure TSMP2
run: >-
cmake -S . -B ${BUILD_DIR}
-DCMAKE_BUILD_TYPE="RELEASE"
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
-DOASIS_SRC=${MODEL_DIR}/oasis3-mct
-DeCLM="ON"
-DeCLM_SRC=${MODEL_DIR}/eCLM
-DParFlow="ON"
-DPARFLOW_SRC=${MODEL_DIR}/parflow
- name: Build TSMP2
run: |
cmake --build ${BUILD_DIR}
- name: Install TSMP2
run: |
cmake --install ${BUILD_DIR}
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
[submodule "models/parflow_pdaf"]
path = models/parflow_pdaf
url = https://github.com/HPSCTerrSys/parflow
branch = tsmp-pdaf
branch = tsmp-pdaf-patched
[submodule "models/pdaf"]
path = models/pdaf
url = https://github.com/HPSCTerrSys/pdaf.git
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ cd $TSMP2_DIR
2. Load the environment variables required for the build.

```bash
source env/jsc.2023_Intel.sh
source env/jsc.2024_Intel.sh
```

3. Specify build and install directories.
Expand All @@ -82,19 +82,19 @@ mkdir -p ${BUILD_DIR} ${INSTALL_DIR}
## NOTE: Download only the component models that you need! ##

# eCLM
git clone https://github.com/HPSCTerrSys/eCLM.git models/eCLM
git clone -b beta-0.1 https://github.com/HPSCTerrSys/eCLM.git models/eCLM
eCLM_SRC=`realpath models/eCLM`

# ICON
git clone https://icg4geo.icg.kfa-juelich.de/spoll/icon2.6.4_oascoup.git models/icon
ICON_SRC=`realpath models/icon`

# ParFlow
git clone -b v3.12.0 https://github.com/parflow/parflow.git models/parflow
git clone https://github.com/parflow/parflow.git models/parflow
PARFLOW_SRC=`realpath models/parflow`

# ParFlow (PDAF-patched)
git clone -b v3.12.0-tsmp https://github.com/HPSCTerrSys/parflow models/parflow_pdaf
git clone -b v3.13.0-pdaf https://github.com/HPSCTerrSys/parflow models/parflow_pdaf
PARFLOW_SRC=`realpath models/parflow_pdaf`

# CLM3.5
Expand Down
17 changes: 9 additions & 8 deletions build_tsmp2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ if [ -n "${comp_namey}" ] && [ -z "${comp_srcname}" ];then
submodule_name=$(echo "models/"${sub_srcname})
fi
if [ "$( ls -A ${cmake_tsmp2_dir}/${submodule_name} | wc -l)" -ne 0 ];then
echo "submodule ${submodule_name} aleady exist. Do you want overwrite it? (y/n)"
read yn
read -p "submodule ${submodule_name} aleady exists. Do you want overwrite it? (y/n) " yn
if [ "${yn,}" = "y" ];then
message "Overwrite submodule ${submodule_name}"
git submodule update --init --force -- ${submodule_name}
Expand Down Expand Up @@ -188,7 +187,7 @@ else
fi

# set INSTALL and BUILD DIR (neccesary for building)
if [ -z "${SYSTEMNAME}" ]; then SYSTEMNAME="UNKN"; fi
if [ -z "${SYSTEMNAME}" ]; then export SYSTEMNAME=$(hostname); fi

if [ -z "${build_dir}" ]; then
cmake_build_dir="${cmake_tsmp2_dir}/bld/${SYSTEMNAME^^}_${model_id}"
Expand All @@ -210,14 +209,16 @@ fi # Makefile verbosity

build_log="$(dirname ${cmake_build_dir})/${model_id}_$(date +%Y-%m-%d_%H-%M).log"

## source environment
message "source environment"
if [ -z "${tsmp2_env}" ]; then
tsmp2_env="${cmake_tsmp2_dir}/env/jsc.2023_Intel.sh"
## source environment if on JSC or env file is provided
if [[ -z "${tsmp2_env}" && ($SYSTEMNAME = "jurecadc" || $SYSTEMNAME = "juwels" || $SYSTEMNAME = "jusuf") ]]; then
tsmp2_env="${cmake_tsmp2_dir}/env/jsc.2024_Intel.sh"
else
tsmp2_env="$(realpath ${tsmp2_env})"
fi # tsmp2_env
source $tsmp2_env
if [ ! -z "${tsmp2_env}" ]; then
message "source environment"
source $tsmp2_env
fi

## CMAKE config
# rm -rf ${cmake_build_dir}
Expand Down
3 changes: 2 additions & 1 deletion cmake/BuildCOSMO.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
find_package(ecCodes REQUIRED)
find_package(NetCDF REQUIRED)
find_package(OpenMP REQUIRED)

set(COSMO_BLD_DIR ${CMAKE_BINARY_DIR}/COSMO5_1/bld)
set(COSMO_Fopts ${COSMO_BLD_DIR}/Fopts)
Expand All @@ -15,7 +16,7 @@ file(APPEND ${COSMO_Fopts} "COMFLG4 = $(COMFLG1)\n")
file(APPEND ${COSMO_Fopts} "COMFLG = $(COMFLG1)\n")
file(APPEND ${COSMO_Fopts} "COMFLG5 = $(COMFLG1)\n")
file(APPEND ${COSMO_Fopts} "LDPAR = ${CMAKE_Fortran_COMPILER}\n")
file(APPEND ${COSMO_Fopts} "LDFLG = -qopenmp\n")
file(APPEND ${COSMO_Fopts} "LDFLG = ${OpenMP_Fortran_FLAGS}\n")
file(APPEND ${COSMO_Fopts} "PROGRAM = lmparbin\n")
file(APPEND ${COSMO_Fopts} "LIBPATH = ${ecCodes_LIBRARIES} ${NetCDF_LIBRARIES} ${OASIS_LIBRARIES}\n")

Expand Down
13 changes: 10 additions & 3 deletions cmake/BuildOASIS3MCT.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
find_package(NetCDF REQUIRED)
find_package(OpenMP REQUIRED)

if (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
set(OPTIM "-g")
Expand All @@ -20,7 +21,7 @@ file(WRITE ${OASIS_MAKE_INC} "CHAN = MPI1\n")
file(APPEND ${OASIS_MAKE_INC} "COUPLE = ${OASIS_SRC}\n")
file(APPEND ${OASIS_MAKE_INC} "BUILD_DIR = ${OASIS_BLD_DIR}\n")
file(APPEND ${OASIS_MAKE_INC} "ARCHDIR = ${OASIS_INSTALL_PREFIX}\n")
file(APPEND ${OASIS_MAKE_INC} "NETCDF_INCLUDE = ${NetCDF_ROOT}/include\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")
Expand All @@ -39,8 +40,14 @@ if(${PDAF})
else()
file(APPEND ${OASIS_MAKE_INC} "CPPDEF = -Duse_netCDF -Duse_comm_$(CHAN) -D__VERBOSE -DTREAT_OVERLAY\n")
endif()
file(APPEND ${OASIS_MAKE_INC} "FCBASEFLAGS = ${OPTIM} -xCORE-AVX2 -I. -assume byterecl -mt_mpi -qopenmp\n")
file(APPEND ${OASIS_MAKE_INC} "CCBASEFLAGS = ${OPTIM} -qopenmp\n")
if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
file(APPEND ${OASIS_MAKE_INC} "FCBASEFLAGS = ${OPTIM} -I. -ffree-line-length-none -fallow-argument-mismatch ${OpenMP_Fortran_FLAGS}\n")
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" OR CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM")
file(APPEND ${OASIS_MAKE_INC} "FCBASEFLAGS = ${OPTIM} -I. -xCORE-AVX2 -assume byterecl -mt_mpi ${OpenMP_Fortran_FLAGS}\n")
else()
message(FATAL_ERROR "Fortran compiler '${CMAKE_Fortran_COMPILER_ID}' is not supported.")
endif()
file(APPEND ${OASIS_MAKE_INC} "CCBASEFLAGS = ${OPTIM} ${OpenMP_Fortran_FLAGS}\n")
file(APPEND ${OASIS_MAKE_INC} "MCT_DEBUGFLAG = ${MCT_DEBUGFLAG}\n")
file(APPEND ${OASIS_MAKE_INC} "FLIBS = ${NetCDF_LIBRARIES}\n")
file(APPEND ${OASIS_MAKE_INC} "INC_DIRS = -I$(ARCHDIR)/include -I$(NETCDF_INCLUDE)\n")
Expand Down
Loading

0 comments on commit 5b29084

Please sign in to comment.