Subversion Repositories lagranto.um

Rev

Rev 5 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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