PROGRAM ens_ana,77

  IMPLICIT NONE

  INCLUDE 'enscv.inc'
!  INCLUDE 'mp.inc'

  INTEGER :: nx,ny,nz
  INTEGER :: i,j,ll
  INTEGER :: istat,ierr,iSTATUS,nunit
  INTEGER :: nmember,nf,anaopt
  CHARACTER (LEN=256) :: ensdir,outdir
  CHARACTER (LEN=256) :: memberheader(15), anaheader
  CHARACTER (LEN=256) :: outheader
  CHARACTER (LEN= 6) :: tlevel(50)
  REAL :: sp(50,15)    ! spread (nf, nvar)
  REAL :: mse(50,15),sde(50,15),mnbias(50,15),sdbias(50,15),disp(50,15)
  REAL :: corr(50,15),sd1(50,15),sd2(50,15)
  REAL :: sum1(50,15),sum2(50,15)
  REAL :: amax,amin
  REAL :: totlegrid,totlegrid1,totlegrid2

  NAMELIST /input_data/ ensdir,nmember,memberheader,nf,tlevel,anaopt,anaheader
  NAMELIST /output_data/ outdir,outheader

  REAL, ALLOCATABLE :: mslp(:,:)
  REAL, ALLOCATABLE :: hgt250(:,:), vort250(:,:), uwind250(:,:), vwind250(:,:)
  REAL, ALLOCATABLE :: hgt500(:,:), vort500(:,:), uwind500(:,:), vwind500(:,:)
  REAL, ALLOCATABLE :: hgt850(:,:), vort850(:,:), uwind850(:,:), vwind850(:,:)
  REAL, ALLOCATABLE :: temp850(:,:)
  REAL, ALLOCATABLE :: thck(:,:), rh700(:,:), omega700(:,:),temp2m(:,:), dewp2m(:,:)
  REAL, ALLOCATABLE :: accppt(:,:), convppt(:,:)
  REAL, ALLOCATABLE :: sreh(:,:),li(:,:),cape(:,:),brn(:,:),cin(:,:),vhel(:,:),pw(:,:)
  REAL, ALLOCATABLE :: cmpref(:,:),refl1km(:,:),refl4km(:,:),u10m(:,:),v10m(:,:)

  REAL, ALLOCATABLE :: mslpa(:,:)
  REAL, ALLOCATABLE :: hgt250a(:,:), vort250a(:,:), uwind250a(:,:), vwind250a(:,:)
  REAL, ALLOCATABLE :: hgt500a(:,:), vort500a(:,:), uwind500a(:,:), vwind500a(:,:)
  REAL, ALLOCATABLE :: hgt850a(:,:), vort850a(:,:), uwind850a(:,:), vwind850a(:,:)
  REAL, ALLOCATABLE :: temp850a(:,:)
  REAL, ALLOCATABLE :: thcka(:,:),rh700a(:,:),omega700a(:,:),temp2ma(:,:),dewp2ma(:,:)
  REAL, ALLOCATABLE :: accppta(:,:), convppta(:,:)
  REAL, ALLOCATABLE :: sreha(:,:),lia(:,:),capea(:,:),brna(:,:),cina(:,:)
  REAL, ALLOCATABLE :: vhela(:,:),pwa(:,:)
  REAL, ALLOCATABLE :: cmprefa(:,:),refl1kma(:,:),refl4kma(:,:),u10ma(:,:),v10ma(:,:)

  REAL, ALLOCATABLE :: mslpm(:,:),hgt250m(:,:),hgt500m(:,:),hgt850m(:,:)
  REAL, ALLOCATABLE :: temp850m(:,:),temp2mm(:,:),dewp2mm(:,:),accpptm(:,:),convpptm(:,:)
  REAL, ALLOCATABLE :: cmprefm(:,:),refl1kmm(:,:),refl4kmm(:,:),u10mm(:,:),v10mm(:,:)
  REAL, ALLOCATABLE :: mslpt(:,:),hgt250t(:,:),hgt500t(:,:),hgt850t(:,:)
  REAL, ALLOCATABLE :: temp850t(:,:),temp2mt(:,:),dewp2mt(:,:),accpptt(:,:),convpptt(:,:)
  REAL, ALLOCATABLE :: cmpreft(:,:),refl1kmt(:,:),refl4kmt(:,:),u10mt(:,:),v10mt(:,:)

! F.KONG add for probability calculation
  REAL, ALLOCATABLE :: pbrain(:,:,:),pbref1(:,:,:),pbref4(:,:,:),pbcref(:,:,:)
  REAL :: factor
! end F.KONG

  CHARACTER (LEN=256) :: filenm,outfile
  CHARACTER (LEN=132) :: char
  CHARACTER (LEN=15) :: varname,unitnm
  CHARACTER (LEN=40) :: q3dname,q3dunit
!  REAL :: qswcorn, qswcorw, qnecorn, qnecorw
  INTEGER :: hour,mimute,dweek,day,month,year

  INTEGER :: nt,nm

!    nproc_x = 1 
!    nproc_y = 1
!    readsplit = 0
!    joindmp = 1 
!    nprocs = 1
!    max_fopen = 1

  READ(5,input_data,END=100)
  WRITE(6,'(/a/)')'Namelist block input_data sucessfully read in.'
  WRITE(6,input_data)

  READ(5,output_data,END=101)
  WRITE(6,'(/a/)')'Namelist block output_data sucessfully read in.'
  WRITE(6,output_data)

  GO TO 111
  100   WRITE(6,'(a)')                                       &
         'Error reading NAMELIST block input_data, STOP'
         STOP
  101   WRITE(6,'(a)')                                       &
         'Error reading NAMELIST block output_data, STOP'
         STOP
  111 CONTINUE

  filenm = trim(ensdir)//trim(memberheader(1))//'.mspres'//tlevel(1)
  print *, trim(filenm)
    CALL getunit( nunit)
    OPEN(UNIT=nunit,FILE=trim(filenm),STATUS='old', FORM='unformatted',  &
        ERR=9000, IOSTAT=istat)
    READ(nunit, ERR=9000, END=9000, IOSTAT=istat) nx,ny,nz
    CLOSE(UNIT=nunit)
    CALL retunit(nunit)

  print *, 'nx,ny:',nx,ny

  ALLOCATE(mslp(nx,ny),hgt250(nx,ny),vort250(nx,ny),uwind250(nx,ny),vwind250(nx,ny))
  ALLOCATE(hgt500(nx,ny),vort500(nx,ny),uwind500(nx,ny),vwind500(nx,ny))
  ALLOCATE(hgt850(nx,ny),vort850(nx,ny),uwind850(nx,ny),vwind850(nx,ny),temp850(nx,ny))
  ALLOCATE(thck(nx,ny),rh700(nx,ny),omega700(nx,ny),temp2m(nx,ny),dewp2m(nx,ny))
  ALLOCATE(accppt(nx,ny),convppt(nx,ny),sreh(nx,ny),li(nx,ny),cape(nx,ny))
  ALLOCATE(brn(nx,ny),cin(nx,ny),vhel(nx,ny),pw(nx,ny),cmpref(nx,ny))
  ALLOCATE(refl1km(nx,ny),refl4km(nx,ny),u10m(nx,ny),v10m(nx,ny))

