376 lines
16 KiB
Bash
Executable File
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 ""
|