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