!  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,mslp)
!  print *, trim(varname),' ',trim(unitnm),nx,ny
!CALL a3dmax0(mslp,1,nx,1,nx-1,1,ny,1,ny,1,1,1,1,amax,amin)
!print *,'MSLP -- amax, amin: ',amax, amin
!stop

  if(anaopt == 1) then  ! allocate arrays for analysis fields

  ALLOCATE(mslpa(nx,ny),hgt250a(nx,ny),vort250a(nx,ny),uwind250a(nx,ny),vwind250a(nx,ny))
  ALLOCATE(hgt500a(nx,ny),vort500a(nx,ny),uwind500a(nx,ny),vwind500a(nx,ny))
  ALLOCATE(hgt850a(nx,ny),vort850a(nx,ny),uwind850a(nx,ny),vwind850a(nx,ny),temp850a(nx,ny))
  ALLOCATE(thcka(nx,ny),rh700a(nx,ny),omega700a(nx,ny),temp2ma(nx,ny),dewp2ma(nx,ny))
  ALLOCATE(accppta(nx,ny),convppta(nx,ny),sreha(nx,ny),lia(nx,ny),capea(nx,ny))
  ALLOCATE(brna(nx,ny),cina(nx,ny),vhela(nx,ny),pwa(nx,ny),cmprefa(nx,ny))
  ALLOCATE(refl1kma(nx,ny),refl4kma(nx,ny),u10ma(nx,ny),v10ma(nx,ny))

  endif

  ALLOCATE(mslpm(nx,ny),hgt250m(nx,ny),hgt500m(nx,ny),hgt850m(nx,ny))
  ALLOCATE(temp850m(nx,ny),temp2mm(nx,ny),dewp2mm(nx,ny),accpptm(nx,ny),convpptm(nx,ny))
  ALLOCATE(cmprefm(nx,ny),refl1kmm(nx,ny),refl4kmm(nx,ny),u10mm(nx,ny),v10mm(nx,ny))
  ALLOCATE(mslpt(nx,ny),hgt250t(nx,ny),hgt500t(nx,ny),hgt850t(nx,ny))
  ALLOCATE(temp850t(nx,ny),temp2mt(nx,ny),dewp2mt(nx,ny),accpptt(nx,ny),convpptt(nx,ny))
  ALLOCATE(cmpreft(nx,ny),refl1kmt(nx,ny),refl4kmt(nx,ny),u10mt(nx,ny),v10mt(nx,ny))

  ALLOCATE(pbrain(nx,ny,4),pbref1(nx,ny,3),pbref4(nx,ny,3),pbcref(nx,ny,3))

  factor = 100./float(nmember) ! probability factor (weight) from each member
!  factor = 100./float(nmember)+0.01 ! probability factor (weight) from each member

  sp = 0.0
  mse = 0.0
  sde = 0.0
  mnbias = 0.0
  corr = 0.0
  disp = 0.0
  sd1 = 0.0
  sd2 = 0.0
  sum1 = 0.0
  sum2 = 0.0

  totlegrid = float(nx*ny)

  do nt=1,nf  ! begin time loop

! zero following arrays
  mslpm=0
  hgt250m=0
  hgt500m=0
  hgt850m=0
  temp850m=0
  temp2mm=0
  dewp2mm=0
  accpptm=0
  convpptm=0
  cmprefm=0
  refl1kmm=0
  refl4kmm=0
  u10mm=0
  v10mm=0

  mslpt=0
  hgt250t=0
  hgt500t=0
  hgt850t=0
  temp850t=0
  temp2mt=0
  dewp2mt=0
  accpptt=0
  convpptt=0
  cmpreft=0
  refl1kmt=0
  refl4kmt=0
  u10mt=0
  v10mt=0

  pbrain=0.0
  pbref1=0.0
  pbref4=0.0
  pbcref=0.0

  if(anaopt == 1) then  ! read in analysis data

  filenm = trim(ensdir)//trim(anaheader)//'.mspres'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,mslpa)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.hgt250'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,hgt250a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.u250__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,uwind250a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.v250__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vwind250a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.hgt500'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,hgt500a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.u500__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,uwind500a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.v500__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vwind500a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.hgt850'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,hgt850a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.u850__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,uwind850a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.v850__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vwind850a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.tmp850'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,temp850a)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.temp2m'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,temp2ma)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.dewp2m'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,dewp2ma)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.accppt'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,accppta)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(anaheader)//'.srh03_'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,sreha)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.vhel__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vhela)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.sbcape'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,capea)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.sbcins'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,cina)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.pwat__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,pwa)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(anaheader)//'.cmpref'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,cmprefa)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.ref1km'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,refl1kma)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.u10m__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,u10ma)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(anaheader)//'.v10m__'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,v10ma)
  print *, varname,unitnm,nx,ny

  endif   ! end read in analysis data

  do nm=1,nmember ! begin member loop

  filenm = trim(ensdir)//trim(memberheader(nm))//'.mspres'//tlevel(nt)
  print *, trim(filenm)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,mslp)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    mslpm(i,j)=mslpm(i,j)+mslp(i,j)
    mslpt(i,j)=mslpt(i,j)+mslp(i,j)*mslp(i,j)
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.hgt250'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,hgt250)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    hgt250m(i,j)=hgt250m(i,j)+hgt250(i,j)
    hgt250t(i,j)=hgt250t(i,j)+hgt250(i,j)*hgt250(i,j)
    enddo
  enddo
