Skip to content

update models/pdaf: HPSCTerrSys/TSMP#268 #246

update models/pdaf: HPSCTerrSys/TSMP#268

update models/pdaf: HPSCTerrSys/TSMP#268 #246

Workflow file for this run

name: TSMP2 Build
# Controls when the action will run.
on:
push:
branches: [ master ]
pull_request:
branches: [ master, stages-2025-pdaf ]
jobs:
eclm_build_job:
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ ubuntu-24.04 ]
config:
- {
name: "ICON-eCLM-ParFlow",
use_oasis: "True",
parflow_dir: "parflow",
model_opts: "--ICON --eCLM --ParFlow"
}
# TODO - Fix PDAF GNU errors
# - {
# name: "CLM3.5-PDAF",
# use_oasis: "False",
# model_opts: "--CLM35 --PDAF"
# }
# - {
# name: "eCLM-PDAF",
# use_oasis: "False",
# model_opts: "--eCLM --PDAF"
# }
# - {
# name: "CLM3.5-ParFlow-PDAF",
# use_oasis: "True",
# parflow_dir: "parflow_pdaf",
# model_opts: "--CLM35 --ParFlow --PDAF"
# }
# - {
# name: "eCLM-ParFlow-PDAF",
# use_oasis: "True",
# parflow_dir: "parflow_pdaf",
# model_opts: "--eCLM --ParFlow --PDAF"
# }
env:
SYSTEMNAME: UBUNTU
STAGE: 24.04
CC: mpicc
CXX: mpic++
FC: mpifort
F77: mpif77
MPI_HOME: /usr/lib/x86_64-linux-gnu/openmpi
VER_NETCDF_C: 4.9.2
VER_NETCDF_F90: 4.6.1
VER_HYPRE: 2.26.0
VER_ECCODES: 2.40.0
VER_OASIS: tsmp-patches-v0.1
steps:
- uses: actions/checkout@v4
# These apt packages have post-install step which can't be triggered by GitHub cache.
- name: Install TSMP2 dependencies on Ubuntu
run: |
sudo apt-get update
sudo apt-get install gfortran openmpi-bin libopenmpi-dev libhdf5-openmpi-dev libhdf5-openmpi-hl-fortran-100t64 hdf5-helpers liblapack-dev libblas-dev
# These apt packages can be safely cached.
- name: Install extra 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 liblzma-dev
version: 1.0
execute_install_scripts: true
- name: Initialize dependency directory and variables
run: |
TSMP2_ROOT=$(git rev-parse --show-toplevel)
DEPENDENCIES_ROOT=${TSMP2_ROOT}/dependencies
mkdir -v ${DEPENDENCIES_ROOT}
tree -L 1 ${TSMP2_ROOT}
echo "TSMP2_ROOT=${TSMP2_ROOT}" >> $GITHUB_ENV
echo "DEPENDENCIES_ROOT=${DEPENDENCIES_ROOT}" >> $GITHUB_ENV
#
# NetCDF C
#
- name: Restore cached netcdf-c-${{ env.VER_NETCDF_C }}
uses: actions/cache/restore@v4
id: cache-netcdf-c-restore
with:
path: ${{ env.DEPENDENCIES_ROOT }}/netcdf-c-${{ env.VER_NETCDF_C }}
key: ${{ matrix.config.name }}_netcdf-c-${{ env.VER_NETCDF_C }}
- if: steps.cache-netcdf-c-restore.outputs.cache-hit != 'true'
name: Install netcdf-c-${{ env.VER_NETCDF_C }}
working-directory: /tmp
run: |
# Download
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}
# Install
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
# Verify
tree -L 2 ${DEPENDENCIES_ROOT}/netcdf-c-${VER_NETCDF_C}
- if: steps.cache-netcdf-c-restore.outputs.cache-hit != 'true'
name: Cache netcdf-c-${{ env.VER_NETCDF_C }}
uses: actions/cache/save@v4
with:
path: ${{ env.DEPENDENCIES_ROOT }}/netcdf-c-${{ env.VER_NETCDF_C }}
key: ${{ matrix.config.name }}_netcdf-c-${{ env.VER_NETCDF_C }}
#
# NetCDF Fortran
#
- name: Restore cached netcdf-f90-${{ env.VER_NETCDF_F90 }}
uses: actions/cache/restore@v4
id: cache-netcdf-f90-restore
with:
path: ${{ env.DEPENDENCIES_ROOT }}/netcdf-f90-${{ env.VER_NETCDF_F90 }}
key: ${{ matrix.config.name }}_netcdf-f90-${{ env.VER_NETCDF_F90 }}
- if: steps.cache-netcdf-f90-restore.outputs.cache-hit != 'true'
name: Install netcdf-f90-${{ env.VER_NETCDF_F90 }}
working-directory: /tmp
run: |
# Download
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}
# Install
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
# Verify
tree -L 2 ${DEPENDENCIES_ROOT}/netcdf-f90-${VER_NETCDF_F90}
- if: steps.cache-netcdf-f90-restore.outputs.cache-hit != 'true'
name: Cache netcdf-f90-${{ env.VER_NETCDF_F90 }}
uses: actions/cache/save@v4
with:
path: ${{ env.DEPENDENCIES_ROOT }}/netcdf-f90-${{ env.VER_NETCDF_F90 }}
key: ${{ matrix.config.name }}_netcdf-f90-${{ env.VER_NETCDF_F90 }}
#
# Hypre
#
- if: contains(matrix.config.name, 'ParFlow')
name: Restore cached hypre-${{ env.VER_HYPRE }}
uses: actions/cache/restore@v4
id: cache-hypre-restore
with:
path: ${{ env.DEPENDENCIES_ROOT }}/hypre-${{ env.VER_HYPRE }}
key: ${{ matrix.config.name }}_hypre-${{ env.VER_HYPRE }}
- if: contains(matrix.config.name, 'ParFlow') && steps.cache-hypre-restore.outputs.cache-hit != 'true'
name: Install hypre-${{ env.VER_HYPRE }}
working-directory: /tmp
run: |
# Download
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
# Install
./configure --prefix=${DEPENDENCIES_ROOT}/hypre-${VER_HYPRE}
make -j4 install
# Verify
tree -L 2 ${DEPENDENCIES_ROOT}/hypre-${VER_HYPRE}
- if: contains(matrix.config.name, 'ParFlow') && steps.cache-hypre-restore.outputs.cache-hit != 'true'
name: Cache hypre-${{ env.VER_HYPRE }}
uses: actions/cache/save@v4
with:
path: ${{ env.DEPENDENCIES_ROOT }}/hypre-${{ env.VER_HYPRE }}
key: ${{ matrix.config.name }}_hypre-${{ env.VER_HYPRE }}
#
# ecCodes
#
- if: contains(matrix.config.name, 'ICON')
name: Restore cached eccodes-${{ env.VER_ECCODES }}
uses: actions/cache/restore@v4
id: cache-eccodes-restore
with:
path: ${{ env.DEPENDENCIES_ROOT }}/eccodes-${{ env.VER_ECCODES }}
key: ${{ matrix.config.name }}_eccodes-${{ env.VER_ECCODES }}
- if: contains(matrix.config.name, 'ICON') && steps.cache-eccodes-restore.outputs.cache-hit != 'true'
name: Install eccodes-${{ env.VER_ECCODES }}
working-directory: /tmp
run: |
# Download
wget https://github.com/ecmwf/eccodes/archive/refs/tags/${VER_ECCODES}.tar.gz
tar xf ${VER_ECCODES}.tar.gz
cd eccodes-${VER_ECCODES}
# Install
cmake -S . -B bld -DCMAKE_INSTALL_PREFIX=${DEPENDENCIES_ROOT}/eccodes-${VER_ECCODES}
cmake --build bld --parallel 4
cmake --install bld
# Verify
tree -L 2 ${DEPENDENCIES_ROOT}/eccodes-${VER_ECCODES}
- if: contains(matrix.config.name, 'ICON') && steps.cache-eccodes-restore.outputs.cache-hit != 'true'
name: Cache eccodes-${{ env.VER_ECCODES }}
uses: actions/cache/save@v4
with:
path: ${{ env.DEPENDENCIES_ROOT }}/eccodes-${{ env.VER_ECCODES }}
key: ${{ matrix.config.name }}_eccodes-${{ env.VER_ECCODES }}
#
# Check component model versions
#
- name: Extract required component model versions
id: model-versions
working-directory: ${{ env.TSMP2_ROOT }}/models
run: |
pwd
echo ""
git submodule status | cut -c2- | cut -d' ' -f1-2 | tee model_versions
echo ""
if [[ "${{ matrix.config.use_oasis }}" == "True" ]]; then
VER_OASIS=$(cat model_versions | grep -w "oasis3-mct" | cut -d' ' -f1)
echo "${VER_OASIS} => VER_OASIS"
echo "VER_OASIS=${VER_OASIS}" >> $GITHUB_OUTPUT
fi
if [[ "${{ matrix.config.name }}" == *"eCLM"* ]]; then
VER_eCLM=$(cat model_versions | grep -w "eCLM" | cut -d' ' -f1)
echo "${VER_eCLM} => VER_eCLM"
echo "VER_eCLM=${VER_eCLM}" >> $GITHUB_OUTPUT
fi
if [[ "${{ matrix.config.name }}" == *"CLM3.5"* ]]; then
VER_CLM35=$(cat model_versions | grep -w "CLM3.5" | cut -d' ' -f1)
echo "${VER_CLM35} => VER_CLM35"
echo "VER_CLM35=${VER_CLM35}" >> $GITHUB_OUTPUT
fi
if [[ "${{ matrix.config.name }}" == *"ParFlow"* ]]; then
VER_ParFlow=$(cat model_versions | grep -w "${{ matrix.config.parflow_dir }}" | cut -d' ' -f1)
echo "${VER_ParFlow} => VER_ParFlow"
echo "VER_ParFlow=${VER_ParFlow}" >> $GITHUB_OUTPUT
fi
if [[ "${{ matrix.config.name }}" == *"ICON"* ]]; then
VER_ICON=$(cat model_versions | grep -w "icon" | cut -d' ' -f1)
echo "${VER_ICON} => VER_ICON"
echo "VER_ICON=${VER_ICON}" >> $GITHUB_OUTPUT
fi
# TODO - Fix PDAF GNU errors
# if [[ "${{ matrix.config.name }}" == *"PDAF"* ]]; then
# VER_PDAF=$(cat model_versions | grep -w "pdaf" | cut -d' ' -f1)
# echo "${VER_PDAF} => VER_PDAF"
# echo "VER_PDAF=${VER_PDAF}" >> $GITHUB_OUTPUT
# fi
#
# OASIS3-MCT
#
- if: matrix.config.use_oasis == 'True'
name: Restore cached OASIS3-MCT ${{ env.VER_OASIS }}
uses: actions/cache/restore@v4
id: cache-oasis-restore
with:
path: ${{ env.TSMP2_ROOT }}/oasis3-mct
key: ${{ matrix.config.name }}_oasis-${{ env.VER_OASIS }}
- if: matrix.config.use_oasis == 'True' && steps.cache-oasis-restore.outputs.cache-hit != 'true'
name: Update OASIS3-MCT submodule ${{ steps.model-versions.outputs.VER_OASIS }}
working-directory: ${{ env.TSMP2_ROOT }}
run: |
pwd && git clone -b $VER_OASIS https://icg4geo.icg.kfa-juelich.de/ExternalReposPublic/oasis3-mct.git
- if: matrix.config.use_oasis == 'True' && steps.cache-oasis-restore.outputs.cache-hit != 'true'
name: Cache OASIS3-MCT ${{ env.VER_OASIS }}
uses: actions/cache/save@v4
with:
path: ${{ env.TSMP2_ROOT }}/oasis3-mct
key: ${{ matrix.config.name }}_oasis-${{ env.VER_OASIS }}
#
# eCLM
#
- if: contains(matrix.config.name, 'eCLM')
name: Update eCLM submodule ${{ steps.model-versions.outputs.VER_eCLM }}
working-directory: ${{ env.TSMP2_ROOT }}/models/eCLM
run: |
pwd && git submodule update --init --force .
#
# CLM3.5
#
- if: contains(matrix.config.name, 'CLM3.5')
name: Update CLM3.5 submodule ${{ steps.model-versions.outputs.VER_CLM35 }}
working-directory: ${{ env.TSMP2_ROOT }}/models/CLM3.5
run: |
pwd && git submodule update --init --force .
#
# ParFlow
#
- if: contains(matrix.config.name, 'ParFlow')
name: Update ${{ matrix.config.parflow_dir }} submodule ${{ steps.model-versions.outputs.VER_ParFlow }}
working-directory: ${{ env.TSMP2_ROOT }}/models/${{ matrix.config.parflow_dir }}
run: |
pwd && git submodule update --init --force .
#
# ICON
#
- if: contains(matrix.config.name, 'ICON')
name: Update ICON submodule ${{ steps.model-versions.outputs.VER_ICON }}
working-directory: ${{ env.TSMP2_ROOT }}/models/icon
run: |
pwd && git submodule update --init --force .
#
# TODO - Fix PDAF GNU errors
#
# - if: contains(matrix.config.name, 'PDAF')
# name: Update PDAF submodule ${{ steps.model-versions.outputs.VER_PDAF }}
# working-directory: ${{ env.TSMP2_ROOT }}/models/pdaf
# run: |
# pwd && git submodule update --init --force .
#
# Pre-build checks
#
- name: Check component model versions
working-directory: ${{ env.TSMP2_ROOT }}
run: |
git submodule foreach 'git describe --tags --always && echo ""'
if [[ "${{ matrix.config.use_oasis }}" == "True" ]]; then
echo "Entering 'oasis3-mct'"
echo "$(git -C oasis3-mct describe --tags --always)"
fi
- name: Check TSMP2 dependencies
working-directory: ${{ env.DEPENDENCIES_ROOT }}
run: |
tree -FUCh --du -L 2 $(pwd)
CMAKE_PREFIX_PATH=$(ls -1 | xargs realpath | paste -sd ":" -)
echo "" && echo "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
echo "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" >> $GITHUB_ENV
#
# Build TSMP2
#
- name: Build ${{ matrix.config.name }}
run: |
MODEL_OPTS="${{ matrix.config.model_opts }}"
if [[ "${{ matrix.config.use_oasis }}" == "True" ]]; then
MODEL_OPTS="${MODEL_OPTS} --OASIS_SRC ${TSMP2_ROOT}/oasis3-mct"
fi
BUILD_TSMP2_CMD="./build_tsmp2.sh ${MODEL_OPTS} --no_update"
echo $BUILD_TSMP2_CMD && echo ""
eval $BUILD_TSMP2_CMD
- name: Check installed binaries
working-directory: ${{ env.TSMP2_ROOT }}/bin
run: |
tree -FUCh --du -L 3 $(pwd)