-
Karl-Hermann Wieners authoredKarl-Hermann Wieners authored
importexp 4.33 KiB
#! /bin/sh
BINDIR=$(dirname $0)
BUILD_SUBDIR=build
while getopts b:d:D:e:s:t: OPTOPT
do
case $OPTOPT in
b) BUILD_SUBDIR=$OPTARG ;;
d) DATA_BASE_DIR=$OPTARG ;;
D) DATA_DIR=$OPTARG ;;
e) ENVIRONMENT=$OPTARG ;;
s) CUSTOM_SUBDIR=$OPTARG ;;
t) EXP_TYPE=$OPTARG ;;
*) exit 1;;
esac
done
shift $((OPTIND -1))
if [ -w . ]
then
TMPDIR=$PWD
export TMPDIR
fi
trap 'rm -rf $RUN_FILE $LOG_FILE $WORK_DIR' 0
RUN_FILE=$(mktemp)
LOG_FILE=$(mktemp)
WORK_DIR=$(mktemp -d)
for RUN_SCRIPT
do
RUN_BASE_DIR=$(dirname $RUN_SCRIPT)
RUN_BASE_DIR=${RUN_BASE_DIR%/$CUSTOM_SUBDIR}
MODEL_BASE_DIR=${RUN_BASE_DIR%/run}
MODEL_BASE_DIR=${MODEL_BASE_DIR%/$BUILD_SUBDIR}
echo "Analyzing '$RUN_SCRIPT'" >&2
# New style scripts will make sure that helper scripts are found.
# So no need to hack the . ./* calls (see 4. below)
if grep '^ *cd *\$BUILD_DIR/run' $RUN_SCRIPT > /dev/null
then
RUN_BASE_DIR=.
fi
# "Normalize" run script
# 1. get rid of possible +x settings
# 2. to handle external scripts, replace script dir with tmp dir
# 3. to handle external scripts, replace working dir with tmp dir
# 4. to handle external scripts, replace ./ calls appropriately
# 5. levante scripts use bash, where -x does not show here-docs
SHOW_HERE_DOCS='\
for x in $master_namelist $atm_namelist $jsbach_namelist $oce_namelist\
do\
echo "cat > $x << EOF"\
cat $x\
echo EOF\
done\
'
# 6. use original model base for executable
sed -r '
s:^(\s*)(set\s+\+x\s*$|(set\s+\+\w+)x):\1\3:
s:^(\s*)SCRIPT_DIR=.*$:\1SCRIPT_DIR='$WORK_DIR':
s:^(\s*)EXPDIR=.*$:\1EXPDIR='$WORK_DIR':
s:^(\s*\.\s+)\./:\1'$RUN_BASE_DIR'/:
s:^\s*cat\s+\$thisscript\s*$:'"$SHOW_HERE_DOCS"':
s:^(\s*(export\s+)?MODEL=")\$\{basedir\}:\1'$MODEL_BASE_DIR':
' "$RUN_SCRIPT" > $RUN_FILE
# Get script shell without possible +x settings to handle
COMMAND=$(perl -ne '
/^\#!\s*(\/\S+)(
\s+\+x\s*$|
(\s+\+\w+)x|
\s*$
)/x and print($1, $3); exit
' $RUN_FILE)
SLURM_JOB_NUM_NODES=$(perl -ne 'if(/^\s*#SBATCH\s+(--nodes|-N)(=|\s+)(\d+)/) {print($3); exit}' $RUN_FILE)
SLURM_NODELIST="n[00001-$SLURM_JOB_NUM_NODES]"
SLURM_JOB_CPUS_PER_NODE=72
export SLURM_JOB_NUM_NODES SLURM_NODELIST SLURM_JOB_CPUS_PER_NODE
echo "Running '$RUN_SCRIPT'" >&2
${COMMAND:-/bin/sh} -x $RUN_FILE > $LOG_FILE 2>&1
echo "Generating configuration" >&2
eval "$(perl -lne '/^(?:\d{4,}-\d\d-\d\dT\d\d:\d\d:\d\d:\ )?\+\ \s*(
EXPNAME|
(?:start|end)_date|
restart_interval|
(?:atmos|ocean)_(?:gridID|refinement)|
(?:rad|atm|oce|coupling)TimeStep
)(=.*)$/x and print($1, $2)' $LOG_FILE)"
eval "$(perl -lne '
/_(\d{4})_(R\d\dB\d\d)_.* icon_grid_G.nc$/ and
print("atmos_gridID=$1\natmos_refinement=$2");
/_(\d{4})_(R\d\dB\d\d)_.* icon_grid_O.nc$/ and
print("ocean_gridID=$1\nocean_refinement=$2");
' $LOG_FILE)"
cat << EOF
###\\
EXP_TYPE = ${EXP_TYPE:-DEFAULT}
ENVIRONMENT = ${ENVIRONMENT:-levante}
DATA_DIR = ${DATA_DIR-${DATA_BASE_DIR-$MODEL_BASE_DIR}/experiments/\$EXP_ID}
INTERVAL = $restart_interval
${atmTimeStep:+ATMO_TIME_STEP = $atmTimeStep}
${radTimeStep:+ATMO_RADIATION_TIME_STEP = $radTimeStep}
${oceTimeStep:+OCEAN_TIME_STEP = $oceTimeStep}
${couplingTimeStep:+COUPLER_TIME_STEP = $couplingTimeStep}
###/
EOF
$BINDIR/namelist2config -i "$EXPNAME" -a "$atmos_gridID" -A "$atmos_refinement" -o "$ocean_gridID" -O "$ocean_refinement" -I "$start_date" -F "$end_date" $LOG_FILE
### i => 'EXP_ID',
### a => 'ATMO_GRID_ID',
### o => 'OCEAN_GRID_ID',
### A => 'ATMO_GRID_TYPE',
### O => 'OCEAN_GRID_TYPE',
### I => 'INITIAL_DATE',
### F => 'FINAL_DATE',
$BINDIR/files2config -x -i "$EXPNAME" -a "$atmos_gridID" -A "$atmos_refinement" -o "$ocean_gridID" -O "$ocean_refinement" $LOG_FILE
### i => 'EXP_ID',
### a => 'ATMO_GRID_ID',
### o => 'OCEAN_GRID_ID',
### A => 'ATMO_GRID_TYPE',
### O => 'OCEAN_GRID_TYPE',
cat << EOF
###\\
[jobs]
.remove = run_start, run, post, mon_index, mon
[[intake]]
url = \$EXP_ID.json
###/
EOF
rm -f dict.$EXPNAME coupling_$EXPNAME.xml exp.$EXPNAME.run.status exp.$EXPNAME.run.final_status
done # for RUN_SCRIPT