PROGRAM arpsextsnd,86
!
!##################################################################
!##################################################################
!###### ######
!###### 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
!
!-----------------------------------------------------------------------
!
! 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)
!
! 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
!
! tsfc Temperature at surface (K)
! tsoil Deep soil temperature (K)
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! 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
!
! 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
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 :: 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 :: tsfc (:,:,:) ! Temperature at surface (K)
REAL, ALLOCATABLE :: tsoil (:,:,:) ! Deep soil temperature (K)
REAL, ALLOCATABLE :: wetsfc (:,:,:) ! Surface soil moisture
REAL, ALLOCATABLE :: wetdp (:,:,:) ! Deep soil moisture
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 :: 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,nstyps, ireturn)
IF( ireturn /= 0 ) THEN
PRINT*,'Problem occured when trying to get dimensions from data.'
PRINT*,'Program stopped.'
STOP
END IF
WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz
!
!-----------------------------------------------------------------------
!
! 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(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(tsfc (nx,ny,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, 'arpsextsnd:tsfc')
ALLOCATE(tsoil (nx,ny,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, 'arpsextsnd:tsoil')
ALLOCATE(wetsfc (nx,ny,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, 'arpsextsnd:wetsfc')
ALLOCATE(wetdp (nx,ny,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, 'arpsextsnd:wetdp')
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(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
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.0
stypfrct=0.0
vegtyp=0.0
lai =0.0
roufns =0.0
veg =0.0
tsfc =0.0
tsoil =0.0
wetsfc =0.0
wetdp =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
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,nstyps, &
hinfmt,nchin,grdbasfn(1:lengbf),lengbf, &
filename(1:lenfil),lenfil,time, &
x,y,z,zp, 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, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
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, & 1,1
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