Subversion Repositories lagranto.um

Rev

Rev 3 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 michaesp 1
      PROGRAM trace
2
 
3
C     ********************************************************************
4
C     *                                                                  *
5
C     * Trace fields along trajectories                                  *
6
C     *                                                                  *
7
C     * Heini Wernli       first version:       April 1993               *
8
C     * Michael Sprenger   major upgrade:       2008-2009                *
9
C     *                                                                  *
10
C     ********************************************************************
11
 
12
      implicit none
13
 
14
c     --------------------------------------------------------------------
15
c     Declaration of parameters
16
c     --------------------------------------------------------------------
17
 
18
c     Maximum number of levels for input files
19
      integer   nlevmax
20
      parameter (nlevmax=100)
21
 
22
c     Maximum number of input files (dates, length of trajectories)
23
      integer   ndatmax
24
      parameter (ndatmax=500)
25
 
26
c     Numerical epsilon (for float comparison)
27
      real      eps
28
      parameter (eps=0.001)
29
 
30
c     Conversion factors
31
      real      pi180                                   ! deg -> rad
32
      parameter (pi180=3.14159/180.)
33
      real      deg2km                                  ! deg -> km (at equator)
34
      parameter (deg2km=111.)
35
 
36
c     Prefix for primary and secondary fields
37
      character charp
38
      character chars
39
      parameter (charp='P')
40
      parameter (chars='S')
41
 
42
c     --------------------------------------------------------------------
43
c     Declaration of variables
44
c     --------------------------------------------------------------------
45
 
46
c     Input and output format for trajectories (see iotra.f)
47
      integer   inpmode
48
      integer   outmode
49
 
50
c     Input parameters
51
      character*80                           inpfile         ! Input trajectory file
52
      character*80                           outfile         ! Output trajectory file
53
      integer                                ntra            ! Number of trajectories
54
      integer                                ncol            ! Number of columns (including time, lon, lat, p)
55
      integer                                ntim            ! Number of times per trajectory
56
      integer                                ntrace0         ! Number of trace variables
57
      character*80                           tvar0(200)      ! Tracing variable (with mode specification)
58
      character*80                           tvar(200)       ! Tracing variable name (only the variable)
59
      character*1                            tfil(200)       ! Filename prefix 
60
      real                                   fac(200)        ! Scaling factor 
61
      real                                   shift_val(200)  ! Shift in space and time relative to trajectory position
62
      character*80                           shift_dir(200)  ! Direction of shift
63
      integer                                compfl(200)     ! Computation flag (1=compute)
64
      integer                                numdat          ! Number of input files
5 michaesp 65
      character*13                           dat(ndatmax)    ! Dates of input files
3 michaesp 66
      real                                   timeinc         ! Time increment between input files
67
      real                                   tst             ! Time shift of start relative to first data file
68
      real                                   ten             ! Time shift of end relatiev to first data file  
69
      character*20                           startdate       ! First time/date on trajectory
70
      character*20                           enddate         ! Last time/date on trajectory
71
      integer                                ntrace1         ! Count trace and additional variables
72
      character*80                           timecheck       ! Either 'yes' or 'no'
73
 
74
c     Trajectories
75
      real,allocatable, dimension (:,:,:) :: trainp          ! Input trajectories (ntra,ntim,ncol)
76
      real,allocatable, dimension (:,:,:) :: traint          ! Internal trajectories (ntra,ntim,ncol+ntrace1)
77
      real,allocatable, dimension (:,:,:) :: traout          ! Output trajectories (ntra,ntim,ncol+ntrace0)
78
      integer                                reftime(6)      ! Reference date
79
      character*80                           varsinp(100)    ! Field names for input trajectory
80
      character*80                           varsint(100)    ! Field names for internal trajectory
81
      character*80                           varsout(100)    ! Field names for output trajectory
82
      integer                                fid,fod         ! File identifier for inp and out trajectories
83
      real                                   x0,y0,p0        ! Position of air parcel (physical space)
84
      real                                   reltpos0        ! Relative time of air parcel
85
      real                                   xind,yind,pind  ! Position of air parcel (grid space)
86
      integer                                fbflag          ! Flag for forward (1) or backward (-1) trajectories
87
      integer                                fok(100)        ! Flag whether field is ready
88
 
89
c     Meteorological fields
90
      real,allocatable, dimension (:)     :: spt0,spt1       ! Surface pressure
91
      real,allocatable, dimension (:)     :: p3t0,p3t1       ! 3d-pressure 
92
      real,allocatable, dimension (:)     :: f3t0,f3t1       ! 3d field for tracing 
93
      character*80                           svars(100)      ! List of variables on S file
94
      character*80                           pvars(100)      ! List of variables on P file
95
      integer                                n_svars         ! Number of variables on S file
96
      integer                                n_pvars         ! Number of variables on P file
97
 
98
c     Grid description
99
      real                                   pollon,pollat   ! Longitude/latitude of pole
100
      real                                   ak(100)         ! Vertical layers and levels
101
      real                                   bk(100) 
102
      real                                   xmin,xmax       ! Zonal grid extension
103
      real                                   ymin,ymax       ! Meridional grid extension
104
      integer                                nx,ny,nz        ! Grid dimensions
105
      real                                   dx,dy           ! Horizontal grid resolution
106
      integer                                hem             ! Flag for hemispheric domain
107
      integer                                per             ! Flag for periodic domain
108
      real                                   stagz           ! Vertical staggering
109
      real                                   mdv             ! Missing data value
110
 
111
c     Auxiliary variables
112
      integer                                i,j,k,l,n
113
      real                                   rd
114
      character*80                           filename,varname
115
      real                                   time0,time1,reltpos
116
      integer                                itime0,itime1
117
      integer                                stat
118
      real                                   tstart
119
      integer                                iloaded0,iloaded1
120
      real                                   f0
121
      real                                   frac
122
      real                                   tload,tfrac
123
      integer                                isok
124
      character                              ch
125
      integer                                ind
126
      integer                                ind1,ind2,ind3,ind4,ind5
127
      integer                                ind6,ind7,ind8,ind9,ind0
128
      integer                                noutside
129
      real                                   delta
130
      integer                                itrace0
131
      character*80                           string
132
      real                                   lon,lat,rlon,rlat
133
 
134
c     Externals 
135
      real                                   int_index4
136
      external                               int_index4
137
 
138
      real                                   lmtolms 
139
      real                                   phtophs    
140
      real                                   lmstolm
141
      real                                   phstoph        
142
      external                               lmtolms,phtophs
143
      external                               lmstolm,phstoph
144
 
145
c     --------------------------------------------------------------------
146
c     Start of program, Read parameters, get grid parameters
147
c     --------------------------------------------------------------------
148
 
149
c     Write start message
150
      print*,'========================================================='
151
      print*,'              *** START OF PROGRAM TRACE ***'
152
      print*
153
 
154
c     Read parameters
155
      open(10,file='trace.param')
156
       read(10,*) inpfile
157
       read(10,*) outfile
158
       read(10,*) startdate
159
       read(10,*) enddate 
160
       read(10,*) fbflag
161
       read(10,*) numdat
162
       if ( fbflag.eq.1) then
163
          do i=1,numdat
5 michaesp 164
             read(10,'(a13)') dat(i)
3 michaesp 165
          enddo
166
       else
167
          do i=numdat,1,-1
5 michaesp 168
             read(10,'(a13)') dat(i)
3 michaesp 169
          enddo
170
       endif
171
       read(10,*) timeinc
172
       read(10,*) tst
173
       read(10,*) ten
174
       read(10,*) ntra
175
       read(10,*) ntim
176
       read(10,*) ncol
177
       read(10,*) ntrace0
178
       do i=1,ntrace0
179
          read(10,*) tvar(i), fac(i), compfl(i), tfil(i)
180
       enddo
181
       read(10,*) n_pvars
182
       do i=1,n_pvars
183
          read(10,*) pvars(i)
184
       enddo
185
       read(10,*) n_svars
186
       do i=1,n_svars
187
          read(10,*) svars(i)
188
       enddo
189
       read(10,*) timecheck
190
      close(10)
191
 
192
c     Remove commented tracing fields
193
      itrace0 = 1
194
      do while ( itrace0.le.ntrace0) 
195
         string = tvar(itrace0)
196
         if ( string(1:1).eq.'#' ) then
197
            do i=itrace0,ntrace0-1
198
               tvar(i)   = tvar(i+1)
199
               fac(i)    = fac(i+1)
200
               compfl(i) = compfl(i+1)
201
               tfil(i)   = tfil(i+1)
202
            enddo
203
            ntrace0 = ntrace0 - 1
204
         else
205
            itrace0 = itrace0 + 1
206
         endif
207
      enddo
208
 
209
c     Save the tracing variabel (including all mode specifications)
210
      do i=1,ntrace0
211
         tvar0(i) = tvar(i)
212
      enddo
213
 
