Subversion Repositories lagranto.um

Rev

Rev 3 | Rev 15 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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