Skip to content
Snippets Groups Projects
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