214
c     Set the formats of the input and output files
215
      call mode_tra(inpmode,inpfile)
216
      if (inpmode.eq.-1) inpmode=1
217
      call mode_tra(outmode,outfile)
218
      if (outmode.eq.-1) outmode=1
219
 
220
C     Convert time shifts <tst,ten> from <hh.mm> into fractional time
221
      call hhmm2frac(tst,frac)
222
      tst = frac
223
      call hhmm2frac(ten,frac)
224
      ten = frac
225
 
226
c     Set the time for the first data file (depending on forward/backward mode)
227
      if (fbflag.eq.1) then
228
        tstart = -tst
229
      else
230
        tstart = tst
231
      endif
232
 
233
c     Read the constant grid parameters (nx,ny,nz,xmin,xmax,ymin,ymax,pollon,pollat)
234
c     The negative <-fid> of the file identifier is used as a flag for parameter retrieval  
235
      filename = charp//dat(1)
236
      varname  = 'U'
237
      call input_open (fid,filename)
238
      call input_grid (-fid,varname,xmin,xmax,ymin,ymax,dx,dy,nx,ny,
239
     >                 tstart,pollon,pollat,rd,rd,nz,rd,rd,rd,timecheck)
240
      call input_close(fid)
241
 
242
C     Allocate memory for some meteorological arrays
243
      allocate(spt0(nx*ny),stat=stat)
244
      if (stat.ne.0) print*,'*** error allocating array spt0 ***'   ! Surface pressure
245
      allocate(spt1(nx*ny),stat=stat)
246
      if (stat.ne.0) print*,'*** error allocating array spt1 ***'
247
      allocate(p3t0(nx*ny*nz),stat=stat)
248
      if (stat.ne.0) print*,'*** error allocating array p3t0 ***'   ! Pressure
249
      allocate(p3t1(nx*ny*nz),stat=stat)
250
      if (stat.ne.0) print*,'*** error allocating array p3t1 ***'
251
      allocate(f3t0(nx*ny*nz),stat=stat)
252
      if (stat.ne.0) print*,'*** error allocating array p3t0 ***'   ! Tracing field
253
      allocate(f3t1(nx*ny*nz),stat=stat)
254
      if (stat.ne.0) print*,'*** error allocating array p3t1 ***'
255
 
256
C     Get memory for trajectory arrays
257
      allocate(trainp(ntra,ntim,ncol),stat=stat)
258
      if (stat.ne.0) print*,'*** error allocating array tra      ***' 
259
 
260
c     Set the flags for periodic domains
261
      if ( abs(xmax-xmin-360.).lt.eps ) then
262
         per = 1
263
      elseif ( abs(xmax-xmin-360.+dx).lt.eps ) then
264
         per = 2
265
      else
266
         per = 0
267
      endif
268
 
269
C     Set logical flag for periodic data set (hemispheric or not)
270
      if (per.eq.0.) then
271
         delta=xmax-xmin-360.
272
         if (abs(delta+dx).lt.eps) then               ! Program aborts: arrays must be closed
273
            print*,' ERROR: arrays must be closed... Stop'
274
        else if (abs(delta).lt.eps) then              ! Periodic and hemispheric
275
           hem=1
276
           per=360.
277
        endif
278
      else                                            ! Periodic and hemispheric
279
         hem=1
280
      endif
281
 
282
c     Write some status information
283
      print*,'---- INPUT PARAMETERS -----------------------------------'
284
      print*
285
      print*,'  Input trajectory file  : ',trim(inpfile)
286
      print*,'  Output trajectory file : ',trim(outfile)
287
      print*,'  Format of input file   : ',inpmode
288
      print*,'  Format of output file  : ',outmode
289
      print*,'  Forward/backward       : ',fbflag
290
      print*,'  #tra                   : ',ntra
291
      print*,'  #col                   : ',ncol
292
      print*,'  #tim                   : ',ntim
293
      print*,'  No time check          : ',trim(timecheck)
294
      do i=1,ntrace0
295
         if (compfl(i).eq.0) then
296
            print*,'  Tracing field          : ',
297
     >                 trim(tvar(i)), fac(i), ' 0 ', tfil(i)
298
         else
299
            print*,'  Tracing field          : ',
300
     >                trim(tvar(i)), fac(i), '  1 ', tfil(i)
301
         endif
302
      enddo
303
      print*
304
      print*,'---- INPUT DATA FILES -----------------------------------'
305
      print*
306
      call frac2hhmm(tstart,tload)
307
      print*,'  Time of 1st data file  : ',tload
308
      print*,'  #input files           : ',numdat
309
      print*,'  time increment         : ',timeinc
310
      call frac2hhmm(tst,tload)
311
      print*,'  Shift of start         : ',tload
312
      call frac2hhmm(ten,tload)
313
      print*,'  Shift of end           : ',tload
314
      print*,'  First/last input file  : ',trim(dat(1)),
315
     >                                     ' ... ',
316
     >                                     trim(dat(numdat))
317
      print*,'  Primary variables      : ',trim(pvars(1))
318
      do i=2,n_pvars
319
         print*,'                         : ',trim(pvars(i))
320
      enddo
321
      if ( n_svars.ge.1 ) then
322
         print*,'  Secondary variables    : ',trim(svars(1))
323
         do i=2,n_svars
324
            print*,'                         : ',trim(svars(i))
325
         enddo
326
      endif
327
      print*
328
      print*,'---- CONSTANT GRID PARAMETERS ---------------------------'
329
      print*
330
      print*,'  xmin,xmax     : ',xmin,xmax
331
      print*,'  ymin,ymax     : ',ymin,ymax
332
      print*,'  dx,dy         : ',dx,dy
333
      print*,'  pollon,pollat : ',pollon,pollat
334
      print*,'  nx,ny,nz      : ',nx,ny,nz
335
      print*,'  per, hem      : ',per,hem
336
      print*
337
 
338
c     --------------------------------------------------------------------
339
c     Load the input trajectories
340
c     --------------------------------------------------------------------
341
 
342
c     Read the input trajectory file
343
      call ropen_tra(fid,inpfile,ntra,ntim,ncol,reftime,varsinp,inpmode)
344
      call read_tra (fid,trainp,ntra,ntim,ncol,inpmode)
345
      call close_tra(fid,inpmode)
346
 
347
c     Coordinate rotation
348
      do i=1,ntra
349
         do j=1,ntim
350
 
351
            lon = trainp(i,j,2)
352
            lat = trainp(i,j,3)
353
 
354
            if ( abs(pollat-90.).gt.eps) then
355
               rlon = lmtolms(lat,lon,pollat,pollon)
356
               rlat = phtophs(lat,lon,pollat,pollon)
357
            else
358
               rlon = lon
359
               rlat = lat
360
            endif
361
 
362
            trainp(i,j,2) = rlon
363
            trainp(i,j,3) = rlat
364
 
365
         enddo
366
      enddo
367
 
368
 
369
c     Check that first four columns correspond to time,lon,lat,p
370
      if ( (varsinp(1).ne.'time' ).or.
371
     >     (varsinp(2).ne.'xpos' ).and.(varsinp(2).ne.'lon' ).or.
372
     >     (varsinp(3).ne.'ypos' ).and.(varsinp(3).ne.'lat' ).or.
373
     >     (varsinp(4).ne.'ppos' ).and.(varsinp(4).ne.'p'   ) )
374
     >then
375
         print*,' ERROR: problem with input trajectories ...'
376
         stop
377
      endif
378
      varsinp(1) = 'time'
379
      varsinp(2) = 'lon'
380
      varsinp(3) = 'lat'
381
      varsinp(4) = 'p'
382
 
383
c     Write some status information of the input trajectories
384
      print*,'---- INPUT TRAJECTORIES ---------------------------------'
385
      print*
386
      print*,' Start date             : ',trim(startdate)
387
      print*,' End date               : ',trim(enddate)
388
      print*,' Reference time (year)  : ',reftime(1)
389
      print*,'                (month) : ',reftime(2)
390
      print*,'                (day)   : ',reftime(3)
391
      print*,'                (hour)  : ',reftime(4)
392
      print*,'                (min)   : ',reftime(5)
393
      print*,' Time range (min)       : ',reftime(6)
394
      do i=1,ncol
395
         print*,' Var                    :',i,trim(varsinp(i))
396
      enddo
397
      print*
398
 
399
c     --------------------------------------------------------------------
400
c     Check dependencies for trace fields which must be calculated
401
c     --------------------------------------------------------------------
402
 
403
c     Set the counter for extra fields
404
      ntrace1 = ntrace0
405
 
406
c     Loop over all tracing variables
407
      i = 1
408
      do while (i.le.ntrace1)
409
 
410
c        Skip fields which must be available on the input files
411
         if (i.le.ntrace0) then
412
            if (compfl(i).eq.0) goto 100
413
         endif
414
 