!
  filenm = trim(ensdir)//trim(memberheader(nm))//'.u250__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,uwind250)
  print *, varname,unitnm,nx,ny
!
  filenm = trim(ensdir)//trim(memberheader(nm))//'.v250__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vwind250)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(memberheader(nm))//'.hgt500'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,hgt500)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    hgt500m(i,j)=hgt500m(i,j)+hgt500(i,j)
    hgt500t(i,j)=hgt500t(i,j)+hgt500(i,j)*hgt500(i,j)
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.u500__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,uwind500)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(memberheader(nm))//'.v500__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vwind500)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(memberheader(nm))//'.hgt850'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,hgt850)
  print *, varname,unitnm,nx,ny
!CALL a3dmax0(hgt850,1,nx,1,nx-1,1,ny,1,ny,1,1,1,1,amax,amin)
!print *,'hgt850 -- amax, amin: ',amax, amin
  totlegrid1 = 0.0
  do i=1,nx
    do j=1,ny
    IF(hgt850(i,j) > -500.0) THEN   ! excluding -9999.0 grids
    hgt850m(i,j)=hgt850m(i,j)+hgt850(i,j)
    hgt850t(i,j)=hgt850t(i,j)+hgt850(i,j)*hgt850(i,j)
    totlegrid1 = totlegrid1 + 1.0
    END IF
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.u850__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,uwind850)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(memberheader(nm))//'.v850__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vwind850)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(memberheader(nm))//'.tmp850'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,temp850)
  print *, varname,unitnm,nx,ny
!CALL a3dmax0(temp850,1,nx,1,nx-1,1,ny,1,ny,1,1,1,1,amax,amin)
!print *,'temp850 -- amax, amin: ',amax, amin
  totlegrid2 = 0.0
  do i=1,nx
    do j=1,ny
    IF(temp850(i,j) > -500.0) THEN  ! excluding -9999.0 grids
    temp850m(i,j)=temp850m(i,j)+temp850(i,j)
    temp850t(i,j)=temp850t(i,j)+temp850(i,j)*temp850(i,j)
    totlegrid2 = totlegrid2 + 1.0
    END IF
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.temp2m'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,temp2m)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    temp2mm(i,j)=temp2mm(i,j)+temp2m(i,j)
    temp2mt(i,j)=temp2mt(i,j)+temp2m(i,j)*temp2m(i,j)
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.dewp2m'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,dewp2m)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    dewp2mm(i,j)=dewp2mm(i,j)+dewp2m(i,j)
    dewp2mt(i,j)=dewp2mt(i,j)+dewp2m(i,j)*dewp2m(i,j)
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.accppt'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,accppt)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    accpptm(i,j)=accpptm(i,j)+accppt(i,j)
    accpptt(i,j)=accpptt(i,j)+accppt(i,j)*accppt(i,j)
    enddo
  enddo

! calculate probability of accppt
  do i=1,nx
    do j=1,ny
    if(accppt(i,j)/25.4.ge.0.10) pbrain(i,j,1)=pbrain(i,j,1)+factor ! >0.10 inch
    if(accppt(i,j)/25.4.ge.0.25) pbrain(i,j,2)=pbrain(i,j,2)+factor ! >0.25 inch
    if(accppt(i,j)/25.4.ge.0.50) pbrain(i,j,3)=pbrain(i,j,3)+factor ! >0.50 inch
    if(accppt(i,j)/25.4.ge.1.00) pbrain(i,j,4)=pbrain(i,j,4)+factor ! >1.00 inch
    enddo
  enddo

! 5 more fields to be read in
!  print *, '5 more fields to be read in.'

  filenm = trim(ensdir)//trim(memberheader(nm))//'.srh03_'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,sreh)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(memberheader(nm))//'.vhel__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,vhel)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(memberheader(nm))//'.sbcape'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,cape)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(memberheader(nm))//'.sbcins'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,cin)
  print *, varname,unitnm,nx,ny
  filenm = trim(ensdir)//trim(memberheader(nm))//'.pwat__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,pw)
  print *, varname,unitnm,nx,ny

  filenm = trim(ensdir)//trim(memberheader(nm))//'.cmpref'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,cmpref)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    cmprefm(i,j)=cmprefm(i,j)+cmpref(i,j)
    cmpreft(i,j)=cmpreft(i,j)+cmpref(i,j)*cmpref(i,j)
    enddo
  enddo

! calculate probability of cmpref
  do i=1,nx
    do j=1,ny
    if(cmpref(i,j).ge.35.0) pbcref(i,j,1)=pbcref(i,j,1)+factor ! >35 dBZ
    if(cmpref(i,j).ge.45.0) pbcref(i,j,2)=pbcref(i,j,2)+factor ! >45 dBZ
    if(cmpref(i,j).ge.55.0) pbcref(i,j,3)=pbcref(i,j,3)+factor ! >55 dBZ
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.ref1km'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,refl1km)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    refl1kmm(i,j)=refl1kmm(i,j)+refl1km(i,j)
    refl1kmt(i,j)=refl1kmt(i,j)+refl1km(i,j)*refl1km(i,j)
    enddo
  enddo

! calculate probability of refl
  do i=1,nx
    do j=1,ny
    if(refl1km(i,j).ge.35.0) pbref1(i,j,1)=pbref1(i,j,1)+factor ! >35 dBZ
    if(refl1km(i,j).ge.45.0) pbref1(i,j,2)=pbref1(i,j,2)+factor ! >45 dBZ
    if(refl1km(i,j).ge.55.0) pbref1(i,j,3)=pbref1(i,j,3)+factor ! >55 dBZ
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.u10m__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,u10m)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    u10mm(i,j)=u10mm(i,j)+u10m(i,j)
    u10mt(i,j)=u10mt(i,j)+u10m(i,j)*u10m(i,j)
    enddo
  enddo

  filenm = trim(ensdir)//trim(memberheader(nm))//'.v10m__'//tlevel(nt)
  CALL binread2d(nx,ny,trim(filenm),varname,unitnm,v10m)
  print *, varname,unitnm,nx,ny
  do i=1,nx
    do j=1,ny
    v10mm(i,j)=v10mm(i,j)+v10m(i,j)
    v10mt(i,j)=v10mt(i,j)+v10m(i,j)*v10m(i,j)
    enddo
  enddo

