PROGRAM arpsextsnd,87
!
!##################################################################
!##################################################################
!######                                                      ######
!######                  PROGRAM EXTSND                      ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Extracts soundings from ARPS model history data.
!  User specifies an ARPS history file and either a lat,lon or
!  an x-y location.
!
!  Creates a file with the sounding data in an ASCII format.
!  The format matches one used by UNIDATA's GEMPAK software for ASCII
!  output of sounding data (GEMPAK program SNLIST).
!
!  Because of that compatibility, the output file can be
!  read by certain sounding plotting and analysis programs on the
!  computers at the University of Oklahoma (OU).
!
!  The following instructions apply to ARPS users at OU:
!
!  After running this program use
!  ~rcarpent/bin/skewt -sfc -hodo data_file
!
!  where data_file is the output of this program (a name specified
!  in the input of this program).  An NCARgraphics gmeta file
!  is created by skewt.
!
!  It is also possible to use this file as input to the standard
!  skewt plotting programs on the metgem and Rossby computers.
!  See the author for details.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  April 1992.
!
!  MODIFICATION HISTORY:
!
!  October, 1992 (K. Brewster)
!  Conversion to ARPS 3.0.
!
!  February, 1993 (K. Brewster)
!  Additional documentation for ARPS 3.1 release
!
!  4/13/93 (M. Xue)
!  Modified to conform to the new data dump format.
!
!  10/19/94 (KB)
!  Modified to conform to yet another data dump format.
!  Corrections made for change in x,y definition in dump file.
!
!  06/19/95 (KB)
!  Modified documentation and output formats to update info.
!
!  03/07/96 (KB)
!  Changed calling arguments in FINDLC, moved subroutines to a library.
!  Corrected a bug in ymap(ny) calculation.
!
!  11/06/96 (KB)
!  Unified interpolation calls with other programs using interpolation.
!  Added capability to process multiple soundings in one run.
!
!  2000/05/19 (Gene Bassett)
!    Converted to F90, creating allocation and arpsextsnd main
!    subroutines.
!
!  2000/07/28 (Ming Xue)
!  Converted to F90 free format. Use ALLOCATABLE instead of
!  POINTER allocation to avoid double memory usage.
!
!  Changed to namelist format input.
!
!  2001/12/05 (Ming Hu)
!    Add an output file which is sounding used in
!         ARPS as base field like May20.snd
!
!  05/28/2002 (J. Brotzge)
!    Added tsoil/qsoil to accomodate new soil scheme. 
!
!  1 June 2002 Eric Kemp
!    Soil variable updates.
!
!-----------------------------------------------------------------------
!
!  DATA ARRAYS READ IN:
!
!    x        x coordinate of grid points in physical/comp. space (m)
!    y        y coordinate of grid points in physical/comp. space (m)
!    z        z coordinate of grid points in computational space (m)
!    zp       z coordinate of grid points in physical space (m)
!    zpsoil   z coordinate of grid points in the soil (m)
!
!    uprt     Perturbation x component of velocity (m/s)
!    vprt     Perturbation y component of velocity (m/s)
!    wprt     Perturbation z component of velocity (m/s)
!
!    ptprt    Perturbation potential temperature (K)
!    pprt     Perturbation pressure (Pascal)
!
!    qvprt    Perturbation water vapor mixing ratio (kg/kg)
!    qc       Cloud water mixing ratio (kg/kg)
!    qr       Rainwater mixing ratio (kg/kg)
!    qi       Cloud ice mixing ratio (kg/kg)
!    qs       Snow mixing ratio (kg/kg)
!    qh       Hail mixing ratio (kg/kg)
!
!    tke      Turbulent Kinetic Energy ((m/s)**2)
!    kmh      Horizontal turb. mixing coef. for momentum ( m**2/s )
!    kmv      Vertical turb. mixing coef. for momentum ( m**2/s )
!
!    ubar     Base state x velocity component (m/s)
!    vbar     Base state y velocity component (m/s)
!    wbar     Base state z velocity component (m/s)
!    ptbar    Base state potential temperature (K)
!    pbar     Base state pressure (Pascal)
!    rhobar   Base state density (kg/m**3)
!    qvbar    Base state water vapor mixing ratio (kg/kg)
!
!    soiltyp  Soil type
!    vegtyp   Vegetation type
!    lai      Leaf Area Index
!    roufns   Surface roughness
!    veg      Vegetation fraction
!
!    tsoil    Soil temperature (K)
!    qsoil    Soil moisture (m**3/m**3) 
!    wetcanp  Canopy water amount
!
!    raing    Grid supersaturation rain
!    rainc    Cumulus convective rain
!    prcrate  Precipitation rates
!
!    radfrc   Radiation forcing (K/s)
!    radsw    Solar radiation reaching the surface
!    rnflx    Net radiation flux absorbed by surface
!    radswnet Net shortwave radiation, SWin - SWout
!    radlwin  Incoming longwave radiation
!
!    usflx    Surface flux of u-momentum (kg/(m*s**2))
!    vsflx    Surface flux of v-momentum (kg/(m*s**2))
!    ptsflx   Surface heat flux (K*kg/(m**2 * s ))
!    qvsflx   Surface moisture flux of (kg/(m**2 * s))
!
!  CALCULATED DATA ARRAYS:
!
!    su       Sounding x component of velocity (m/s)
!    sv       Sounding y component of velocity (m/s)
!    stheta   Sounding potential temperature (K)
!    spres    Sounding pressure (mb)
!    stemp    Sounding temperature (C)
!    sdewp    Sounding dew-point (C)
!    sdrct    Sounding wind direction (degrees)
!    ssped    Sounding wind speed (m/s)
!    shght    Sounding height (m)
!
!  WORK ARRAYS:
!
!    tem1     Temporary work array.
!
!   Temporary arrays are defined and used differently by each
!   subroutine.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations:
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx,ny,nz,nzsoil 

  INTEGER :: nstyps
  INTEGER, PARAMETER :: maxsnd = 200
!
!-----------------------------------------------------------------------
!
!  Include files:
!
!-----------------------------------------------------------------------
!
  INCLUDE 'globcst.inc'
  INCLUDE 'grid.inc'
