      PROGRAM pltmax 
c
c
c     ##################################################################
c     ##################################################################
c     ######                                                      ######
c     ######                PROGRAM PLTMAX                        ######
c     ######                                                      ######
c     ######                Copyright (c) 1992                    ######
c     ######  Center for the Analysis and Prediction of Storms    ######
c     ######    University of Oklahoma.  All rights reserved.     ######
c     ######                                                      ######
c     ##################################################################
c     ##################################################################
c

c
c#######################################################################
c
c     This program produces graphic plots of the t series of 
c     the maximu and minimum of u, v, w, potential temperatture 
c     perturbation, pressure perturbation and the water quantities. 
c
c     A max./min. data file produced by the ARPS model run is 
c     used at the input data. 
c
c#######################################################################
c
c     AUTHOR: Ming Xue, CAPS/OU. 
c     6/26/1992        
c
c     MODIFICATION HISTORY:
C
c#######################################################################
c
c     DATA ARRAYS READ IN:
c
c
c     CALCULATED DATA ARRAYS:
c
c
c     WORKING ARRAYS:
c
c       tem1     Temporary working array.
c       tem2     Temporary working array.
c       tem3     Temporary working array.
c       tem4     Temporary working array.
c
c
c#######################################################################
c
c     Variable Declarations.
c
c#######################################################################
c
      implicit none 
c
c#######################################################################
c
c     Include files: 
c
c#######################################################################
c
      include 'dims.inc'
c
c#######################################################################
c
c     Arrays to be read in:
c
c#######################################################################
c
      integer nmax
      parameter (nmax = 1000)  ! Maxmimum array size
c
      real time (nmax)
c
      real umax (nmax)
      real umin (nmax)
      real vmax (nmax)
      real vmin (nmax)
      real wmax (nmax)
      real wmin (nmax)
      real ptmax(nmax)
      real ptmin(nmax)
      real pmax (nmax)
      real pmin (nmax)

      real qvmax(nmax)
      real qcmax(nmax)
      real qrmax(nmax)
      real qimax(nmax)
      real qsmax(nmax)
      real qhmax(nmax)

      real uulim,ullim   ! upper and lower limit of y-axis for u graph 
      real vulim,vllim   ! upper and lower limit of y-axis for v graph 
      real wulim,wllim   ! upper and lower limit of y-axis for w graph 
      real ptllim,ptulim ! upper and lower limit of y-axis for pt graph 
      real pulim,pllim   ! upper and lower limit of y-axis for p graph 
      real qulim,qllim   ! upper and lower limit of y-axis for q graph 

      character  runname*80
      character filename*80
c
c#######################################################################
c
c     Misc. local variables: 
c
c#######################################################################
c
      integer i, npoints, nxpic,nypic,nchanl,lenstr
      real x1,x2,y1,y2,xlimit,ylimit,angl,timmin,timmax

c#######################################################################
c
c     Plotting control parameters entered by user
c
c#######################################################################
c

c
C#######################################################################
C
C     ZXPLOT Routines Called
C
C#######################################################################
c
      external xdevic
      external xdspac
      external xspace
      external xpmagn
      external xgrend
c
c#######################################################################
c
c     Other Routines Called
c
c#######################################################################
c

c
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C
C     Beginning of executable code...
C
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
c

c
c#######################################################################
c
c     Obtain from user the control parameters for
c     water, ice, and base state variable reading.
c
c#######################################################################
c
      write(6,'(/ 16(/5x,a)//)')

     :'###############################################################',
     :'###############################################################',
     :'#####                                                     #####',
     :'#####               Welcome to ARPSPLTMAX                 #####',
     :'#####                                                     #####',
     :'#####           A program that plots the graphs           #####', 
     :'#####            of the max./min. time series             #####',
     :'#####                                                     #####',
     :'#####           The graphic plotting is based             #####',
     :'#####             on graphic package ZXPLOT               #####',
     :'#####                                                     #####',
     :'#####              By Ming Xue CAPS/OU                    #####',
     :'#####                                                     #####',
     :'###############################################################',
     :'###############################################################'

c
c#######################################################################
c
c     Get the name of the input data set.
c
c#######################################################################
c

      filename = ' '
      write(6,'(/a/)')'Please give the name of the input data file:'
      read(5,*) filename

      lenstr=80
      call strlnth(filename,lenstr)

      write(6,'(/a,a)')' The data set name was ', filename(1:lenstr)

      nchanl = 63

c     close(unit = nchanl )
      open(unit=nchanl,file=filename(1:lenstr),
     :     status='old',form='formatted')
      write(6,'(/a,a,a,i3/)')' File ', filename(1:lenstr),
     :     ' was opened using Fortran unit ',nchanl