!  if(nt == 1 .AND. nm ==1) then
!  do j=1,ny
!    write(15,'(5e16.8)') (temp850(i,j),i=1,nx)
!  enddo
!  endif

  enddo  ! end member loop

! calculate ensemble mean & square spread
  do i=1,nx
    do j=1,ny
    mslpm(i,j)=mslpm(i,j)/float(nmember)
    mslpt(i,j)=mslpt(i,j)/float(nmember)-mslpm(i,j)*mslpm(i,j)
    hgt250m(i,j)=hgt250m(i,j)/float(nmember)
    hgt250t(i,j)=hgt250t(i,j)/float(nmember)-hgt250m(i,j)*hgt250m(i,j)
    hgt500m(i,j)=hgt500m(i,j)/float(nmember)
    hgt500t(i,j)=hgt500t(i,j)/float(nmember)-hgt500m(i,j)*hgt500m(i,j)
    hgt850m(i,j)=hgt850m(i,j)/float(nmember)
    hgt850t(i,j)=hgt850t(i,j)/float(nmember)-hgt850m(i,j)*hgt850m(i,j)
    temp850m(i,j)=temp850m(i,j)/float(nmember)
    temp850t(i,j)=temp850t(i,j)/float(nmember)-temp850m(i,j)*temp850m(i,j)
    temp2mm(i,j)=temp2mm(i,j)/float(nmember)
    temp2mt(i,j)=temp2mt(i,j)/float(nmember)-temp2mm(i,j)*temp2mm(i,j)
    dewp2mm(i,j)=dewp2mm(i,j)/float(nmember)
    dewp2mt(i,j)=dewp2mt(i,j)/float(nmember)-dewp2mm(i,j)*dewp2mm(i,j)
    accpptm(i,j)=accpptm(i,j)/float(nmember)
    accpptt(i,j)=accpptt(i,j)/float(nmember)-accpptm(i,j)*accpptm(i,j)
!    convpptm(i,j)=convpptm(i,j)/float(nmember)
!    convpptt(i,j)=convpptt(i,j)/float(nmember)-convpptm(i,j)*convpptm(i,j)
    cmprefm(i,j)=cmprefm(i,j)/float(nmember)
    cmpreft(i,j)=cmpreft(i,j)/float(nmember)-cmprefm(i,j)*cmprefm(i,j)
    refl1kmm(i,j)=refl1kmm(i,j)/float(nmember)
    refl1kmt(i,j)=refl1kmt(i,j)/float(nmember)-refl1kmm(i,j)*refl1kmm(i,j)
    u10mm(i,j)=u10mm(i,j)/float(nmember)
    u10mt(i,j)=u10mt(i,j)/float(nmember)-u10mm(i,j)*u10mm(i,j)
    v10mm(i,j)=v10mm(i,j)/float(nmember)
    v10mt(i,j)=v10mt(i,j)/float(nmember)-v10mm(i,j)*v10mm(i,j)
    enddo
  enddo

  do i=1,nx
    do j=1,ny
    mslpt(i,j)=abs(mslpt(i,j))
    hgt250t(i,j)=abs(hgt250t(i,j))
    hgt500t(i,j)=abs(hgt500t(i,j))
    hgt850t(i,j)=abs(hgt850t(i,j))
    temp850t(i,j)=abs(temp850t(i,j))
    temp2mt(i,j)=abs(temp2mt(i,j))
    dewp2mt(i,j)=abs(dewp2mt(i,j))
    accpptt(i,j)=abs(accpptt(i,j))
!    convpptt(i,j)=abs(convpptt(i,j))
    cmpreft(i,j)=abs(cmpreft(i,j))
    refl1kmt(i,j)=abs(refl1kmt(i,j))
    u10mt(i,j)=abs(u10mt(i,j))
    v10mt(i,j)=abs(v10mt(i,j))
    enddo
  enddo

! write out ensemble means
  outfile = trim(outdir)//'mean/'//trim(outheader)//'.'

  filenm=trim(outfile)//'mslp__'//tlevel(nt)
  print *, trim(filenm)
  q3dname='MSLP'
  q3dunit='hPa'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,mslpm)

  filenm=trim(outfile)//'hgt250'//tlevel(nt)
  print *, trim(filenm)
  q3dname='HGHT'
  q3dunit='m'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,hgt250m)

  filenm=trim(outfile)//'hgt500'//tlevel(nt)
  print *, trim(filenm)
  q3dname='HGHT'
  q3dunit='m'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,hgt500m)

  filenm=trim(outfile)//'hgt850'//tlevel(nt)
  print *, trim(filenm)
  q3dname='HGHT'
  q3dunit='m'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,hgt850m)

  filenm=trim(outfile)//'tmp850'//tlevel(nt)
  print *, trim(filenm)
  q3dname='TMPC'
  q3dunit='C'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,temp850m)

  filenm=trim(outfile)//'temp2m'//tlevel(nt)
  print *, trim(filenm)
  q3dname='temp2m'
  q3dunit='F'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,temp2mm)

  filenm=trim(outfile)//'dewp2m'//tlevel(nt)
  print *, trim(filenm)
  q3dname='dewp2m'
  q3dunit='F'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,dewp2mm)

  filenm=trim(outfile)//'accppt'//tlevel(nt)
  print *, trim(filenm)
  q3dname='RAIN'
  q3dunit='mm'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,accpptm)

  filenm=trim(outfile)//'cmpref'//tlevel(nt)
  print *, trim(filenm)
  q3dname='cmpref'
  q3dunit='dBZ'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,cmprefm)

  filenm=trim(outfile)//'ref1km'//tlevel(nt)
  print *, trim(filenm)
  q3dname='refl1km'
  q3dunit='dBZ'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,refl1kmm)

  filenm=trim(outfile)//'u10m__'//tlevel(nt)
  print *, trim(filenm)
  q3dname='UREL'
  q3dunit='m/s'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,u10mm)

  filenm=trim(outfile)//'v10m__'//tlevel(nt)
  print *, trim(filenm)
  q3dname='VREL'
  q3dunit='m/s'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,v10mm)