415
c        Get the dependencies for potential temperature (TH)
416
         if ( tvar(i).eq.'TH' ) then
417
            varname='P'                                   ! P
418
            call add2list(varname,tvar,ntrace1)
419
            varname='T'                                   ! T
420
            call add2list(varname,tvar,ntrace1)
421
 
422
c        Get the dependencies for potential temperature (TH)
423
         elseif ( tvar(i).eq.'RHO' ) then
424
            varname='P'                                   ! P
425
            call add2list(varname,tvar,ntrace1)
426
            varname='T'                                   ! T
427
            call add2list(varname,tvar,ntrace1)
428
 
429
c        Get the dependencies for relative humidity (RH)
430
         elseif ( tvar(i).eq.'RH' ) then
431
            varname='P'                                   ! P
432
            call add2list(varname,tvar,ntrace1)
433
            varname='T'                                   ! T
434
            call add2list(varname,tvar,ntrace1)
435
            varname='Q'                                   ! Q
436
            call add2list(varname,tvar,ntrace1)
437
 
438
c        Get the dependencies for equivalent potential temperature (THE)
439
         elseif ( tvar(i).eq.'THE' ) then
440
            varname='P'                                   ! P
441
            call add2list(varname,tvar,ntrace1)
442
            varname='T'                                   ! T
443
            call add2list(varname,tvar,ntrace1)
444
            varname='Q'                                   ! Q
445
            call add2list(varname,tvar,ntrace1)
446
 
447
c        Get the dependencies for latent heating rate (LHR)
448
         elseif ( tvar(i).eq.'LHR' ) then
449
            varname='P'                                   ! P
450
            call add2list(varname,tvar,ntrace1)
451
            varname='T'                                   ! T
452
            call add2list(varname,tvar,ntrace1)
453
            varname='Q'                                   ! Q
454
            call add2list(varname,tvar,ntrace1)
455
            varname='OMEGA'                               ! OMEGA
456
            call add2list(varname,tvar,ntrace1)
457
            varname='RH'                                  ! RH
458
            call add2list(varname,tvar,ntrace1)
459
 
460
c        Get the dependencies for wind speed (VEL)
461
         elseif ( tvar(i).eq.'VEL' ) then
462
            varname='U'                                   ! U
463
            call add2list(varname,tvar,ntrace1)
464
            varname='V'                                   ! V
465
            call add2list(varname,tvar,ntrace1)
466
 
467
c        Get the dependencies for wind direction (DIR)
468
         elseif ( tvar(i).eq.'DIR' ) then
469
            varname='U'                                   ! U
470
            call add2list(varname,tvar,ntrace1)
471
            varname='V'                                   ! V
472
            call add2list(varname,tvar,ntrace1)
473
 
474
c        Get the dependencies for du/dx (DUDX)
475
         elseif ( tvar(i).eq.'DUDX' ) then
476
            varname='U:+1DLON'                            ! U:+1DLON
477
            call add2list(varname,tvar,ntrace1)
478
            varname='U:-1DLON'                            ! U:-1DLON
479
            call add2list(varname,tvar,ntrace1)
480
 
