!########################################################################
!########################################################################
!###### ######
!###### PROGRAM ARPSVERIF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!########################################################################
!########################################################################
PROGRAM arpsverif,120
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculates verification statistics for ARPS forecasts.
!
!-----------------------------------------------------------------------
!
! HISTORY:
! 2002/04/03 First written by Jason J. Levit
!
! 2005/08/05 MPI version. Kevin W. Thomas
!
!-----------------------------------------------------------------------
!
! Use modules
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
IMPLICIT NONE ! Force explicit declarations
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'vericst.inc'
INCLUDE 'grid.inc'
INCLUDE 'mp.inc'
!
!-----------------------------------------------------------------------
!
! Data arrays
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: x (:) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL, ALLOCATABLE :: y (:) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL, ALLOCATABLE :: z (:) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL, ALLOCATABLE :: zp (:,:,:) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL, ALLOCATABLE :: zpsoil(:,:,:) ! The physical height coordinate of soil
! model
!
REAL, ALLOCATABLE :: hterain (:,:) ! Terrain height
!
REAL, ALLOCATABLE :: uprt (:,:,:) ! Perturbation u-velocity (m/s)
REAL, ALLOCATABLE :: vprt (:,:,:) ! Perturbation v-velocity (m/s)
REAL, ALLOCATABLE :: wprt (:,:,:) ! Perturbation w-velocity (m/s)
REAL, ALLOCATABLE :: ptprt (:,:,:) ! Perturbation potential temperature (K)
REAL, ALLOCATABLE :: pprt (:,:,:) ! Perturbation pressure (Pascal)
REAL, ALLOCATABLE :: qvprt (:,:,:) ! Perturbation water vapor specific
! humidity (kg/kg)
REAL, ALLOCATABLE :: qc (:,:,:) ! Cloud water mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qr (:,:,:) ! Rain water mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qi (:,:,:) ! Cloud ice mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qs (:,:,:) ! Snow mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qh (:,:,:) ! Hail mixing ratio (kg/kg)
REAL, ALLOCATABLE :: tke (:,:,:) ! Turbulent Kinetic Energy ((m/s)**2)
REAL, ALLOCATABLE :: kmh (:,:,:) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, ALLOCATABLE :: kmv (:,:,:) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL, ALLOCATABLE :: ubar (:,:,:) ! Base state u-velocity (m/s)
REAL, ALLOCATABLE :: vbar (:,:,:) ! Base state v-velocity (m/s)
REAL, ALLOCATABLE :: wbar (:,:,:) ! Base state w-velocity (m/s)
REAL, ALLOCATABLE :: ptbar (:,:,:) ! Base state potential temperature (K)
REAL, ALLOCATABLE :: pbar (:,:,:) ! Base state pressure (Pascal)
REAL, ALLOCATABLE :: rhobar (:,:,:) ! Base state air density (kg/m**3)
REAL, ALLOCATABLE :: qvbar (:,:,:) ! Base state water vapor specific
! humidity (kg/kg)
INTEGER :: nstyps
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 :: tsoil (:,:,:,:) ! soil temperature (K)
REAL, ALLOCATABLE :: qsoil (:,:,:,:) ! soil moisture
REAL, ALLOCATABLE :: wetcanp(:,:,:) ! Canopy water amount
REAL, ALLOCATABLE :: snowdpth(:,:) ! Snow depth (m)
REAL, ALLOCATABLE :: raing(:,:) ! Grid supersaturation rain
REAL, ALLOCATABLE :: rainc(:,:) ! Cumulus convective rain
REAL, ALLOCATABLE :: prcrate(:,:,:) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulative 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 :: radswnet(:,:) ! Net shortwave radiation
REAL, ALLOCATABLE :: radlwin(:,:) ! Incoming longwave radiation
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 :: model_data(:,:,:)
REAL, ALLOCATABLE :: obsrv_data(:,:,:)
!(:,:,1) = sfc temp
!(:,:,2) = sfc dewpoint
!(:,:,3) = sfc wind dir
!(:,:,4) = sfc wind speed
!(:,:,5) = sfc pressure
REAL, ALLOCATABLE :: stats_data(:,:,:)
!(:,1,1) = RMSE data (temp)
!(:,1,2) = RMSE data (dewpoint)
!(:,1,3) = RMSE data (sfc wind dir)
!(:,1,4) = RMSE data (sfc wind speed)
!(:,1,5) = RMSE data (sfc pressure)
!(:,2,1) = Bias data (temp)
!(:,2,2) = Bias data (dewpoint)
!(:,2,3) = Bias data (sfc wind dir)
!(:,2,4) = Bias data (sfc wind speed)
!(:,2,5) = Bias data (sfc pressure)
! etc.
!
!-----------------------------------------------------------------------
!
! Namelists
!
!-----------------------------------------------------------------------
!
INTEGER :: verifopt
NAMELIST /verif_opt/ verifopt
INTEGER :: sndopt
CHARACTER (LEN=256) :: sndlist
CHARACTER (LEN=256) :: sndrunname
CHARACTER (LEN=256) :: snddomlist
INTEGER :: proopt
CHARACTER (LEN=256) :: prolist
CHARACTER (LEN=256) :: prorunname
CHARACTER (LEN=256) :: prodomlist
INTEGER :: sfcopt
CHARACTER (LEN=256) :: sfclist
CHARACTER (LEN=256) :: sfcobsdir
CHARACTER (LEN=256) :: sfcrunname
CHARACTER (LEN=256) :: blackfile
INTEGER :: precveropt
CHARACTER (LEN=256) :: preclist
CHARACTER (LEN=256) :: precrunname
CHARACTER (LEN=256) :: precdomlist
INTEGER :: mosopt
CHARACTER (LEN=256) :: moslist
CHARACTER (LEN=256) :: mosrunname
CHARACTER (LEN=256) :: mosdomlist
INTEGER :: arpsnn_opt
CHARACTER (LEN=256) :: nnrunname
CHARACTER (LEN=256) :: wtsdir
CHARACTER (LEN=256) :: nnoutputfn
NAMELIST /single/ sndopt,sndlist,sndrunname,snddomlist, &
proopt,prolist,prorunname,prodomlist, &
sfcopt,sfclist,sfcobsdir, &
sfcrunname,blackfile,nsfcuse,sfcuse, &
precveropt,preclist,precrunname,precdomlist, &
mosopt,moslist,mosrunname,mosdomlist, &
arpsnn_opt,nnrunname,wtsdir,nnoutputfn
INTEGER :: dummy
NAMELIST /gridded/ dummy
NAMELIST /message_passing/ nproc_x,nproc_y,readsplit
!
!-----------------------------------------------------------------------
!
! Work Arrays
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: tem1(:,:,:)
REAL, ALLOCATABLE :: tem2(:,:,:)
REAL, ALLOCATABLE :: tem3(:,:,:)
REAL, ALLOCATABLE :: tem4(:,:)
!
!-----------------------------------------------------------------------
!
! Misc. internal variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: nx,ny,nz
INTEGER :: nzsoil
INTEGER :: ireturn, istatus
INTEGER :: hinfmt
INTEGER :: nhisfile_max,nhisfile
PARAMETER (nhisfile_max=200)
CHARACTER (LEN=256) :: grdbasfn
CHARACTER (LEN=256) :: filename
CHARACTER (LEN=256) :: hisfile(nhisfile_max)
CHARACTER (LEN=4), PARAMETER :: tail=".hdf"
INTEGER :: lengbf,nf,lenfil
INTEGER, PARAMETER :: max_dim=200
INTEGER, PARAMETER :: unum=5 ! unit number for namelist read
INTEGER :: istat,sd_id,sds_id
CHARACTER (LEN=256) :: hdfname
INTEGER :: dims(2)
INTEGER :: lname
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
nsfcuse = 0
CALL mpinit_proc
IF (myproc == 0) THEN
WRITE(6,'(/,8(5x,a,/),/)') &
'###############################################################',&
'###############################################################',&
'### ###',&
'### Welcome to ARPSVERIF ###',&
'### A program that computes verification of ARPS forecasts. ###',&
'### ###',&
'###############################################################',&
'###############################################################'
READ (unum,message_passing)
WRITE(6,'(a)')'Namelist block message_passing sucessfully read.'
READ (unum,verif_opt)
WRITE(6,'(a)')'Namelist block verif_opt sucessfully read.'
CALL get_input_file_names
(hinfmt,grdbasfn,hisfile,nhisfile)
READ (unum,single)
WRITE(6,'(a)')'Namelist block single sucessfully read.'
READ (unum,gridded)
WRITE(6,'(a)')'Namelist block gridded sucessfully read.'
filename = grdbasfn
lengbf = len_trim(filename)
IF ( mp_opt > 0 .AND. readsplit <= 0 ) THEN
filename(lengbf+1:lengbf+5) = '_0101'
lengbf = lengbf + 5
END IF
CALL get_dims_from_data
(hinfmt,filename(1:lengbf), &
nx,ny,nz,nzsoil,nstyps, ireturn)
IF( ireturn /= 0 ) THEN
PRINT*,'Problem occured when trying to get dimensions from data.'
PRINT*,'Program stopped.'
CALL arpsstop
("Fail in get_dims_from_data",1)
END IF
WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz
print*,'nstyps =', nstyps
END IF
CALL mpupdatei
(nproc_x,1)
CALL mpupdatei
(nproc_y,1)
CALL mpupdatei
(readsplit,1)
CALL mpupdatei
(nx,1)
CALL mpupdatei
(ny,1)
CALL mpupdatei
(nz,1)
CALL mpupdatei
(nzsoil,1)
CALL mpupdatei
(nstyps,1)
CALL mpupdatei
(nhisfile,1)
CALL mpupdatei
(hinfmt,1)
CALL mpupdatec
(grdbasfn,256)
CALL mpupdatec
(hisfile,nhisfile*256)
CALL mpupdatei
(sndopt,1)
CALL mpupdatei
(proopt,1)
CALL mpupdatei
(sfcopt,1) !sfcopt ignored, always enabled
CALL mpupdatei
(nsfcuse,1)
CALL mpupdatec
(sfcuse,nsfcuse*4)
CALL mpupdatei
(precveropt,1)
CALL mpupdatei
(mosopt,1)
CALL mpupdatei
(arpsnn_opt,1)
CALL mpupdatei
(verifopt,1)
IF ( mp_opt == 0 ) THEN
nproc_x = 1
nproc_y = 1
readsplit = 0
END IF
! call mpinit_var
!
!-----------------------------------------------------------------------
!
! Single-point verification
!
!-----------------------------------------------------------------------
!
IF (verifopt.eq.1.or.verifopt.eq.3) THEN
IF ( mp_opt > 0 .AND. readsplit > 0 ) THEN
nx = (nx - 3) / nproc_x + 3
ny = (ny - 3) / nproc_y + 3
IF ( myproc == 0 ) WRITE(6,*) 'Processor nx/ny now',nx,ny
END IF
CALL mpinit_var
!
! ALLOCATE arrays
!
ALLOCATE(x (nx),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:x")
x = 0.0
ALLOCATE(y (ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:y")
y = 0.0
ALLOCATE(z (nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:z")
z = 0.0
ALLOCATE(zp (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:zp")
zp = 0.0
ALLOCATE(zpsoil (nx,ny,nzsoil),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:zpsoil")
zpsoil = 0.0
ALLOCATE(uprt (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:uprt")
uprt = 0.0
ALLOCATE(vprt (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vprt")
vprt = 0.0
ALLOCATE(wprt (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wprt")
wprt = 0.0
ALLOCATE(hterain (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:hterain")
hterain = 0.0
ALLOCATE(ptprt (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptprt")
ptprt = 0.0
ALLOCATE(pprt (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pprt")
pprt = 0.0
ALLOCATE(qvprt (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvprt")
qvprt = 0.0
ALLOCATE(qc (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qc")
qc = 0.0
ALLOCATE(qr (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qr")
qr = 0.0
ALLOCATE(qi (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qi")
qi = 0.0
ALLOCATE(qs (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qs")
qs = 0.0
ALLOCATE(qh (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qh")
qh = 0.0
ALLOCATE(tke (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tke")
tke = 0.0
ALLOCATE(kmh (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:kmh")
kmh = 0.0
ALLOCATE(kmv (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:kmv")
kmv = 0.0
ALLOCATE(ubar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ubar")
ubar = 0.0
ALLOCATE(vbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vbar")
vbar = 0.0
ALLOCATE(wbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wbar")
wbar = 0.0
ALLOCATE(ptbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptbar")
ptbar = 0.0
ALLOCATE(pbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pbar")
pbar = 0.0
ALLOCATE(rhobar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rhobar")
rhobar = 0.0
ALLOCATE(qvbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvbar")
qvbar = 0.0
ALLOCATE(soiltyp (nx,ny,nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:soiltyp")
soiltyp = 0.0
ALLOCATE(stypfrct (nx,ny,nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:stypfrct")
stypfrct = 0.0
ALLOCATE(vegtyp (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vegtyp")
vegtyp = 0.0
ALLOCATE(lai (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:lai")
lai = 0.0
ALLOCATE(roufns (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:roufns")
roufns = 0.0
ALLOCATE(veg (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:veg")
veg = 0.0
ALLOCATE(tsoil (nx,ny,nzsoil,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tsoil")
tsoil = 0.0
ALLOCATE(qsoil (nx,ny,nzsoil,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qsoil")
qsoil = 0.0
ALLOCATE(wetcanp (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wetcanp")
wetcanp = 0.0
ALLOCATE(snowdpth (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:snowdpth")
snowdpth = 0.0
ALLOCATE(raing (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:raing")
raing = 0.0
ALLOCATE(rainc (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rainc")
rainc = 0.0
ALLOCATE(prcrate (nx,ny,4),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:prcrate")
prcrate = 0.0
ALLOCATE(radfrc (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radfrc")
radfrc = 0.0
ALLOCATE(radsw (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radsw")
radsw = 0.0
ALLOCATE(rnflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rnflx")
rnflx = 0.0
ALLOCATE(radswnet (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radswnet")
radswnet = 0.0
ALLOCATE(radlwin (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radlwin")
radlwin = 0.0
ALLOCATE(usflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:usflx")
usflx = 0.0
ALLOCATE(vsflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vsflx")
vsflx = 0.0
ALLOCATE(ptsflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptsflx")
ptsflx = 0.0
ALLOCATE(qvsflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvsflx")
qvsflx = 0.0
ALLOCATE(tem1 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem1")
tem1 = 0.0
ALLOCATE(tem2 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem2")
tem2 = 0.0
ALLOCATE(model_data(sfcmax,nhisfile,5),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:model_data")
model_data=0.0
ALLOCATE(obsrv_data(sfcmax,nhisfile,5),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:obsrv_data")
obsrv_data=-99.9 ! Set all obs equal to an initial missing value
ALLOCATE(stats_data(nhisfile,2,5),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:stats_data")
stats_data=0.0
readstns=.false.
IF (myproc == 0) THEN
IF (sndopt.eq.1) THEN
write (6,*) "Sounding verification is currently unavailable."
write (6,*) "Program will terminate."
CALL arpsstop
("Configuration Error",1)
END IF
IF (proopt.eq.1) THEN
write (6,*) "Profiler verification is currently unavailable."
write (6,*) "Program will terminate."
CALL arpsstop
("Configuration Error",1)
END IF
IF (precveropt.eq.1) THEN
write (6,*) "Precip. verification is currently unavailable."
write (6,*) "Program will terminate."
CALL arpsstop
("Configuration Error",1)
END IF
IF (mosopt.eq.1) THEN
write (6,*) "MOS computation is currently unavailable."
write (6,*) "Program will terminate."
CALL arpsstop
("Configuration Error",1)
END IF
IF (arpsnn_opt.eq.1) THEN
write (6,*) "The ARPS Neural Network option is currently unavailable."
write (6,*) "Program will terminate."
CALL arpsstop
("Configuration Error",1)
END IF
ENDIF
CALL his2ver
(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil,hterain, &
uprt,vprt,wprt,ptprt,pprt,qvprt, &
qc,qr,qi,qs,qh,tke,kmh,kmv, &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
nstyps,soiltyp,stypfrct,vegtyp,lai,roufns, &
veg,tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate,radfrc,radsw,rnflx, &
radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
hinfmt,grdbasfn,hisfile,nhisfile, &
sndopt,sndlist,sndrunname,snddomlist, &
proopt,prolist,prorunname,prodomlist, &
sfcopt,sfclist,sfcobsdir,sfcrunname,blackfile, &
precveropt,preclist,precrunname,precdomlist, &
mosopt,moslist,mosrunname,mosdomlist, &
arpsnn_opt,nnrunname,wtsdir,nnoutputfn, &
model_data,obsrv_data)
!
! Collect output if we're MPI.
!
IF (mp_opt > 0 ) THEN
CALL verif_collect(model_data,obsrv_data,nhisfile)
END IF
IF (myproc == 0) THEN
!
! Calculate statistics on surface data.
!
DO i=1,nhisfile
! RSME calculations
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,1)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,1)
CALL root_mean_square
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,1,1))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,2)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,2)
CALL root_mean_square
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,1,2))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,3)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,3)
CALL root_mean_square
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,1,3))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,4)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,4)
CALL root_mean_square
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,1,4))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,5)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,5)
CALL root_mean_square
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,1,5))
! Bias calculations
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,1)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,1)
CALL bias_calc
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,2,1))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,2)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,2)
CALL bias_calc
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,2,2))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,3)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,3)
CALL bias_calc
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,2,3))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,4)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,4)
CALL bias_calc
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,2,4))
tem1=0.0
tem2=0.0
tem1(1:sfcstn,1,1)=obsrv_data(1:sfcstn,i,5)
tem2(1:sfcstn,1,1)=model_data(1:sfcstn,i,5)
CALL bias_calc
(sfcstn,1,1,tem1,tem2,0,0,0,stats_data(i,2,5))
END DO
!
! Write out all verification data into a specific HDF file.
!
lname=LEN_TRIM(sfcrunname)
hdfname=sfcrunname(1:lname)//".hdf"
CALL hdfopen
(hdfname,2,sd_id)
dims(2)=sfcstn
dims(1)=len(sfcstid(1))
CALL write_sds_char
(sds_id,sd_id,'sfcstid',sfcstid,2,dims)
CALL hdfwrt2d
(model_data(:,:,1),sfcmax,nhisfile,sd_id,0,0,'model_temp', &
'2m ARPS Temperature','F',istatus)
CALL hdfwrt2d
(obsrv_data(:,:,1),sfcmax,nhisfile,sd_id,0,0,'obs_temp', &
'Observation Temperature','F',istatus)
CALL hdfwrt2d
(model_data(:,:,2),sfcmax,nhisfile,sd_id,0,0,'model_dewp', &
'2m ARPS Dewpoint','F',istatus)
CALL hdfwrt2d
(obsrv_data(:,:,2),sfcmax,nhisfile,sd_id,0,0,'obs_dewp', &
'Observation Dewpoint','F',istatus)
CALL hdfwrt2d
(model_data(:,:,3),sfcmax,nhisfile,sd_id,0,0,'model_wdir', &
'ARPS surface wind direction','m/s',istatus)
CALL hdfwrt2d
(obsrv_data(:,:,3),sfcmax,nhisfile,sd_id,0,0,'obs_wdir', &
'Observation surface wind direction','m/s',istatus)
CALL hdfwrt2d
(model_data(:,:,4),sfcmax,nhisfile,sd_id,0,0,'model_wspd', &
'ARPS surface wind speed','m/s',istatus)
CALL hdfwrt2d
(obsrv_data(:,:,4),sfcmax,nhisfile,sd_id,0,0,'obs_wspd', &
'Observation surface wind speed','m/s',istatus)
CALL hdfwrt2d
(model_data(:,:,5),sfcmax,nhisfile,sd_id,0,0,'model_pres', &
'ARPS surface pressure','mb',istatus)
CALL hdfwrt2d
(obsrv_data(:,:,5),sfcmax,nhisfile,sd_id,0,0,'obs_pres', &
'Observation surface pressure','mb',istatus)
CALL hdfwrt1d
(stats_data(:,1,1),nhisfile,sd_id,'rmse_temp', &
'2m Surface Temperature RMSE','none')
CALL hdfwrt1d
(stats_data(:,1,2),nhisfile,sd_id,'rmse_dewp', &
'2m Surface Dewpoint RMSE','none')
CALL hdfwrt1d
(stats_data(:,1,3),nhisfile,sd_id,'rmse_wdir', &
'Surface Wind Direction RMSE','none')
CALL hdfwrt1d
(stats_data(:,1,4),nhisfile,sd_id,'rmse_wspd', &
'Surface Wind Speed RMSE','none')
CALL hdfwrt1d
(stats_data(:,1,5),nhisfile,sd_id,'rmse_pres', &
'Surface Pressure RMSE','none')
CALL hdfwrt1d
(stats_data(:,2,1),nhisfile,sd_id,'bias_temp', &
'2m Surface Temperature Bias','none')
CALL hdfwrt1d
(stats_data(:,2,2),nhisfile,sd_id,'bias_dewp', &
'2m Surface Dewpoint Bias','none')
CALL hdfwrt1d
(stats_data(:,2,3),nhisfile,sd_id,'bias_wdir', &
'Surface Wind Direction Bias','none')
CALL hdfwrt1d
(stats_data(:,2,4),nhisfile,sd_id,'bias_wspd', &
'Surface Wind Speed Bias','none')
CALL hdfwrt1d
(stats_data(:,2,5),nhisfile,sd_id,'bias_pres', &
'Surface Pressure Bias','none')
CALL hdfclose
(sd_id,istat)
END IF
END IF
IF (mp_opt > 0 ) CALL mpexit
(0)
STOP
END PROGRAM arpsverif