!Edited to use FORTRAN 77 include files...EMK
!arpscntl RLC istatus
!########################################################################
!########################################################################
!###### ######
!###### SUBROUTINE GETGRIB ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!########################################################################
!########################################################################
SUBROUTINE GETGRIB(nx_ext,ny_ext,nz_ext, & 1,15
dir_extd,extdname,extdopt, &
extdfmt, &
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, &
snowcvr_ext,trn_ext,psfc_ext, &
T_2m_ext,RH_2m_ext,U_10m_ext, &
V_10m_ext,MSLP_ext,RH_ext, &
undrgrnd,istatus)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Reads in a NMC GRIB file (RUC #87, RUC #211, Eta #212, or RUC2 #236)
! for processing by CVT2VERIF.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Eric Kemp
! November 1999
! Based on subroutines GETNMCRUC87, GETNMCRUC211, GETNMCETA212,
! GETNMCRUCN236, and GETNMCRUCP236.
!
! MODIFICATION HISTORY:
! Eric Kemp, 14 December 1999
! Added correction for converting relative humidity to specific
! humidity. Relative humidity is now always treated with respect
! to liquid water.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx_ext,ny_ext,nz_ext The dimension of data arrays
! dir_extd Directory name for external file
! extdname Prefix string of external file name
! extdopt Option of external data sources
! extdfmt Option of external data format
! 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)
!
! istatus status indicator (0=success, -1=unknown error,
! 1=file not found, 2=data error)
!
! WORK ARRAYS:
!
! var_grb3d Arrays to store the GRIB 3-D variables:
! var_grb2d Arrays to store the GRIB 2-D variables:
!
!-----------------------------------------------------------------------
!
! Use modules.
!
!-----------------------------------------------------------------------
! USE gribcst2
! USE globcst
! USE phycst
USE gribcst2
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INTEGER :: nx_ext,ny_ext,nz_ext
CHARACTER (LEN=*) :: dir_extd
CHARACTER (LEN=*) :: extdname
INTEGER :: extdopt
INTEGER :: extdfmt
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
!
!-----------------------------------------------------------------------
REAL :: lat_ext(nx_ext,ny_ext)
REAL :: lon_ext(nx_ext,ny_ext)
REAL :: p_ext (nx_ext,ny_ext,nz_ext) ! Pressure (Pascals)
REAL :: hgt_ext(nx_ext,ny_ext,nz_ext) ! Height (m)
REAL :: t_ext (nx_ext,ny_ext,nz_ext) ! Temperature (K)
REAL :: qv_ext (nx_ext,ny_ext,nz_ext) ! Specific humidity (kg/kg)
REAL :: u_ext (nx_ext,ny_ext,nz_ext) ! Eastward wind component
REAL :: v_ext (nx_ext,ny_ext,nz_ext) ! Northward wind component
REAL :: qc_ext (nx_ext,ny_ext,nz_ext) ! Cloud H2O mixing ratio (kg/kg)
REAL :: qr_ext (nx_ext,ny_ext,nz_ext) ! Rain H2O mixing ratio (kg/kg)
REAL :: qi_ext (nx_ext,ny_ext,nz_ext) ! Ice mixing ratio (kg/kg)
REAL :: qs_ext (nx_ext,ny_ext,nz_ext) ! Snow mixing ratio (kg/kg)
REAL :: qh_ext (nx_ext,ny_ext,nz_ext) ! Hail mixing ratio (kg/kg)
REAL :: tsfc_ext (nx_ext,ny_ext) ! Temperature at surface (K)
REAL :: tsoil_ext (nx_ext,ny_ext) ! Deep soil temperature (K)
REAL :: wetsfc_ext (nx_ext,ny_ext) ! Surface soil moisture
REAL :: wetdp_ext (nx_ext,ny_ext) ! Deep soil moisture
REAL :: wetcanp_ext(nx_ext,ny_ext) ! Canopy water amount
INTEGER :: snowcvr_ext(nx_ext,ny_ext) ! Snow cover
REAL :: trn_ext (nx_ext,ny_ext) ! External terrain (m)
REAL :: psfc_ext (nx_ext,ny_ext) ! Surface pressure (Pa)
REAL :: T_2m_ext(nx_ext,ny_ext)
REAL :: RH_2m_ext(nx_ext,ny_ext)
REAL :: U_10m_ext(nx_ext,ny_ext)
REAL :: V_10m_ext(nx_ext,ny_ext)
REAL :: MSLP_ext(nx_ext,ny_ext)
REAL :: RH_ext(nx_ext,ny_ext,nz_ext)
!-----------------------------------------------------------------------
!
! Other external variable arrays
!
!-----------------------------------------------------------------------
REAL :: x_ext(nx_ext)
REAL :: y_ext(ny_ext)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! 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
REAL :: govrd
INTEGER :: chklev, lvscan
INTEGER :: iret ! Return flag
LOGICAL :: exist
!-----------------------------------------------------------------------
!
! 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(nzgrb) ! Vertical coordinate parameters
REAL :: zk_grb(nz_ext) ! Vertical coordinate parameters
INTEGER :: npeq ! Number of lat circles from pole to equator
! INTEGER :: nit(nzgrb) ! Number of x-points for thinned grid
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 :: var_lev3d(nz_ext,n3dvs,n3dlvt)
REAL :: rcdata(nx_ext*ny_ext) ! temporary data array
REAL :: var_grb2d(nx_ext,ny_ext,n2dvs,n2dlvt) ! GRIB variables
REAL :: var_grb3d(nx_ext,ny_ext,nz_ext,n3dvs,n3dlvt) ! GRIB 3-D
! variables
LOGICAL :: ibms(nx_ext*ny_ext) ! BMS logical array for data bit map
REAL :: landseamask(nx_ext,ny_ext)
REAL :: theta_ext(nx_ext,ny_ext,nz_ext)
REAL :: msf_ext(nx_ext,ny_ext,nz_ext) ! Montgomery stream function
REAL :: vpt_ext(nx_ext,ny_ext,nz_ext) ! Virtual potential temperature
REAL :: mixrat_ext(nx_ext,ny_ext,nz_ext) ! Water vapor mixing ratio
REAL :: cplp(nx_ext,ny_ext,nz_ext) ! condensation pressure of lifted
! parcel (Pa)
REAL :: tv_ext, tvc_ext
REAL :: ROVCP_P, CPD_P, G0_P, RD_P
REAL :: tema, temb
INTEGER :: ii,jj
REAL :: A,B
REAL :: qvsat, pilev, qvsatice
INTEGER :: undrgrnd(nx_ext,ny_ext,nz_ext)
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
REAL,EXTERNAL :: f_qvsatl
!fpp$ expand (f_qvsatl)
!dir$ inline always f_qvsatl
!-----------------------------------------------------------------------
!
! Parameters
!
!-----------------------------------------------------------------------
REAL,PARAMETER :: missing = -9999.
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
istatus = -1
DO j = 1,n3dlvt
DO i = 1,n3dvs
var_id3d(i,j) = 255 ! Initialized as undefined. EMK
END DO
END DO
DO j = 1,n2dlvt
DO i = 1,n2dvs
var_id2d(i,j) = 255 ! Initialized as undefined. EMK
END DO
END DO
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
INQUIRE (FILE=gribfile, EXIST=exist)
IF (.NOT. exist) THEN
PRINT *, 'getgrib: ERROR: File does not exist: ', TRIM(gribfile)
istatus = 1
RETURN
END IF
!-----------------------------------------------------------------------
!
! RDNMCGRB reads NMC GRIB data
!
!-----------------------------------------------------------------------
govrd = g/rd
! EMK: This could perhaps be put in a separate subroutine...
IF (extdopt == 1) THEN
gridtyp = ruc87grid
mproj_grb = ruc87proj
n2dvars = ruc87nvs2d
n2dlvtps = ruc87nlvt2d
DO k=1,n2dlvtps
DO n=1,n2dvars
var_id2d(n,k) = ruc87var_id2d(n,k)
END DO
levtyp2d(k) = ruc87levs2d(k)
END DO
n3dvars = ruc87nvs3d
n3dlvtps = ruc87nlvt3d
DO m=1,n3dlvtps
DO n=1,n3dvars
var_id3d(n,m) = ruc87var_id3d(n,m)
END DO
levtyp3d(m) = ruc87levs3d(m)
END DO
ELSE IF (extdopt == 2) THEN
gridtyp = eta212grid
mproj_grb = eta212proj
n2dvars = eta212nvs2d
n2dlvtps = eta212nlvt2d
DO k=1,n2dlvtps
DO n=1,n2dvars
var_id2d(n,k) = eta212var_id2d(n,k)
END DO
levtyp2d(k) = eta212levs2d(k)
END DO
n3dvars = eta212nvs3d
n3dlvtps = eta212nlvt3d
DO m=1,n3dlvtps
DO n=1,n3dvars
var_id3d(n,m) = eta212var_id3d(n,m)
END DO
levtyp3d(m) = eta212levs3d(m)
END DO
ELSE IF (extdopt == 7) THEN
gridtyp = ruc211grid
mproj_grb = ruc211proj
n2dvars = ruc211nvs2d
n2dlvtps = ruc211nlvt2d
DO k=1,n2dlvtps
DO n=1,n2dvars
var_id2d(n,k) = ruc211var_id2d(n,k)
END DO
levtyp2d(k) = ruc211levs2d(k)
END DO
n3dvars = ruc211nvs3d
n3dlvtps = ruc211nlvt3d
DO m=1,n3dlvtps
DO n=1,n3dvars
var_id3d(n,m) = ruc211var_id3d(n,m)
END DO
levtyp3d(m) = ruc211levs3d(m)
END DO
ELSE IF (extdopt == 11) THEN
gridtyp = rucn236grid
mproj_grb = rucn236proj
n2dvars = rucn236nvs2d
n2dlvtps = rucn236nlvt2d
DO k=1,n2dlvtps
DO n=1,n2dvars
var_id2d(n,k) = rucn236var_id2d(n,k)
END DO
levtyp2d(k) = rucn236levs2d(k)
END DO
n3dvars = rucn236nvs3d
n3dlvtps = rucn236nlvt3d
DO m=1,n3dlvtps
DO n=1,n3dvars
var_id3d(n,m) = rucn236var_id3d(n,m)
END DO
levtyp3d(m) = rucn236levs3d(m)
END DO
ELSE IF (extdopt == 12) THEN
gridtyp = rucp236grid
mproj_grb = rucp236proj
n2dvars = rucp236nvs2d
n2dlvtps = rucp236nlvt2d
DO k=1,n2dlvtps
DO n=1,n2dvars
var_id2d(n,k) = rucp236var_id2d(n,k)
END DO
levtyp2d(k) = rucp236levs2d(k)
END DO
n3dvars = rucp236nvs3d
n3dlvtps = rucp236nlvt3d
DO m=1,n3dlvtps
DO n=1,n3dvars
var_id3d(n,m) = rucp236var_id3d(n,m)
END DO
levtyp3d(m) = rucp236levs3d(m)
END DO
ENDIF
! CALL rdnmcgrb(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, &
! iret)
CALL rdnmcgrb2
(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, &
nx_ext,ny_ext,nz_ext,var_lev3d,var_grb3d, &
var_grb2d,ibms,rcdata,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
DO n=1,n3dvars
max_nr3d = MAX( max_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 GETGRIB.'
istatus = 2
RETURN
END IF
IF ( max_nr2d == 0 ) THEN
WRITE (6,'(a)') &
'No 2-D variables was found in the GRIB file'
END IF
!arpscntl RLC print
WRITE (6,'(/a7,2x,6(i7))') &
'Lev\VID',(var_id3d(n,1),n=1,n3dvars)
DO k=1,max_nr3d
WRITE (6,'(i5,4x,6(i7))') &
k,(var_lev3d(k,n,1),n=1,n3dvars)
END DO
DO k=1,max_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 GETGRIB.'
istatus = 2
RETURN
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
CALL getmapr
(iproj,scale,latnot,trlon,x0,y0)
CALL setmapr
(iproj_ext,scale_ext,latnot_ext,trlon_ext)
CALL lltoxy
(1,1,latsw,lonsw,x0_ext,y0_ext)
DO i=1,nx_ext
x_ext(i)=x0_ext+(i-1)*dx_ext
END DO
DO j=1,ny_ext
y_ext(j)=y0_ext+(j-1)*dy_ext
END DO
CALL xytoll
(nx_ext,ny_ext,x_ext,y_ext,lat_ext,lon_ext)
!-----------------------------------------------------------------------
!
! Retrieve 2-D variables
!
!-----------------------------------------------------------------------
! EMK: This could perhaps be put into a separate subroutine...
WRITE(6,*)'Retrieving 2-D variables...'
DO j=1,ny_ext
DO i=1,nx_ext
landseamask(i,j) = real(0)
psfc_ext(i,j) = missing
trn_ext(i,j) = missing
tsfc_ext(i,j) = missing
T_2m_ext(i,j) = missing
RH_2m_ext(i,j) = missing
U_10m_ext(i,j) = missing
V_10m_ext(i,j) = missing
snowcvr_ext(i,j) = -9999
wetcanp_ext(i,j) = missing
tsfc_ext(i,j) = missing
tsoil_ext(i,j) = missing
wetsfc_ext(i,j) = missing
wetdp_ext(i,j) = missing
END DO
END DO
DO j=1,ny_ext
DO i=1,nx_ext
DO jj = 1,n2dlvt
DO ii = 1,n2dvs
IF (var_id2d(ii,jj) == 81) THEN ! Land/sea mask
landseamask(i,j) = var_grb2d(i,j,ii,jj)
ENDIF
END DO
END DO
END DO
END DO
DO j=1,ny_ext
DO i=1,nx_ext
DO jj = 1,n2dlvt
DO ii = 1,n2dvs
SELECT CASE (var_id2d(ii,jj))
CASE (1) ! Pressure (Pa)
IF ( levtyp2d(jj) == 001 ) THEN ! Surface pressure (Pa)
IF ( var_nr2d(ii,jj) /= 0 ) THEN
psfc_ext (i,j) = var_grb2d(i,j,ii,jj)
END IF
ENDIF
CASE (2) ! Pressure reduced to MSL (Pa)
IF ( levtyp2d(jj) == 102) THEN
IF ( var_nr2d(ii,jj) /= 0 ) THEN
MSLP_ext(i,j) = var_grb2d(i,j,ii,jj)/100.0 ! Pa to mb
ENDIF
ENDIF
CASE (7) ! Geopotential height (gpm)
IF (levtyp2d(jj) == 001 ) THEN ! Surface geopotential height
IF ( var_nr2d(ii,jj) /= 0 ) THEN
trn_ext (i,j) = var_grb2d(i,j,ii,jj)
ENDIF
ENDIF
CASE (8) ! Geometric height (m)
IF (levtyp2d(jj) == 001 ) THEN ! Surface geometric height
IF ( var_nr2d(ii,jj) /= 0) THEN
trn_ext (i,j) = var_grb2d(i,j,ii,jj)
ENDIF
ENDIF
CASE (11) ! Temperature (K)
IF (levtyp2d(jj) == 105 ) THEN ! 2 m temperature (K)
IF ( var_nr2d(ii,jj) /= 0 ) THEN
T_2m_ext(i,j)= var_grb2d(i,j,ii,jj)
ENDIF
ELSE IF (levtyp2d(jj) == 001 ) THEN ! Ground temperature (K)
tsfc_ext(i,j) = var_grb2d(i,j,ii,jj)
tsoil_ext(i,j) = var_grb2d(i,j,ii,jj)
ENDIF
CASE (33) ! U-winds (m/s)
IF (levtyp2d(jj) == 105 ) THEN ! 10 m U-winds (m/s)
IF ( var_nr2d(ii,jj) /= 0 ) THEN
U_10m_ext(i,j)= var_grb2d(i,j,ii,jj)
ENDIF
ENDIF
CASE (34) ! V-winds (m/s)
IF (levtyp2d(jj) == 105 ) THEN ! 10 m V-winds (m/s)
IF ( var_nr2d(ii,jj) /= 0 ) THEN
V_10m_ext(i,j)= var_grb2d(i,j,ii,jj)
ENDIF
ENDIF
CASE (52) ! Relative Humidity (%)
IF (levtyp2d(jj) == 105 ) THEN ! 2 m relative humidity (%)
IF ( var_nr2d(ii,jj) /= 0 ) THEN
rh_2m_ext(i,j)= var_grb2d(i,j,ii,jj)
ENDIF
ENDIF
CASE (66) ! Snow depth (m)
IF (levtyp2d(jj) == 001 ) THEN
IF ( var_nr2d(ii,jj) /= 0 ) THEN
IF (var_grb2d(i,j,ii,jj) == 2.54e-4) then ! >= 0.01 inches
snowcvr_ext(i,j) = 1
ELSE
snowcvr_ext(i,j) = 0
ENDIF
ENDIF
ENDIF
CASE (129) ! MAPS mean sea level pressure (Pa)
IF (levtyp2d(jj) == 102) THEN
IF ( var_nr2d(ii,jj) /= 0 ) THEN
MSLP_ext(i,j) = var_grb2d(i,j,ii,jj)/100.0 ! Pa to mb
ENDIF
ENDIF
CASE (130) ! Eta mean sea level pressure (Pa)
IF (levtyp2d(jj) == 102) THEN
IF ( var_nr2d(ii,jj) /= 0 ) THEN
MSLP_ext(i,j) = var_grb2d(i,j,ii,jj)/100.0 ! Pa to mb
ENDIF
ENDIF
CASE (143) ! Categorical snow (yes=1;no=0)
IF (levtyp2d(jj) == 001 ) THEN
IF ( var_nr2d(ii,jj) /= 0 ) THEN
snowcvr_ext(i,j) = nint(var_grb2d(i,j,ii,jj))
ENDIF
ENDIF
CASE (223) ! Plant canopy surface water (kg/m**2)
IF (levtyp2d(jj) == 001 ) THEN
IF ( var_nr2d(ii,jj) /= 0 ) THEN
wetcanp_ext(i,j) = var_grb2d(i,j,4,1)*1.e-3 ! in meter
ENDIF
ENDIF
CASE DEFAULT
END SELECT
END DO
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Retrieve 3-D variables
!
!-----------------------------------------------------------------------
CPD_P = 1004.686 ! cp in RUC
ROVCP_P = 0.285714 ! rd/cp used in RUC
G0_P = 9.80665 ! gravity in RUC
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
WRITE(6,*)'Retrieving 3-D variables...'
DO k = 1,nz_ext
DO j = 1,ny_ext
DO i = 1,nx_ext
p_ext(i,j,k) = missing
hgt_ext(i,j,k) = missing
u_ext(i,j,k) = missing
v_ext(i,j,k) = missing
qv_ext(i,j,k) = missing
qc_ext(i,j,k) = missing
qr_ext(i,j,k) = missing
qi_ext(i,j,k) = missing
qs_ext(i,j,k) = missing
qh_ext(i,j,k) = missing
msf_ext(i,j,k) = missing
theta_ext(i,j,k) = missing
vpt_ext(i,j,k) = missing
undrgrnd(i,j,k) = -999
END DO
END DO
END DO
DO k = 1,nz1
kk = chklev * k + lvscan
DO j=1,ny_ext
DO i=1,nx_ext
DO jj = 1,n3dlvt
DO ii = 1,n3dvs
SELECT CASE (var_id3d(ii,jj))
CASE (1) ! Pressure (Pa)
IF (levtyp3d(jj) == 109) THEN ! Pressure at Hybrid Sfc.
p_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
ENDIF
CASE (7) ! Height (m)
hgt_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj) ! height (m)
CASE (11) ! Temperature
t_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (13) ! Potential temperature (K)
theta_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (33) ! u wind (m/s)
u_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (34) ! v wind (m/s)
v_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (37) ! Montgomery stream function
msf_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (51) ! Specific humidity
qv_ext (i,j,kk) = var_grb3d(i,j,k,ii,jj) ! Spec. humidity
! (kg/kg)
CASE (52) ! Relative humidity (%)
IF (levtyp3d(jj) == 100) THEN ! pressure surface
RH_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
ENDIF
CASE (85) ! Soil temperature (K)
IF (levtyp3d(jj) == 111) THEN ! soil data
IF (extdopt == 1) THEN ! RUC #87
IF (var_nr3d(ii,jj) /= 0) THEN
tsfc_ext (i,j) = var_grb3d(i,j,1,ii,jj)
tsoil_ext (i,j) = var_grb3d(i,j,3,ii,jj)
ENDIF
ELSE IF (extdopt == 2) THEN ! Eta #212
IF (var_nr3d(ii,jj) /= 0) THEN
IF ( nint(landseamask(i,j)).eq.1 ) THEN
! soil temp over land
tsoil_ext (i,j) = 0.1 * var_grb3d(i,j,1,ii,jj) &
+ 0.3 * var_grb3d(i,j,2,ii,jj) &
+ 0.6 * var_grb3d(i,j,3,ii,jj)
! 0-100cm average
ENDIF
ENDIF
ELSE IF (extdopt == 11) THEN ! RUC Native #236
IF (var_nr3d(ii,jj) /= 0) THEN
tsfc_ext (i,j) = var_grb3d(i,j,1,ii,jj)
tsoil_ext (i,j) = var_grb3d(i,j,3,ii,jj)
ENDIF
ENDIF
ENDIF
CASE (144) ! Volumetric soil moisture (m**3/m**3)
IF (levtyp3d(jj) == 112) THEN ! soil data
IF (extdopt == 1) THEN ! RUC # 87
IF (var_nr3d(ii,jj) /= 0) THEN
wetsfc_ext (i,j) = var_grb3d(i,j,1,ii,jj)
wetdp_ext (i,j) = var_grb3d(i,j,3,ii,jj)
ENDIF
ELSE IF (extdopt == 2) THEN ! Eta #212
IF (var_nr3d(ii,jj) /= 0) THEN
wetsfc_ext(i,j) = var_grb3d(i,j,1,ii,jj)
wetdp_ext(i,j) = 0.1 * var_grb3d(i,j,1,ii,jj) &
+ 0.3 * var_grb3d(i,j,2,ii,jj) &
+ 0.6 * var_grb3d(i,j,3,ii,jj) ! 0-100cm average
ENDIF
ELSE IF (extdopt == 11) THEN
IF (var_nr3d(ii,jj) /= 0) THEN ! RUC Native #236
wetsfc_ext (i,j) = var_grb3d(i,j,1,ii,jj)
wetdp_ext (i,j) = var_grb3d(i,j,3,ii,jj)
ENDIF
ENDIF
ENDIF
CASE (153) ! cloud water mixing ratio (kg/kg)
qc_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (159) ! condensation pressure of lifted parcel (Pa)
cplp(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (170) ! rain water mixing ratio (kg/kg)
qr_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (171) ! snow mixing ratio (kg/kg)
qs_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (178) ! ice mixing ratio (kg/kg)
qi_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (179) ! graupel mixing ratio (kg/kg)
qh_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (185) ! water vapor mixing ratio (kg/kg)
mixrat_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE (189) ! virtual potential temperature (K)
vpt_ext(i,j,kk) = var_grb3d(i,j,k,ii,jj)
CASE DEFAULT
END SELECT
END DO
END DO
END DO
END DO
END DO
WRITE(6,*)'Almost done with 3-D variables...'
!-----------------------------------------------------------------------
!
! If processing isobaric data, determine pressure at each constant
! pressure level and check for portions of constant pressure grids
! that are below the surface.
!
!-----------------------------------------------------------------------
DO k=1,nz1
kk = chklev * k + lvscan
DO j=1,ny_ext
DO i=1,nx_ext
IF (extdopt == 2 .OR. extdopt == 12) THEN ! Pressure on constant
! pressure surface.
p_ext (i,j,kk) = 100.0 * FLOAT(var_lev3d(k,1,1))
IF (((p_ext(i,j,kk) > psfc_ext(i,j))) .AND. &
(psfc_ext(i,j) > 0.) ) THEN
undrgrnd(i,j,kk) = 1
ELSE
undrgrnd(i,j,kk) = 0
ENDIF
IF( (extdopt == 12 .AND. p_ext(i,j,kk) > 0.0) .AND. &
(t_ext(i,j,kk) > 0.0) ) then
qvsat= f_qvsatl
( p_ext(i,j,kk), t_ext(i,j,kk) )
qv_ext(i,j,kk)= RH_ext(i,j,kk) * qvsat * 0.01
ENDIF
IF( (extdopt == 2 .AND. p_ext(i,j,kk) > 0.0) .AND. &
(t_ext(i,j,kk) > 0.0) ) then
qvsat= f_qvsatl
( p_ext(i,j,kk), t_ext(i,j,kk) )
RH_ext(i,j,kk) = qv_ext(i,j,kk)/(qvsat*0.01)
ENDIF
ENDIF
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! If processing RUC native coordinate data, calculate temperature,
! height, and specific humidity.
!
!-----------------------------------------------------------------------
DO k=1,nz1
kk = chklev * k + lvscan
DO j=1,ny_ext
DO i=1,nx_ext
IF (extdopt == 1) THEN
pilev = (p_ext(i,j,kk)/100000.)**ROVCP_P
tv_ext = theta_ext(i,j,kk)*pilev ! Virtual Temperature (K)
hgt_ext(i,j,kk) = (msf_ext(i,j,kk)-CPD_P*tv_ext)/G0_P
! Height (m) from Montgomery function with
! M = CpTv + gz
tvc_ext = theta_ext(i,j,kk) &
* (cplp(i,j,kk)/100000.)**ROVCP_P
! Virtual Temperature (K) at LCL
CALL tv2tq
( tvc_ext, cplp(i,j,kk), tema, temb )
t_ext(i,j,kk) = tema &
* (p_ext(i,j,kk)/cplp(i,j,kk))**ROVCP_P ! Temperature (K)
qv_ext(i,j,kk) = temb ! Specific humidity
ENDIF
IF (extdopt == 11) THEN
A = real(100000)/p_ext(i,j,kk)
A = A**ROVCP_P
tvc_ext = vpt_ext(i,j,kk)/A ! Virtual Temperature
B = 0.61*mixrat_ext(i,j,kk)
B = real(1) + B
t_ext(i,j,kk) = tvc_ext/B ! Temperature (K)
A = mixrat_ext(i,j,kk)*p_ext(i,j,kk)
A = A/(0.622 - mixrat_ext(i,j,kk))
qv_ext(i,j,kk) = A*0.622/p_ext(i,j,kk) !SpecificHumidity
ENDIF
END DO
END DO
END DO
WRITE(6,*)'Finished with 3-D variables...'
!-----------------------------------------------------------------------
!
! Rotate winds to be relative to true north, if necessary.
!
!-----------------------------------------------------------------------
IF (extdopt == 1 .OR. extdopt == 2 .OR. extdopt == 7 .OR. &
extdopt == 11 .OR. extdopt == 12) THEN
DO k=1,nz1
CALL uvmptoe
(nx_ext,ny_ext,u_ext(1,1,k),v_ext(1,1,k), &
lon_ext,u_ext(1,1,k),v_ext(1,1,k))
END DO
!-----------------------------------------------------------------------
!
! Reset map projection to previous values
!
!-----------------------------------------------------------------------
CALL setmapr
(iproj,scale,latnot,trlon)
CALL setorig
(1,x0,y0)
ENDIF
istatus = 0
RETURN
END SUBROUTINE getgrib