diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA_TEMPLATE b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA_TEMPLATE new file mode 100644 index 0000000000000000000000000000000000000000..1227e9bf4d50a7faa281e78dc00791e955adfe72 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA_TEMPLATE @@ -0,0 +1,38 @@ +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 137 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EN +GATEWAY xxx.xxx.xxx.xxx +DESTINATION xxx@xxx +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_Vv.v +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__CV b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__CV new file mode 100644 index 0000000000000000000000000000000000000000..4b4aa161090ddda7422e54a4f15f6d3d6f9869a9 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__CV @@ -0,0 +1,38 @@ +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV +M_TIME 00 00 00 00 00 00 00 00 00 00 00 00 12 12 12 12 12 12 12 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11 +M_CLASS OD +M_STREAM ENFO +M_NUMBER 1 +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 62 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EG +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__EI b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__EI new file mode 100644 index 0000000000000000000000000000000000000000..c2acbb71daf90e5288ad50ff1e060abff4cc7375 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__EI @@ -0,0 +1,38 @@ +DAY1 20121107 +DAY2 20121108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS EI +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 60 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EI +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__GLOBALETA b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__GLOBALETA new file mode 100644 index 0000000000000000000000000000000000000000..50d9a58548cd57af43466cb51560e40a6fd0be70 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__GLOBALETA @@ -0,0 +1,38 @@ +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 137 +M_RESOL 159 +M_GAUSS 0 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 1 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EE +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__GLOBALGAUSS b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__GLOBALGAUSS new file mode 100644 index 0000000000000000000000000000000000000000..e250d255166b59b9977f6a4692a32ca103c124a3 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__GLOBALGAUSS @@ -0,0 +1,38 @@ +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 137 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EG +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__HAIYAN b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__HAIYAN new file mode 100644 index 0000000000000000000000000000000000000000..8e5cfbdbffe1ce5047f3aeae62cd1a7c68f70675 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__HAIYAN @@ -0,0 +1,38 @@ +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 200 +M_LEFT 113000 +M_LOWER 00000 +M_UPPER 30000 +M_RIGHT 190000 +M_LEVEL 137 +M_RESOL 799 +M_GAUSS 0 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 1 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EH +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__HIRES b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__HIRES new file mode 100644 index 0000000000000000000000000000000000000000..a76207b1cffe09f1febb17a10d8126cb3f074f8a --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_ERA__HIRES @@ -0,0 +1,38 @@ +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 200 +M_LEFT -10000 +M_LOWER 30000 +M_UPPER 60000 +M_RIGHT 30000 +M_LEVEL 137 +M_RESOL 799 +M_GAUSS 0 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 1 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EH +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_TEMPLATE b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_TEMPLATE new file mode 100644 index 0000000000000000000000000000000000000000..b216923bffd4895580a501c7fcdd1a8f190a25c9 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_TEMPLATE @@ -0,0 +1,28 @@ +M_TYPE AN FC FC FC FC FC FC FC FC FC FC FC AN FC FC FC FC FC FC FC FC FC FC FC FC +M_TIME 00 00 00 00 00 00 00 00 00 00 00 00 12 12 12 12 12 12 12 12 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11 12 +DTIME 1 +PREFIX EN +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_GRID 1000 +M_RESOL 255 +M_SMOOTH 0 +M_GAUSS 0 +M_ETA 1 +M_ETAPAR 77 +M_DPDETA 1 +M_LEVEL 137 +M_LEVELIST 1/to/137 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +M_FORMAT GRIB1 +GATEWAY xxx.xxx.xxx.xxx +DESTINATION xxx@xxx +ECSTORAGE 1 +ECTRANS 1 +ECFSDIR ectmp:/xxx/ecops +MAILOPS xxx +MAILFAIL xxx +EXEDIR . +SOURCECODE /home/ms/ggg/xxx/flex_extract_ecgate_Vv.v diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_V6.0 b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_V6.0 new file mode 100644 index 0000000000000000000000000000000000000000..d082d52e7db7b0383c103820cf28b8cea14f1a8d --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_V6.0 @@ -0,0 +1,28 @@ +M_TYPE AN FC FC FC FC FC FC FC FC FC FC FC AN FC FC FC FC FC FC FC FC FC FC FC FC +M_TIME 00 00 00 00 00 00 00 00 00 00 00 00 12 12 12 12 12 12 12 12 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11 12 +DTIME 1 +PREFIX EN +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_GRID 1000 +M_RESOL 255 +M_SMOOTH 0 +M_GAUSS 0 +M_ETA 1 +M_ETAPAR 77 +M_DPDETA 1 +M_LEVEL 137 +M_LEVELIST 1/to/137 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +M_FORMAT GRIB1 +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 1 +ECFSDIR ectmp:/lh0/ecops +MAILOPS lh0 +MAILFAIL lh0 +EXEDIR . +SOURCECODE /home/ms/spatlh00/lh0/flex_extract_ecgate_V6.0 diff --git a/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_V6.0_4V b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_V6.0_4V new file mode 100644 index 0000000000000000000000000000000000000000..4951f0d8df6c5be78fcf90848d7b6e6199be825e --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/CONTROL_OPS_V6.0_4V @@ -0,0 +1,28 @@ +M_TYPE AN FC FC FC FC FC FC FC FC FC FC FC AN FC FC FC FC FC FC FC FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 09 00 00 09 12 12 12 12 12 18 12 12 21 12 12 21 +M_STEP 00 01 02 03 04 05 00 07 08 00 10 11 03 01 02 03 04 05 00 07 08 00 10 11 03 +DTIME 3 +PREFIX EN +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_GRID 1000 +M_RESOL 255 +M_SMOOTH 179 +M_GAUSS 1 +M_ETA 0 +M_ETAPAR 77 +M_DPDETA 1 +M_LEVEL 137 +M_LEVELIST 1/to/137 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +M_FORMAT GRIB1 +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 1 +ECFSDIR ectmp:/lh0/ecops +MAILOPS lh0 +MAILFAIL lh0 +EXEDIR . +SOURCECODE /home/ms/spatlh00/lh0/flex_extract_ecgate_V6.0 diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_body b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_body new file mode 100644 index 0000000000000000000000000000000000000000..4ecdc4c3d157d123d16f8a9284597da5c784a152 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_body @@ -0,0 +1,863 @@ +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + +date2m14() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-14 + civildate2 $j0 + } + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +#if [[ ${MPAR} == 'LNSP' ]] ; then +# MLEV=1 +#else +# if [[ ${MLTY} == 'SFC' ]] ; then +# MLEV=OFF +# else +# MLEV=${M_LEVELIST} +# fi +#fi + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +#if [[ ! -f "surf_${M_STEP}_ub" ]] ; then +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF + +if [[ $MSJ_BASETIME == 00 ]] ; then + DAY2P2=`date2p1 ${DAY2P1}` + cat <<EOF >>mars_flux +RETRIEVE, +DATE=${DAY2P2}, +TIME=00, +TARGET="surf_${MSTEP}_ub" +EOF +fi +#fi +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + + exit 1 + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +export MARS_MULTITARGET_STRICT_FORMAT=1 + +if [ $M_GAUSS -eq 1 ] ; then + export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-G_V${VERSION} + mkdir $SCRATCHDIR >/dev/null +else + export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-L_V${VERSION} + mkdir $SCRATCHDIR >/dev/null +fi + +# +# cleanup +# +#\rm -f $SCRATCHDIR/* +\rm -f $SCRATCHDIR/fort* + +[ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR +cd $SCRATCHDIR + + +DAY1=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} +if [ $MSJ_BASETIME -eq 00 ] ; then + DAY2=DAY1 +else + DAY2=`date2p1 ${DAY1}` +fi + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2m1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY1}` + + +#echo 'field date :' $M_DATE_S, $M_TIME_S +#echo 'flux dates :' $FLXDT1, $FLXT1, $FLXDT2, $FLXT2 + +#take care of nameing convention +#M_DATEX=`echo ${M_DATE_S} | cut -c3-8` +#DATEREFX=`echo ${DATEREF} | cut -c3-8` + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + echo "WARNING: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +cp ${SOURCECODE}/source.tar . +tar -xvf source.tar +if [[ $OS_VERSION == aix ]] ; then + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + ls + echo 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' ${INFILE} + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=$(( ${#M_TYPE[*]})) + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=0 +while [[ $j -lt 24 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM + + +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +iter=0 +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +if [ $MSJ_BASETIME -eq 00 ] ; then + MDATE=`date2m1 ${MDATE}` +fi + +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +set -A TYPEKEY ${M_TYPE[$j]} +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done +# LNSP treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob +# OROLSM treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +# if [ -f OROLSM ] ; then +# for oro in `ls +# cat OROLSM >> OROLSM${TNR}${MDATE}.${MMTIME}00.${MMSTEP} +# rm OROLSM +# echo 'found' +# exit 0 +# fi + rm marsjob + +k=$(($k+1)) +done + + + + +j=0 +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[$j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +# +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +if [ $TIME -eq 00 ]; then + MDATE=`date2p1 ${MDATE}` + MDATEX=`echo ${MDATE} | cut -c 3-8` +fi + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} + +# +# Convert to GRIB2 if needed +# +# to enable additional compression try +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + +else + echo ERROR: ENfile ${INFILE} missing! + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + echo 'ERROR: check on ENfile failed:' ${INFILE} + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +fi + + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) +(( iter = iter + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + + diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_ecgate b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_ecgate new file mode 100644 index 0000000000000000000000000000000000000000..6437f39162911f5dbe7b8ce4cb0f2ac0c8347faa --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_ecgate @@ -0,0 +1,904 @@ +#!/bin/ksh + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf_oper +#SBATCH --output=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --error=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --mail-type=ALL +#SBATCH --time=12:00:00 + + +set -x + +alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p' + +export OMP_NUM_THREADS=1 + +export VERSION=6.0 +JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION} +CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION} + +[ -z "$WSHOME" ] && export WSHOME=$HOME + +# # +# #testing purposes +# # +MSJ_YEAR=2013 +MSJ_MONTH=11 +MSJ_DAY=07 +MSJ_BASETIME=00 + +echo 'MSJ_ENVIRONMENT:' $MSJ_YEAR, $MSJ_MONTH, $MSJ_DAY, $MSJ_BASETIME + +DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} + + +WDAY=$(date +%A) +[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION} + +LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY}_${MSJ_BASETIME} +exec 1>${LOG_FILE} +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + +date2m14() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-14 + civildate2 $j0 + } + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +#if [[ ${MPAR} == 'LNSP' ]] ; then +# MLEV=1 +#else +# if [[ ${MLTY} == 'SFC' ]] ; then +# MLEV=OFF +# else +# MLEV=${M_LEVELIST} +# fi +#fi + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +#if [[ ! -f "surf_${M_STEP}_ub" ]] ; then +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF + +if [[ $MSJ_BASETIME == 00 ]] ; then + DAY2P2=`date2p1 ${DAY2P1}` + cat <<EOF >>mars_flux +RETRIEVE, +DATE=${DAY2P2}, +TIME=00, +TARGET="surf_${MSTEP}_ub" +EOF +fi +#fi +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + + exit 1 + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +export MARS_MULTITARGET_STRICT_FORMAT=1 + +if [ $M_GAUSS -eq 1 ] ; then + export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-G_V${VERSION} + mkdir $SCRATCHDIR >/dev/null +else + export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-L_V${VERSION} + mkdir $SCRATCHDIR >/dev/null +fi + +# +# cleanup +# +#\rm -f $SCRATCHDIR/* +\rm -f $SCRATCHDIR/fort* + +[ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR +cd $SCRATCHDIR + + +DAY1=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} +if [ $MSJ_BASETIME -eq 00 ] ; then + DAY2=DAY1 +else + DAY2=`date2p1 ${DAY1}` +fi + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2m1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY1}` + + +#echo 'field date :' $M_DATE_S, $M_TIME_S +#echo 'flux dates :' $FLXDT1, $FLXT1, $FLXDT2, $FLXT2 + +#take care of nameing convention +#M_DATEX=`echo ${M_DATE_S} | cut -c3-8` +#DATEREFX=`echo ${DATEREF} | cut -c3-8` + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + echo "WARNING: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +cp ${SOURCECODE}/source.tar . +tar -xvf source.tar +if [[ $OS_VERSION == aix ]] ; then + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + ls + echo 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' ${INFILE} + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=$(( ${#M_TYPE[*]})) + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=0 +while [[ $j -lt 24 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM + + +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +iter=0 +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +if [ $MSJ_BASETIME -eq 00 ] ; then + MDATE=`date2m1 ${MDATE}` +fi + +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +set -A TYPEKEY ${M_TYPE[$j]} +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done +# LNSP treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob +# OROLSM treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +# if [ -f OROLSM ] ; then +# for oro in `ls +# cat OROLSM >> OROLSM${TNR}${MDATE}.${MMTIME}00.${MMSTEP} +# rm OROLSM +# echo 'found' +# exit 0 +# fi + rm marsjob + +k=$(($k+1)) +done + + + + +j=0 +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[$j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +# +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +if [ $TIME -eq 00 ]; then + MDATE=`date2p1 ${MDATE}` + MDATEX=`echo ${MDATE} | cut -c 3-8` +fi + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} + +# +# Convert to GRIB2 if needed +# +# to enable additional compression try +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + +else + echo ERROR: ENfile ${INFILE} missing! + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + echo 'ERROR: check on ENfile failed:' ${INFILE} + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +fi + + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) +(( iter = iter + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + + diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_header b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_header new file mode 100644 index 0000000000000000000000000000000000000000..6f8aad00873d3266f0d658b53509f2b1d26f9d4c --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_header @@ -0,0 +1,41 @@ +#!/bin/ksh + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf_oper +#SBATCH --output=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --error=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --mail-type=ALL +#SBATCH --time=12:00:00 + + +set -x + +alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p' + +export OMP_NUM_THREADS=1 + +export VERSION=6.0 +JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION} +CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION} + +[ -z "$WSHOME" ] && export WSHOME=$HOME + +# # +# #testing purposes +# # +MSJ_YEAR=2013 +MSJ_MONTH=11 +MSJ_DAY=07 +MSJ_BASETIME=12 + +echo 'MSJ_ENVIRONMENT:' $MSJ_YEAR, $MSJ_MONTH, $MSJ_DAY, $MSJ_BASETIME + +DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} + + +WDAY=$(date +%A) +[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION} + +LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY}_${MSJ_BASETIME} +exec 1>${LOG_FILE} diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_header_template b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_header_template new file mode 100644 index 0000000000000000000000000000000000000000..f31b155c99337d37ca0fe999a68b49af113cae04 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_header_template @@ -0,0 +1,41 @@ +#!/bin/ksh + +#SBATCH --workdir=/scratch/ms/ggg/xxx +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf_oper +#SBATCH --output=ms_sms_output_Vv.v/CTBTO_ops.out +#SBATCH --error=ms_sms_output_Vv.v/CTBTO_ops.out +#SBATCH --mail-type=ALL +#SBATCH --time=12:00:00 + + +set -x + +alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p' + +export OMP_NUM_THREADS=1 + +export VERSION=v.v +JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION} +CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION} + +[ -z "$WSHOME" ] && export WSHOME=$HOME + +# # +# #testing purposes +# # +MSJ_YEAR=2013 +MSJ_MONTH=11 +MSJ_DAY=07 +MSJ_BASETIME=12 + +echo 'MSJ_ENVIRONMENT:' $MSJ_YEAR, $MSJ_MONTH, $MSJ_DAY, $MSJ_BASETIME + +DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} + + +WDAY=$(date +%A) +[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION} + +LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY}_${MSJ_BASETIME} +exec 1>${LOG_FILE} diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_ecgate b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_ecgate new file mode 100644 index 0000000000000000000000000000000000000000..01f5470c04a222cb77186dee152609cc08359420 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_ecgate @@ -0,0 +1,979 @@ +#!/bin/ksh + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf_oper +#SBATCH --output=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --error=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --mail-type=ALL +#SBATCH --time=12:00:00 + + +set -x + +alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p' + +export OMP_NUM_HREADS=1 + + + +########################### + +# ADD BEGIN AND END HERE # + +########################### + + MSJ_START=2013110700 + MSJ_END=2013110812 + + +########################### + +# NO CHANGES BELOW # + +########################### + +VERSION=6.0 +JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION} +CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION} + +WDAY=$(date +%A) +[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION} + +LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY} +exec 1>${LOG_FILE} + +[ -z "$WSHOME" ] && export WSHOME=$HOME + + DAY1=$(($MSJ_START/100)) + DAY2=$(($MSJ_END/100)) + TDIFF=$(( (`date +%s -d $DAY2` - `date +%s -d $DAY1` )/86400 )) + if [[ $TDIFF -lt 0 || $TDIFF -gt 31 ]] ; then + echo invalid difference $TDIFF between dates $1, $2 + echo difference must be positive and smaller than 32 + exit + fi + + + MSJ=$MSJ_START + MSJ_YEAR=$(( ($MSJ/1000000))) + while [ $MSJ -le $MSJ_END ] + do + + MSJ_MONTH=$(( ($MSJ%1000000)/10000)) + MSJ_DAY=$(( ($MSJ%10000)/100)) + MSJ_BASETIME=$(($MSJ%100)) + + if [ $MSJ_MONTH -lt 10 ] ; then + MSJ_MONTH='0'$MSJ_MONTH + fi + if [ $MSJ_DAY -lt 10 ] ; then + MSJ_DAY='0'$MSJ_DAY + fi + if [ $MSJ_BASETIME -lt 10 ] ; then + MSJ_BASETIME='0'$MSJ_BASETIME + fi + + MSJ=$MSJ_YEAR$MSJ_MONTH$MSJ_DAY$MSJ_BASETIME + + echo 'MSJ_ENVIRONMENT:' $MSJ + + DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} + + +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + +date2m14() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-14 + civildate2 $j0 + } + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +#if [[ ${MPAR} == 'LNSP' ]] ; then +# MLEV=1 +#else +# if [[ ${MLTY} == 'SFC' ]] ; then +# MLEV=OFF +# else +# MLEV=${M_LEVELIST} +# fi +#fi + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +#if [[ ! -f "surf_${M_STEP}_ub" ]] ; then +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF + +if [[ $MSJ_BASETIME == 00 ]] ; then + DAY2P2=`date2p1 ${DAY2P1}` + cat <<EOF >>mars_flux +RETRIEVE, +DATE=${DAY2P2}, +TIME=00, +TARGET="surf_${MSTEP}_ub" +EOF +fi +#fi +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + + exit 1 + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +export MARS_MULTITARGET_STRICT_FORMAT=1 + +if [ $M_GAUSS -eq 1 ] ; then + export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-G_V${VERSION} + mkdir $SCRATCHDIR >/dev/null +else + export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-L_V${VERSION} + mkdir $SCRATCHDIR >/dev/null +fi + +# +# cleanup +# +#\rm -f $SCRATCHDIR/* +\rm -f $SCRATCHDIR/fort* + +[ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR +cd $SCRATCHDIR + + +DAY1=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} +if [ $MSJ_BASETIME -eq 00 ] ; then + DAY2=DAY1 +else + DAY2=`date2p1 ${DAY1}` +fi + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2m1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY1}` + + +#echo 'field date :' $M_DATE_S, $M_TIME_S +#echo 'flux dates :' $FLXDT1, $FLXT1, $FLXDT2, $FLXT2 + +#take care of nameing convention +#M_DATEX=`echo ${M_DATE_S} | cut -c3-8` +#DATEREFX=`echo ${DATEREF} | cut -c3-8` + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + echo "WARNING: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +cp ${SOURCECODE}/source.tar . +tar -xvf source.tar +if [[ $OS_VERSION == aix ]] ; then + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + ls + echo 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' ${INFILE} + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=$(( ${#M_TYPE[*]})) + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=0 +while [[ $j -lt 24 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM + + +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +iter=0 +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +if [ $MSJ_BASETIME -eq 00 ] ; then + MDATE=`date2m1 ${MDATE}` +fi + +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +set -A TYPEKEY ${M_TYPE[$j]} +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done +# LNSP treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob +# OROLSM treated separately since it exists only on 1 level + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +# if [ -f OROLSM ] ; then +# for oro in `ls +# cat OROLSM >> OROLSM${TNR}${MDATE}.${MMTIME}00.${MMSTEP} +# rm OROLSM +# echo 'found' +# exit 0 +# fi + rm marsjob + +k=$(($k+1)) +done + + + + +j=0 +if [ $MSJ_BASETIME -eq 12 ] ; then + j=$(($DTIME)) + jmax=$(($DTIME+12)) +else + j=$(($DTIME+12)) +fi +if [ $iter -eq 1 ] ; then + j=0 + jmax=1 +fi +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[$j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +# +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +if [ $TIME -eq 00 ]; then + MDATE=`date2p1 ${MDATE}` + MDATEX=`echo ${MDATE} | cut -c 3-8` +fi + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} + +# +# Convert to GRIB2 if needed +# +# to enable additional compression try +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + +else + echo ERROR: ENfile ${INFILE} missing! + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + echo 'ERROR: check on ENfile failed:' ${INFILE} + echo ABORT! + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + exit 1 +fi + + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) +(( iter = iter + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + + +# go to next date 12 hours later + + if [ $(($MSJ%100)) -eq 0 ] ; then + MSJ=$(($MSJ+12)) + else + MSJ=$(($MSJ+88)) + fi + + + if [ $MSJ_MONTH -eq 2 ] + then + DDD=28 + [ `expr \$YYY \% 4` -eq 0 ] && DDD=29 + elif [ $MSJ_MONTH -eq 4 -o $MSJ_MONTH -eq 6 -o $MSJ_MONTH -eq 9 -o $MSJ_MONTH -eq 11 ] + then + DDD=30 + else + DDD=31 + fi + + if [ $MSJ_DAY -gt $DDD ] ; then + MSJ_DAY=1 + MSJ_MONTH=$(($MSJ_MONTH+1)) + fi + if [ $MSJ_MONTH -gt 12 ] ; then + MSJ_MONTH=1 + MSJ_YEAR=$(($MSJ_YEAR+1)) + fi + + + +# close +done diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_footer b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_footer new file mode 100644 index 0000000000000000000000000000000000000000..cd67637ba87e2c84be0b4edc8914067cb1f809c8 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_footer @@ -0,0 +1,33 @@ +# go to next date 12 hours later + + if [ $(($MSJ%100)) -eq 0 ] ; then + MSJ=$(($MSJ+12)) + else + MSJ=$(($MSJ+88)) + fi + + + if [ $MSJ_MONTH -eq 2 ] + then + DDD=28 + [ `expr \$YYY \% 4` -eq 0 ] && DDD=29 + elif [ $MSJ_MONTH -eq 4 -o $MSJ_MONTH -eq 6 -o $MSJ_MONTH -eq 9 -o $MSJ_MONTH -eq 11 ] + then + DDD=30 + else + DDD=31 + fi + + if [ $MSJ_DAY -gt $DDD ] ; then + MSJ_DAY=1 + MSJ_MONTH=$(($MSJ_MONTH+1)) + fi + if [ $MSJ_MONTH -gt 12 ] ; then + MSJ_MONTH=1 + MSJ_YEAR=$(($MSJ_YEAR+1)) + fi + + + +# close +done diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_header b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_header new file mode 100644 index 0000000000000000000000000000000000000000..ca1c56c0a19be20d3c87a6a387fd3aa9e78ffc32 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_header @@ -0,0 +1,83 @@ +#!/bin/ksh + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf_oper +#SBATCH --output=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --error=ms_sms_output_V6.0/CTBTO_ops.out +#SBATCH --mail-type=ALL +#SBATCH --time=12:00:00 + + +set -x + +alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p' + +export OMP_NUM_HREADS=1 + + + +########################### + +# ADD BEGIN AND END HERE # + +########################### + + MSJ_START=2013110700 + MSJ_END=2013110812 + + +########################### + +# NO CHANGES BELOW # + +########################### + +VERSION=6.0 +JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION} +CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION} + +WDAY=$(date +%A) +[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION} + +LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY} +exec 1>${LOG_FILE} + +[ -z "$WSHOME" ] && export WSHOME=$HOME + + DAY1=$(($MSJ_START/100)) + DAY2=$(($MSJ_END/100)) + TDIFF=$(( (`date +%s -d $DAY2` - `date +%s -d $DAY1` )/86400 )) + if [[ $TDIFF -lt 0 || $TDIFF -gt 31 ]] ; then + echo invalid difference $TDIFF between dates $1, $2 + echo difference must be positive and smaller than 32 + exit + fi + + + MSJ=$MSJ_START + MSJ_YEAR=$(( ($MSJ/1000000))) + while [ $MSJ -le $MSJ_END ] + do + + MSJ_MONTH=$(( ($MSJ%1000000)/10000)) + MSJ_DAY=$(( ($MSJ%10000)/100)) + MSJ_BASETIME=$(($MSJ%100)) + + if [ $MSJ_MONTH -lt 10 ] ; then + MSJ_MONTH='0'$MSJ_MONTH + fi + if [ $MSJ_DAY -lt 10 ] ; then + MSJ_DAY='0'$MSJ_DAY + fi + if [ $MSJ_BASETIME -lt 10 ] ; then + MSJ_BASETIME='0'$MSJ_BASETIME + fi + + MSJ=$MSJ_YEAR$MSJ_MONTH$MSJ_DAY$MSJ_BASETIME + + echo 'MSJ_ENVIRONMENT:' $MSJ + + DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} + + diff --git a/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_header_template b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_header_template new file mode 100644 index 0000000000000000000000000000000000000000..188c8b2dc9ce503aefd6e60f484fae84fe9bd14f --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_multi_header_template @@ -0,0 +1,83 @@ +#!/bin/ksh + +#SBATCH --workdir=/scratch/ms/ggg/xxx +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf_oper +#SBATCH --output=ms_sms_output_Vv.v/CTBTO_ops.out +#SBATCH --error=ms_sms_output_Vv.v/CTBTO_ops.out +#SBATCH --mail-type=ALL +#SBATCH --time=12:00:00 + + +set -x + +alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p' + +export OMP_NUM_HREADS=1 + + + +########################### + +# ADD BEGIN AND END HERE # + +########################### + + MSJ_START=2013110700 + MSJ_END=2013110812 + + +########################### + +# NO CHANGES BELOW # + +########################### + +VERSION=v.v +JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION} +CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION} + +WDAY=$(date +%A) +[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION} + +LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY} +exec 1>${LOG_FILE} + +[ -z "$WSHOME" ] && export WSHOME=$HOME + + DAY1=$(($MSJ_START/100)) + DAY2=$(($MSJ_END/100)) + TDIFF=$(( (`date +%s -d $DAY2` - `date +%s -d $DAY1` )/86400 )) + if [[ $TDIFF -lt 0 || $TDIFF -gt 31 ]] ; then + echo invalid difference $TDIFF between dates $1, $2 + echo difference must be positive and smaller than 32 + exit + fi + + + MSJ=$MSJ_START + MSJ_YEAR=$(( ($MSJ/1000000))) + while [ $MSJ -le $MSJ_END ] + do + + MSJ_MONTH=$(( ($MSJ%1000000)/10000)) + MSJ_DAY=$(( ($MSJ%10000)/100)) + MSJ_BASETIME=$(($MSJ%100)) + + if [ $MSJ_MONTH -lt 10 ] ; then + MSJ_MONTH='0'$MSJ_MONTH + fi + if [ $MSJ_DAY -lt 10 ] ; then + MSJ_DAY='0'$MSJ_DAY + fi + if [ $MSJ_BASETIME -lt 10 ] ; then + MSJ_BASETIME='0'$MSJ_BASETIME + fi + + MSJ=$MSJ_YEAR$MSJ_MONTH$MSJ_DAY$MSJ_BASETIME + + echo 'MSJ_ENVIRONMENT:' $MSJ + + DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY} + + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_CV b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_CV new file mode 100644 index 0000000000000000000000000000000000000000..a870879ae8a91e42d4ca9df5acd32aa389fce6d7 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_CV @@ -0,0 +1,873 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV +M_TIME 00 00 00 00 00 00 00 00 00 00 00 00 12 12 12 12 12 12 12 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11 +M_CLASS OD +M_STREAM ENFO +M_NUMBER 1 +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 62 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EG +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_EI b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_EI new file mode 100644 index 0000000000000000000000000000000000000000..b6f57c44bfce77101ea5687678373490d537adb7 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_EI @@ -0,0 +1,873 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA +DAY1 20121107 +DAY2 20121108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS EI +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 60 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EI +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_GLOBALETA b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_GLOBALETA new file mode 100644 index 0000000000000000000000000000000000000000..252010747c376b7b16365229a4c77ec51737b19d --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_GLOBALETA @@ -0,0 +1,873 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 137 +M_RESOL 159 +M_GAUSS 0 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 1 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EE +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_GLOBALGAUSS b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_GLOBALGAUSS new file mode 100644 index 0000000000000000000000000000000000000000..016c25c210aef73878ec6be2250d9c11f41f0244 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_GLOBALGAUSS @@ -0,0 +1,873 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 1000 +M_LEFT -179000 +M_LOWER -90000 +M_UPPER 90000 +M_RIGHT 180000 +M_LEVEL 137 +M_RESOL 159 +M_GAUSS 1 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 0 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EG +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_HAIYAN b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_HAIYAN new file mode 100644 index 0000000000000000000000000000000000000000..b6aacf28e21a82746a6c0875b95b43cc06b5cc22 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_HAIYAN @@ -0,0 +1,873 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 200 +M_LEFT 113000 +M_LOWER 00000 +M_UPPER 30000 +M_RIGHT 190000 +M_LEVEL 137 +M_RESOL 799 +M_GAUSS 0 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 1 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EH +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_HIRES b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_HIRES new file mode 100644 index 0000000000000000000000000000000000000000..ba18d5012d5b79268dfa67cac075893677117293 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_HIRES @@ -0,0 +1,873 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA +DAY1 20131107 +DAY2 20131108 +DTIME 3 +M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +M_CLASS OD +M_STREAM OPER +M_NUMBER OFF +M_EXPVER 1 +M_GRID 200 +M_LEFT -10000 +M_LOWER 30000 +M_UPPER 60000 +M_RIGHT 30000 +M_LEVEL 137 +M_RESOL 799 +M_GAUSS 0 +M_ACCURACY 24 +M_OMEGA 0 +M_OMEGADIFF 0 +M_ETA 1 +M_ETADIFF 0 +M_DPDETA 1 +M_SMOOTH 0 +M_FORMAT GRIB1 +M_ADDPAR /27/28/173/186/187/188/235/139/39 +PREFIX EH +GATEWAY srvx7.img.univie.ac.at +DESTINATION leo@genericSftp +ECSTORAGE 1 +ECTRANS 0 +ECFSDIR ectmp:/${USER}/econdemand/ +MAILOPS ${USER} +MAILFAIL ${USER} +EXEDIR . +SOURCECODE ${WSHOME}/flex_extract_ecgate_V6.0 +EOF +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_body b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_body new file mode 100644 index 0000000000000000000000000000000000000000..4e864429e8aa1ddde0834e2a66338b39c38b4e74 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_body @@ -0,0 +1,768 @@ +# no changes below + +NRW=0 + +#ksh scripts for date manipulation +juldate2() + { + let jc=$1 + if (( ${#jc} < 8 )) + then + print "illegal date!" + exit 1 + fi + let y=`echo $jc | cut -c1-4` + let m1=`echo $jc | cut -c5` + let m2=`echo $jc | cut -c6` + m=$m1$m2 + let d1=`echo $jc | cut -c7` + let d2=`echo $jc | cut -c8` + d=$d1$d2 + let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014 + let jd=jd+15-3*((y+(m-9)/7)/100+1)/4 + print $jd + } + +civildate2() + { + let jd=$1 + if (( jd < 1721060 )) + then + print "Julian date not in AD." + exit 1 + fi + let k=jd+68569 + let n=4*k/146097 + let k=k-\(146097*n+3\)/4 + let y=4000*(k+1)/1461001 + let k=k-1461*y/4+31 + let m=80*k/2447 + let d=k-\(2447*m\)/80 + let k=m/11 + let m=m+2-12*k + let y=100*(n-49)+y+k + [ $m -le 9 ] && m=0$m + [ $d -le 9 ] && d=0$d + print $y$m$d + } + +date2m1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1-1 + civildate2 $j0 + } + +date2p1() + { + let ymd=$1 + let j1=`juldate2 $ymd` + let j0=j1+1 + civildate2 $j0 + } + + +marsinst() +{ +MTYPE="${1}" +MDAY="${2}" +MTIME="${3}" +MSTEP="${4}" +MPAR="${5}" +MFN=$6 +MLTY=$7 +MGRID="${8}" +MLEV="${9}" + +RED=0 +#if [[ ${MTYPE} != 'AN' ]] ; then + MPAR2=`echo ${MPAR} | sed s,160/,,` + MPAR2=`echo ${MPAR2} | sed s,27/,,` + MPAR2=`echo ${MPAR2} | sed s,28/,,` + MPAR2=`echo ${MPAR2} | sed s,173/,,` + if [[ ${MPAR2} != ${MPAR} ]] ; then + MPAR=${MPAR2} + RED=1 + fi +#fi + +MAREA=${M_AREA} +if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then + MAREA=G +fi + +if [[ -f ${MFN} ]] ; then + rm ${MFN} +fi + +cat <<EOF >> marsjob +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=${MPAR}, +RESOL=${M_RESOL}, +AREA=${MAREA}, +GRID=${MGRID}, +LEVTYPE=${MLTY}, +LEVELIST=${MLEV}, +ACCURACY=${M_ACCURACY}, +DATE=${MDAY}, +TIME=${MTIME}, +STEP=${MSTEP},${10} +TARGET="${MFN}" +EOF + +if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then + +cat <<EOF >> marsjob +RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD, + PARAM=160/27/28/173, + TARGET="OROLSM" +EOF +fi + +} + +marsflux() +{ +MTYPE="${1}" +MSTEP="${2}" + +cat <<EOF >>mars_flux +RETRIEVE, +TYPE=${MTYPE}, +CLASS=${M_CLASS},NUMBER=${M_NUMBER}, +EXPVER=${M_EXPVER},STREAM=${M_STREAM}, +PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR, +AREA=${M_AREA}, +GRID=${D_GRID}, +LEVTYPE=SFC, +LEVELIST=OFF, +ACCURACY=${M_ACCURACY}, REPRES=GG, +DATE=${DAY1M1}/TO/${DAY2P1}, +TIME=00/12, +AC=N, +STEP=${MSTEP}, +TARGET="surf_${MSTEP}_ub" +EOF +} + + +myerror() + { + + echo $1 + echo $2 + echo $3 + echo ABORT! + + for MUSER in $MAILFAIL + do + mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE} + done + } + +# +# MAIN SCRIPT CONTINUES HERE +# +#read CONTROL file, process specifications +while read NAME PARA +do + +if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then + eval "set -A $NAME $PARA" +else + eval "export $NAME='$PARA'" +fi +echo `echo $NAME`=$PARA + +done <${CONTROLFILE} + + +if [ -z "$DAY1" -o -z "$DAY2" ]; then + myerror 'DAY specification missing !' + exit 1 +fi + +#defaults +[ -z "$M_EXPVER" ] && M_EXPVER=1 +[ -z "$M_CLASS" ] && M_CLASS=OD +[ -z "$M_STREAM" ] && M_STREAM=OPER +[ -z "$M_NUMBER" ] && M_NUMBER=OFF +[ -z "$M_TYPE" ] && set -A M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC +[ -z "$M_TIME" ] && set -A M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12 +[ -z "$M_STEP" ] && set -A M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11 +[ -z "$DTIME" ] && DTIME=6 +[ -z "$M_GRID" ] && M_GRID=1000 +[ -z "$M_LOWER" ] && M_LOWER=-90000 +[ -z "$M_LEFT" ] && M_LEFT=-179000 +[ -z "$M_UPPER" ] && M_UPPER=90000 +[ -z "$M_RIGHT" ] && M_RIGHT=180000 +[ -z "$M_LEVEL" ] && M_LEVEL=91 +[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL +[ -z "$M_ADDPAR" ] && M_ADDPAR='' +[ -z "$M_RESOL" ] && M_RESOL=799 +[ -z "$M_GAUSS" ] && M_GAUSS=0 +[ -z "$M_SMOOTH" ] && M_SMOOTH=0 +[ -z "$M_OMEGA" ] && M_OMEGA=0 +[ -z "$M_OMEGADIFF" ] && M_OMEGADIFF=0 +[ -z "$M_ETA" ] && M_ETA=0 +[ -z "$M_ETADIFF" ] && M_ETADIFF=0 +[ -z "$M_ETAPAR" ] && M_ETAPAR=77 +[ -z "$M_DPDETA" ] && M_DPDETA=1 +[ -z "$M_ACCURACY" ] && M_ACCURACY=24 +[ -z "$EXEDIR" ] && EXEDIR=. +[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate +[ -z "$GATEWAY" ] && GATEWAY='' +[ -z "$DESTINATION" ] && DESTINATION='' +[ -z "$PREFIX" ] && PREFIX=EN +[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple +[ -z "$ECTRANS" ] && ECTRANS=0 +[ -z "$ECSTORAGE" ] && ECSTORAGE=1 +[ -z "$ECFSDIR" ] && ECFSDIR=ectmp: +[ -z "$MAILOPS" ] && MAILOPS=${USER} +[ -z "$MAILFAIL" ] && MAILFAIL=${USER} + + +#additional dates for flux retrievals (polynomial interpolation) +DAY1M1=`date2m1 ${DAY1}` +DAY2P1=`date2p1 ${DAY2}` + +#julian dates for time loops +JULDAY1=`juldate2 ${DAY1}` +JULDAY2=`juldate2 ${DAY2}` + +echo JULDATES $JULDAY1 $JULDAY2 + +#check consistency +if [ ${DAY1} -gt ${DAY2} ]; then + `myerror "ERROR: DAY1 > DAY2: ${DAY1}, ${DAY2}"` + exit 1 +fi + + +# determine number of gridpoints and whether grid is cyclic +ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID` + +if [ $M_RIGHT -le $M_LEFT ] ; then + if [ $M_RIGHT -le 0 ] ; then + M_RIGHT=$(($M_RIGHT+360000)) + else + M_LEFT=$(($M_LEFT-360000)) + fi +fi + +if [[ $ZYK -ne 0 ]] ; then + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED NON-CYCLIC" + exit 1 + fi +else + MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1)) + MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1)) + if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then + myerror "ERROR: LAT/LON RANGE MUST BE INTEGER MULTIPLES OF GRID SIZE" "URLO: $M_UPPER $M_RIGHT $M_LOWER $M_LEFT GRID: $M_GRID" "GRID ASSUMED CYCLIC" + exit 1 + fi +fi + +if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then + + if [ ${M_SMOOTH} -eq 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SPECTRAL RESOLUTION ${M_RESOL} " "USE M_SMOOTH FOR SMOOTHING OR FINER OUTPUT GRID" +# exit 1 + else + if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then + myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " + fi + fi + +fi + + +# convert lat/lon to MARS format (degrees) +if [[ $M_LEFT -lt 0 ]] ; then + LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000)) +else + LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000)) +fi +if [[ $M_LOWER -lt 0 ]] ; then + LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000)) +else + LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000)) +fi +if [[ $M_RIGHT -lt 0 ]] ; then + URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000)) +else + URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000)) +fi +if [[ $M_UPPER -lt 0 ]] ; then + URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000)) +else + URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000)) +fi + +M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO} + +if [ $M_GAUSS -eq 1 ] ; then +# Gaussian grid detected + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=OFF + QG_GRID=OFF + if [ $M_RESOL -le 799 ] ; then + QG_GRID=$((($M_RESOL+1)/2)) + fi + D_GRID=${D_GRID}/${D_GRID} + +else + D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000)) + G_GRID=${G_GRID}/${G_GRID} + D_GRID=${D_GRID}/${D_GRID} +fi + +G_LEVELIST=1/to/${M_LEVEL} + + +#namelist +cat <<EOF >fort.4 +&NAMGEN + MAXL=${MAXL}, MAXB=${MAXB}, + MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}", + MNAUF=${M_RESOL},METAPAR=${M_ETAPAR}, + RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA}, + MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS}, + MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF}, + MDPDETA=${M_DPDETA} +/ +&NAMFX2 + NX=${MAXL}, NY=${MAXB}, + MAXTIME=400,JPOLY=4, + JHRF=${DTIME}, + RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID} +/ +EOF + + +if [[ $OS_VERSION == aix ]] ; then + scp ecgb:${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.IBM FLXACC2 CONVERT2 CHECK +else + cp ${SOURCECODE}/source.tar . + tar -xvf source.tar + make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK +fi + +if [ $? -ne 0 ]; then + + ls + myerror 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' 'ABORT!' + exit 1 +else + echo 'compile worked' +fi + + +# +#MARS requests (field) +# +imax=6 +set -A PARLIST U/V T Q LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR} +set -A PARNAME 131/132 130 133 152 SURF OROLSM +set -A REPR SH SH GG SH GG GG +set -A UNIT 10 11 17 12 14 20 +set -A LTY ML ML ML ML SFC SFC +set -A GRID ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID} +set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1 + +set -A FIELD 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 + + +if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then + M_OMEGA=1 + PARLIST[imax]=W + PARNAME[imax]=135 + REPR[imax]=SH + UNIT[imax]=19 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then + M_ETA=1 + PARLIST[imax]=77 + PARNAME[imax]=77 + REPR[imax]=SH + UNIT[imax]=21 + LTY[imax]=ML + GRID[imax]=${D_GRID} + LEVELIST[imax]=${M_LEVELIST} + imax=$(($imax+1)) +fi + +if [[ $M_GAUSS -eq 2 ]] ; then + PARLIST[imax]=VO + PARNAME[imax]=138 + REPR[imax]=SH + UNIT[imax]=30 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + imax=$(($imax+1)) +fi +if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then + PARLIST[imax]=D + PARNAME[imax]=155 + REPR[imax]=SH + UNIT[imax]=13 + LTY[imax]=ML + GRID[imax]=${G_GRID} + LEVELIST[imax]=${G_LEVELIST} + LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA + imax=$(($imax+1)) +fi + +jmax=${#M_TYPE[*]} + +# M_TIME needs leading zeros while M_STEP must have leading zeros +# to be consistent with MARS file naming convention +# The following loop ensures this +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TIME[$j]} -lt 10 ]] ; then + M_TIME[$j]=0$((${M_TIME[$j]})) + fi + if [[ ${M_STEP[$j]} -lt 10 ]] ; then + M_STEP[$j]=$((${M_STEP[$j]})) + fi + + j=$(($j+1)) +done + +echo ${M_TIME[*]} +echo ${M_STEP[*]} + + +rm mars_flux 2>/dev/null +j=$DTIME +while [[ $j -lt 13 ]] ; do + marsflux ${M_TYPE[2]} ${FIELD[$j]} + j=$(($j+$DTIME)) +done +mars mars_flux | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + + +# +# FLXACC job +# + + +${EXEDIR}/FLXACC2 +if [ -f OROLSM ] ; then + rm OROLSM +fi + +# +# CONVERT job +# + +#loop over DATE and TIME for CONVERT/CHECK/ECtrans job + +IJULDAY=${JULDAY1} +while [ $IJULDAY -le $JULDAY2 ]; +do + +MDATE=`civildate2 ${IJULDAY}` +MDATEX=`echo ${MDATE} | cut -c3-8` + + +i=0 +rm marsjob 2>/dev/null + +#humidity on reduced Gaussian grid for initialization +#of spectral transformations +if [ ${M_GAUSS} -eq 1 ] ; then + NGRID=$(( ( ${M_RESOL} + 1 ) / 2 )) + + marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,' + +set -e +mars marsjob | grep -i -v 'MARS - INFO' +[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" +rm marsjob + +fi + +set -e + +set -A TYPEKEY ${M_TYPE[0]} +j=$DTIME +kmax=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then + if [[ $kmax == 1 ]] ; then + if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]} + kmax=2 + fi + else + if [[ $kmax == 0 ]] ; then + set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]} + kmax=1 + else + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then + if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]} ]] ; then + + echo ${TYPEKEY[0]} ${TYPEKEY[1]} ${TYPEKEY[2]} ${M_TYPE[j]} + myerror 'More than three different MARS TYPES not supported' + + exit 1 + fi + fi + fi + fi + fi + j=$(($j+$DTIME)) +done + +set -A GRIDKEY $D_GRID +mmax=1 +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then + set -A GRIDKEY $D_GRID OFF + mmax=2 + fi + i=$(($i+1)) +done + +k=0 +kmax=$(($kmax+1)) +while [[ $k -lt $kmax ]] ; do +MMTIME='' +MMSTEP='' +TSUFF='' +SSUFF='' +j=0 +while [[ $j -lt $jmax ]] ; do + if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then + if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then + MMTIME=${MMTIME}$TSUFF${M_TIME[$j]} + TSUFF='/' + fi + if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then + MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]} + SSUFF='/' + fi + fi +j=$(($j+$DTIME)) +done + +m=0 +while [[ $m -lt $mmax ]] ; do +MMPAR='' +PSUFF='' +i=0 +while [[ $i -lt $imax ]] ; do + if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then + if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then + MMPAR=${MMPAR}$PSUFF${PARLIST[$i]} + PSUFF='/' + fi + fi +i=$(($i+1)) +done + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]} + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +m=$(($m+1)) +done + +# LNSP treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1 + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# For some data classes, MARS adds GRIB table number to parameter number, +# e.g. for Temperature it is 130.128 instead of just 130 +# + set +e + TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`. + set -e + if [[ $TNR != '.' ]] ; then + TNR=.$TNR + fi + +# SURF treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +# OROLSM treated separately since it exists only on 1 level + + marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF + mars marsjob | grep -i -v 'MARS - INFO' + [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request" + rm marsjob + +k=$(($k+1)) +done + + + +j=0 +while [[ $j -lt $jmax ]] ; do + + +TIME=${FIELD[j]} +XTIME=${TIME}00 + +set +e +i=0 +while [[ $i -lt $imax ]] ; do + \rm fort.${UNIT[$i]} 2>/dev/null + if [[ ${PARLIST[$i]} == U/V ]] ; then + cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]} + rm 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} + else + mv ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} fort.${UNIT[$i]} + fi + i=$(($i+1)) +done + +# flux data need special GRIB conversion +#if [ ${M_FORMAT} == GRIB2 ] ; then +# grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 + +#else +# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2 +#fi + +${EXEDIR}/CONVERT2 + +INFILE=${PREFIX}${MDATEX}${TIME} + +if [ -s fort.15 ]; then + cp fort.15 ${INFILE} + cat fort.14 >> ${INFILE} + cat flux${MDATE}${TIME} >> ${INFILE} + cat OROLSM >> ${INFILE} + cat fort.20 >> ${INFILE} +# +# Convert also surface fields to GRIB2 if needed +# +# Note: GRIB2 surface fields are incompatible with FLEXPART versions < 9.2 +# +# To enable additional compression +# set packingType="grid_jpeg"; +# this is rather time consuming. + +if [ ${M_FORMAT} == GRIB2 ] ; then + grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2 + mv ${INFILE}_2 ${INFILE} + + if [ ${COMPRESSION} != grid_simple ] ; then + +cat >rule.filter<<EOF +set packingType="${COMPRESSION}"; +write "[file]_2"; +EOF + grib_filter rule.filter ${INFILE} + mv ${INFILE}_2 ${INFILE} + fi +fi +ls -l ${INFILE} + + +else + myerror "ERROR: ENfile ${INFILE} missing!" "ABORT!" + exit 1 +fi + +#check ENxxx file & ECtrans to local gateway +if [ -s fort.25 ]; then + mv fort.25 OMEGA${MDATEX}${TIME} + ln -s OMEGA${MDATEX}${TIME} fort.25 +fi + + +\rm fort.15 2>/dev/null +ln -s ${INFILE} fort.15 + +[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS + +${EXEDIR}/CHECK + +#check fields +if [ -s CHECK.SUCCESS ]; then + SUCCESS=1 +else + myerror 'ERROR: check on ENfile failed:' ${INFILE} "ABORT!" + exit 1 +fi + + +#ECtrans +if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE +fi + +if [[ $M_OMEGA -eq 1 && $SUCCESS -eq 1 && $ECTRANS -eq 1 ]] ; then + ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source OMEGA${MDATEX}${TIME} +fi + +#ECFS +if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then + ecp -o $INFILE $ECFSDIR +fi + +if [[ $SUCCESS -eq 1 && $ECSTORAGE -eq 1 && $M_OMEGA -eq 1 ]] ; then + ecp -o OMEGA${MDATEX}${TIME} $ECFSDIR +fi + +rm ${INFILE}_2 ${INFILE} fort.15 flux${MDATE}${TIME}* OMEGA${MDATEX}${TIME} fort.25 + +j=$(($j+$DTIME)) + +#done TIME +done + +(( IJULDAY = IJULDAY + 1 )) + +#done JULDAY +done + +#any warnings ? +[ $NRW -gt 0 ] && echo There were $NRW warnings ! + +#mail logfile (list MAILOPS) +for MUSER in $MAILOPS +do + +mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE} +done + +# +# cleanup +# +cd ${SCRATCH} +echo $SCRATCHDIR not removed! +#\rm -fR $SCRATCHDIR + +exit 0 + diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_header b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_header new file mode 100644 index 0000000000000000000000000000000000000000..071340fac0623e5b42c870df9df43be576102be0 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_header @@ -0,0 +1,67 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/spatlh00/lh0/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/spatlh00/lh0 +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA diff --git a/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_header_template b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_header_template new file mode 100644 index 0000000000000000000000000000000000000000..7f07b6772ca6916466293f1512d229e8fa1c76ad --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/flex_ecmwf_header_template @@ -0,0 +1,67 @@ +#!/bin/ksh + +# On demand script for retrieving input for FLEXPART trajectory model +# Version 6.0, September 2013 +# Maintainer Leopold Haimberger leopold.haimberger@univie.ac.at +# +#@ shell = /usr/bin/ksh + +# NOTE: If calculation on Gaussian grid are required below, it is +# recommended to send the job to the ECMWF HPC facility +# NOTE: On hpce the class should be ns or np +# NOTE: On ecgb it should be normal + + +#ON HPC (with loadleveler) +# start with ecaccess-job-submit -queueName c1a NAME_OF_THIS_FILE on gateway server +# start with llsubmit NAME_OF_THIS_FILE directly on machine + +#@ shell = /usr/bin/ksh +#@ class = ns +#@ resources = ConsumableCpus(1) ConsumableMemory(32000MB) +#@ job_name = flex_ecmwf +#@ output = /scratch/ms/ggg/xxx/$(job_name).$(host).$(jobid).out +#@ error = /scratch/ms/ggg/xxx/$(job_name).$(host).$(jobid).out +#@ environment = COPY_ALL +#@ queue + + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/ggg/xxx +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +set -x + +JOBNAME=flex_ecmwf_${HOST} + +env +ulimit -a +export OMP_NUM_THREADS=1 +export MARS_MULTITARGET_STRICT_FORMAT=1 + +#export SCRATCH=$TEMP +export SCRATCHDIR=${SCRATCH}/${JOBNAME}_$$ +[ -z "$WSHOME" ] && WSHOME=$HOME + + +mkdir $SCRATCHDIR +cd $SCRATCHDIR + +LOG_FILE=$SCRATCHDIR/${JOBNAME}_$$ +exec 1>${LOG_FILE} + +CONTROLFILE=./CONTROL_ERA + +################################### +#BEGIN: modification of config file +################################### + +cat <<EOF >CONTROL_ERA diff --git a/preprocessing/flex_extract_ecgate_V6.0/source.tar b/preprocessing/flex_extract_ecgate_V6.0/source.tar new file mode 100644 index 0000000000000000000000000000000000000000..11292f0d2b72dab936ae123edbe3cb8a88b32e2b Binary files /dev/null and b/preprocessing/flex_extract_ecgate_V6.0/source.tar differ diff --git a/preprocessing/flex_extract_ecgate_V6.0/submit_examples.ksh b/preprocessing/flex_extract_ecgate_V6.0/submit_examples.ksh new file mode 100755 index 0000000000000000000000000000000000000000..1d2f08ab6b8022d292aaea5fb06fbc8d049330cc --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/submit_examples.ksh @@ -0,0 +1,43 @@ +#!/bin/ksh + +echo 'submitting ECMWFDATA example scripts ..' + +SERVER=`uname -n | cut -c 1-4` +if [[ ${SERVER} != ecgb ]] ; then +# submit via gateway from local server + + +for FILE in `ls CONTROL_ERA__*` ; do + + name=`echo $FILE | sed s,CONTROL_ERA__,,` + echo submitting example on demand script flex_ecmwf_$name + if [ ! -f flex_ecmwf_$name ] ; then + echo flex_ecmwf_$name does not exist + echo run update_script.ksh before running this script. + exit + fi + ecaccess-job-submit -queueName ecgb flex_ecmwf_$name +done + +echo submitting example operational script ecmwf_idc_ops_ecgate +ecaccess-job-submit -queueName ecgb ecmwf_idc_ops_ecgate + +else +# submit on ecgate + +for FILE in `ls CONTROL_ERA__*` ; do + + name=`echo $FILE | sed s,CONTROL_ERA__,,` + echo submitting example on demand script flex_ecmwf_$name + if [ ! -f flex_ecmwf_$name ] ; then + echo flex_ecmwf_$name does not exist + echo run update_script.ksh before running this script. + exit + fi + sbatch flex_ecmwf_$name +done + +echo submitting example operational script flex_ecmwf_$name +sbatch ecmwf_idc_ops_ecgate + +fi diff --git a/preprocessing/flex_extract_ecgate_V6.0/update_script.ksh b/preprocessing/flex_extract_ecgate_V6.0/update_script.ksh new file mode 100644 index 0000000000000000000000000000000000000000..97fc3a2a905e9a01e77e89f7f0affaeeb32ee9a1 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/update_script.ksh @@ -0,0 +1,106 @@ +#!/bin/ksh + +if [[ $# -ne 4 && (-z "$GATEWAY" || -z "$DESTINATION" || -z "$ECUID" || -z "$ECGID" ) ]] ; then + + echo Syntax: update_script.ksh Gateway Destination EC_user_ID EC_group_ID + echo e.g. update_script.ksh srvx7.img.univie.ac.at leo@genericSftp lh0 spatlh00 + echo or set environment variables GATEWAY DESTINATION ECUID ECGID +exit +else + if [[ $# -eq 4 ]] ; then + export GATEWAY=$1 + export DESTINATION=$2 + export ECUID=$3 + export ECGID=$4 + fi +fi + +########### Just two examples ############### +# Please modify for your environment # +############################################## + +#[ -z "$GATEWAY" ] && GATEWAY=srvx7.img.univie.ac.at +#[ -z "$DESTINATION" ] && DESTINATION=leo@genericSftp +#[ -z "$ECUID" ] && ECUID=lh0 +#[ -z "$ECGID" ] && ECGID=spatlh00 + +#[ -z "$GATEWAY" ] && GATEWAY=ctbto4.ctbto.org +#[ -z "$DESTINATION" ] && DESTINATION=atmops@ops +#[ -z "$ECUID" ] && ECUID=cbb + +export VERSION=6 +export SUBVERSION=0 +echo 'ECMWFDATA V'${VERSION}.${SUBVERSION}' is installed for:' +echo Gateway $GATEWAY +echo Destination $DESTINATION +echo ECMWF user ID $ECUID +echo ECMWF group ID $ECGID +echo Output will be written into '$SCRATCH' directory of user $ECUID - /scratch/ms/$ECGID/$ECUID + +echo 'Note: These settings can be changed via environment variables' +echo '$GATEWAY $DESTINATION $ECUID $ECGID' + +cat flex_ecmwf_header_template | sed "s,xxx,${ECUID}," | sed "s,ggg,${ECGID}," >flex_ecmwf_header + +cat CONTROL_OPS_TEMPLATE | sed "s,xxx.xxx.xxx.xxx,${GATEWAY}," | sed "s,xxx@xxx,${DESTINATION}," | sed "s,xxx,${ECUID}," | sed "s,ggg,${ECGID}," | sed "s,v.v,${VERSION}.${SUBVERSION}," > CONTROL_OPS_V${VERSION}.${SUBVERSION} +cat CONTROL_OPS_TEMPLATE | sed "s,xxx.xxx.xxx.xxx,${GATEWAY}," | sed "s,xxx@xxx,${DESTINATION}," | sed "s,xxx,${ECUID}," | sed "s,ggg,${ECGID}," | sed "s,v.v,${VERSION}.${SUBVERSION}," | sed "s,M_TYPE AN FC FC FC FC FC FC FC FC FC FC FC AN FC FC FC FC FC FC FC FC FC FC FC 12,M_TYPE AN FC FC FC FC FC AN FC FC 4V FC FC 4V FC FC FC FC FC AN FC FC 4V FC FC 4V," | sed "s,M_TIME 00 00 00 00 00 00 00 00 00 00 00 00 12 12 12 12 12 12 12 12 12 12 12 12 12,M_TIME 00 00 00 00 00 00 06 00 00 09 00 00 09 12 12 12 12 12 18 12 12 21 12 12 21," | sed "s,M_STEP 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11 12,M_STEP 00 01 02 03 04 05 00 07 08 00 10 11 03 01 02 03 04 05 00 07 08 00 10 11 03," | sed "s,DTIME 1,DTIME 3," | sed "s,M_ETA 1,M_ETA 0," | sed "s,M_GAUSS 0,M_GAUSS 1," | sed "s,M_SMOOTH 0,M_SMOOTH 179," > CONTROL_OPS_V${VERSION}.${SUBVERSION}_4V + +cat ecmwf_idc_ops_header_template | sed "s,xxx,${ECUID}," | sed "s,ggg,${ECGID}," | sed "s,v.v,${VERSION}.${SUBVERSION}," >ecmwf_idc_ops_header +cat ecmwf_idc_ops_header ecmwf_idc_ops_body >ecmwf_idc_ops_ecgate + +cat ecmwf_idc_ops_multi_header_template | sed "s,xxx,${ECUID}," | sed "s,ggg,${ECGID}," | sed "s,v.v,${VERSION}.${SUBVERSION}," >ecmwf_idc_ops_multi_header +cat ecmwf_idc_ops_multi_header ecmwf_idc_ops_body ecmwf_idc_ops_multi_footer >ecmwf_idc_ops_multi_ecgate + + +cat CONTROL_ERA_TEMPLATE | sed "s,xxx.xxx.xxx.xxx,${GATEWAY}," | sed "s,xxx@xxx,${DESTINATION}," | sed "s,PREFIX EN,PREFIX EG," | sed "s,v.v,${VERSION}.${SUBVERSION}," > CONTROL_ERA__GLOBALGAUSS +cat CONTROL_ERA__GLOBALGAUSS | sed "s,GAUSS 1,GAUSS 0," | sed "s,M_ETA 0,M_ETA 1," | sed "s,PREFIX EG,PREFIX EE," | sed "s,v.v,${VERSION}.${SUBVERSION}," > CONTROL_ERA__GLOBALETA +cat CONTROL_ERA__GLOBALETA | sed "s,M_GRID 1000,M_GRID 200," | sed "s,M_RESOL 159,M_RESOL 799," | sed "s,M_LEFT -179000,M_LEFT -10000," | sed "s,M_RIGHT 180000,M_RIGHT 30000," | sed "s,M_LOWER -90000,M_LOWER 30000," | sed "s,M_UPPER 90000,M_UPPER 60000," | sed "s,DTIME 3,DTIME 3," | sed "s,PREFIX EE,PREFIX EH," | sed "s,v.v,${VERSION}.${SUBVERSION}," > CONTROL_ERA__HIRES +cat CONTROL_ERA__GLOBALETA | sed "s,M_GRID 1000,M_GRID 200," | sed "s,M_RESOL 159,M_RESOL 799," | sed "s,M_LEFT -179000,M_LEFT 113000," | sed "s,M_RIGHT 180000,M_RIGHT 190000," | sed "s,M_LOWER -90000,M_LOWER 00000," | sed "s,M_UPPER 90000,M_UPPER 30000," | sed "s,DTIME 3,DTIME 3," | sed "s,PREFIX EE,PREFIX EH," | sed "s,v.v,${VERSION}.${SUBVERSION}," > CONTROL_ERA__HAIYAN +# ERA-Interim Template +cat CONTROL_ERA__GLOBALGAUSS | sed "s,CLASS OD,CLASS EI," | sed "s,PREFIX EG,PREFIX EI," | sed "s,M_LEVEL 137,M_LEVEL 60," | sed "s,M_LEVELIST 1\/TO\/137,M_LEVELIST 1\/TO\/60," | sed "s,201311,201211," | sed "s,v.v,${VERSION}.${SUBVERSION}," > CONTROL_ERA__EI +# ERA-Interim Template +cat CONTROL_ERA__GLOBALGAUSS | sed "s,M_TYPE AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC AN FC FC FC FC FC,M_TYPE CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV," | sed "s,M_TIME 00 00 00 00 00 00 06 00 00 00 00 00 12 12 12 12 12 12 18 12 12 12 12 12,M_TIME 00 00 00 00 00 00 00 00 00 00 00 00 12 12 12 12 12 12 12 12 12 12 12 12," | sed "s,M_STEP 00 01 02 03 04 05 00 07 08 09 10 11 00 01 02 03 04 05 00 07 08 09 10 11,M_STEP 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11," | sed "s,STREAM OPER,STREAM ENFO," | sed "s,M_NUMBER OFF,M_NUMBER 1," | sed "s,M_LEVEL 137,M_LEVEL 62," | sed "s,M_LEVELIST 1\/TO\/137,M_LEVELIST 1\/TO\/62," > CONTROL_ERA__CV + +SERVER=`uname -n | cut -c 1-4` +if [[ ${SERVER} != ecgb ]] ; then +# submit via gateway from local server + +echo Software copied from server `uname -n | cut -c 1-4` to ecgate + +ksh upload_source V${VERSION}.${SUBVERSION} + +for FILE in `ls CONTROL_ERA__*` ; do + + name=`echo $FILE | sed s,CONTROL_ERA__,,` + cat flex_ecmwf_header $FILE flex_ecmwf_body >flex_ecmwf_$name + ecaccess-file-put flex_ecmwf_$name flex_extract_ecgate_V${VERSION}.${SUBVERSION}/flex_ecmwf_$name + +done + +ecaccess-file-put CONTROL_OPS_V${VERSION}.${SUBVERSION} flex_extract_ecgate_V${VERSION}.${SUBVERSION}/CONTROL_OPS_V${VERSION}.${SUBVERSION} +ecaccess-file-put ecmwf_idc_ops_ecgate flex_extract_ecgate_V${VERSION}.${SUBVERSION}/ecmwf_idc_ops_ecgate +ecaccess-file-put ecmwf_idc_ops_multi_ecgate flex_extract_ecgate_V${VERSION}.${SUBVERSION}/ecmwf_idc_ops_multi_ecgate +ecaccess-file-mkdir scratch:ms_sms_output_V${VERSION}.${SUBVERSION} + +else + +for FILE in `ls CONTROL_ERA__*` ; do + + name=`echo $FILE | sed s,CONTROL_ERA__,,` + cat flex_ecmwf_header $FILE flex_ecmwf_body >flex_ecmwf_$name +done + + +set +e +mkdir $SCRATCH/ms_sms_output_V${VERSION}.${SUBVERSION} +set -e + +fi + +echo ' ' +echo !! NOTE !! NOTE !! +echo ' ' +echo Scripts are now generated and uploaded but not yet submitted. +echo Run submit_examples.ksh to submit them to ecgate. +echo ' ' +echo !! NOTE !! NOTE !! diff --git a/preprocessing/flex_extract_ecgate_V6.0/upload_source b/preprocessing/flex_extract_ecgate_V6.0/upload_source new file mode 100644 index 0000000000000000000000000000000000000000..84350b8902fbd2ec830d197ca1d343f801bc77c0 --- /dev/null +++ b/preprocessing/flex_extract_ecgate_V6.0/upload_source @@ -0,0 +1,8 @@ +#!/bin/ksh + +#$1 should be V4.1 or V6.0 or .. + +ecaccess-file-mkdir flex_extract_ecgate_$1 >/dev/null +ecaccess-file-put source.tar flex_extract_ecgate_$1/source.tar +ecaccess-file-dir "flex_extract_ecgate_$1/*" +ecaccess-file-mkdir scratch:ms_sms_output_$1 >/dev/null