!##################################################################
!##################################################################
!###### ######
!###### PROGRAM EXTRACT_AVN ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
PROGRAM extract_avn,36
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!-----------------------------------------------------------------------
!
! AUTHOR:
! Ming Xue (August 2000)
!
! MODIFICATION HISTORY:
!
! Nov. 5, 2000. (Ming Xue)
! Added variables at sigma = 0.995
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Input and output grid dimensions
!
!-----------------------------------------------------------------------
INTEGER :: nx_ext, ny_ext, nz_ext ! dimensions of external data grid
INCLUDE 'globcst.inc'
!
!-----------------------------------------------------------------------
!
! NAMELIST variables for input data
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=60) :: dir_extd ! directory of external data
CHARACTER (LEN=80) :: extdname ! Prefix string of external file name.
! Used ONLY for ARPS data input
! The file name should look like:
! extdname.time_string
INTEGER :: nextdfil ! number of external data files to process
CHARACTER (LEN=29) :: extdtime(50) ! external data times
! format mm-dd-yyyy:hh:mm:ss/HHH:MM:SS
! _initial time_____ /forecast
REAL :: latbgn,latend,lonbgn,lonend, del_lat, del_lon
INTEGER :: ibgn,iend,jbgn,jend
CHARACTER (LEN=80) :: jobname
CHARACTER (LEN=80) :: outdir
!
NAMELIST /extdfile/ jobname,dir_extd,extdname, &
nextdfil,extdtime, &
latbgn,latend,lonbgn,lonend,outdir,filcmprs
REAL, allocatable :: lat_ext(:,:) ! external data latidude
REAL, allocatable :: lon_ext(:,:) ! external data longitude
REAL, allocatable :: p_ext(:,:,:) ! Pressure (Pascals)
REAL, allocatable :: hgt_ext(:,:,:) ! Height (m)
REAL, allocatable :: t_ext(:,:,:) ! Temperature (K)
REAL, allocatable :: u_ext(:,:,:) ! Eastward wind component
REAL, allocatable :: v_ext(:,:,:) ! Northward wind component
REAL, allocatable :: qv_ext(:,:,:) ! Specific humidity (kg/kg)
REAL, allocatable :: qc_ext(:,:,:) ! Cloud H2O mixing ratio (kg/kg)
REAL, allocatable :: qr_ext(:,:,:) ! Rain H2O mixing ratio (kg/kg)
REAL, allocatable :: qi_ext(:,:,:) ! Ice H2O mixing ratio (kg/kg)
REAL, allocatable :: qs_ext(:,:,:) ! Snow H2O mixing ratio (kg/kg)
REAL, allocatable :: qh_ext(:,:,:) ! Hail H2O mixing ratio (kg/kg)
REAL, allocatable :: tsfc_ext (:,:) ! Temperature at surface (K)
REAL, allocatable :: tsoil_ext (:,:) ! Deep soil temperature (K)
REAL, allocatable :: wetsfc_ext (:,:) ! Surface soil moisture
REAL, allocatable :: wetdp_ext (:,:) ! Deep soil moisture
REAL, allocatable :: wetcanp_ext(:,:) ! Canopy water amount
REAL, allocatable :: snowdpth_ext(:,:) ! Snow depth (m)
REAL, allocatable :: trn_ext (:,:) ! External terrain (m)
REAL, allocatable :: psfc_ext (:,:) ! Surface pressure (Pa)
REAL, allocatable :: ugrd_ext (:,:) ! u at sigma=0.995 (m/s)
REAL, allocatable :: vgrd_ext (:,:) ! v at sigma=0.995 (m/s)
REAL, allocatable :: tgrd_ext (:,:) ! T at sigma=0.995 (K)
REAL, allocatable :: rhgrd_ext (:,:) ! relative humidity at sigma=0.995 (K)
REAL, allocatable :: ptgrd_ext (:,:) ! PT at sigma=0.995 (K)
REAL, allocatable :: pmsl_ext (:,:) ! MSL pressure (Pa)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=80) :: basdmpfn
CHARACTER (LEN=19) :: extdinit
CHARACTER (LEN=9) :: extdfcst
CHARACTER (LEN=9) :: julfinit
CHARACTER (LEN=9) :: julfname
!
INTEGER :: i,j,k,ksmth,istatus
INTEGER :: iyr,imo,iday,ihr,imin,isec,jldy
INTEGER :: ifhr,ifmin,ifsec,mfhr
INTEGER :: myr,initsec,iabssec,jabssec
INTEGER :: ifile,iprtopt,lbasdmpf,onvf,grdbas
INTEGER :: iextmn,iextmx,jextmn,jextmx
INTEGER :: idiag,jdiag
REAL :: latnot(2)
REAL :: amin,amax
REAL :: qvmin,qvmax,qvval
REAL :: csconst,pconst
REAL :: deltaz,tv_ext
REAL :: pres,temp,qvsat,rh,tvbar,qvprt,qtot
REAL :: xdiag,ydiag,dd,dmin,latd,lond
REAL :: ppasc,pmb,tc,tdc,theta,smix,e,bige,alge,dir,spd
CHARACTER (LEN=80) :: soiloutfl,temchar
CHARACTER (LEN=80) :: timsnd
INTEGER :: lfn, tmstrln
INTEGER :: tsfcout,tsoilout,wetsout,wetdout,wetcout,snowdout
INTEGER :: isnow,jsnow,ii,jj
REAL :: xumin,xumax,yvmin,yvmax
INTEGER :: strlen, ireturn
CHARACTER (LEN=3) :: FMT
CHARACTER (LEN=100) :: tmp_ch
INTEGER :: iproj_ext, nunit, idummy
REAL :: scale_ext,trlon_ext,latnot_ext(2),x0_ext,y0_ext,rdummy
INTEGER :: iuout, ivout, ipout, ihout,itout, &
iqvout, itsfcout,itsoilout,iwsfcout,iwdpout, &
iwcnpout,isnowout,itrnout,ipsfcout, &
iugrdout,ivgrdout,itgrdout,iptgrdout,irhgrdout,ipmslout
CHARACTER (LEN=13) :: outtime
CHARACTER (LEN=120) :: outfile
INTEGER :: len1,outflen,lenrun,ierr
LOGICAL :: iexist
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Read in additional namelists for external file specifications.
!
!-----------------------------------------------------------------------
!
dir_extd = './'
extdname = 'may20'
nextdfil = 1
extdtime(1) = '1977-05-20.21:00:00+000:00:00'
filcmprs = 1
READ (5,extdfile)
WRITE (6, '(3x,a,a,a)')'dir_extd = ''', trim(dir_extd), ''','
WRITE (6, '(3x,a,a,a)')'extdname = ''', trim(extdname), ''','
WRITE (6, '(3x,a,i4,a)')'nextdfil = ', nextdfil, ','
DO i=1,nextdfil
WRITE (6, '(3x,a,i2.2,a,a,a)') &
'extdtime(',i,') = ''', trim(extdtime(i)), ''','
END DO
2 CONTINUE
nx_ext = 360
ny_ext = 181
nz_ext = 26
PRINT*,'nx_ext, ny_ext, nz_ext = ', nx_ext, ny_ext, nz_ext
IF( lonbgn <= 0.0 ) THEN
lonbgn = lonbgn + 360.0
END IF
IF( lonend <= 0.0) THEN
lonend = lonend + 360.0
END IF
IF( lonbgn > lonend ) lonend = lonend + 360.0
latbgn = latbgn + 90.0
latend = latend + 90.0
ibgn = nint(lonbgn/1.0)+1
iend = nint(lonend/1.0)+1
jbgn = nint(latbgn/1.0)+1
jend = nint(latend/1.0)+1
PRINT *,'ibgn= ',ibgn,' iend=', iend
PRINT *,'jbgn= ',jbgn,' jend=', jend
allocate(lat_ext(ibgn:iend,jbgn:jend),stat=istatus)
allocate(lon_ext(ibgn:iend,jbgn:jend),stat=istatus)
!
allocate(p_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(hgt_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(t_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(u_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(v_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(qv_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(qc_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(qr_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(qi_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(qs_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(qh_ext(ibgn:iend,jbgn:jend,nz_ext),stat=istatus)
allocate(tsfc_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(tsoil_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(wetsfc_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(wetdp_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(wetcanp_ext(ibgn:iend,jbgn:jend),stat=istatus)
allocate(snowdpth_ext(ibgn:iend,jbgn:jend),stat=istatus)
allocate(trn_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(psfc_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(ugrd_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(vgrd_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(tgrd_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(rhgrd_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(ptgrd_ext (ibgn:iend,jbgn:jend),stat=istatus)
allocate(pmsl_ext (ibgn:iend,jbgn:jend),stat=istatus)
lat_ext=-999.0
lon_ext=-999.0
p_ext =-999.0
hgt_ext=-999.0
t_ext =-999.0
u_ext =-999.0
v_ext =-999.0
qv_ext =-999.0
qc_ext =-999.0
qr_ext =-999.0
qi_ext =-999.0
qs_ext =-999.0
qh_ext =-999.0
tsfc_ext =-999.0
tsoil_ext =-999.0
wetsfc_ext =-999.0
wetdp_ext =-999.0
wetcanp_ext =-999.0
snowdpth_ext=-999.0
trn_ext =-999.0
psfc_ext =-999.0
ugrd_ext =-999.0
vgrd_ext =-999.0
tgrd_ext =-999.0
rhgrd_ext =-999.0
ptgrd_ext =-999.0
pmsl_ext =-999.0
!
!-----------------------------------------------------------------------
!
! Loop through the data times provided via NAMELIST.
!
!-----------------------------------------------------------------------
!
DO ifile=1,nextdfil
!
!-----------------------------------------------------------------------
!
! Time conversions.
! Formats: extdtime='1994-05-06.18:00:00+000:00:00'
! julfname='941261800'
!
!-----------------------------------------------------------------------
!
READ(extdtime(ifile),'(a19,1x,a9)') extdinit,extdfcst
IF(extdfcst == ' ') extdfcst='000:00:00'
READ(extdinit, &
'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)',ERR=920,END=920) &
iyr,imo,iday,ihr,imin,isec
CALL julday
(iyr,imo,iday,jldy)
myr=MOD(iyr,100)
ifhr=0
ifmin=0
ifsec=0
READ(extdfcst, &
'(i3,1x,i2,1x,i2)',ERR=4,END=4) ifhr,ifmin,ifsec
4 CONTINUE
mfhr=MOD(ifhr,24)
jldy = jldy + ifhr/24
WRITE(julfname, &
'(i2.2,i3.3,i2.2,i2.2)') myr,jldy,ihr,mfhr
CALL ctim2abss
(iyr,imo,iday,ihr,imin,isec,iabssec)
jabssec=(ifhr*3600) + (ifmin*60) + ifsec + iabssec
! write(6,'(a,a9,a,/19x,a,a19,a/a,a/a,i16,a,/,i26,a)')
! : ' Calling rdextfil, looking for ',
! : extdfcst,' hour forecast '
!
!-----------------------------------------------------------------------
!
! Get NCEP AVN GRIB #3
!
!-----------------------------------------------------------------------
!
CALL get_avn_grb
(nx_ext,ny_ext,nz_ext,ibgn,iend,jbgn,jend, &
dir_extd,extdname,extdinit,extdfcst,julfname, &
iproj_ext,scale_ext,trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext,wetsfc_ext,wetdp_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext, &
ugrd_ext,vgrd_ext,tgrd_ext,rhgrd_ext,ptgrd_ext,pmsl_ext, &
istatus)
IF(istatus /= 1) GO TO 999
PRINT*,' '
CALL a3dmax0
(lat_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'lat_ext_min= ', amin,', lat_ext_max=',amax
CALL a3dmax0
(lon_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'lon_ext_min= ', amin,', lon_ext_max=',amax
!
CALL a3dmax0
(p_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'p_ext_min = ', amin,', p_ext_max =',amax
CALL a3dmax0
(hgt_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'hgt_ext_min= ', amin,', hgt_ext_max=',amax
CALL a3dmax0
(t_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
't_ext_min = ', amin,', t_ext_max =',amax
CALL a3dmax0
(u_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'u_ext_min = ', amin,', u_ext_max =',amax
CALL a3dmax0
(v_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'v_ext_min = ', amin,', v_ext_max =',amax
CALL a3dmax0
(qv_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qv_ext_min = ', amin,', qv_ext_max =',amax
CALL a3dmax0
(qc_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qc_ext_min = ', amin,', qc_ext_max =',amax
CALL a3dmax0
(qr_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qr_ext_min = ', amin,', qr_ext_max =',amax
CALL a3dmax0
(qi_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qi_ext_min = ', amin,', qi_ext_max =',amax
CALL a3dmax0
(qs_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qs_ext_min = ', amin,', qs_ext_max =',amax
CALL a3dmax0
(qh_ext ,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qh_ext_min = ', amin,', qh_ext_max =',amax
CALL a3dmax0
(tsfc_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tsfc_ext_min = ', amin,', tsfc_ext_max =',amax
CALL a3dmax0
(tsoil_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tsoil_ext_min = ', amin,', tsoil_ext_max =',amax
CALL a3dmax0
(wetsfc_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetsfc_ext_min = ', amin,', wetsfc_ext_max =',amax
CALL a3dmax0
(wetdp_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetdp_ext_min = ', amin,', wetdp_ext_max =',amax
CALL a3dmax0
(wetcanp_ext, &
ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetcanp_ext_min= ', amin,', wetcanp_ext_max=',amax
CALL a3dmax0
(snowdpth_ext, &
ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'snowd_ext_min = ', amin,', snow_ext_max =',amax
CALL a3dmax0
(psfc_ext, &
ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'psfc_ext_min = ', amin,', psfc_ext_max =',amax
CALL a3dmax0
(trn_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'trn_ext_min = ', amin,', trn_ext_max =',amax
CALL a3dmax0
(ugrd_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'ugrd_ext_min = ', amin,', ugrd_ext_max =',amax
CALL a3dmax0
(vgrd_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'vgrd_ext_min = ', amin,', vgrd_ext_max =',amax
CALL a3dmax0
(tgrd_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tgrd_ext_min = ', amin,', tgrd_ext_max =',amax
CALL a3dmax0
(rhgrd_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'rhgrd_ext_min = ', amin,', rhgrd_ext_max =',amax
CALL a3dmax0
(ptgrd_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'ptgrd_ext_min = ', amin,', ptgrd_ext_max =',amax
CALL a3dmax0
( pmsl_ext,ibgn,iend,ibgn,iend,jbgn,jend,jbgn,jend, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
' pmsl_ext_min = ', amin,', pmsl_ext_max =',amax
!
!-----------------------------------------------------------------------
!
! Write out the data patch
!
!-----------------------------------------------------------------------
!
READ (extdinit,'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)') &
iyr,imo,iday,ihr,imin,isec
myr=MOD(iyr,100)
ifhr=0
ifmin=0
ifsec=0
READ(extdfcst,'(i3)',ERR=5,END=5) ifhr
5 CONTINUE
WRITE (outtime,'(i4.4,i2.2,i2.2,i2.2,a1,i2.2)') &
iyr,imo,iday,ihr,'f',ifhr
len1=len_trim(outdir)
outflen=len1
IF( outflen == 0 .OR. outdir(1:outflen) == ' ' ) THEN
outdir = '.'
outflen=1
END IF
outflen = len_trim( outdir )
IF( outdir(outflen:outflen) /= '/') THEN
outflen=outflen+1
outdir(outflen:outflen)='/'
END IF
! print*,'outdir =', trim(outdir)
INQUIRE(FILE=trim(outdir),EXIST=iexist)
IF( .NOT.iexist ) THEN
WRITE(6,'(5x,a,2(/5x,a))') &
'Specified output directory '//trim(outdir)//' not found.', &
'It was created by the program.'
CALL unixcmd
( 'mkdir -p '//trim(outdir) )
END IF
lenrun = len_trim( jobname )
outfile = outdir(1:outflen)//jobname(1:lenrun) &
//'.'//outtime(1:13)
outflen = outflen + lenrun + 14
CALL fnversn
(outfile, outflen)
CALL getunit
( nunit)
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(outfile(1:outflen), '-F f77 -N ieee', ierr)
OPEN(UNIT=nunit,FILE=outfile(1:outflen), &
STATUS='unknown',FORM='unformatted',IOSTAT=istatus)
IF( istatus /= 0 ) THEN
WRITE(6,'(1x,a,a,/1x,i3,a)') &
'Error occured when opening file ',outfile(1:outflen), &
'using FORTRAN unit ',nunit,' Program stopped.'
STOP
END IF
PRINT*,'To creat file ',trim(outfile)
del_lat = 1.0
del_lon = 1.0
WRITE(nunit) iend-ibgn+1, jend-jbgn+1,nz_ext
WRITE(nunit) lonbgn,lonend,latbgn,latend
WRITE(nunit) del_lon, del_lat
iuout = 1
ivout = 1
ipout = 1
ihout = 1
itout = 1
iqvout = 1
itsfcout = 1
itsoilout= 1
iwsfcout = 1
iwdpout = 1
iwcnpout = 0
isnowout = 0
itrnout = 1
ipsfcout = 1
iugrdout = 1
ivgrdout = 1
itgrdout = 1
iptgrdout= 1
ipmslout = 1
irhgrdout= 1
idummy = 0.0
WRITE(nunit) iuout, ivout, ipout, ihout,itout, &
iqvout, itsfcout,itsoilout,iwsfcout,iwdpout, &
iwcnpout,isnowout,itrnout,ipsfcout,iugrdout, &
ivgrdout,itgrdout,iptgrdout,irhgrdout,ipmslout, &
iproj_ext,idummy,idummy, idummy, idummy, &
idummy, idummy, idummy, idummy, idummy
rdummy = 0.0
WRITE(nunit) scale_ext,trlon_ext,latnot_ext(1),latnot_ext(2), &
x0_ext, y0_ext, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy
IF( iuout==1 ) WRITE(nunit) 'u(m/s)....'
IF( iuout==1 ) WRITE(nunit) u_ext
IF( ivout==1 ) WRITE(nunit) 'v(m/s)....'
IF( ivout==1 ) WRITE(nunit) v_ext
IF( ipout==1 ) WRITE(nunit) 'p(P)......'
IF( ipout==1 ) WRITE(nunit) p_ext
IF( ihout==1 ) WRITE(nunit) 'hgt(m)....'
IF( ihout==1 ) WRITE(nunit) hgt_ext
IF( itout==1 ) WRITE(nunit) 't(K)......'
IF( itout==1 ) WRITE(nunit) t_ext
IF( iqvout==1) WRITE(nunit) 'qv(g/g)...'
IF( iqvout==1) WRITE(nunit) qv_ext
IF( itsfcout==1 ) WRITE(nunit) 'tsfc(K)...'
IF( itsfcout==1 ) WRITE(nunit) tsfc_ext
IF( itsoilout==1) WRITE(nunit) 'tsoil(K)..'
IF( itsoilout==1) WRITE(nunit) tsoil_ext
IF( iwsfcout==1 ) WRITE(nunit) 'wetsfc....'
IF( iwsfcout==1 ) WRITE(nunit) wetsfc_ext
IF( iwdpout==1 ) WRITE(nunit) 'wetdp.....'
IF( iwdpout==1 ) WRITE(nunit) wetdp_ext
IF( iwcnpout==1 ) WRITE(nunit) 'wetcanp...'
IF( iwcnpout==1 ) WRITE(nunit) wetcanp_ext
IF( isnowout==1 ) WRITE(nunit) 'snowdp(m).'
IF( isnowout==1 ) WRITE(nunit) snowdpth_ext
IF( itrnout ==1 ) WRITE(nunit) 'trn(m)....'
IF( itrnout ==1 ) WRITE(nunit) trn_ext
IF( ipsfcout==1 ) WRITE(nunit) 'psfc(Pa)..'
IF( ipsfcout==1 ) WRITE(nunit) psfc_ext
IF( iugrdout==1 ) WRITE(nunit) 'ugrd(m/s).'
IF( iugrdout==1 ) WRITE(nunit) ugrd_ext
IF( ivgrdout==1 ) WRITE(nunit) 'vgrd(m/s).'
IF( ivgrdout==1 ) WRITE(nunit) vgrd_ext
IF( itgrdout==1 ) WRITE(nunit) 'tgrd(K)...'
IF( itgrdout==1 ) WRITE(nunit) tgrd_ext
IF( irhgrdout==1) WRITE(nunit) 'rhgrd.....'
IF( irhgrdout==1) WRITE(nunit) rhgrd_ext
IF( iptgrdout==1) WRITE(nunit) 'ptgrd(K)..'
IF( iptgrdout==1) WRITE(nunit) ptgrd_ext
IF( ipmslout==1 ) WRITE(nunit) 'pmsl(Pa)..'
IF( ipmslout==1 ) WRITE(nunit) pmsl_ext
CLOSE (UNIT=nunit)
CALL retunit( nunit)
IF( filcmprs
.eq. 1 ) CALL cmprs( outfile(1:outflen) )
PRINT*,'Finished writing file ',trim(outfile)
PRINT*,' '
END DO
!
!-----------------------------------------------------------------------
!
! Friendly exit message.
!
!-----------------------------------------------------------------------
!
WRITE(6,'(a/a,i4,a)') &
' Normal succesful completion of EXT2ARPS.', &
' Processed',nextdfil,' file(s)'
STOP
!
!-----------------------------------------------------------------------
!
! Problem doing time conversions.
!
!-----------------------------------------------------------------------
!
920 CONTINUE
WRITE(6,'(a,/,a,i4,a,i4/,a,a19)') &
' Aborting, error in time format for external file', &
' File number:',ifile,' of',nextdfil, &
' External file time provided:',extdtime(ifile)
STOP
!
!-----------------------------------------------------------------------
!
! Error status returned from rdextfil
!
!-----------------------------------------------------------------------
!
999 CONTINUE
WRITE(6,'(a,i6)') &
' Aborting, error reading external file. istatus=', &
istatus
STOP
END PROGRAM extract_avn
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GET_AVN_GRB ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE get_avn_grb(nx_ext,ny_ext,nz_ext,ibgn,iend,jbgn,jend, & 1,5
dir_extd,extdname,extdinit,extdfcst,julfname, &
iproj_ext,scale_ext,trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext,wetsfc_ext,wetdp_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext, &
ugrd_ext,vgrd_ext,tgrd_ext,rhgrd_ext,ptgrd_ext,pmsl_ext, &
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Reads and pass out a section of NCEP AVN GRIB
! (Grid #3, 1x1 degree) data file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: M. Xue
! 07/25/2000 Based on GETNMCAVN3.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! dir_extd Directory name for external file
! extdname Prefix string of external file name
! extdinit Initialized time in mm-dd-yyyy:hh:mm:ss format
! extdfcst Forecast hour in HHH:MM:SS format
! julfname File name in yyjjjhhmm format
!
! OUTPUT:
!
! iproj_ext Map projection number of external data
! scale_ext Scale factor of external data
! trlon_ext True longitude of external data (degrees E)
! latnot_ext(2) True latitude(s) of external data (degrees N)
! x0_ext x coordinate of origin of external data
! y0_ext y coordinate of origin of external data
! lat_ext latitude of external data points (degrees N)
! lon_ext longitude of external data points (degrees E)
! p_ext pressure (Pascal)
! hgt_ext height (m)
! t_ext temperature (K)
! qv_ext specific humidity (kg/kg)
! u_ext u wind component (m/s)
! v_ext v wind component (m/s)
! qc_ext Cloud water mixing ratio (kg/kg)
! qr_ext Rain water mixing ratio (kg/kg)
! qi_ext Ice mixing ratio (kg/kg)
! qs_ext Snow mixing ratio (kg/kg)
! qh_ext Hail mixing ratio (kg/kg)
!
! tsfc_ext Surface temperature
! tsoil_ext Soil temperature
! wetsfc_ext Top layer soil moisture
! wetdp_ext Deep soil moisture
! wetcanp_ext Water content on canopy
!
! trn_ext External terrain (m)
! psfc_ext Surface pressure (Pa)
! ugrd_ext u at sigma=0.995 (m/s)
! vgrd_ext v at sigma=0.995 (m/s)
! tgrd_ext T at sigma=0.995 (K)
! rhgrd_ext relative humidity at sigma=0.995 (K)
! ptgrd_ext PT at sigma=0.995 (K)
! pmsl_ext MSL pressure (Pa)
!
! istatus status indicator
!
! WORK ARRAYS:
!
! var_grb3d Arrays to store the GRIB 3-D variables:
! var_grb3d(nxgrb,nygrb,nzgrb,1,1) - Temperature (K)
! var_grb3d(nxgrb,nygrb,nzgrb,2,1) - Specific humidity
! (kg/kg)
! var_grb3d(nxgrb,nygrb,nzgrb,3,1) - u wind (m/s)
! var_grb3d(nxgrb,nygrb,nzgrb,4,1) - v wind (m/s)
! var_grb3d(nxgrb,nygrb,nzgrb,5,1) - Geopotential
! height (gpm)
! var_grb3d(nxgrb,nygrb,nzgrb,6,1) - Pressure vertical
! velocity (Pa/s)
! (if applied)
! var_grb3d(nxgrb,nygrb,nzgrb,1,2) - soil temp. (K)
! var_grb3d(nxgrb,nygrb,nzgrb,2,2) - vol. soil moist.
! (m**3/m**3)
!
! var_grb2d Arrays to store the GRIB 2-D variables:
! var_grb2d(nxgrb,nygrb,1,1) - Surface pressure (Pa)
! var_grb2d(nxgrb,nygrb,2,1) - Geopotential height (gpm)
! var_grb2d(nxgrb,nygrb,3,1) - Surface temperature (K)
! var_grb2d(nxgrb,nygrb,4,1) - Plant canopy surface water (kg/m**2)
! var_grb2d(nxgrb,nygrb,6,1) - Snow depth
!
! var_grb2d(nxgrb,nygrb,1,2) - temperature at sigma = 0.995 (K)
! var_grb2d(nxgrb,nygrb,2,2) - u, east-west velocity at sigma = 0.995 (m/s)
! var_grb2d(nxgrb,nygrb,3,2) - v, north-south velocity at sigma = 0.995 (m/s)
! var_grb2d(nxgrb,nygrb,4,2) - relative humidity at sigma = 0.995
! var_grb2d(nxgrb,nygrb,5,2) - potential temperature at sigma = 0.995 (K)
! var_grb2d(nxgrb,nygrb,6,2) - undefined, unused
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'gribcst.inc'
CHARACTER (LEN=*) :: dir_extd
CHARACTER (LEN=*) :: extdname
CHARACTER (LEN=19) :: extdinit
CHARACTER (LEN=9) :: extdfcst
CHARACTER (LEN=9) :: julfname
!
!-----------------------------------------------------------------------
!
! External grid variables
!
!-----------------------------------------------------------------------
!
INTEGER :: iproj_ext
REAL :: scale_ext,trlon_ext
REAL :: latnot_ext(2)
REAL :: x0_ext,y0_ext
REAL :: dx_ext,dy_ext
!
!-----------------------------------------------------------------------
!
! Output external variable arrays
!
!-----------------------------------------------------------------------
!
INTEGER :: nx_ext,ny_ext,nz_ext
INTEGER :: ibgn,iend,jbgn,jend
REAL :: lat_ext(ibgn:iend,jbgn:jend)
REAL :: lon_ext(ibgn:iend,jbgn:jend)
REAL :: p_ext (ibgn:iend,jbgn:jend,nz_ext) ! Pressure (Pascals)
REAL :: hgt_ext(ibgn:iend,jbgn:jend,nz_ext) ! Height (m)
REAL :: t_ext (ibgn:iend,jbgn:jend,nz_ext) ! Temperature (K)
REAL :: qv_ext (ibgn:iend,jbgn:jend,nz_ext) ! Specific humidity (kg/kg)
REAL :: u_ext (ibgn:iend,jbgn:jend,nz_ext) ! Eastward wind component
REAL :: v_ext (ibgn:iend,jbgn:jend,nz_ext) ! Northward wind component
REAL :: qc_ext (ibgn:iend,jbgn:jend,nz_ext) ! Cloud H2O mixing ratio (kg/kg)
REAL :: qr_ext (ibgn:iend,jbgn:jend,nz_ext) ! Rain H2O mixing ratio (kg/kg)
REAL :: qi_ext (ibgn:iend,jbgn:jend,nz_ext) ! Ice mixing ratio (kg/kg)
REAL :: qs_ext (ibgn:iend,jbgn:jend,nz_ext) ! Snow mixing ratio (kg/kg)
REAL :: qh_ext (ibgn:iend,jbgn:jend,nz_ext) ! Hail mixing ratio (kg/kg)
REAL :: tsfc_ext (ibgn:iend,jbgn:jend) ! Temperature at surface (K)
REAL :: tsoil_ext (ibgn:iend,jbgn:jend) ! Deep soil temperature (K)
REAL :: wetsfc_ext (ibgn:iend,jbgn:jend) ! Surface soil moisture
REAL :: wetdp_ext (ibgn:iend,jbgn:jend) ! Deep soil moisture
REAL :: wetcanp_ext(ibgn:iend,jbgn:jend) ! Canopy water amount
REAL :: snowdpth_ext(ibgn:iend,jbgn:jend) ! Snow depth (m)
REAL :: trn_ext (ibgn:iend,jbgn:jend) ! External terrain (m)
REAL :: psfc_ext (ibgn:iend,jbgn:jend) ! Surface pressure (Pa)
REAL :: ugrd_ext (ibgn:iend,jbgn:jend) ! u at sigma=0.995 (m/s)
REAL :: vgrd_ext (ibgn:iend,jbgn:jend) ! v at sigma=0.995 (m/s)
REAL :: tgrd_ext (ibgn:iend,jbgn:jend) ! T at sigma=0.995 (K)
REAL :: rhgrd_ext (ibgn:iend,jbgn:jend) ! relative humidity at sigma=0.995 (K)
REAL :: ptgrd_ext (ibgn:iend,jbgn:jend) ! PT at sigma=0.995 (K)
REAL :: pmsl_ext (ibgn:iend,jbgn:jend) ! MSL pressure (Pa)
!
!-----------------------------------------------------------------------
!
! Other external variable arrays
!
!-----------------------------------------------------------------------
!
! real x_ext(nx_ext)
! real y_ext(ny_ext)
INTEGER :: istatus
!
!-----------------------------------------------------------------------
!
! Work arrays for storing grib data
!
!-----------------------------------------------------------------------
!
REAL, allocatable :: var_grb2d(:,:,:,:) ! GRIB variables
REAL, allocatable :: var_grb3d(:,:,:,:,:) ! GRIB 3-D variables
INTEGER, allocatable :: var_lev3d(:,:,:) ! Levels (hybrid) for
! each 3-D variable
REAL, allocatable :: rcdata(:) ! temporary data array
!
!-----------------------------------------------------------------------
!
! Original grid variables
!
!-----------------------------------------------------------------------
!
INTEGER :: iproj
REAL :: scale,trlon,x0,y0
REAL :: latnot(2)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=80) :: gribfile
CHARACTER (LEN=13) :: gribtime
INTEGER :: i,j,k,kk
INTEGER :: iyr,imo,iday,myr, jldy
INTEGER :: ihr,imin,isec
INTEGER :: ifhr,ifmin,ifsec
INTEGER :: grbflen, len1, lenrun
INTEGER :: m,n,nz1,max_nr2d,max_nr3d,min_nr3d,nz2
REAL :: govrd
INTEGER :: chklev, lvscan
INTEGER :: iret ! Return flag
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
! GRIB grid information
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=42) :: gridesc ! Grid description
INTEGER :: iproj_grb ! Map projection indicator
INTEGER :: gthin ! Indicator of whether the grid is "thinned"
INTEGER :: ni_grb ! Number of points along x-axis
INTEGER :: nj_grb ! Number of points along y-axis
INTEGER :: np_grb ! Total number of horizontal grid points
INTEGER :: nk_grb ! Number of vertical parameters
REAL :: zk_grb(nz_ext) ! Vertical coordinate parameters
INTEGER :: npeq ! Number of lat circles from pole to equator
INTEGER :: nit(nz_ext) ! Number of x-points for thinned grid
REAL :: pi_grb ! x-coordinate of pole point
REAL :: pj_grb ! y-coordinate of pole point
INTEGER :: ipole ! Projection center flag
REAL :: di_grb ! x-direction increment or grid length
REAL :: dj_grb ! y-direction increment or grid length
REAL :: latsw ! Latitude of South West corner point
REAL :: lonsw ! Longitude of South West corner point
REAL :: latne ! Latitude of North East corner point
REAL :: lonne ! Longitude of North East corner point
REAL :: lattru1 ! Latitude (1st) at which projection is true
REAL :: lattru2 ! Latitude (2nd) at which projection is true
REAL :: lontrue ! Longitude at which projection is true
REAL :: latrot ! Latitude of southern pole of rotation
REAL :: lonrot ! Longitude of southern pole of rotation
REAL :: angrot ! Angle of rotation
REAL :: latstr ! Latitude of the pole of stretching
REAL :: lonstr ! Longitude of the pole of stretching
REAL :: facstr ! Stretching factor
INTEGER :: scanmode ! Scanning indicator
INTEGER :: iscan ! x-direction scanning indicator
INTEGER :: jscan ! y-direction scanning indicator
INTEGER :: kscan ! FORTRAN index scanning indicator
INTEGER :: ires ! Resolution direction increments indicator
INTEGER :: iearth ! Earth shape indicator: spherical or oblate?
INTEGER :: icomp ! (u,v) components decomposition indicator
INTEGER :: jpenta ! J-Pentagonal resolution parameter
INTEGER :: kpenta ! K-Pentagonal resolution parameter
INTEGER :: mpenta ! M-Pentagonal resolution parameter
INTEGER :: ispect ! Spectral representation type
INTEGER :: icoeff ! Spectral coefficient storage mode
REAL :: xp_grb ! X coordinate of sub-satellite point
REAL :: yp_grb ! Y coordinate of sub-satellite point
REAL :: xo_grb ! X coordinate of image sector origin
REAL :: yo_grb ! Y coordinate of image sector origin
REAL :: zo_grb ! Camera altitude from center of Earth
INTEGER :: isrc
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
allocate(var_grb2d(nx_ext,ny_ext,n2dvs,n2dlvt))
allocate(var_grb3d(nx_ext,ny_ext,nz_ext,n3dvs,n3dlvt))
allocate(rcdata(nx_ext*ny_ext))
allocate(var_lev3d(nz_ext,n3dvs,n3dlvt))
IF(extdfcst == ' ') extdfcst='000:00:00'
READ (extdinit,'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)') &
iyr,imo,iday,ihr,imin,isec
CALL julday
(iyr,imo,iday,jldy)
myr=MOD(iyr,100)
ifhr=0
ifmin=0
ifsec=0
READ(extdfcst,'(i3)',ERR=4,END=4) ifhr
4 CONTINUE
WRITE (gribtime,'(i4.4,i2.2,i2.2,i2.2,a1,i2.2)') &
iyr,imo,iday,ihr,'f',ifhr
len1=LEN(dir_extd)
grbflen=len1
CALL strlnth
( dir_extd, grbflen )
IF( grbflen == 0 .OR. dir_extd(1:grbflen) == ' ' ) THEN
dir_extd = '.'
grbflen=1
END IF
IF( dir_extd(grbflen:grbflen) /= '/'.AND.grbflen < len1 ) THEN
grbflen=grbflen+1
dir_extd(grbflen:grbflen)='/'
END IF
lenrun = LEN( extdname )
CALL strlnth
( extdname, lenrun )
gribfile = dir_extd(1:grbflen)//extdname(1:lenrun) &
//'.'//gribtime(1:13)
grbflen = grbflen + lenrun + 14
!
!-----------------------------------------------------------------------
!
! RDNMCGRB reads NMC GRIB data
!
!-----------------------------------------------------------------------
!
gridtyp = avn3grid
mproj_grb = avn3proj
n2dvars = avn3nvs2d
n2dlvtps = avn3nlvt2d
DO k=1,n2dlvtps
DO n=1,n2dvars
var_id2d(n,k) = avn3var_id2d(n,k)
END DO
levtyp2d(k) = avn3levs2d(k)
END DO
n3dvars = avn3nvs3d
n3dlvtps = avn3nlvt3d
DO m=1,n3dlvtps
DO n=1,n3dvars
var_id3d(n,m) = avn3var_id3d(n,m)
END DO
levtyp3d(m) = avn3levs3d(m)
END DO
CALL rdnmcgrb
(nx_ext,ny_ext,nz_ext,gribfile,grbflen, gribtime, &
gridesc, iproj_grb, gthin, &
ni_grb,nj_grb,np_grb, nk_grb,zk_grb, npeq,nit, &
pi_grb,pj_grb,ipole, di_grb,dj_grb, &
latsw,lonsw, latne,lonne, &
latrot,lonrot,angrot, &
latstr,lonstr,facstr, &
lattru1,lattru2,lontrue, &
scanmode, iscan,jscan,kscan, &
ires,iearth,icomp, &
jpenta,kpenta,mpenta,ispect,icoeff, &
xp_grb,yp_grb, xo_grb,yo_grb,zo_grb, &
rcdata,var_grb2d,var_grb3d,var_lev3d,iret)
max_nr2d = 0
DO n=1,n2dvars
DO m=1,n2dlvtps
max_nr2d = MAX( max_nr2d, var_nr2d(n,m) )
END DO
END DO
max_nr3d = 0
min_nr3d = nz_ext
DO n=1,n3dvars
max_nr3d = MAX( max_nr3d, var_nr3d(n,1) )
min_nr3d = MIN( min_nr3d, var_nr3d(n,1) )
END DO
IF ( max_nr3d == 0 ) THEN
WRITE (6,'(a)') &
'No 3-D variable was found in the GRIB file', &
'Program stopped in GET_AVN_GRB.'
STOP
END IF
IF ( max_nr2d == 0 ) THEN
WRITE (6,'(a)') &
'No 2-D variables was found in the GRIB file'
END IF
! write (6,'(/a7,2x,6(i7))')
! : 'Lev\\VID',(var_id3d(n,1),n=1,n3dvars)
! DO 60 k=1,max_nr3d
! var_lev3d(k,5,1) = var_lev3d(k,1,1)
! var_lev3d(k,6,1) = var_lev3d(k,1,1)
! write (6,'(/i5,4x,6(i7))')
! : k,(var_lev3d(k,n,1),n=1,n3dvars)
60 CONTINUE
DO k=1,min_nr3d
DO n=2,n3dvars
IF ( var_lev3d(k,1,1) /= var_lev3d(k,n,1) ) THEN
WRITE (6,'(a)') &
'Variables were not at the same level.', &
'Program stopped in GET_AVN_GRB.'
STOP
END IF
END DO
END DO
IF ( iproj_grb == 5 .AND. ipole == 0 ) THEN ! Center in NP
iproj_ext = 1
ELSE IF ( iproj_grb == 5 .AND. ipole == 1 ) THEN ! Center in SP
iproj_ext = -1
ELSE IF ( iproj_grb == 3 .AND. ipole == 0 ) THEN ! Center in NP
iproj_ext = 2
ELSE IF ( iproj_grb == 3 .AND. ipole == 1 ) THEN ! Center in SP
iproj_ext = -2
ELSE IF ( iproj_grb == 1 ) THEN
iproj_ext = 3
ELSE IF ( iproj_grb == 0 ) THEN
iproj_ext = 4
ELSE
WRITE (6,'(a)') &
'Unknown map projection. Set to non-projection.'
iproj_ext = 0
END IF
scale_ext = 1.0
latnot_ext(1) = lattru1
latnot_ext(2) = lattru2
trlon_ext = lontrue
dx_ext = di_grb
dy_ext = dj_grb
DO i=ibgn,iend
DO j=jbgn,jend
lon_ext(i,j)= lonsw + (i-1) * dx_ext
lat_ext(i,j)= latsw + (j-1) * dy_ext
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Retrieve 2-D variables
!
!-----------------------------------------------------------------------
!
DO j=jbgn,jend
DO i=ibgn,iend
isrc = MOD(i,360)
IF( isrc == 0) isrc = 360
IF ( var_nr2d(1,1) == 0 ) THEN
psfc_ext (i,j) = -999.0
ELSE
psfc_ext (i,j) = var_grb2d(isrc,j,1,1) ! Pa
END IF
IF ( var_nr2d(2,1) == 0 ) THEN
trn_ext (i,j) = -999.0
ELSE
trn_ext (i,j) = var_grb2d(isrc,j,2,1) ! gpm (same as geometric meter?)
END IF
IF ( var_nr2d(1,2) == 0 ) THEN
tgrd_ext (i,j) = -999.0
ELSE
tgrd_ext (i,j) = var_grb2d(isrc,j,1,2)
END IF
IF ( var_nr2d(2,2) == 0 ) THEN
ugrd_ext (i,j) = -999.0
ELSE
ugrd_ext (i,j) = var_grb2d(isrc,j,2,2)
END IF
IF ( var_nr2d(3,2) == 0 ) THEN
vgrd_ext (i,j) = -999.0
ELSE
vgrd_ext (i,j) = var_grb2d(isrc,j,3,2)
END IF
IF ( var_nr2d(4,2) == 0 ) THEN
rhgrd_ext (i,j) = -999.0
ELSE
rhgrd_ext (i,j) = var_grb2d(isrc,j,4,2)*0.01 ! 0-1.0
END IF
IF ( var_nr2d(5,2) == 0 ) THEN
ptgrd_ext (i,j) = -999.0
ELSE
ptgrd_ext (i,j) = var_grb2d(isrc,j,5,2)
END IF
IF ( var_nr2d(1,3) == 0 ) THEN
pmsl_ext (i,j) = -999.0
ELSE
pmsl_ext (i,j) = var_grb2d(isrc,j,1,3)
END IF
IF ( var_nr3d(1,2) == 0 ) THEN
tsfc_ext (i,j) = -999.0
tsoil_ext (i,j) = -999.0
wetsfc_ext(i,j) = -999.0
wetdp_ext (i,j) = -999.0
ELSE
tsfc_ext (i,j) = var_grb2d(i,j,3,1) ! sfc temp.
IF ( nint(var_grb2d(i,j,5,1)) == 1 ) THEN ! soil temp over land
tsoil_ext (i,j) = var_grb3d(isrc,j,1,1,2)
IF ( tsoil_ext (i,j) <= 200. ) THEN
tsoil_ext (i,j) = tsfc_ext(i,j)
END IF
wetsfc_ext(i,j) = var_grb3d(isrc,j,2,2,2)
wetdp_ext(i,j) = var_grb3d(isrc,j,1,2,2)
ELSE ! sfc temp over sea
tsoil_ext (i,j) = tsfc_ext(i,j)
wetsfc_ext(i,j) = 1.0
wetdp_ext(i,j) = 1.0
END IF
END IF
IF ( var_nr2d(4,1) == 0 ) THEN
wetcanp_ext(i,j) = -999.0
ELSE
wetcanp_ext(i,j) = var_grb2d(isrc,j,4,1)*1.e-3 ! in meter
END IF
IF ( var_nr2d(6,1) == 0 ) THEN
snowdpth_ext(i,j) = -999.
ELSE
! Convert water equiv. of accum. snow depth (kg/m**2) to meters
! (where 1 meter liquid water is set equivqlent to 10 meters snow).
! 0.01 = 10. (m snow/m liquid) / (1000 kg/m**3)
snowdpth_ext(i,j) = 0.01 * var_grb2d(isrc,j,6,1) ! in meters
END IF
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Retrieve 3-D variables
!
!-----------------------------------------------------------------------
!
nz1 = MIN(var_nr3d(1,1),nz_ext)
IF ( var_lev3d(1,1,1) > var_lev3d(nz1,1,1) ) THEN ! 1st level at sfc
chklev = 1
lvscan = 0
ELSE
chklev = -1
lvscan = nz1+1
END IF
DO k=1,nz1
kk = chklev * k + lvscan
DO j=jbgn,jend
DO i=ibgn,iend
isrc = MOD(i,360)
IF( isrc == 0) isrc = 360
p_ext (i,j,kk) = 100.0 * FLOAT(var_lev3d(k,1,1)) ! Pressure
hgt_ext(i,j,kk) = var_grb3d(isrc,j,k,1,1)
u_ext (i,j,kk) = var_grb3d(isrc,j,k,2,1) ! u wind (m/s)
v_ext (i,j,kk) = var_grb3d(isrc,j,k,3,1) ! v wind (m/s)
t_ext (i,j,kk) = var_grb3d(isrc,j,k,4,1) ! Temperature (K)
qc_ext (i,j,kk) = -999.
qr_ext (i,j,kk) = -999.
qi_ext (i,j,kk) = -999.
qs_ext (i,j,kk) = -999.
qh_ext (i,j,kk) = -999.
END DO
END DO
END DO
CALL getqvs
(iend-ibgn+1,jend-jbgn+1,nz1, &
1,iend-ibgn+1,1,jend-jbgn+1,1,nz1, &
p_ext, t_ext, qv_ext )
nz2 = MIN( nz1, min_nr3d )
DO k=1,nz2
kk = chklev * k + lvscan
DO j=jbgn,jend
DO i=ibgn,iend
isrc = MOD(i,360)
IF( isrc == 0) isrc = 360
qv_ext(i,j,kk) = 0.01*var_grb3d(isrc,j,k,5,1)*qv_ext(i,j,kk)
END DO
END DO
END DO
IF ( nz2 < nz1 ) THEN
DO k=nz2+1,nz1
kk = chklev * k + lvscan
DO j=jbgn,jend
DO i=ibgn,iend
qv_ext(i,j,kk) = 0.0
var_lev3d(k,5,1) = var_lev3d(k,1,1)
END DO
END DO
END DO
END IF
istatus = 1
deallocate(var_grb2d,var_grb3d,rcdata,var_lev3d)
RETURN
END SUBROUTINE get_avn_grb