PROGRAM arps2ncdf,70
!
!##################################################################
!##################################################################
!###### ######
!###### PROGRAM ARSP2NCDF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Converts ARPS history files to a netCDF format file.
!
! Reads in a history file produced by ARPS in any ARPS format.
! Converts variables and interpolates to a fixed set of pressure
! levels. Sets up variables needed for LDADS/AWIPS D2d display
! of data.
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster
! 02/19/1999
!
! MODIFICATION HISTORY:
! 08/13/1999
! Fixed MSLP calculation (J. Levit, K. Brewster)
!
!
!-----------------------------------------------------------------------
!
! 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)
!
! w vertical component of velocity in Cartesian
! coordinates (m/s).
!
! ptprt perturbation potential temperature (K)
! pprt perturbation pressure (Pascal)
! uprt perturbation x velocity component (m/s)
! vprt perturbation y velocity component (m/s)
! wprt perturbation z velocity component (m/s)
!
! qv 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)
!
! 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
!
! rain Total rain (raing + rainc)
! raing Grid supersaturation rain
! rainc Cumulus convective rain
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Grid dimensions.
INTEGER :: nstyps ! Maximum number of soil types.
INTEGER :: hinfmt,nhisfile_max,nhisfile,lengbf,nf,lenfil
PARAMETER (nhisfile_max=200)
CHARACTER (LEN=132) :: grdbasfn,hisfile(nhisfile_max)
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc'
INCLUDE 'phycst.inc'
INCLUDE 'arps2ncdf.inc'
INCLUDE 'netcdf.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.
REAL, ALLOCATABLE :: zp(:,:,:) ! The height of the terrain.
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 :: qv (:,:,:) ! Water vapor specific humidity (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
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 :: rain (:,:) ! Total rainfall
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))
REAL, ALLOCATABLE :: e_mb (:,:,:) ! vapor pressure in mb
REAL, ALLOCATABLE :: mix (:,:,:) ! total mixing ratio (kg/kg)
REAL, ALLOCATABLE :: esat_mb(:,:,:) ! saturation vapor pressure in mb
REAL, ALLOCATABLE :: rh (:,:,:) ! Relative humidity in %
REAL, ALLOCATABLE :: t_dew (:,:,:) ! dewpoint temp. in degrees K
!
!-----------------------------------------------------------------------
!
! 2-D stability index arrays
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: lcl(:,:) ! lifting condensation level
REAL, ALLOCATABLE :: lfc(:,:) ! level of free convection
REAL, ALLOCATABLE :: el(:,:) ! equilibrium level
REAL, ALLOCATABLE :: twdf(:,:) ! max. wet bulb pot. temp. difference
REAL, ALLOCATABLE :: li(:,:) ! lifted index
REAL, ALLOCATABLE :: pbe(:,:) ! CAPE
REAL, ALLOCATABLE :: mbe(:,:) ! Moist CAPE
REAL, ALLOCATABLE :: nbe(:,:) ! CIN
REAL, ALLOCATABLE :: tcap(:,:) ! Cap Strength
!
REAL, ALLOCATABLE :: heli(:,:) ! helicity
REAL, ALLOCATABLE :: brn(:,:) ! Bulk Richardson Number (Weisman and Klemp)
REAL, ALLOCATABLE :: brnu(:,:) ! Shear parameter of BRN, "U"
REAL, ALLOCATABLE :: srlfl(:,:) ! storm-relative low-level flow (0-2km AGL)
REAL, ALLOCATABLE :: srmfl(:,:) ! storm-relative mid-level flow (2-9km AGL)
REAL, ALLOCATABLE :: shr37(:,:) ! 7km - 3km wind shear
REAL, ALLOCATABLE :: ustrm(:,:) ! Estimated storm motion (modified Bob Johns)
REAL, ALLOCATABLE :: vstrm(:,:) ! Estimated storm motion (modified Bob Johns)
REAL, ALLOCATABLE :: blcon(:,:) ! Boundary layer convergence
!
!-----------------------------------------------------------------------
!
! Work Arrays
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: tem1(:,:,:)
REAL, ALLOCATABLE :: tem2(:,:,:)
REAL, ALLOCATABLE :: tem3(:,:,:)
REAL, ALLOCATABLE :: tem4(:,:,:)
REAL, ALLOCATABLE :: tem2d1(:,:)
REAL, ALLOCATABLE :: tem2d2(:,:)
REAL, ALLOCATABLE :: tem2d3(:,:)
REAL, ALLOCATABLE :: tem2d4(:,:)
REAL, ALLOCATABLE :: wrk1(:),wrk2(:),wrk3(:),wrk4(:),wrk5(:),wrk6(:)
REAL, ALLOCATABLE :: wrk7(:),wrk8(:),wrk9(:),wrk10(:),wrk11(:),wrk12(:)
REAL, ALLOCATABLE :: xs(:)
REAL, ALLOCATABLE :: ys(:)
REAL, ALLOCATABLE :: zps(:,:,:)
REAL, ALLOCATABLE :: zps_km(:,:,:)
REAL, ALLOCATABLE :: mf2d(:,:)
REAL, ALLOCATABLE :: coriolis(:,:)
REAL, ALLOCATABLE :: spacing(:,:)
!
!-----------------------------------------------------------------------
!
! Misc ARPS variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nch
REAL :: time
REAL :: latnot(2)
LOGICAL :: init
!
!-----------------------------------------------------------------------
!
! netCDF dimensions
!
! nprlvl is difined in arps2cdf.inc
!
!-----------------------------------------------------------------------
!
INTEGER :: nxcdf,nycdf,mxtime
PARAMETER(mxtime=40)
INTEGER :: n3dvar,n2dvar,nvartot,nstvar
PARAMETER (n3dvar=6, &
n2dvar=28, &
nvartot=(n3dvar+n2dvar), &
nstvar=3)
!
!-----------------------------------------------------------------------
!
! netCDF variables
!
!-----------------------------------------------------------------------
!
INTEGER :: istatus,ncid
INTEGER :: dimidrec,dimidtot,dimidnt,dimidnav
INTEGER :: dimidnx,dimidny,dimid1,dimidnz,dimchrlvl,dimnamlen
INTEGER :: vtmrefid,valtimid,reftimid,origid,modelid
!
INTEGER :: vecistr(2)
INTEGER :: planeistr(4)
INTEGER :: volistart(4)
DATA vecistr /1,1/
DATA planeistr /1,1,1,1/
DATA volistart /1,1,1,1/
!
INTEGER :: planedim(4)
INTEGER :: voldim(4)
INTEGER :: lvldim(2)
INTEGER :: invdim(2)
INTEGER :: planelen(4)
INTEGER :: lvllen(2)
INTEGER :: sfclen(2)
INTEGER :: vollen(4)
INTEGER :: invlen(2)
!
REAL :: vrange(2)
!
!-----------------------------------------------------------------------
!
! netCDF output variables
!
!-----------------------------------------------------------------------
!
INTEGER :: v3did(n3dvar)
INTEGER :: v3dlvlid(n3dvar)
INTEGER :: v2dinvid(n2dvar)
INTEGER :: v3dinvid(n3dvar)
INTEGER :: v2did(n2dvar)
INTEGER :: vstid(nstvar)
INTEGER :: v2dlvlid(n2dvar)
INTEGER :: vtmref(mxtime)
REAL*8 valtime(mxtime)
REAL*8 reftime(mxtime)
INTEGER :: ntime
!
CHARACTER (LEN=4) :: v3dnam(n3dvar)
CHARACTER (LEN=4) :: v2dnam(n2dvar)
CHARACTER (LEN=14) :: vstnam(nstvar)
CHARACTER (LEN=10) :: v3dlvl(nprlvl)
CHARACTER (LEN=10) :: v2dlvl
CHARACTER (LEN=30) :: v3dlngnam(n3dvar)
CHARACTER (LEN=30) :: v2dlngnam(n2dvar)
CHARACTER (LEN=30) :: vstlngnam(nstvar)
CHARACTER (LEN=30) :: v3dunits(n3dvar)
CHARACTER (LEN=30) :: v2dunits(n2dvar)
CHARACTER (LEN=30) :: vstunits(nstvar)
CHARACTER (LEN=nprlvl) :: inventory
CHARACTER (LEN=1) :: inventory_sfc
REAL :: v3dmin(n3dvar)
REAL :: v2dmin(n2dvar)
REAL :: v3dmax(n3dvar)
REAL :: v2dmax(n2dvar)
!
CHARACTER (LEN=10) :: v2dlvlnam
CHARACTER (LEN=10) :: v3dlvlnam
CHARACTER (LEN=13) :: v2dinv
CHARACTER (LEN=13) :: v3dinv
!
DATA vtmref /mxtime*0/
!
!-----------------------------------------------------------------------
!
! Variable indexes and descriptors
!
!-----------------------------------------------------------------------
!
INTEGER :: idxgh,idxrh,idxt,idxuw,idxvw,idxww
PARAMETER (idxgh=1,idxrh=2,idxt=3, &
idxuw=4,idxvw=5,idxww=6)
!
DATA v3dnam /'gh','rh','t','uw','vw','ww'/
DATA v3dlngnam /'Geopotential Height', &
'Relative Humidity', &
'Temperature', &
'u Wind Component', &
'v Wind Component', &
'w Wind Component'/
DATA v3dunits /'geopotential meters', &
'percent', &
'degrees K', &
'meters/second', &
'meters/second', &
'meters/second'/
DATA v3dmin / 0., 0.,150.,-300.,-300.,-100./
DATA v3dmax /40000.,110.,400., 300., 300., 100./
!
INTEGER :: idxmslp,idxp,idxlgsp,idxcp,idxtp
INTEGER :: idxsfu,idxsfv,idxsft,idxdpt
INTEGER :: idxsh,idxept,idxsli,idxcape,idxcin
INTEGER :: idxlcl,idxlfc,idxel,idxtwdf,idxtcap
INTEGER :: idxshr37,idxustrm,idxvstrm
INTEGER :: idxsrlfl,idxsrmfl,idxheli,idxbrn,idxbrnu,idxblcon
PARAMETER (idxmslp=1, &
idxp =2, &
idxlgsp=3, &
idxcp =4, &
idxtp =5, &
idxsfu =6, &
idxsfv =7, &
idxsft =8, &
idxdpt =9, &
idxsh =10, &
idxept =11, &
idxsli =12, &
idxcape=13, &
idxcin =14, &
idxlcl =15, &
idxlfc =16, &
idxel =17, &
idxtwdf =18, &
idxtcap =19, &
idxshr37=20, &
idxustrm=21, &
idxvstrm=22, &
idxsrlfl=23, &
idxsrmfl=24, &
idxheli =25, &
idxbrn =26, &
idxbrnu =27, &
idxblcon=28)
DATA v2dnam /'mslp','p','lgsp','cp','tp','sfu','sfv', &
'sft','dpt','sh','ept','sli','cape','cin','lcl', &
'lfc','el','twdf','tcap','shr37','ustrm','vstrm', &
'srlfl','srmfl','heli','brn','brnu','blcon'/
DATA v2dlngnam /'Mean Sea Level Pressure', &
'Surface Pressure', &
'Grid Scale Precipitation', &
'Convective Precipitation', &
'Total Precipitation', &
'Surface u Wind Component', &
'Surface v Wind Component', &
'Surface Temperature', &
'Surface Dew Point', &
'Specific Humidity', &
'Theta-e', &
'Surface Lifted Index', &
'CAPE', &
'CIN', &
'Lifting Condensation Lvl', &
'Level of Free Convection', &
'Equilibrium Level', &
'Max Wet-Bulb Temp Diff', &
'Cap Strength', &
'3-7km Shear', &
'Est Storm Motion u comp', &
'Est Storm Motion v comp', &
'Storm Rel Low-Level Flow', &
'Storm Rel Mid-Level Flow', &
'Storm Rel Helicity', &
'Bulk Richardson Number', &
'BRN Shear u', &
'Bound-Layer Conv x 1000'/
DATA v2dunits /'Pascals','Pascals','mm','mm','mm', &
'meters/second','meters/second', &
'degrees K','degrees K','kg/kg', &
'degrees K','degrees C','J/kg','J/kg', &
'meters','meters','meters','degrees C','degrees C', &
'1/second','meters/second','meters/second', &
'meters/second','meters/second','m2/s2', &
'unitless','meters/second','1/second'/
DATA v2dmin / 80000.,50000.,0.,0.,0., &
-100.,-100., &
-100.,-100.,0., &
200.,-100.,0.,0., &
0.,0.,0.,-100.,0.,0.,-100.,-100., &
-100.,-100.,-900.,0.,0.,-10./
DATA v2dmax / 110000.,120000.,1000.,1000.,1000., &
100.,100., &
100.,100.,1., &
500.,100.,10000.,10000., &
40000.,40000.,40000.,100.,100.,1.,100.,100., &
100.,100.,900.,900.,100.,10./
!
INTEGER :: idxtop,idxcor,idxspa
PARAMETER (idxtop=1,idxcor=2,idxspa=3)
DATA vstnam /'staticTopo', &
'staticCoriolis', &
'staticSpacing'/
DATA vstlngnam /'Topography', &
'Coriolis parameter', &
'Grid spacing'/
DATA vstunits /'meters', &
'/second', &
'meters'/
!
CHARACTER (LEN=20) :: cproj
!
! The following are the projections supported by LDAD/AWIPS
! in their ordering/naming convention
!
CHARACTER (LEN=20) :: chproj(17)
DATA chproj /'STEREOGRAPHIC', &
'ORTHOGRAPHIC', &
'LAMBERT_CONFORMAL', &
'AZIMUTHAL_EQUAL_AREA', &
'GNOMONIC', &
'AZIMUTHAL_EQUIDISTANT', &
'SATELLITE_VIEW', &
'CYLINDRICAL_EQUIDISTANT', &
'MERCATOR', &
'MOLLWEIDE', &
'NULL', &
'NULL', &
'NULL', &
'NULL', &
'NULL', &
'AZIMUTH_RANGE', &
'RADAR_AZ_RAN'/
!
! kproj is the index in the LDAD/AWIPS map projection list
! for the mapproj number in the ARPS file
!
INTEGER :: kproj(3)
DATA kproj /1,3,9/
!
REAL, ALLOCATABLE :: static2d(:,:,:)
REAL, ALLOCATABLE :: cdf2d(:,:,:,:)
REAL, ALLOCATABLE :: cdf3d(:,:,:,:)
!
!-----------------------------------------------------------------------
!
! Constants
!
!-----------------------------------------------------------------------
!
INTEGER :: itim1970
PARAMETER (itim1970=315619200)
CHARACTER (LEN=8) :: cdldate
CHARACTER (LEN=40) :: depictor
CHARACTER (LEN=132) :: origin,model
PARAMETER (cdldate='19990301', &
depictor='TEST_ARPS', &
origin='HubCAPS', &
model='ARPS 4.4.1')
!
!-----------------------------------------------------------------------
!
! Namelists
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=132) :: cdfname
INTEGER :: ipktyp,nbits
NAMELIST /ncdf_options/ cdfname,ipktyp,nbits
!
!-----------------------------------------------------------------------
!
! External functions
!
!-----------------------------------------------------------------------
!
REAL :: wmr2td,oe,dpt
EXTERNAL wmr2td,oe,dpt
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=10) :: nzstr
REAL :: latll,lonll,latur,lonur,dxkm,dykm,latdxdy,londxdy,rotate
INTEGER :: ivar,ls,itime,itimref,iproj
!
INTEGER :: i,j,k,klev,ifile,ireturn,imid,jmid
REAL :: rlnpcdf,r2d
REAL :: ctrx,ctry,swx,swy
REAL :: gamma,ex1,ex2,rln700,p00,t00
REAL :: prmb,tdew
REAL, ALLOCATABLE :: p_mb(:,:,:)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Initializations
!
!-----------------------------------------------------------------------
!
!
WRITE(6,'(6(/a))') &
'###############################################################',&
'# #',&
'# Welcome to ARPS2NCDF, a program that reads in history files #',&
'# generated by ARPS and produces a netCDF format file. #',&
'# #',&
'###############################################################'
!
!-----------------------------------------------------------------------
!
! Get the names of the input data files.
!
!-----------------------------------------------------------------------
!
CALL get_input_file_names
(hinfmt,grdbasfn,hisfile,nhisfile)
lengbf = len_trim(grdbasfn)
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
nxcdf=(nx-3)
nycdf=(ny-3)
planelen(1)=nxcdf
planelen(2)=nycdf
planelen(3)=1
planelen(4)=1
lvllen(1)=10
lvllen(2)=nprlvl
sfclen(1)=10
sfclen(2)=1
vollen(1)=nxcdf
vollen(2)=nycdf
vollen(3)=nprlvl
vollen(4)=1
!
!-----------------------------------------------------------------------
!
! Get output options and the name of the grid/base data set.
!
!-----------------------------------------------------------------------
!
ipktyp=1
nbits=16
READ(5,ncdf_options,END=900)
ntime=nhisfile
lengbf=LEN_trim(grdbasfn)
WRITE(6,'(/a,a)')' The grid/base name is ', grdbasfn(1:lengbf)
ALLOCATE(x (nx))
ALLOCATE(y (ny))
ALLOCATE(z (nz))
ALLOCATE(zp (nx,ny,nz))
ALLOCATE(uprt (nx,ny,nz))
ALLOCATE(vprt (nx,ny,nz))
ALLOCATE(wprt (nx,ny,nz))
ALLOCATE(ptprt (nx,ny,nz))
ALLOCATE(pprt (nx,ny,nz))
ALLOCATE(qvprt (nx,ny,nz))
ALLOCATE(qv (nx,ny,nz))
ALLOCATE(qc (nx,ny,nz))
ALLOCATE(qr (nx,ny,nz))
ALLOCATE(qi (nx,ny,nz))
ALLOCATE(qs (nx,ny,nz))
ALLOCATE(qh (nx,ny,nz))
ALLOCATE(tke (nx,ny,nz))
ALLOCATE(kmh (nx,ny,nz))
ALLOCATE(kmv (nx,ny,nz))
ALLOCATE(ubar (nx,ny,nz))
ALLOCATE(vbar (nx,ny,nz))
ALLOCATE(wbar (nx,ny,nz))
ALLOCATE(ptbar (nx,ny,nz))
ALLOCATE(pbar (nx,ny,nz))
ALLOCATE(rhobar (nx,ny,nz))
ALLOCATE(qvbar (nx,ny,nz))
ALLOCATE(soiltyp (nx,ny,nstyps))
ALLOCATE(stypfrct(nx,ny,nstyps))
ALLOCATE(vegtyp (nx,ny))
ALLOCATE(lai (nx,ny))
ALLOCATE(roufns (nx,ny))
ALLOCATE(veg (nx,ny))
ALLOCATE(tsfc (nx,ny,0:nstyps))
ALLOCATE(tsoil (nx,ny,0:nstyps))
ALLOCATE(wetsfc (nx,ny,0:nstyps))
ALLOCATE(wetdp (nx,ny,0:nstyps))
ALLOCATE(wetcanp(nx,ny,0:nstyps))
ALLOCATE(snowdpth(nx,ny))
ALLOCATE(rain (nx,ny))
ALLOCATE(raing(nx,ny))
ALLOCATE(rainc(nx,ny))
ALLOCATE(prcrate(nx,ny,4))
ALLOCATE(radfrc(nx,ny,nz))
ALLOCATE(radsw (nx,ny))
ALLOCATE(rnflx (nx,ny))
ALLOCATE(usflx (nx,ny))
ALLOCATE(vsflx (nx,ny))
ALLOCATE(ptsflx(nx,ny))
ALLOCATE(qvsflx(nx,ny))
ALLOCATE(e_mb (nx,ny,nz))
ALLOCATE(mix (nx,ny,nz))
ALLOCATE(esat_mb(nx,ny,nz))
ALLOCATE(rh (nx,ny,nz))
ALLOCATE(t_dew (nx,ny,nz))
ALLOCATE(lcl(nx,ny))
ALLOCATE(lfc(nx,ny))
ALLOCATE(el(nx,ny))
ALLOCATE(twdf(nx,ny))
ALLOCATE(li(nx,ny))
ALLOCATE(pbe(nx,ny))
ALLOCATE(mbe(nx,ny))
ALLOCATE(nbe(nx,ny))
ALLOCATE(tcap(nx,ny))
ALLOCATE(tem1(nx,ny,nz))
ALLOCATE(tem2(nx,ny,nz))
ALLOCATE(tem3(nx,ny,nz))
ALLOCATE(tem4(nx,ny,nz))
ALLOCATE(tem2d1(nx,ny))
ALLOCATE(tem2d2(nx,ny))
ALLOCATE(tem2d3(nx,ny))
ALLOCATE(tem2d4(nx,ny))
ALLOCATE(wrk1(nz),wrk2(nz),wrk3(nz),wrk4(nz),wrk5(nz),wrk6(nz))
ALLOCATE(wrk7(nz),wrk8(nz),wrk9(nz),wrk10(nz),wrk11(nz),wrk12(nz))
ALLOCATE(xs(nx))
ALLOCATE(ys(ny))
ALLOCATE(zps(nx,ny,nz))
ALLOCATE(zps_km(nx,ny,nz))
ALLOCATE(p_mb(nx,ny,nz))
ALLOCATE(heli (nx,ny))
ALLOCATE(brn (nx,ny))
ALLOCATE(brnu (nx,ny))
ALLOCATE(srlfl(nx,ny))
ALLOCATE(srmfl(nx,ny))
ALLOCATE(shr37(nx,ny))
ALLOCATE(ustrm(nx,ny))
ALLOCATE(vstrm(nx,ny))
ALLOCATE(blcon(nx,ny))
ALLOCATE(mf2d(nx,ny))
ALLOCATE(coriolis(nx,ny))
ALLOCATE(spacing(nx,ny))
ALLOCATE(static2d(nxcdf,nycdf,nstvar))
ALLOCATE(cdf2d(nxcdf,nycdf,1,n2dvar))
ALLOCATE(cdf3d(nxcdf,nycdf,nprlvl,n3dvar))
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
rhobar =0.0
qvbar =0.0
qv =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
rain =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
e_mb =0.0
mix =0.0
esat_mb =0.0
rh =0.0
t_dew =0.0
lcl =0.0
lfc =0.0
el =0.0
twdf=0.0
li =0.0
pbe =0.0
mbe =0.0
nbe =0.0
tcap=0.0
tem1 =0.0
tem2 =0.0
tem3 =0.0
tem4 =0.0
tem2d1=0.0
tem2d2=0.0
tem2d3=0.0
tem2d4=0.0
wrk1 = 0.0
wrk2 = 0.0
wrk3 = 0.0
wrk4 = 0.0
wrk5 = 0.0
wrk6 = 0.0
wrk7 = 0.0
wrk8 = 0.0
wrk9 = 0.0
wrk10= 0.0
wrk11= 0.0
wrk12= 0.0
xs=0.0
ys=0.0
zps=0.0
zps_km=0.0
p_mb =0.0
heli =0.0
brn =0.0
brnu =0.0
srlfl=0.0
srmfl=0.0
shr37=0.0
ustrm=0.0
vstrm=0.0
blcon=0.0
mf2d=0.0
coriolis=0.0
spacing=0.0
init=.false.
DO ifile=1,nhisfile
lenfil = LEN(hisfile(ifile))
CALL strlnth
( hisfile(ifile), lenfil)
WRITE(6,'(/a,/1x,a)')' The data set name is ', &
hisfile(ifile)(1:lenfil)
!
!-----------------------------------------------------------------------
!
! Read all input data arrays
!
!-----------------------------------------------------------------------
!
CALL dtaread
(nx,ny,nz,nstyps,hinfmt,nch,grdbasfn(1:lengbf), &
lengbf, &
hisfile(ifile)(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
IF( .NOT.init ) THEN
!
!-----------------------------------------------------------------------
!
! Establish coordinate for scalar fields.
!
!-----------------------------------------------------------------------
!
DO i=1,nx-1
xs(i)=0.5*(x(i)+x(i+1))
END DO
xs(nx)=2.*xs(nx-1)-xs(nx-2)
DO j=1,ny-1
ys(j)=0.5*(y(j)+y(j+1))
END DO
ys(ny)=2.*ys(ny-1)-ys(ny-2)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
zps(i,j,k)=0.5*(zp(i,j,k)+zp(i,j,k+1))
END DO
END DO
END DO
! nf_noerr = 0 ! correct??
!
!-----------------------------------------------------------------------
!
! Open netCDF file
!
!-----------------------------------------------------------------------
!
istatus=nf_create(cdfname,nf_clobber,ncid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_create',istatus)
!
!-----------------------------------------------------------------------
!
! Define dimensions
!
!-----------------------------------------------------------------------
!
IF(nprlvl < 10) THEN
WRITE(nzstr,'(a,i1)') 'levels_',nprlvl
ELSE IF(nprlvl < 100) THEN
WRITE(nzstr,'(a,i2)') 'levels_',nprlvl
ELSE
WRITE(nzstr,'(a,i3)') 'levels_',nprlvl
END IF
!
istatus=nf_def_dim(ncid,'record',nf_unlimited,dimidrec)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim record',istatus)
istatus=nf_def_dim(ncid,'n_valtimes',ntime,dimidnt)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim ntime',istatus)
istatus=nf_def_dim(ncid,'data_variables',nvartot,dimidtot)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim nvartot',istatus)
istatus=nf_def_dim(ncid,'charsPerLevel',10,dimchrlvl)
IF (istatus /= nf_noerr) &
CALL handle_err
('nf_def_dim charsPerLevel',istatus)
istatus=nf_def_dim(ncid,'namelen',132,dimnamlen)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim namelen',istatus)
istatus=nf_def_dim(ncid,'x',nxcdf,dimidnx)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim nx',istatus)
istatus=nf_def_dim(ncid,'y',nycdf,dimidny)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim ny',istatus)
istatus=nf_def_dim(ncid,'levels_1',1,dimid1)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim 1',istatus)
istatus=nf_def_dim(ncid,nzstr,nprlvl,dimidnz)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim levels',istatus)
istatus=nf_def_dim(ncid,'nav',1,dimidnav)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_dim nav',istatus)
!
planedim(1)=dimidnx
planedim(2)=dimidny
planedim(3)=dimid1
planedim(4)=dimidrec
voldim(1)=dimidnx
voldim(2)=dimidny
voldim(3)=dimidnz
voldim(4)=dimidrec
lvldim(1)=dimchrlvl
lvldim(2)=dimidnz
invdim(1)=dimidnz
invdim(2)=dimidrec
!
!-----------------------------------------------------------------------
!
! Define 3-d variables and attributes
!
!-----------------------------------------------------------------------
!
DO ivar=1,n3dvar
vrange(1)=v3dmin(ivar)
vrange(2)=v3dmax(ivar)
istatus=nf_def_var(ncid,v3dnam(ivar),nf_float,4, &
voldim,v3did(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var 3d',istatus)
ls=LEN(v3dlngnam(ivar))
CALL strlnth
(v3dlngnam(ivar),ls)
istatus=nf_put_att_text(ncid,v3did(ivar),'long_name', &
ls,v3dlngnam(ivar)(1:ls))
ls=LEN(v3dunits(ivar))
CALL strlnth
(v3dunits(ivar),ls)
istatus=nf_put_att_text(ncid,v3did(ivar),'units', &
ls,v3dunits(ivar)(1:ls))
istatus=nf_put_att_real(ncid,v3did(ivar),'valid_range', &
nf_float,2,vrange)
istatus=nf_put_att_real(ncid,v3did(ivar),'_FillValue', &
nf_float,1,-99999.)
istatus=nf_put_att_int(ncid,v3did(ivar),'_n3D', &
nf_int,1,nprlvl)
istatus=nf_put_att_text(ncid,v3did(ivar),'levels', &
2,'MB')
!
ls=LEN(v3dnam(ivar))
CALL strlnth
(v3dnam(ivar),ls)
WRITE(v3dlvlnam,'(a,a)') v3dnam(ivar)(1:ls),'Levels'
istatus=nf_def_var(ncid,v3dlvlnam,nf_char,2, &
lvldim,v3dlvlid(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var lvl 3d',istatus)
!
WRITE(v3dinv,'(a,a)') v3dnam(ivar)(1:ls),'Inventory'
istatus=nf_def_var(ncid,v3dinv,nf_char,2, &
invdim,v3dinvid(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var inv 3d',istatus)
!
END DO
!
!-----------------------------------------------------------------------
!
! Define 2-d variables and attributes
!
!-----------------------------------------------------------------------
!
invdim(1)=dimid1
invdim(2)=dimidrec
lvldim(2)=dimid1
DO ivar=1,n2dvar
vrange(1)=v2dmin(ivar)
vrange(2)=v2dmax(ivar)
istatus=nf_def_var(ncid,v2dnam(ivar),nf_float,4, &
planedim,v2did(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var 2d',istatus)
ls=LEN(v2dlngnam(ivar))
CALL strlnth
(v2dlngnam(ivar),ls)
istatus=nf_put_att_text(ncid,v2did(ivar),'long_name', &
ls,v2dlngnam(ivar)(1:ls))
ls=LEN(v2dunits(ivar))
CALL strlnth
(v2dunits(ivar),ls)
istatus=nf_put_att_text(ncid,v2did(ivar),'units', &
ls,v2dunits(ivar)(1:ls))
istatus=nf_put_att_real(ncid,v2did(ivar),'valid_range', &
nf_float,2,vrange)
istatus=nf_put_att_real(ncid,v2did(ivar),'_FillValue', &
nf_float,1,-99999.)
istatus=nf_put_att_int(ncid,v2did(ivar),'_n3D', &
nf_int,1,0)
IF(ivar == idxmslp) THEN
istatus=nf_put_att_text(ncid,v2did(ivar),'levels', &
3,'MSL')
ELSE
istatus=nf_put_att_text(ncid,v2did(ivar),'levels', &
3,'SFC')
END IF
!
!
ls=LEN(v2dnam(ivar))
CALL strlnth
(v2dnam(ivar),ls)
WRITE(v2dlvlnam,'(a,a)') v2dnam(ivar)(1:ls),'Levels'
istatus=nf_def_var(ncid,v2dlvlnam,nf_char,2, &
lvldim,v2dlvlid(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var lvl 2d',istatus)
!
WRITE(v2dinv,'(a,a)') v2dnam(ivar)(1:ls),'Inventory'
istatus=nf_def_var(ncid,v2dinv,nf_char,2, &
invdim,v2dinvid(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var inv 2d',istatus)
END DO
!
!-----------------------------------------------------------------------
!
! Define 1-d variables
!
!-----------------------------------------------------------------------
!
istatus=nf_def_var(ncid,'valtimeMINUSreftime',nf_int,1, &
dimidnt,vtmrefid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var vtmref',istatus)
istatus=nf_put_att_text(ncid,vtmrefid,'units', &
7,'seconds')
istatus=nf_def_var(ncid,'reftime',nf_double,1, &
dimidnt,reftimid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var reftim',istatus)
istatus=nf_put_att_text(ncid,reftimid,'units', &
33,'seconds since 1970-1-1 00:00:00.0')
istatus=nf_def_var(ncid,'valtime',nf_double,1, &
dimidnt,valtimid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var valtime',istatus)
istatus=nf_put_att_text(ncid,vtmrefid,'units', &
33,'seconds since 1970-1-1 00:00:00.0')
istatus=nf_def_var(ncid,'origin',nf_char,1, &
dimnamlen,origid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var orig',istatus)
istatus=nf_def_var(ncid,'model',nf_char,1, &
dimnamlen,modelid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var model',istatus)
!
! Define static variables
!
DO ivar=1,nstvar
istatus=nf_def_var(ncid,vstnam(ivar),nf_float,2, &
planedim,vstid(ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_def_var static',istatus)
ls=LEN(vstlngnam(ivar))
CALL strlnth
(vstlngnam(ivar),ls)
istatus=nf_put_att_text(ncid,vstid(ivar),'long_name', &
ls,vstlngnam(ivar)(1:ls))
ls=LEN(vstunits(ivar))
CALL strlnth
(vstunits(ivar),ls)
istatus=nf_put_att_text(ncid,vstid(ivar),'units', &
ls,vstunits(ivar)(1:ls))
END DO
!
!-----------------------------------------------------------------------
!
! Global Attributes
!
!-----------------------------------------------------------------------
!
latnot(1)=trulat1
latnot(2)=trulat2
CALL setmapr
( mapproj, 1.0 , latnot , trulon)
CALL lltoxy
( 1,1, ctrlat,ctrlon, ctrx, ctry )
dx=x(3)-x(2)
dy=y(3)-y(2)
dxkm=0.001*dx
dykm=0.001*dy
swx = ctrx - (FLOAT(nx-3)/2.) * dx
swy = ctry - (FLOAT(ny-3)/2.) * dy
CALL setorig
( 1, swx, swy)
!
CALL xytoll
(1,1,xs(2),ys(2),latll,lonll)
CALL xytoll
(1,1,xs(nx-2),ys(ny-2),latur,lonur)
!
IF(mapproj > 0) THEN
iproj=kproj(mapproj)
cproj=chproj(iproj)
ELSE
iproj=0
cproj='NONE'
END IF
!
IF(mapproj == 2) THEN
latdxdy=0.5*(trulat1+trulat2)
ELSE
latdxdy=trulat1
END IF
londxdy=ctrlon
CALL xytoll
(nx,ny,xs,ys,coriolis,tem1)
CALL xytomf
(nx,ny,xs,ys,mf2d)
r2d = ATAN(1.0)*4.0/180.0
DO j=1,ny-1
DO i=1,nx-1
coriolis(i,j) = 2.*omega*SIN( r2d * coriolis(i,j) )
spacing(i,j) = dx*mf2d(i,j)
END DO
END DO
!
WRITE(6,'(a,a)') ' cdl date ',cdldate
!
istatus=nf_put_att_text(ncid,nf_global,'cdlDate', &
8,cdldate)
ls=LEN(depictor)
CALL strlnth
(depictor,ls)
istatus=nf_put_att_text(ncid,nf_global,'depictorName', &
ls,depictor)
istatus=nf_put_att_int(ncid,nf_global,'projIndex', &
nf_int,1,iproj)
ls=LEN(cproj)
CALL strlnth
(cproj,ls)
istatus=nf_put_att_text(ncid,nf_global,'projName', &
ls,cproj)
istatus=nf_put_att_real(ncid,nf_global,'centralLat', &
nf_float,1,ctrlat)
istatus=nf_put_att_real(ncid,nf_global,'centralLon', &
nf_float,1,ctrlon)
rotate=ctrlon-trulon
istatus=nf_put_att_real(ncid,nf_global,'rotation', &
nf_float,1,rotate)
istatus=nf_put_att_real(ncid,nf_global,'lat00', &
nf_float,1,latll)
istatus=nf_put_att_real(ncid,nf_global,'lon00', &
nf_float,1,lonll)
istatus=nf_put_att_real(ncid,nf_global,'latNxNy', &
nf_float,1,latur)
istatus=nf_put_att_real(ncid,nf_global,'lonNxNy', &
nf_float,1,lonur)
istatus=nf_put_att_real(ncid,nf_global,'dxKm', &
nf_float,1,dxkm)
istatus=nf_put_att_real(ncid,nf_global,'dyKm', &
nf_float,1,dykm)
istatus=nf_put_att_real(ncid,nf_global,'latDxDy', &
nf_float,1,latdxdy)
istatus=nf_put_att_real(ncid,nf_global,'lonDxDy', &
nf_float,1,londxdy)
!
!-----------------------------------------------------------------------
!
! End define mode
!
!-----------------------------------------------------------------------
!
istatus=nf_enddef(ncid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_enddef',istatus)
!
!-----------------------------------------------------------------------
!
! Set inventory arrays.
!
!-----------------------------------------------------------------------
!
DO k=1,nprlvl
inventory(k:k)='1'
IF(iprlvl(k) > 999) THEN
WRITE(v3dlvl(k),'(a,i4)') 'MB ',iprlvl(k)
ELSE IF(iprlvl(k) > 99) THEN
WRITE(v3dlvl(k),'(a,i3)') 'MB ',iprlvl(k)
ELSE
WRITE(v3dlvl(k),'(a,i2)') 'MB ',iprlvl(k)
END IF
END DO
!
inventory_sfc='1'
!
CALL ctim2abss
(year,month,day,hour,minute,second,itimref)
itimref=itimref-itim1970
PRINT *, ' reference time: ',itimref
DO i=1,ntime
reftime(i)=FLOAT(itimref)
END DO
!
!-----------------------------------------------------------------------
!
! End of first-read intializations
!
!-----------------------------------------------------------------------
!
init=.true.
END IF
!
!-----------------------------------------------------------------------
!
! Begin ARPS data conversions
!
!-----------------------------------------------------------------------
!
itime=itimref+nint(time)
valtime(ifile)=FLOAT(itime)
vtmref(ifile)=nint(time)
DO i=1,nx
DO j=1,ny
rain(i,j)=raing(i,j)+rainc(i,j)
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pprt(i,j,k)=pprt(i,j,k)+pbar(i,j,k)
ptprt(i,j,k)=ptprt(i,j,k)+ptbar(i,j,k)
qvprt(i,j,k)=qvprt(i,j,k)+qvbar(i,j,k)
tem1(i,j,k)=0.5*(uprt(i,j,k)+ubar(i,j,k)+ &
uprt(i+1,j,k)+ubar(i+1,j,k))
tem2(i,j,k)=0.5*(vprt(i,j,k)+vbar(i,j,k)+ &
vprt(i,j+1,k)+vbar(i,j+1,k))
tem3(i,j,k)=0.5*(wprt(i,j,k)+wbar(i,j,k)+ &
wprt(i,j,k+1)+wbar(i,j,k+1))
qi(i,j,k)=qi(i,j,k)+qs(i,j,k)+qh(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Swap wind data back into wind arrays
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
uprt(i,j,k)=tem1(i,j,k)
vprt(i,j,k)=tem2(i,j,k)
wprt(i,j,k)=tem3(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Put temperature into tem2 and -ln(p) into tem3
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=ptprt(i,j,k)* &
(pprt(i,j,k)/p0)**rddcp
tem3(i,j,k)=-ALOG(pprt(i,j,k))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
zps_km(i,j,k)=zps(i,j,k)/1000.0
p_mb(i,j,k)=0.01*pprt(i,j,k)
mix(i,j,k)=1000.0*(qvprt(i,j,k)/(1.-qvprt(i,j,k)))
e_mb(i,j,k)=qvprt(i,j,k)*p_mb(i,j,k)/(qvprt(i,j,k)+ &
287.0/461.0)
esat_mb(i,j,k)=6.1078*EXP((2.500780E6/461.0)*((1.0/273.15)- &
(1.0/tem2(i,j,k))))
t_dew(i,j,k)=wmr2td(p_mb(i,j,k),mix(i,j,k)) &
+ 273.15
rh(i,j,k)=100.0*(e_mb(i,j,k)/esat_mb(i,j,k))
rh(i,j,k)=MAX(0.,rh(i,j,k))
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate stability indices.
! Use level k=2 as the "surface".
!
!-----------------------------------------------------------------------
!
imid=(nx/2)+1
jmid=(ny/2)+1
CALL arps_be
(nx,ny,nz, &
pprt,zps_km,tem2,qvprt, &
lcl,lfc,el,twdf,li,pbe,mbe,nbe,tcap, &
wrk1,wrk2,wrk3,wrk4,wrk5,wrk6, &
wrk7,wrk8,wrk9,wrk10,wrk11,wrk12,tem2d1)
PRINT *, ' Sample stability values: '
PRINT *, ' lcl,lfc : ',lcl(imid,jmid),lfc(imid,jmid)
PRINT *, ' el, twdf: ',el(imid,jmid),twdf(imid,jmid)
PRINT *, ' li, pbe : ',li(imid,jmid),pbe(imid,jmid)
PRINT *, ' mbe, nbe: ',mbe(imid,jmid),nbe(imid,jmid)
PRINT *, ' tcap : ',tcap(imid,jmid)
CALL calcshr
(nx,ny,nz,x,y,zp,mf2d, &
pprt,tem2,uprt,vprt,pbe, &
shr37,ustrm,vstrm,srlfl,srmfl,heli,brn,brnu,blcon, &
tem2d1,tem2d2,tem2d3,tem2d4,tem4)
PRINT *, ' Sample shear values: '
PRINT *, ' shr37,ustrm,vstrm: ', &
shr37(imid,jmid),ustrm(imid,jmid),vstrm(imid,jmid)
PRINT *, ' srlfl,srmfl,heli: ', &
srlfl(imid,jmid),srmfl(imid,jmid),heli(imid,jmid)
PRINT *, ' brn,brnu,blcon: ', &
brn(imid,jmid),brnu(imid,jmid),blcon(imid,jmid)
!
! Store k=2 theta-e and dewpt in tem1,
! level 1 and 2 respectively.
!
DO j=1,ny-1
DO i=1,nx-1
prmb=0.01*pprt(i,j,2)
tdew=wmr2td(prmb,(1000.*qvprt(i,j,2)))
tem1(i,j,1)=oe((tem2(i,j,2)-273.15),tdew,prmb) + 273.15
tem1(i,j,2)=tdew+273.15
tem1(i,j,3)=prmb
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Output near-sfc data.
! Simularity theory or something could be applied here
! to make these data be valid at sfc instrument height,
! for now we output level 2.
!
!-----------------------------------------------------------------------
!
PRINT *, ' Storing near-sfc pressure'
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1(1,1,3), &
cdf2d(1,1,1,idxp) )
PRINT *,' Storing grid-scale rainfall'
CALL cdf_fill(nx,ny,nxcdf,nycdf, raing, &
cdf2d(1,1,1,idxlgsp) )
PRINT *,' Storing convective rainfall'
CALL cdf_fill(nx,ny,nxcdf,nycdf, rainc, &
cdf2d(1,1,1,idxcp) )
PRINT *,' Storing total accumulated rainfall'
CALL cdf_fill(nx,ny,nxcdf,nycdf, rain, &
cdf2d(1,1,1,idxtp) )
PRINT *, ' Storing near-sfc u wind'
CALL cdf_fill(nx,ny,nxcdf,nycdf, uprt(1,1,2), &
cdf2d(1,1,1,idxsfu) )
PRINT *, ' Storing near-sfc v wind'
CALL cdf_fill(nx,ny,nxcdf,nycdf, vprt(1,1,2), &
cdf2d(1,1,1,idxsfv) )
PRINT *, ' Storing near-sfc temperature'
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem2(1,1,2), &
cdf2d(1,1,1,idxsft) )
PRINT *, ' Storing near-sfc dew point temperature'
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1(1,1,2), &
cdf2d(1,1,1,idxdpt) )
PRINT *,' Storing near-sfc specific humidity'
CALL cdf_fill(nx,ny,nxcdf,nycdf, qvprt(1,1,2), &
cdf2d(1,1,1,idxsh) )
PRINT *, ' Storing near-sfc theta-e'
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1(1,1,1), &
cdf2d(1,1,1,idxept) )
PRINT *, ' Storing near-sfc LI'
CALL cdf_fill(nx,ny,nxcdf,nycdf, li, &
cdf2d(1,1,1,idxsli) )
PRINT *, ' Storing near-sfc CAPE'
CALL cdf_fill(nx,ny,nxcdf,nycdf, pbe, &
cdf2d(1,1,1,idxcape) )
PRINT *, ' Storing near-sfc CIN'
CALL cdf_fill(nx,ny,nxcdf,nycdf, nbe, &
cdf2d(1,1,1,idxcin) )
PRINT *, ' Storing near-sfc LCL'
CALL cdf_fill(nx,ny,nxcdf,nycdf, lcl, &
cdf2d(1,1,1,idxlcl) )
PRINT *, ' Storing near-sfc LFC'
CALL cdf_fill(nx,ny,nxcdf,nycdf, lfc, &
cdf2d(1,1,1,idxlfc) )
PRINT *, ' Storing near-sfc EL'
CALL cdf_fill(nx,ny,nxcdf,nycdf, el, &
cdf2d(1,1,1,idxel) )
PRINT *, ' Storing wet bulb temp diff'
CALL cdf_fill(nx,ny,nxcdf,nycdf, twdf, &
cdf2d(1,1,1,idxtwdf) )
PRINT *, ' Storing Cap Strength'
CALL cdf_fill(nx,ny,nxcdf,nycdf, tcap, &
cdf2d(1,1,1,idxtcap) )
PRINT *, ' Storing 3-7km Shear'
CALL cdf_fill(nx,ny,nxcdf,nycdf, shr37, &
cdf2d(1,1,1,idxshr37) )
PRINT *, ' Storing u-storm'
CALL cdf_fill(nx,ny,nxcdf,nycdf, ustrm, &
cdf2d(1,1,1,idxustrm) )
PRINT *, ' Storing v-storm'
CALL cdf_fill(nx,ny,nxcdf,nycdf, vstrm, &
cdf2d(1,1,1,idxvstrm) )
PRINT *, ' Storing low-level SR flow'
CALL cdf_fill(nx,ny,nxcdf,nycdf, srlfl, &
cdf2d(1,1,1,idxsrlfl) )
PRINT *, ' Storing mid-level SR flow'
CALL cdf_fill(nx,ny,nxcdf,nycdf, srmfl, &
cdf2d(1,1,1,idxsrmfl) )
PRINT *, ' Storing helicity'
CALL cdf_fill(nx,ny,nxcdf,nycdf, heli, &
cdf2d(1,1,1,idxheli) )
PRINT *, ' Storing Bulk Richardson Number'
CALL cdf_fill(nx,ny,nxcdf,nycdf, brn, &
cdf2d(1,1,1,idxbrn) )
PRINT *, ' Storing BRN Shear'
CALL cdf_fill(nx,ny,nxcdf,nycdf, brnu, &
cdf2d(1,1,1,idxbrnu) )
PRINT *, ' Storing Boundary Layer Convergence'
CALL cdf_fill(nx,ny,nxcdf,nycdf, blcon, &
cdf2d(1,1,1,idxblcon) )
!
!-----------------------------------------------------------------------
!
! Calculate constant pressure level data
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Put temperature into tem2 and -ln(p) into tem3.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=ptprt(i,j,k)* &
(pprt(i,j,k)/p0)**rddcp
tem3(i,j,k)=-ALOG(pprt(i,j,k))
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate temperature (K) at ARPS grid points
! and 700mb pressure level
!
!-----------------------------------------------------------------------
!
rln700=-ALOG(70000.0)
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
tem2,tem3,rln700,tem1)
!
!-----------------------------------------------------------------------
!
! Calculate sea level pressure (mb)
! Reduction method: Benjamin and Miller: 1990, MWR, vol.118, No.10,
! Page: 2100-2101
!
!-----------------------------------------------------------------------
!
! gamma=.0065 ! std lapse rate per meter
! ex2=5.2558774
! DO 355 j=1,ny-1
! DO 355 i=1,nx-1
! p00 = 0.01*(pprt(i,j,2))
! tem1(i,j,1)=p00*
! : (1.0+gamma*zps(i,j,2)/tem1(i,j,1))**ex2
! 355 CONTINUE
gamma=.0065 ! std lapse rate per meter
ex1=0.1903643 ! R*gamma/g
ex2=5.2558774
DO j=1,ny-1
DO i=1,nx-1
p00 = 0.01*(pprt(i,j,2))
IF (p00 <= 700.0) THEN
t00 = tem2(i,j,2)
ELSE
t00 = tem1(i,j,1)*(p00/700.0)**ex1
END IF
tem1(i,j,1)=p00*(1.0+gamma*zps(i,j,2)/t00)**ex2
END DO
END DO
PRINT *, ' Storing MSL Pressure '
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1, &
cdf2d(1,1,1,idxmslp) )
!
!-----------------------------------------------------------------------
!
! Store terrain data.
!
!-----------------------------------------------------------------------
!
PRINT *, ' Storing terrain data.'
CALL cdf_fill(nx,ny,nxcdf,nycdf, zp(1,1,2), &
static2d(1,1,idxtop) )
PRINT *, ' Storing Coriolis data'
CALL cdf_fill(nx,ny,nxcdf,nycdf, coriolis, &
static2d(1,1,idxcor) )
PRINT *, ' Storing spacing data.'
CALL cdf_fill(nx,ny,nxcdf,nycdf, spacing, &
static2d(1,1,idxspa) )
!
!-----------------------------------------------------------------------
!
! Calculate atmospheric state variables.
!
!-----------------------------------------------------------------------
!
DO klev=1,nprlvl
rlnpcdf=-ALOG(100.*FLOAT(iprlvl(klev)))
PRINT *, ' Storing netCDF data at pr= ',iprlvl(klev)
!
! Store gh
!
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
zps,tem3,rlnpcdf,tem1)
CALL extrph
(nx,ny,nz,zps,tem2,pprt, &
iprlvl(klev),tem1)
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1, &
cdf3d(1,1,klev,idxgh) )
!
! Store temperature (tem2)
!
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
tem2,tem3,rlnpcdf,tem1)
CALL extrpt
(nx,ny,nz,tem2,pprt,zps, &
iprlvl(klev),tem1)
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1, &
cdf3d(1,1,klev,idxt) )
!
! Store relative humidity
!
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
rh,tem3,rlnpcdf,tem1)
CALL extrpq
(nx,ny,nz,rh,pprt,iprlvl(klev),tem1)
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1, &
cdf3d(1,1,klev,idxrh) )
!
! Store u and v wind components
!
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
uprt,tem3,rlnpcdf,tem1(1,1,1))
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
vprt,tem3,rlnpcdf,tem1(1,1,2))
CALL extrpuv
(nx,ny,nz,uprt,vprt,pprt,zps, &
iprlvl(klev),tem1(1,1,1),tem1(1,1,2))
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1(1,1,1), &
cdf3d(1,1,klev,idxuw) )
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1(1,1,2), &
cdf3d(1,1,klev,idxvw) )
!
! Store vertical velocity
!
CALL v2dinta
(nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, &
wprt,tem3,rlnpcdf,tem1)
CALL extrpq
(nx,ny,nz,wprt,pprt,iprlvl(klev),tem1)
CALL cdf_fill(nx,ny,nxcdf,nycdf, tem1(1,1,1), &
cdf3d(1,1,klev,idxww) )
END DO
END IF ! Good return from read
!
invlen(1)=nprlvl
invlen(2)=1
vecistr(2)=ifile
volistart(4)=ifile
DO ivar=1,n3dvar
WRITE(6,'(a,i4,2x,a)') ' Writing 3d ivar:',ivar, &
v3dlngnam(ivar)
!
IF(ifile == 1) THEN
istatus=nf_put_vara_text(ncid,v3dlvlid(ivar), &
planeistr,lvllen,v3dlvl)
IF (istatus /= nf_noerr) &
CALL handle_err
('nf_put_vara_text 3d lvl',istatus)
END IF
istatus=nf_put_vara_text(ncid,v3dinvid(ivar), &
vecistr,invlen,inventory)
IF (istatus /= nf_noerr) &
CALL handle_err
('nf_put_vara_text 3d inv',istatus)
istatus=nf_put_vara_real(ncid,v3did(ivar), &
volistart,vollen,cdf3d(1,1,1,ivar))
IF (istatus /= nf_noerr) &
CALL handle_err
('nf_put_vara_real 3d var',istatus)
END DO
!
invlen(1)=1
invlen(2)=1
planeistr(4)=ifile
DO ivar=1,n2dvar
WRITE(6,'(a,i4,2x,a)') ' Writing 2d ivar:',ivar, &
v2dlngnam(ivar)
IF(ifile == 1) THEN
IF(ivar == idxmslp) THEN
v2dlvl='MSL'
ELSE
v2dlvl='SFC'
END IF
istatus=nf_put_vara_text(ncid,v2dlvlid(ivar), &
vecistr,sfclen,v2dlvl)
IF (istatus /= nf_noerr) &
CALL handle_err
('nf_put_vara_text 2d lvl',istatus)
END IF
istatus=nf_put_vara_text(ncid,v2dinvid(ivar), &
vecistr,invlen,inventory_sfc)
IF (istatus /= nf_noerr) &
CALL handle_err
('nf_put_vara_text 2d inv',istatus)
istatus=nf_put_vara_real(ncid,v2did(ivar), &
planeistr,planelen,cdf2d(1,1,1,ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_put_vara_real 2d',istatus)
END DO
END DO
!
! Write static variables
!
DO ivar=1,nstvar
WRITE(6,'(a,i4,2x,a)') ' Writing st ivar:',ivar, &
vstlngnam(ivar)
istatus=nf_put_vara_real(ncid,vstid(ivar), &
planeistr,planelen,static2d(1,1,ivar))
IF (istatus /= nf_noerr) CALL handle_err
('nf_put_vara_real static',istatus)
END DO
!
! Write 1-d variables
!
istatus=nf_put_vara_int(ncid,vtmrefid, &
1,ntime,vtmref)
istatus=nf_put_vara_double(ncid,reftimid, &
1,ntime,reftime)
istatus=nf_put_vara_double(ncid,valtimid, &
1,ntime,valtime)
ls=LEN(origin)
CALL strlnth
(origin,ls)
istatus=nf_put_vara_text(ncid,origid, &
1,ls,origin)
ls=LEN(model)
CALL strlnth
(model,ls)
istatus=nf_put_vara_text(ncid,modelid, &
1,ls,model)
!
! Close file
!
istatus=nf_close(ncid)
IF (istatus /= nf_noerr) CALL handle_err
('nf_close',istatus)
STOP
!
900 CONTINUE
WRITE(6,'(a)') ' Error reading input data'
950 CONTINUE
WRITE(6,'(a)') ' Error setting up netCDF file'
STOP
END PROGRAM arps2ncdf
!
SUBROUTINE extrph(nx,ny,nz,zps,t,pr,iprlvl,hgtcdf) 2
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTRPH ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extrapolate height by using a std atmos lapse rate
! below the last physical level. Above the domain,
! assume a constant temperature above 300 mb, otherwise
! use the std atmos lapse rate.
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster, from arps2gem
! 2/19/99
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: zps(nx,ny,nz)
REAL :: t(nx,ny,nz)
REAL :: pr(nx,ny,nz)
INTEGER :: iprlvl
REAL :: hgtcdf(nx,ny)
!
INCLUDE 'phycst.inc'
!
REAL :: gamma,rddg,const
PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate
rddg = (rd/g), &
const = (rd*gamma/g) )
!
INTEGER :: i,j
REAL :: prcdf
!
prcdf=100.*FLOAT(iprlvl)
DO j=1,ny-1
DO i=1,nx-1
IF(prcdf < pr(i,j,nz-1)) THEN
IF(pr(i,j,nz-1) <= 30000.) THEN
hgtcdf(i,j)=zps(i,j,nz-1) + &
rddg*t(i,j,nz-1)*ALOG(pr(i,j,nz-1)/prcdf)
ELSE
hgtcdf(i,j)=zps(i,j,nz-1) + (t(i,j,nz-1)/gamma)* &
(1.-(prcdf/pr(i,j,nz-1))**const)
END IF
ELSE IF(prcdf >= pr(i,j,2)) THEN
hgtcdf(i,j)=zps(i,j,2) + (t(i,j,2)/gamma)* &
(1.-(prcdf/pr(i,j,2))**const)
END IF
END DO
END DO
RETURN
END SUBROUTINE extrph
!
SUBROUTINE extrpt(nx,ny,nz,t,pr,zps,iprlvl,tcdf) 3
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTRPT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extrapolate temperature by using a std atmos lapse rate
! below the last physical level. Above the domain,
! assume a constant temperature above 300 mb, otherwise
! use the std atmos lapse rate.
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster, from arps2gem
! 2/19/99
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
INTEGER :: nx,ny,nz
REAL :: t(nx,ny,nz)
REAL :: pr(nx,ny,nz)
REAL :: zps(nx,ny,nz)
INTEGER :: iprlvl
REAL :: tcdf(nx,ny)
!
INCLUDE 'phycst.inc'
!
REAL :: gamma,const
PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate
const = (rd*gamma/g) )
!
INTEGER :: i,j
REAL :: prcdf
!
prcdf=100.*FLOAT(iprlvl)
DO j=1,ny-1
DO i=1,nx-1
IF(prcdf <= pr(i,j,nz-1)) THEN
IF(pr(i,j,nz-1) <= 30000.) THEN
tcdf(i,j)=t(i,j,nz-1)
ELSE
tcdf(i,j)=t(i,j,nz-1)* &
((prcdf/pr(i,j,nz-1))**const)
END IF
ELSE IF(prcdf >= pr(i,j,2)) THEN
tcdf(i,j)=t(i,j,2)* &
((prcdf/pr(i,j,2))**const)
END IF
END DO
END DO
RETURN
END SUBROUTINE extrpt
!
SUBROUTINE extrpq(nx,ny,nz,q,pr,iprlvl,qcdf) 8
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTRPQ ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Assign a zero-gradient value to scalars below ground.
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster, from arps2gem
! 2/19/99
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: q(nx,ny,nz)
REAL :: pr(nx,ny,nz)
INTEGER :: iprlvl
REAL :: qcdf(nx,ny)
!
INTEGER :: i,j
REAL :: prcdf
!
prcdf=100.*FLOAT(iprlvl)
DO j=1,ny-1
DO i=1,nx-1
IF(prcdf < pr(i,j,nz-1)) THEN
qcdf(i,j)=q(i,j,nz-1)
ELSE IF(prcdf > pr(i,j,2)) THEN
qcdf(i,j)=q(i,j,2)
END IF
END DO
END DO
RETURN
END SUBROUTINE extrpq
SUBROUTINE extrpuv(nx,ny,nz,us,vs,pr,zps, & 2
iprlvl,ucdf,vcdf)
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTRPUV ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Assign a constant value to sub-terrainian winds
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster, from arps2gem
! 2/19/99
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: us(nx,ny,nz)
REAL :: vs(nx,ny,nz)
REAL :: pr(nx,ny,nz)
REAL :: zps(nx,ny,nz)
INTEGER :: iprlvl
REAL :: ucdf(nx,ny)
REAL :: vcdf(nx,ny)
!
INTEGER :: i,j
REAL :: prcdf
!
prcdf=100.*FLOAT(iprlvl)
DO j=1,ny-1
DO i=1,nx-1
IF(prcdf < pr(i,j,nz-1)) THEN
ucdf(i,j)=us(i,j,nz-1)
vcdf(i,j)=vs(i,j,nz-1)
ELSE IF(prcdf > pr(i,j,2)) THEN
ucdf(i,j)=us(i,j,2)
vcdf(i,j)=vs(i,j,2)
END IF
END DO
END DO
RETURN
END SUBROUTINE extrpuv
!
SUBROUTINE handle_err(string,istatus) 32
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HANDLE_ERR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Report netCDF error in plain English. Exit.
!
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster
! 2/19/99
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
CHARACTER (LEN=*) :: string
CHARACTER (LEN=80) :: nf_strerror
INTEGER :: istatus
WRITE(6,'(a,a,/a)') 'netCDF error: ',string, &
nf_strerror(istatus)
STOP
END SUBROUTINE handle_err
!
SUBROUTINE cdf_fill(nx,ny,nxcdf,nycdf, &
arpsvar,cdfvar)
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CDF_FILL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Fill netCDF output array which is the physical domain of the
! ARPS scalar grid.
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Keith Brewster
! 2/19/99
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER :: nx,ny
INTEGER :: nxcdf,nycdf
REAL :: arpsvar(nx,ny)
REAL :: cdfvar(nxcdf,nycdf)
INTEGER :: i,j
!
DO j=2,ny-2
DO i=2,nx-2
cdfvar(i-1,j-1)=arpsvar(i,j)
END DO
END DO
RETURN
END SUBROUTINE cdf_fill