! write out probabilities
  outfile = trim(outdir)//'prob/'//trim(outheader)//'.'

  filenm=trim(outfile)//'pbr010'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBRAIN010'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbrain(1,1,1))

  filenm=trim(outfile)//'pbr025'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBRAIN025'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbrain(1,1,2))

  filenm=trim(outfile)//'pbr050'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBRAIN050'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbrain(1,1,3))

  filenm=trim(outfile)//'pbr100'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBRAIN100'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbrain(1,1,4))

  filenm=trim(outfile)//'pbz135'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBREFLC1KM35'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbref1(1,1,1))

  filenm=trim(outfile)//'pbz145'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBREFLC1KM45'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbref1(1,1,2))

  filenm=trim(outfile)//'pbz155'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBREFLC1KM55'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbref1(1,1,3))

  filenm=trim(outfile)//'pbcz35'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBCMPREF35'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbcref(1,1,1))

  filenm=trim(outfile)//'pbcz45'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBCMPREF45'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbcref(1,1,2))

  filenm=trim(outfile)//'pbcz55'//tlevel(nt)
  print *, trim(filenm)
  q3dname='PBCMPREF55'
  q3dunit='%'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,pbcref(1,1,3))

! calculate domain rms spread
  do i=1,nx
    do j=1,ny
    sp(nt,1)=sp(nt,1)+mslpt(i,j)
    sp(nt,2)=sp(nt,2)+hgt250t(i,j)
    sp(nt,3)=sp(nt,3)+hgt500t(i,j)
    sp(nt,4)=sp(nt,4)+hgt850t(i,j)
    sp(nt,5)=sp(nt,5)+temp850t(i,j)
    sp(nt,6)=sp(nt,6)+temp2mt(i,j)
    sp(nt,7)=sp(nt,7)+dewp2mt(i,j)
    sp(nt,8)=sp(nt,8)+accpptt(i,j)
!    sp(nt,9)=sp(nt,9)+convpptt(i,j)
    sp(nt,10)=sp(nt,10)+cmpreft(i,j)
    sp(nt,11)=sp(nt,11)+refl1kmt(i,j)
    sp(nt,12)=sp(nt,12)+u10mt(i,j)
    sp(nt,13)=sp(nt,13)+v10mt(i,j)
    enddo
  enddo
print *,'totlegrid,totlegrid1,totlegrid2:', &
         int(totlegrid),int(totlegrid1),int(totlegrid2)
    sp(nt,1)=sqrt(sp(nt,1)/totlegrid) ! domain average spread for mslp
    sp(nt,2)=sqrt(sp(nt,2)/totlegrid) ! domain average spread for hgt250
    sp(nt,3)=sqrt(sp(nt,3)/totlegrid) ! domain average spread for hgt500
    sp(nt,4)=sqrt(sp(nt,4)/totlegrid1) ! domain average spread for hgt850
    sp(nt,5)=sqrt(sp(nt,5)/totlegrid2) ! domain average spread for temp850
    sp(nt,6)=sqrt(sp(nt,6)/totlegrid) ! domain average spread for temp2m
    sp(nt,7)=sqrt(sp(nt,7)/totlegrid) ! domain average spread for dewp2m
    sp(nt,8)=sqrt(sp(nt,8)/totlegrid) ! domain average spread for accppt
!    sp(nt,9)=sqrt(sp(nt,9)/totlegrid) ! domain average spread for convppt
    sp(nt,10)=sqrt(sp(nt,10)/totlegrid) ! domain average spread for cmpref
    sp(nt,11)=sqrt(sp(nt,11)/totlegrid) ! domain average spread for refl
    sp(nt,12)=sqrt(sp(nt,12)/totlegrid) ! domain average spread for u10m
    sp(nt,13)=sqrt(sp(nt,13)/totlegrid) ! domain average spread for v10m

! calculate and write out ensemble spread
  do i=1,nx
    do j=1,ny
    mslpt(i,j)=sqrt(mslpt(i,j))
    hgt250t(i,j)=sqrt(hgt250t(i,j))
    hgt500t(i,j)=sqrt(hgt500t(i,j))
    hgt850t(i,j)=sqrt(hgt850t(i,j))
    temp850t(i,j)=sqrt(temp850t(i,j))
    temp2mt(i,j)=sqrt(temp2mt(i,j))
    dewp2mt(i,j)=sqrt(dewp2mt(i,j))
    accpptt(i,j)=sqrt(accpptt(i,j))
!    convpptt(i,j)=sqrt(convpptt(i,j))
    cmpreft(i,j)=sqrt(cmpreft(i,j))
    refl1kmt(i,j)=sqrt(refl1kmt(i,j))
    u10mt(i,j)=sqrt(u10mt(i,j))
    v10mt(i,j)=sqrt(v10mt(i,j))
    enddo
  enddo

! write out binary format spread fields
  outfile = trim(outdir)//'sprd/'//trim(outheader)//'.'

  filenm=trim(outfile)//'mslp__'//tlevel(nt)
  print *, trim(filenm)
  q3dname='MSLP'
  q3dunit='hPa'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,mslpt)

  filenm=trim(outfile)//'hgt500'//tlevel(nt)
  print *, trim(filenm)
  q3dname='HGHT'
  q3dunit='m'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,hgt500t)

  filenm=trim(outfile)//'temp2m'//tlevel(nt)
  print *, trim(filenm)
  q3dname='temp2m'
  q3dunit='F'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,temp2mt)

  filenm=trim(outfile)//'dewp2m'//tlevel(nt)
  print *, trim(filenm)
  q3dname='dewp2m'
  q3dunit='F'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,dewp2mt)

  filenm=trim(outfile)//'accppt'//tlevel(nt)
  print *, trim(filenm)
  q3dname='RAIN'
  q3dunit='mm'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,accppt)

  filenm=trim(outfile)//'ref1km'//tlevel(nt)
  print *, trim(filenm)
  q3dname='refl1km'
  q3dunit='dBZ'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,refl1kmt)

  filenm=trim(outfile)//'u10m__'//tlevel(nt)
  print *, trim(filenm)
  q3dname='u10m'
  q3dunit='m/s'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,u10mt)

  filenm=trim(outfile)//'v10m__'//tlevel(nt)
  print *, trim(filenm)
  q3dname='v10m'
  q3dunit='m/s'
  CALL bindump2d(nx,ny,trim(filenm),q3dname,q3dunit,v10mt)

  if(anaopt ==1) then  ! calculate error-related quantities