!
!-----------------------------------------------------------------------
!
!  Arrays to be read in:
!
!-----------------------------------------------------------------------
!
  REAL, ALLOCATABLE :: x     (:)         ! The x-coord. of the physical and
                                         ! computational grid. Defined at u-point.
  REAL, ALLOCATABLE :: y     (:)         ! The y-coord. of the physical and
                                         ! computational grid. Defined at v-point.
  REAL, ALLOCATABLE :: z     (:)         ! The z-coord. of the computational grid.
                                         ! Defined at w-point on the staggered grid.
  REAL, ALLOCATABLE :: zp    (:,:,:)     ! The physical height coordinate defined at
                                         ! w-point of the staggered grid.
  REAL, ALLOCATABLE :: zpsoil(:,:,:)     ! The physical height coordinate defined at
                                         ! w-point of the soil grid.

  REAL, ALLOCATABLE :: uprt   (:,:,:)    ! Perturbation u-velocity (m/s)
  REAL, ALLOCATABLE :: vprt   (:,:,:)    ! Perturbation v-velocity (m/s)
  REAL, ALLOCATABLE :: wprt   (:,:,:)    ! Perturbation w-velocity (m/s)
  REAL, ALLOCATABLE :: ptprt  (:,:,:)    ! Perturbation potential temperature (K)
  REAL, ALLOCATABLE :: pprt   (:,:,:)    ! Perturbation pressure (Pascal)
  REAL, ALLOCATABLE :: qvprt  (:,:,:)    ! Perturbation water vapor specific
                                         ! humidity (kg/kg)
  REAL, ALLOCATABLE :: qc     (:,:,:)    ! Cloud water mixing ratio (kg/kg)
  REAL, ALLOCATABLE :: qr     (:,:,:)    ! Rain water mixing ratio (kg/kg)
  REAL, ALLOCATABLE :: qi     (:,:,:)    ! Cloud ice mixing ratio (kg/kg)
  REAL, ALLOCATABLE :: qs     (:,:,:)    ! Snow mixing ratio (kg/kg)
  REAL, ALLOCATABLE :: qh     (:,:,:)    ! Hail mixing ratio (kg/kg)

  REAL, ALLOCATABLE :: tke   (:,:,:)     ! Turbulent Kinetic Energy ((m/s)**2)
  REAL, ALLOCATABLE :: kmh   (:,:,:)     ! Horizontal turb. mixing coef. for
                                         ! momentum. ( m**2/s )
  REAL, ALLOCATABLE :: kmv   (:,:,:)     ! Vertical turb. mixing coef. for
                                         ! momentum. ( m**2/s )

  REAL, ALLOCATABLE :: ubar   (:,:,:)    ! Base state u-velocity (m/s)
  REAL, ALLOCATABLE :: vbar   (:,:,:)    ! Base state v-velocity (m/s)
  REAL, ALLOCATABLE :: wbar   (:,:,:)    ! Base state w-velocity (m/s)
  REAL, ALLOCATABLE :: ptbar  (:,:,:)    ! Base state potential temperature (K)
  REAL, ALLOCATABLE :: pbar   (:,:,:)    ! Base state pressure (Pascal)
  REAL, ALLOCATABLE :: rhobar (:,:,:)    ! Base state air density (kg/m**3)
  REAL, ALLOCATABLE :: qvbar  (:,:,:)    ! Base state water vapor specific
                                         ! humidity (kg/kg)

  INTEGER, ALLOCATABLE :: soiltyp (:,:,:) ! Soil type
  REAL, ALLOCATABLE :: stypfrct(:,:,:)    ! Soil type
  INTEGER, ALLOCATABLE :: vegtyp  (:,:)   ! Vegetation type
  REAL, ALLOCATABLE :: lai     (:,:)      ! Leaf Area Index
  REAL, ALLOCATABLE :: roufns  (:,:)      ! Surface roughness
  REAL, ALLOCATABLE :: veg     (:,:)      ! Vegetation fraction

  REAL, ALLOCATABLE :: tsoil (:,:,:,:)    ! Soil temperature (K)
  REAL, ALLOCATABLE :: qsoil (:,:,:,:)    ! Soil moisture (m**3/m**3) 
  REAL, ALLOCATABLE :: wetcanp(:,:,:)     ! Canopy water amount
  REAL, ALLOCATABLE :: snowdpth(:,:)      ! Snow depth (m)

  REAL, ALLOCATABLE :: raing(:,:)         ! Grid supersaturation rain
  REAL, ALLOCATABLE :: rainc(:,:)         ! Cumulus convective rain
  REAL, ALLOCATABLE :: prcrate(:,:,:)     ! precipitation rate (kg/(m**2*s))
                                          ! prcrate(1,1,1) = total precip. rate
                                          ! prcrate(1,1,2) = grid scale precip. rate
                                          ! prcrate(1,1,3) = cumulus precip. rate
                                          ! prcrate(1,1,4) = microphysics precip. rate

  REAL, ALLOCATABLE :: radfrc(:,:,:)      ! Radiation forcing (K/s)
  REAL, ALLOCATABLE :: radsw (:,:)        ! Solar radiation reaching the surface
  REAL, ALLOCATABLE :: rnflx (:,:)        ! Net radiation flux absorbed by surface
  REAL, ALLOCATABLE :: radswnet(:,:)      ! Net shortwave radiation
  REAL, ALLOCATABLE :: radlwin(:,:)       ! Incoming longwave radiation

  REAL, ALLOCATABLE :: usflx (:,:)        ! Surface flux of u-momentum (kg/(m*s**2))
  REAL, ALLOCATABLE :: vsflx (:,:)        ! Surface flux of v-momentum (kg/(m*s**2))
  REAL, ALLOCATABLE :: ptsflx(:,:)        ! Surface heat flux (K*kg/(m*s**2))
  REAL, ALLOCATABLE :: qvsflx(:,:)        ! Surface moisture flux (kg/(m**2*s)
!
!-----------------------------------------------------------------------
!
!  Computed variables
!
!-----------------------------------------------------------------------
!
  REAL, ALLOCATABLE :: xs(:)      ! x location of scalar points
  REAL, ALLOCATABLE :: ys(:)      ! y location of scalar points
!
!-----------------------------------------------------------------------
!
!  Extracted sounding variables
!
!-----------------------------------------------------------------------
!
  REAL, ALLOCATABLE :: su(:,:)
  REAL, ALLOCATABLE :: sv(:,:)
  REAL, ALLOCATABLE :: stheta(:,:)
  REAL, ALLOCATABLE :: sqv(:,:)
  REAL, ALLOCATABLE :: spres(:,:)
  REAL, ALLOCATABLE :: stemp(:,:)
  REAL, ALLOCATABLE :: sdewp(:,:)
  REAL, ALLOCATABLE :: sdrct(:,:)
  REAL, ALLOCATABLE :: ssped(:,:)
  REAL, ALLOCATABLE :: shght(:,:)
!
!-----------------------------------------------------------------------
!
!  Work Arrays
!
!-----------------------------------------------------------------------
!
  REAL, ALLOCATABLE :: dxfld(:)
  REAL, ALLOCATABLE :: dyfld(:)
  REAL, ALLOCATABLE :: rdxfld(:)
  REAL, ALLOCATABLE :: rdyfld(:)
  REAL, ALLOCATABLE :: slopey(:,:,:)
  REAL, ALLOCATABLE :: alphay(:,:,:)
  REAL, ALLOCATABLE :: betay(:,:,:)
  REAL, ALLOCATABLE :: tem1(:,:,:)
  REAL, ALLOCATABLE :: tem2(:,:,:)
  REAL, ALLOCATABLE :: tem3(:,:,:)

  REAL :: xpt(maxsnd),ypt(maxsnd)
  CHARACTER (LEN=256) :: ofile(maxsnd)
  INTEGER :: ipt(maxsnd),jpt(maxsnd)
!
!-----------------------------------------------------------------------
!
!  Sounding indentification variables
!  These are required for the proper operation of the
!  plotting programs on the metgem computer at the
!  University of Oklahoma.
!
!-----------------------------------------------------------------------
!
!wdt update
  CHARACTER (LEN=8) :: stid(maxsnd)
  REAL :: slat(maxsnd),slon(maxsnd),selev(maxsnd)
  INTEGER :: istnm(maxsnd)
!
!-----------------------------------------------------------------------
!
!  Map projection variables
!
!-----------------------------------------------------------------------
!
  REAL, ALLOCATABLE :: xmap(:)
  REAL, ALLOCATABLE :: ymap(:)
  REAL, ALLOCATABLE :: latgr(:,:)
  REAL, ALLOCATABLE :: longr(:,:)

  INTEGER :: i4time,iyr,imo,iday,ihr,imin,isec
  REAL :: latnot(2)
!
!-----------------------------------------------------------------------
!
!  Misc. internal variables
!
!-----------------------------------------------------------------------
!
  REAL :: time,xctr,yctr,xll,yll,xsndmap,ysndmap
  REAL :: ustorm,vstorm
  INTEGER :: i,j,k,locopt,isnd,nsnd
  INTEGER :: ireturn,hinfmt,lengbf,lenfil,nchin
  CHARACTER (LEN=256) :: filename,grdbasfn
  CHARACTER (LEN=80) :: sndtime,snddate,sndlocation

  NAMELIST /input/ hinfmt,grdbasfn,filename,ustorm,vstorm,              &
                  locopt,nsnd,slat,slon,xpt,ypt,ofile,stid,istnm

  INTEGER :: nlevs, istatus
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!

  WRITE(6,'(/6(/1x,a)/)')                                               &
      '###############################################################',&
      '#                                                             #',&
      '# Welcome to EXTSND, a program that reads in a history file   #',&
      '# generated by ARPS and extracts a sounding at an x-y point.  #',&
      '#                                                             #',&
      '###############################################################'

  xpt = -999.0
  ypt = -999.0

  READ(5,input)

  lengbf=LEN_trim(grdbasfn)
  WRITE(6,'(/a,a)')' The grid/base name is ', grdbasfn(1:lengbf)

  lenfil = LEN_trim(filename)
  WRITE(6,'(a,a)')' The data set name is ', filename(1:lenfil)

  IF( nsnd > maxsnd )  then
    WRITE(6,'(a,/a,i5)')                                                &
    'The number of sounding locations to be extracted exceeded maximum ',&
    'allowed. nsnd is reset to ', maxsnd
    nsnd = maxsnd
  ENDIF

!
!-----------------------------------------------------------------------
!
!  Obtain the grid dimensions from input data.
!
!-----------------------------------------------------------------------
!

  CALL get_dims_from_data(hinfmt,grdbasfn(1:lengbf),                    &
       nx,ny,nz,nzsoil,nstyps, ireturn)

  IF (nstyps <= 0) nstyps = 1
  nstyp = nstyps ! Copy to global variable

  IF( ireturn /= 0 ) THEN
    PRINT*,'Problem occured when trying to get dimensions from data.'
    PRINT*,'Program stopped.'
    STOP
  END IF

  WRITE(6,'(4(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz,', nzsoil=',nzsoil
!
!-----------------------------------------------------------------------
!
! Allocate arrays  
!
!-----------------------------------------------------------------------
!
  ALLOCATE(x      (nx),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:x')
  ALLOCATE(y      (ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:y')
  ALLOCATE(z      (nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:z')
  ALLOCATE(zp     (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:zp')
  ALLOCATE(zpsoil  (nx,ny,nzsoil),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:zpsoil')
  ALLOCATE(uprt   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:uprt')
  ALLOCATE(vprt   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:vprt')
  ALLOCATE(wprt   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:wprt')
  ALLOCATE(ptprt  (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ptprt')
  ALLOCATE(pprt   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:pprt')
  ALLOCATE(qvprt  (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qvprt')
  ALLOCATE(qc     (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qc')
  ALLOCATE(qr     (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qr')
  ALLOCATE(qi     (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qi')
  ALLOCATE(qs     (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qs')
  ALLOCATE(qh     (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qh')
  ALLOCATE(tke    (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:tke')
  ALLOCATE(kmh    (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:kmh')
  ALLOCATE(kmv    (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:kmv')
  ALLOCATE(ubar   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ubar')
  ALLOCATE(vbar   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:vbar')
  ALLOCATE(wbar   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:wbar')
  ALLOCATE(ptbar  (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ptbar')
  ALLOCATE(pbar   (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:pbar')
  ALLOCATE(rhobar (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:rhobar')
  ALLOCATE(qvbar  (nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qvbar')

  ALLOCATE(soiltyp (nx,ny,nstyps),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:soiltyp')
  ALLOCATE(stypfrct(nx,ny,nstyps),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:stypfrct')
  ALLOCATE(vegtyp(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:vegtyp')
  ALLOCATE(lai    (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:lai')
  ALLOCATE(roufns (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:roufns')
  ALLOCATE(veg    (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:veg')
  ALLOCATE(tsoil  (nx,ny,nzsoil,0:nstyps),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:tsoil')
  ALLOCATE(qsoil  (nx,ny,nzsoil,0:nstyps),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qsoil')
  ALLOCATE(wetcanp(nx,ny,0:nstyps),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:wetcanp')
  ALLOCATE(snowdpth(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:snowdpth')
  ALLOCATE(raing(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:raing')
  ALLOCATE(rainc(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:rainc')
  ALLOCATE(prcrate(nx,ny,4),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:prcrate')
  ALLOCATE(radfrc(nx,ny,nz),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:radfrc')
  ALLOCATE(radsw (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:radsw')
  ALLOCATE(rnflx (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:rnflx')
  ALLOCATE(radswnet(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:radswnet')
  ALLOCATE(radlwin(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:radlwin')
  ALLOCATE(usflx (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:usflx')
  ALLOCATE(vsflx (nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:vsflx')
  ALLOCATE(ptsflx(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ptsflx')
  ALLOCATE(qvsflx(nx,ny),stat=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:qvsflx')

  ALLOCATE(xs(nx),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:xs')
  ALLOCATE(ys(ny),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ys')
  ALLOCATE(su(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:su')
  ALLOCATE(sv(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:sv')
  ALLOCATE(stheta(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:stheta')
  ALLOCATE(sqv(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:sqv')
  ALLOCATE(spres(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:spres')
  ALLOCATE(stemp(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:stemp')
  ALLOCATE(sdewp(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:sdewp')
  ALLOCATE(sdrct(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:sdrct')
  ALLOCATE(ssped(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ssped')
  ALLOCATE(shght(nz,maxsnd),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:shght')
  ALLOCATE(dxfld(nx),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:dxfld')
  ALLOCATE(dyfld(ny),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:dyfld')
  ALLOCATE(rdxfld(nx),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:rdxfld')
  ALLOCATE(rdyfld(ny),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:rdyfld')
  ALLOCATE(slopey(nx,ny,nz),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:slopey')
  ALLOCATE(alphay(nx,ny,nz),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:alphay')
  ALLOCATE(betay(nx,ny,nz),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:betay')
  ALLOCATE(tem1(nx,ny,nz),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:tem1')
  ALLOCATE(tem2(nx,ny,nz),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:tem2')
  ALLOCATE(tem3(nx,ny,nz),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:tem3')

  ALLOCATE(xmap(nx),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:xmap')
  ALLOCATE(ymap(ny),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:ymap')
  ALLOCATE(latgr(nx,ny),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:latgr')
  ALLOCATE(longr(nx,ny),STAT=istatus)
  CALL check_alloc_status(istatus, 'arpsextsnd:longr')

  x      =0.0
  y      =0.0
  z      =0.0
  zp     =0.0
  zpsoil =0.0
  uprt   =0.0
  vprt   =0.0
  wprt   =0.0
  ptprt  =0.0
  pprt   =0.0
  qvprt  =0.0
  qc     =0.0
  qr     =0.0
  qi     =0.0
  qs     =0.0
  qh     =0.0
  tke    =0.0
  kmh    =0.0
  kmv    =0.0
  ubar   =0.0
  vbar   =0.0
  wbar   =0.0
  ptbar  =0.0
  pbar   =0.0
  radsw =0.0
  qvbar  =0.0

  soiltyp =0
  stypfrct=0.0
  vegtyp=0.0
  lai    =0.0
  roufns =0.0
  veg    =0.0
  tsoil  =0.0
  qsoil  =0.0
  wetcanp=0.0
  snowdpth=0.0
  raing=0.0
  rainc=0.0
  prcrate=0.0
  radfrc=0.0
  radsw =0.0
  rnflx =0.0
  radswnet =0.0
  radlwin =0.0
  usflx =0.0
  vsflx =0.0
  ptsflx=0.0
  qvsflx=0.0

  xs=0.0
  ys=0.0
  su=0.0
  sv=0.0
  stheta=0.0
  sqv=0.0
  spres=0.0
  stemp=0.0
  sdewp=0.0
  sdrct=0.0
  ssped=0.0
  shght=0.0
  dxfld=0.0
  dyfld=0.0
  rdxfld=0.0
  rdyfld=0.0
  slopey=0.0
  alphay=0.0
  betay=0.0
  tem1=0.0
  tem2=0.0
  tem3=0.0

!
!-----------------------------------------------------------------------
!
!  Read all input data arrays
!
!-----------------------------------------------------------------------
!
  CALL dtaread(nx,ny,nz,nzsoil,nstyps,                                  &
               hinfmt,nchin,grdbasfn(1:lengbf),lengbf,                  &
               filename(1:lenfil),lenfil,time,                          &
               x,y,z,zp,zpsoil, uprt ,vprt ,wprt ,ptprt, pprt ,         &
               qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv,                  &
               ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar,            &
               soiltyp,stypfrct,vegtyp,lai,roufns,veg,                  &
               tsoil,qsoil,wetcanp,snowdpth,                            &
               raing,rainc,prcrate,                                     &
               radfrc,radsw,rnflx,radswnet,radlwin,                     &
               usflx,vsflx,ptsflx,qvsflx,                               &
               ireturn, tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
!  ireturn = 0 for a successful read
!
!-----------------------------------------------------------------------
!
  IF( ireturn == 0 ) THEN   ! successful read

!
!-----------------------------------------------------------------------
!
!  Calculate scalar locations
!
!-----------------------------------------------------------------------
!
    DO i=1,nx-1
      xs(i)=0.5*(x(i)+x(i+1))
    END DO
    DO j=1,ny-1
      ys(j)=0.5*(y(j)+y(j+1))
    END DO
    dx=x(2)-x(1)
    dy=y(2)-y(1)
!
!-----------------------------------------------------------------------
!
!  Compute sounding time and write it
!
!-----------------------------------------------------------------------
!
    CALL ctim2abss( year,month,day,hour,minute,second,i4time)
    i4time=i4time + nint(time)
    CALL abss2ctim( i4time, iyr, imo, iday, ihr, imin, isec )
    WRITE(6,'(a,i4.4,a1,i2.2,a1,i2.2,a1,i2.2,a1,i2.2,a1,i2.2)')         &
        '  Time of history data: ',                                     &
        iyr,'/',imo,'/',iday,':',ihr,':',imin,':',isec
!
!-----------------------------------------------------------------------
!
!  Find and write the lot, lon of the extraction point in
!  SNLIST file.
!
!-----------------------------------------------------------------------
!
    latnot(1)=trulat1
    latnot(2)=trulat2
    CALL setmapr(mapproj,sclfct,latnot,trulon)
    CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr)
    PRINT *, ' dx= ',dx,' dy= ',dy
    xll=xctr-(0.5*(nx-3)*dx)
    yll=yctr-(0.5*(ny-3)*dy)

    DO i=1,nx-1
      xmap(i)=xll+xs(i)
    END DO
    xmap(nx)=2.*xmap(nx-1)-xmap(nx-2)
    DO j=1,ny-1
      ymap(j)=yll+ys(j)
    END DO
    ymap(ny)=2.*ymap(ny-1)-ymap(ny-2)
    CALL xytoll(nx,ny,xmap,ymap,latgr,longr)


    DO isnd=1,nsnd
      IF(locopt == 1) THEN

        IF(slat(isnd) < -90.) EXIT

        CALL lltoxy(1,1,slat(isnd),slon(isnd),xpt(isnd),ypt(isnd))
        xpt(isnd)=xpt(isnd)-xll
        ypt(isnd)=ypt(isnd)-yll

      ELSE
        xpt(isnd)=xpt(isnd)*1000.
        ypt(isnd)=ypt(isnd)*1000.
        xsndmap=xpt(isnd)+xll
        ysndmap=ypt(isnd)+yll
        CALL xytoll(1,1,xsndmap,ysndmap,slat(isnd),slon(isnd))
      END IF

      print*,' isnd, xpt, ypt =', isnd, xpt(isnd), ypt(isnd)
!
!-----------------------------------------------------------------------
!
!  Find location in ARPS grid.
!
!-----------------------------------------------------------------------
!
      CALL setijloc(1,1,nx,ny,xpt(isnd),ypt(isnd),                      &
                    xs,ys,ipt(isnd),jpt(isnd))
!
      WRITE (6,'(2x,a,f12.2,a,f12.2,/2X,a,f12.2,a,f12.2,/2X,a,i6,a,i6)')&
          ' location x= ',(0.001*xpt(isnd)),'   y= ',(0.001*ypt(isnd)), &
          '        lat= ',slat(isnd),' lon= ',slon(isnd),               &
          ' found near pt i= ',ipt(isnd),'   j= ',jpt(isnd)
      WRITE (6,'(12x,a,f12.2,a,f12.2,/10X,a,f12.2,a,f12.2)')            &
          ' x= ',(0.001*xs(ipt(isnd))),                                 &
          ' y= ',(0.001*ys(jpt(isnd))),                                 &
          ' lat= ',latgr(ipt(isnd),jpt(isnd)),                          &
          ' lon= ',longr(ipt(isnd),jpt(isnd))

      IF(ofile(isnd)(1:4) == '    ') ofile(isnd)='SNLIST.FIL'

    END DO
!
!-----------------------------------------------------------------------
!
!  Interpolate (in the horizontal) for the whole vertical column.
!
!-----------------------------------------------------------------------
!
    CALL setdxdy(nx,ny,                                                 &
                 1,nx-1,1,ny-1,                                         &
                 xs,ys,dxfld,dyfld,rdxfld,rdyfld)
    CALL colint(nx,ny,nz,maxsnd,nsnd,                                   &
                xs,ys,zp,xpt,ypt,ipt,jpt,                               &
                uprt, vprt, ptprt, pprt, qvprt,                         &
                ubar, vbar, ptbar, pbar, qvbar,                         &
                su,sv,stheta,spres,shght,sqv,selev,                     &
                dxfld,dyfld,rdxfld,rdyfld,                              &
                slopey,alphay,betay,                                    &
                tem1,nlevs)
!
!-----------------------------------------------------------------------
!
!  Add back storm motion that ARPS subtracts from the sounding winds.
!
!-----------------------------------------------------------------------
!
    DO isnd=1,nsnd
      DO k=1,nlevs
        su(k,isnd)=su(k,isnd)+ustorm
        sv(k,isnd)=sv(k,isnd)+vstorm
      END DO
!
!-----------------------------------------------------------------------
!
!  Convert sounding to desired units/quantities
!
!-----------------------------------------------------------------------
!
      CALL cnvsnd(su(1,isnd),sv(1,isnd),stheta(1,isnd),                 &
                spres(1,isnd),sqv(1,isnd),slon(isnd),                   &
                sdrct(1,isnd),ssped(1,isnd),                            &
                stemp(1,isnd),sdewp(1,isnd),nlevs)
!
!-----------------------------------------------------------------------
!
!  Output sounding to look like GEMPAK SNLIST.FIL
!  to use the Skew-T and Hodograph programs
!  attributed to Bill McCaul.
!
!  Example of what the header looks like:
!
!23456789012345678901234567890123456789012345678901234567890
!SNPARM = PRES;HGHT;TMPC;DWPC;DRCT;SPED
!
!STID = SEP        STNM =    72260   TIME = 920308/1500
!SLAT =    32.21   SLON =   -98.18   SELEV =   399.0
!
!  PRES     HGHT     TMPC     DWPC     DRCT     SPED
!
!-----------------------------------------------------------------------
!
      OPEN(3,FILE=trim(ofile(isnd)),STATUS='unknown')
      WRITE(3,'(/a/)') ' SNPARM = PRES;HGHT;TMPC;DWPC;DRCT;SPED'
      iyr=MOD(iyr,100)
!wdt update
      WRITE(3,'(a,a8,3x,a,i8,3x,a,i2.2,i2.2,i2.2,a1,i2.2,i2.2)')        &
          ' STID = ',stid(isnd),                                        &
          'STNM = ',istnm(isnd),                                        &
          'TIME = ',iyr,imo,iday,'/',ihr,imin
      WRITE(3,'(a,f8.2,3x,a,f8.2,3x,a,f7.1/)')                          &
          ' SLAT = ',slat(isnd),'SLON = ',slon(isnd),                   &
          'SELV = ',selev(isnd)
      WRITE(3,'(6x,a)')                                                 &
          'PRES     HGHT     TMPC     DWPC     DRCT     SPED'
!
!-----------------------------------------------------------------------
!
!    Print out of sounding
!
!-----------------------------------------------------------------------
!
      DO k=1,nlevs
        WRITE(3,'(1x,6(F9.2))')                                         &
              spres(k,isnd),shght(k,isnd),                              &
              stemp(k,isnd),sdewp(k,isnd),                              &
              sdrct(k,isnd),ssped(k,isnd)
      END DO
      CLOSE(3)
      write(6,'(a,a,a)')                                                &
      'Sounding file ',trim(ofile(isnd)),' was produced.'
            
!-----------------------------------------------------------------------
!
!  OUTPUT sounding according to follow format which can be used in 
!         ARPS as base field like May20.snd
!
!              Sounding File Format for ARPS 3.0
!
!  Record 1: a header line, such as "1-D Sounding Input for ARPS"
!            (skipped)
!  Record 2: miscellaneous description of sounding (skipped)
!  Record 3: time of sounding (character*72)
!  Record 4: date of sounding (character*72)
!  Record 5: location of sounding (character*72)
!  Record 6: three character strings designate the sounding
!            data type, e.g.
!            'pressure' 'potential_temperature' 'relative_humidity'.
!            Only the first character of the strings
!            is decoded, and thus the first character should not be
!            left blank.  Note that either upper or lower case may be
!            used.  A more detailed explanation is provided in the
!            portion of the code where these strings are declared.
! ------------------------------
!  The following three strings designate the type of sounding data.
!
!  if height(1:1)='h' or 'H', the sounding is given on height levels
!  if height(1:1)='p' or 'P', the sounding is given on pressure levels
!
!  if therm(1:1) ='t' or 'T', the sounding is specified in temperature
!  if therm(1:1) ='p' or 'P', the sounding is specified in potential
!                             temperature.
!
!  if humid(1:1) ='s' or 'S', the soundings uses specific humidity
!  if humid(1:1) ='r' or 'R', the sounding uses relative humidity,
!  if humid(1:1) ='d' or 'D', the soundings uses dewpoint temperature,
!
!  if wind(1:1) ='x' or 'Y', the sounding is specified in x and y
!                            component of velocity (u and v)
!  if wind(1:1) ='d' or 'D', the sounding is specified in direction
!                            and speed in m/s.
!  if wind(1:1) ='k' or 'K', the sounding is specified in direction
!                            and speed in knots.
!--------------------------------
!  Record 7: Ground-level height (m) and the correspoding pressure
!            (Pascal) when sounding is specified at height levels.
!            When it is given on pressure levels, this record is
!            not used. The last sounding data is assumed to be at
!            the ground level (z=0).
!  Record 8: number of data levels in sounding (variable lvlsnd )
!  Record 9: a line of data column labels (not read in)
!  Record 10 to the end:
!            sounding data in the order 'z/p, pt/t, qv/rh, u, v'
!
!  For records 10  to the end, there is one line of data
!            corresponding to each sounding level.
!
!  Important convention:
!            Line 10 corresponds to the level k = lvlsnd
!            Line 11 corresponds to the level k = (lvlsnd -1)
!            etc.
!
!  Units of the data:
!            pressure: Pascals, height: meters, temperature, dewpoint,
!            and potential temperature: degrees Kelvin, specific
!            humidity kg/kg, relative humidity: 0 to 1.
!
!  CAUTION: The sounding data have to be listed in the order of
!           decreasing height or increasing pressure.
!
!-----------------------------------------------------------------------
!
      WRITE(*,*)  year,month,day,hour,minute,second
      WRITE(sndtime,'(i2,a,i2,a,a)') ihr,':',imin,':','00 CST'
      IF(ihr <=9 ) sndtime(1:1)='0'
      IF(imin <=9 ) sndtime(4:4)='0'
      WRITE(snddate,'(i3,i3,a,i5,a,f6.1,a,f6.1,a)')  iday,imo,',',year, & 
        ' - Domain speed plused (umove=',ustorm,',vmove=',ustorm,')'
      WRITE(sndlocation,'(a,f8.2,3x,a,f8.2,3x,a,f7.1)')                 &
       'SLAT=',slat(isnd),'SLON=',slon(isnd),'SELV=',selev(isnd)

      OPEN(3,FILE=trim(ofile(isnd))//'forARPS',STATUS='unknown')
      WRITE(3,*) '1-D Sounding Input for ARPS'
      WRITE(3,*) 'supercell storm'
      WRITE(3,'(1x,a)')  sndtime
      WRITE(3,'(a)')  snddate
      WRITE(3,'(1x,a)')  sndlocation
      WRITE(3,*) '''height'' ''potential temperature'' ''specific humidity'' ''uv'' '
      WRITE(3,*)   shght(1,isnd), spres(1,isnd)*100
      WRITE(3,*)   nlevs
      WRITE(3,*)   ' height potential  temperature   SH    U         V' 

!
      DO k=nlevs,1,-1
        WRITE(3,'(1x,6(F14.5))')                                        &
              shght(k,isnd),                                            &
              stheta(k,isnd),sqv(k,isnd),                               &
              su(k,isnd),sv(k,isnd)
      END DO
      CLOSE(3)
      write(6,'(a,a,a)')                                                &
      'Sounding file ',trim(ofile(isnd))//'forARPS',' was produced.'

!-----------------------------------------------------------------------

    END DO  ! the number of sounding
  ELSE
    WRITE(6,'(a)') ' Error reading data.  EXTSND ends'
  END IF
  STOP

END PROGRAM ARPSEXTSND 
!
!##################################################################
!##################################################################
!######                                                      ######
!######                 SUBROUTINE COLINT                    ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE colint(nx,ny,nz,maxsnd,nsnd,                                 & 5,8
           xs,ys,zp,xpt,ypt,ipt,jpt,                                    &
           uprt, vprt, ptprt, pprt, qvprt,                              &
           ubar, vbar, ptbar, pbar, qvbar,                              &
           su,sv,stheta,spres,shght,sqv,selev,                          &
           dxfld,dyfld,rdxfld,rdyfld,                                   &
           slopey,alphay,betay,                                         &
           tem1,nlevs)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Interpolates ARPS history data in the horizontal to create
!  a column of data located at point xpt, ypt.
!
!  Bilinear interpolation is used.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  April 1992.
!
!  MODIFICATION HISTORY:
!
!  October, 1992 (K. Brewster)
!  Conversion to ARPS 3.0.
!
!  October, 1994 (K. Brewster)
!  Conversion to ARPS 4.0.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    nx,ny,nz Dimensions of ARPS grids.
!
!    xs       x coordinate of scalar points in physical/comp. space (m)
!    ys       y coordinate of scalar points in physical/comp. space (m)
!    zp       z coordinate of scalar grid points in physical space (m)
!
!    xpt      x coordinate of desired sounding (m)
!    ypt      y coordinate of desired sounding (m)
!
!    ipt      i index of grid point just west of xpt,ypt
!    jpt      j index of grid point just south of xpt,ypt
!
!    uprt     x component of perturbation velocity (m/s)
!    vprt     y component of perturbation velocity (m/s)
!
!    ptprt    Perturbation potential temperature (K)
!    pprt     Perturbation pressure (Pascal)
!
!    qvprt    Perturbation water vapor mixing ratio (kg/kg)
!
!    ubar     Base state x velocity component (m/s)
!    vbar     Base state y velocity component (m/s)
!    ptbar    Base state potential temperature (K)
!    pbar     Base state pressure (Pascal)
!    qvbar    Base state water vapor mixing ratio (kg/kg)
!
!  OUTPUT:
!
!    su       Interpolated u wind component.  (m/s)
!    sv       Interpolated v wind component.  (m/s)
!    stheta   Interpolated potential temperature (K).
!    spres    Interpolated pressure. (Pascals)
!    shght    Interpolated height (meters)
!    sqv      Interpolated water vapor mixing ratio (kg/kg).
!    selev    Interpolated surface elevation (m)
!    nlevs    Number of above-ground sounding levels.
!
!  WORK ARRAYS:
!
!    tem1     Temporary work array.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations:
!
!-----------------------------------------------------------------------
!
!  Arguments -- location data
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx,ny,nz          ! Dimensions of ARPS grids.
  INTEGER :: maxsnd
  INTEGER :: nsnd
  REAL :: xs(nx)               ! x coordinate of grid points in
                               ! physical/comp. space (m)
  REAL :: ys(ny)               ! y coordinate of grid points in
                               ! physical/comp. space (m)
  REAL :: zp(nx,ny,nz)         ! z coordinate of grid points in
                               ! physical space (m)
  REAL :: xpt(maxsnd)          ! location to find in x coordinate (m)
  REAL :: ypt(maxsnd)          ! location to find in y coordinate (m)
  INTEGER :: ipt(maxsnd)       ! i index to the west of desired
                               ! location
  INTEGER :: jpt(maxsnd)       ! j index to the south of desired
                               ! location
!
!-----------------------------------------------------------------------
!
!  Arguments -- model data
!
!-----------------------------------------------------------------------
!
  REAL :: uprt   (nx,ny,nz)    ! Perturbation u-velocity (m/s)
  REAL :: vprt   (nx,ny,nz)    ! Perturbation v-velocity (m/s)
  REAL :: ptprt  (nx,ny,nz)    ! Perturbation potential temperature (K)
  REAL :: pprt   (nx,ny,nz)    ! Perturbation pressure (Pascal)
  REAL :: qvprt  (nx,ny,nz)    ! Perturbation water vapor specific
                               ! humidity (kg/kg)

  REAL :: ubar   (nx,ny,nz)    ! Base state u-velocity (m/s)
  REAL :: vbar   (nx,ny,nz)    ! Base state v-velocity (m/s)
  REAL :: ptbar  (nx,ny,nz)    ! Base state potential temperature (K)
  REAL :: pbar   (nx,ny,nz)    ! Base state pressure (Pascal)
  REAL :: qvbar  (nx,ny,nz)    ! Base state water vapor specific
                               ! humidity (kg/kg)

  REAL :: dxfld(nx)
  REAL :: dyfld(ny)
  REAL :: rdxfld(nx)
  REAL :: rdyfld(ny)
  REAL :: slopey(nx,ny,nz)
  REAL :: alphay(nx,ny,nz)
  REAL :: betay(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
!  Arguments -- Extracted sounding variables
!
!-----------------------------------------------------------------------
!
  REAL :: su(nz,maxsnd)
  REAL :: sv(nz,maxsnd)
  REAL :: stheta(nz,maxsnd)
  REAL :: sqv(nz,maxsnd)
  REAL :: spres(nz,maxsnd)
  REAL :: shght(nz,maxsnd)
  REAL :: selev(maxsnd)
  INTEGER :: nlevs
!
!-----------------------------------------------------------------------
!
!  Temporary work arrays
!
!-----------------------------------------------------------------------
!
  REAL :: tem1(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
!  Functions called
!
!-----------------------------------------------------------------------
!
  REAL :: aint2d
!
!-----------------------------------------------------------------------
!
!  Include files
!
!-----------------------------------------------------------------------
!
  INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
!  Misc. local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,kk,isnd
  REAL :: w2,w3
  REAL :: t1,t2,t3,hmid,tmid,qvsat,rh
  INTEGER :: iorder
  PARAMETER (iorder = 2)
  REAL :: pntint2d
!
!-----------------------------------------------------------------------
!
!  Function f_qvsat and inline directive for Cray PVP
!
!-----------------------------------------------------------------------
!
  REAL :: f_qvsat

!fpp$ expand (f_qvsat)
!dir$ inline always f_qvsat
!*$*  inline routine (f_qvsat)

!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  nlevs=nz-2

  CALL setdrvy(nx,ny,nz,                                                &
               1,nx-1,1,ny-1,1,nz-1,                                    &
               dyfld,rdyfld,zp,                                         &
               slopey,alphay,betay)
  DO isnd=1,nsnd
    DO k=2,nz-1
      shght(k,isnd)=pntint2d(nx,ny,                                     &
               1,nx-1,1,ny-1,                                           &
               iorder,xs,ys,xpt(isnd),ypt(isnd),                        &
               ipt(isnd),jpt(isnd),zp(1,1,k),                           &
               dxfld,dyfld,rdxfld,rdyfld,                               &
               slopey(1,1,k),alphay(1,1,k),betay(1,1,k))
    END DO
  END DO
  DO k=1,nz-1
    DO j=1,ny-1
      DO i=1,nx-1
        tem1(i,j,k)=ptbar(i,j,k)+ptprt(i,j,k)
      END DO
    END DO
  END DO
  CALL setdrvy(nx,ny,nz,                                                &
               1,nx-1,1,ny-1,1,nz-1,                                    &
               dyfld,rdyfld,tem1,                                       &
               slopey,alphay,betay)
  DO isnd=1,nsnd
    DO k=2,nz-1
      stheta(k,isnd)=pntint2d(nx,ny,                                    &
               1,nx-1,1,ny-1,                                           &
               iorder,xs,ys,xpt(isnd),ypt(isnd),                        &
               ipt(isnd),jpt(isnd),tem1(1,1,k),                         &
               dxfld,dyfld,rdxfld,rdyfld,                               &
               slopey(1,1,k),alphay(1,1,k),betay(1,1,k))
    END DO
  END DO
  DO k=1,nz-1
    DO j=1,ny-1
      DO i=1,nx-1
        tem1(i,j,k)=pbar(i,j,k)+pprt(i,j,k)
      END DO
    END DO
  END DO
  CALL setdrvy(nx,ny,nz,                                                &
               1,nx-1,1,ny-1,1,nz-1,                                    &
               dyfld,rdyfld,tem1,                                       &
               slopey,alphay,betay)
  DO isnd=1,nsnd
    DO k=2,nz-1
      spres(k,isnd)=pntint2d(nx,ny,                                     &
               1,nx-1,1,ny-1,                                           &
               iorder,xs,ys,xpt(isnd),ypt(isnd),                        &
               ipt(isnd),jpt(isnd),tem1(1,1,k),                         &
               dxfld,dyfld,rdxfld,rdyfld,                               &
               slopey(1,1,k),alphay(1,1,k),betay(1,1,k))
    END DO
  END DO
  DO k=1,nz-1
    DO j=1,ny-1
      DO i=1,nx-1
        tem1(i,j,k)=qvbar(i,j,k)+qvprt(i,j,k)
      END DO
    END DO
  END DO
  CALL setdrvy(nx,ny,nz,                                                &
               1,nx-1,1,ny-1,1,nz-1,                                    &
               dyfld,rdyfld,tem1,                                       &
               slopey,alphay,betay)
  DO isnd=1,nsnd
    DO k=2,nz-1
      sqv(k,isnd)=pntint2d(nx,ny,                                       &
               1,nx-1,1,ny-1,                                           &
               iorder,xs,ys,xpt(isnd),ypt(isnd),                        &
               ipt(isnd),jpt(isnd),tem1(1,1,k),                         &
               dxfld,dyfld,rdxfld,rdyfld,                               &
               slopey(1,1,k),alphay(1,1,k),betay(1,1,k))
    END DO
  END DO
!
!-----------------------------------------------------------------------
!
!  Get height at scalar points, since zp was defined at w points.
!
!-----------------------------------------------------------------------
!
  DO isnd=1,nsnd
    selev(isnd)=shght(2,isnd)
    DO k=1,nz-1
      shght(k,isnd)=0.5*(shght(k+1,isnd)+shght(k,isnd))
    END DO
  END DO
!
!-----------------------------------------------------------------------
!
!  Form total u wind component at scalar points
!
!-----------------------------------------------------------------------
!
  DO k=1,nz-1
    DO j=1,ny-1
      DO i=1,nx-1
        tem1(i,j,k)=0.5*(ubar(i,j,k)+ubar(i+1,j,k))+                    &
                    0.5*(uprt(i,j,k)+uprt(i+1,j,k))
      END DO
    END DO
  END DO

  CALL setdrvy(nx,ny,nz,                                                &
               1,nx-1,1,ny-1,1,nz-1,                                    &
               dyfld,rdyfld,tem1,                                       &
               slopey,alphay,betay)
  DO isnd=1,nsnd
    DO k=2,nz-1
      su(k,isnd)=pntint2d(nx,ny,                                        &
               1,nx-1,1,ny-1,                                           &
               iorder,xs,ys,xpt(isnd),ypt(isnd),                        &
               ipt(isnd),jpt(isnd),tem1(1,1,k),                         &
               dxfld,dyfld,rdxfld,rdyfld,                               &
               slopey(1,1,k),alphay(1,1,k),betay(1,1,k))
    END DO
  END DO
!
!-----------------------------------------------------------------------
!
!  Form total v wind component at scalar points
!
!-----------------------------------------------------------------------
!
  DO k=1,nz-1
    DO j=1,ny-1
      DO i=1,nx-1
        tem1(i,j,k)=0.5*(vbar(i,j,k)+vbar(i,j+1,k)) +                   &
                    0.5*(vprt(i,j,k)+vprt(i,j+1,k))
      END DO
    END DO
  END DO

  CALL setdrvy(nx,ny,nz,                                                &
               1,nx-1,1,ny-1,1,nz-1,                                    &
               dyfld,rdyfld,tem1,                                       &
               slopey,alphay,betay)
  DO isnd=1,nsnd
    DO k=2,nz-1
      sv(k,isnd)=pntint2d(nx,ny,                                        &
               1,nx-1,1,ny-1,                                           &
               iorder,xs,ys,xpt(isnd),ypt(isnd),                        &
               ipt(isnd),jpt(isnd),tem1(1,1,k),                         &
               dxfld,dyfld,rdxfld,rdyfld,                               &
               slopey(1,1,k),alphay(1,1,k),betay(1,1,k))
    END DO
  END DO
!
!-----------------------------------------------------------------------
!
!  Get a value at the surface, by extrapolating from the
!  2nd and third levels.
!
!-----------------------------------------------------------------------
!
  DO isnd=1,nsnd
    shght(1,isnd)=selev(isnd)
    w3=(shght(1,isnd)-shght(2,isnd))                                    &
        /(shght(3,isnd)-shght(2,isnd))
    w2=(1.-w3)
    su(1,isnd)=w2*    su(2,isnd) + w3*    su(3,isnd)
    sv(1,isnd)=w2*    sv(2,isnd) + w3*    sv(3,isnd)
    IF(stheta(3,isnd) > stheta(2,isnd)) THEN
      stheta(1,isnd)=w2*stheta(2,isnd) + w3*stheta(3,isnd)
    ELSE
      stheta(1,isnd)=stheta(2,isnd)
    END IF
!
!-----------------------------------------------------------------------
!
!  Integrate downward to get the pressure at level 1.
!
!-----------------------------------------------------------------------
!
    t3=stheta(3,isnd)*(spres(3,isnd)/100000.)**rddcp
    t2=stheta(2,isnd)*(spres(2,isnd)/100000.)**rddcp
    hmid=0.5*(shght(2,isnd)+shght(1,isnd))
    tmid=t3+((shght(3,isnd)-hmid)/                                      &
            (shght(3,isnd)-shght(2,isnd)))*(t2-t3)
    spres(1,isnd)=spres(2,isnd)*                                        &
           EXP(g*(shght(2,isnd)-shght(1,isnd))/(rd*tmid))
!
!-----------------------------------------------------------------------
!
!  Use constant RH to extrapolate qv to level 1.
!
!-----------------------------------------------------------------------
!
    qvsat = f_qvsat( spres(2,isnd), t2 )     ! saturated S.H.
    rh=AMIN1((sqv(2,isnd)/qvsat),1.)         ! R.H.
    t1=stheta(1,isnd)*(spres(1,isnd)/100000.)**rddcp
    qvsat = f_qvsat( spres(1,isnd), t1 )
    sqv(1,isnd)=rh*qvsat
  END DO
  RETURN
END SUBROUTINE colint
!
!##################################################################
!##################################################################
!######                                                      ######
!######                 SUBROUTINE CNVSND                    ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE cnvsnd(su,sv,stheta,spres,sqv,slon,                          & 4,2
           sdrct,ssped,stemp,sdewp,nlevs)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Converts units of data extracted from ARPS history data to
!  those required of sounding data. Determines direction and
!  speed from u and v wind components.
!
!  Dew-point formula from Bolton, 1980, MWR pp 1046-1053.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  April 1992.
!
!  MODIFICATION HISTORY:
!
!  October, 1992 (K. Brewster)
!  Conversion to ARPS 3.0.
!
!  10/28/1992 (K. Brewster)
!  Special allowance for low qv-to-dew pt
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    su       Sounding u wind component.  (m/s)
!    sv       Sounding v wind component.  (m/s)
!    stheta   Sounding potential temperature (K).
!    spres    Sounding pressure. (Pascals)
!    sqv      Sounding specific humidity
!    slon     Sounding longitude
!    nlevs    Number of above-ground sounding levels.
!
!  OUTPUT:
!
!    spres    Sounding pressure. (mb)
!    sdrct    Sounding wind direction (degrees from north)
!    ssped    Sounding wind speed (m/s)
!    stemp    Sounding temperature (degrees C)
!    sdewp    Sounding dew point temperature (degrees C)
!
!-----------------------------------------------------------------------
!
!  Variable declarations
!
!-----------------------------------------------------------------------
!
!  Input arguments
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nlevs             ! Number of above-ground sounding levels
  REAL :: su    (nlevs)        ! Sounding u wind component (m/s)
  REAL :: sv    (nlevs)        ! Sounding v wind component (m/s)
  REAL :: stheta(nlevs)        ! Sounding potential temperature (K)
  REAL :: spres (nlevs)        ! Sounding pressure. (Pascals)
  REAL :: sqv   (nlevs)        ! Sounding specific humidity (g/g)
  REAL :: slon                 ! Sounding longitude (degrees E)
!
!-----------------------------------------------------------------------
!
!  Output arguments
!
!-----------------------------------------------------------------------
!
  REAL :: sdrct(nlevs)         ! Sounding wind direction
                               ! (degrees from north)
  REAL :: ssped(nlevs)         ! Sounding wind speed (m/s)
  REAL :: stemp(nlevs)         ! Sounding temperature (degrees C)
  REAL :: sdewp(nlevs)         ! Sounding dew point temperature
                               ! (degrees C)
!
!-----------------------------------------------------------------------
!
!  Constants
!
!-----------------------------------------------------------------------
!
  REAL :: rd2dg
  PARAMETER (rd2dg=(180./3.141592654))
  REAL :: rhmax
  PARAMETER (rhmax=1.0)
!
!-----------------------------------------------------------------------
!
!  Include files
!
!-----------------------------------------------------------------------
!
  INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
!  Misc. local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: k
  REAL :: smix,e,bige,alge
!
  DO k=1,nlevs
!
!-----------------------------------------------------------------------
!
!  Convert u,v to direction and speed
!
!-----------------------------------------------------------------------
!
    CALL uvrotdd(1,1,slon,su(k),sv(k),sdrct(k),ssped(k))
!
!-----------------------------------------------------------------------
!
!  Convert pressure from Pascals to mb
!
!-----------------------------------------------------------------------
!
    spres(k)=spres(k)*0.01
!
!-----------------------------------------------------------------------
!
!  Convert theta to temperature in degrees C.
!
!-----------------------------------------------------------------------
!
    stemp(k)=stheta(k)*((spres(k)/1000.)**rddcp)
    stemp(k)=stemp(k)-273.15
!
!-----------------------------------------------------------------------
!
!  Convert specific humidity to dew-point in degrees C.
!
!-----------------------------------------------------------------------
!
    IF( sqv(k) > 0.) THEN
      smix=sqv(k)/(1.-sqv(k))
      e=(spres(k)*smix)/(0.62197 + smix)
      bige=e/( 1.001 + ( (spres(k) - 100.) / 900.) * 0.0034)
      alge = ALOG(bige/6.112)
      sdewp(k)= (alge * 243.5) / (17.67 - alge)
    ELSE
      sdewp(k)= stemp(k)-30.
    END IF
  END DO
!
  RETURN 

END SUBROUTINE cnvsnd