c
c#######################################################################
c
c     Read in the upper and lower limit of the y axis for each 
c     variable. 
c
c#######################################################################
c
       
      write(6,'(/a/)')
     :'Please specify the lower limit of y axis of the umax/umin plot.'  
      read(5,*) ullim
       
      write(6,'(/a/)')
     :'Please specify the upper limit of y axis of the umax/umin plot.'  
      read(5,*) uulim
       
      write(6,'(/a/)')
     :'Please specify the lower limit of y axis of the vmax/vmin plot.'  
      read(5,*) vllim
       
      write(6,'(/a/)')
     :'Please specify the upper limit of y axis of the vmax/vmin plot.'  
      read(5,*) vulim
       
      write(6,'(/a/)')
     :'Please specify the lower limit of y axis of the wmax/wmin plot.'  
      read(5,*) wllim
       
      write(6,'(/a/)')
     :'Please specify the upper limit of y axis of the wmax/wmin plot.'  
      read(5,*) wulim
       
      write(6,'(/a,a/)')
     :'Please specify the lower limit of y axis of ',
     :'the ptmax/ptmin plot.'  
      read(5,*) ptllim
       
      write(6,'(/a,a/)')
     :'Please specify the upper limit of y axis of ',
     :'the ptmax/ptmin plot.'  
      read(5,*) ptulim
       
      write(6,'(/a/)')
     :'Please specify the lower limit of y axis of the pmax/pmin plot.'  
      read(5,*) pllim
       
      write(6,'(/a/)')
     :'Please specify the upper limit of y axis of the pmax/pmin plot.'  
      read(5,*) pulim
       
      write(6,'(/a/)')
     :'Please specify the lower limit of y axis of the qmax/qmin plot.'  
      read(5,*) qllim
       
      write(6,'(/a/)')
     :'Please specify the upper limit of y axis of the qmax/qmin plot.'  
      read(5,*) qulim
       
     
      write(6,'(/a/)')
     :'How many columns of plots do you want in each frame?'
      read(5,*) nxpic 
       
      write(6,'(/a/)')
     :'How many raws of plots do you want in each frame?'
      read(5,*) nypic 
       
c
c#######################################################################
c
c     Read in the max./min. data   
c
c#######################################################################
c

      read(nchanl,*,err=999,end=992) runname

      write(6,'(/a/)') 'Reading data from ',runname

      read(nchanl,*)

      DO 100 i = 1,nmax

        read(nchanl,*,err=999,end=992) 
     :    time(i),umin(i),umax(i),vmin(i),vmax(i),wmin(i),wmax(i),
     :    ptmin(i),ptmax(i),pmin(i),pmax(i),qvmax(i),qcmax(i),qrmax(i)
c    :    qimax(i),qsmax(i),qhmax(i) ! no ice variables yet.

        pmin(i)=pmin(i)*0.01
        pmax(i)=pmax(i)*0.01

100   CONTINUE 

992   CONTINUE

      npoints = i-1   ! The number of data samples in each time series 

      timmin = 0.0
      timmax = time(npoints)
c
c#######################################################################
c
c     Initialize plotting package and set plotting space parameters
c
c#######################################################################
c
      CALL xdevic 

      IF( nxpic.eq.1. and .nypic.eq.1) THEN
        call xdspac(0.80)
      ELSE
        call xdspac(0.90)
      ENDIF

      angl = 00.0 
c
c#######################################################################
c
c     Set page layout parameters
c
c#######################################################################
c
      CALL xspace(nxpic, nypic, angl , xlimit,ylimit)
c
c#######################################################################
c
c     Set the margins between pictures in nondimensional units.
c
c#######################################################################
c
      CALL xpmagn(0.05,0.05)

c
c#######################################################################
c 
c     To plot umax, umin curves
c
c#######################################################################
c
      call xnwpic

      call xmap(timmin,timmax,ullim, uulim)
      call xbordr
      call xaxes(0.0,0.0,0.0,0.0)
      call xqmap(x1,x2,y1,y2)
      call xchsiz(0.03*(y2-y1))
      call xchori(90.0)
      call xcharc( x1-0.15*(x2-x1), (y1+y2)*0.5, 'Umin, Umax (m/s)')
      call xchori( 0.0)

      call xfull
      call xgraph(time,umin,npoints)
      call xdash
      call xgraph(time,umax,npoints)
      call xfull
 
      call runlab( runname )
c
c#######################################################################
c 
c     To plot vmax, vmin curves
c
c#######################################################################
c
      call xnwpic
      call xmap(timmin,timmax,vllim, vulim)
      call xbordr
      call xaxes(0.0,0.0,0.0,0.0)
      call xqmap(x1,x2,y1,y2)
      call xchsiz(0.03*(y2-y1))
      call xchori(90.0)
      call xcharc( x1-0.15*(x2-x1), (y1+y2)*0.5, 'Vmin, Vmax (m/s)')
      call xchori( 0.0)

      call xfull
      call xgraph(time,vmin,npoints)
      call xdash
      call xgraph(time,vmax,npoints)
      call xfull
 
      call runlab( runname )

c
c#######################################################################
c 
c     To plot wmax, wmin curves
c
c#######################################################################
c
      call xnwpic
      call xmap(timmin,timmax,wllim,wulim)
      call xbordr
      call xaxes(0.0,0.0,0.0,0.0)
      call xqmap(x1,x2,y1,y2)
      call xchsiz(0.03*(y2-y1))
      call xchori(90.0)
      call xcharc( x1-0.15*(x2-x1), (y1+y2)*0.5, 'Wmin, Wmax (m/s)')
      call xchori( 0.0)

      call xfull
      call xgraph(time,wmin,npoints)
      call xdash
      call xgraph(time,wmax,npoints)
      call xfull
 
      call runlab( runname )