! calculate mse, ...
  do i=1,nx
    do j=1,ny
    sum1(nt,1)=sum1(nt,1)+mslpm(i,j)
    sum1(nt,3)=sum1(nt,3)+hgt500m(i,j)
    sum1(nt,5)=sum1(nt,5)+temp850m(i,j)
    sum1(nt,6)=sum1(nt,6)+temp2mm(i,j)
    sum1(nt,7)=sum1(nt,7)+dewp2mm(i,j)
    sum1(nt,8)=sum1(nt,8)+accpptm(i,j)
    sum1(nt,11)=sum1(nt,11)+refl1kmm(i,j)
    sum1(nt,12)=sum1(nt,12)+u10mm(i,j)
    sum1(nt,13)=sum1(nt,13)+v10mm(i,j)
    sum2(nt,1)=sum2(nt,1)+mslpa(i,j)
    sum2(nt,3)=sum2(nt,3)+hgt500a(i,j)
    sum2(nt,5)=sum2(nt,5)+temp850a(i,j)
    sum2(nt,6)=sum2(nt,6)+temp2ma(i,j)
    sum2(nt,7)=sum2(nt,7)+dewp2ma(i,j)
    sum2(nt,8)=sum2(nt,8)+accppta(i,j)
    sum2(nt,11)=sum2(nt,11)+refl1kma(i,j)
    sum2(nt,12)=sum2(nt,12)+u10ma(i,j)
    sum2(nt,13)=sum2(nt,13)+v10ma(i,j)
    mse(nt,1)=mse(nt,1)+(mslpm(i,j)-mslpa(i,j))**2
    mse(nt,3)=mse(nt,3)+(hgt500m(i,j)-hgt500a(i,j))**2
    mse(nt,5)=mse(nt,5)+(temp850m(i,j)-temp850a(i,j))**2
    mse(nt,6)=mse(nt,6)+(temp2mm(i,j)-temp2ma(i,j))**2
    mse(nt,7)=mse(nt,7)+(dewp2mm(i,j)-dewp2ma(i,j))**2
    mse(nt,8)=mse(nt,8)+(accpptm(i,j)-accppta(i,j))**2
    mse(nt,11)=mse(nt,11)+(refl1kmm(i,j)-refl1kma(i,j))**2
    mse(nt,12)=mse(nt,12)+(u10mm(i,j)-u10ma(i,j))**2
    mse(nt,13)=mse(nt,13)+(v10mm(i,j)-v10ma(i,j))**2
    mnbias(nt,1)=mnbias(nt,1)+(mslpm(i,j)-mslpa(i,j))
    mnbias(nt,3)=mnbias(nt,3)+(hgt500m(i,j)-hgt500a(i,j))
    mnbias(nt,5)=mnbias(nt,5)+(temp850m(i,j)-temp850a(i,j))
    mnbias(nt,6)=mnbias(nt,6)+(temp2mm(i,j)-temp2ma(i,j))
    mnbias(nt,7)=mnbias(nt,7)+(dewp2mm(i,j)-dewp2ma(i,j))
    mnbias(nt,8)=mnbias(nt,8)+(accpptm(i,j)-accppta(i,j))
    mnbias(nt,11)=mnbias(nt,11)+(refl1kmm(i,j)-refl1kma(i,j))
    mnbias(nt,12)=mnbias(nt,12)+(u10mm(i,j)-u10ma(i,j))
    mnbias(nt,13)=mnbias(nt,13)+(v10mm(i,j)-v10ma(i,j))
    enddo
  enddo
  sum1(nt,1)=sum1(nt,1)/totlegrid
  sum1(nt,3)=sum1(nt,3)/totlegrid
  sum1(nt,5)=sum1(nt,5)/totlegrid2
  sum1(nt,6)=sum1(nt,6)/totlegrid
  sum1(nt,7)=sum1(nt,7)/totlegrid
  sum1(nt,8)=sum1(nt,8)/totlegrid
  sum1(nt,11)=sum1(nt,11)/totlegrid
  sum1(nt,12)=sum1(nt,12)/totlegrid
  sum1(nt,13)=sum1(nt,13)/totlegrid
  sum2(nt,1)=sum2(nt,1)/totlegrid
  sum2(nt,3)=sum2(nt,3)/totlegrid
  sum2(nt,5)=sum2(nt,5)/totlegrid2
  sum2(nt,6)=sum2(nt,6)/totlegrid
  sum2(nt,7)=sum2(nt,7)/totlegrid
  sum2(nt,8)=sum2(nt,8)/totlegrid
  sum2(nt,11)=sum2(nt,11)/totlegrid
  sum2(nt,12)=sum2(nt,12)/totlegrid
  sum2(nt,13)=sum2(nt,13)/totlegrid
  mse(nt,1)=sqrt(mse(nt,1)/totlegrid)
  mse(nt,3)=sqrt(mse(nt,3)/totlegrid)
  mse(nt,5)=sqrt(mse(nt,5)/totlegrid2)
  mse(nt,6)=sqrt(mse(nt,6)/totlegrid)
  mse(nt,7)=sqrt(mse(nt,7)/totlegrid)
  mse(nt,8)=sqrt(mse(nt,8)/totlegrid)
  mse(nt,11)=sqrt(mse(nt,11)/totlegrid)
  mse(nt,12)=sqrt(mse(nt,12)/totlegrid)
  mse(nt,13)=sqrt(mse(nt,13)/totlegrid)
  mnbias(nt,1)=mnbias(nt,1)/totlegrid
  mnbias(nt,3)=mnbias(nt,3)/totlegrid
  mnbias(nt,5)=mnbias(nt,5)/totlegrid2
  mnbias(nt,6)=mnbias(nt,6)/totlegrid
  mnbias(nt,7)=mnbias(nt,7)/totlegrid
  mnbias(nt,8)=mnbias(nt,8)/totlegrid
  mnbias(nt,11)=mnbias(nt,11)/totlegrid
  mnbias(nt,12)=mnbias(nt,12)/totlegrid
  mnbias(nt,13)=mnbias(nt,13)/totlegrid
  do i=1,nx
    do j=1,ny
    sd1(nt,1)=sd1(nt,1)+(mslpm(i,j)-sum1(nt,1))**2
    sd1(nt,3)=sd1(nt,3)+(hgt500m(i,j)-sum1(nt,3))**2
    sd1(nt,5)=sd1(nt,5)+(temp850m(i,j)-sum1(nt,5))**2
    sd1(nt,6)=sd1(nt,6)+(temp2mm(i,j)-sum1(nt,6))**2
    sd1(nt,7)=sd1(nt,7)+(dewp2mm(i,j)-sum1(nt,7))**2
    sd1(nt,8)=sd1(nt,8)+(accpptm(i,j)-sum1(nt,8))**2
    sd1(nt,11)=sd1(nt,11)+(refl1kmm(i,j)-sum1(nt,11))**2
    sd1(nt,12)=sd1(nt,12)+(u10mm(i,j)-sum1(nt,12))**2
    sd1(nt,13)=sd1(nt,13)+(v10mm(i,j)-sum1(nt,13))**2
    sd2(nt,1)=sd2(nt,1)+(mslpa(i,j)-sum2(nt,1))**2
    sd2(nt,3)=sd2(nt,3)+(hgt500a(i,j)-sum2(nt,3))**2
    sd2(nt,5)=sd2(nt,5)+(temp850a(i,j)-sum2(nt,5))**2
    sd2(nt,6)=sd2(nt,6)+(temp2ma(i,j)-sum2(nt,6))**2
    sd2(nt,7)=sd2(nt,7)+(dewp2ma(i,j)-sum2(nt,7))**2
    sd2(nt,8)=sd2(nt,8)+(accppta(i,j)-sum2(nt,8))**2
    sd2(nt,11)=sd2(nt,11)+(refl1kma(i,j)-sum2(nt,11))**2
    sd2(nt,12)=sd2(nt,12)+(u10ma(i,j)-sum2(nt,12))**2
    sd2(nt,13)=sd2(nt,13)+(v10ma(i,j)-sum2(nt,13))**2
    sde(nt,1)=sde(nt,1)+(mslpm(i,j)-sum1(nt,1)-mslpa(i,j)+sum2(nt,1))**2
    sde(nt,3)=sde(nt,3)+(hgt500m(i,j)-sum1(nt,3)-hgt500a(i,j)+sum2(nt,3))**2
    sde(nt,5)=sde(nt,5)+(temp850m(i,j)-sum1(nt,5)-temp850a(i,j)+sum2(nt,5))**2
    sde(nt,6)=sde(nt,6)+(temp2mm(i,j)-sum1(nt,6)-temp2ma(i,j)+sum2(nt,6))**2
    sde(nt,7)=sde(nt,7)+(dewp2mm(i,j)-sum1(nt,7)-dewp2ma(i,j)+sum2(nt,7))**2
    sde(nt,8)=sde(nt,8)+(accpptm(i,j)-sum1(nt,8)-accppta(i,j)+sum2(nt,8))**2
    sde(nt,11)=sde(nt,11)+(refl1kmm(i,j)-sum1(nt,11)-refl1kma(i,j)+ &
               sum2(nt,11))**2
    sde(nt,12)=sde(nt,12)+(u10mm(i,j)-sum1(nt,12)-u10ma(i,j)+sum2(nt,12))**2
    sde(nt,13)=sde(nt,13)+(v10mm(i,j)-sum1(nt,13)-v10ma(i,j)+sum2(nt,13))**2
    corr(nt,1)=corr(nt,1)+(mslpm(i,j)-sum1(nt,1))*(mslpa(i,j)-sum2(nt,1))
    corr(nt,3)=corr(nt,3)+(hgt500m(i,j)-sum1(nt,3))*(hgt500a(i,j)-sum2(nt,3))
    corr(nt,5)=corr(nt,5)+(temp850m(i,j)-sum1(nt,5))*(temp850a(i,j)-sum2(nt,5))
    corr(nt,6)=corr(nt,6)+(temp2mm(i,j)-sum1(nt,6))*(temp2ma(i,j)-sum2(nt,6))
    corr(nt,7)=corr(nt,7)+(dewp2mm(i,j)-sum1(nt,7))*(dewp2ma(i,j)-sum2(nt,7))
    corr(nt,8)=corr(nt,8)+(accpptm(i,j)-sum1(nt,8))*(accppta(i,j)-sum2(nt,8))
    corr(nt,11)=corr(nt,11)+(refl1kmm(i,j)-sum1(nt,11))*(refl1kma(i,j)- &
                sum2(nt,11))
    corr(nt,12)=corr(nt,12)+(u10mm(i,j)-sum1(nt,12))*(u10ma(i,j)-sum2(nt,12))
    corr(nt,13)=corr(nt,13)+(v10mm(i,j)-sum1(nt,13))*(v10ma(i,j)-sum2(nt,13))
    enddo
  enddo
  sd1(nt,1)=sqrt(sd1(nt,1)/totlegrid)
  sd1(nt,3)=sqrt(sd1(nt,3)/totlegrid)
  sd1(nt,5)=sqrt(sd1(nt,5)/totlegrid2)
  sd1(nt,6)=sqrt(sd1(nt,6)/totlegrid)
  sd1(nt,7)=sqrt(sd1(nt,7)/totlegrid)
  sd1(nt,8)=sqrt(sd1(nt,8)/totlegrid)
  sd1(nt,11)=sqrt(sd1(nt,11)/totlegrid)
  sd1(nt,12)=sqrt(sd1(nt,12)/totlegrid)
  sd1(nt,13)=sqrt(sd1(nt,13)/totlegrid)
  sd2(nt,1)=sqrt(sd2(nt,1)/totlegrid)
  sd2(nt,3)=sqrt(sd2(nt,3)/totlegrid)
  sd2(nt,5)=sqrt(sd2(nt,5)/totlegrid2)
  sd2(nt,6)=sqrt(sd2(nt,6)/totlegrid)
  sd2(nt,7)=sqrt(sd2(nt,7)/totlegrid)
  sd2(nt,8)=sqrt(sd2(nt,8)/totlegrid)
  sd2(nt,11)=sqrt(sd2(nt,11)/totlegrid)
  sd2(nt,12)=sqrt(sd2(nt,12)/totlegrid)
  sd2(nt,13)=sqrt(sd2(nt,13)/totlegrid)
  sde(nt,1)=sqrt(sde(nt,1)/totlegrid)
  sde(nt,3)=sqrt(sde(nt,3)/totlegrid)
  sde(nt,5)=sqrt(sde(nt,5)/totlegrid2)
  sde(nt,6)=sqrt(sde(nt,6)/totlegrid)
  sde(nt,7)=sqrt(sde(nt,7)/totlegrid)
  sde(nt,8)=sqrt(sde(nt,8)/totlegrid)
  sde(nt,11)=sqrt(sde(nt,11)/totlegrid)
  sde(nt,12)=sqrt(sde(nt,12)/totlegrid)
  sde(nt,13)=sqrt(sde(nt,13)/totlegrid)
  sdbias(nt,1)=sd1(nt,1)-sd2(nt,1)
  sdbias(nt,3)=sd1(nt,3)-sd2(nt,3)
  sdbias(nt,5)=sd1(nt,5)-sd2(nt,5)
  sdbias(nt,6)=sd1(nt,6)-sd2(nt,6)
  sdbias(nt,7)=sd1(nt,7)-sd2(nt,7)
  sdbias(nt,8)=sd1(nt,8)-sd2(nt,8)
  sdbias(nt,11)=sd1(nt,11)-sd2(nt,11)
  sdbias(nt,12)=sd1(nt,12)-sd2(nt,12)
  sdbias(nt,13)=sd1(nt,13)-sd2(nt,13)
