diff --git a/couplage/MAR_n5 b/couplage/MAR_n5 new file mode 100644 index 0000000000000000000000000000000000000000..2cb35da8beeb276ffefb9d5c23a79565db1d4f75 --- /dev/null +++ b/couplage/MAR_n5 @@ -0,0 +1,1827 @@ +#!/bin/bash +# +# E. Vanvyve / X. Fettweis - 08.10.2007 +#set -x +# +# NAME +# +# MAR - run MAR +# +# SYNOPSIS +# +# MAR [-again MAR.ctr] name year month [slice] +# name year month day1 [slice] +# name year month day1 day2 +# +# OPERANDS +# +# name the name of the MAR run (e.g. a01 ) [a1+i2] +# year year of the period to run (e.g. 1993) [i4] +# month month of the period to run (e.g. 12 ) [i2] +# day1 start day of the period to run (e.g. 02 ) [i2] +# (=> upto the day2 or end of the slice) +# slice length steps of the period to run (e.g. a ) [a1] +# a = 1st fortnight of the month (01-15 ) (..-15) +# b = 2nd fortnight of the month (16-28/29/30/31) (..-28/29/30/31) +# c = 1st ten of the month (01-10) (..-10) +# d = 2nd ten of the month (11-20) (..-20) +# e = 3rd ten of the month (21-28/29/30/31) (..-28/29/30/31) +# o = entire month +# +# [ -again MAR.ctr the script MAR is run with a specific MAR.ctr file (EXACT +# name AND path) +# (e.g. MAR -again $HOME/a01/MAR.ctr.931201o a01 1993 12 a)] +# +# +# DESCRIPTION +# +# The MAR script prepares MAR for a run and creates the job command file. It +# can be also used to relaunch a simulation, with this syntax : +# MAR -again MAR.ctr name year month... +# where the MAR.ctr file is the appropriate file for the simulation (give its +# absolute path and full name). +# + +RAND=$RANDOM + +#------------------------------------------------------------------------------- +# HELP +#------------------------------------------------------------------------------- + +[ ${#1} -eq 0 ] && head -42 $0 && exit 99 + + +#------------------------------------------------------------------------------- +# SCRIPT INITIALISATION +#------------------------------------------------------------------------------- + +# +# User's parameters +#--------------------------------------- + +#INI.ctr (assumed: INI.ctr identical to the one used when no -again) + +tmp=`ls ${0%/*}/INI.ctr | wc -l` #to avoid search in subdirectories +[ $tmp -ne 1 ] && echo '@&?%! '"fatal error: ${0%/*}/INI.ctr non-existent" && exit + +control=${0%/*}/INI.ctr +. $control + +#$0.ctr + +nagain="n" + +if [ $1 = "-again" ] || [ $1 = "-nagain" ] ; then #automatic relaunched simulation + again="y" #to jump over some unused parts of this script + control=$2 + [ $1 = "-nagain" ] && nagain="y" + [ ! -f $control ] && echo '@&?%! '"fatal error: $control non-existent" && exit 99 + shift 2 +else #online launched simulation + again="n" + #tmp=`find ${0%/*} -name ${0##*/}.ctr -print | wc -l` + #tmp=`ls ${0%/*} | grep -c ${0##*/}.ctr` #to avoid search in subdirectories + tmp=`ls $0.ctr | wc -l` #to avoid search in subdirectories + [ $tmp -ne 1 ] && echo '@&?%! '"fatal error: $0.ctr non-existent" && exit 99 + + #control=`find ${0%/*} -name ${0##*/}.ctr -print | head -1` + control=$0.ctr +fi + +. $control + +#FUNCTIONS + +. FUNCTIONS + +# +# System initialisation +#--------------------------------------- + +#main script parameters values + +case $cluster in (nic|linux|ceci|foehn|nasa|froggy) echo ;; + (idris) if [ `uname -n | grep -c "uqbar"` -eq 0 ] ; then + echo '@&?%! '"you must be logged in uqbar if you want to execute the script 'MAR' without getting into deep troubles..." && exit 99 #to have correct HOME path in the script.cmd to submit in batch! + else + echo + fi ;; + (*) echo '@&?%! '"script not over for $cluster" && exit 99 ;; +esac + +#------------------------------------------------------------------------------- +# TITLE +#------------------------------------------------------------------------------- +TITLE0 "MAR PROCESSING" + + +#------------------------------------------------------------------------------- +# 1 - INITIALISATION +#------------------------------------------------------------------------------- +TITLE1 "INITIALISATION" + +# +# Your parameters (MAR.ctr) +#--------------------------------------- +TITLE2 "Your parameters (MAR.ctr)" + +#script argument + +usage="\nusage: MAR [-again MAR.ctr] name year month [slice]\n name year month day1 [slice]\n name year month day1 day2" + +[ ${#1} -eq 0 ] && DAMNED "1st argument missing [name]\n$usage" +[ ${#2} -eq 0 ] && DAMNED "2nd argument missing [period: year]\n$usage" +[ ${#3} -eq 0 ] && DAMNED "3rd argument missing [period: month]\n$usage" +zut="zut" +arg1=$1 +arg2=$2 +arg3=$3 +arg4=${4:-$zut} +arg5=${5:-$zut} +arg6=${6:-$zut} + +#MAR.ctr arguments: user's dir. paths + +MARbin=${MARbin%/} +SIMdir=${SIMdir%/} +MARsrc=${MARsrc%/} +STKmar=${STKmar%/} ; [ ${#STKmar} -eq 0 ] && STKmar="." +WRKdir=${WRKdir%/} +WRKmsg=${WRKmsg%/} + +[ ${#version} -gt 0 ] && version=".${version#\.}" +[ ${#Version} -gt 0 ] && version=".${Version#\.}" + +#MAR.ctr arguments: y/n values + +case $nstzip in ([!yn]) DAMNED "parameter error: nstzip [$nstzip]" ;; esac +case $marzip in ([!yn]) DAMNED "parameter error: marzip [$marzip]" ;; esac + +case $CA in ([!TF]) DAMNED "parameter error: conv. adjustement [$CA]" ;; esac +case $SV in ([!TF]) DAMNED "parameter error: svat scheme [$SV]" ;; esac +case $SN in ([!TF]) DAMNED "parameter error: snow model [$SN]" ;; esac +case $PO in ([!TF]) DAMNED "parameter error: snow model [$PO]" ;; esac + +#world region + +case $WLDreg in + (EU) tmp="Europe" ;; + (WA) tmp="West Africa" ;; + (AN) tmp="Antarctica" ;; + (GR) tmp="Greenland" ;; + (BE) tmp="Belgium" ;; + (*) tmp="undiscovered land perhaps...?" ;; +esac + +#user's parameters + +echo "general world region : $WLDreg ($tmp)" +echo "global initial date : $d1I/$moI/$yrI" +echo "global final date : $d2F/$moF/$yrF" +echo +echo "SIMdir directory : $SIMdir" +echo "MARsrc directory : $MARsrc" +echo "MAR directory on stock : $STKmar" +echo "batched job messages in: $WRKmsg" +echo "work directory for job : \${WRKdir}" +echo +echo "MAR convec. adjustement: $CA" +case $SV in (T) tmp=SISVAT ;; (F) tmp="force restore" ;; esac +echo "MAR surface model : $tmp" +echo "MAR snow model : $SN" +echo "MAR polynia model : $PO" +echo +[ $cluster = "idris" -a $nstzip = "y" ] && tmp="(not advised)" || tmp="" +echo "unzip input files (NST): $nstzip $tmp" +[ $cluster = "idris" -a $marzip = "y" ] && tmp="(not advised)" || tmp="" +echo "gzip MAR output files : $marzip $tmp" +echo +echo "cluster : $cluster ($spcned kb - $walltime h walltime)" +if [ $cluster = "linux" ] ; then +echo "job submission with PBS: $job_pbs" +fi +echo "stock address : $stock" +echo + +[ $again = "n" ] && echo "<return>" + +# +# Check the run name +#--------------------------------------- +TITLE2 "Check the run name" + +runnam=$arg1 + +#length + +[ ${#runnam} -ne 3 ] && DAMNED "format error: run name (a3) [$runnam]" + +echo "run name: $runnam" +echo "associated domain: $WLDreg${runnam%??}" +echo "associated world region: $WLDreg" + +#name denomination + + #domain +k=0 +for i in `ls $SIMdir | awk '{ print($0) }'` ; do + j=${i#$WLDreg} + [ ${#j} -eq 1 ] && [ ${#j} -eq 1 -a ${runnam%??} = $j ] && k=$(($k+1)) +done +[ $k -ne 1 ] && DAMNED "format error: run name [$runnam]. Associated domain $WLDreg${runnam%??} ($WLDreg+${runnam%??}) non-existent." + +# +# Check the simulation dates +#--------------------------------------- +TITLE2 "Check the simulation dates" + + #./MAR $1 $2 $3 $4 $5 + #./MAR runnam yr mo [slice] (case 1) + #./MAR runnam yr mo d1 [slice] (case 2) + #./MAR runnam yr mo d1 d2 (case 3) + + #yr = year (i4) ; mo = month (i2) ; d1 = stard day (i2) ; d2 = end day (i2) + #slice = current slice of the simulation (not for the entire sim. period) + + #slice=o > entire (...-end of the month) + #slice=a/b > fortnight (...-15 & 16-...) + #slice=c/d/e > ten (...-10 & 11-20 & 21-...) + #slice=f/g/h > five (...-10 & 11-20 & 21-...) + +#current period + +#check the arguments validity (& format) + +yr="$arg2" ; mo="$arg3" ; d1="00" ; d2="00" + +[ ${#yr} -ne 4 ] && DAMNED "syntax error: wrong year (yr) [$yr]" +[ ${#mo} -ne 2 ] && DAMNED "syntax error: wrong month (mo) [$mo]" + +case $arg4 in + ($zut) slice="o" ; #case 1 + d1=$zut ; + d2=$zut ;; + (o|a|b|c|d|e|f|g|h|i|j|k) slice="$4" ; #case 1 + d1=$zut ; + d2=$zut ;; + ([0-9][0-9]) d1="$4" ; #cases 2, 3 + case $arg5 in + ($zut) slice="o" ; #case 2 + d2=$zut ;; + (o|a|b|c|d|e|f|g|h|i|j|k) slice="$5" ; #case 2 + d2=$zut ;; + ([0-9][0-9]) d2="$5" ; #case 3 + slice="-" ;; + (*) DAMNED "argument error: arg5 [$arg5]" ;; + esac ;; + (*) DAMNED "argument error: arg4 [$arg4]" ;; +esac + +#check the arguments value + +set_time_arrays $yr + +if [ $yr -lt 1850 -o $yr -gt 2200 ] ; then + DAMNED "value error: year $yr unavailable (1850-2200)" +fi + +[ $mo -lt 1 -o $mo -gt 12 ] && DAMNED "value error: unvalid month [$mo]" +tmp="${day[10#$mo]}" + +if [ $d1 != $zut ] ; then + [ $d1 -lt 1 -o $d1 -gt $tmp ] && DAMNED "value error: wrong start day [$d1]" +fi +if [ $d2 != $zut ] ; then + [ $d2 -lt 1 -o $d2 -gt $tmp ] && DAMNED "value error: wrong end day [$d2]" +fi +if [ $d1 != $zut -a $d2 != $zut ] ; then + [ $d1 -gt $d2 ] && DAMNED "value error: start day > end day [$d1/$d2]" +fi + +#set missing variables to their right value + +if [ $d1 = $zut -a $d2 = $zut ] ; then #case 1 + case $slice in + (o) d1="01" && d2="${day[10#$mo]}" ;; + + (a) d1="01" && d2="15" ;; + (b) d1="16" && d2="${day[10#$mo]}" ;; + + (c) d1="01" && d2="10" ;; + (d) d1="11" && d2="20" ;; + (e) d1="21" && d2="${day[10#$mo]}" ;; + + (f) d1="01" && d2="5" ;; + (g) d1="06" && d2="10" ;; + (h) d1="11" && d2="15" ;; + (i) d1="16" && d2="20" ;; + (j) d1="21" && d2="25" ;; + (k) d1="26" && d2="${day[10#$mo]}" ;; + + esac +elif [ $d1 != $zut -a $d2 = $zut ] ; then #case 2 + case $slice in + (o) [ $d1 -le ${day[10#$mo]} ] && d2="${day[10#$mo]}" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + + (a) [ $d1 -le 15 ] && d2="15" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + (b) [ $d1 -ge 16 ] && d2="${day[10#$mo]}" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + + (c) [ $d1 -le 10 ] && d2="10" || DAMNED "value: fatal error in start day and slice" ;; + (d) [ $d1 -ge 11 -a $d1 -le 20 ] && d2="20" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + (e) [ $d1 -ge 21 ] && d2="${day[10#$mo]}" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + + (f) [ $d1 -le 5 ] && d2="5" || DAMNED "value: fatal error in start day and slice" ;; + (g) [ $d1 -ge 6 -a $d1 -le 10 ] && d2="10" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + (h) [ $d1 -ge 11 -a $d1 -le 15 ] && d2="15" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + (i) [ $d1 -ge 16 -a $d1 -le 20 ] && d2="20" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + (j) [ $d1 -ge 21 -a $d1 -le 25 ] && d2="25" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + (k) [ $d1 -ge 26 ] && d2="${day[10#$mo]}" || DAMNED "value: fatal error in start day and slice [$d1/$slice]" ;; + + esac +fi #case 3: no test needed + +tyr=${yr#??} +[ ${#mo} -eq 1 ] && tmo="0$mo" || tmo="$mo" +[ ${#d1} -eq 1 ] && td1="0$d1" || td1="$d1" +[ ${#d2} -eq 1 ] && td2="0$d2" || td2="$d2" + +echo "current period: $td1 ${month[10#$mo]} $yr to $td2 ${month[10#$mo]} $yr (slice $slice)" + +# global dates + +#length + +[ ${#d1I} -ne 2 ] && DAMNED "format error: global begin day (dd) [$d1I]" +[ ${#d2F} -ne 2 ] && DAMNED "format error: global end day (dd) [$d2F]" +[ ${#moI} -ne 2 ] && DAMNED "format error: global begin month (mm) [$moI]" +[ ${#moF} -ne 2 ] && DAMNED "format error: global end month (mm) [$moF]" +[ ${#yrI} -ne 4 ] && DAMNED "format error: global begin year (yyyy) [$yrI]" +[ ${#yrF} -ne 4 ] && DAMNED "format error: global end year (yyyy) [$yrF]" + +#start date < end date + +[ $yrF -lt $yrI ] && DAMNED "value error: global end year < begin year [$yrI/$yrF]" +if [ $yrF -eq $yrI ] ; then + [ $moF -lt $moI ] && DAMNED "value error: global end month < begin month [$moI/$moF]" +fi +if [ $moF -eq $moI ] ; then + [ $d2F -lt $d1I ] && DAMNED "value error: global end day < begin day [$d1I/$d2F]" +fi + +#available dates + +if [ $yrI -lt 1850 -o $yrI -gt 2200 ] ; then + DAMNED "value error: global period year $yrI unavailable (1850-2200)" +fi +if [ $yrF -lt 1850 -o $yrF -gt 2200 ] ; then + DAMNED "value error: global period year $yrF unavailable (1850-2200)" +fi + +tyrI=${yrI#??} +tyrF=${yrF#??} +tmoI=${moI} ; [ ${#tmoI} -eq 1 ] && tmoI="0"$tmoI +tmoF=${moF} ; [ ${#tmoF} -eq 1 ] && tmoF="0"$tmoF +td1I=${d1I} ; [ ${#td1I} -eq 1 ] && td1I="0"$td1I +td2F=${d2F} ; [ ${#td2F} -eq 1 ] && td2F="0"$td2F + +echo "global period: $td1I ${month[10#$moI]} $yrI to $td2F ${month[10#$moF]} $yrF" + +# searching next period + +d1N=$(( $d2 + 1 )) + +if [ $d1N -gt ${day[10#$mo]} ] ; then + d1N="01" + moN=$(( 10#$mo + 1 )) +else + moN="$mo" +fi + +if [ $moN -gt 12 ] ; then + moN="01" + yrN=$(( 10#$yr + 1 )) +else + yrN=$yr +fi + +[ $yrN -gt 2200 ] && DAMNED "value error: unvalid next year [$yrN]" + +case $slice in (o) sliceN="$slice" ;; + (a) sliceN="b" ;; + (b) sliceN="a" ;; + (c) sliceN="d" ;; + (d) sliceN="e" ;; + (e) sliceN="c" ;; + + (f) sliceN="g" ;; + (g) sliceN="h" ;; + (h) sliceN="i" ;; + (i) sliceN="j" ;; + (j) sliceN="k" ;; + (k) sliceN="f" ;; + + (-) sliceN="-" ;; esac + +case $sliceN in (o) d2N="${day[10#$moN]}" ;; + (a) d2N="15" ;; + (b) d2N="${day[10#$moN]}" ;; + + (c) d2N="10" ;; + (d) d2N="20" ;; + (e) d2N="${day[10#$moN]}" ;; + + (f) d2N="5" ;; + (g) d2N="10" ;; + (h) d2N="15" ;; + (i) d2N="20" ;; + (j) d2N="25" ;; + (k) d2N="${day[10#$moN]}" ;; + + + + (-) d2N="$d1N" ;; esac + +tyrN=${yrN#??} +[ ${#moN} -eq 1 ] && tmoN="0$moN" || tmoN="$moN" +[ ${#d1N} -eq 1 ] && td1N="0$d1N" || td1N="$d1N" +[ ${#d2N} -eq 1 ] && td2N="0$d2N" || td2N="$d2N" + +#next slice > last one ? + +if [ $yr -eq $yrF -a $mo -eq $moF -a $d2 -eq $d2F ] ; then + echo "no next period" +else + echo "next period: $td1N ${month[10#$moN]} $yrN to $td2N ${month[10#$moN]} $yrN (slice $sliceN)" +fi + +# +# Set paths +#--------------------------------------- +TITLE2 "Set paths" + +domain=$WLDreg${runnam%??} #e.g. EUa=EU+a +DOMdir=$SIMdir/$domain +INPUTdir=$DOMdir/input +CTRLdir=$DOMdir/ctrl/$runnam +CODEdir=$DOMdir/code/$runnam +RUNdir=$DOMdir/run/$runnam + +mkdir -p $CTRLdir 2>/dev/null +mkdir -p $CODEdir 2>/dev/null +mkdir -p $RUNdir 2>/dev/null + +echo "simulation domain directory path: $DOMdir" +echo "simulation input directory path: $DOMdir/input" +echo "simulation ctrl directory path: $DOMdir/ctrl/$runnam" +echo "simulation code directory path: $DOMdir/code/$runnam" +echo "simulation run directory path: $DOMdir/run/$runnam" + +# +# Check the MAR time steps +#--------------------------------------- +TITLE2 "Check the MAR time steps" + +#missing value + +dtDiff="$dt" +dtPhys="$dt" + +[ ${#dt} -eq 0 ] && DAMNED "fatal error: no slow-dynamics time step (dt) specified" +[ ${#each} -eq 0 ] && DAMNED "fatal error: no output time step (each) specified" +[ ${#ntfast} -eq 0 ] && DAMNED "fatal error: no fast time step (ntfast) specified" +[ ${#dtDiff} -eq 0 ] && DAMNED "fatal error: no diffusion time step (dtDiff) specified" +[ ${#dtPhys} -eq 0 ] && DAMNED "fatal error: no surf. physics time step (dtPhys) specified" +[ ${#dtRadi} -eq 0 ] && DAMNED "fatal error: no radiat. transfer time step (dtRadi) specified" + +#decimal value unauthorized + +case $dt in (*.*) DAMNED "value error: decimal in slow-dynamics time step [$dt]" ;; esac +case $each in (*.*) DAMNED "value error: decimal in output time step [$each]" ;; esac +case $ntfast in (*.*) DAMNED "value error: decimal in fast time step [$ntfast]" ;; esac +case $dtDiff in (*.*) DAMNED "value error: decimal in diffusion time step [$dtDiff]" ;; esac +case $dtPhys in (*.*) DAMNED "value error: decimal in surface physics time step [$dtPhys]" ;; esac +case $dtRadi in (*.*) DAMNED "value error: decimal in radiative transfer time step [$dtRadi]" ;; esac + +#dt + +echo "slow dynamics dt: $dt s" + +#each and nboucl + +i="" +if [ $each -eq 0 ] ; then + each=360 #default: output every 6 hours + i=" (automatic)" +fi +tmp=$(( $each * 60 % $dt )) +if [ $tmp -ne 0 ] ; then + DAMNED "value error: output time step (each) incompatible with the slow-dynamics time step (dt) [$each/$dt]" +fi + +nboucl=$(( $each * 60 / $dt )) + +echo "output nboucl: $nboucl (automatic) [each $each min$i]" + +#np + +tmp=$(( ( $d2 - $d1 + 1 ) * 24 * 3600 % ( $dt * $nboucl ) )) +if [ $tmp -ne 0 ] ; then + DAMNED "value error: np prints (np) impossible to compute (check dt, nboucl, d1, d2)" +fi + +np=$(( ( $d2 - $d1 + 1 ) * 24 * 3600 / ( $dt * $nboucl ) )) + +echo "nb prints np: -$np (automatic)" + +#ntfast + +i="" +if [ $ntfast -eq 0 ] ; then + ntfast=3 #default: 3 + i="(automatic)" +fi + +echo "nb fast over dt ntfast: $ntfast $i" + +#dtDiff + +i="" +if [ $dtDiff -eq 0 ] ; then #default = dt + dtDiff=$dt + i="(automatic)" +else #user defined + if [ $dtDiff -ne $dt ] ; then #error + DAMNED "value error: diffusion time step (dtDiff) not equal to the slow-dynamics time step (dt) $[$dtDiff/$dt]" + fi +fi + +echo "diffusion dtDiff: $dtDiff s $i" + +#dtPhys + +i="" +if [ $dtPhys -eq 0 ] ; then #default = dt + dtPhys=$dt + i="(automatic)" +else #user defined + if [ $dtPhys -ne $dt ] ; then #error + DAMNED "value error: surf. physics time step (dtPhys) not equal to the slow-dynamics time step (dt) $[$dtDiff/$dt]" + fi +fi + +echo "surface physics dtPhys: $dtPhys s $i" + +#dtRadi + +i="" +if [ $dtRadi -eq 0 ] ; then #default = 3600 s + dtRadi=3600 + i="(automatic)" +fi +[ $(( $dtRadi % $dt )) -ne 0 ] && DAMNED "value error: radiat. transfer time step (dtRadi) not a multiple of the slow-dynamics time step (dt) [$dtRadi/$dt]" + +echo "radiat. transfer dtRadi: $dtRadi s $i" + +# +# Save your MAR.ctr file +#--------------------------------------- +TITLE2 "Save your MAR.ctr file" + +MARctr=MAR.ctr.$tyrI$tmoI${td1I}-$tyrF$tmoF$td2F + #e.g. MAR.ctr.931201-931231 (global and end dates) + +if [ $again = "n" ] ; then + cp -fp $0.ctr $CTRLdir/$MARctr + chmod -x $CTRLdir/$MARctr + echo "cp: $0.ctr -> $CTRLdir/$MARctr" +else + echo "cp: $CTRLdir/$MARctr kept" + ln -sf $CTRLdir/$MARctr $RUNdir +fi + +# +# MARtime.ctr +#--------------------------------------- + +[ -f $CTRLdir/MARdt.dat ] && mv $CTRLdir/MARdt.dat $CTRLdir/MARdt.ctr + +[ -f $CTRLdir/MARtime.ctr ] && rm -f $CTRLdir/MARtime.ctr + + +if [ -f $CTRLdir/MARdt.ctr ] ; then + + tmp_head=`grep "$yr ${mo#0} ${d1#0} " $CTRLdir/MARdt.ctr | head -1` + tmp_heada=`grep "$yr ${mo} ${d1} " $CTRLdir/MARdt.ctr | head -1` + tmp_headb=`grep "$yr 0${mo} ${d1} " $CTRLdir/MARdt.ctr | head -1` + + tmp_tail=`grep "$yr ${mo#0} ${d1#0} " $CTRLdir/MARdt.ctr | tail -1` + tmp_taila=`grep "$yr ${mo} ${d1} " $CTRLdir/MARdt.ctr | tail -1` + tmp_tailb=`grep "$yr 0${mo} ${d1} " $CTRLdir/MARdt.ctr | tail -1` + + tmp_next=`grep "$yr ${mo#0} ${d1#0} " $CTRLdir/MARdt.ctr | grep next | tail -1` + + [ ${#tmp_heada} -gt 0 ] && tmp_head=$tmp_heada + [ ${#tmp_headb} -gt 0 ] && tmp_head=$tmp_headb + + [ ${#tmp_taila} -gt 0 ] && tmp_tail=$tmp_taila + [ ${#tmp_tailb} -gt 0 ] && tmp_tail=$tmp_tailb + + if [ ${#tmp_tail} -gt 0 ] ; then + + dt_tail=`echo $tmp_tail | awk '{print $4}'` + dt_head=`echo $tmp_head | awk '{print $4}'` + + dt_next=`echo $tmp_next | awk '{print $4}'` + + dtold=$dt_tail + [ $dt_head -gt $dt_tail ] && dtold=$dt_head + [ ${#dt_next} -gt 0 ] && dtold=$dt_next + + dtnew=`echo $tmp_tail | awk '{print $5}'` + + TITLE2 "MARtime.ctr" + + echo "job command file < $CTRLdir/MARtime.ctr input data files" + + [ $dtnew -lt $dt ] && \ + echo "$yrN ${moN#0} ${d1N#0} $dtnew $dt next" >> $CTRLdir/MARdt.ctr + echo "$yr ${mo#0} ${d1#0} $dtold $dtnew" >> $CTRLdir/MARtime.ctr + + [ $dtnew -eq $dtold ] && [ $dtnew -lt $dt ] && \ + touch "$HOME/WARNING_MARtime_${runnam}_${yr}_${mo#0}_${d1#0}.ctr" + + dt=$dtnew ; dtDiff=$dt ; dtPhys=$dt + nboucl=$(( 360 * 60 / $dt )) + + fi + +fi + +#------------------------------------------------------------------------------- +# 2 - MAR PROCESSING BATCH COMMAND FILE +#------------------------------------------------------------------------------- +TITLE1 "MAR PROCESSING BATCH COMMAND FILE" + +# +# Job command file setup +#--------------------------------------- +TITLE2 "Job command file setup" + +bch="MAR_$WLDreg$runnam.$tyr.$tmo.${td1}-$td2" + #> MAR_EUt01.93.12.01-31* batch command file + # MAR_EUt01.93.12.01-31.eole.eo batch command file standard error/output + # MAR_EUt01.93.12.01-31.eole.??? batch command file state (in $WRKmsg) + # MAR_EUt01.93.12.01-31/ simulation directory on scratch + +job="$runnam$tyr$tmo$td1$slice" #job name for the batch queue (t01931201a) + +if [ -f $RUNdir/$bch.cmd ] ; then + if [ $again = "y" ] ; then + echo "rm: existing $RUNdir/$bch.cmd" + if [ -f $RUNdir/crash$tyr$tmo$td1$td2 ] ; then + echo "mv: $RUNdir/$bch.cmd $RUNdir/$bch.cmd-crash (crash$tyr$tmo$td1$td2)" + mv -f $RUNdir/$bch.cmd $RUNdir/$bch.cmd-crash + fi + rm -f $RUNdir/$bch.cmd + else + ERROR "job command file $bch.cmd existing. Delete it?" + rm -f $RUNdir/$bch.cmd + fi +fi +touch $RUNdir/$bch.cmd +echo "job command file: $RUNdir/$bch.cmd" + +CMDfile=$RUNdir/$bch.cmd + +########################################## + +if [ -z $NBR_CPU ] ; then + echo "NBR_CPU not defined in MAR.ctr!!" + exit +fi + +########################################## + + + +# +# Job command file content +#--------------------------------------- +TITLE2 "Job command file content" + +# +# Batch specifications +#--------------------------------------- + +if [ $dt -le 10 ] ; then + echo "ERROR dt=$dt" + BCH "exit" + exit +fi + + +case $cluster in +(nic) + BCH "#!/bin/bash" + BCH "#job name" + BCH "#$ -N $job" + #BCH "#environment" + #BCH "#$ -V" + BCH "#memory request" + BCH "#$ -l h_vmem=600M" + BCH "#$ -l h_rt=$walltime:0:0" + BCH "#$ -l highmem=false" + BCH "#$ -pe snode $NBR_CPU" + BCH "#$ -j y" + BCH "#$ -o $WRKmsg/$bch.eo" + BCH "#$ -cwd" ;; +(ceci) + BCH "#!/bin/bash" + BCH "#SBATCH --job-name=$job" + + [ $CLUSTER_NAME == "dragon1" ] && BCH "#SBATCH --exclude=dr20" + + [ $CLUSTER_NAME == "hercules" ] && BCH "#SBATCH --constraint=Intel" +# BCH "#SBATCH --constraint=Intel" + BCH "#SBATCH --mail-user=$Email" + BCH "#SBATCH --mail-type=FAIL" + BCH "#SBATCH --time=0-$walltime:00:00" + BCH "#SBATCH --ntasks=1" + BCH "#SBATCH --cpus-per-task=$NBR_CPU" + BCH "#SBATCH --ntasks-per-node=1" + BCH "#SBATCH --mem-per-cpu=600" + BCH "#SBATCH --output=$WRKmsg/$bch-%N-%j.eo" ;; +(idris) + walltime=$(( $walltime * 3600 )) + tmp=$(( $walltime - 2000 )) + BCH "#!/bin/ksh" + BCH "#@\$-lT $walltime" #Temps CPU limite du travail en secondes + BCH "#@\$-lt $tmp" #Temps limite de chaque processus + BCH "#@\$-lM 4gb" #Memoire totale occupee par un travail NQS + BCH "#@\$-nr" #pas de restart en cas de plantage de la machine + BCH "#@\$-eo" #Sorties stdout et stderr dans le meme fichier + BCH "#@\$-o $WRKmsg/$bch.eo" + BCH "#@\$-r $job" + BCH "export F_PROGINF=detail" # Parametres d'affichage des performances + BCH "export F_FTRACE=yes" ;; +(linux) + BCH "#!/bin/bash" + BCH "#PBS -N $job" + BCH "#PBS -o $WRKmsg/$bch.eo" + BCH "#PBS -j oe" + BCH "#PBS -l nodes=1:ppn=$NBR_CPU" +# tmp=`date "+%H"` + +#if [ ${tmp#0} -ge 22 ] || [ ${tmp#0} -le 8 ] || [ `date "+%a"` == "Sun" ] || [ `date "+%a"` == "Sat" ] ; then +# NBR_CPU=$(( $NBR_CPU + 2 )) +# [ $NBR_CPU -ge 10 ] && NBR_CPU=10 +#fi + + BCH "#PBS -m a" + BCH "#PBS -r y" + BCH "#PBS -M $Email" +# BCH "#PBS -l select=1:ncpus=$NBR_CPU:vmem=3000mb:mpiprocs=1:ompthreads=$NBR_CPU" +# BCH "#PBS -l pvmem=3000mb" +# BCH "#PBS -l walltime=$walltime:00:00" +# BCH "#PBS -W group_list=polar" ;; +;; +(foehn|froggy) + BCH "#!/bin/bash" + BCH "#OAR -n $job" + BCH "#OAR --stdout $WRKmsg/$bch.o" + BCH "#OAR --stderr $WRKmsg/$bch.e" + BCH "#OAR --project regional-climate" + BCH "#OAR -l nodes=1/core=$NBR_CPU,walltime=$walltime:00:00" ;; +(nasa) + BCH "#!/bin/bash" + BCH "#SBATCH --job-name=$job" + BCH "#SBATCH --mail-user=$Email" + BCH "#SBATCH --mail-type=FAIL" + BCH "#SBATCH -t $walltime:00:00" + BCH "#SBATCH -N 1" + BCH "#SBATCH -A S1001" + BCH "#SBATCH --ntasks-per-node=$NBR_CPU" + BCH "#SBATCH --output=$WRKmsg/$bch-%N-%j.eo" ;; +esac +BCH ". $MARbin/INI.ctr" +BCH ". $MARbin/FUNCTIONS" + +BCH " export NBR_CPU=$NBR_CPU" +BCH " export OMP_NUM_THREADS=\$NBR_CPU" + + +echo "job command file < batch specifications" + +# +# Initialisation +#--------------------------------------- +BCHt "Initialisation" + +#variables definition + +BCHc "variables definition" + +BCH "host=\`hostname -s\`" + +#job messages file in $WRKmsg + +BCHc "job messages file in $WRKmsg" + +BCH "if [ ! -f $RUNdir/crash$tyr$tmo$td1$td2 ] ; then" +BCH " rm -f $WRKmsg/$bch.\${host%\${host#???}}*" +BCH "else" #keep a trace of the bug +BCH " for fil in \`ls $WRKmsg/$bch*\` ; do" +BCH " mv -f \$fil \${fil}-crash" +BCH " done" +BCH "fi" + +case $cluster in +(linux|nic|ceci|nasa|foehn|froggy) + BCH "msg=$WRKmsg/$bch.\$host" ;; +(idris) + BCH "msg=$WRKmsg/$bch" ;; #idris: if any change in this line, also change + #the file name of stderr/out output of the job + #(NQS instructions) +esac +BCH "touch \$msg" + +echo "job command file < initialisation" + +# +# Job informations +#--------------------------------------- +BCHt "Job informations" + +BCH "[ -d \${WRKdir} ] || mkdir -p \${WRKdir}" +BCH +BCH "echo \"Begin (initial) : $td1/$tmo/$yr ($td1I/$tmoI/$yrI)\"" +BCH "echo \"End (final ) : $td2/$tmo/$yr ($td2F/$tmoF/$yrF)\"" +BCH "echo" +BCH "echo \"Domain : $domain ($DOMdir)\"" +BCH "echo" +BCH "echo \"Date : \`date\`\"" +BCH "echo \"Host : \$host\"" +BCH "echo \"Work directory : \${WRKdir}\"" +BCH "echo \"Messages in : $WRKmsg\"" + +[ ! -d $MARsim/bin/run ] && mkdir $MARsim/bin/run + +if [ $nagain == "n" ] ; then +BCH "echo \"\$host \`date +\"%Y-%m-%d %H:%M\"\` $runnam $yr $mo $td1 $td2 $dt \$NBR_CPU ${CLUSTER_NAME}\" >> $MARsim/bin/run/$runnam" +fi + +echo "job command file < job informations" + +# +# Work directory +#--------------------------------------- +BCHt "Work directory" + +#work directory (\${WRKdir}/$bch) + +BCHc "work directory (\${WRKdir}/$bch)" + +if [ $cluster = "nic" ] ; then + BCH "tmp=\`df -k \${WRKdir} | tail -1 | awk '{print(\$4)}'\`" + BCH "if [ \$tmp -le 2000000 ] ; then" + BCH " echo \"Not space left on device on \`hostname\` at \`date\`\"" + BCH "#qsub $RUNdir/$bch.cmd" + BCH " sleep 120" + BCH " END_EXIT" + BCH "fi" +fi + +BCH "[ ! -d \${WRKdir} ] && mkdir -p \${WRKdir}" +BCH +BCH "if [ ! -d \${WRKdir}/$bch ] ; then" +BCH " mkdir \${WRKdir}/$bch ; err=\$?" +BCH "else" +BCH " rm -rf \${WRKdir}/$bch" +BCH " mkdir \${WRKdir}/$bch ; err=\$?" +BCH " echo \"rm: existing \${WRKdir}/$bch\"" +BCH "fi" +BCH "#[ \$err -eq 1 ] && $QSUB $RUNdir/$bch.cmd && sleep 120 && END_EXIT" +BCH "if [ -d \${WRKdir}/$bch.CRASH ] ; then" +BCH " rm -rf \${WRKdir}/$bch.CRASH" +BCH " echo \"rm: existing \${WRKdir}/$bch.CRASH\"" +BCH "fi" + + +BCH "WRKdix=\${WRKdir}" #to keep it intact and use it in case of CRASH +BCH "WRKdir=\${WRKdir}/$bch" + +BCH "mkdir \${WRKdir}/core" + +#MAR executable + +BCHc "MAR executable" + +MARexe=MAR_$runnam #$MARexe.exe + +BCH "if [ ! -f \"$WRKtmp/$MARexe.exe\" ] ; then" +BCH " smget \"$STKmar/$domain/$runnam/code\" \"$MARexe.exe\" \"\${WRKdir}\"" +BCH "else" +BCH " cp \"$WRKtmp/$MARexe.exe\" \"\${WRKdir}\"" +BCH "fi" + +BCH "if [ ! -f \${WRKdir}/$MARexe.exe ] ; then" +BCH " DAMNED \"executable non-existent [\${WRKdir}/$MARexe.exe]\" \"$MARexe\"" +BCH " END_EXIT" +BCH "fi" +BCH "chmod +x \${WRKdir}/$MARexe.exe" + +echo "job command file < support tests" + +# +# Input data files +#--------------------------------------- +BCHt "Input data files" + +#datMAR/*.dat + + #MARinf.dat, MARs01.dat, MARs02.dat, MARgou.dat + #MARvou.dat, AWSvou.dat, ICEvou.dat + +BCHc "datMAR/*.dat" + +BCH "echo ; echo \" > datMAR/*.dat\" ; echo" +BCH + + #1 look if any *.dat were designed for this simulation X99 + # (means: MAR/SIMdir/.../input/datMAR/X99/*.dat files exist) + #2 if yes, use those files; if no, use the standard ..input/datMAR/*.dat files + +BCH "cp $MARsim/src/datMAR/*.dat \${WRKdir}" + +if [ -d $INPUTdir/datMAR/$runnam ] ; then + tmp=`ls $INPUTdir/datMAR/$runnam/*.dat` + if [ `echo $tmp | wc -w` -eq 0 ] ; then + ERROR "$INPUTdir/datMAR/$runnam: empty directory. Use $INPUTdir/datMAR/*.dat files instead?" + tmp=`ls $INPUTdir/datMAR/*.dat` + fi +else + tmp=`ls $INPUTdir/datMAR/*.dat` +fi + +[ `echo $tmp | wc -w` -eq 0 ] && DAMNED "$INPUTdir/datMAR: empty directory, no *.dat file found" + +BCH "tmp=0" +for MARfil in $tmp ; do +BCH "cp -f $MARfil \${WRKdir}/" +BCH "tmp=\$(( \$tmp + \$? ))" +done +BCH "[ \$tmp -gt 0 ] && END_EXIT" + +#user *.dat + +if [ -d $INPUTdir/../../../usr/ ] ; then + echo "job command file < $INPUTdir/../../../usr/*.dat input data files" + BCH "cp -f $INPUTdir/../../../usr/*.dat \${WRKdir}/" + BCH "cp -f $INPUTdir/../../../usr/*.nc \${WRKdir}/ 2>/dev/null " + BCH "cp -f $INPUTdir/../../../usr/*.cdf \${WRKdir}/ 2>/dev/null" +fi + +if [ -d $INPUTdir/../usr/ ] ; then + echo "job command file < $INPUTdir/../usr/*.dat input data files" + BCH "cp -f $INPUTdir/../usr/*.dat \${WRKdir}/" + BCH "cp -f $INPUTdir/../usr/*.nc \${WRKdir}/ 2>/dev/null" + BCH "cp -f $INPUTdir/../usr/*.cdf \${WRKdir}/ 2>/dev/null " +fi + +if [ -d $DOMdir/usr/ ] ; then + echo "job command file < $DOMdir/usr/*.dat input data files" + BCH "cp -f $DOMdir/usr/*.dat \${WRKdir}/" + BCH "cp -f $DOMdir/usr/*.nc \${WRKdir}/ 2>/dev/null" + BCH "cp -f $DOMdir/usr/*.cdf \${WRKdir}/ 2>/dev/null " +fi + +echo "job command file < datMAR/*.dat input data files" + +#MARscenario.ctr + +file=MARscenario.ctr + +[ ${#RCP_CMIP5} -gt 0 ] && BCH "echo $RCP_CMIP5 > \${WRKdir}/$file" +[ ${#yr_360} -gt 0 ] && [ $yr_360 == "y" ] && BCH "echo YR_360 >> \${WRKdir}/$file" +[ ${#yr_365} -gt 0 ] && [ $yr_365 == "y" ] && BCH "echo YR_365 >> \${WRKdir}/$file" + +#MARtime.ctr + +if [ -f $CTRLdir/MARtime.ctr ] ; then + + BCH "cp $CTRLdir/MARtime.ctr \${WRKdir}/MARtime.ctr" + +fi + +#MARdom.dat + +BCHc "MARdom.dat" + +MARdom=MARdom_$domain.$yrI.$tmoI.$td1I.dat +[ $nstzip = "y" ] && Z=".gz" || Z="" + + +BCH "echo ; echo \" > MARdom.dat ($MARdom)\" ; echo" +BCH +if [ $yr -eq $yrI -a $tmo -eq $tmoI -a $td1 -eq $td1I ] ; then #MARdom < stock +BCH "smget \"$STKmar/$domain/input/NESTOR/$yrI\" \"$MARdom$Z\" \"\${WRKdir}\"" + #smget exits if an error occurs +[ ! -d $INPUTdir/MARdom/$runnam ] && mkdir $INPUTdir/MARdom/$runnam +BCH "cp -f \${WRKdir}/$MARdom$Z $INPUTdir/MARdom/$runnam/" +else #MARdom < input/ +BCH "cp -f $INPUTdir/MARdom/$runnam/$MARdom$Z \${WRKdir}/" +fi +if [ $nstzip = "y" ] ; then +BCH "ucX \"\${WRKdir}\" \"$MARdom\" \"$Z\"" +BCH "[ \$? -ne 0 ] && DAMNED \"MARdom.dat not found\" \"MARdom\" && END_EXIT" +fi + + #change the simulation name in MARdom.dat +BCH "sed \"s|$domain|$runnam|g\" \${WRKdir}/$MARdom > \${WRKdir}/MARdom.dat" +BCH "rm -f \${WRKdir}/$MARdom" +BCH "mv MARdom.dat $MARdom ; ln -s $MARdom MARdom.dat" + +echo "job command file < MARdom.dat input data file" + +#MAR*.DAT + +BCHc "MAR*.DAT" + +if [ $again = "n" ] ; then #get MAR*.DAT < MARini + +MARini=MARini_$domain.$yrI.$tmoI.${td1I}.DAT +[ $nstzip = "y" ] && Z=".tar.gz" || Z=".tar" + +BCH "echo ; echo \" > MAR*.DAT ($MARini)\" ; echo" +BCH +BCH "smget \"$STKmar/$domain/input/NESTOR/$yrI\" \"$MARini$Z\" \"\${WRKdir}\"" +BCH "ucX \"\${WRKdir}\" \"$MARini\" \"$Z\" \"MARdyn.DAT\"" +BCH "[ \$? -ne 0 ] && DAMNED \"MARini.dat not found\" \"MARini\" && END_EXIT" +BCH "rm -f \${WRKdir}/$MARini* ; ln -s MARdyn.DAT $MARini" + +else #get MAR*.DAT < MARsim + +MARsim=MARsim_$runnam.$yr.$tmo.$td1${version}.DAT +[ $marzip = "y" ] && Z=".tar.gz" || Z=".tar" + +BCH "echo ; echo \" > MAR*.DAT ($MARsim)\" ; echo" + +BCH "if [ ! -f \"$WRKtmp/$MARsim$Z\" ] ; then" +BCH " smget \"$STKmar/$domain/input/MARsim/$runnam/$yr\" \"$MARsim$Z\" \"\${WRKdir}\"" +BCH "else" +BCH " cp \"$WRKtmp/$MARsim$Z\" \"\${WRKdir}\"" +BCH "fi" +BCH "[ ! -f \"$MARsim$Z\" ] && rm -f $RUNdir/$bch.cmd && DAMNED \"MARsim.DAT not found\" \"MARsim\" && END_EXIT" + +BCH "ucX \"\${WRKdir}\" \"$MARsim\" \"$Z\" \"MARdyn.DAT\"" +BCH "rm -f \${WRKdir}/$MARsim* ; ln -s MARdyn.DAT $MARsim" + +fi + +echo "job command file < MAR*.DAT input data files" + +#caraib input files + +yl=$((yr - 1)) + +CARfil=$STKmar/$domain/ +CARcou="CARAIB_couplage.tar.gz" +CARfilres=$STKmar/$domain/CARAIB_couplage/results/Belgium + +BCH "echo \" $CARfil \${WRKdir}\ \"" + +BCH " " +BCH "smget \"$CARfil\" \"$CARcou\" \"\${WRKdir}\"" +BCH "tar -xzf \"\${WRKdir}\"/\"$CARcou\"" +BCH "rm -rf \${WRKdir}/CARAIB_couplage.tar.gz" +# BCH " " +# BCH "rm -rf \${WRKdir}/CARAIB_couplage/results/Belgium/*" +# BCH " " +# BCH "for fil in \`ls \${CARfilres}/*"${yl}"*\` ; do" +# BCH " smput \"\$CARfilres/\" \"\$fil\" \"\${WRKdir}/CARAIB_couplage/results/Belgium/\"" +# BCH "done" + +echo "job command file < CARAIB input data files" + + + +#MARlbc.DAT, MARglf.DAT, MARsic.DAT, MARubc.DAT + +STKbc=$STKmar/$domain/input/NESTOR/$yr + +[ $nstzip = "y" ] && Z=".gz" || Z="" + +for bcfil in "MARlbc" "MARglf" "MARsic" "MARubc" ; do + + if [ $bcfil == "MARlbc" ] ; then + + BCHc "$bcfil.DAT" + + [ $nstzip = "y" ] && Z=".gz" || Z="" + + tmp1=0 + + for MARbc in "${bcfil}_$domain.$yr.$tmo" ; do + + tmp1=$(( $tmp1 + 1 )) + + [ $tmp1 -eq 1 ] && ttd1=$td1 && ttd2=$td2 + [ $tmp1 -eq 2 ] && ttd1=$td1N && ttd2=$td2N + + BCH "echo ; echo \" > $bcfil.DAT ($MARbc*)\" ; echo" + BCH + BCH " #look for existing $bcfil.DAT on stock" + BCH + case $cluster in + (nic|linux|nasa|ceci) + BCH "rm -f $HOME/.bcls-$RAND" + + BCH "if [ \${#gateway} -gt 0 ] ; then" + [ ! -z ${FTPwait} ] && BCH "sftpwait" + BCH "\$gateway \"\$ssh $optionssh $ustock@$stock \\\" cd $STKbc ; ls -1 $MARbc* \\\"\" > $HOME/.bcls-$RAND" + BCH "else" + BCH "i=0 ; err=1" + BCH "while [ \$err -ne 0 ] && [ \$i -le 30 ] ; do" + BCH "i=\$(( \$i + 1 )) ; sleep \$(( \$i * 2 ))" + if [ $cluster == "nasa" ] || [ ${#ssh} -eq 0 ] ; then + BCH "cd $STKbc ; ls -1 $MARbc* > $HOME/.bcls-$RAND ; err=\$?" + else + [ ! -z ${FTPwait} ] && BCH "sftpwait" + BCH "\$ssh $optionssh $ustock@$stock \" cd $STKbc ; ls -1 $MARbc* \" > $HOME/.bcls-$RAND ; err=\$?" + fi + BCH "done" + BCH "fi" + BCH "tmp=\`cat $HOME/.bcls-$RAND | tr '\\n' ' '\`" ;; + (idris) + BCH "tmp=\`mfls $STKbc/$MARbc* | grep $STKbc | awk '{print(\$8)}'\`" + BCH "tmp=\`echo \$tmp | sed \"s:$STKbc/::g\"\`" ;; + (foehn|froggy) + BCH "tmp=\`ils $STKbc | grep $MARbc\` ; tmp=\${tmp##*\ }" + BCH "tmp=\`echo \$tmp | sed \"s:$STKbc/::g\"\`" ;; + + esac + BCH "tmp=\`echo \$tmp | sed \"s:$MARbc.::g\"\`" + BCH "tmp=\`echo \$tmp | sed \"s:.DAT$Z::g\"\`" + BCH "j=\`echo \$tmp | wc -w\`" + BCH "tmp=\`echo \$tmp | sed \"s/-/ /g\"\`" + BCH "i=0 ; x=0" + BCH "while [ \$i -lt \$(( \$j * 2 )) ] ; do" + BCH " bcd1[\$x]=\`echo \$tmp | cut -d' ' -f\$(( \$i + 1 ))\`" + BCH " bcd2[\$x]=\`echo \$tmp | cut -d' ' -f\$(( \$i + 2 ))\`" + BCH " i=\$(( \$i + 2 ))" + BCH " x=\$(( \$x + 1 ))" + BCH "done" + + case $cluster in + (nic|ceci|nasa|linux|foehn|froggy) + BCH "rm -f $HOME/.bcls-$RAND" ;; + esac + + BCH + BCH " #find the more suitable $bcfil.DAT" + BCH + BCH "echo \"period: ${ttd1}-$ttd2\"" + BCH "i=0 ; tmp=\"\"" + BCH "for x1 in \${bcd1[@]} ; do" + BCH " if [ \$x1 -le $ttd1 ] ; then" + BCH " if [ \${bcd2[10#\$i]} -ge $ttd2 ] ; then" + BCH " tmp=\$tmp\" \$i\" #index of candidates" + BCH " echo \" candidate \$i: \$x1-\${bcd2[10#\$i]}\"" + BCH " fi" + BCH " fi" + BCH " i=\$(( \$i + 1 ))" + BCH "done" + BCH "i=\`echo \$tmp | wc -w\`" + BCH "i=\$(( \$i + 0 )) #number of candidates" + BCH "case \$i in" + BCH "(0) DAMNED \"no $bcfil.DAT found in $STKbc on stock\" \"$bcfil\"" ; + BCH " END_EXIT ;;" + BCH "(1) for x in \$tmp ; do" + BCH " ld1=\${bcd1[\$x]}" + BCH " ld2=\${bcd2[\$x]}" + BCH " done" + BCH " echo \"chosen: \${ld1}-\$ld2\" ;;" + BCH "(*) tmp2=${day[10#$tmo]} ;" #maximum length of a MAR*.DAT file + BCH " for x in \$tmp ; do" + BCH " if [ \$(( 10#\${bcd2[\$x]} - 10#\${bcd1[\$x]} )) -le \$tmp2 ] ; then" + BCH " tmp2=\$(( 10#\${bcd2[\$x]} - 10#\${bcd1[\$x]} ))" + BCH " ld1=\${bcd1[\$x]}" + BCH " ld2=\${bcd2[\$x]}" + BCH " fi" + BCH " done ;" + BCH " echo \"chosen: \${ld1}-\$ld2\" ;;" + BCH "esac" + + [ $tmp1 -eq 1 ] && BCH " MARbc=$MARbc.\${ld1}-\$ld2.DAT" + BCH "rm -f \${WRKdir}/$bcfil.DAT" + done + fi + + BCH "MARbc=${bcfil}_$domain.$yr.$tmo.\${ld1}-\$ld2.DAT" + + BCH "if [ ! -f \"$WRKtmp/\$MARbc$Z\" ] ; then" + BCH " smget \"$STKbc\" \"\$MARbc$Z\" \"\${WRKdir}\"" + BCH "else" + BCH " if [ ${tmoN#0} -ne ${tmo#0} ] ; then" + BCH " mv -f \"$WRKtmp/\$MARbc$Z\" \"\${WRKdir}\"" + BCH " else" + BCH " cp -f \"$WRKtmp/\$MARbc$Z\" \"\${WRKdir}\"" + BCH " fi" + BCH "fi" + + BCH "[ ! -f \"\$MARbc$Z\" ] && END_EXIT" + + if [ $nstzip = "y" ] ; then + BCH "ucX \"\${WRKdir}\" \"\$MARbc\" \"$Z\"" + BCH "[ \$? -ne 0 ] && END_EXIT" + fi + BCH "ln -s \$MARbc $bcfil.DAT" + +done + +echo "job command file < MARlbc.DAT, MARglf.DAT input data files" + +#MARctr.dat + +BCHc "MARctr.dat" + +BCH "echo ; echo \" > MARctr.dat\" ; echo" + +BCH "echo \"${blank[11]}T reaVAR=.F. => Input INI: Prev.Dyn.Simulat. (MAR, GCM) |\" > \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T reaLBC=.F. => Input LBC: Prev.Dyn.Simulat. (MAR, GCM) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T safVAR=.T. => Full Output on Saving Files MARxxx.DAT |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}F hamfil=.T. => Initial Filtered Fields (Time, Hamming) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T conmas=.T. => Mass Conserv. Constraint on Init. |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}F potvor=.T. => P.-Vortic. Conserv. Constraint on Init. |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T brocam=.T. => Brown and Campana Time Scheme (Fast W.) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T center=.T. => Pressure Spatial Scheme centered |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}4 nordps= 4 : Pressure Spatial Scheme Precision |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T staggr=.T. => Vertical Grid staggered |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T turhor=.T. => Horizontal Diffusion (Smagorinsky) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}F chimod=.F. => Atmospheric Chemical Model turned OFF |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}${CA} convec=.T. => Convective Adjustment turned ON |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T micphy=.T. => Cloud Microphysics turned ON |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T fracld=.F. => Fractional Cloudiness turned OFF |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 100.0 rhcrHY : Critical Relative Humidity Value |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 0.0 tim_HY=18.0: Cloud Microphys. start after 18h |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 0.0001D+00 czmnGE : cos(Z) minimal value |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}T physic=.T. => Atmospheric/Surface Physics included |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}${SV} vegmod=.F. => Interactive SVAT turned OFF |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}${SN} snomod=.F. => Interactive Snow Model is included |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}${PO} polmod=.F. => Interactive Polynya is included |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 1.00 hic0 : Initial Thickness of Sea Ice |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 0.10 fxlead : Initial Lead Fraction in Sea Ice |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}F qsolSL=.T. => Soil Humidity is interactive |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[10-${#dt}]}$dt.0 dt => Time Step of Slow Dynamics (s) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" $nboucl nboucl => Nb Time Steps between each Print |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[12-1-${#np}]}-$np np => Nb Prints${blank[31]}|\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[11]}$ntfast ntfast : Nb Fast Time Steps over dt (Lamb) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[10-${#dtDiff}]}$dtDiff.0 dtDiff : Time Step of Diffusion |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[10-${#dtPhys}]}$dtPhys.0 dtPhys : Time Step of Surface Physics (s) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"${blank[10-${#dtRadi}]}$dtRadi.0 dtRadi : Time Step of Radiat. Transfert (s) |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 5.0000D-03 rxbase : Nudging Coefficient (Anthes et al. 1989)|\" >> \${WRKdir}/MARctr.dat" +BCH "echo \" 1.0000D+02 rxfact : Lateral Sponge Coefficient (A89)|\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"+-------------------------------------------------------------------+\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"|${blank[39]} |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"| Simulation $runnam${blank[43]}${version} |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"| Periode $td1/$tmo/$yr -> $td2/$tmo/$yr${blank[27]}|\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"| Time Step $dt s${blank[39]} |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"| Conv. adjust. $CA${blank[41]} |\" >> \${WRKdir}/MARctr.dat" +if [ $SV == "T" ] ; then +BCH "echo \"| Surface model SISVAT ${blank[39]} |\" >> \${WRKdir}/MARctr.dat" +elif [ $SV == "F" ] ; then +BCH "echo \"| Surface model Deardorff${blank[39]} |\" >> \${WRKdir}/MARctr.dat" +fi +BCH "echo \"| Snow model $SN${blank[41]} |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"| Polynya model $PO${blank[41]} |\" >> \${WRKdir}/MARctr.dat" + +BCH "echo \"|${blank[39]} |\" >> \${WRKdir}/MARctr.dat" +BCH "echo \"+-------------------------------------------------------------------+\" >> \${WRKdir}/MARctr.dat" +BCH +BCH "[ ! -d $INPUTdir/MARctr/$runnam ] && mkdir $INPUTdir/MARctr/$runnam" +BCH "cp \${WRKdir}/MARctr.dat $INPUTdir/MARctr/$runnam/MARctr.dat.$tyr$tmo$td1-$tyr$tmo$td2" + +echo "job command file < MARctr.dat input data file" + +# +# Stock initialisation +#--------------------------------------- +BCHt "Stock initialisation" + + #creating needed directory on stock +if [ -z ${FTPout} ] ; then +case $cluster in +(nic|ceci|linux) +#[ ! -z ${FTPwait} ] && BCH "sftpwait" +if [ ${#ssh} -eq 0 ] ; then +BCH "mkdir -p $STKmar/$domain/crash" +BCH "mkdir -p $STKmar/$domain/$runnam/log" +BCH "mkdir -p $STKmar/$domain/$runnam/$yr" +BCH "mkdir -p $STKmar/$domain/input/MARsim/$runnam/$yrN" + +BCH "#creating CAR folders" +BCH "mkdir -p $STKmar/$domain/$runnam/caraib" +BCH "mkdir -p $STKmar/$domain/$runnam/caraib/$yr" +fi +;; +(foehn|froggy) +BCH "imkdir -p $STKmar/$domain/crash 2>/dev/null" +BCH "imkdir -p $STKmar/$domain/$runnam/log 2>/dev/null" +BCH "imkdir -p $STKmar/$domain/$runnam/$yr 2>/dev/null" +BCH "imkdir -p $STKmar/$domain/input/MARsim/$runnam/$yrN 2>/dev/null" ;; +(nasa) +BCH "mkdir -p $STKmar/$domain/crash &" +BCH "mkdir -p $STKmar/$domain/$runnam/log &" +BCH "mkdir -p $STKmar/$domain/$runnam/$yr &" +BCH "mkdir -p $STKmar/$domain/input/MARsim/$runnam/$yrN &" ;; +esac +fi + +STKcrash=$STKmar/$domain/crash +STKlog=$STKmar/$domain/$runnam/log +STKout=$STKmar/$domain/$runnam/mar/$yr +STKsim=$STKmar/$domain/input/MARsim/$runnam/$yrN +STKcar=$STKmar/$domain/$runnam/caraib/$yr + +echo "job command file < stock initialisation" + +# +# Coupling with GRISLI +# -------------------- + +if [ ${#GRISLI} -gt 0 ] && [ ${GRISLI} == "y" ] ; then + +BCH "while [ ! -f GRISLI4MAR_${runnam}_${yr}0101.cdf ] ; do" +BCH " smget \"~/MAR/ice/out/${runnam}\" \"GRISLI4MAR_${runnam}_${yr}0101.cdf\" \"\${WRKdir}\"" +BCH " cp GRISLI4MAR_${runnam}_${yr}0101.cdf ~/MAR/usr &>/dev/null" +BCH " echo \"GRISLI4MAR_${runnam}_${yr}0101.cdf\" >> \${WRKdir}/MARscenario.ctr" +BCH "done" +fi + +# +# MAR launch +#--------------------------------------- +BCHt "MAR launch" + +BCH "cd \${WRKdir}" + +BCH "ulimit -s unlimited" + +BCH "md5sum $MARexe.exe" + +case $cluster in +(idris) BCH " timex ./$MARexe.exe &> \${WRKdir}/$MARexe.log" ;; +(nic|ceci|foehn|froggy|nasa) BCH " time ./$MARexe.exe &> \${WRKdir}/$MARexe.log" ;; +(linux) BCH " time nice -n19 ./$MARexe.exe &> \${WRKdir}/$MARexe.log" ;; +esac + +BCH "ncdump -v rainHY MAR.*.nc > tmp3.dat" +BCH "tmp1=\`grep \"nan, nan, nan,\" *.log | tail -1\`" + +[ -f $CTRLdir/MARtime.ctr ] && BCH "rm -f $CTRLdir/MARtime.ctr" + +BCH "if [ -f \${WRKdir}/MAR.OK ] && [ \${#tmp1} -eq 0 ] ; then" + +BCH " echo" +BCH " echo \"MAR run: OK (\`date\`)\"" +BCH " marcrash=0" + +BCH "else" + +BCH " cp \${WRKdir}/MAR.log \${WRKdir}/MAR.log2" +BCH " if [ \$? -ne 0 ] ; then" +BCH " echo \"Not space left on device on \`hostname\` at \`date\`\"" +BCH " #qsub $RUNdir/$bch.cmd" +BCH " sleep 120" +BCH " rm -rf \${WRKdir}" +BCH " END_EXIT" +BCH " else" + +BCH " DAMNED \"MAR error (MAR.OK non-existent) (\`date\`)\" \"CRASH\"" + +BCH " date > mail.txt" +BCH " hostname -f >> mail.txt" +BCH " tail -2 \${WRKdir}/MAR.log | head -1 >> mail.txt" +BCH " tail -15 \${WRKdir}/$MARexe.log >> mail.txt" +BCH " end1=\`tail -2 MAR.log | head -1 | awk '{print \$2}'\`" +BCH " end2=\`tail -2 MAR.log | head -1 | awk '{print \$3}'\`" +BCH " end3=\`tail -2 MAR.log | head -1 | awk '{print \$4}'\`" + +# WARNING it must be a divider of 3600s !!! +# e.g. 35s is not a divider + +[ $dt -eq 300 ] && dtnew=240 +[ $dt -eq 240 ] && dtnew=225 +[ $dt -eq 225 ] && dtnew=200 +[ $dt -eq 200 ] && dtnew=180 +[ $dt -eq 180 ] && dtnew=150 +[ $dt -eq 150 ] && dtnew=120 +[ $dt -eq 120 ] && dtnew=100 +[ $dt -eq 100 ] && dtnew=90 +[ $dt -eq 90 ] && dtnew=80 +[ $dt -eq 80 ] && dtnew=75 +[ $dt -eq 75 ] && dtnew=60 +[ $dt -eq 60 ] && dtnew=50 +[ $dt -eq 50 ] && dtnew=45 +[ $dt -eq 45 ] && dtnew=40 +[ $dt -eq 40 ] && dtnew=30 +[ $dt -eq 30 ] && dtnew=25 +[ $dt -eq 25 ] && dtnew=20 +[ $dt -eq 20 ] && dtnew=15 +[ $dt -eq 15 ] && dtnew=10 +[ $dt -eq 10 ] && echo "ERROR: dt=$dt too low!!" && exit + +BCH " mail -s \"$job CRASH on \$host at \$end1 \$end2 \$end3: $dt => $dtnew s\" $Email < mail.txt" +BCH " echo \"$yr ${tmo#0} ${td1#0} $dt $dtnew \$end1 \$end2 \$end3\" >> $CTRLdir/MARdt.ctr" + +if [ $again = "n" ] ; then + +BCHt "WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING" +BCHt "Go to the node \$host:\${WRKdir}" +BCHt " " +BCHt "If MAR has crashed at the first time step, check" +BCHt " - the MARini/inisnow files (are they present? Are dimensions OK ?)." +BCHt " - the dimensions of your executable vs $INPUTdir/input/NESTOR/src/NSTdim.inc in NESTOR (eg: mw, mzabso,...)" +BCHt "and manually run MAR afterward: cd \${WRKdir} on \$host; rm -f *.log *.out ;ulimit -s unlimited ; export OMP_NUM_THREADS=4 ; ./$MARexe" +BCHt " " +BCHt "If MAR has crashed after several time steps, reduce your time step in ~/MAR/bin/MAR.ctr and start MAR again" +BCHt "It is possible to reincrease your time step afterward (via ${CTRLdir}/MAR.ctr*)" +BCHt " " +BCHt "WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING" +BCH "exit" + +else + +BCH " MAR -again $CTRLdir/$MARctr $runnam $yr $tmo $td1 $slice" +BCH " touch $HOME/CRASH1_${job}_on_\$host " + +fi + +BCH " rm -f mail.txt \${WRKdir}/MAR.log2 &>/dev/null" + +BCH " tail \${WRKdir}/MAR.log \${WRKdir}/$MARexe.log" + +BCH " crashtime=\"\`tail -1 \${WRKdir}/$MARexe.log\`\"" + +BCH " mv -f \${WRKdir} \$WRKdix/$bch.\$host.CRASH" +BCH " tarX \"\$WRKdix\" \"$bch.\$host.CRASH\"" +BCH " rm -rf \$WRKdix/$bch.\$host.CRASH" + +if [ $marzip = "y" ] ; then + Z=".gz" +BCH " gzipX \"\$WRKdix\" \"$bch.\$host.CRASH.tar\"" +BCH " [ \$? -ne 0 ] && END_EXIT" +else + Z="" +fi + +BCH " smput \"\$WRKdix\" \"$bch.\$host.CRASH.tar$Z\" \"$STKcrash\"" +BCH " [ \$? -eq 0 ] && rm -f \$WRKdix/$bch.\$host.CRASH.tar$Z" +[ $cluster = "linux" ] && BCH " cd $WRKmsg ; \$QSUB $RUNdir/$bch.cmd" +[ $cluster = "foehn" ] && BCH " cd $WRKmsg ; \$QSUB $RUNdir/$bch.cmd" +[ $cluster = "froggy" ] && BCH " cd $WRKmsg ; \$QSUB $RUNdir/$bch.cmd" +[ $cluster = "nic" ] && BCH " cd $WRKmsg ; \$QSUB $RUNdir/$bch.cmd\"" +[ $cluster = "ceci" ] && BCH " cd $WRKmsg ; cd $RUNdir ; \$gateway \$QSUB $bch.cmd" +[ $cluster = "nasa" ] && BCH " cd $WRKmsg ; \$gateway \$QSUB $RUNdir/$bch.cmd" +BCH " marcrash=1 ; exit" +BCH " fi" +BCH "fi" + +#marcrash=1: go straight to 'Informations to summary file' +#marcrash=0: just go on as usual +BCHc "test on marcrash (not) to skip part of the script" + +BCH "#marcrash=1: go straight to Informations to summary file" +BCH "#marcrash=0: just go on as usual" +BCH +BCH "if [ \$marcrash -eq 0 ] ; then ## marcrash if ##" ## marcrash if ## +BCH + +echo "job command file < MAR launch" + +# +# Backup: listing files +#--------------------------------------- +BCHt "Backup: listing files" + +BCH "ls -l \${WRKdir}" + +BCHc "remove not needed files" + +BCH "echo ; echo \"not needed files will be removed\" ; echo" +BCH "rm -f \${WRKdir}/MARphy.out \${WRKdir}/MARbil.out" +BCH "rm -f \${WRKdir}/MARlbc* \${WRKdir}/MARglf* \${WRKdir}/MARsic* \${WRKdir}/MARubc*" +BCH "rm -f \${WRKdir}/MARsim* \${WRKdir}/MARini* \${WRKdir}/*.dat" + +[ $marzip = "y" ] && BCH "rm -f \${WRKdir}/*.gz" + +BCH +BCH "ls -l \${WRKdir}" + +# +# Backup: .log files +#--------------------------------------- +BCHt "Backup: .log files (MAR.log, $MARexe.log)" + +MARlog=MAR.log.$runnam.$tyr$tmo$td1$slice +MARlox=$MARexe.log.$tyr$tmo$td1$slice +BCH "mv -f \${WRKdir}/MAR.log \${WRKdir}/$MARlog" +BCH "mv -f \${WRKdir}/$MARexe.log \${WRKdir}/$MARlox" + +BCH "smput \"\${WRKdir}\" \"$MARlog\" \"$STKlog\"" +BCH "[ \$? -eq 0 ] && rm -f \${WRKdir}/$MARlog" +BCH "smput \"\${WRKdir}\" \"$MARlox\" \"$STKlog\"" +BCH "[ \$? -eq 0 ] && rm -f \${WRKdir}/$MARlox" + +echo "job command file < backup: .log files" + +# +# Backup: MARsim.DAT +#--------------------------------------- +BCHt "Backup: MARsim.DAT" + +MARsimN=MARsim_$runnam.$yrN.$tmoN.${td1N}${version}.DAT + +BCH "tarX \"\${WRKdir}\" \"MAR*.DAT\" \"$MARsimN\"" +BCH "if [ \$? -eq 0 ] ; then" +BCH " rm -f \${WRKdir}/MAR*.DAT" +BCH " Z=\".tar\"" +if [ $marzip = "y" ] ; then +BCH " gzipX \"\${WRKdir}\" \"$MARsimN\$Z\"" +BCH " [ \$? -eq 0 ] && Z=\"\$Z.gz\"" +fi +BCH " rm -f \"$WRKtmp/MARsim_${runnam}.\"*" +BCH " cp -f \"\${WRKdir}/$MARsimN\$Z\" \"$WRKtmp\"" +BCH " smput \"\${WRKdir}\" \"$MARsimN\$Z\" \"$STKsim\"" +BCH " if [ \$? -eq 0 ] ; then" +BCH " rm -f \${WRKdir}/$MARsimN\$Z" +BCH " rm -f \${WRKdir}/MAR*.DAT" +BCH " fi" +BCH " echo \"$MARsimN\$Z on stock\"" +BCH "fi" + +echo "job command file < backup: MARsim.DAT" + +# +# Launch of the next period +#--------------------------------------- +BCHt "Launch of the next period" +if [ ! -z $FTPin ] && [ -d $FTPin ] && [ $tmo -ne $tmoN ] ; then + BCH "rm -f $FTPin/MAR*_${domain}.$yr.*.gz &>/dev/null" +fi + +bchN=MAR_$WLDreg$runnam.$tyrN.$tmoN.${td1N}-$td2N + +if [ $nagain == "n" ] ; then + +if [ $yrN$tmoN$td2N -gt $yrF$tmoF$td2F ] ; then + BCH "echo \"entire simulation over\"" + BCH "touch \$msg.bye" + BCH "echo \"echo \\\"Entire simulation over on $yrF $tmoF $td2F for $WLDreg$runnam\\\"\" > $RUNdir/$bchN.cmd" + BCH "echo \"exit\" >> $RUNdir/$bchN.cmd" + BCH "cat $RUNdir/$bch.cmd >> $RUNdir/$bchN.cmd" + BCH "chmod +x $RUNdir/$bchN.cmd" + BCH "[ -f $MARbin/run/$runnam ] && mv $MARbin/run/$runnam $MARbin/run/${runnam}_end" +else + BCH "echo \"next simulation is: $domain $runnam $yrN$tmoN$td1N$sliceN\"" + BCH "MAR -again $CTRLdir/$MARctr $runnam $yrN $tmoN $td1N $sliceN > /dev/null" + BCH "if [ \$? -ne 99 -a -f $RUNdir/$bchN.cmd ] ; then" + case $cluster in + (idris) BCH " \$QSUB $RUNdir/$bchN.cmd" ;; + (nic ) BCH " \$QSUB $RUNdir/$bchN.cmd\"" ;; + (ceci) BCH " \$gateway \$QSUB $RUNdir/$bchN.cmd" ;; + (nasa) BCH " \$gateway \$QSUB $RUNdir/$bchN.cmd" ;; + (foehn|froggy) BCH " $QSUB $RUNdir/$bchN.cmd" ;; + (linux) if [ $job_pbs = "y" ] ; then + BCH " cd $WRKmsg ; $QSUB $RUNdir/$bchN.cmd" + else + BCH " ( ./$RUNdir/$bchN.cmd &> $RUNdir/$bchN.cmd.log ) &" + fi ;; + esac + BCH " echo \"$bchN.cmd launched in batch on $cluster\"" + BCH "else" + BCH " DAMNED \"no job command file for next period simulation [$RUNdir/$bchN.cmd]\" \"fil\"" + BCH "fi" +fi + +fi + +echo "job command file < launch of the next period" + +# +# Backup: MAR output files +#--------------------------------------- + +BCH +BCH "#" +BCH "# CARAIB backup" +BCH "# ------------------------" + +echo "Back up the caraib files" + +#Back up of the results in .nc +BCH " for fil in \`ls \${WRKdir}/*CAR*.nc\` ; do" +BCH " smput \"\${WRKdir}\" \"\$fil\" \"$STKcar\"" +BCH " done" + +#Back up of the results in .res +BCH " for fil in \`ls \${WRKdir}/CARAIB_couplage/results/Belgium/*${yr}*\` ; do" +BCH " smput \"\${WRKdir}/CARAIB_couplage/results/Belgium/\" \"\$fil\" \"$STKcar\"" +BCH " done" + +BCH " tar -czf \${WRKdir}/CARAIB_couplage.tar.gz \${WRKdir}/CARAIB_couplage " +BCH " smput \"\${WRKdir}/\" \"CARAIB_couplage.tar.gz\" \"$CARfil\"" + + +BCHt "Backup: MAR output files" + +BCHc "Backup of existing *.nc files" +BCH "echo ; echo \" Backup of existing *.nc files\" ; echo" + +BCH "cd \${WRKdir}" + +type_list="MAR ICE ONE ICS" + +[ ${#ICE_only} -gt 0 ] && [ $ICE_only == "y" ] && ICE_out="y" && ONE_out="n" && MAR_out="n" && ICS_out="n" +[ ${#ICE_only} -gt 0 ] && [ $ICE_only == "o" ] && ICE_out="y" && ONE_out="o" && MAR_out="n" && ICS_out="n" + +[ ${#ICE_out} -eq 0 ] && ICE_out="n" +[ ${#ICS_out} -eq 0 ] && ICS_out="n" +[ ${#ONE_out} -eq 0 ] && ONE_out="n" +[ ${#MAR_out} -eq 0 ] && MAR_out="n" + +[ ${ICE_out} == "y" ] && [ ${ONE_out} == "y" ] && [ ${MAR_out} == "n" ] && type_list="ICE ONE" && BCH "rm -f \${WRKdir}/MAR.*.nc" +[ ${ICE_out} == "y" ] && [ ${ONE_out} == "n" ] && [ ${MAR_out} == "n" ] && type_list="ICE" && BCH "rm -f \${WRKdir}/MAR.*.nc" && BCH "rm -f \${WRKdir}/ONE.*.nc" +[ ${ICE_out} == "y" ] && [ ${ICS_out} == "y" ] && type_list="ICE ICS" + +for type in $type_list ; do +MARout=${type}.$runnam.$yr.$tmo.${td1}-$td2${version}.nc +#[ $type = "ONE" ] && BCH "rm -f \${WRKdir}/${type}*nc" +BCH +BCH " #${type} NetCDF output file" +BCH +BCH "if [ ! -f \${WRKdir}/${type}*nc ] ; then" +BCH " echo \"${type} NetCDF output file non-existent\"" +BCH "else" +BCH " echo ; echo \" > ${type} ($MARout)\" ; echo" +BCH " mv -f \${WRKdir}/${type}*nc \${WRKdir}/$MARout" +BCH " Z=\"\"" +if [ $marzip = "y" ] ; then + BCH " gzipX \"\${WRKdir}\" \"$MARout\"" + BCH " [ \$? -eq 0 ] && Z=\".gz\"" +fi +BCH "smput \"\${WRKdir}\" \"$MARout\$Z\" \"$STKout\"" +BCH "[ \$? -eq 0 ] && rm -f \${WRKdir}/$MARout\$Z" +BCH "fi" +done + +MARout=SBCnew.AWS.$runnam.$yr$tmo${td1}-$td2 +BCH +BCH " #SBCnew.AWS output file (WAF only)" +BCH +BCH "if [ -f \${WRKdir}/SBCnew.AWS ] ; then" +BCH " echo ; echo \" > SBCnew.AWS ($MARout)\" ; echo" +BCH " mv -f \${WRKdir}/SBCnew.AWS \${WRKdir}/$MARout" +BCH " smput \"\${WRKdir}\" \"$MARout\" \"$STKout\"" +BCH " [ \$? -eq 0 ] && rm -f \${WRKdir}/$MARout" +BCH "fi" + +BCH +BCH " #stations NetCDF output file" +BCH +MARout=$runnam.$yr.$tmo.${td1}-$td2.nc +BCH "if [ ! -f \${WRKdir}/*nc ] ; then" +BCH " echo ; echo \" > stations\" ; echo" +BCH " echo \"no other NetCDF output file\"" +BCH "else" +BCH " for fil in \`ls *.nc\` ; do" +BCH " [ \"\${fil:0:3}\" != \"ANT\" ] && mv \$fil \${fil%%.*}.$MARout" +#CA BCH " mv \$fil \${fil%%.*}.$MARout" +BCH " done" +if [ $marzip = "y" ] ; then +BCH " for fil in \`ls *.nc\` ; do" +BCH " [ \"\${fil:0:3}\" != \"ANT\" ] && gzipX \"\${WRKdir}\" \"\$fil\"" +#CA BCH " gzipX \"\${WRKdir}\" \"\$fil\"" +BCH " [ \$? -eq 0 ] && Z=\".gz\"" +BCH " done" +else +BCH " Z=\"\"" +fi +BCH " for fil in \`ls *.nc\$Z\` ; do" +BCH " smput \"\${WRKdir}\" \"\$fil\" \"$STKout\"" +BCH " [ \$? -eq 0 ] && rm -f \${WRKdir}/\$fil\$Z" +BCH " done" +BCH " for fil in \`ls SBCnew.AWS*\` ; do" +BCH " [ \"\${fil:0:3}\" != \"ANT\" ] && smput \"\${WRKdir}\" \"\$fil\" \"$STKout\"" +#CA BCH " smput \"\${WRKdir}\" \"\$fil\" \"$STKout\"" +BCH " [ \$? -eq 0 ] && rm -f \${WRKdir}/\$fil\$Z" +BCH " done" +BCH "fi" + +echo "job command file < backup: MAR output files" + +BCH +BCH "fi ## marcrash if ##" ## marcrash if ## +BCH +BCH + +# +# Informations to summary file +#--------------------------------------- +BCHt "Informations to summary file" + +#add informations about the MAR simulation to the summary file, +#if simulation successfully over or if simulation crashed. + +BCH "[ $yrN$tmoN$td2N -gt $yrF$tmoF$td2F -a \${#crashtime} -eq 0 ] && descrfile="y" #RUN OVER & NO CRASH" +BCH "[ $yrN$tmoN$td2N -gt $yrF$tmoF$td2F -a \${#crashtime} -ne 0 ] && descrfile="y" #RUN OVER $ CRASH" +BCH "[ $yrN$tmoN$td2N -le $yrF$tmoF$td2F -a \${#crashtime} -eq 0 ] && descrfile="n" #RUN NOT OVER & NO CRASH" +BCH "[ $yrN$tmoN$td2N -le $yrF$tmoF$td2F -a \${#crashtime} -ne 0 ] && descrfile="y" #RUN NOT OVER & CRASH" + +#specific comments on the simulation < MAR.ctr +comments=`grep "^##" $CTRLdir/$MARctr | sed "s/##//g"` + +#descr.$domain: add those informations to the summary file + +descr=${DOMdir%$runnam}descr.$domain +descrrun=$CTRLdir/descr.$runnam + +BCH "if [ \$descrfile = \"y\" ] ; then" +BCH " [ ! -f $descr ] && touch $descr" + +#general +BCH " [ \${#crashtime} -ne 0 ] && echo \"##CRASH##CRASH##CRASH##CRASH##CRASH##CRASH##CRASH## \`date\`\" >> $descr" +BCH " [ \${#crashtime} -eq 0 ] && echo \"################################################### \`date\`\" >> $descr" +BCH " echo \"name : $runnam\" >> $descr" +BCH " echo \"period : $td1I.$tmoI.$yrI to $td2F.$tmoF.$yrF\" >> $descr" +BCH " tmp=\`sed -n '1,3p' $descrrun\`" +BCH " echo \"\$tmp\" >> $descr" + +#time steps +BCH " echo \"${hyphen[80]}\" >> $descr" +BCH " echo \"dt : $dt s${blank[10-2-${#dt}]}ntfast: $ntfast\" >>$descr" +BCH " echo \"np : -$np ${blank[10-2-${#np}]}nboucl: $nboucl ${blank[10-1-${#nboucl}]}output: each $each min\" >> $descr" +BCH " echo \"dtDiff: $dtDiff s${blank[10-2-${#dtDiff}]}dtPhys: $dtPhys s${blank[10-2-${#dtPhys}]}dtRadi: $dtRadi s\" >> $descr" + +#MAR options, directories and programs version +BCH " tmp=\`sed -n '4,21p' $descrrun\`" +BCH " echo \"\$tmp\" >> $descr" +BCH " echo \"cluster : $cluster (\`uname -n\`)\" >> $descr" +BCH " tmp=\`sed -n '22,26p' $descrrun\`" +BCH " echo \"\$tmp\" >> $descr" + +#specific comments +BCH " echo \"${hyphen[80]}\" >> $descr" +BCH " echo \"Informations:\" >> $descr" +BCH " echo \"$comments\" >> $descr" + +#possible crash +BCH " if [ \${#crashtime} -ne 0 ] ; then" +BCH " echo \"${hyphen[75]}CRASH\" >> $descr" +BCH " echo \"CRASH on:\" >> $descr" +BCH " echo \"\$crashtime\" >> $descr" +BCH " fi" + +BCH " echo \"################################################################################\" >> $descr" + +BCH " echo \"informations to summary file $descr\"" + +BCH "else" + +BCH " echo \"simulation not yet over\"" + +BCH "fi" + +echo "job command file < informations to summary file" + +# +# Final job check +#--------------------------------------- +BCHt "Final job check" + +BCH " echo \"$job job executed successfully on $cluster\"" +BCH " mv \$msg \$msg.ok" + + #remove the \${WRKdir} directory if the job is a success + +if [ $cluster != "idris" ] ; then +BCH " rm -rf \${WRKdir}" +fi + +echo "job command file < final job check" + +BCH "echo \`date\`" + +BCH "END_EXIT" + +# +# Job command file executable +#--------------------------------------- + +TITLE2 "job command file executable" + +chmod +x $RUNdir/$bch.cmd + +echo "$RUNdir/$bch.cmd" + +exit 0