481
c        Get the dependencies for dv(dx (DVDX)
482
         elseif ( tvar(i).eq.'DVDX' ) then
483
            varname='V:+1DLON'                            ! V:+1DLON
484
            call add2list(varname,tvar,ntrace1)
485
            varname='V:-1DLON'                            ! V:-1DLON
486
            call add2list(varname,tvar,ntrace1)
487
 
488
c        Get the dependencies for du/dy (DUDY)
489
         elseif ( tvar(i).eq.'DUDY' ) then
490
            varname='U:+1DLAT'                            ! U:+1DLAT
491
            call add2list(varname,tvar,ntrace1)
492
            varname='U:-1DLAT'                            ! U:-1DLAT
493
            call add2list(varname,tvar,ntrace1)
494
 
495
c        Get the dependencies for dv/dy (DVDY)
496
         elseif ( tvar(i).eq.'DVDY' ) then
497
            varname='V:+1DLAT'                            ! V:+1DLAT
498
            call add2list(varname,tvar,ntrace1)
499
            varname='V:-1DLAT'                            ! V:-1DLAT
500
            call add2list(varname,tvar,ntrace1)
501
 
502
c        Get the dependencies for du/dp (DUDP)
503
         elseif ( tvar(i).eq.'DUDP' ) then
504
            varname='U:+1DP'                              ! U:+1DP
505
            call add2list(varname,tvar,ntrace1)
506
            varname='U:-1DP'                              ! U:-1DP
507
            call add2list(varname,tvar,ntrace1)
508
            varname='P:+1DP'                              ! P:+1DP
509
            call add2list(varname,tvar,ntrace1)
510
            varname='P:-1DP'                              ! P:-1DP
511
            call add2list(varname,tvar,ntrace1)
512
 
513
c        Get the dependencies for dv/dp (DVDP)
514
         elseif ( tvar(i).eq.'DVDP' ) then
515
            varname='V:+1DP'                              ! V:+1DP
516
            call add2list(varname,tvar,ntrace1)
517
            varname='V:-1DP'                              ! V:-1DP
518
            call add2list(varname,tvar,ntrace1)
519
            varname='P:+1DP'                              ! P:+1DP
520
            call add2list(varname,tvar,ntrace1)
521
            varname='P:-1DP'                              ! P:-1DP
522
            call add2list(varname,tvar,ntrace1)
523
 
524
c        Get the dependencies for dt/dx (DTDX)
525
         elseif ( tvar(i).eq.'DTDX' ) then
526
            varname='T:+1DLON'                            ! T:+1DLON
527
            call add2list(varname,tvar,ntrace1)
528
            varname='T:-1DLON'                            ! T:-1DLON
529
            call add2list(varname,tvar,ntrace1)
530
 
531
c        Get the dependencies for dth/dy (DTHDY)
532
         elseif ( tvar(i).eq.'DTHDY' ) then
533
            varname='T:+1DLAT'                            ! T:+1DLON
534
            call add2list(varname,tvar,ntrace1)
535
            varname='T:-1DLAT'                            ! T:-1DLON
536
            call add2list(varname,tvar,ntrace1)
537
            varname='P'                                   ! P
538
            call add2list(varname,tvar,ntrace1)
539
 
540
c        Get the dependencies for dth/dx (DTHDX)
541
         elseif ( tvar(i).eq.'DTHDX' ) then
542
            varname='T:+1DLON'                            ! T:+1DLON
543
            call add2list(varname,tvar,ntrace1)
544
            varname='T:-1DLON'                            ! T:-1DLON
545
            call add2list(varname,tvar,ntrace1)
546
            varname='P'                                   ! P
547
            call add2list(varname,tvar,ntrace1)
548
 
549
c        Get the dependencies for dt/dy (DTDY)
550
         elseif ( tvar(i).eq.'DTDY' ) then
551
            varname='T:+1DLAT'                            ! T:+1DLON
552
            call add2list(varname,tvar,ntrace1)
553
            varname='T:-1DLAT'                            ! T:-1DLON
554
            call add2list(varname,tvar,ntrace1)
555
 
556
c        Get the dependencies for dt/dp (DTDP)
557
         elseif ( tvar(i).eq.'DTDP' ) then
558
            varname='T:+1DP'                              ! T:+1DP
559
            call add2list(varname,tvar,ntrace1)
560
            varname='T:-1DP'                              ! T:-1DP
561
            call add2list(varname,tvar,ntrace1)
562
            varname='P:+1DP'                              ! P:+1DP
563
            call add2list(varname,tvar,ntrace1)
564
            varname='P:-1DP'                              ! P:-1DP
565
            call add2list(varname,tvar,ntrace1)
566
 
567
c        Get the dependencies for dth/dp (DTHDP)
568
         elseif ( tvar(i).eq.'DTHDP' ) then
569
            varname='T:+1DP'                              ! T:+1DP
570
            call add2list(varname,tvar,ntrace1)
571
            varname='T:-1DP'                              ! T:-1DP
572
            call add2list(varname,tvar,ntrace1)
573
            varname='T'                                   ! T
574
            call add2list(varname,tvar,ntrace1)
575
            varname='P:+1DP'                              ! P:+1DP
576
            call add2list(varname,tvar,ntrace1)
577
            varname='P:-1DP'                              ! P:-1DP
578
            call add2list(varname,tvar,ntrace1)
579
            varname='P'                                   ! P
580
            call add2list(varname,tvar,ntrace1)
581
 
582
c        Get the dependencies for squared Brunt Vaiäläa frequency (NSQ)
583
         elseif ( tvar(i).eq.'NSQ' ) then
584
            varname='DTHDP'                                ! DTHDP
585
            call add2list(varname,tvar,ntrace1)
586
            varname='TH'                                   ! TH
587
            call add2list(varname,tvar,ntrace1)
588
            varname='RHO'                                  ! RHO
589
            call add2list(varname,tvar,ntrace1)
590
 
591
c        Get the dependencies for relative vorticity (RELVORT)
592
         elseif ( tvar(i).eq.'RELVORT' ) then
593
            varname='U'                                    ! U
594
            call add2list(varname,tvar,ntrace1)
595
            varname='DUDY'                                 ! DUDY
596
            call add2list(varname,tvar,ntrace1)
597
            varname='DVDX'                                 ! DVDX
598
            call add2list(varname,tvar,ntrace1)
599
 
600
c        Get the dependencies for relative vorticity (ABSVORT)
601
         elseif ( tvar(i).eq.'ABSVORT' ) then
602
            varname='U'                                    ! U
603
            call add2list(varname,tvar,ntrace1)
604
            varname='DUDY'                                 ! DUDY
605
            call add2list(varname,tvar,ntrace1)
606
            varname='DVDX'                                 ! DVDX
607
            call add2list(varname,tvar,ntrace1)
608
 
609
c        Get the dependencies for divergence (DIV)
610
         elseif ( tvar(i).eq.'DIV' ) then
611
            varname='V'                                    ! U
612
            call add2list(varname,tvar,ntrace1)
613
            varname='DUDX'                                 ! DUDX
614
            call add2list(varname,tvar,ntrace1)
615
            varname='DVDY'                                 ! DVDY
616
            call add2list(varname,tvar,ntrace1)
617
 
618
c        Get the dependencies for deformation (DEF)
619
         elseif ( tvar(i).eq.'DEF' ) then
620
            call add2list(varname,tvar,ntrace1)
621
            varname='DUDX'                                 ! DUDX
622
            call add2list(varname,tvar,ntrace1)
623
            varname='DVDY'                                 ! DVDY
624
            call add2list(varname,tvar,ntrace1)
625
            varname='DUDY'                                 ! DUDY
626
            call add2list(varname,tvar,ntrace1)
627
            varname='DVDX'                                 ! DVDX
628
            call add2list(varname,tvar,ntrace1)
629
 
630
c        Get the dependencies for potential vorticity (PV)
631
         elseif ( tvar(i).eq.'PV' ) then
632
            varname='ABSVORT'                              ! ABSVORT
633
            call add2list(varname,tvar,ntrace1)
634
            varname='DTHDP'                                ! DTHDP
635
            call add2list(varname,tvar,ntrace1)
636
            varname='DUDP'                                 ! DUDP
637
            call add2list(varname,tvar,ntrace1)
638
            varname='DVDP'                                 ! DVDP
639
            call add2list(varname,tvar,ntrace1)
640
            varname='DTHDX'                                ! DTHDX
641
            call add2list(varname,tvar,ntrace1)
642
            varname='DTHDY'                                ! DTHDY
643
            call add2list(varname,tvar,ntrace1)
644
 
645
c        Get the dependencies for Richardson number (RI)
646
         elseif ( tvar(i).eq.'RI' ) then
647
            varname='DUDP'                                 ! DUDP
648
            call add2list(varname,tvar,ntrace1)
649
            varname='DVDP'                                 ! DVDP
650
            call add2list(varname,tvar,ntrace1)
651
            varname='NSQ'                                  ! NSQ
652
            call add2list(varname,tvar,ntrace1)
653
            varname='RHO'                                  ! RHO
654
            call add2list(varname,tvar,ntrace1)
655
 
656
c        Get the dependencies for Ellrod&Knapp's turbulence index (TI)
657
         elseif ( tvar(i).eq.'TI' ) then
658
            varname='DEF'                                  ! DEF
659
            call add2list(varname,tvar,ntrace1)       
660
            varname='DUDP'                                 ! DUDP
661
            call add2list(varname,tvar,ntrace1)       
662
            varname='DVDP'                                 ! DVDP
663
            call add2list(varname,tvar,ntrace1)       
664
            varname='RHO'                                  ! RHO
665
            call add2list(varname,tvar,ntrace1)       
666
 
667
         endif
668
 
669
c        Exit point for handling additional fields
670
 100     continue
671
         i = i + 1
672
 
673
      enddo
674
 
675
c     Save the full variable name (including shift specification)
676
      do i=1,ncol
677
         varsint(i)      = varsinp(i)
678
      enddo
679
      do i=1,ntrace1
680
         varsint(i+ncol) = tvar(i)
681
      enddo
682
 
683
c     Split the variable name and set flags
684
      do i=1,ntrace1
685
 
686
c        Set the scaling factor
687
         if ( i.gt.ntrace0 ) fac(i) = 1.
688
 
689
c        Set the base variable name, the shift and the direction
690
         call splitvar(tvar(i),shift_val(i),shift_dir(i) )
691
 
692
c        Set the prefix of the file name
693
         if ( ( compfl(i).eq.0 ).or.(i.gt.ntrace0) ) then
694
            tfil(i)=' '
695
            do j=1,n_pvars
696
               if ( tvar(i).eq.pvars(j) ) tfil(i)=charp
697
            enddo
698
            do j=1,n_svars
699
               if ( tvar(i).eq.svars(j) ) tfil(i)=chars
700
            enddo
701
         else
702
            tfil(i) = '*'
703
         endif
704
 
705
c        Set the computational flag
706
         if ( (tvar(i).eq.'P'   ).or.
707
     >        (tvar(i).eq.'PLAY').or.
708
     >        (tvar(i).eq.'PLEV') )
709
     >   then    
710
            compfl(i) = 0
711
            tfil(i)   = charp
712
         elseif ( ( tfil(i).eq.charp ).or.( tfil(i).eq.chars ) ) then
713
            compfl(i) = 0
714
         else
715
            compfl(i) = 1
716
         endif
717
 
718
      enddo
719
 
720
c     Check whether the shift modes are supported
721
      do i=1,ntrace1
722
         if ( ( shift_dir(i).ne.'nil'     ).and.
723
     >        ( shift_dir(i).ne.'DLON'    ).and.
724
     >        ( shift_dir(i).ne.'DLAT'    ).and.
725
     >        ( shift_dir(i).ne.'DP'      ).and.
726
     >        ( shift_dir(i).ne.'HPA'      ).and.
727
     >        ( shift_dir(i).ne.'KM(LON)' ).and.
728
     >        ( shift_dir(i).ne.'KM(LAT)' ).and.
729
     >        ( shift_dir(i).ne.'H'       ).and.
730
     >        ( shift_dir(i).ne.'MIN'     ).and.
731
     >        ( shift_dir(i).ne.'INDP'    ) )
732
     >   then
733
            print*,' ERROR: shift mode ',trim(shift_dir(i)),
734
     >             ' not supported'
735
            stop
736
         endif
737
      enddo
738
 
739
c     Write status information
740
      print*
741
      print*,'---- COMPLETE TABLE FOR TRACING -------------------------'   
742
      print*
743
      do i=1,ntrace1
744
         if ( ( shift_dir(i).ne.'nil' ) ) then
745
            write(*,'(i4,a4,a8,f10.2,a8,3x,a1,i5)') 
746
     >           i,' : ',trim(tvar(i)),shift_val(i),trim(shift_dir(i)),
747
     >           tfil(i),compfl(i)
748
         else
749
            write(*,'(i4,a4,a8,10x,8x,3x,a1,i5)') 
750
     >           i,' : ',trim(tvar(i)),tfil(i),compfl(i)
751
         endif
752
      enddo
753
      if ( i.eq.ntrace0 ) print*
754
 
755
c     --------------------------------------------------------------------
756
c     Prepare the internal and output trajectories
757
c     --------------------------------------------------------------------
758
 
759
c     Allocate memory for internal trajectories
760
      allocate(traint(ntra,ntim,ncol+ntrace1),stat=stat)
761
      if (stat.ne.0) print*,'*** error allocating array traint   ***'
762
 
763
c     Copy input to output trajectory
764
      do i=1,ntra
765
         do j=1,ntim
766
            do k=1,ncol
767
               traint(i,j,k)=trainp(i,j,k)
768
            enddo
769
         enddo
770
      enddo
771
 
772
c     Set the flags for ready fields/colums - at begin only read-in fields are ready
773
      do i=1,ncol
774
         fok(i) = 1
775
      enddo
776
      do i=ncol+1,ntrace1
777
         fok(i) = 0
778
      enddo
779
 
780
c     --------------------------------------------------------------------
781
c     Trace the fields (fields available on input files)
782
c     --------------------------------------------------------------------
783
 
784
      print*
785
      print*,'---- TRACING FROM PRIMARY AND SECONDARY DATA FILES ------'     
786
 
787
c     Loop over all tracing fields
788
      do i=1,ntrace1
789
 
790
C         Skip fields which must be computed (compfl=1), will be handled later
791
          if (compfl(i).ne.0)  goto 110
792
 
793
c         Write some status information
794
          print*
795
          print*,' Now tracing             : ',
796
     >         trim(tvar(i)),shift_val(i),trim(shift_dir(i)),
797
     >         compfl(i),' ',trim(tfil(i))
798
 
799
c         Set the flag for ready field/column
800
          fok(ncol+i) = 1
801
 
802
c         Reset flags for load manager
803
          iloaded0 = -1
804
          iloaded1 = -1
805
 
806
c         Reset the counter for fields outside domain
807
          noutside = 0
808
 
809
c         Loop over all times
810
          do j=1,ntim
811
 
812
c            Convert trajectory time from hh.mm to fractional time
813
             call hhmm2frac(trainp(1,j,1),tfrac)
814
 
815
c            Shift time if requested
816
             if ( shift_dir(i).eq.'H' ) then
817
                tfrac = tfrac + shift_val(i)
818
             elseif ( shift_dir(i).eq.'MIN' ) then
819
                tfrac = tfrac + shift_val(i)/60.
820
             endif
821
 
822
c            Get the times which are needed
823
             itime0   = int(abs(tfrac-tstart)/timeinc) + 1
824
             time0    = tstart + fbflag * real(itime0-1) * timeinc
825
             itime1   = itime0 + 1
826
             time1    = time0 + fbflag * timeinc
827
             if ( itime1.gt.numdat ) then
828
                itime1 = itime0
829
                time1  = time0
830
             endif
831
 
832
c            Load manager: Check whether itime0 can be copied from itime1
833
             if ( itime0.eq.iloaded1 ) then
834
                f3t0     = f3t1
835
                p3t0     = p3t1
836
                spt0     = spt1
837
                iloaded0 = itime0
838
             endif
839
 
840
c            Load manager: Check whether itime1 can be copied from itime0
841
             if ( itime1.eq.iloaded0 ) then
842
                f3t1     = f3t0
843
                p3t1     = p3t0
844
                spt1     = spt0
845
                iloaded1 = itime1
846
             endif
847
 
848
c            Load manager:  Load first time (tracing variable and grid)
849
             if ( itime0.ne.iloaded0 ) then
850
 
851
                filename = tfil(i)//dat(itime0)
852
                call frac2hhmm(time0,tload)
853
                varname  = tvar(i) 
854
                write(*,'(a23,a20,a3,a5,f7.2)') 
855
     >               '    ->  loading          : ',
856
     >               trim(filename),'  ',trim(varname),tload
857
                call input_open (fid,filename)                
858
                call input_wind 
859
     >               (fid,varname,f3t0,tload,stagz,mdv,
860
     >               xmin,xmax,ymin,ymax,dx,dy,nx,ny,nz,timecheck)     
861
                call input_grid      
862
     >               (fid,varname,xmin,xmax,ymin,ymax,dx,dy,nx,ny,
863
     >                tload,pollon,pollat,p3t0,spt0,nz,ak,bk,stagz,
864
     >                timecheck)
865
                call input_close(fid)
866
 
867
                iloaded0 = itime0
868
 
869
             endif
870
 
871
c            Load manager: Load second time (tracing variable and grid)
872
             if ( itime1.ne.iloaded1 ) then
873
 
874
                filename = tfil(i)//dat(itime1)
875
                call frac2hhmm(time1,tload)
876
                varname  = tvar(i) 
877
                write(*,'(a23,a20,a3,a5,f7.2)') 
878
     >               '    ->  loading          : ',
879
     >               trim(filename),'  ',trim(varname),tload
880
                call input_open (fid,filename)
881
                call input_wind 
882
     >               (fid,varname,f3t1,tload,stagz,mdv,
883
     >               xmin,xmax,ymin,ymax,dx,dy,nx,ny,nz,timecheck)      
884
                call input_grid      
885
     >               (fid,varname,xmin,xmax,ymin,ymax,dx,dy,nx,ny,
886
     >               tload,pollon,pollat,p3t1,spt1,nz,ak,bk,stagz,
887
     >               timecheck)
888
                call input_close(fid)
889
 
890
                iloaded1 = itime1
891
 
892
             endif
893
 
894
c            Loop over all trajectories
895
             do k=1,ntra
896
 
897
c               Set the horizontal position where to interpolate to
898
                x0       = traint(k,j,2)                          ! Longitude
899
                y0       = traint(k,j,3)                          ! Latitude
900
 
901
c               Set the vertical position where to interpolate to
902
                if ( nz.gt.1 ) then
903
                   p0 = traint(k,j,4)                             ! Pressure (3D tracing)
904
                else
905
                   p0 = 1050.                                     ! Lowest level (2D tracing)
906
                endif
907
 
908
c               Set negative pressures to mdv
909
                if (p0.lt.0.) traint(k,j,4) = mdv
910
 
911
c               Set the relative time
912
                call hhmm2frac(traint(k,j,1),tfrac)
913
                reltpos0 = fbflag * (tfrac-time0)/timeinc    
914
 
915
c               Make adjustments depending on the shift flag
916
                if ( shift_dir(i).eq.'DLON' ) then                         ! DLON
917
                   x0 = x0 + shift_val(i)
918
 
919
                elseif  ( shift_dir(i).eq.'DLAT' ) then                    ! DLAT
920
                   y0 = y0 + shift_val(i)
921
 
922
                elseif ( shift_dir(i).eq.'KM(LON)' ) then                  ! KM(LON)
923
                   x0 = x0 + shift_val(i)/deg2km * 1./cos(y0*pi180)
924
 
925
                elseif ( shift_dir(i).eq.'KM(LAT)' ) then                  ! KM(LAT)
926
                   y0 = y0 + shift_val(i)/deg2km 
927
 
928
                elseif ( shift_dir(i).eq.'HPA' ) then                      ! HPA
929
                   p0 = p0 + shift_val(i)
930
 
931
                elseif ( shift_dir(i).eq.'DP' ) then                       ! DP
932
                   call get_index4 (xind,yind,pind,x0,y0,p0,reltpos0,
933
     >                              p3t0,p3t1,spt0,spt1,3,
934
     >                              nx,ny,nz,xmin,ymin,dx,dy,mdv)
935
                   pind = pind - shift_val(i)
936
                   p0   = int_index4(p3t0,p3t1,nx,ny,nz,
937
     >                              xind,yind,pind,reltpos0,mdv)
938
 
939
                elseif ( shift_dir(i).eq.'INDP' ) then         
940
                   p0   = int_index4(p3t0,p3t1,nx,ny,nz,
941
     >                            xind,yind,shift_val(i),reltpos0,mdv)
942
 
943
                endif
944
 
945
c               Handle periodic boundaries in zonal direction
946
                if ( (x0.gt.xmax).and.(per.ne.0) ) x0 = x0 - 360.
947
                if ( (x0.lt.xmin).and.(per.ne.0) ) x0 = x0 + 360.
948
 
949
c               Handle pole problems for hemispheric data (taken from caltra.f)
950
                if ((hem.eq.1).and.(y0.gt.90.)) then
951
                   y0=180.-y0
952
                   x0=x0+per/2.
953
                endif
954
                if ((hem.eq.1).and.(y0.lt.-90.)) then
955
                   y0=-180.-y0
956
                   x0=x0+per/2.
957
                endif
958
                if (y0.gt.89.99) then
959
                   y0=89.99
960
                endif
961
 
962
C               Get the index where to interpolate (x0,y0,p0)
963
                if ( (abs(x0-mdv).gt.eps).and.
964
     >               (abs(x0-mdv).gt.eps) )
965
     >          then           
966
                   call get_index4 (xind,yind,pind,x0,y0,p0,reltpos0,
967
     >                              p3t0,p3t1,spt0,spt1,3,
968
     >                              nx,ny,nz,xmin,ymin,dx,dy,mdv)
969
                else
970
                   xind = mdv
971
                   yind = mdv
972
                   pind = mdv
973
                endif
974
 
975
c               Do the interpolation
976
                if ( (xind.ge.1.).and.(xind.le.real(nx)).and.
977
     >               (yind.ge.1.).and.(yind.le.real(ny)).and.
978
     >               (pind.ge.1.).and.(pind.le.real(nz)) )
979
     >          then           
980
                   f0 = int_index4(f3t0,f3t1,nx,ny,nz,
981
     >                             xind,yind,pind,reltpos0,mdv)
982
                elseif (noutside.lt.10) then
983
                   print*,' ',trim(tvar(i)),' @ ',x0,y0,p0,'outside'
984
                   f0       = mdv
985
                   noutside = noutside + 1
986
                elseif (noutside.eq.10) then
987
                   print*,' ...more than 10 outside...'
988
                   f0       = mdv
989
                   noutside = noutside + 1
990
                else
991
                   f0       = mdv
992
                endif
993
 
994
c               Save the new field
995
                if ( abs(f0-mdv).gt.eps) then
996
                   traint(k,j,ncol+i) = f0
997
                else
998
                   traint(k,j,ncol+i) = mdv
999
                endif
1000
 
1001
             enddo
1002
 
1003
          enddo
1004
 
1005
c         Exit point for loop over all tracing variables
1006
 110      continue
1007
 
1008
       enddo
1009
 
1010
c     --------------------------------------------------------------------
1011
c     Calculate additional fields along the trajectories
1012
c     --------------------------------------------------------------------
1013
 
1014
      print*
1015
      print*,'---- CALCULATE ADDITIONAL FIELDS FROM TRAJECTORY TABLE --'
1016
 
1017
c     Loop over all tracing fields
1018
      do i=ntrace1,1,-1
1019
 
1020
C         Skip fields which must not be computed (compfl=0)
1021
          if (compfl(i).eq.0) goto 120
1022
 
1023
c         Write some status information
1024
          print*
1025
          write(*,'(a10,f10.2,a5,i3,3x,a2)')
1026
     >         trim(tvar(i)),shift_val(i),trim(shift_dir(i)),
1027
     >         compfl(i),trim(tfil(i))
1028
 
1029
c         Loop over trajectories and times
1030
          do j=1,ntra
1031
          do k=1,ntim
1032
 
1033
c            Potential temperature (TH)
1034
             if  ( varsint(i+ncol).eq.'TH' ) then
1035
 
1036
                varname='T'
1037
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1038
                varname='p'
1039
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1040
 
1041
                call calc_TH  (traint(j,k,ncol+i), traint(j,k,ind1), 
1042
     >                                             traint(j,k,ind2) )
1043
 
1044
c            Density (RHO)
1045
             elseif  ( varsint(i+ncol).eq.'RHO' ) then
1046
 
1047
                varname='T'
1048
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1049
                varname='p'
1050
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1051
 
1052
                call calc_RHO (traint(j,k,ncol+i), traint(j,k,ind1), 
1053
     >                                             traint(j,k,ind2) )
1054
 
1055
c            Relative humidity (RH)
1056
             elseif  ( varsint(i+ncol).eq.'RH' ) then
1057
 
1058
                varname='T'
1059
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1060
                varname='p'
1061
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1062
                varname='Q'
1063
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)               
1064
 
