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