Subversion Repositories lagranto.ecmwf

Rev

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

      PROGRAM trainfo
      
c     ***********************************************************************
c     * Get infos for a trajectory file                                     *
c     * Michael Sprenger / Spring, summer 2010                              *
c     ***********************************************************************

      implicit none
      
c     ----------------------------------------------------------------------
c     Declaration of variables
c     ----------------------------------------------------------------------

c     Input file
      character*80                           inpfile     ! Input filename
      character*80                           mode        ! Mode

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

c     Auxiliary variables
      integer                                inpmode
      integer                                stat
      integer                                fid
      integer                                i,j,n
      integer                                old(5)
      integer                                new(5)
      integer                                hour,min
      character*20                           datestr
      character*120                          str
      character*4                            str1
      character*2                            str2,str3,str4,str5,str6
      integer                                isok
      integer                                nleaving

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

c     Read parameters
      open(10,file='trainfo.param')
       read(10,*) inpfile
       read(10,*) mode
      close(10)
      
c     Determine the formats
      call mode_tra(inpmode,inpfile)
      if (inpmode.eq.-1) inpmode=1

c     Get the dimension of the trajectory file
      call info_tra(inpfile,ntra,ntim,ncol,inpmode)

c     Get haeder information
      call ropen_tra(fid,inpfile,ntra,ntim,ncol,refdate,vars,inpmode)
      call close_tra(fid,inpmode)

c     Write dimensions
      if ( (mode.eq.'dim').or.(mode.eq.'all') ) then
         print*,ntra,ntim,ncol
      endif

c     Write single dimensions
      if ( (mode.eq.'ntra').or.(mode.eq.'all') ) then
         print*,ntra
      endif
      if ( (mode.eq.'ntim').or.(mode.eq.'all') ) then
         print*,ntim
      endif
      if ( (mode.eq.'ncol').or.(mode.eq.'all') ) then
         print*,ncol
      endif

