!TODO: List filenames in the input file rather than having the program
! assemble the filenames...EMK
!TODO: nlevel, nvar input rather than hardwired
!########################################################################
!########################################################################
!###### ######
!###### PROGRAM CVT2VERIF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!########################################################################
!########################################################################
PROGRAM cvt2verif,26
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in an ARPS history dump or RUC or Eta GRIB file, and:
! 1. Calculates user specified variables at user specified
! levels.
! 2. Vertically interpolates to user specified levels, if
! necessary.
! 3. Outputs data to an HDF file for use by VERIFGRID.
!
!-----------------------------------------------------------------------
!
! HISTORY:
! 1999/11/01 First written by Eric Kemp
! 1999/12/29 Modified for multidimensional arrays by Richard Carpenter
! 2000/03/31 Major changes by Eric Kemp. Modified the HDF
! output to include the four corners of the grid (lat/lon
! coordinates) for the NCL map plotting; replaced some
! modules with FORTRAN 77 include files; passed 'model'
! and 'grid' data from input file to program.
!
! 2000/07/07 Added checks for non-blank characters in model and grid
! variables (HDF does not like writing blank character
! variables).
! 2002/03/29 Jason Levit (Williams SRA)
! Modifications to the "getarps" call to update
! for use with ARPS 5.0
!
!-----------------------------------------------------------------------
!
! Use modules
!
!-----------------------------------------------------------------------
USE extdims2
USE verif
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
IMPLICIT NONE ! Force explicit declarations
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'grid.inc'
!-----------------------------------------------------------------------
!
! 2-D verification variables on forecast grid (x,y)
!
!-----------------------------------------------------------------------
REAL, ALLOCATABLE :: var_p(:,:,:,:,:) ! dims: nx, ny, nZ, nT, nVar
REAL, ALLOCATABLE :: var_sfc(:,:,:,:) ! dims: nx, ny, nT, nVar
!-----------------------------------------------------------------------
!
! External grid variables
!
!-----------------------------------------------------------------------
INTEGER :: nx,ny,nz,nxinput,nyinput,nzinput
INTEGER :: nstyps
REAL, ALLOCATABLE, DIMENSION(:,:,:) :: tem1, tem2, tem3, tem4
REAL, ALLOCATABLE :: vtem2d(:,:)
INTEGER :: iproj_ext ! external data map projection
REAL :: scale_ext ! external data map scale factor
REAL :: trlon_ext ! external data true longitude
REAL :: latnot_ext(2) ! external data true latitude(s)
REAL :: x0_ext,y0_ext ! external data origin
REAL,ALLOCATABLE :: x_ext(:) ! external data x-coordinate
REAL,ALLOCATABLE :: y_ext(:) ! external data y-coordinate
REAL,ALLOCATABLE :: lat_ext(:,:) ! external data latidude
REAL,ALLOCATABLE :: lon_ext(:,:) ! external data longitude
REAL,ALLOCATABLE :: latu_ext(:,:)
REAL,ALLOCATABLE :: lonu_ext(:,:)
REAL,ALLOCATABLE :: latv_ext(:,:)
REAL,ALLOCATABLE :: lonv_ext(:,:)
!-----------------------------------------------------------------------
!
! External forecast variables
!
!-----------------------------------------------------------------------
REAL,ALLOCATABLE :: p_ext(:,:,:) ! Pressure (Pascals)
REAL,ALLOCATABLE :: hgt_ext(:,:,:) ! Height (m)
REAL,ALLOCATABLE :: zp_ext(:,:,:) ! Height (m) (on arps grid)
REAL,ALLOCATABLE :: t_ext(:,:,:) ! Temperature (K)
REAL,ALLOCATABLE :: u_ext(:,:,:) ! Eastward wind component
REAL,ALLOCATABLE :: v_ext(:,:,:) ! Northward wind component
REAL,ALLOCATABLE :: w_ext(:,:,:) ! Vertical velocity component
REAL,ALLOCATABLE :: uatv_ext(:,:,:)
REAL,ALLOCATABLE :: vatu_ext(:,:,:)
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)
INTEGER,ALLOCATABLE :: snowcvr_ext(:,:) ! Snow cover
INTEGER, ALLOCATABLE :: soiltyp_ext (:,:,:) ! Soil type
REAL, ALLOCATABLE :: stypfrct_ext(:,:,:) ! Soil type
INTEGER, ALLOCATABLE :: vegtyp_ext (:,:) ! Vegetation type
REAL, ALLOCATABLE :: lai_ext (:,:) ! Leaf Area Index
REAL, ALLOCATABLE :: roufns_ext (:,:) ! Surface roughness
REAL, ALLOCATABLE :: veg_ext (:,:) ! Vegetation fraction
REAL, ALLOCATABLE :: tsoil_ext (:,:,:) ! Deep soil temperature (K)
REAL, ALLOCATABLE :: qsoil_ext (:,:,:) ! 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*4,ALLOCATABLE :: T_2m_ext (:,:)
REAL*4,ALLOCATABLE :: RH_2m_ext(:,:)
REAL*4,ALLOCATABLE :: U_10m_ext(:,:)
REAL*4,ALLOCATABLE :: V_10m_ext(:,:)
REAL,ALLOCATABLE :: MSLP_ext(:,:)
REAL,ALLOCATABLE :: vMSLP_ext(:,:)
REAL,ALLOCATABLE :: RH_ext(:,:,:)
REAL,ALLOCATABLE :: vRH_ext(:,:,:)
REAL,ALLOCATABLE :: valgpzc(:,:,:)
REAL,ALLOCATABLE :: vt700(:,:)
INTEGER,ALLOCATABLE :: undrgrnd(:,:,:)
REAL,ALLOCATABLE :: vlat2d(:,:),vlon2d(:,:)
REAL,ALLOCATABLE :: vx_ext(:),vy_ext(:)
CHARACTER (LEN=256) :: grdbasfn_ext
CHARACTER (LEN=3) :: fmtn
INTEGER :: lenrun, ldir
INTEGER :: itmp,ireturn
!-----------------------------------------------------------------------
!
! External grid map variables
!
!-----------------------------------------------------------------------
REAL :: scale
REAL :: trulat(2)
REAL :: scswlat,scswlon
REAL :: mapswlat,mapswlon,mapnwlat,mapnwlon, &
mapselat,mapselon,mapnelat,mapnelon
!-----------------------------------------------------------------------
!
! Miscellaneous variables
!
!-----------------------------------------------------------------------
INTEGER :: vnx,vny,vnz
REAL,ALLOCATABLE :: vp_ext(:,:,:) ! Pressure (Pascals)
REAL,ALLOCATABLE :: vhgt_ext(:,:,:) ! Height (m)
REAL,ALLOCATABLE :: vt_ext(:,:,:) ! Temperature (K)
REAL,ALLOCATABLE :: vu_ext(:,:,:) ! Eastward wind component
REAL,ALLOCATABLE :: vv_ext(:,:,:) ! Northward wind component
REAL,ALLOCATABLE :: vqv_ext(:,:,:) ! Specific humidity (kg/kg)
CHARACTER*19 :: extdinit
CHARACTER*9 :: extdfcst
CHARACTER*9 :: julfname
INTEGER :: istatus
INTEGER :: initsec,kftime,jabssec,iabssec
INTEGER :: ifhr,ifmin,ifsec,mfhr
INTEGER :: jldy
INTEGER :: myr
REAL :: qvsat
INTEGER :: i,j,k,l
INTEGER :: kk
REAL :: zlevel,z01, p00, t00
REAL,PARAMETER :: missing = -9999. ! "Underground"/missing flag
INTEGER :: ifile,ntime, date(6), init_date(6)
INTEGER,ALLOCATABLE :: timesec(:)
REAL :: hgtkm
REAL :: mapswx,mapswy,mapnwx,mapnwy,mapsex,mapsey,mapnex,mapney
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
REAL,EXTERNAL :: f_qvsatl
!fpp$ expand (f_qvsatl)
!dir$ inline always f_qvsatl
!-----------------------------------------------------------------------
!
! Some universal constants
!
!-----------------------------------------------------------------------
REAL, PARAMETER :: kappa=287.053/CP, &
gamma=6.5, & ! 6.5 K/km
ex1=0.1903643, & ! R*gamma/g
ex2=5.2558774, & ! g/R/gamma
mbtopa=100.
!-----------------------------------------------------------------------
!
! Namelists
!
!-----------------------------------------------------------------------
INTEGER, PARAMETER :: maxfile=50
INTEGER :: extdopt, extdfmt, use_multiple_names, &
nxinput,nyinput,nzinput, nextdfil
CHARACTER*8 :: model
CHARACTER*4 :: grid
! CHARACTER*29 :: extdtime(maxfile)
! CHARACTER*256 :: extdname(maxfile), dir_extd(maxfile), veriffile
CHARACTER (LEN=256) :: dir_extd(maxfile),extdname(maxfile)
CHARACTER (LEN=256) :: extdtime(maxfile),veriffile
CHARACTER (LEN=256) :: dir_extd_temp,extdname_temp,extdtime_temp
NAMELIST /infile/ extdopt, model, grid, &
nextdfil, extdname, nxinput, nyinput, nzinput, &
extdfmt, dir_extd, extdtime, use_multiple_names
NAMELIST /output/ veriffile
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Set dummy global grid information for GETARPS. This data will not
! affect what is output to the verification HDF file.
!
!-----------------------------------------------------------------------
sclfct = 1.0
trulat1 = 60.0
trulat2 = 30.0
trulon = -100.
ctrlat = 37.
ctrlat = -92.
mapproj = 2
PRINT '(10(A/))', &
' ',&
' ###################################################################',&
' # #',&
' # Welcome to CVT2VERIF, a program that reads in ARPS history #',&
' # dumps and isobaric RUC and Eta GRIB files (#236 and #212, #',&
' # respectively), and outputs verif data in .hdf format. #',&
' # #',&
' ###################################################################'
!-----------------------------------------------------------------------
!
! Read namelists
!
!-----------------------------------------------------------------------
model =''
grid = ''
PRINT *, 'Reading NAMELIST infile'
READ (*, infile, ERR=8000, END=8001)
PRINT *, 'Reading NAMELIST output'
READ (*, output, ERR=8000, END=8001)
GO TO 8010
8000 CONTINUE
PRINT *, 'FATAL: Error reading Namelist. '
WRITE (*, NML=infile)
WRITE (*, NML=output)
STOP
8001 CONTINUE
PRINT *, 'FATAL: End of file reading Namelist. '
WRITE (*, NML=infile)
WRITE (*, NML=output)
STOP
8010 CONTINUE
IF (use_multiple_names == 0) THEN
dir_extd(2:) = dir_extd(1)
extdname(2:) = extdname(1)
END IF
!EMK 7/7/2000
IF (LEN_TRIM(model).EQ.0) THEN
IF (extdopt.EQ.0) THEN
model = 'ARPS'
ELSE IF (extdopt.EQ.2) THEN
model = 'Eta'
ELSE IF (extdopt.EQ.11.OR.extdopt.EQ.12) THEN
model = 'RUC2'
ELSE
model = '???'
END IF
END IF
IF (LEN_TRIM(grid).EQ.0) THEN
IF (extdopt.EQ.0) THEN
grid = '???'
ELSE IF (extdopt.EQ.2) THEN
grid = '212'
ELSE IF (extdopt.EQ.11.OR.extdopt.EQ.12) THEN
grid = '236'
ELSE
grid = '???'
END IF
END IF
!-----------------------------------------------------------------------
!
! Set dimensions
!
!-----------------------------------------------------------------------
IF (extdopt == 0) THEN ! Set ARPS dimensions
nx = nxinput
ny = nyinput
nz = nzinput
ELSE IF (extdopt == 1) THEN ! Set NMC RUC GRIB #87 dimensions
nx = ruc87nx
ny = ruc87ny
nz = ruc87nz
WRITE(6,*)'ERROR: RUC GRIB #87 is not supported by this program',&
'at this time. Exiting...'
STOP
ELSE IF (extdopt == 2) THEN ! Set NMC Eta GRIB #212 dimensions
nx = eta212nx
ny = eta212ny
nz = eta212nz
ELSE IF (extdopt == 3) THEN ! Set LAPS dimensions
nx = nxinput
ny = nyinput
nz = nzinput
WRITE(6,*)'ERROR: LAPS is not supported by this program', &
'at this time. Exiting...'
STOP
ELSE IF (extdopt == 4) THEN ! Set NMC RUC GEMPAK dimensions
nx = rucgemnx
ny = rucgemny
nz = rucgemnz
WRITE(6,*)'ERROR: RUC GEMPAK is not supported by this program', &
'at this time. Exiting...'
STOP
ELSE IF (extdopt == 5) THEN ! Set NMC Eta GEMPAK dimensions
nx = etagemnx
ny = etagemny
nz = etagemnz
WRITE(6,*)'ERROR: Eta GEMPAK is not supported by this program', &
'at this time. Exiting...'
STOP
ELSE IF (extdopt == 6) THEN ! Set COAMPS dimensions
nx = nxinput
ny = nyinput
nz = nzinput
WRITE(6,*)'ERROR: COAMPS is not supported by this program', &
'at this time. Exiting...'
STOP
ELSE IF (extdopt == 7) THEN ! Set NCEP RUC2 GRIB #211 dimensions
nx = ruc211nx
ny = ruc211ny
nz = ruc211nz
WRITE(6,*)'ERROR: RUC GRIB #211 is not supported by this program',&
'at this time. Exiting...'
STOP
ELSE IF (extdopt == 8) THEN ! Set NCEP global re-analysis on T62
! Gaussian lat/lon grid dimensions
nx = glreannx
ny = glreanny
nz = glreannz
WRITE(6,*)'ERROR: NCEP reanalysis is not supported by this ', &
'program at this time. Exiting...'
STOP
ELSE IF (extdopt == 9) THEN ! Set NCEP RUC2 GEMPAK dimensions
nx = ruc2gemnx
ny = ruc2gemny
nz = ruc2gemnz
WRITE(6,*)'ERROR: RUC2 GEMPAK is not supported by this ', &
'program at this time. Exiting...'
STOP
ELSE IF (extdopt == 10) THEN ! Set NCEP ETA GEMPAK #104 dimensions
nx = etagemnx
ny = etagemny
nz = etagemnz
WRITE(6,*)'ERROR: Eta GEMPAK is not supported by this ', &
'program at this time. Exiting...'
STOP
ELSE IF (extdopt == 11) THEN ! Set NCEP native coordinate RUC2
! GRIB #236 dimensions
nx = rucn236nx
ny = rucn236ny
nz = rucn236nz
WRITE(6,*)'ERROR: RUC Native coordinate GRIB #236 is not supported',&
'by this program at this time. Exiting...'
STOP
ELSE IF (extdopt == 12) THEN ! Set NCEP isobaric RUC2
! GRIB #236 dimensions
nx = rucp236nx
ny = rucp236ny
nz = rucp236nz
ELSE
WRITE(6,*)'Invalid option for extdopt. Exiting program...'
STOP
END IF
!-----------------------------------------------------------------------
!
! Allocate arrays.
!
!-----------------------------------------------------------------------
WRITE(6,*)'Allocating arrays...'
vnx = nx
vny = ny
vnz = nz
nstyps = 4
nstyp = nstyps
IF (extdopt == 0) THEN ! ARPS
vnx = nx-3
vny = ny-3
!---------------------------------------------------------------------
!
! Here, even though multiple times are being used, we read in the data
! from the first "grdbas" file, since we are using the same domain for
! the verification statistics and the nx,ny,nz and nsytps won't change.
!
!---------------------------------------------------------------------
dir_extd_temp=dir_extd(1)
extdname_temp=extdname(1)
lenrun=LEN(dir_extd_temp)
ldir=lenrun
CALL strlnth
( dir_extd_temp, ldir )
IF ( ldir == 0 .OR. dir_extd_temp(1:ldir) == ' ' ) THEN
dir_extd_temp = '.'
ldir = 1
END IF
IF( dir_extd_temp(ldir:ldir) /= '/' .AND. ldir < lenrun ) THEN
ldir = ldir + 1
dir_extd_temp(ldir:ldir) = '/'
END IF
lenrun = LEN( extdname_temp )
CALL strlnth
( extdname_temp, lenrun )
IF( extdfmt == 1 ) THEN
fmtn = 'bin'
ELSE IF ( extdfmt == 2 ) THEN
fmtn = 'asc'
ELSE IF ( extdfmt == 3 ) THEN
fmtn = 'hdf'
ELSE IF ( extdfmt == 4 ) THEN
fmtn = 'pak'
ELSE IF ( extdfmt == 6 ) THEN
fmtn = 'bn2'
ELSE IF ( extdfmt == 7 ) THEN
fmtn = 'net'
ELSE IF ( extdfmt == 8 ) THEN
fmtn = 'npk'
ELSE IF ( extdfmt == 9 ) THEN
fmtn = 'gad'
ELSE IF ( extdfmt == 10 ) THEN
fmtn = 'grb'
ELSE
WRITE(6,'(a,a,a)') &
'Unknown format, ', extdfmt, '. Program stopped in CVT2VERIF.'
STOP
END IF
grdbasfn_ext = dir_extd_temp(1:ldir)//extdname_temp(1:lenrun) &
//'.'//fmtn//'grdbas'
CALL get_dims_from_data
(extdfmt,grdbasfn_ext,nx,ny,nz,nstyps,ireturn)
nstyp = nstyps
ALLOCATE(soiltyp_ext(nx,ny,nstyps),stypfrct_ext(nx,ny,nstyps), &
vegtyp_ext(nx,ny), &
lai_ext(nx,ny),roufns_ext(nx,ny),veg_ext(nx,ny))
ALLOCATE (tem1(nx,ny,nz), tem2(nx,ny,nz), &
tem3(nx,ny,nz), tem4(nx,ny,nz), &
vtem2d(vnx,vny), valgpzc(vnx,vny,vnz), vt700(vnx,vny), &
STAT=istatus)
IF (istatus /= 0) CALL alloc_fail
(istatus, 'tem')
ENDIF
WRITE(6,*)'nx = ',nx,' vnx = ',vnx
WRITE(6,*)'ny = ',ny,' vny = ',vny
WRITE(6,*)'nz = ',nz,' vnz = ',vnz
ALLOCATE (undrgrnd(nx,ny,nz), vp_ext(vnx,vny,vnz), vhgt_ext(vnx,vny,vnz), &
vt_ext(vnx,vny,vnz), vqv_ext(vnx,vny,vnz), vu_ext(vnx,vny,vnz), &
vv_ext(vnx,vny,vnz), &
p_ext(nx,ny,nz), hgt_ext(nx,ny,nz), t_ext(nx,ny,nz), &
qv_ext(nx,ny,nz), u_ext(nx,ny,nz), v_ext(nx,ny,nz), &
qc_ext(nx,ny,nz), qr_ext(nx,ny,nz), qi_ext(nx,ny,nz), &
qs_ext(nx,ny,nz), qh_ext(nx,ny,nz), &
tsoil_ext(nx,ny,0:nstyps), qsoil_ext(nx,ny,0:nstyps), &
wetcanp_ext(nx,ny,0:nstyps), snowcvr_ext(nx,ny), trn_ext(nx,ny), &
psfc_ext(nx,ny), T_2m_ext(nx,ny), RH_2m_ext(nx,ny), &
U_10m_ext(nx,ny), V_10m_ext(nx,ny), MSLP_ext(nx,ny), &
vMSLP_ext(vnx,vny), RH_ext(nx,ny,nz), vRH_ext(vnx,vny,vnz), &
x_ext(nx), y_ext(ny), lat_ext(nx,ny), lon_ext(nx,ny), &
var_p(vnx,vny,nlevel,nextdfil,nvar_p), &
var_sfc(vnx,vny,nextdfil,nvar_sfc), &
timesec(nextdfil),vlat2d(vnx,vny),vlon2d(vnx,vny), &
vx_ext(vnx),vy_ext(vny), &
latu_ext(nx,ny),lonu_ext(nx,ny), &
latv_ext(nx,ny),lonv_ext(nx,ny), &
zp_ext(nx,ny,nz), w_ext(nx,ny,nz), &
vatu_ext(nx,ny,nz), uatv_ext(nx,ny,nz), &
STAT=istatus)
IF (istatus /= 0) CALL alloc_fail
(istatus, '_ext')
var_p = missing
var_sfc = missing
WRITE(6,*)'Finished allocating arrays...'
!-----------------------------------------------------------------------
!
! Loop through the data times provided via NAMELIST
!
!-----------------------------------------------------------------------
loop_ifile: DO ifile = 1,nextdfil
PRINT *, 'Processing ', ifile, ' ', TRIM(extdname(ifile)), ' ', &
TRIM(extdtime(ifile))
runname = extdname(ifile)
! FIX-ME
nocmnt = 0
!-----------------------------------------------------------------------
!
! Determine the Julian date for the data.
!
!-----------------------------------------------------------------------
READ(extdtime(ifile),'(a19,1x,a9)') extdinit,extdfcst
IF (extdfcst.eq.' ') extdfcst='000:00:00'
READ(extdinit, '(I4,5(1X,I2))', ERR=920,END=920) date(:)
year = date(1)
month = date(2)
day = date(3)
hour = date(4)
minute = date(5)
second = date(6)
IF (ifile == 1) init_date(:) = date(:)
CALL julday
(year, month, day, jldy)
myr=mod(year,100)
ifhr=0
ifmin=0
ifsec=0
READ(extdfcst, '(i3,2(1x,i2))',ERR=920,END=920) ifhr,ifmin,ifsec
mfhr=mod(ifhr,24)
jldy = jldy + ifhr/24
WRITE(julfname, '(i2.2,i3.3,2i2.2)') myr,jldy,hour,mfhr
CALL ctim2abss
(year,month,day,hour,minute,second,iabssec)
jabssec=(ifhr*3600) + (ifmin*60) + ifsec + iabssec
IF (ifile == 1) THEN
initsec = jabssec
ENDIF
kftime=jabssec-initsec
curtim=float(kftime)
timesec(ifile) = curtim
PRINT *, 'Calling rdextfil, looking for ', TRIM(extdfcst), &
' hour forecast initialized at ',extdinit, ' UTC'
PRINT *, 'ARPS delta time is ', kftime, ' abs sec=', jabssec
!-----------------------------------------------------------------------
!
! Get external data.
!
!-----------------------------------------------------------------------
! Williams SRA
! JJL modification 03/29/02
! Change call from custom "getarps2" to standard "getarps".
! Added several temporary arrays to update call for new ARPS 5.0 code.
IF (extdopt == 0) THEN
WRITE(6,*)'Calling getarps...'
CALL getarps
(nx,ny,nz,nzsoil, &
dir_extd(ifile),extdname(ifile),extdopt,extdfmt, &
extdinit,extdfcst,julfname,nstyps, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,latu_ext,lonu_ext,latv_ext,lonv_ext, &
p_ext,hgt_ext,zp_ext,zpsoil_ext,t_ext,qv_ext, &
u_ext,vatu_ext,v_ext,uatv_ext,w_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
soiltyp_ext,stypfrct_ext,vegtyp_ext, &
lai_ext,roufns_ext,veg_ext, &
tsoil_ext,qsoil_ext,wetcanp_ext, &
tem1,tem2,istatus)
DO k = 1,vnz
DO j = 1,vny
DO i = 1,vnx
vp_ext(i,j,k) = p_ext(i+1,j+1,k)
vhgt_ext(i,j,k) = hgt_ext(i+1,j+1,k)
vt_ext(i,j,k) = t_ext(i+1,j+1,k)
vqv_ext(i,j,k) = qv_ext(i+1,j+1,k)
vu_ext(i,j,k) = u_ext(i+1,j+1,k)
vv_ext(i,j,k) = v_ext(i+1,j+1,k)
END DO
END DO
END DO
ELSE IF (extdopt == 2 .OR. extdopt == 12) THEN
WRITE(6,*)'Calling getgrib for external model'
CALL getgrib
(nx,ny,nz, &
dir_extd(ifile),extdname(ifile),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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0), &
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)
vp_ext = p_ext
vhgt_ext = hgt_ext
vt_ext = t_ext
vqv_ext = qv_ext
vu_ext = u_ext
vv_ext = v_ext
vRH_ext = RH_ext
vMSLP_ext = MSLP_ext
ENDIF
!-----------------------------------------------------------------------
!
! Save grid information
!
!-----------------------------------------------------------------------
IF (ifile == 1) THEN
mapproj = iproj_ext
scale = scale_ext
trulat(1) = latnot_ext(1)
trulat(2) = latnot_ext(2)
trulon = trlon_ext
IF (extdopt == 0) THEN
scswlat = lat_ext(2,2)
scswlon = lon_ext(2,2)
ELSE
scswlat = lat_ext(1,1)
scswlon = lon_ext(1,1)
END IF
CALL setmapr
(iproj_ext,scale_ext,latnot_ext,trlon_ext)
CALL setorig
(1,x0_ext,y0_ext)
DO j = 1,ny
CALL lltoxy
(1,1,lat_ext(1,j),lon_ext(1,j),x_ext(1),y_ext(j))
END DO
DO i = 1,nx
CALL lltoxy
(1,1,lat_ext(i,1),lon_ext(i,1),x_ext(i),y_ext(1))
END DO
dx = x_ext(2) - x_ext(1)
dy = y_ext(2) - y_ext(1)
DO j = 1,vny
DO i = 1,vnx
IF (extdopt == 0) THEN
vlat2d(i,j) = lat_ext(i+1,j+1)
vlon2d(i,j) = lon_ext(i+1,j+1)
ELSE
vlat2d(i,j) = lat_ext(i,j)
vlon2d(i,j) = lon_ext(i,j)
END IF
END DO
END DO
DO j = 1,vny
CALL lltoxy
(1,1,vlat2d(1,j),vlon2d(1,j),vx_ext(1),vy_ext(j))
END DO
DO i = 1,vnx
CALL lltoxy
(1,1,vlat2d(i,1),vlon2d(i,1),vx_ext(i),vy_ext(1))
END DO
CALL mcorner
(vnx,vny,vx_ext,vy_ext,1,vnx,1,vny,&
dx,dy,mapswlat,mapswlon, &
mapnwlat,mapnwlon,mapselat,mapselon,mapnelat, &
mapnelon)
ENDIF
! FIX-ME
! IF (istatus /= 0) THEN
! PRINT *, 'ERROR: Bad status from getarps or getgrib: ', istatus
! PRINT *, 'Skipping ifile= ', ifile
! CYCLE loop_ifile
! END IF
!-----------------------------------------------------------------------
!
! Calculate RH from qv for ARPS
!
!-----------------------------------------------------------------------
IF (extdopt == 0) THEN
DO k = 1,vnz
DO j = 1,vny
DO i = 1,vnx
IF (vqv_ext(i,j,k) /= missing) THEN
IF (vp_ext(i,j,k) > 0. .AND. vt_ext(i,j,k) > 0.) THEN
qvsat = f_qvsatl
(vp_ext(i,j,k),vt_ext(i,j,k))
vRH_ext(i,j,k) = vqv_ext(i,j,k)/qvsat * 100.0
ELSE
vRH_ext(i,j,k) = missing
ENDIF
ENDIF
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate MSLP for ARPS history dump
!
!-----------------------------------------------------------------------
IF (extdopt == 0) THEN
DO k = 1,vnz
DO j = 1,vny
DO i = 1,vnx
IF (vp_ext(i,j,k) > 0.) THEN
valgpzc(i,j,k) = - ALOG(vp_ext(i,j,k))
ELSE
valgpzc(i,j,k) = missing
ENDIF
END DO
END DO
END DO
zlevel = -ALOG(70000.0)
CALL hintrp
(vnx,vny,vnz,vt_ext,valgpzc,zlevel,vt700)
DO j = 1,vny
DO i = 1,vnx
p00 = 0.01*vp_ext(i,j,2)
IF(p00 <= 700.0) THEN
t00=vt_ext(i,j,2)
ELSE
t00 = vt700(i,j)*(p00/700.0)**ex1
ENDIF
hgtkm = vhgt_ext(i,j,2)*0.001
vMSLP_ext(i,j) = p00*(1.0+gamma*hgtkm/t00)**ex2
END DO
END DO
ENDIF
!-----------------------------------------------------------------------
!
! Calculate 2-D variables. (This may be put into a separate
! subroutine. Also, code will need to be made more flexible in the
! future and calculate ONLY those variables that the user requests.)
!
!-----------------------------------------------------------------------
IF (extdopt == 2 .OR. extdopt == 12) THEN
var_sfc(:,:,ifile,id_p) = vMSLP_ext(:,:)*100.
var_sfc(:,:,ifile,id_t) = t_2m_ext(:,:)
var_sfc(:,:,ifile,id_rh) = rh_2m_ext(:,:)
var_sfc(:,:,ifile,id_u) = u_10m_ext(:,:)
var_sfc(:,:,ifile,id_v) = v_10m_ext(:,:)
DO l=1,nlevel
!-----------------------------------------------------------------------
!
! Find the external model's index of the current level.
!
!-----------------------------------------------------------------------
kk = 1
DO k = 1,vnz
IF (vp_ext(1,1,k) == pressure(l)) kk = k
END DO
DO j=1,vny
DO i=1,vnx
IF (undrgrnd(i,j,kk) == 0) THEN
var_p(i,j,l,ifile,id_h) = vhgt_ext(i,j,kk)
var_p(i,j,l,ifile,id_t) = vt_ext(i,j,kk)
var_p(i,j,l,ifile,id_rh) = rh_ext(i,j,kk)
var_p(i,j,l,ifile,id_u) = vu_ext(i,j,kk)
var_p(i,j,l,ifile,id_v) = vv_ext(i,j,kk)
END IF
END DO
END DO
END DO
!-----------------------------------------------------------------------
ELSE IF (extdopt == 0) THEN ! ARPS
var_sfc(:,:,ifile,id_p) = vMSLP_ext(:,:)*100.
var_sfc(:,:,ifile,id_t) = vt_ext(:,:,2)
var_sfc(:,:,ifile,id_rh) = vrh_ext(:,:,2)
var_sfc(:,:,ifile,id_u) = vu_ext(:,:,2)
var_sfc(:,:,ifile,id_v) = vv_ext(:,:,2)
DO l=1,nlevel
z01 = - ALOG(pressure(l))
CALL hintrp
(vnx,vny,vnz,vhgt_ext,valgpzc,z01, var_p(1,1,l,ifile,id_h))
CALL hintrp
(vnx,vny,vnz,vt_ext,valgpzc,z01, var_p(1,1,l,ifile,id_t))
CALL hintrp
(vnx,vny,vnz,vrh_ext,valgpzc,z01, var_p(1,1,l,ifile,id_rh))
CALL hintrp
(vnx,vny,vnz,vu_ext,valgpzc,z01, var_p(1,1,l,ifile,id_u))
CALL hintrp
(vnx,vny,vnz,vv_ext,valgpzc,z01, var_p(1,1,l,ifile,id_v))
END DO
ENDIF
END DO loop_ifile ! ifile
!-----------------------------------------------------------------------
!
! Now write variables to HDF verification file.
!
!-----------------------------------------------------------------------
ntime = nextdfil
CALL wrtverif
( vnx,vny, nlevel,ntime, nvar_p,nvar_sfc, missing, &
veriffile,model,grid,init_date, timesec, pressure, &
mapproj,scale, trulat(1),trulat(2),trulon, dx,dy, &
scswlat,scswlon, &
mapswlat,mapswlon,mapnwlat,mapnwlon, &
mapselat,mapselon,mapnelat,mapnelon, &
flag_p,varid_p, varname_p, varunit_p, var_p, &
flag_sfc,varid_sfc,varname_sfc,varunit_sfc,var_sfc)
WRITE(6,*) 'Program CVT2VERIF successfully completed.'
STOP
!-----------------------------------------------------------------------
!
! Problem doing time conversions.
!
!-----------------------------------------------------------------------
920 CONTINUE
PRINT *, 'Aborting, error in time format for external file: ', extdtime(ifile)
STOP
END PROGRAM cvt2verif