1065
                call calc_RH (traint(j,k,ncol+i), traint(j,k,ind1), 
1066
     >                                            traint(j,k,ind2),
1067
     >                                            traint(j,k,ind3) )
1068
 
1069
c            Equivalent potential temperature (THE)
1070
             elseif  ( varsint(i+ncol).eq.'THE' ) then
1071
 
1072
                varname='T'
1073
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1074
                varname='p'
1075
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1076
                varname='Q'
1077
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)                
1078
 
1079
                call calc_THE (traint(j,k,ncol+i), traint(j,k,ind1), 
1080
     >                                             traint(j,k,ind2),
1081
     >                                             traint(j,k,ind3) )
1082
 
1083
c            Latent heating rate (LHR)
1084
             elseif  ( varsint(i+ncol).eq.'LHR' ) then
1085
 
1086
                varname='T'
1087
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1088
                varname='p'
1089
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1090
                varname='Q'
1091
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)                
1092
                varname='OMEGA'
1093
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)                
1094
                varname='RH'
1095
                call list2ind (ind5,varname,varsint,fok,ncol+ntrace1)                
1096
 
1097
                call calc_LHR (traint(j,k,ncol+i), traint(j,k,ind1), 
1098
     >                                             traint(j,k,ind2),
1099
     >                                             traint(j,k,ind3),
1100
     >                                             traint(j,k,ind4),
1101
     >                                             traint(j,k,ind5) )
