Skip to content

Update cosp.F90

Update cosp.F90 #388

# (c) British Crown Copyright 2020, the Met Office.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# * Neither the name of the Met Office nor the names of its contributors may
# be used to endorse or promote products derived from this softwarewithout
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.
# Workflow for continuous integration tests
name: Continuous integration gfortran compilers
on: [push, pull_request, workflow_dispatch]
jobs:
# This workflow contains a single job called "ci_gfortran"
ci_gfortran:
# The type of runner that the job will run on
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
compiler: [gfortran-10, gfortran-11, gfortran-12]
python-version: [3.11]
include:
- compiler_short_name: gfortran
- kgo_version: v003
defaults:
run:
shell: bash -el {0}
env:
F90: ${{ matrix.compiler }}
FC: ${{ matrix.compiler }}
F90FLAGS: "-O3 -ffree-line-length-none -fcheck=bounds -finit-real=nan"
NFHOME: /usr
ATOL: 0.0
RTOL: 0.0
KGO_VERSION: ${{ matrix.kgo_version }}
GDKGO1: https://docs.google.com/uc?export=download&id=1oQBJGFg0F8k-LhRGsCYn-qWzmMMVfQ6K
GDKGO2: https://docs.google.com/uc?export=download&id=1b7qwJWqDzoZGcIP0qyUprTV_LErCGpT6
GDKGO3: https://docs.google.com/uc?export=download&id=1NvTo3bYaGpz-FUpZ4jta_kRzA04xTCsn
F90_SHORT_NAME: ${{ matrix.compiler_short_name }}
# Sequence of tasks that will be executed as part of the job
steps:
###############################################################################
# Initial steps
###############################################################################
# Checks-out repository under $GITHUB_WORKSPACE
- uses: actions/checkout@v4
# Set up conda environment
- name: Setup conda environment
uses: conda-incubator/[email protected]
with:
auto-update-conda: true
activate-environment: ci-env
environment-file: build/environment.yml
python-version: ${{ matrix.python-version }}
auto-activate-base: false
# NetCDF C and FORTRAN libraries
- name: Install NetCDF library
run: |
sudo apt-get update
sudo apt-get install libnetcdff-dev
###############################################################################
# Build COSP and retrieve input and test files
###############################################################################
# Build COSP2 driver.
- name: Build driver
run: |
${F90} --version
cd build
make -j driver
# Retrieve and expand large data files
- name: Retrieve input files
run: |
GDFILE='https://docs.google.com/uc?export=download&id=17eK4_DVEvFOE9Uf6siXJDpWZJKT1aqkU'
OUTPATH=driver/data/inputs/UKMO/cosp_input.um_global.nc.gz
curl -sSfL -o $OUTPATH $GDFILE
gunzip ${OUTPATH}
cd driver/data/inputs/UKMO
md5sum -c cosp_input.um_global.nc.md5
- name: Retrieve KGOs for basic test
run: |
cd ${GITHUB_WORKSPACE}
OUTPATH=driver/data/outputs/UKMO/cosp2_output_um.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc.gz
curl -sSfL -o $OUTPATH $GDKGO1
gunzip ${OUTPATH}
cd driver/data/outputs/UKMO
md5sum -c cosp2_output_um.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc.md5
- name: Retrieve KGOs for global test
run: |
cd ${GITHUB_WORKSPACE}
OUTPATH=driver/data/outputs/UKMO/cosp2_output.um_global.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc.gz
curl -sSfL -o $OUTPATH $GDKGO2
gunzip ${OUTPATH}
cd driver/data/outputs/UKMO
md5sum -c cosp2_output.um_global.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc.md5
cd ${GITHUB_WORKSPACE}
- name: Retrieve KGOs for global test with outputs on model levels
run: |
cd ${GITHUB_WORKSPACE}
OUTPATH=driver/data/outputs/UKMO/cosp2_output.um_global_model_levels.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc.gz
curl -sSfL -o $OUTPATH $GDKGO3
gunzip ${OUTPATH}
cd driver/data/outputs/UKMO
md5sum -c cosp2_output.um_global_model_levels.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc.md5
###############################################################################
# Run COSP2 tests. We could run both tests in one step, but
# doing it this way the output is easier to interpret.
###############################################################################
# 1. Basic test
- name: Basic test, UM global snapshot
run: |
source /opt/intel/oneapi/setvars.sh || true
cd driver/run
./cosp2_test cosp2_input_nl.txt
./cosp2_test cosp2_input_nl.um_global.txt
# 2. UM global snapshot. Diagnostics on model levels.
- name: UM global snapshot. Diagnostics on model levels.
run: |
cd driver/run
./cosp2_test cosp2_input_nl.um_global_model_levels.txt cosp2_output_nl.um_global_model_levels.txt
###############################################################################
# Compare results against known good outputs. As above,
# we split it in as many steps as tests.
###############################################################################
# 1. Basic test
- name: Basic against known good output (KGO)
run: |
cd driver
KGO=data/outputs/UKMO/cosp2_output_um.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc
TST=data/outputs/UKMO/cosp2_output_um.nc
python compare_to_kgo.py ${KGO} ${TST} --atol=${ATOL} --rtol=${RTOL}
# 2. UM global snapshot.
- name: UM global against known good output (KGO)
run: |
cd driver
KGO=data/outputs/UKMO/cosp2_output.um_global.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc
TST=data/outputs/UKMO/cosp2_output.um_global.nc
python compare_to_kgo.py ${KGO} ${TST} --atol=${ATOL} --rtol=${RTOL}
# 3. UM global snapshot. Diagnostics on model levels.
- name: UM global on model levels against known good output (KGO)
run: |
cd driver
KGO=data/outputs/UKMO/cosp2_output.um_global_model_levels.${F90_SHORT_NAME}.kgo.$KGO_VERSION.nc
TST=data/outputs/UKMO/cosp2_output.um_global_model_levels.nc
python compare_to_kgo.py ${KGO} ${TST} --atol=${ATOL} --rtol=${RTOL}
###############################################################################
# Produce plots when it fails during global snapshot tests,
# and create a tarball with outputs.
###############################################################################
- name: Produce plots and create tarball
if: failure()
run: |
TST_MLEV=data/outputs/UKMO/cosp2_output.um_global_model_levels.nc
cd driver
if [[ -e data/outputs/UKMO/cosp2_output.um_global.nc ]]; then
python plot_test_outputs.py
fi
if [[ -e data/outputs/UKMO/cosp2_output.um_global_model_levels.nc ]]; then
python plot_test_outputs.py --tst_file=$TST_MLEV
fi
cd data/outputs/UKMO
tar --ignore-failed-read -czf outputs.${{ matrix.compiler }}.UKMO.tgz cosp2_output.um_global.nc \
cosp2_output_um.nc cosp2_output.um_global_model_levels.nc *.png \
cosp2_output.um_global.out
ls -lh
###############################################################################
# Make output files available if any test fails
###############################################################################
- name: Upload output file if test fails
if: failure()
uses: actions/[email protected]
with:
name: outputs.${{ matrix.compiler }}.UKMO.tgz
path: driver/data/outputs/UKMO/outputs.${{ matrix.compiler }}.UKMO.tgz