Run SOMISANA forecast models on MIMS #502
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Run SOMISANA forecast models on MIMS | |
on: | |
schedule: | |
# the workflow designed to every 6 hours. Optionally it can also be run every 12 or 24 hours | |
# initialise once a day at 3am | |
- cron: '0 3 * * *' | |
# initialise twice a day | |
# - cron: '0 0,12 * * *' | |
workflow_dispatch: | |
inputs: | |
run_date: | |
description: 'Date and time for T0 for the run in format YYYYMMDD_HH' | |
required: false | |
default: '' | |
type: string | |
jobs: | |
# note that the jobs aren't executed in the order they are written below | |
# they are executed in the order depending on the 'needs' attribute of each job | |
build_cli: | |
uses: ./.github/workflows/build_images.yml | |
with: | |
IMAGE_ID: cli | |
# set some environment variables | |
envs: | |
runs-on: ubuntu-latest | |
outputs: | |
BRANCH_REF: ${{ steps.BRANCH_REF.outputs.value }} | |
RUN_DATE: ${{ steps.calculate_date.outputs.value }} | |
steps: | |
- name: Calculate run_date | |
id: calculate_date | |
run: | | |
input_run_date=${{ github.event.inputs.run_date || 'unspecified' }} | |
if [[ ${{ github.event_name }} == 'workflow_dispatch' && ${input_run_date} != 'unspecified' ]] | |
then | |
run_date="${{ github.event.inputs.run_date }}" # Use provided run_date | |
else | |
# automatically set the run_date by finding an appropriate time stamp in the past (corresponding to our cron schedule) | |
# Get the current time in UTC | |
current_time=$(date -u +'%Y%m%d_%H') | |
# Extract the hour and calculate the nearest multiple of 12 in the past (as per our cron schedule above) | |
hour=$(echo ${current_time:9:2} | awk '{print int($1 - ($1%12))}') | |
# Correct hour formatting (ensure leading zero) | |
hour=$(printf "%02d" $hour) | |
# Assemble the run_date | |
run_date=$(echo ${current_time:0:8}_${hour}) | |
fi | |
echo "value=$run_date" >> $GITHUB_OUTPUT | |
# Dynamically set the branch ref to the currently executing branch | |
- name: Set the BRANCH_REF | |
id: BRANCH_REF | |
run: | | |
echo "value=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT | |
# everything below here runs using the `mims1` self-hosted runner | |
# This is a server with 120 cpu's and 256 G ram, dedictated to running SOMISANA's operational models | |
# It is possible that we may want to use an additional modelling server (which will be a separate node on MIMS) | |
# In that event, we could put all the code below here in a new reusable workflow called run_ops_mims1.yml | |
# And then set up another one called run_ops_mims2.yml set up in the same way but obviously running different models/domains | |
# (note you'll also have to include another `git pull` command at the end of build_images.yml to make sure the latest images are available on the new server) | |
# | |
cleanup: | |
needs: [envs,build_cli] | |
uses: ./.github/workflows/cleanup.yml | |
with: | |
RUNNER_NAME: mims1 | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
# prepare croco config dirs for each domain | |
prep_domains: | |
needs: [envs] | |
strategy: | |
matrix: | |
# running as a matrix strategy allows us to prepare different domains in parallel inside a single job | |
domain: ['sa_southeast_01','sa_west_02'] | |
uses: ./.github/workflows/prep_domain.yml | |
with: | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
RUNNER_NAME: mims1 | |
MODEL: croco_v1.3.1 | |
DOMAIN: ${{ matrix.domain }} | |
COMP: C06 | |
# in future we may want to use different compile options for each domain | |
# one way of handling that may be to add the compile option to each string in the domain variable under the matrix strategy | |
# and then tease out the domain and compile option inside prep_domain.yml | |
# download the surface data we'll need to force the models | |
download_surface: | |
needs: [envs, build_cli] | |
uses: ./.github/workflows/download_surface.yml | |
with: | |
RUNNER_NAME: mims1 | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
HDAYS: 5 | |
FDAYS: 5 | |
secrets: inherit | |
# download the OGCM data we'll need to force the models | |
download_mercator: | |
needs: [envs, build_cli] | |
uses: ./.github/workflows/download_mercator.yml | |
with: | |
RUNNER_NAME: mims1 | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
HDAYS: 5 | |
FDAYS: 5 | |
secrets: inherit | |
download_hycom: | |
needs: [envs, build_cli] | |
uses: ./.github/workflows/download_hycom.yml | |
with: | |
RUNNER_NAME: mims1 | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
HDAYS: 5 | |
FDAYS: 5 | |
secrets: inherit | |
# prepare tidal forcing for each domain | |
make_tide_frc: | |
needs: [envs, build_cli, prep_domains] | |
strategy: | |
matrix: | |
# running as a matrix strategy allows us to prepare different domains in parallel inside a single job | |
domain: ['sa_southeast_01','sa_west_02'] | |
uses: ./.github/workflows/make_tides.yml # Path to your reusable workflow | |
with: | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
RUNNER_NAME: mims1 | |
MODEL: croco_v1.3.1 | |
DOMAIN: ${{ matrix.domain }} | |
TIDE_FRC: TPXO10 | |
HDAYS: 5 | |
# run the model, do the postprocessing, archive the output | |
# | |
# we must ensure that run_all_domains.yml must use less than 120 processors in parallel - this is our limit | |
# | |
# we've also found that you can't run 4 domains in parallel, even if they use less than 120 processors in totoal | |
# the runs slow down hugely, so it's better to use more processors per domain, and maybe 2 domains max in parallel | |
run_mercator_domains: | |
needs: [envs,prep_domains,download_surface,download_mercator] | |
uses: ./.github/workflows/run_all_domains.yml | |
with: | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
RUNNER_NAME: mims1 | |
OGCM: MERCATOR | |
SAWS_OK: ${{ needs.download_surface.outputs.SAWS_OK }} | |
secrets: inherit | |
run_hycom_domains: | |
needs: [envs,prep_domains,download_surface,download_hycom,run_mercator_domains] | |
if: ${{ always() }} # execute even if there was an error with the mercator runs | |
uses: ./.github/workflows/run_all_domains.yml | |
with: | |
RUN_DATE: ${{ needs.envs.outputs.RUN_DATE }} | |
BRANCH_REF: ${{ needs.envs.outputs.BRANCH_REF }} | |
RUNNER_NAME: mims1 | |
OGCM: HYCOM | |
SAWS_OK: ${{ needs.download_surface.outputs.SAWS_OK }} | |
secrets: inherit |