1102
 
1103
c            Wind speed (VEL)
1104
             elseif  ( varsint(i+ncol).eq.'VEL' ) then
1105
 
1106
                varname='U'
1107
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1108
                varname='V'
1109
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1110
 
1111
                call calc_VEL (traint(j,k,ncol+i), traint(j,k,ind1), 
1112
     >                                             traint(j,k,ind2) )
1113
 
1114
c            Wind direction (DIR)
1115
             elseif  ( varsint(i+ncol).eq.'DIR' ) then
1116
 
1117
                varname='U'
1118
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1119
                varname='V'
1120
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1121
 
1122
                call calc_DIR (traint(j,k,ncol+i), traint(j,k,ind1), 
1123
     >                                             traint(j,k,ind2) )
1124
 
1125
c            Zonal gradient of U (DUDX)
1126
             elseif  ( varsint(i+ncol).eq.'DUDX' ) then
1127
 
1128
                varname='U:+1DLON'
1129
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1130
                varname='U:-1DLON'
1131
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1132
                varname='lat'
1133
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1134
 
1135
                call calc_DUDX (traint(j,k,ncol+i), traint(j,k,ind1), 
1136
     >                                              traint(j,k,ind2),
1137
     >                                              traint(j,k,ind3) )
1138
 
1139
c            Zonal gradient of V (DVDX)
1140
             elseif  ( varsint(i+ncol).eq.'DVDX' ) then
1141
 
1142
                varname='V:+1DLON'
1143
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1144
                varname='V:-1DLON'
1145
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1146
                varname='lat'
1147
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1148
 
1149
                call calc_DVDX (traint(j,k,ncol+i), traint(j,k,ind1), 
1150
     >                                              traint(j,k,ind2),
1151
     >                                              traint(j,k,ind3) )
1152
 
1153
c            Zonal gradient of T (DTDX)
1154
             elseif  ( varsint(i+ncol).eq.'DVDX' ) then
1155
 
1156
                varname='T:+1DLON'
1157
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1158
                varname='T:-1DLON'
1159
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1160
                varname='lat'
1161
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1162
 
1163
                call calc_DTDX (traint(j,k,ncol+i), traint(j,k,ind1), 
1164
     >                                              traint(j,k,ind2),
1165
     >                                              traint(j,k,ind3) )
1166
 
1167
c            Zonal gradient of TH (DTHDX)
1168
             elseif  ( varsint(i+ncol).eq.'DTHDX' ) then
1169
 
1170
                varname='T:+1DLON'
1171
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1172
                varname='T:-1DLON'
1173
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1174
                varname='P'
1175
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1176
                varname='lat'
1177
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1178
 
1179
                call calc_DTHDX (traint(j,k,ncol+i), traint(j,k,ind1), 
1180
     >                                               traint(j,k,ind2),
1181
     >                                               traint(j,k,ind3),
1182
     >                                               traint(j,k,ind4) )
1183
 
1184
c            Meridional gradient of U (DUDY)
1185
             elseif  ( varsint(i+ncol).eq.'DUDY' ) then
1186
 
1187
                varname='U:+1DLAT'
1188
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1189
                varname='U:-1DLAT'
1190
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1191
 
1192
                call calc_DUDY (traint(j,k,ncol+i), traint(j,k,ind1), 
1193
     >                                              traint(j,k,ind2) )
1194
 
1195
c            Meridional gradient of V (DVDY)
1196
             elseif  ( varsint(i+ncol).eq.'DVDY' ) then
1197
 
1198
                varname='V:+1DLAT'
1199
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1200
                varname='V:-1DLAT'
1201
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1202
 
1203
                call calc_DVDY (traint(j,k,ncol+i), traint(j,k,ind1), 
1204
     >                                              traint(j,k,ind2) )
1205
 
1206
c            Meridional gradient of T (DTDY)
1207
             elseif  ( varsint(i+ncol).eq.'DTDY' ) then
1208
 
1209
                varname='T:+1DLAT'
1210
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1211
                varname='T:-1DLAT'
1212
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1213
 
1214
                call calc_DTDY (traint(j,k,ncol+i), traint(j,k,ind1), 
1215
     >                                              traint(j,k,ind2) )
1216
 
1217
c            Meridional gradient of TH (DTHDY)
1218
             elseif  ( varsint(i+ncol).eq.'DTHDY' ) then
1219
 
1220
                varname='T:+1DLAT'
1221
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1222
                varname='T:-1DLAT'
1223
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1224
                varname='P'
1225
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1226
 
1227
                call calc_DTDY (traint(j,k,ncol+i), traint(j,k,ind1), 
1228
     >                                              traint(j,k,ind2),
1229
     >                                              traint(j,k,ind3) )
1230
 
1231
 
1232
c            Vertical wind shear DU/DP (DUDP)
1233
             elseif  ( varsint(i+ncol).eq.'DUDP' ) then
1234
 
1235
                varname='U:+1DP'
1236
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1237
                varname='U:-1DP'
1238
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1239
                varname='P:+1DP'
1240
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1) 
1241
                varname='P:-1DP'
1242
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1243
 
1244
                call calc_DUDP (traint(j,k,ncol+i), traint(j,k,ind1), 
1245
     >                                              traint(j,k,ind2),
1246
     >                                              traint(j,k,ind3),
1247
     >                                              traint(j,k,ind4) )
1248
 
1249
c            Vertical wind shear DV/DP (DVDP)
1250
             elseif  ( varsint(i+ncol).eq.'DVDP' ) then
1251
 