c
c#######################################################################
c 
c     To plot ptmax, ptmin curves
c
c#######################################################################
c
      call xnwpic
      call xmap(timmin,timmax,ptllim,ptulim)
      call xbordr
      call xaxes(0.0,0.0,0.0,0.0)
      call xqmap(x1,x2,y1,y2)
      call xchsiz(0.03*(y2-y1))
      call xchori(90.0)
      call xcharc( x1-0.15*(x2-x1), (y1+y2)*0.5, 'PTmin, PTmax (K)')
      call xchori( 0.0)

      call xfull
      call xgraph(time,ptmin,npoints)
      call xdash
      call xgraph(time,ptmax,npoints)
      call xfull
 
      call runlab( runname )
c
c#######################################################################
c 
c     To plot pmax, pmin curves
c
c#######################################################################
c
      call xnwpic
      call xmap(timmin,timmax,pllim, pulim)
      call xbordr
      call xaxes(0.0,0.0,0.0,0.0)
      call xqmap(x1,x2,y1,y2)
      call xchsiz(0.03*(y2-y1))
      call xchori(90.0)
      call xcharc( x1-0.15*(x2-x1), (y1+y2)*0.5, 'Pmin, Pmax (mb)')
      call xchori( 0.0)

      call xfull
      call xgraph(time,pmin,npoints)
      call xdash
      call xgraph(time,pmax,npoints)
      call xfull
 
      call runlab( runname )

c
c#######################################################################
c 
c     To plot qvmax, qcmax and qrmax curves
c
c#######################################################################
c
      call xnwpic
      call xmap(timmin,timmax,qllim,qulim)
      call xbordr
      call xaxes(0.0,0.0,0.0,0.0)
      call xqmap(x1,x2,y1,y2)
      call xchsiz(0.03*(y2-y1))
      call xchori(90.0)
      call xcharc( x1-0.15*(x2-x1), (y1+y2)*0.5, 
     :           'Qvmax, Qcmax, Qrmax (kg/kg)')
      call xchori( 0.0)

      call xfull
      call xgraph(time,qvmax,npoints)
      call xdash
      call xgraph(time,qcmax,npoints)
      call xfull
 
      call runlab( runname )
      call xbrokn(8,4,8,1)
      call xgraph(time,qrmax,npoints)
c
      CALL xgrend 
      
      STOP

999   CONTINUE

      write(6,'(2(1x,a))')'Error encountered when reading input data,',
     :      'Job aborted.'
      STOP

      END
c
c     ##################################################################
c     ##################################################################
c     ######                                                      ######
c     ######                SUBROUTINE STRLNTH                    ######
c     ######                                                      ######
c     ######                Copyright (c) 1992                    ######
c     ######  Center for the Analysis and Prediction of Storms    ######
c     ######    University of Oklahoma.  All rights reserved.     ######
c     ######                                                      ######
c     ##################################################################
c     ##################################################################
c

      SUBROUTINE strlnth( string, length )
c
c#######################################################################
c
c     PURPOSE:
c
c     Return the length of the non-blank part of a string.
c
c#######################################################################
c
c     AUTHOR: Ming Xue
c
c     MODIFICATION HISTORY:
c
c     6/09/92 (K. Brewster)
c     Added full documentation and streamlined logic
c 
c#######################################################################
c
c     INPUT:
c
c       string   character string to be sized
c    
c     INPUT/OUTPUT:
c
c       length   on input, full size of character string
c                on output, true length of string as measured by the
c                           location of the last non-blank character
c
c
c#######################################################################
c

c
c#######################################################################
c
c     Variable Declarations.
c
c#######################################################################
c
      implicit none
      integer length
      character string*(*)
c
c#######################################################################
c
c     Misc. local variables
c
c#######################################################################
c
      integer i
c
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C
C     Beginning of executable code...
C
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
c
      DO 100 i = length,1,-1

        IF(string(i:i) .ne. ' ') GO TO 101

100   CONTINUE
101   CONTINUE

      length = i

      RETURN
      END

      subroutine runlab(runname)
c
c#######################################################################
c
c     To plot a run label at the lower left cornor of the picture frame.
c
c#######################################################################
c
      character runname*(*)

      CALL xqmap(xl,xr,yb,yt)
      CALL xqnpic(nopic)
      CALL xqspac(nxpic, nypic, rotang, xlimit, ylimit)

      IF( rotang.eq.0.0 ) THEN

        IF(nopic.eq.nxpic*nypic -(nxpic-1)) THEN
          CALL xcharl( xl, yb-0.15*(yt-yb), runname )
        ENDIF

      ELSE

        IF(nopic.eq.nypic*nxpic -(nypic-1)) THEN
          CALL xcharl( xl, yb-0.15*(yt-yb), runname )
        ENDIF

      ENDIF

      RETURN
      END
