Subversion Repositories lagranto.ecmwf

Rev

Blame | Last modification | View Log | Download | RSS feed

      PROGRAM tracal
      
c     ***********************************************************************
c     * Calculations with trajectories                                      *
c     * Michael Sprenger / Spring, summer 2010                              *
c     ***********************************************************************

      use evaluate

      implicit none

c     ----------------------------------------------------------------------
c     Declaration of variables
c     ----------------------------------------------------------------------

c     Input and output format for trajectories (see iotra.f)
      character*80                           inpfile     ! Input filename
      character*80                           outfile     ! Output filename
      character*80                           expr        ! Expression for calculation

c     Trajectories
      integer                                ntra        ! Number of trajectories
      integer                                ntim        ! Number of times
      integer                                ncol        ! Number of columns
      real,allocatable, dimension (:,:,:) :: trainp      ! Trajectories (ntra,ntim,ncol  )
      real,allocatable, dimension (:,:,:) :: traout      ! Trajectories (ntra,ntim,ncol+1)
      character*80                           vars(100)   ! Variable names
      integer                                refdate(6)  ! Reference date

c     Auxiliary variables
      integer                                inpmode
      integer                                outmode
      integer                                stat
      integer                                fid
      integer                                i,j,k
      character (len=24)                     col,new
      real                                   value
      character                              ch
      integer                                ileft,iright

c     ----------------------------------------------------------------------
c     Do the reformating
c     ----------------------------------------------------------------------

c     Read parameters
      open(10,file='tracal.param')
       read(10,*) inpfile
       read(10,*) outfile
       read(10,*) expr
       read(10,*) ntra,ntim,ncol
      close(10)
      
c         Get the name of the output field
          ileft  = 1
          iright = 0
          do i=1,80
                if ( expr(i:i).eq.'=' ) iright = i
          enddo
          if ( iright.eq.0 ) then
              vars(ncol+1) = 'CALC'
              expr = 'CALC='//trim(expr)
          else
              vars(ncol+1) = trim( expr(1:iright-1) )
          endif
          new = vars( ncol+1 )

      print*,'inp  = ',trim(inpfile)
      print*,'out  = ',trim(outfile)
      print*,'expr = ',trim(expr),' ---> ',trim( new )

c     Determine the formats
      call mode_tra(inpmode,inpfile)
      if (inpmode.eq.-1) inpmode=1
      call mode_tra(outmode,outfile)
      if (outmode.eq.-1) outmode=1

c     Allocate memory
      allocate(trainp(ntra,ntim,ncol),stat=stat)
      if (stat.ne.0) print*,'*** error allocating array trainp   ***'
      allocate(traout(ntra,ntim,ncol+1),stat=stat)
      if (stat.ne.0) print*,'*** error allocating array traout   ***'

c     Read inpufile
      call ropen_tra(fid,inpfile,ntra,ntim,ncol,refdate,vars,inpmode)
      call read_tra (fid,trainp,ntra,ntim,ncol,inpmode)
      call close_tra(fid,inpmode)

c         Copy to output trajectory
          do i=1,ntra
                do j=1,ntim
                  do k=1,ncol
                     traout(i,j,k) = trainp(i,j,k)
                  enddo
                enddo
      enddo

c         Loop over all trajectories
          do i=1,ntra
                do j=1,ntim
                        do k=1,ncol

c                 Attribute trajectory values to symbols
                  col = vars(k)
                          call defparam( col, traout(i,j,k) )

                        enddo

c               Evaluate expression
                call evaleqn(expr)

c               Get the result
                call getparam(new,value)
                traout(i,j,ncol+1) = value

            enddo
          enddo
    
c     Write output file
      call wopen_tra(fid,outfile,ntra,ntim,ncol+1,refdate,vars,outmode)
      call write_tra(fid,traout,ntra,ntim,ncol+1,outmode)
      call close_tra(fid,outmode)
      
      end