Subversion Repositories lagranto.um

Rev

Rev 5 | Rev 15 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5 Rev 13
1
#!/bin/csh
1
#!/bin/csh
2
 
2
 
3
# ---------------------------------------------------------------------
3
# ---------------------------------------------------------------------
4
# Usage, parameter settings
4
# Usage, parameter settings
5
# ---------------------------------------------------------------------
5
# ---------------------------------------------------------------------
6
 
6
 
7
# Write usage information
7
# Write usage information
8
if ( (${#argv} == 0) | (${#argv} < 2) ) then
8
if ( (${#argv} == 0) | (${#argv} < 2) ) then
9
  echo 
9
  echo 
10
  echo "--------------------------------------------------------------"
10
  echo "--------------------------------------------------------------"
11
  echo " Usage: trace.sh inpfile outfile [flags]        "
11
  echo " Usage: trace.sh inpfile outfile [flags]        "
12
  echo 
12
  echo 
13
  echo "        inpfile   : Input trajectory file                     "
13
  echo "        inpfile   : Input trajectory file                     "
14
  echo "        outfile   : Output trajectory file                    "
14
  echo "        outfile   : Output trajectory file                    "
15
  echo "        [ flags ] : Optional list of flags                    "
15
  echo "        [ flags ] : Optional list of flags                    "
16
  echo
16
  echo
17
  echo " Optional flags                                               "
17
  echo " Optional flags                                               "
18
  echo
18
  echo
19
  echo "        -i hours     : Time increment for input files in hours"
19
  echo "        -i hours     : Time increment for input files in hours"
20
  echo "        -v filename  : Name of tracing file                   "
20
  echo "        -v filename  : Name of tracing file                   "
21
  echo "        -f var scale : Trace field <var> with scaling <scale> "
21
  echo "        -f var scale : Trace field <var> with scaling <scale> "
22
  echo "        -changet     : change times on P,S files before calculation" 
22
  echo "        -changet     : change times on P,S files before calculation" 
23
  echo "        -noclean     : do not remove temporary files"
23
  echo "        -noclean     : do not remove temporary files"
24
  echo 
24
  echo 
25
  echo " Tracing variables must be available on file <tracevars>, if not"
25
  echo " Tracing variables must be available on file <tracevars>, if not"
26
  echo " provided with "-f" option. The format of the <tracevars> file is"
26
  echo " provided with "-f" option. The format of the <tracevars> file is"
27
  echo  
27
  echo  
28
  echo "           varname   scale    compflag[0|1]   prefix[P|S]     "
28
  echo "           varname   scale    compflag[0|1]   prefix[P|S]     "
29
  echo
29
  echo
30
  echo " The tracing variables have the following form                "
30
  echo " The tracing variables have the following form                "
31
  echo 
31
  echo 
32
  echo "             varname[:shift] with <shift> as + 100 km[lat]    "
32
  echo "             varname[:shift] with <shift> as + 100 km[lat]    "
33
  echo "                                             - 100 km[lon]    "
33
  echo "                                             - 100 km[lon]    "
34
  echo "                                             + 2 dlon         "
34
  echo "                                             + 2 dlon         "
35
  echo "                                             - 2 dlat         "
35
  echo "                                             - 2 dlat         "
36
  echo "                                             + 50 hPa         "
36
  echo "                                             + 50 hPa         "
37
  echo "                                             - 1 dp           "
37
  echo "                                             - 1 dp           "
38
  echo "                                             + 6 h            "
38
  echo "                                             + 6 h            "
39
  echo "                                             - 180 min        "
39
  echo "                                             - 180 min        "
40
  echo
40
  echo
41
  echo " The following fields can be computed 'online':               "
41
  echo " The following fields can be computed 'online':               "
42
  echo
42
  echo
43
  echo " TH, RHO, RH, THE, LHR, DUDX, DVDX, DTDX, DUDY, DVDY, DTDY,    " 
43
  echo " TH, RHO, RH, THE, LHR, DUDX, DVDX, DTDX, DUDY, DVDY, DTDY,    " 
44
  echo " DUDP, DVDP, DTDP, DTHDP, NSQ, RELVORT, ABSVORT, DIV, DTHDX,"
44
  echo " DUDP, DVDP, DTDP, DTHDP, NSQ, RELVORT, ABSVORT, DIV, DTHDX,"
45
  echo " DTHDY, PV, RI, TI"
45
  echo " DTHDY, PV, RI, TI"
46
  echo "--------------------------------------------------------------"
46
  echo "--------------------------------------------------------------"
47
  exit 0
47
  exit 0
48
endif
48
endif
49
 
49
 
50
# Write title
50
# Write title
51
echo 
51
echo 
52
echo '========================================================='
52
echo '========================================================='
53
echo '       *** START OF PREPROCESSOR TRACE ***              '
53
echo '       *** START OF PREPROCESSOR TRACE ***              '
54
echo
54
echo
55
 
55
 
56
# Get the arguments
56
# Get the arguments
57
set inpfile   = $1
57
set inpfile   = $1
58
set outfile   = $2
58
set outfile   = $2
59
 
59
 
60
# Set base directories (run+prog)
60
# Set base directories (run+prog)
61
set cdfdir=${PWD}
61
set cdfdir=${PWD}
62
set tradir=${PWD}
62
set tradir=${PWD}
63
 
63
 
64
# Set program paths and filenames 
64
# Set program paths and filenames 
65
set parfile = ${tradir}/trace.param 
65
set parfile = ${tradir}/trace.param 
66
set prog    = ${LAGRANTO}/trace/trace
66
set prog    = ${LAGRANTO}/trace/trace
67
 
67
 
68
# Set the prefix of the primary and secondary data files
68
# Set the prefix of the primary and secondary data files
69
set charp = 'P'
69
set charp = 'P'
70
set chars = 'S'
70
set chars = 'S'
71
 
71
 
72
echo '---- DIRECTORIES AND PROGRAMS ---------------------------'
72
echo '---- DIRECTORIES AND PROGRAMS ---------------------------'
73
echo    
73
echo    
74
echo "CDF directory         : ${cdfdir}"
74
echo "CDF directory         : ${cdfdir}"
75
echo "TRA directory         : ${tradir}"
75
echo "TRA directory         : ${tradir}"
76
echo "PROGRAM TRACE         : ${prog}"
76
echo "PROGRAM TRACE         : ${prog}"
77
echo "PARAMETER file        : ${parfile}"
77
echo "PARAMETER file        : ${parfile}"
78
echo
78
echo
79
 
79
 
80
# ---------------------------------------------------------------------
80
# ---------------------------------------------------------------------
81
# Set optional flags
81
# Set optional flags
82
# ---------------------------------------------------------------------
82
# ---------------------------------------------------------------------
83
 
83
 
84
echo '---- OPTIONAL FLAGS -------------------------------------'
84
echo '---- OPTIONAL FLAGS -------------------------------------'
85
echo
85
echo
86
 
86
 
87
# Set some default values ("nil" must be set according to input files)
87
# Set some default values ("nil" must be set according to input files)
88
set flag_i     = "nil"
88
set flag_i     = "nil"
89
set flag_v     = "tracevars"
89
set flag_v     = "tracevars"
90
set flag_f     = "nil"
90
set flag_f     = "nil"
91
set tvfile     = 'tracevars'
91
set tvfile     = 'tracevars'
92
set changet    = 'false'
92
set changet    = 'false'
93
set noclean    = 'false'
93
set noclean    = 'false'
94
set timecheck  = 'yes' 
94
set timecheck  = 'yes' 
95
 
95
 
96
# Set flag for consitency
96
# Set flag for consitency
97
set isok = 1
97
set isok = 1
98
 
98
 
99
while ( $#argv > 0 )
99
while ( $#argv > 0 )
100
 
100
 
101
  switch ( $argv[1] )
101
  switch ( $argv[1] )
102
 
102
 
103
   case -i
103
   case -i
104
     set flag_i=$argv[2]
104
     set flag_i=$argv[2]
105
     echo "Flag '-i'     -> ${flag_i} (user defined)"
105
     echo "Flag '-i'     -> ${flag_i} (user defined)"
106
     shift;
106
     shift;
107
   breaksw
107
   breaksw
108
 
108
 
109
   case -v
109
   case -v
110
     set flag_v="-v"
110
     set flag_v="-v"
111
     set tvfile=$argv[2]
111
     set tvfile=$argv[2]
112
     echo "Flag '-v'     -> ${tvfile} (user defined)"
112
     echo "Flag '-v'     -> ${tvfile} (user defined)"
113
     shift;
113
     shift;
114
     if ( $isok == 2 ) set isok = 0
114
     if ( $isok == 2 ) set isok = 0
115
     if ( $isok == 1 ) set isok = 2
115
     if ( $isok == 1 ) set isok = 2
116
   breaksw
116
   breaksw
117
 
117
 
118
   case -f
118
   case -f
119
     set flag_f="-f"
119
     set flag_f="-f"
120
     set tvfile="tracevars.tmp"
120
     set tvfile="tracevars.tmp"
121
     shift;
121
     shift;
122
     set tvar="$argv[1]"
122
     set tvar="$argv[1]"
123
     shift;
123
     shift;
124
     set tscale="$argv[1]"
124
     set tscale="$argv[1]"
125
     echo "Flag '-f'     -> ${tvar} ${tscale} (user defined)"
125
     echo "Flag '-f'     -> ${tvar} ${tscale} (user defined)"
126
     if ( $isok == 2 ) set isok = 0
126
     if ( $isok == 2 ) set isok = 0
127
     if ( $isok == 1 ) set isok = 2
127
     if ( $isok == 1 ) set isok = 2
128
   breaksw
128
   breaksw
129
 
129
 
130
   case -changet
130
   case -changet
131
     set changet = 'true'
131
     set changet = 'true'
132
     echo "changet       -> true (user defined)"
132
     echo "changet       -> true (user defined)"
133
   breaksw
133
   breaksw
134
 
134
 
135
   case -noclean
135
   case -noclean
136
     set noclean = 'true'
136
     set noclean = 'true'
137
     echo "noclean       -> true (user defined)"
137
     echo "noclean       -> true (user defined)"
138
   breaksw
138
   breaksw
139
 
139
 
140
   case -notimecheck
140
   case -notimecheck
141
     set timecheck = 'no'
141
     set timecheck = 'no'
142
     echo "timecheck               -> no (user defined)"
142
     echo "timecheck               -> no (user defined)"
143
   breaksw
143
   breaksw
144
 
144
 
145
  endsw
145
  endsw
146
 
146
 
147
  shift;
147
  shift;
148
 
148
 
149
end
149
end
150
 
150
 
151
# No change of times necessary if no check requested
151
# No change of times necessary if no check requested
152
if ( "${timecheck}" == "no" ) then
152
if ( "${timecheck}" == "no" ) then
153
   set  changet = 'false'
153
   set  changet = 'false'
154
endif
154
endif
155
 
155
 
156
# Check consitency of arguments
156
# Check consitency of arguments
157
if ( $isok == 0 ) then
157
if ( $isok == 0 ) then
158
    echo
158
    echo
159
    echo " ERROR: Use either option '-v' or '-f', but not both..."
159
    echo " ERROR: Use either option '-v' or '-f', but not both..."
160
    exit 1
160
    exit 1
161
endif
161
endif
162
 
162
 
163
# ---------------------------------------------------------------------
163
# ---------------------------------------------------------------------
164
# Handle the input trajectory file
164
# Handle the input trajectory file
165
# ---------------------------------------------------------------------
165
# ---------------------------------------------------------------------
166
 
166
 
167
echo
167
echo
168
echo '---- TIME RANGE -----------------------------------------'
168
echo '---- TIME RANGE -----------------------------------------'
169
echo
169
echo
170
 
170
 
171
# Check whether the input file can be found
171
# Check whether the input file can be found
172
if ( ! -f ${inpfile} ) then
172
if ( ! -f ${inpfile} ) then
173
    echo " ERROR : Input file ${inpfile} is missing"
173
    echo " ERROR : Input file ${inpfile} is missing"
174
    exit 1
174
    exit 1
175
endif
175
endif
176
 
176
 
177
# Get the start, end and reference date for the tracing
177
# Get the start, end and reference date for the tracing
178
set startdate = `${LAGRANTO}/goodies/trainfo.sh ${inpfile} startdate` 
178
set startdate = `${LAGRANTO}/goodies/trainfo.sh ${inpfile} startdate` 
179
set enddate   = `${LAGRANTO}/goodies/trainfo.sh ${inpfile} enddate` 
179
set enddate   = `${LAGRANTO}/goodies/trainfo.sh ${inpfile} enddate` 
180
set refdate   = `${LAGRANTO}/goodies/trainfo.sh ${inpfile} refdate` 
180
set refdate   = `${LAGRANTO}/goodies/trainfo.sh ${inpfile} refdate` 
181
set ntra      =  `${LAGRANTO}/goodies/trainfo.sh ${inpfile} ntra`
181
set ntra      =  `${LAGRANTO}/goodies/trainfo.sh ${inpfile} ntra`
182
set ntim      =  `${LAGRANTO}/goodies/trainfo.sh ${inpfile} ntim`
182
set ntim      =  `${LAGRANTO}/goodies/trainfo.sh ${inpfile} ntim`
183
set ncol      =  `${LAGRANTO}/goodies/trainfo.sh ${inpfile} ncol`
183
set ncol      =  `${LAGRANTO}/goodies/trainfo.sh ${inpfile} ncol`
184
 
184
 
185
# Check format of start and end date - must be the same
185
# Check format of start and end date - must be the same
186
set ns=`echo $startdate | sed -e 's/_[0-9]*//' | wc -c`
186
set ns=`echo $startdate | sed -e 's/_[0-9]*//' | wc -c`
187
set ne=`echo $enddate   | sed -e 's/_[0-9]*//' | wc -c`
187
set ne=`echo $enddate   | sed -e 's/_[0-9]*//' | wc -c`
188
if ( $ns != $ne ) then
188
if ( $ns != $ne ) then
189
  echo " ERROR: start and end date must be in the same format ***"
189
  echo " ERROR: start and end date must be in the same format ***"
190
  exit 1
190
  exit 1
191
endif
191
endif
192
if ( $ns != 9 ) then
192
if ( $ns != 9 ) then
193
  echo " ERROR: Date format must be yyyymmdd ***"
193
  echo " ERROR: Date format must be yyyymmdd ***"
194
  exit 1
194
  exit 1
195
endif
195
endif
196
set ns=`echo $startdate | sed -e 's/[0-9]*_//' | wc -c`
196
set ns=`echo $startdate | sed -e 's/[0-9]*_//' | wc -c`
197
set ne=`echo $enddate   | sed -e 's/[0-9]*_//' | wc -c`
197
set ne=`echo $enddate   | sed -e 's/[0-9]*_//' | wc -c`
198
if ( $ns != $ne ) then
198
if ( $ns != $ne ) then
199
  echo " ERROR: start and end date must be in the same format ***"
199
  echo " ERROR: start and end date must be in the same format ***"
200
  exit 1
200
  exit 1
201
endif
201
endif
202
if ( ( $ns != 5 ) & ( $ns != 3 ) ) then
202
if ( ( $ns != 5 ) & ( $ns != 3 ) ) then
203
  echo " ERROR: Time format must be hh(mm) ***"
203
  echo " ERROR: Time format must be hh(mm) ***"
204
  exit 1
204
  exit 1
205
endif
205
endif
206
 
206
 
207
# Split the start and end date into <yymmdd_hh and mm>
207
# Split the start and end date into <yymmdd_hh and mm>
208
set startdate_ymdh = `echo $startdate | cut -c 1-11`
208
set startdate_ymdh = `echo $startdate | cut -c 1-11`
209
set startdate_min  = `echo $startdate | cut -c 12-13`
209
set startdate_min  = `echo $startdate | cut -c 12-13`
210
if ( $startdate_min == "" ) set startdate_min = 00
210
if ( $startdate_min == "" ) set startdate_min = 00
211
 
211
 
212
set enddate_ymdh = `echo $enddate | cut -c 1-11`
212
set enddate_ymdh = `echo $enddate | cut -c 1-11`
213
set enddate_min  = `echo $enddate | cut -c 12-13`
213
set enddate_min  = `echo $enddate | cut -c 12-13`
214
if ( $enddate_min == "" ) set enddate_min = 00
214
if ( $enddate_min == "" ) set enddate_min = 00
215
 
215
 
216
# Get the time difference between <start_ymdh> and <end_ymdh> date
216
# Get the time difference between <start_ymdh> and <end_ymdh> date
217
# Decide whether trajectoriesare forward or backward
217
# Decide whether trajectoriesare forward or backward
218
set timediff_hh = `${LAGRANTO}/goodies/gettidiff ${enddate_ymdh} ${startdate_ymdh}`
218
set timediff_hh = `${LAGRANTO}/goodies/gettidiff ${enddate_ymdh} ${startdate_ymdh}`
219
 
219
 
220
if ( $timediff_hh == 0 ) then
220
if ( $timediff_hh == 0 ) then
221
  if ( $enddate_min > $startdate_min ) then
221
  if ( $enddate_min > $startdate_min ) then
222
    set direction = f
222
    set direction = f
223
    set idir      = 1
223
    set idir      = 1
224
  else
224
  else
225
    set direction = b
225
    set direction = b
226
    set idir      = -1
226
    set idir      = -1
227
  endif
227
  endif
228
else if ( $timediff_hh > 0 ) then
228
else if ( $timediff_hh > 0 ) then
229
  set direction = f
229
  set direction = f
230
  set idir      = 1
230
  set idir      = 1
231
else
231
else
232
  set direction = b
232
  set direction = b
233
  set idir      = -1
233
  set idir      = -1
234
  @ timediff_hh = $idir * $timediff_hh
234
  @ timediff_hh = $idir * $timediff_hh
235
endif
235
endif
236
 
236
 
237
# Get also minutes for time difference, if <start_min> or <end_min> != 0
237
# Get also minutes for time difference, if <start_min> or <end_min> != 0
238
set timediff_mm=
238
set timediff_mm=
239
 
239
 
240
if ( $startdate_min != 00 || $enddate_min != 00 ) then
240
if ( $startdate_min != 00 || $enddate_min != 00 ) then
241
  @ min = ( $enddate_min - $startdate_min )
241
  @ min = ( $enddate_min - $startdate_min )
242
  if ( $min == 0 ) then
242
  if ( $min == 0 ) then
243
    set timediff_mm=
243
    set timediff_mm=
244
  else if ( $min > 0 ) then
244
  else if ( $min > 0 ) then
245
    if ( $idir == 1 ) then
245
    if ( $idir == 1 ) then
246
      set timediff_mm=$min
246
      set timediff_mm=$min
247
    else
247
    else
248
      @ timediff_hh --
248
      @ timediff_hh --
249
      @ timediff_mm = 60 - $min
249
      @ timediff_mm = 60 - $min
250
    endif
250
    endif
251
  else
251
  else
252
    if ( $idir == 1 ) then
252
    if ( $idir == 1 ) then
253
      @ timediff_hh --
253
      @ timediff_hh --
254
      @ timediff_mm = 60 + $min
254
      @ timediff_mm = 60 + $min
255
    else
255
    else
256
      @ timediff_mm = 0 - $min
256
      @ timediff_mm = 0 - $min
257
    endif
257
    endif
258
  endif
258
  endif
259
else
259
else
260
  set timediff_mm = 0
260
  set timediff_mm = 0
261
endif
261
endif
262
 
262
 
263
# Write status information
263
# Write status information
264
echo "Time range      : ${startdate} -> ${enddate}"
264
echo "Time range      : ${startdate} -> ${enddate}"
265
if ( ${timediff_mm} != "" ) then
265
if ( ${timediff_mm} != "" ) then
266
   echo "Time difference : ${timediff_hh} h ${timediff_mm} min"
266
   echo "Time difference : ${timediff_hh} h ${timediff_mm} min"
267
else
267
else
268
   echo "Time difference : ${timediff_hh} h"
268
   echo "Time difference : ${timediff_hh} h"
269
endif
269
endif
270
echo "Direction       : ${direction} (${idir})"
270
echo "Direction       : ${direction} (${idir})"
271
 
271
 
272
# ---------------------------------------------------------------------
272
# ---------------------------------------------------------------------
273
# Check availability of input data 
273
# Check availability of input data 
274
# ---------------------------------------------------------------------
274
# ---------------------------------------------------------------------
275
 
275
 
276
echo
276
echo
277
echo '---- INPUT FILES ----------------------------------------'
277
echo '---- INPUT FILES ----------------------------------------'
278
echo
278
echo
279
 
279
 
280
# Take the time increment from flag list ('nil', if not defined)
280
# Take the time increment from flag list ('nil', if not defined)
281
set timeinc = ${flag_i}
281
set timeinc = ${flag_i}
282
 
282
 
283
# Find a first data file (if possible corresponding to start/end date
283
# Find a first data file (if possible corresponding to start/end date
284
# If starttime is not a data time, take the first file in the direectory
284
# If starttime is not a data time, take the first file in the direectory
285
if ( $direction == "f" ) then
285
if ( $direction == "f" ) then
286
  set file=${charp}${startdate_ymdh}
286
  set file=${charp}${startdate_ymdh}
287
else
287
else
288
  set file=${charp}${enddate_ymdh}
288
  set file=${charp}${enddate_ymdh}
289
endif
289
endif
290
if ( ! -f $file ) then
290
if ( ! -f $file ) then
291
  set file=`ls ${charp}[0-9_]*[0-9] | head -1 | sed -e 's/@//'`
291
  set file=`ls ${charp}[0-9_]*[0-9] | head -1 | sed -e 's/@//'`
292
endif
292
endif
293
 
293
 
294
# Determine timeinc (the time difference in hours between two data file)
294
# Determine timeinc (the time difference in hours between two data file)
295
# if not already defined with option -i
295
# if not already defined with option -i
296
if ( ${timeinc} == "nil" ) then
296
if ( ${timeinc} == "nil" ) then
297
  set date1=`echo $file | cut -c 2-`
297
  set date1=`echo $file | cut -c 2-`
298
  set n=`ls ${charp}[0-9_]*[0-9] | grep -n $date1 | awk -F: '{print $1}'`
298
  set n=`ls ${charp}[0-9_]*[0-9] | grep -n $date1 | awk -F: '{print $1}'`
299
  @ n ++
299
  @ n ++
300
  set date2=`\ls ${charp}[0-9_]*[0-9] | head -$n | tail -1 | cut -c 2-`
300
  set date2=`\ls ${charp}[0-9_]*[0-9] | head -$n | tail -1 | cut -c 2-`
301
  set timeinc=`${LAGRANTO}/goodies/gettidiff $date2 $date1`
301
  set timeinc=`${LAGRANTO}/goodies/gettidiff $date2 $date1`
302
endif
302
endif
303
if ( $timeinc == 0 ) then
303
if ( $timeinc == 0 ) then
304
    echo " ERROR: cannot set the time increment between input files ***"
304
    echo " ERROR: cannot set the time increment between input files ***"
305
    exit 1
305
    exit 1
306
endif
306
endif
307
 
307
 
308
# Decide whether the time increment is smaller than 1 h; if so set the hires
308
# Decide whether the time increment is smaller than 1 h; if so set the hires
309
# flag and convert the timeincement into fractional hour
309
# flag and convert the timeincement into fractional hour
310
set flag = `echo ${timeinc} | grep -n '\.'`
310
set flag = `echo ${timeinc} | grep -n '\.'`
311
set hires = 0
311
set hires = 0
312
if ( "${flag}" != "" ) then
312
if ( "${flag}" != "" ) then
313
  echo "Input files availability < 1 hour ($timeinc): switch to hires"
313
  echo "Input files availability < 1 hour ($timeinc): switch to hires"
314
  echo "mode. All input files must be of form: P{yyyymmdd_hhmm}"
314
  echo "mode. All input files must be of form: P{yyyymmdd_hhmm}"
315
  set hires = 1
315
  set hires = 1
316
  set timeinc_min = `echo "(${timeinc} * 100 + 0.5)/1" | bc`
316
  set timeinc_min = `echo "(${timeinc} * 100 + 0.5)/1" | bc`
317
  set timeinc     = `echo "scale=2; ${timeinc} * 100 / 60" | bc`
317
  set timeinc     = `echo "scale=8; ${timeinc} * 100 / 60" | bc`
318
  goto hires
318
  goto hires
319
endif
319
endif
320
 
320
 
321
## Search the first file to use: We step through all P files and see whether they are
321
## Search the first file to use: We step through all P files and see whether they are
322
# good P files. Let's first do the test for the first data file found. If it's ok, we 
322
# good P files. Let's first do the test for the first data file found. If it's ok, we 
323
# take it; if not, we step through all P files and find the good one  
323
# take it; if not, we step through all P files and find the good one  
324
set flag=0
324
set flag=0
325
set td=
325
set td=
326
 
326
 
327
set date = `echo $file | cut -c 2-12`
327
set date = `echo $file | cut -c 2-12`
328
set td1  = `${LAGRANTO}/goodies/gettidiff ${startdate_ymdh} ${date}`
328
set td1  = `${LAGRANTO}/goodies/gettidiff ${startdate_ymdh} ${date}`
329
set td2  = `${LAGRANTO}/goodies/gettidiff ${enddate_ymdh}   ${date}`
329
set td2  = `${LAGRANTO}/goodies/gettidiff ${enddate_ymdh}   ${date}`
330
 
330
 
331
if (( $td1 < $timeinc || $td2 < $timeinc ) && ( $td1 >= 0 || $td2 >= 0 )) then
331
if (( $td1 < $timeinc || $td2 < $timeinc ) && ( $td1 >= 0 || $td2 >= 0 )) then
332
   set datfiles=$date
332
   set datfiles=$date
333
   if ( $td1 < $timeinc    ) set td=$td1
333
   if ( $td1 < $timeinc    ) set td=$td1
334
   if ( $td2 < $timeinc    ) set td=$td2
334
   if ( $td2 < $timeinc    ) set td=$td2
335
   if ( ( $startdate_min > 0 ) || ( $enddate_min > 0 ) ) @ td ++
335
   if ( ( $startdate_min > 0 ) || ( $enddate_min > 0 ) ) @ td ++
336
   goto label2      
336
   goto label2      
337
endif
337
endif
338
 
338
 
339
foreach i ( ${charp}????????_?? )
339
foreach i ( ${charp}????????_?? )
340
 
340
 
341
  set date = `echo $i | cut -c 2-12`
341
  set date = `echo $i | cut -c 2-12`
342
  set td1  = `${LAGRANTO}/goodies/gettidiff ${startdate_ymdh} ${date}`
342
  set td1  = `${LAGRANTO}/goodies/gettidiff ${startdate_ymdh} ${date}`
343
  set td2  = `${LAGRANTO}/goodies/gettidiff ${enddate_ymdh}   ${date}`
343
  set td2  = `${LAGRANTO}/goodies/gettidiff ${enddate_ymdh}   ${date}`
344
 
344
 
345
  if (( $td1 < $timeinc || $td2 < $timeinc ) && ( $td1 >= 0 || $td2 >= 0 )) then
345
  if (( $td1 < $timeinc || $td2 < $timeinc ) && ( $td1 >= 0 || $td2 >= 0 )) then
346
      set datfiles=$date
346
      set datfiles=$date
347
      if ( $td1 < $timeinc    ) set td=$td1
347
      if ( $td1 < $timeinc    ) set td=$td1
348
      if ( $td2 < $timeinc    ) set td=$td2
348
      if ( $td2 < $timeinc    ) set td=$td2
349
      if ( ( $startdate_min > 0 ) || ( $enddate_min > 0 ) ) @ td ++
349
      if ( ( $startdate_min > 0 ) || ( $enddate_min > 0 ) ) @ td ++
350
      goto label2
350
      goto label2
351
  endif
351
  endif
352
 
352
 
353
end
353
end
354
 
354
 
355
if ( $td == "" ) then
355
if ( $td == "" ) then
356
  echo " ERROR: no data files available for the specified time period"
356
  echo " ERROR: no data files available for the specified time period"
357
  exit 1
357
  exit 1
358
endif
358
endif
359
 
359
 
360
# If the input files come with time increment < 1 hour, handle it in this
360
# If the input files come with time increment < 1 hour, handle it in this
361
# special section. The aim is not to 'interfere' with the well established
361
# special section. The aim is not to 'interfere' with the well established
362
# code handling the standard case with time increment >= 1 hour. In this mode
362
# code handling the standard case with time increment >= 1 hour. In this mode
363
# we require that the start and end date are available as P files: no start is
363
# we require that the start and end date are available as P files: no start is
364
# allowed between the model output files
364
# allowed between the model output files
365
hires:
365
hires:
366
 
366
 
367
set flag=0
367
set flag=0
368
set td=0
368
set td=0
369
 
369
 
370
if ( $direction == "f" ) then
370
if ( $direction == "f" ) then
371
  set file=${charp}${startdate}
371
  set file=${charp}${startdate}
372
else 
372
else 
373
  set file=${charp}${enddate}
373
  set file=${charp}${enddate}
374
endif
374
endif
375
 
375
 
376
if ( -f $file ) then
376
if ( -f $file ) then
377
  set date     = `echo ${file} | cut -c 2-14`
377
  set date     = `echo ${file} | cut -c 2-14`
378
  set datfiles = $date
378
  set datfiles = $date
379
  set td       = 0
379
  set td       = 0
380
  goto label2
380
  goto label2
381
else
381
else
382
  echo
382
  echo
383
  echo " ERROR: no data files available for the specified time period"
383
  echo " ERROR: no data files available for the specified time period"
384
  exit 1
384
  exit 1
385
endif
385
endif
386
 
386
 
387
# Everything is fine so far: proceed
387
# Everything is fine so far: proceed
388
label2:
388
label2:
389
 
389
 
390
# Calculate the number of further files; handle hires (timeinc<1 h) and
390
# Calculate the number of further files; handle hires (timeinc<1 h) and
391
# standard mode (timeinc >= 1 h) separately
391
# standard mode (timeinc >= 1 h) separately
392
if ( ${hires} == 0 ) then
392
if ( ${hires} == 0 ) then
393
 @ num = ( $timediff_hh + $td ) / $timeinc + 1
393
 @ num = ( $timediff_hh + $td ) / $timeinc + 1
394
 @ dum1 = ( $num - 1 ) * $timeinc
394
 @ dum1 = ( $num - 1 ) * $timeinc
395
 @ dum2 = $timediff_hh + $td
395
 @ dum2 = $timediff_hh + $td
396
 if ( $dum1 != $dum2 ) @ num ++
396
 if ( $dum1 != $dum2 ) @ num ++
397
else
397
else
398
 set num = `echo "( ${timediff_hh}*60 + ${timediff_mm} ) / ( ${timeinc_min} ) + 1" | bc`
398
 set num = `echo "( ${timediff_hh}*60 + ${timediff_mm} ) / ( ${timeinc_min} ) + 1" | bc`
399
endif 
399
endif 
400
 
400
 
401
# Get a list of all needed files
401
# Get a list of all needed files
402
set numfiles=$num
402
set numfiles=$num
403
set sfiles=1
403
set sfiles=1
404
echo $datfiles
404
echo $datfiles
405
while ( $num > 1 )
405
while ( $num > 1 )
406
  if ( $hires == 0 ) then
406
  if ( $hires == 0 ) then
407
     set date=`${LAGRANTO}/goodies/newtime $date $timeinc`
407
     set date=`${LAGRANTO}/goodies/newtime $date $timeinc`
408
  else
408
  else
409
     set date=`${LAGRANTO}/goodies/newtime $date $timeinc_min`
409
     set date=`${LAGRANTO}/goodies/newtime $date $timeinc_min`
410
  endif
410
  endif
411
  if ( ! -f ${charp}${date} ) then
411
  if ( ! -f ${charp}${date} ) then
412
    echo " ERROR: file with primary data is missing for $date"
412
    echo " ERROR: file with primary data is missing for $date"
413
    exit 1
413
    exit 1
414
  else if ( ! -f ${chars}${date} ) then
414
  else if ( ! -f ${chars}${date} ) then
415
    set sfiles=0
415
    set sfiles=0
416
    set datfiles=`echo $datfiles $date`
416
    set datfiles=`echo $datfiles $date`
417
  else
417
  else
418
    set datfiles=`echo $datfiles $date`
418
    set datfiles=`echo $datfiles $date`
419
  endif
419
  endif
420
  @ num --
420
  @ num --
421
end
421
end
422
 
422
 
423
# Calculate the start and the end time relative to the first datfile
423
# Calculate the start and the end time relative to the first datfile
424
if ( $direction == f ) then
424
if ( $direction == f ) then
425
  set tstart = `${LAGRANTO}/goodies/gettidiff $startdate $datfiles[1]`
425
  set tstart = `${LAGRANTO}/goodies/gettidiff $startdate $datfiles[1]`
426
  set tend   = `${LAGRANTO}/goodies/gettidiff $datfiles[$numfiles] $enddate`
426
  set tend   = `${LAGRANTO}/goodies/gettidiff $datfiles[$numfiles] $enddate`
427
else
427
else
428
  set tstart = `${LAGRANTO}/goodies/gettidiff $datfiles[$numfiles] $startdate`
428
  set tstart = `${LAGRANTO}/goodies/gettidiff $datfiles[$numfiles] $startdate`
429
  set tend   = `${LAGRANTO}/goodies/gettidiff $enddate $datfiles[1]`
429
  set tend   = `${LAGRANTO}/goodies/gettidiff $enddate $datfiles[1]`
430
endif
430
endif
431
 
431
 
432
 
432
 
433
# Write some status information
433
# Write some status information
434
echo "Primary file prefix               : ${charp}"
434
echo "Primary file prefix               : ${charp}"
435
echo "Secondary file prefix             : ${chars}"
435
echo "Secondary file prefix             : ${chars}"
436
if ( ${hires} == 0 ) then
436
if ( ${hires} == 0 ) then
437
  echo "Time increment for input files    : ${timeinc} h"
437
  echo "Time increment for input files    : ${timeinc} h"
438
else
438
else
439
  echo "Time increment for input files    : ${timeinc_min} min (0$timeinc h) "
439
  echo "Time increment for input files    : ${timeinc_min} min (0$timeinc h) "
440
endif
440
endif
441
echo "# input files                     : ${numfiles}"
441
echo "# input files                     : ${numfiles}"
442
echo "First input file                  : $datfiles[1] " 
442
echo "First input file                  : $datfiles[1] " 
443
echo "Last input file                   : $datfiles[$numfiles] " 
443
echo "Last input file                   : $datfiles[$numfiles] " 
444
echo "${charp} files availability              : 1"  
444
echo "${charp} files availability              : 1"  
445
echo "${chars} files availability              : ${sfiles}"     
445
echo "${chars} files availability              : ${sfiles}"     
446
if ( $direction == f ) then
446
if ( $direction == f ) then
447
echo "Start time relative to first file : $datfiles[1] + ${tstart} "
447
echo "Start time relative to first file : $datfiles[1] + ${tstart} "
448
echo "End time relative to last file    : $datfiles[$numfiles] - ${tend} "  
448
echo "End time relative to last file    : $datfiles[$numfiles] - ${tend} "  
449
else
449
else
450
echo "Start time relative to last file  : $datfiles[$numfiles] - ${tstart} "
450
echo "Start time relative to last file  : $datfiles[$numfiles] - ${tstart} "
451
echo "End time relative to first file   : $datfiles[1] + ${tend} "
451
echo "End time relative to first file   : $datfiles[1] + ${tend} "
452
endif
452
endif
453
 
453
 
454
echo
454
echo
455
echo $datfiles
455
echo $datfiles
456
 
456
 
457
# ---------------------------------------------------------------------
457
# ---------------------------------------------------------------------
458
# Check availability of input data 
458
# Check availability of input data 
459
# ---------------------------------------------------------------------
459
# ---------------------------------------------------------------------
460
 
460
 
461
echo
461
echo
462
echo '---- TRACEVAR FILE --------------------------------------'
462
echo '---- TRACEVAR FILE --------------------------------------'
463
echo    
463
echo    
464
 
464
 
465
# If "-f" option is used, create a temporary tracevar file
465
# If "-f" option is used, create a temporary tracevar file
466
if ( "${flag_f}" == "-f" ) then
466
if ( "${flag_f}" == "-f" ) then
467
 
467
 
468
#   Preset values for <compfl> and <tprefix>
468
#   Preset values for <compfl> and <tprefix>
469
    set tcompfl=1
469
    set tcompfl=1
470
    set tprefix='P'
470
    set tprefix='P'
471
 
471
 
472
#   Split the variable name into its vectorial components, if necessary
472
#   Split the variable name into its vectorial components, if necessary
473
    set tvar0 = `echo ${tvar} | awk -F. '{print $1}' `
473
    set tvar0 = `echo ${tvar} | awk -F. '{print $1}' `
474
    set tvar1 = `echo ${tvar} | awk -F. '{print $2}' `
474
    set tvar1 = `echo ${tvar} | awk -F. '{print $2}' `
475
     
475
     
476
#   Check availability on P file - only for first vector component
476
#   Check availability on P file - only for first vector component
477
    foreach var ( `${LAGRANTO}/goodies/getvars ${charp}$datfiles[1]` )
477
    foreach var ( `${LAGRANTO}/goodies/getvars ${charp}$datfiles[1]` )
478
       if ( "${var}" == "${tvar0}" ) then
478
       if ( "${var}" == "${tvar0}" ) then
479
          set tcompfl=0
479
          set tcompfl=0
480
              set tprefix="P"
480
              set tprefix="P"
481
       endif
481
       endif
482
    end
482
    end
483
 
483
 
484
#   Check availability on S file 
484
#   Check availability on S file 
485
    if ( ${sfiles} == 1 ) then
485
    if ( ${sfiles} == 1 ) then
486
       foreach var ( `${LAGRANTO}/goodies/getvars ${chars}$datfiles[1]` )
486
       foreach var ( `${LAGRANTO}/goodies/getvars ${chars}$datfiles[1]` )
487
         if ( "${var}" == "${tvar0}" ) then
487
         if ( "${var}" == "${tvar0}" ) then
488
            set tcompfl=0
488
            set tcompfl=0
489
                set tprefix="S"
489
                set tprefix="S"
490
         endif
490
         endif
491
       end
491
       end
492
    endif
492
    endif
493
 
493
 
494
#   Write the temporary <tracevars> file
494
#   Write the temporary <tracevars> file
495
    echo "${tvar} ${tscale} ${tcompfl} ${tprefix}" >! ${tvfile}
495
    echo "${tvar} ${tscale} ${tcompfl} ${tprefix}" >! ${tvfile}
496
    echo "Temporary tracervar file <${tvfile}> created"
496
    echo "Temporary tracervar file <${tvfile}> created"
497
    echo
497
    echo
498
 
498
 
499
endif
499
endif
500
 
500
 
501
# Check if tracevars-file exists
501
# Check if tracevars-file exists
502
if ( ! -f $tvfile ) then
502
if ( ! -f $tvfile ) then
503
  echo  " ERROR:  file $tvfile was not found ***"
503
  echo  " ERROR:  file $tvfile was not found ***"
504
  exit 1
504
  exit 1
505
endif
505
endif
506
 
506
 
507
# check if the variables contained in the tracevars-file are available in the
507
# check if the variables contained in the tracevars-file are available in the
508
# data file and check also if there are no empty lines in the tracevars-file
508
# data file and check also if there are no empty lines in the tracevars-file
509
 
509
 
510
set nlines = `cat $tvfile | wc -l`
510
set nlines = `cat $tvfile | wc -l`
511
set vars   = `cat $tvfile | awk '{print $1}'`
511
set vars   = `cat $tvfile | awk '{print $1}'`
512
set nvars  = `echo $vars | wc -w`
512
set nvars  = `echo $vars | wc -w`
513
if ( $nlines != $nvars ) then
513
if ( $nlines != $nvars ) then
514
  echo " ERROR: tracevars-files must not contain empty lines ***"
514
  echo " ERROR: tracevars-files must not contain empty lines ***"
515
  exit 1
515
  exit 1
516
endif
516
endif
517
set calf=`cat $tvfile | awk '{print $3}'`
517
set calf=`cat $tvfile | awk '{print $3}'`
518
set tfil=`cat $tvfile | awk '{print $4}'`
518
set tfil=`cat $tvfile | awk '{print $4}'`
519
 
519
 
520
# Write some status information
520
# Write some status information
521
cat ${tvfile}
521
cat ${tvfile}
522
echo
522
echo
523
echo "# Number of tracing variables : ${nlines}"
523
echo "# Number of tracing variables : ${nlines}"
524
echo "Fields are read from following files : ${tfil}"
524
echo "Fields are read from following files : ${tfil}"
525
 
525
 
526
# Loop over all variables - check availability
526
# Loop over all variables - check availability
527
foreach v ( $vars )
527
foreach v ( $vars )
528
  if ( $calf[1] == 0 ) then
528
  if ( $calf[1] == 0 ) then
529
    set v0 = `echo $v | awk 'BEGIN {FS = ":"}; {print $1}'`
529
    set v0 = `echo $v | awk 'BEGIN {FS = ":"}; {print $1}'`
530
    set flag=`${LAGRANTO}/goodies/getvars $tfil[1]$datfiles[1] | grep " $v0 " | wc -l`
530
    set flag=`${LAGRANTO}/goodies/getvars $tfil[1]$datfiles[1] | grep " $v0 " | wc -l`
531
    set iscomment=`echo $v0 | cut -c 1` 
531
    set iscomment=`echo $v0 | cut -c 1` 
532
    if ( "${iscomment}" != "#" ) then 
532
    if ( "${iscomment}" != "#" ) then 
533
         if ( $flag == 0 ) then
533
         if ( $flag == 0 ) then
534
           echo " ERROR: variable $v listed in $tvfile is not on the $tfil[1]-files ***"
534
           echo " ERROR: variable $v listed in $tvfile is not on the $tfil[1]-files ***"
535
           exit 1
535
           exit 1
536
         endif
536
         endif
537
    endif
537
    endif
538
  endif
538
  endif
539
  shift calf
539
  shift calf
540
  shift tfil
540
  shift tfil
541
end
541
end
542
set ntrace=${nlines} 
542
set ntrace=${nlines} 
543
 
543
 
544
# ---------------------------------------------------------------------
544
# ---------------------------------------------------------------------
545
# Prepare input file for trace and run it
545
# Prepare input file for trace and run it
546
# ---------------------------------------------------------------------
546
# ---------------------------------------------------------------------
547
 
547
 
548
# Set times relative to the reference date
548
# Set times relative to the reference date
549
if ( "${changet}" == "true" ) then
549
if ( "${changet}" == "true" ) then
550
  echo
550
  echo
551
  echo '---- CHANGE TIMES ON DATA FILES  ------------------------'
551
  echo '---- CHANGE TIMES ON DATA FILES  ------------------------'
552
  echo   
552
  echo   
553
  foreach i ( $datfiles )
553
  foreach i ( $datfiles )
554
    ${LAGRANTO}/goodies/changet.sh ${refdate} ${charp}${i}
554
    ${LAGRANTO}/goodies/changet.sh ${refdate} ${charp}${i}
555
  end
555
  end
556
  if ( ${sfiles} == 1 ) then
556
  if ( ${sfiles} == 1 ) then
557
    foreach i ( $datfiles )
557
    foreach i ( $datfiles )
558
      ${LAGRANTO}/goodies/changet.sh ${refdate} ${chars}${i}
558
      ${LAGRANTO}/goodies/changet.sh ${refdate} ${chars}${i}
559
    end
559
    end
560
  endif
560
  endif
561
endif
561
endif
562
 
562
 
563
# ---------------------------------------------------------------------
563
# ---------------------------------------------------------------------
564
# Prepare input file for trace and run it
564
# Prepare input file for trace and run it
565
# ---------------------------------------------------------------------
565
# ---------------------------------------------------------------------
566
 
566
 
567
# Write parameter file
567
# Write parameter file
568
\rm -f ${parfile}
568
\rm -f ${parfile}
569
touch ${parfile}
569
touch ${parfile}
570
 
570
 
571
echo $inpfile                                              >> $parfile
571
echo $inpfile                                              >> $parfile
572
echo $outfile                                              >> $parfile    
572
echo $outfile                                              >> $parfile    
573
echo $startdate                                            >> $parfile
573
echo $startdate                                            >> $parfile
574
echo $enddate                                              >> $parfile
574
echo $enddate                                              >> $parfile
575
echo $idir                                                 >> $parfile
575
echo $idir                                                 >> $parfile
576
echo $numfiles                                             >> $parfile
576
echo $numfiles                                             >> $parfile
577
foreach i ( $datfiles )
577
foreach i ( $datfiles )
578
  echo $i                                                  >> $parfile
578
  echo $i                                                  >> $parfile
579
end
579
end
580
echo $timeinc                                              >> $parfile
580
echo $timeinc                                              >> $parfile
581
echo $tstart                                               >> $parfile
581
echo $tstart                                               >> $parfile
582
echo $tend                                                 >> $parfile
582
echo $tend                                                 >> $parfile
583
echo $ntra                                                 >> $parfile
583
echo $ntra                                                 >> $parfile
584
echo $ntim                                                 >> $parfile
584
echo $ntim                                                 >> $parfile
585
echo $ncol                                                 >> $parfile
585
echo $ncol                                                 >> $parfile
586
echo $ntrace                                               >> $parfile
586
echo $ntrace                                               >> $parfile
587
cat ${tvfile}                                              >> $parfile
587
cat ${tvfile}                                              >> $parfile
588
${LAGRANTO}/goodies/getvars ${charp}$datfiles[1] | wc -l   >> $parfile
588
${LAGRANTO}/goodies/getvars ${charp}$datfiles[1] | wc -l   >> $parfile
589
${LAGRANTO}/goodies/getvars ${charp}$datfiles[1]           >> $parfile
589
${LAGRANTO}/goodies/getvars ${charp}$datfiles[1]           >> $parfile
590
if ( $sfiles == 1 ) then
590
if ( $sfiles == 1 ) then
591
  ${LAGRANTO}/goodies/getvars ${chars}$datfiles[1] | wc -l >> $parfile
591
  ${LAGRANTO}/goodies/getvars ${chars}$datfiles[1] | wc -l >> $parfile
592
  ${LAGRANTO}/goodies/getvars ${chars}$datfiles[1]         >> $parfile
592
  ${LAGRANTO}/goodies/getvars ${chars}$datfiles[1]         >> $parfile
593
else
593
else
594
  echo 0                                                   >> $parfile
594
  echo 0                                                   >> $parfile
595
endif
595
endif
596
echo \"${timecheck}\"                                      >> $parfile
596
echo \"${timecheck}\"                                      >> $parfile
597
 
597
 
598
# Finish the preprocessor
598
# Finish the preprocessor
599
echo 
599
echo 
600
echo '       *** END OF PREPROCESSOR TRACE ***              '
600
echo '       *** END OF PREPROCESSOR TRACE ***              '
601
echo '========================================================='
601
echo '========================================================='
602
echo
602
echo
603
 
603
 
604
# Run  trace
604
# Run  trace
605
${prog}
605
${prog}
606
 
606
 
607
if ( "${status}" != "0" ) then
607
if ( "${status}" != "0" ) then
608
  echo "ERROR:  Program <trace> failed"
608
  echo "ERROR:  Program <trace> failed"
609
  exit 1
609
  exit 1
610
endif
610
endif
611
 
611
 
612
# ---------------------------------------------------------------------
612
# ---------------------------------------------------------------------
613
# Final tasks (make clean)
613
# Final tasks (make clean)
614
# ---------------------------------------------------------------------
614
# ---------------------------------------------------------------------
615
 
615
 
616
finish:
616
finish:
617
 
617
 
618
if ( "${noclean}" == "false" ) then
618
if ( "${noclean}" == "false" ) then
619
  \rm -f ${parfile}
619
  \rm -f ${parfile}
620
endif
620
endif
621
 
621
 
622
exit 0 
622
exit 0 
623
 
623