!  corr(nt,1)=corr(nt,1)/(totlegrid*sd1(nt,1)*sd2(nt,1))
!  corr(nt,3)=corr(nt,3)/(totlegrid*sd1(nt,3)*sd2(nt,3))
!  corr(nt,5)=corr(nt,5)/(totlegrid*sd1(nt,5)*sd2(nt,5))
!  corr(nt,6)=corr(nt,6)/(totlegrid*sd1(nt,6)*sd2(nt,6))
!  corr(nt,7)=corr(nt,7)/(totlegrid*sd1(nt,7)*sd2(nt,7))
  do ll=1,13
  if(sd1(nt,ll)*sd2(nt,ll)<=0.0) then
  corr(nt,ll)=1.0
  else
    if(ll == 5) then
  corr(nt,ll)=amin1(corr(nt,ll)/(totlegrid2*sd1(nt,ll)*sd2(nt,ll)),1.0)
    else
  corr(nt,ll)=amin1(corr(nt,ll)/(totlegrid*sd1(nt,ll)*sd2(nt,ll)),1.0)
    endif
  endif
  enddo
!  corr(nt,11)=corr(nt,11)/(totlegrid*sd1(nt,11)*sd2(nt,11))
!  corr(nt,12)=corr(nt,12)/(totlegrid*sd1(nt,12)*sd2(nt,12))
!  corr(nt,13)=corr(nt,13)/(totlegrid*sd1(nt,13)*sd2(nt,13))
  disp(nt,1)=sqrt(2.*(1.-corr(nt,1))*sd1(nt,1)*sd2(nt,1))
  disp(nt,3)=sqrt(2.*(1.-corr(nt,3))*sd1(nt,3)*sd2(nt,3))
  disp(nt,5)=sqrt(2.*(1.-corr(nt,5))*sd1(nt,5)*sd2(nt,5))
  disp(nt,6)=sqrt(2.*(1.-corr(nt,6))*sd1(nt,6)*sd2(nt,6))
  disp(nt,7)=sqrt(2.*(1.-corr(nt,7))*sd1(nt,7)*sd2(nt,7))
  disp(nt,8)=sqrt(2.*(1.-corr(nt,8))*sd1(nt,8)*sd2(nt,8))
  disp(nt,11)=sqrt(2.*(1.-corr(nt,11))*sd1(nt,11)*sd2(nt,11))
  disp(nt,12)=sqrt(2.*(1.-corr(nt,12))*sd1(nt,12)*sd2(nt,12))
  disp(nt,13)=sqrt(2.*(1.-corr(nt,13))*sd1(nt,13)*sd2(nt,13))

  endif  ! end calculating error-related quantities

  enddo  ! end time loop

