source: flexpart.git/preprocessing/flex_extract_ecgate_V6.0/ecmwf_idc_ops_ecgate @ ba05105

10.4.1_peseiFPv9.3.1FPv9.3.1b_testingFPv9.3.2GFS_025bugfixes+enhancementsdevfp9.3.1-20161214-nc4grib2nc4_repairrelease-10release-10.4.1scaling-bugunivie
Last change on this file since ba05105 was ba05105, checked in by flexpart <>, 9 years ago

add preprocessing routines flex_extract_ecgate_V6.0

  • Property mode set to 100644
File size: 19.5 KB
Line 
1#!/bin/ksh
2
3#SBATCH --workdir=/scratch/ms/spatlh00/lh0
4#SBATCH --qos=normal
5#SBATCH --job-name=flex_ecmwf_oper
6#SBATCH --output=ms_sms_output_V6.0/CTBTO_ops.out
7#SBATCH --error=ms_sms_output_V6.0/CTBTO_ops.out
8#SBATCH --mail-type=ALL
9#SBATCH --time=12:00:00
10
11
12set -x
13
14alias ecp='set noglob; $ECFS_SYS_PATH/ecp.p'
15
16export OMP_NUM_THREADS=1
17
18export VERSION=6.0
19JOBNAME=ecmwf_idc_ops_ecgate_V${VERSION}
20CONTROLFILE=${HOME}/flex_extract_ecgate_V${VERSION}/CONTROL_OPS_V${VERSION}
21
22[ -z "$WSHOME" ] && export WSHOME=$HOME
23
24# #
25# #testing purposes
26# #
27MSJ_YEAR=2013
28MSJ_MONTH=11
29MSJ_DAY=07
30MSJ_BASETIME=00
31
32echo 'MSJ_ENVIRONMENT:' $MSJ_YEAR, $MSJ_MONTH, $MSJ_DAY, $MSJ_BASETIME
33
34DATEREF=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY}
35
36
37WDAY=$(date +%A)
38[ ! -d $SCRATCH/ms_sms_output_V${VERSION} ] && mkdir $SCRATCH/ms_sms_output_V${VERSION}
39
40LOG_FILE=$SCRATCH/ms_sms_output_V${VERSION}/${JOBNAME}_${WDAY}_${MSJ_BASETIME}
41exec 1>${LOG_FILE}
42# no changes below
43
44NRW=0
45
46#ksh scripts for date manipulation
47juldate2()
48   {
49    let jc=$1
50    if (( ${#jc} < 8 ))
51    then
52    print "illegal date!"
53    exit 1
54    fi
55    let y=`echo $jc | cut -c1-4`
56    let m1=`echo $jc | cut -c5`
57    let m2=`echo $jc | cut -c6`
58    m=$m1$m2
59    let d1=`echo $jc | cut -c7`
60    let d2=`echo $jc | cut -c8`
61    d=$d1$d2
62    let jd=367*y-7*(y+(m+9)/12)/4+275*m/9+d+1721014
63    let jd=jd+15-3*((y+(m-9)/7)/100+1)/4
64    print $jd
65    }
66
67civildate2()
68   {
69    let jd=$1
70    if (( jd < 1721060 ))
71    then
72       print "Julian date not in AD."
73       exit 1
74    fi
75    let k=jd+68569
76    let n=4*k/146097
77    let k=k-\(146097*n+3\)/4
78    let y=4000*(k+1)/1461001
79    let k=k-1461*y/4+31
80    let m=80*k/2447
81    let d=k-\(2447*m\)/80
82    let k=m/11
83    let m=m+2-12*k
84    let y=100*(n-49)+y+k
85    [ $m -le 9 ] && m=0$m
86    [ $d -le 9 ] && d=0$d
87    print $y$m$d
88    }
89
90date2m1()
91    {
92    let ymd=$1
93    let j1=`juldate2 $ymd`
94    let j0=j1-1
95    civildate2 $j0
96    }
97
98date2p1()
99    {
100    let ymd=$1
101    let j1=`juldate2 $ymd`
102    let j0=j1+1
103    civildate2 $j0
104    }
105
106date2m14()
107    {
108    let ymd=$1
109    let j1=`juldate2 $ymd`
110    let j0=j1-14
111    civildate2 $j0
112    }
113
114marsinst()
115{
116MTYPE="${1}"
117MDAY="${2}"
118MTIME="${3}"
119MSTEP="${4}"
120MPAR="${5}"
121MFN=$6
122MLTY=$7
123MGRID="${8}"
124MLEV="${9}"
125
126#if [[ ${MPAR} == 'LNSP' ]] ; then
127#  MLEV=1
128#else
129#  if [[ ${MLTY} == 'SFC' ]] ; then
130#    MLEV=OFF
131#  else
132#    MLEV=${M_LEVELIST}
133#  fi
134#fi
135
136RED=0
137#if [[ ${MTYPE} != 'AN' ]] ; then
138  MPAR2=`echo ${MPAR} | sed s,160/,,`
139  MPAR2=`echo ${MPAR2} | sed s,27/,,`
140  MPAR2=`echo ${MPAR2} | sed s,28/,,`
141  MPAR2=`echo ${MPAR2} | sed s,173/,,`
142  if [[ ${MPAR2} != ${MPAR} ]] ; then
143    MPAR=${MPAR2}
144    RED=1
145  fi
146#fi
147
148MAREA=${M_AREA}
149if [[ ${10} == 'GAUSSIAN=REDUCED,' ]] ; then
150  MAREA=G
151fi
152
153if [[ -f ${MFN} ]] ; then
154  rm ${MFN}
155fi
156
157cat <<EOF >> marsjob
158RETRIEVE,
159TYPE=${MTYPE},
160CLASS=${M_CLASS},NUMBER=${M_NUMBER},
161EXPVER=${M_EXPVER},STREAM=${M_STREAM},
162PARAM=${MPAR},
163RESOL=${M_RESOL},
164AREA=${MAREA},
165GRID=${MGRID},
166LEVTYPE=${MLTY},
167LEVELIST=${MLEV},
168ACCURACY=${M_ACCURACY},
169DATE=${MDAY},
170TIME=${MTIME},
171STEP=${MSTEP},${10}
172TARGET="${MFN}"
173EOF
174
175if [[ ! -f 'OROLSM' && $RED -eq 1 ]] ; then
176
177cat <<EOF >> marsjob
178RETRIEVE,TYPE=AN,TIME=0,STEP=0,CLASS=OD,
179  PARAM=160/27/28/173,
180  TARGET="OROLSM"
181EOF
182fi
183
184}
185
186marsflux()
187{
188MTYPE="${1}"
189MSTEP="${2}"
190
191#if [[ ! -f "surf_${M_STEP}_ub" ]] ; then
192cat <<EOF >>mars_flux
193RETRIEVE,
194TYPE=${MTYPE},
195CLASS=${M_CLASS},NUMBER=${M_NUMBER},
196EXPVER=${M_EXPVER},STREAM=${M_STREAM},
197PARAM=LSP/CP/SSHF/EWSS/NSSS/SSR,
198AREA=${M_AREA},
199GRID=${D_GRID},
200LEVTYPE=SFC,
201LEVELIST=OFF,
202ACCURACY=${M_ACCURACY}, REPRES=GG,
203DATE=${DAY1M1}/TO/${DAY2P1},
204TIME=00/12,
205AC=N,
206STEP=${MSTEP},
207TARGET="surf_${MSTEP}_ub"
208EOF
209
210if [[ $MSJ_BASETIME == 00 ]] ; then
211  DAY2P2=`date2p1 ${DAY2P1}`
212  cat <<EOF >>mars_flux
213RETRIEVE,
214DATE=${DAY2P2},
215TIME=00,
216TARGET="surf_${MSTEP}_ub"
217EOF
218fi
219#fi
220}
221
222
223myerror()
224  {
225   
226    echo $1
227    echo $2
228    echo $3
229    echo ABORT!
230
231    for MUSER in $MAILFAIL
232    do
233      mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE}
234    done
235
236    exit 1
237  }
238
239#
240# MAIN SCRIPT CONTINUES HERE
241#
242#read CONTROL file, process specifications
243while read NAME PARA
244do
245
246if [[ $NAME == 'M_TYPE' || $NAME == 'M_TIME' || $NAME == 'M_STEP' ]] ; then
247  eval "set -A $NAME $PARA"
248else
249  eval "export $NAME='$PARA'"
250fi
251echo `echo $NAME`=$PARA
252
253done <${CONTROLFILE}
254
255
256#defaults
257[ -z "$M_EXPVER" ] && M_EXPVER=1
258[ -z "$M_CLASS" ] && M_CLASS=OD
259[ -z "$M_STREAM" ] && M_STREAM=OPER
260[ -z "$M_NUMBER" ] && M_NUMBER=OFF
261[ -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
262[ -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
263[ -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
264[ -z "$DTIME" ] && DTIME=6
265[ -z "$M_GRID" ] && M_GRID=1000
266[ -z "$M_LOWER" ] && M_LOWER=-90000
267[ -z "$M_LEFT" ] && M_LEFT=-179000
268[ -z "$M_UPPER" ] && M_UPPER=90000
269[ -z "$M_RIGHT" ] && M_RIGHT=180000
270[ -z "$M_LEVEL" ] && M_LEVEL=91
271[ -z "$M_LEVELIST" ] && M_LEVELIST=1/TO/$M_LEVEL
272[ -z "$M_ADDPAR" ] && M_ADDPAR=''
273[ -z "$M_RESOL" ] &&  M_RESOL=799
274[ -z "$M_GAUSS" ] &&  M_GAUSS=0
275[ -z "$M_SMOOTH" ] &&  M_SMOOTH=0
276[ -z "$M_OMEGA" ] &&  M_OMEGA=0
277[ -z "$M_OMEGADIFF" ] &&  M_OMEGADIFF=0
278[ -z "$M_ETA" ] &&  M_ETA=0
279[ -z "$M_ETADIFF" ] &&  M_ETADIFF=0
280[ -z "$M_ETAPAR" ] &&  M_ETAPAR=77
281[ -z "$M_DPDETA" ] &&  M_DPDETA=1
282[ -z "$M_ACCURACY" ] &&  M_ACCURACY=24
283[ -z "$EXEDIR" ] && EXEDIR=.
284[ -z "$SOURCECODE" ] && SOURCECODE=ecgate:flex_extract_ecgate
285[ -z "$GATEWAY" ] && GATEWAY=''
286[ -z "$DESTINATION" ] && DESTINATION=''
287[ -z "$PREFIX" ] && PREFIX=EN
288[ -z "$COMPRESSION" ] && COMPRESSION=grid_simple
289[ -z "$ECTRANS" ] && ECTRANS=0
290[ -z "$ECSTORAGE" ] && ECSTORAGE=1
291[ -z "$ECFSDIR" ] && ECFSDIR=ectmp:
292[ -z "$MAILOPS" ] && MAILOPS=${USER}
293[ -z "$MAILFAIL" ] && MAILFAIL=${USER}
294
295
296export MARS_MULTITARGET_STRICT_FORMAT=1
297
298if [ $M_GAUSS -eq 1 ] ; then 
299    export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-G_V${VERSION}
300    mkdir $SCRATCHDIR >/dev/null
301else
302  export SCRATCHDIR=${SCRATCH}/ctbto_run_ecgate-${DTIME}hrs-L_V${VERSION}
303    mkdir $SCRATCHDIR >/dev/null
304fi
305
306#
307# cleanup
308#
309#\rm -f $SCRATCHDIR/*
310\rm -f $SCRATCHDIR/fort*
311
312[ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR
313cd $SCRATCHDIR
314
315
316DAY1=${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY}
317if [ $MSJ_BASETIME -eq 00 ] ; then
318  DAY2=DAY1
319else
320  DAY2=`date2p1 ${DAY1}`
321fi
322
323#additional dates for flux retrievals (polynomial interpolation)
324DAY1M1=`date2m1 ${DAY1}`
325DAY2P1=`date2m1 ${DAY2}`
326
327#julian dates for time loops
328JULDAY1=`juldate2 ${DAY1}`
329JULDAY2=`juldate2 ${DAY1}`
330
331
332#echo 'field date :' $M_DATE_S, $M_TIME_S
333#echo 'flux dates :' $FLXDT1, $FLXT1, $FLXDT2, $FLXT2
334
335#take care of nameing convention
336#M_DATEX=`echo ${M_DATE_S} | cut -c3-8`
337#DATEREFX=`echo ${DATEREF} | cut -c3-8`
338
339# determine number of gridpoints and whether grid is cyclic
340ZYK=`expr \( $M_RIGHT + 360000 \) % 360000 - \( $M_LEFT + 360000 \) % 360000 + $M_GRID`
341
342if [ $M_RIGHT -le $M_LEFT ] ; then
343  if [ $M_RIGHT -le 0 ] ; then
344    M_RIGHT=$(($M_RIGHT+360000))
345  else
346    M_LEFT=$(($M_LEFT-360000))
347  fi
348fi
349
350if [[ $ZYK -ne 0 ]] ; then
351  MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1))
352  MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1))
353
354  if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then
355    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"
356    exit 1
357  fi
358else
359  MAXL=$((($M_RIGHT-($M_LEFT))/$M_GRID+1))
360  MAXB=$((($M_UPPER-($M_LOWER))/$M_GRID+1))
361  if [[ $((($M_RIGHT-($M_LEFT))%$M_GRID)) -ne 0 || $((($M_UPPER-($M_LOWER))%$M_GRID)) -ne 0 ]] ; then
362    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"
363    exit 1
364  fi
365fi
366
367if [ $((180000/$M_GRID-$M_RESOL)) -lt 0 ] ; then
368
369   if [ ${M_SMOOTH} -eq 0 ] ; then
370    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"
371#    exit 1
372   else
373    if [ $((180000/$M_GRID-$M_SMOOTH)) -lt 0 ] ; then
374      myerror "ERROR: OUTPUT GRID SPACING OF $((${M_GRID}/1000)).$((${M_GRID}%1000)) DEGREE IS TOO COARSE FOR GIVEN SMOOTHED SPECTRAL RESOLUTION ${M_SMOOTH} " 
375    fi
376   fi
377
378fi
379
380
381# convert lat/lon to MARS format (degrees)
382if [[ $M_LEFT -lt 0 ]] ; then
383  LLLO=$(($M_LEFT / 1000)).$((($M_LEFT)*(-1) % 1000))
384else
385  LLLO=$(($M_LEFT / 1000)).$(($M_LEFT % 1000))
386fi
387if [[ $M_LOWER -lt 0 ]] ; then
388  LLLA=$(($M_LOWER / 1000)).$(($M_LOWER*(-1) % 1000))
389else
390  LLLA=$(($M_LOWER / 1000)).$((($M_LOWER) % 1000))
391fi
392if [[ $M_RIGHT -lt 0 ]] ; then
393  URLO=$(($M_RIGHT / 1000)).$((($M_RIGHT)*(-1) % 1000))
394else
395  URLO=$(($M_RIGHT / 1000)).$(($M_RIGHT % 1000))
396fi
397if [[ $M_UPPER -lt 0 ]] ; then
398  URLA=$(($M_UPPER / 1000)).$((($M_UPPER)*(-1) % 1000))
399else
400  URLA=$(($M_UPPER / 1000)).$(($M_UPPER % 1000))
401fi
402
403M_AREA=${URLA}/${LLLO}/${LLLA}/${URLO}
404
405if [ $M_GAUSS -eq 1 ] ; then
406# Gaussian grid detected
407  D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000))
408  G_GRID=OFF
409  QG_GRID=OFF
410  if [ $M_RESOL -le 799 ] ; then
411    QG_GRID=$((($M_RESOL+1)/2))
412  fi
413  D_GRID=${D_GRID}/${D_GRID}
414 
415else
416  D_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000))
417  G_GRID=$(($M_GRID / 1000)).$(($M_GRID % 1000))
418  G_GRID=${G_GRID}/${G_GRID}
419  D_GRID=${D_GRID}/${D_GRID}
420fi
421
422G_LEVELIST=1/to/${M_LEVEL}
423
424
425#namelist
426cat <<EOF >fort.4
427&NAMGEN
428   MAXL=${MAXL}, MAXB=${MAXB},
429   MLEVEL=${M_LEVEL}, MLEVELIST="${M_LEVELIST}",
430   MNAUF=${M_RESOL},METAPAR=${M_ETAPAR},
431   RLO0=${LLLO}, RLO1=${URLO}, RLA0=${LLLA}, RLA1=${URLA},
432   MOMEGA=${M_OMEGA},MOMEGADIFF=${M_OMEGADIFF},MGAUSS=${M_GAUSS},
433   MSMOOTH=${M_SMOOTH},META=${M_ETA},METADIFF=${M_ETADIFF},
434   MDPDETA=${M_DPDETA}
435/
436&NAMFX2
437   NX=${MAXL}, NY=${MAXB},
438   MAXTIME=400,JPOLY=4,
439   JHRF=${DTIME},
440   RLO0=${LLLO}, RLA0=${LLLA}, DX=${D_GRID}, DY=${D_GRID}
441/
442EOF
443
444
445cp ${SOURCECODE}/source.tar .
446tar -xvf source.tar
447if [[ $OS_VERSION == aix ]] ; then
448  make -f Makefile.IBM FLXACC2 CONVERT2 CHECK
449else
450  make -f Makefile.ecgb FLXACC2 CONVERT2 CHECK
451fi
452
453if [ $? -ne 0 ]; then
454    ls
455    echo 'ERROR: FLXACC2 and CONVERT2 could not be compiled:' ${INFILE}
456    echo ABORT!
457    for MUSER in $MAILFAIL
458    do
459      mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE}
460    done
461    exit 1
462else
463  echo 'compile worked'
464fi
465
466
467#
468#MARS requests (field)
469#
470imax=6
471set -A PARLIST  U/V  T    Q  LNSP SD/MSL/TCC/10U/10V/2T/2D 129/172/160${M_ADDPAR}
472set -A PARNAME  131/132 130 133 152 SURF OROLSM
473set -A REPR     SH    SH   GG   SH   GG   GG
474set -A UNIT     10    11   17   12   14   20
475set -A LTY      ML    ML   ML   ML   SFC  SFC
476set -A GRID  ${G_GRID} ${D_GRID} ${D_GRID} OFF ${D_GRID} ${D_GRID}
477set -A LEVELIST ${M_LEVELIST} ${M_LEVELIST} ${M_LEVELIST} 1 1 1
478
479set -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
480
481
482if [[ $M_OMEGA -eq 1 || $M_OMEGADIFF -eq 1 ]] ; then
483  M_OMEGA=1
484  PARLIST[imax]=W
485  PARNAME[imax]=135
486  REPR[imax]=SH
487  UNIT[imax]=19
488  LTY[imax]=ML
489  GRID[imax]=${D_GRID}
490  LEVELIST[imax]=${M_LEVELIST}
491  imax=$(($imax+1))
492fi
493if [[ $M_ETA -eq 1 || $M_ETADIFF -eq 1 ]] ; then
494  M_ETA=1
495  PARLIST[imax]=77
496  PARNAME[imax]=77
497  REPR[imax]=SH
498  UNIT[imax]=21
499  LTY[imax]=ML
500  GRID[imax]=${D_GRID}
501  LEVELIST[imax]=${M_LEVELIST}
502  imax=$(($imax+1))
503fi
504
505if [[ $M_GAUSS -eq 2 ]] ; then
506  PARLIST[imax]=VO
507  PARNAME[imax]=138
508  REPR[imax]=SH
509  UNIT[imax]=30
510  LTY[imax]=ML
511  GRID[imax]=${G_GRID}
512  LEVELIST[imax]=${G_LEVELIST}
513  imax=$(($imax+1))
514fi
515if [[ $M_ETA -eq 0 || $M_GAUSS -eq 1 || $M_ETADIFF -eq 1 ]] ; then
516  PARLIST[imax]=D
517  PARNAME[imax]=155
518  REPR[imax]=SH
519  UNIT[imax]=13
520  LTY[imax]=ML
521  GRID[imax]=${G_GRID}
522  LEVELIST[imax]=${G_LEVELIST}
523  LEVELIST[1]=${G_LEVELIST} # U/V needed on all levels for calculating ETA
524  imax=$(($imax+1))
525fi
526
527jmax=$(( ${#M_TYPE[*]}))
528
529# M_TIME needs leading zeros while M_STEP must have leading zeros
530# to be consistent with MARS file naming convention
531# The following loop ensures this
532j=0
533while [[ $j -lt $jmax ]] ; do
534  if [[ ${M_TIME[$j]} -lt 10 ]] ; then
535    M_TIME[$j]=0$((${M_TIME[$j]}))
536  fi
537  if [[ ${M_STEP[$j]} -lt 10 ]] ; then
538    M_STEP[$j]=$((${M_STEP[$j]}))
539  fi
540
541  j=$(($j+1))
542done
543
544echo ${M_TIME[*]}
545echo ${M_STEP[*]}
546
547
548rm mars_flux 2>/dev/null
549j=0
550while [[ $j -lt 24 ]] ; do 
551  marsflux ${M_TYPE[2]} ${FIELD[$j]} 
552  j=$(($j+$DTIME))
553done
554mars mars_flux
555[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request"
556
557
558#
559# FLXACC job
560#
561
562
563${EXEDIR}/FLXACC2
564if [ -f OROLSM ] ; then
565  rm OROLSM
566
567
568fi
569
570#
571# CONVERT job
572#
573
574#loop over DATE and TIME for CONVERT/CHECK/ECtrans job
575
576iter=0
577IJULDAY=${JULDAY1}
578while [ $IJULDAY -le $JULDAY2 ];
579do
580
581MDATE=`civildate2 ${IJULDAY}`
582if [ $MSJ_BASETIME -eq 00 ] ; then
583  MDATE=`date2m1 ${MDATE}`
584fi
585
586MDATEX=`echo ${MDATE} | cut -c3-8`
587
588
589i=0
590rm marsjob 2>/dev/null
591
592#humidity on reduced Gaussian grid for initialization
593#of spectral transformations
594if [ ${M_GAUSS} -eq 1 ] ; then
595  NGRID=$(( ( ${M_RESOL} + 1 ) / 2 ))
596
597  marsinst ${M_TYPE[0]} ${DAY1} 00 00 Q fort.18 ML ${QG_GRID} 1 'GAUSSIAN=REDUCED,'
598
599set -e
600mars marsjob
601[ $? -ne 0 ] && myerror "Job stopped because of failing MARS request"
602rm marsjob
603
604fi
605
606set -e
607
608if [ $MSJ_BASETIME -eq 12 ] ; then
609  j=$(($DTIME))
610  jmax=$(($DTIME+12))
611else
612  j=$(($DTIME+12))
613fi
614if [ $iter -eq 1 ] ; then
615  j=0
616  jmax=1
617fi
618set -A TYPEKEY ${M_TYPE[$j]}
619kmax=0
620while [[ $j -lt $jmax ]] ; do
621  if [[ ${M_TYPE[j]} != ${TYPEKEY[0]} ]] ; then
622    if [[ $kmax == 1 ]] ; then
623      if [[ ${M_TYPE[j]} != ${TYPEKEY[1]} ]] ; then 
624        set -A TYPEKEY ${TYPEKEY[0]} ${TYPEKEY[1]} ${M_TYPE[j]}
625        kmax=2
626      fi
627    else
628      if [[ $kmax == 0 ]] ; then   
629        set -A TYPEKEY ${TYPEKEY[0]} ${M_TYPE[j]}
630        kmax=1
631      else
632        if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[1]}  ]] ; then   
633          if [[ $kmax == 2 && ${M_TYPE[j]} != ${TYPEKEY[2]}  ]] ; then   
634
635            echo ${TYPEKEY[0]} ${TYPEKEY[1]}  ${TYPEKEY[2]} ${M_TYPE[j]}
636            myerror 'More than three different MARS TYPES not supported'
637       
638            exit 1
639          fi
640        fi
641      fi
642    fi
643  fi
644  j=$(($j+$DTIME))
645done
646 
647set -A GRIDKEY $D_GRID
648mmax=1
649i=0
650while [[ $i -lt $imax ]] ; do
651  if [[ ${GRID[$i]} == 'OFF' && ${PARLIST[$i]} != LNSP ]] ; then
652    set -A GRIDKEY $D_GRID OFF
653    mmax=2
654  fi 
655  i=$(($i+1))
656done
657
658k=0
659kmax=$(($kmax+1))
660while [[ $k -lt $kmax ]] ; do
661MMTIME=''
662MMSTEP=''
663TSUFF=''
664SSUFF=''
665j=0
666if [ $MSJ_BASETIME -eq 12 ] ; then
667  j=$(($DTIME))
668  jmax=$(($DTIME+12))
669else
670  j=$(($DTIME+12))
671fi
672if [ $iter -eq 1 ] ; then
673  j=0
674  jmax=1
675fi
676while [[ $j -lt $jmax ]] ; do
677  if [[ ${M_TYPE[$j]} == ${TYPEKEY[$k]} ]] ; then
678    if [[ `echo $MMTIME | grep ${M_TIME[$j]}` == '' ]] ; then
679      MMTIME=${MMTIME}$TSUFF${M_TIME[$j]}
680      TSUFF='/'
681    fi
682    if [[ `echo $MMSTEP | grep ${M_STEP[$j]}` == '' ]] ; then
683      MMSTEP=${MMSTEP}$SSUFF${M_STEP[$j]}
684      SSUFF='/'
685    fi
686  fi
687j=$(($j+$DTIME))
688done
689
690m=0
691while [[ $m -lt $mmax ]] ; do
692MMPAR=''
693PSUFF=''
694i=0
695while [[ $i -lt $imax ]] ; do
696  if [[ ${LTY[$i]} == ML && ${GRID[$i]} == ${GRIDKEY[m]} && ${PARLIST[$i]} != LNSP ]] ; then
697    if [[ `echo $MMPAR | grep ${PARLIST[$i]}` == '' ]] ; then
698      MMPAR=${MMPAR}$PSUFF${PARLIST[$i]}
699      PSUFF='/'
700    fi
701  fi
702i=$(($i+1))
703done
704
705  marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} $MMPAR "[param].[date].[time].[step]" ML ${GRIDKEY[$m]} ${LEVELIST[$m]}
706  mars marsjob
707  [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request"
708  rm marsjob
709
710m=$(($m+1))
711done
712# LNSP treated separately since it exists only on 1 level
713  marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} LNSP "[param].[date].[time].[step]" ML OFF 1
714  mars marsjob
715  [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request"
716  rm marsjob
717
718# For some data classes, MARS adds GRIB table number to parameter number,
719# e.g. for Temperature it is 130.128 instead of just 130
720#
721  set +e
722  TNR=`ls 131*${MDATE}.${M_TIME[00]}00.${M_STEP[00]} | awk -F . '{print $2}' - | grep -v ${MDATE}`.
723  set -e
724  if [[ $TNR != '.' ]] ; then
725    TNR=.$TNR
726  fi
727
728# SURF treated separately since it exists only on 1 level
729  marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[4]} "SURF${TNR}[date].[time].[step]" SFC $D_GRID OFF
730  mars marsjob
731  [ $? -ne 0 ] && myerror "Job stopped because of failing MARS request"
732  rm marsjob
733# OROLSM treated separately since it exists only on 1 level
734  marsinst ${TYPEKEY[$k]} ${MDATE} ${MMTIME} ${MMSTEP} ${PARLIST[5]} "OROLSM${TNR}[date].[time].[step]" SFC $D_GRID OFF
735  mars marsjob
736  [ $? -ne 0 ] &&  myerror "Job stopped because of failing MARS request"
737#  if [ -f OROLSM ] ; then
738#    for oro in `ls
739#    cat OROLSM >> OROLSM${TNR}${MDATE}.${MMTIME}00.${MMSTEP}
740#    rm OROLSM
741#    echo 'found'
742#    exit 0
743#  fi
744  rm marsjob
745
746k=$(($k+1))
747done
748
749
750
751
752j=0
753if [ $MSJ_BASETIME -eq 12 ] ; then
754  j=$(($DTIME))
755  jmax=$(($DTIME+12))
756else
757  j=$(($DTIME+12))
758fi
759if [ $iter -eq 1 ] ; then
760  j=0
761  jmax=1
762fi
763while [[ $j -lt $jmax ]] ; do
764
765
766TIME=${FIELD[$j]}
767XTIME=${TIME}00
768
769set +e
770i=0
771while [[ $i -lt $imax ]] ; do 
772  \rm fort.${UNIT[$i]} 2>/dev/null
773  if [[ ${PARLIST[$i]} == U/V ]] ; then
774    cat 131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} > fort.${UNIT[$i]}
775    rm  131${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]} 132${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]}
776  else
777    mv  ${PARNAME[$i]}${TNR}${MDATE}.${M_TIME[$j]}00.${M_STEP[$j]}  fort.${UNIT[$i]}
778  fi
779  i=$(($i+1))
780done
781
782# flux data need special GRIB conversion
783#if [ ${M_FORMAT} == GRIB2 ] ; then
784#  grib_set -w shortName!=lsp,shortName!=cp,shortName!=ewss,shortName!=nsss  -s edition=2,productDefinitionTemplateNumber=8 flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2
785#
786#else
787# mv flux${MDATE}${TIME} flux${MDATE}${TIME}.grib2
788#fi
789
790${EXEDIR}/CONVERT2
791
792if [ $TIME -eq 00 ]; then
793  MDATE=`date2p1 ${MDATE}`
794  MDATEX=`echo ${MDATE} | cut -c 3-8`
795fi
796 
797INFILE=${PREFIX}${MDATEX}${TIME}
798
799if [ -s fort.15 ]; then
800    cp fort.15                   ${INFILE}
801    cat fort.14              >>  ${INFILE}
802    cat flux${MDATE}${TIME}  >>  ${INFILE}
803    cat OROLSM   >>  ${INFILE}
804    cat fort.20  >>  ${INFILE}
805
806#
807# Convert to GRIB2 if needed
808#
809#  to enable additional compression try
810#  set packingType="grid_jpeg";
811#  this is rather time consuming.
812
813if [ ${M_FORMAT} == GRIB2 ] ; then
814 grib_set -s edition=2,productDefinitionTemplateNumber=8 $INFILE ${INFILE}_2
815 mv ${INFILE}_2 ${INFILE}
816 
817  if [ ${COMPRESSION} != grid_simple ] ; then
818
819cat >rule.filter<<EOF
820set packingType="${COMPRESSION}";
821write "[file]_2";
822EOF
823    grib_filter rule.filter ${INFILE}
824    mv ${INFILE}_2 ${INFILE}
825  fi
826fi
827ls -l ${INFILE}
828
829else 
830    echo ERROR: ENfile ${INFILE} missing!
831    echo ABORT!
832    for MUSER in $MAILFAIL
833    do
834      mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE}
835    done
836    exit 1
837fi
838
839#check ENxxx file & ECtrans to local gateway
840
841
842\rm fort.15 2>/dev/null
843ln -s ${INFILE} fort.15
844
845[ -s CHECK.SUCCESS ] && rm CHECK.SUCCESS
846
847${EXEDIR}/CHECK
848
849#check fields
850if [ -s CHECK.SUCCESS ]; then
851    SUCCESS=1
852else
853    echo 'ERROR: check on ENfile failed:' ${INFILE}
854    echo ABORT!
855    for MUSER in $MAILFAIL
856    do
857      mailx -s ERROR:${JOBNAME} ${MUSER} <${LOG_FILE}
858    done
859    exit 1
860fi
861
862
863
864#ECtrans
865if [ $SUCCESS -eq 1 -a $ECTRANS -eq 1 ] ; then
866  ectrans -overwrite -gateway ${GATEWAY} -remote ${DESTINATION} -source $INFILE
867fi
868
869#ECFS
870if [ $SUCCESS -eq 1 -a $ECSTORAGE -eq 1 ] ; then
871 ecp -o $INFILE $ECFSDIR
872fi
873
874rm ${INFILE}_2 ${INFILE} fort.15  flux${MDATE}${TIME}*
875
876j=$(($j+$DTIME))
877
878#done TIME
879done
880
881(( IJULDAY = IJULDAY + 1 ))
882(( iter = iter + 1 ))
883
884#done JULDAY
885done
886
887#any warnings ?
888[ $NRW -gt 0 ] && echo There were $NRW warnings !
889
890#mail logfile (list MAILOPS)
891for MUSER in $MAILOPS
892do
893
894mailx -s ${JOBNAME} ${MUSER} <${LOG_FILE}
895done
896
897#
898# cleanup
899#
900cd ${SCRATCH}
901echo $SCRATCHDIR not removed!
902#\rm -fR $SCRATCHDIR
903
904
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG