2025-09-05 09:42:21 +02:00

376 lines
16 KiB
Bash
Executable File

#!/bin/sh
# initialise user dependent variable
export cmd=$0 ; export cmdargs=$@
SETTE_DIR=$(cd $(dirname "$0"); pwd)
MAIN_DIR=$(dirname $SETTE_DIR)
export CMPL_CORES=8 # Number of threads to use for compiling
export SETTE_STG="_ST" # Base suffix to append to configuration name
dry_run=0
NO_REPORT=0
#
# controls for some common namelist, run-time options:
#
export USING_TIMING='yes' # Default: yes => set ln_timing=.true. ; use -T to disable
export USING_ICEBERGS='yes' # Default: yes => set ln_icebergs=.true. ; use -i to disable
export USING_EXTRA_HALO='no' # Default: no => set nn_hls=1 ; use "--halo 2" to set nn_hls=2
export USING_COLLECTIVES='yes' # Default: yes => set nn_comm=2 ; use -C to set nn_comm=1
export USING_NOGATHER='yes' # Default: yes => set ln_nnogather=.true.; use -N to set ln_nnogather=.false.
export USING_TILING='no' # Default: no => set ln_tile=.false. ; use "--tiling yes" to set ln_tile=.true.
# Note: yes also ensures nn_hls=2 but -t will not alter nn_hls
#
# controls for some common compile-time keys:
#
export USING_QCO='yes' # Default: yes => add key_qco ; use -q to delete key_qco
export USING_RK3='no' # Default: yes => add key_RK3 & key_qco ; use -Q to delete key_RK3
export USING_LOOP_FUSION='no' # Default: no => del key_loop_fusion ; use "--loop_fusion yes" to add key_loop_fusion
export USING_XIOS='yes' # Default: yes => add key_xios ; use -X to delete key_xios
# Note: changing USING_XIOS may require a change in arch file
#
# controls for some common batch-script, run-time options:
#
export USING_MPMD='yes' # Default: yes => run with detached XIOS servers ; use -A to run in attached (SPMD) mode
# Note: yes also ensures key_xios but -A will not remove it
export USER_INPUT='yes' # Default: yes => request user input on decisions. For example:
# 1. regarding mismatched options
# 2. regardin incompatible options
# 3. regarding creation of directories
#
# Check that git branch is usable
export DETACHED_HEAD="no"
git branch --show-current >& /dev/null
if [[ $? == 0 ]] ; then
# subdirectory below NEMO_VALIDATION_DIR defaults to branchname
export SETTE_SUB_VAL="$(git branch --show-current)"
if [ -z $SETTE_SUB_VAL ] ; then
# Probabably on a detached HEAD (possibly testing an old commit).
# Verify this and try to recover original commit
MORE_INFO="$(git branch -a | head -1l | sed -e's/.*(//' -e 's/)//' )"
if [[ "${MORE_INFO}" == *"detached"* ]] ; then
export DETACHED_HEAD="yes"
export DETACHED_CMIT=$( echo \\${MORE_INFO} | awk '{print $NF}' )
# There is no robust way to recover a branch name in a detached state
# so just use the commit with a prefix
export SETTE_SUB_VAL="detached_"${DETACHED_CMIT}
else
export SETTE_SUB_VAL="Unknown"
fi
fi
export SETTE_THIS_BRANCH=${SETTE_SUB_VAL}
else
# subdirectory below NEMO_VALIDATION_DIR defaults to "MAIN"
export SETTE_SUB_VAL="MAIN"
export SETTE_THIS_BRANCH="Unknown"
fi
# small functions
getyn() {
case $( echo $1 | tr '[:upper:]' '[:lower:]' ) in
0|1) [ $1 -eq 0 ] && echo 'no' || echo 'yes' ;;
'no'|'yes') echo $1 ;;
*) echo 'err' ;;
esac
}
prtopt() {
[ "$3" == "err" ] && echo -e "\033[0;31m\n \"$2\" BAD OPTION for ${1}\033[0m\n" && exit 2
echo "$1 $2: $4"
echo ""
}
yn2tf (){
[ "$1" == "no" ] && echo false || echo true
}
yn2not (){
[ "$1" == "no" ] && echo "not " || echo ""
}
# Parse command-line arguments
while [ ${#1} -gt 0 ]; do
case $1 in
-c) export SETTE_CLEAN_CONFIGS='yes'
export SETTE_SYNC_CONFIGS='yes'
echo "-c: Configuration ${SETTE_TEST_CONFIGS[@]} will be cleaned; this option enforces also synchronisation"
echo "";;
-d) dry_run=1
echo "";;
-r) NO_REPORT=1
echo "";;
-s) export SETTE_SYNC_CONFIGS='yes'
echo "-s: MY_SRC and EXP00 in ${SETTE_TEST_CONFIGS[@]} will be synchronised with the MY_SRC and EXPREF from the reference configuration"
echo "";;
-n) OPTSTR=$2
OPTSTR="${OPTSTR/ORCA2_SAS_ICE/SAS}" # Permit either shortened (expected) or full name for SAS
OPTSTR="${OPTSTR/AGRIF_DEMO/AGRIF}" # Permit either shortened (expected) or full name for AGRIF
export SETTE_TEST_CONFIGS=(${OPTSTR})
echo "=================================="
if [ ${#SETTE_TEST_CONFIGS[@]} -gt 1 ]; then
echo "-n: Configurations ${SETTE_TEST_CONFIGS[@]} will be tested if they are available"
else
echo "-n: Configuration ${SETTE_TEST_CONFIGS[@]} will be tested if it is available"
fi
echo ""
shift ;;
-g) case $2 in
[0-9,a-z,A-Z] ) echo "-g: Using ${SETTE_STG}${2} as the configuration suffix";;
* ) echo "-g only accepts a single, alphanumeric character. Processing halted"; exit 42;;
esac
export SETTE_STG=${SETTE_STG}${2}
echo ""
shift ;;
-x) export SETTE_TEST_TYPES=(${2}) # SETTE_TEST_TYPES is an array
echo "-x: ${SETTE_TEST_TYPES[@]} tests requested"
echo ""
shift ;;
-v) export SETTE_SUB_VAL=(${2}) # SETTE_SUB_VAL is an array
echo "-v: $SETTE_SUB_VAL validation sub-directory requested"
echo ""
shift ;;
-T) export USING_TIMING='no'
echo "-T: ln_timing will be set to false"
echo "";;
--tiling)
export USING_TILING=$( getyn $2 )
prtopt $1 $2 $USING_TILING "ln_tile will be set to "$( yn2tf $USING_TILING )
shift ;;
-t) export USING_TILING='no'
echo "-t: ln_tile will be set to false"
echo "";;
--halo)
case $2 in
1|2) USING_HALO_SIZE=$2 ;;
* ) USING_HALO_SIZE='err' ;;
esac
prtopt "$1" "$2" $USING_HALO_SIZE "nn_hls will be set to $2"
[ "${USING_HALO_SIZE}" == "2" ] && export USING_EXTRA_HALO='yes'
shift ;;
-e) export USING_EXTRA_HALO='no'
echo "-e: nn_hls will be set to 1"
echo "";;
-i) export USING_ICEBERGS='no'
echo "-i: ln_icebergs will be set to false"
echo "";;
-C) export USING_COLLECTIVES='no'
echo "-C: nn_comm will be set to 1"
echo "";;
-N) export USING_NOGATHER='no'
echo "-N: ln_nnogather will be set to false"
echo "";;
-q) export USING_QCO='no'
echo "-q: key_qco and key_linssh will NOT be activated"
echo "";;
-Q) export USING_RK3='no'
echo "-Q: key_qco and key_RK3 will not be activated"
echo " This is the curent default for now since RK3 is not ready"
echo "";;
--loop_fusion)
export USING_LOOP_FUSION=$( getyn $2 )
prtopt $1 $2 $USING_LOOP_FUSION "key_loop_fusion will $( yn2not $USING_LOOP_FUSION )be activated"
shift ;;
-F) export USING_LOOP_FUSION='no'
echo "-F: key_loop_fusion will not be activated"
echo "";;
-X) export USING_XIOS='no'
echo "-X: key_xios will not be activated"
echo "";;
-A) export USING_MPMD='no'
echo "-A: Tasks will be run in attached (SPMD) mode"
echo "";;
-u) export USER_INPUT='no'
echo "-u: sette.sh will not expect any user interaction == no safety net!"
echo "";;
-h | *) echo 'sette.sh with no arguments (in this case all configuration will be tested with default options)'
echo '-T to set ln_timing false for all non-AGRIF configurations (default: true)'
echo '-t set ln_tile false in all tests that support it (default: false)'
echo '"--tiling $opt" with opt=yes|1|no|0, set ln_tile true/false in all tests that support it (default: false)'
echo '-e set nn_hls=1 (default: nn_hls=1)'
echo '"--halo $opt", with opt=1|2, set nn_hls=1 or 2 (default: nn_hls=1)'
echo '-i set ln_icebergs false (default: true)'
echo '-C set nn_comm=1 (default: nn_comm=2 ==> use MPI3 collective comms)'
echo '-N set ln_nnogather false for ORCA2 configurations (default: true)'
echo '-q to remove the key_qco key (default: added)'
echo '-X to remove the key_xios key (default: added)'
echo '-F to remove the key_loop_fusion key (default: removed)'
echo '"--loop_fusion $opt" with opt=yes|1|no|0, to add/remove the key_loop_fusion key (default: removed)'
echo '-Q to remove the key_RK3 key (currently a null-op since key_RK3 is not used)'
echo '-A to run tests in attached (SPMD) mode (default: MPMD with key_xios)'
echo '-n "CFG1_to_test CFG2_to_test ..." to test some specific configurations'
echo '-x "TEST_type TEST_type ..." to specify particular type(s) of test(s) to run after compilation'
echo ' TEST_type choices are: RESTART REPRO CORRUPT PHYSICS - anything else will COMPILE only'
echo '-v "subdir" optional validation record subdirectory to be created below NEMO_VALIDATION_DIR'
echo '-g "group_suffix" single character suffix to be appended to the standard _ST suffix used'
echo ' for SETTE-built configurations (needed if sette.sh invocations may overlap)'
echo '-r to execute without waiting to run sette_rpt.sh at the end (useful for chaining sette.sh invocations)'
echo '-d to perform a dryrun to simply report what settings will be used'
echo '-c to clean each configuration'
echo '-s to synchronise the sette MY_SRC and EXP00 with the reference MY_SRC and EXPREF'
echo '-u to run sette.sh without any user interaction. This means no checks on creating'
echo ' directories etc. i.e. no safety net!' ; exit 42 ;;
esac
shift
done
#
# Option dependency tests
#
if [ ${USING_TILING} == "yes" ] ; then
if [ ${USING_EXTRA_HALO} == "no" ] ; then
if [ ${USER_INPUT} == "yes" ] ; then
while true; do
read -p 'Tiling requires the extra halo but you did not used "--halo 2" to select it. Would you like to select it? (y/n)?: ' yn
case $yn in
[Yy]* ) echo 'Ok, selecting the "--halo 2" option'; USING_EXTRA_HALO="yes"; break;;
[Nn]* ) echo "Ok, exiting instead"; exit 42;;
* ) echo "Please answer yes or no.";;
esac
done
else
# Without user input, the best option is to disable tiling
echo 'Tiling requires the extra halo but you did not used "--halo 2" to select it. Tiling will not be used.'
USING_TILING="no"
fi
fi
fi
if [ ${USING_LOOP_FUSION} == "yes" ] ; then
if [ ${USING_EXTRA_HALO} == "no" ] ; then
if [ ${USER_INPUT} == "yes" ] ; then
while true; do
read -p 'Loop fusion requires the extra halo but you did not used "--halo 2" to select it. Would you like to select it? (y/n)?: ' yn
case $yn in
[Yy]* ) echo 'Ok, selecting the "--halo 2" option'; USING_EXTRA_HALO="yes"; break;;
[Nn]* ) echo "Ok, exiting instead"; exit 42;;
* ) echo "Please answer yes or no.";;
esac
done
else
# Without user input, the best option is to disable loop fusion
echo 'Loop fusion requires the extra halo but you did not used "--halo 2" to select it. Loop fusion will not be used.'
USING_LOOP_FUSION="no"
fi
fi
fi
#
# Get SETTE parameters
. ./param.cfg
#
# Set the common compile keys to add or delete based on command-line arguments:
#
export ADD_KEYS="" ; export DEL_KEYS=""
if [ ${USING_XIOS} == "yes" ] ; then export ADD_KEYS="${ADD_KEYS}key_xios " ; fi
if [ ${USING_XIOS} == "no" ] ; then export DEL_KEYS="${DEL_KEYS}key_xios " ; fi
#
if [ ${USING_LOOP_FUSION} == "yes" ] ; then export ADD_KEYS="${ADD_KEYS}key_loop_fusion " ; fi
if [ ${USING_LOOP_FUSION} == "no" ] ; then export DEL_KEYS="${DEL_KEYS}key_loop_fusion " ; fi
#
if [ ${USING_QCO} == "yes" ] ; then export ADD_KEYS="${ADD_KEYS}key_qco " ; fi
if [ ${USING_QCO} == "no" ] ; then export DEL_KEYS="${DEL_KEYS}key_qco key_linssh " ; fi
#
if [ ${USING_RK3} == "yes" ] ; then export ADD_KEYS="${ADD_KEYS}key_qco key_RK3 " ; fi
if [ ${USING_RK3} == "no" ] ; then export DEL_KEYS="${DEL_KEYS}key_RK3 " ; fi
#
# Set validation record sub-directories (if required)
#
if [ ! -d $NEMO_VALIDATION_DIR ] ; then
if [ ${dry_run} -eq 0 ] ; then
if [ ${USER_INPUT} == "yes" ] ; then
while true; do
read -p "$NEMO_VALIDATION_DIR does not exist. Do you wish to create it? " yn
case $yn in
[Yy]* ) echo "Ok, creating $NEMO_VALIDATION_DIR"; mkdir $NEMO_VALIDATION_DIR; break;;
[Nn]* ) echo "Ok, exiting instead"; exit 42;;
* ) echo "Please answer yes or no.";;
esac
done
else
# Without user input, carry on regardless
echo "$NEMO_VALIDATION_DIR does not exist. It will be created"
mkdir $NEMO_VALIDATION_DIR
fi
else
echo "$NEMO_VALIDATION_DIR does not exist"
echo "but this is a dry run so it will not be created"
fi
fi
if [ ! -d $NEMO_VALIDATION_DIR/$SETTE_SUB_VAL ] && [ ${dry_run} -eq 0 ] ; then
mkdir $NEMO_VALIDATION_DIR/$SETTE_SUB_VAL
fi
export NEMO_VALIDATION_DIR=$NEMO_VALIDATION_DIR/$SETTE_SUB_VAL
TEST_CONFIGS=(${TEST_CONFIGS[@]/ORCA2_SAS_ICE/SAS}) # Shortening of 'ORCA2_SAS_ICE' to 'SAS'
TEST_CONFIGS=(${TEST_CONFIGS[@]/AGRIF_DEMO/AGRIF}) # Shortening of 'AGRIF_DEMO' to 'AGRIF'
if [ ${#SETTE_TEST_CONFIGS[@]} -eq 0 ]; then
echo "=================================="
echo "Configurations ${TEST_CONFIGS[@]} will be tested if they are available"
fi
echo "Carrying out the following tests : ${TEST_TYPES[@]}"
echo "requested by the command : "$cmd $cmdargs
echo "on branch : "$SETTE_THIS_BRANCH
printf "%-33s : %s\n" USING_TIMING $USING_TIMING
printf "%-33s : %s\n" USING_ICEBERGS $USING_ICEBERGS
printf "%-33s : %s\n" USING_EXTRA_HALO $USING_EXTRA_HALO
printf "%-33s : %s\n" USING_TILING $USING_TILING
printf "%-33s : %s\n" USING_COLLECTIVES $USING_COLLECTIVES
printf "%-33s : %s\n" USING_NOGATHER $USING_NOGATHER
printf "%-33s : %s\n" USING_QCO $USING_QCO
printf "%-33s : %s\n" USING_LOOP_FUSION $USING_LOOP_FUSION
printf "%-33s : %s\n" USING_XIOS $USING_XIOS
printf "%-33s : %s\n" USING_MPMD $USING_MPMD
printf "%-33s : %s\n" USING_RK3 $USING_RK3
printf "%-33s : %s\n" USER_INPUT $USER_INPUT
printf "%-33s : %s\n" "Common compile keys to be added" "$ADD_KEYS"
printf "%-33s : %s\n" "Common compile keys to be deleted" "$DEL_KEYS"
echo "Validation records to appear under: "$NEMO_VALIDATION_DIR
echo "=================================="
echo ""
#
# Option compatibility tests
#
if [ ${USING_MPMD} == "yes" ] && [ ${USING_XIOS} == "no" ] ; then echo "Incompatible choices. MPMD mode requires the XIOS server" ; exit ; fi
if [ ${dry_run} -eq 1 ] ; then echo "dryrun only: no tests performed" ; exit ; fi
# run sette on reference configuration
. ./sette_reference-configurations.sh
if [[ $? != 0 ]]; then
echo ""
echo "--------------------------------------------------------------"
echo "./sette_cfg-ref.sh didn't finish properly, need investigations"
echo "--------------------------------------------------------------"
echo ""
exit 42
fi
# run sette on test cases
. ./sette_test-cases.sh
if [[ $? != 0 ]]; then
echo ""
echo "-----------------------------------------------------------------"
echo "./sette_test-cases.sh didn't finish properly, need investigations"
echo "-----------------------------------------------------------------"
echo ""
exit 42
fi
if [ ${NO_REPORT} -ne 0 ] ; then exit ; fi
# run sette report
echo ""
echo "-------------------------------------------------------------"
echo "./sette_rpt.sh (script will wait all nemo_sette run are done)"
echo "-------------------------------------------------------------"
echo ""
NRUN=999
NIT=0
while [[ $NRUN -ne 0 && $nit -le 1080 ]]; do
nit=$((nit+1))
NRUN=$( ${BATCH_STAT} | grep ${BATCH_NAME} | wc -l )
if [[ $NRUN -ne 0 ]]; then
printf "%-3d %s\r" $NRUN 'nemo_sette runs still in queue or running ...';
else
printf "%-50s\n" " "
. ./sette_rpt.sh
exit
fi
sleep 10
done
printf "\n"
echo ""
echo "Something wrong happened, it tooks more than 3 hours to run all the sette tests"
echo ""