! write out spread arrays
  open(4, file=trim(outdir)//'ens_sp.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(sp(j,i),i=1,13)
  enddo
  close(4)

  if(anaopt ==1) then  ! write out ensemble error analysis

  open(4, file=trim(outdir)//'ens_err_rmse.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(mse(j,i),i=1,13)
  enddo
  close(4)
  open(4, file=trim(outdir)//'ens_err_sde.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(sde(j,i),i=1,13)
  enddo
  close(4)
  open(4, file=trim(outdir)//'ens_err_mnbias.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(mnbias(j,i),i=1,13)
  enddo
  close(4)
  open(4, file=trim(outdir)//'ens_err_sdbias.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(sdbias(j,i),i=1,13)
  enddo
  close(4)
  open(4, file=trim(outdir)//'ens_err_corr.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(100.*corr(j,i),i=1,13)
  enddo
  close(4)
  open(4, file=trim(outdir)//'ens_err_disp.asc',form='formatted')
  write(4,*) '& ntimes =',nf
  write(4,'(a)') '& mslp hgt250 hgt500 hgt850 temp850 temp2m dewp2m accppt convppt cmpref refl u10m v10m'
  do j=1,nf
  write(4,'(i5,13f10.4)') j-1,(disp(j,i),i=1,13)
  enddo
  close(4)
  endif

  STOP

  9000 CONTINUE        ! I/O errors

  CLOSE(UNIT=nunit)
  CALL retunit(nunit)

  IF (istat < 0) THEN
    iSTATUS = 2
    PRINT *, 'BINREAD2D: I/O ERRORS OCCURRED ',                          &
        '(possible end of record or file): ',istat, iSTATUS
  ELSE IF (istat > 0) THEN
    iSTATUS = 2
    PRINT *, 'BINREAD2D: UNRECOVERABLE I/O ERRORS OCCURRED: ',           &
        istat,iSTATUS
  END IF

END PROGRAM ens_ana