c     Write variable names
      if ( (mode.eq.'vars').or.(mode.eq.'all') ) then
         print*,(trim(vars(i))//' ',i=1,ncol)         
      endif

c     Write reference date 
      if ( (mode.eq.'refdate').or.(mode.eq.'all') ) then
         
c        Concatenate date string
         min = refdate(5)         
         call datestring(datestr,
     >             refdate(1),refdate(2),refdate(3),refdate(4) )
         if ( min.eq.0 ) then
            datestr = trim(datestr)//'00'
         elseif (min.lt.10) then
            datestr = trim(datestr)//'0'//char(ichar('0')+min)
         else
            datestr = trim(datestr)//
     >                char(ichar('0')+int(min/10))//
     >                char(ichar('0')+mod(min,10))
         endif
                    
c        Write date string
         print*,trim(datestr)

      endif

c     Load all trajectory times if necessary
      if ( (mode.eq.'all'      ).or.
     >     (mode.eq.'times'    ).or.
     >     (mode.eq.'startdate').or.
     >     (mode.eq.'enddate'  ) )
     >then
         allocate(tra(ntra,ntim,ncol),stat=stat)
         call ropen_tra(fid,inpfile,ntra,ntim,ncol,refdate,vars,inpmode)
         call read_tra (fid,tra,ntra,ntim,ncol,inpmode)
         call close_tra(fid,inpmode)
      endif

c     Write list of all times
      if ( (mode.eq.'times').or.(mode.eq.'all') ) then
         write(*,'(100f8.2)') (tra(1,i,1),i=1,ntim)
      endif

c     Write time range
      if ( (mode.eq.'timerange').or.(mode.eq.'all') ) then
         write(*,'(i6)') refdate(6)
      endif
      
c     Write firstdate (reference date + first time)
      if ( (mode.eq.'startdate').or.(mode.eq.'all') ) then
         
c        Set the time shift of first time relative to reference date
         hour = int(tra(1,1,1))
         min  = mod(nint(100.*tra(1,1,1)),100) + refdate(5)
         if (min.gt.60) then
            min  = min - 60
            hour = hour + 1
         endif
         if (min.lt.0) then
            min  = min + 60
            hour = hour - 1
         endif
         if (min.lt.0) then
            min  = min + 60
            hour = hour - 1
         endif

c        Get new date (hours and minutes)
         old(1) = refdate(1)
         old(2) = refdate(2)
         old(3) = refdate(3)
         old(4) = refdate(4)
         old(5) = 0
         call newdate(old,real(hour),new)

c        Concatenate the date string
         call datestring(datestr,
     >             new(1),new(2),new(3),new(4) )
         if ( min.eq.0 ) then
            datestr = trim(datestr)//'00'
         elseif (min.lt.10) then
            datestr = trim(datestr)//'0'//char(ichar('0')+min)
         else
            datestr = trim(datestr)//
     >                char(ichar('0')+int(min/10))//
     >                char(ichar('0')+mod(min,10))
         endif
                    
c        Write date string
         print*,trim(datestr)

      endif

c     Write enddate (reference date + last time)
      if ( (mode.eq.'enddate').or.(mode.eq.'all') ) then
         
c        Set the time shift of first time relative to reference date
         hour = int(tra(1,ntim,1))
         min  = mod(nint(100.*tra(1,ntim,1)),100) + refdate(5)
         if (min.gt.60) then
            min  = min - 60
            hour = hour + 1
         endif
         if (min.lt.0) then
            min  = min + 60
            hour = hour - 1
         endif
         if (min.lt.0) then
            min  = min + 60
            hour = hour - 1
         endif

c        Get new date (hours and minutes)
         old(1) = refdate(1)
         old(2) = refdate(2)
         old(3) = refdate(3)
         old(4) = refdate(4)
         old(5) = 0
         call newdate(old,real(hour),new)

c        Concatenate the date string
         call datestring(datestr,
     >             new(1),new(2),new(3),new(4) )
         if ( min.eq.0 ) then
            datestr = trim(datestr)//'00'
         elseif (min.lt.10) then
            datestr = trim(datestr)//'0'//char(ichar('0')+min)
         else
            datestr = trim(datestr)//
     >                char(ichar('0')+int(min/10))//
     >                char(ichar('0')+mod(min,10))
         endif
                    
c        Write date string
         print*,trim(datestr)

      endif

c     Write trajectories to screen
      if ( (mode.eq.'list') ) then

c        Read the complete trajectory file
         allocate(tra(ntra,ntim,ncol),stat=stat)
         call ropen_tra(fid,inpfile,ntra,ntim,ncol,refdate,vars,inpmode)
         call read_tra (fid,tra,ntra,ntim,ncol,inpmode)
         call close_tra(fid,inpmode)

c        Get the strings for output
         write(str1,'(i4)') refdate(1)
         write(str2,'(i2)') refdate(2)
         write(str3,'(i2)') refdate(3)
         write(str4,'(i2)') refdate(4)
         write(str5,'(i2)') refdate(5)
         if (refdate(2).eq. 0) str2(1:1)='0'
         if (refdate(3).eq. 0) str3(1:1)='0'
         if (refdate(4).eq. 0) str4(1:1)='0'
         if (refdate(5).eq. 0) str5(1:1)='0'
         if (refdate(2).lt.10) str2(1:1)='0'
         if (refdate(3).lt.10) str3(1:1)='0'
         if (refdate(4).lt.10) str4(1:1)='0'
         if (refdate(5).lt.10) str5(1:1)='0'

c        Write the time specification
         write(*,'(a15,a4,a2,a2,a1,a2,a2,a13,i8,a4)') 
     >          'Reference date ',
     >           str1,str2,str3,'_',str4,str5,
     >          ' / Time range',refdate(6), ' min'
         write(*,*)

c        Write variable names
         str=''
         do i=1,ncol
            str=trim(str)//trim(vars(i))
         enddo
         write(*,'(a6,a9,a8,a6,100a10)') (trim(vars(i)),i=1,ncol)
         write(*,'(a6,a9,a8,a6,100a10)') 
     >              '------','---------','--------','------',
     >              ('----------',i=5,ncol)

         do n=1,ntra
            write(*,*)
            do i=1,ntim
               write(*,'(1f7.2,f9.2,f8.2,i6,100f10.3)') 
     >               (tra(n,i,j),j=1,3),             ! time, lon, lat
     >               nint(tra(n,i,4)),               ! p
     >               (tra(n,i,j),j=5,ncol)           ! fields
            enddo
         enddo

      endif
         
c     Get number of trajectories leaving domain
      if ( (mode.eq.'leaving') ) then

c        Read the complete trajectory file
         allocate(tra(ntra,ntim,ncol),stat=stat)
         call ropen_tra(fid,inpfile,ntra,ntim,ncol,refdate,vars,inpmode)
         call read_tra (fid,tra,ntra,ntim,ncol,inpmode)
         call close_tra(fid,inpmode)

c        Determine the number of trajectories leaving domain
         do i=1,ntra
            isok = 1
            do j=1,ntim
               if ( tra(i,j,4).lt.0. ) isok = 0
            enddo         
            if ( isok.eq.0 ) then
               nleaving = nleaving + 1
            endif
         enddo

c        Write output
         print*,nleaving     

      endif
         
      end