1252
                varname='V:+1DP'
1253
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1254
                varname='V:-1DP'
1255
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1256
                varname='P:+1DP'
1257
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1) 
1258
                varname='P:-1DP'
1259
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1260
 
1261
                call calc_DVDP (traint(j,k,ncol+i), traint(j,k,ind1), 
1262
     >                                              traint(j,k,ind2),
1263
     >                                              traint(j,k,ind3),
1264
     >                                              traint(j,k,ind4) )
1265
 
1266
c            Vertical derivative of T (DTDP)
1267
             elseif  ( varsint(i+ncol).eq.'DTDP' ) then
1268
 
1269
                varname='T:+1DP'
1270
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1271
                varname='T:-1DP'
1272
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1273
                varname='P:+1DP'
1274
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1) 
1275
                varname='P:-1DP'
1276
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1277
 
1278
                call calc_DTDP (traint(j,k,ncol+i), traint(j,k,ind1), 
1279
     >                                              traint(j,k,ind2),
1280
     >                                              traint(j,k,ind3),
1281
     >                                              traint(j,k,ind4) )
1282
 
1283
c            Vertical derivative of TH (DTHDP)
1284
             elseif  ( varsint(i+ncol).eq.'DTHDP' ) then
1285
 
1286
                varname='T:+1DP'
1287
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1288
                varname='T:-1DP'
1289
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1290
                varname='P:+1DP'
1291
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1) 
1292
                varname='P:-1DP'
1293
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1294
                varname='P'
1295
                call list2ind (ind5,varname,varsint,fok,ncol+ntrace1)
1296
                varname='T'
1297
                call list2ind (ind6,varname,varsint,fok,ncol+ntrace1)
1298
 
1299
                call calc_DTHDP (traint(j,k,ncol+i), traint(j,k,ind1), 
1300
     >                                               traint(j,k,ind2),
1301
     >                                               traint(j,k,ind3),
1302
     >                                               traint(j,k,ind4),
1303
     >                                               traint(j,k,ind5),
1304
     >                                               traint(j,k,ind6) )
1305
 
1306
c            Squared Brunt-Vaisäla frequency (NSQ)
1307
             elseif  ( varsint(i+ncol).eq.'NSQ' ) then
1308
 
1309
                varname='DTHDP'
1310
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1311
                varname='TH'
1312
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1313
                varname='RHO'
1314
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1315
 
1316
                call calc_NSQ (traint(j,k,ncol+i), traint(j,k,ind1), 
1317
     >                                             traint(j,k,ind2),
1318
     >                                             traint(j,k,ind3))
1319
 
1320
c            Relative vorticity (RELVORT)
1321
             elseif  ( varsint(i+ncol).eq.'RELVORT' ) then
1322
 
1323
                varname='DUDY'
1324
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1325
                varname='DVDX'
1326
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1327
                varname='U'
1328
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1329
                varname='lat'
1330
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1331
 
1332
                call calc_RELVORT (traint(j,k,ncol+i), traint(j,k,ind1), 
1333
     >                                                 traint(j,k,ind2),
1334
     >                                                 traint(j,k,ind3),
1335
     >                                                 traint(j,k,ind4))
1336
 
1337
c            Absolute vorticity (ABSVORT)
1338
             elseif  ( varsint(i+ncol).eq.'ABSVORT' ) then
1339
 
1340
                varname='DUDY'
1341
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1342
                varname='DVDX'
1343
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1344
                varname='U'
1345
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1346
                varname='lat'
1347
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1348
                varname='lon'
1349
                call list2ind (ind5,varname,varsint,fok,ncol+ntrace1)
1350
 
1351
                call calc_ABSVORT (traint(j,k,ncol+i), traint(j,k,ind1), 
1352
     >                                                 traint(j,k,ind2),
1353
     >                                                 traint(j,k,ind3),
1354
     >                                                 traint(j,k,ind4),
1355
     >                                                 traint(j,k,ind5),
1356
     >                                                 pollon,pollat  )
1357
 
1358
c            Divergence (DIV)
1359
             elseif  ( varsint(i+ncol).eq.'DIV' ) then
1360
 
1361
                varname='DUDX'
1362
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1363
                varname='DVDY'
1364
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1365
                varname='V'
1366
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1367
                varname='lat'
1368
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1369
 
1370
                call calc_DIV (traint(j,k,ncol+i), traint(j,k,ind1), 
1371
     >                                             traint(j,k,ind2),
1372
     >                                             traint(j,k,ind3),
1373
     >                                             traint(j,k,ind4))
1374
 
1375
c            Deformation (DEF)
1376
             elseif  ( varsint(i+ncol).eq.'DEF' ) then
1377
 
1378
                varname='DUDX'
1379
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1380
                varname='DVDX'
1381
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1382
                varname='DUDY'
1383
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1384
                varname='DVDY'
1385
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1386
 
1387
                call calc_DEF (traint(j,k,ncol+i), traint(j,k,ind1), 
1388
     >                                             traint(j,k,ind2),
1389
     >                                             traint(j,k,ind3),
1390
     >                                             traint(j,k,ind4))
1391
 
1392
c            Potential Vorticity (PV)
1393
             elseif  ( varsint(i+ncol).eq.'PV' ) then
1394
 
1395
                varname='ABSVORT'
1396
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1397
                varname='DTHDP'
1398
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1399
                varname='DUDP'
1400
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1401
                varname='DVDP'
1402
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1403
                varname='DTHDX'
1404
                call list2ind (ind5,varname,varsint,fok,ncol+ntrace1)
1405
                varname='DTHDY'
1406
                call list2ind (ind6,varname,varsint,fok,ncol+ntrace1)
1407
 
1408
                call calc_PV (traint(j,k,ncol+i), traint(j,k,ind1), 
1409
     >                                            traint(j,k,ind2),
1410
     >                                            traint(j,k,ind3),
1411
     >                                            traint(j,k,ind4),
1412
     >                                            traint(j,k,ind5),
1413
     >                                            traint(j,k,ind6) )
1414
 
1415
c            Richardson number (RI)
1416
             elseif  ( varsint(i+ncol).eq.'RI' ) then
1417
 
1418
                varname='DUDP'
1419
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1420
                varname='DVDP'
1421
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1422
                varname='NSQ'
1423
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1424
                varname='RHO'
1425
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1426
 
1427
                call calc_RI (traint(j,k,ncol+i), traint(j,k,ind1), 
1428
     >                                            traint(j,k,ind2),
1429
     >                                            traint(j,k,ind3),
1430
     >                                            traint(j,k,ind4) )
1431
 
1432
c            Ellrod and Knapp's turbulence idicator (TI)
1433
             elseif  ( varsint(i+ncol).eq.'TI' ) then
1434
 
1435
                varname='DEF'
1436
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1437
                varname='DUDP'
1438
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1439
                varname='DVDP'
1440
                call list2ind (ind3,varname,varsint,fok,ncol+ntrace1)
1441
                varname='RHO'
1442
                call list2ind (ind4,varname,varsint,fok,ncol+ntrace1)
1443
 
1444
                call calc_TI (traint(j,k,ncol+i), traint(j,k,ind1), 
1445
     >                                            traint(j,k,ind2),
1446
     >                                            traint(j,k,ind3),
1447
     >                                            traint(j,k,ind4) )
1448
 
1449
c            Spherical distance from starting position (DIST0)
1450
             elseif  ( varsint(i+ncol).eq.'DIST0' ) then
1451
 
1452
                varname='lon'
1453
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1454
                varname='lat'
1455
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1456
 
1457
                call calc_DIST0 (traint(j,k,ncol+i), traint(j,k,ind1), 
1458
     >                                               traint(j,k,ind2),
1459
     >                                               traint(j,1,ind1), 
1460
     >                                               traint(j,1,ind2) )
1461
 
1462
c            Spherical distance length of trajectory (DIST)
1463
             elseif  ( varsint(i+ncol).eq.'DIST' ) then
1464
 
1465
                varname='lon'
1466
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1467
                varname='lat'
1468
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1469
 
1470
                if ( k.eq.1 ) then
1471
                   traint(j,k,ncol+i) = 0.
1472
                else
1473
                   call calc_DIST0 (delta, traint(j,k  ,ind1), 
1474
     >                                     traint(j,k  ,ind2),
1475
     >                                     traint(j,k-1,ind1), 
1476
     >                                     traint(j,k-1,ind2) )
1477
                   traint(j,k,ncol+i) = traint(j,k-1,ncol+i) + delta
1478
                endif
1479
 
1480
c            Heading of the trajectory (HEAD)
1481
             elseif  ( varsint(i+ncol).eq.'HEAD' ) then
1482
 
1483
                varname='lon'
1484
                call list2ind (ind1,varname,varsint,fok,ncol+ntrace1) 
1485
                varname='lat'
1486
                call list2ind (ind2,varname,varsint,fok,ncol+ntrace1)
1487
 
1488
                if (k.eq.ntim) then
1489
                   traint(j,k,ncol+i) = mdv
1490
                else
1491
                   call calc_HEAD (traint(j,k,ncol+i), 
1492
     >                                         traint(j,k  ,ind1), 
1493
     >                                         traint(j,k  ,ind2),
1494
     >                                         traint(j,k+1,ind1), 
1495
     >                                         traint(j,k+1,ind2) )
1496
                endif
1497
 
1498
 
1499
c            Invalid tracing variable
1500
             else
1501
 
1502
                print*,' ERROR: invalid tracing variable ',
1503
     >                   trim(varsint(i+ncol))
1504
                stop
1505
 
1506
 
1507
             endif
1508
 
1509
c         End loop over all trajectories and times   
1510
          enddo
1511
          enddo
1512
 
1513
c         Set the flag for a ready field/column
1514
          fok(ncol+i) = 1
1515
 
1516
 
1517
c         Exit point for loop over all tracing fields
1518
 120      continue
1519
 
1520
       enddo
1521
 
1522
c     --------------------------------------------------------------------
1523
c     Write output to output trajectory file
1524
c     --------------------------------------------------------------------
1525
 
1526
c     Write status information
1527
      print*
1528
      print*,'---- WRITE OUTPUT TRAJECTORIES --------------------------'   
1529
      print*
1530
 
1531
c     Allocate memory for internal trajectories
1532
      allocate(traout(ntra,ntim,ncol+ntrace0),stat=stat)
1533
      if (stat.ne.0) print*,'*** error allocating array traout   ***'
1534
 
1535
c     Copy input to output trajectory (apply scaling of output)
1536
      do i=1,ntra
1537
         do j=1,ntim
1538
            do k=1,ncol+ntrace0
1539
               if ( k.le.ncol ) then
1540
                  traout(i,j,k) = traint(i,j,k)
1541
               elseif ( abs(traint(i,j,k)-mdv).gt.eps ) then
1542
                  traout(i,j,k) = fac(k-ncol) * traint(i,j,k)
1543
               else
1544
                  traout(i,j,k) = mdv
1545
               endif
1546
            enddo
1547
         enddo
1548
      enddo
1549
 
1550
c     Set the variable names for output trajectory
1551
      do i=1,ncol+ntrace0
1552
         varsout(i)      = varsint(i)
1553
      enddo  
1554
 
1555
c     Coordinate rotation
1556
      do i=1,ntra
1557
         do j=1,ntim
1558
 
1559
            rlon = traout(i,j,2)
1560
            rlat = traout(i,j,3)
1561
 
1562
            if ( abs(pollat-90.).gt.eps) then
1563
               lon = lmstolm(rlat,rlon,pollat,pollon)
1564
               lat = phstoph(rlat,rlon,pollat,pollon)
1565
            else
1566
               lon = rlon
1567
               lat = rlat
1568
            endif
1569
 
1570
            traout(i,j,2) = lon
1571
            traout(i,j,3) = lat
1572
 
1573
         enddo
1574
      enddo
1575
 
1576
 
1577
c     Write trajectories
1578
      call wopen_tra(fod,outfile,ntra,ntim,ncol+ntrace0,
1579
     >               reftime,varsout,outmode)
1580
      call write_tra(fod,traout ,ntra,ntim,ncol+ntrace0,outmode)
1581
      call close_tra(fod,outmode)
1582
 
1583
c     Write some status information, and end of program message
1584
      print*  
1585
      print*,'---- STATUS INFORMATION --------------------------------'
1586
      print*
1587
      print*,' ok'
1588
      print*
1589
      print*,'              *** END OF PROGRAM TRACE ***'
1590
      print*,'========================================================='
1591
 
1592
 
1593
      end 
1594
 
1595
 
1596
 
1597
c     ******************************************************************
1598
c     * SUBROUTINE SECTION                                             *
1599
c     ******************************************************************
1600
 
1601
c     ------------------------------------------------------------------
1602
c     Add a variable to the list if not yet included in this list
1603
c     ------------------------------------------------------------------
1604
 
1605
      subroutine add2list (varname,list,nlist)
1606
 
1607
      implicit none
1608
 
1609
c     Declaration of subroutine parameters
1610
      character*80    varname
1611
      character*80    list(200)
1612
      integer         nlist
1613
 
1614
c     Auxiliray variables
1615
      integer i,j
1616
      integer isok
1617
 
1618
c     Expand the list, if necessary
1619
      isok = 0
1620
      do i=1,nlist      
1621
         if ( list(i).eq.varname ) isok = 1
1622
      enddo
1623
      if ( isok.eq.0 ) then
1624
         nlist       = nlist + 1
1625
         list(nlist) = varname
1626
      endif
1627
 
1628
c     Check for too large number of fields
1629
      if ( nlist.ge.200) then
1630
         print*,' ERROR: too many additional fields for tracing ...'
1631
         stop
1632
      endif
1633
 
1634
      end
1635
 
1636
 
1637
c     ------------------------------------------------------------------
1638
c     Get the index of a variable in the list
1639
c     ------------------------------------------------------------------
1640
 
1641
      subroutine list2ind (ind,varname,list,fok,nlist)
1642
 
1643
      implicit none
1644
 
1645
c     Declaration of subroutine parameters
1646
      integer         ind
1647
      character*80    varname
1648
      character*80    list(200)
1649
      integer         fok(200)
1650
      integer         nlist
1651
 
1652
c     Auxiliray variables
1653
      integer i,j
1654
      integer isok   
1655
 
1656
c     Get the index - error message if not found
1657
      ind = 0
1658
      do i=1,nlist
1659
         if ( varname.eq.list(i) ) then
1660
            ind = i
1661
            goto 100
1662
         endif
1663
      enddo
1664
 
1665
      if ( ind.eq.0) then
1666
         print*
1667
         print*,' ERROR: cannot find ',trim(varname),' in list ...'
1668
         do i=1,nlist
1669
            print*,i,trim(list(i))
1670
         enddo
1671
         print*
1672
         stop
1673
      endif
1674
 
1675
c     Exit point
1676
 100  continue
1677
 
1678
c     Check whether the field/column is ready
1679
      if ( fok(ind).eq.0 ) then
1680
         print*
1681
         print*,' ERROR: unresolved dependence : ',trim(list(ind))
1682
         print*
1683
         stop
1684
      endif
1685
 
1686
      end
1687
 
1688
 
1689
c     ------------------------------------------------------------------
1690
c     Split the variable name into name, shift and direction 
1691
c     ------------------------------------------------------------------
1692
 
1693
      subroutine splitvar (tvar,shift_val,shift_dir)
1694
 
1695
      implicit none
1696
 
1697
c     Declaration of subroutine parameters
1698
      character*80 tvar
1699
      real         shift_val
1700
      character*80 shift_dir
1701
 
1702
c     Auxiliary variables
1703
      integer      i,j
1704
      integer      icolon,inumber
1705
      character*80 name
1706
      character    ch
1707
 
1708
c     Save variable name
1709
      name = tvar
1710
 
1711
c     Search for colon
1712
      icolon=0
1713
      do i=1,80
1714
         if ( (name(i:i).eq.':').and.(icolon.ne.0) ) goto 100
1715
         if ( (name(i:i).eq.':').and.(icolon.eq.0) ) icolon=i
1716
      enddo
1717
 
1718
c     If there is a colon, split the variable name
1719
      if ( icolon.ne.0 ) then
1720
 
1721
         tvar = name(1:(icolon-1))
1722
 
1723
         do i=icolon+1,80
1724
            ch = name(i:i)
1725
            if ( ( ch.ne.'0' ).and. ( ch.ne.'1' ).and.( ch.ne.'2' ).and.
1726
     >           ( ch.ne.'3' ).and. ( ch.ne.'4' ).and.( ch.ne.'5' ).and.
1727
     >           ( ch.ne.'6' ).and. ( ch.ne.'7' ).and.( ch.ne.'8' ).and.
1728
     >           ( ch.ne.'9' ).and. ( ch.ne.'+' ).and.( ch.ne.'-' ).and.
1729
     >           ( ch.ne.'.' ).and. ( ch.ne.' ' )  )
1730
     >      then
1731
               inumber = i
1732
               exit
1733
            endif
1734
         enddo
1735
 
1736
         read(name( (icolon+1):(inumber-1) ),*) shift_val
1737
 
1738
         shift_dir = name(inumber:80)
1739
 
1740
      else
1741
 
1742
         shift_dir = 'nil'
1743
         shift_val = 0.
1744
 
1745
      endif
1746
 
1747
      return
1748
 
1749
c     Error handling
1750
 100  continue
1751
 
1752
      print*,' ERROR: cannot split variable name ',trim(tvar)
1753
      stop
1754
 
1755
      end
1756
 
1757
 
1758
 
1759
 
1760
 
1761
 
1762
 
1763
 
1764