!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE READEXBC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE readexbc(nx,ny,nz,filename,lfname,ctime, & 5,90
u,v,w,pt,pr,qv,qc,qr,qi,qs,qh, ierr)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in 6 primary fields for use as external boundary
! conditions.
!
! In general these data will come from another model.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! May, 1994
!
! MODIFICATION HISTORY:
!
! 5/26/94 (Yuhe Liu)
! Merged into the part of ARPS for external boundary conditions.
!
! 8/8/95 (M. Xue)
! Added water and ice variables to the EXBC files.
! To read earlier version EXBC files, one has to set old_v=1.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! dx Expected x grid spacing
! dy Expected y grid spacing
! dz Expected z grid spacing
!
! ctrlat Expected center latitude
! ctrlon Expected center longitude
!
! filename File name of EXBC boundary data set.
! lfname Length of the filename
!
! OUTPUT:
!
! ctime Charater representation of the time of EXBC data
!
! ubcrd Flag indicating (1) if the u field is valid
! vbcrd Flag indicating (1) if the v field is valid
! wbcrd Flag indicating (1) if the w field is valid
! ptbcrd Flag indicating (1) if the pt field is valid
! prbcrd Flag indicating (1) if the pr field is valid
! qvbcrd Flag indicating (1) if the qv field is valid
! qcbcrd Flag indicating (1) if the qc field is valid
! qrbcrd Flag indicating (1) if the qr field is valid
! qibcrd Flag indicating (1) if the qi field is valid
! qsbcrd Flag indicating (1) if the qs field is valid
! qhbcrd Flag indicating (1) if the qh field is valid
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of Cartesian velocity (m/s)
! pt Potential temperature (K)
! pr Pressure (Pascal)
! qv Water vapor mixing ratio humidity (kg/kg)
! qc Cloud water mixing ratio humidity (kg/kg)
! qr Rain water mixing ratio humidity (kg/kg)
! qi Cloud ice mixing ratio humidity (kg/kg)
! qs Snow mixing ratio humidity (kg/kg)
! qh Hail water mixing ratio humidity (kg/kg)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
CHARACTER (LEN=* ) :: filename
INTEGER :: lfname
CHARACTER (LEN=* ) :: ctime
REAL :: u(nx,ny,nz) ! u-velocity (m/s)
REAL :: v(nx,ny,nz) ! v-velocity (m/s)
REAL :: w(nx,ny,nz) ! w-velocity (m/s)
REAL :: pt(nx,ny,nz) ! Potential temperature (K)
REAL :: pr(nx,ny,nz) ! Pressure (Pascal)
REAL :: qv(nx,ny,nz) ! Water vapor mixing ratio (kg/kg)
REAL :: qc(nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr(nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi(nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs(nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh(nx,ny,nz) ! Hail mixing ratio (kg/kg)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nxin,nyin,nzin
REAL :: ctrlatin,ctrlonin
INTEGER :: istat, ierr, idummy, old_v
REAL :: amax, amin
INTEGER :: ireturn
INTEGER :: strhoptin
REAL :: dxin,dyin,dzin,dzminin,zrefsfcin,dlayer1in, &
dlayer2in,zflatin,strhtunein
REAL :: trulat1in,trulat2in,trulonin,sclfctin
INTEGER :: maprojin
INTEGER(2), ALLOCATABLE :: itmp(:,:,:) ! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
INTEGER :: clipxy, clipz
INTEGER :: i, j, k
INTEGER, SAVE :: bfid
INTEGER, SAVE :: itime = 0
INTEGER :: istop
!
! Add the following only for HDF format, which is for
! split_hdf to work properly.
!
! fmtver??: to label each data a version.
!
CHARACTER (LEN=40) :: fmtverin,fmtverhdf410,fmtverhdf500
PARAMETER (fmtverhdf410='004.10 HDF4 Coded Data')
PARAMETER (fmtverhdf500='005.00 HDF4 Coded Data')
REAL, ALLOCATABLE :: var3du(:,:,:)
REAL, ALLOCATABLE :: var3dv(:,:,:)
REAL, ALLOCATABLE :: var3dw(:,:,:)
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'exbc.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'mp.inc' ! mpi parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (exbcfmt == 3) THEN
ALLOCATE (itmp(nx,ny,nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "READEXBC: ERROR allocating itmp, returning"
ierr = 1
RETURN
END IF
ALLOCATE (hmax(nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "READEXBC: ERROR allocating hmax, returning"
ierr = 1
RETURN
END IF
ALLOCATE (hmin(nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "READEXBC: ERROR allocating hmin, returning"
ierr = 1
RETURN
END IF
END IF
IF (myproc == 0) &
WRITE (6,*) "READEXBC: reading in external boundary data ", &
"from file ",filename(1:lfname)
!
!-----------------------------------------------------------------------
!
! Read in header information.
!
!-----------------------------------------------------------------------
!
IF (exbcfmt == 1) THEN
!-----------------------------------------------------------------------
!
! Fortran unformatted dump.
!
!-----------------------------------------------------------------------
CALL getunit
( bfid )
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filename(1:lfname), '-F f77 -N ieee', ierr)
OPEN(bfid,FILE=filename(1:lfname),STATUS='old', &
FORM='unformatted',IOSTAT=istat)
IF ( istat /= 0 ) THEN
ierr = 1
GO TO 900
END IF
READ(bfid,ERR=999) nxin,nyin,nzin,dxin,dyin,dzin, &
ctrlatin,ctrlonin
READ(bfid,ERR=999) ctime
old_v = 0 ! In case that the EXBC files are of an earlier
! version that does not contain water and ice variables,
! set old_v to 1. Otherwise, set it to 0.
IF( old_v == 1 ) THEN
READ(bfid,ERR=999) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
qcbcrd=0
qrbcrd=0
qibcrd=0
qsbcrd=0
qhbcrd=0
ELSE
READ(bfid,ERR=999) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd, &
qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd, &
qhbcrd,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
END IF
ELSE IF (exbcfmt == 3) THEN
!-----------------------------------------------------------------------
!
! HDF4 format.
!
!-----------------------------------------------------------------------
CALL hdfopen
(trim(filename(1:lfname)), 1, bfid)
IF (bfid < 0) THEN
WRITE (6,*) "READEXBC: ERROR opening ", &
trim(filename(1:lfname))," for reading."
ierr = 1
GO TO 900
END IF
CALL hdfrdc
(bfid,40,"fmtver",fmtverin,istat)
! Should check fmtverin here
CALL hdfrdc
(bfid,15,"ctime",ctime,istat)
CALL hdfrdi
(bfid,"nx",nxin,istat)
CALL hdfrdi
(bfid,"ny",nyin,istat)
CALL hdfrdi
(bfid,"nz",nzin,istat)
CALL hdfrdr
(bfid,"dx",dxin,istat)
CALL hdfrdr
(bfid,"dy",dyin,istat)
CALL hdfrdr
(bfid,"dz",dzin,istat)
CALL hdfrdr
(bfid,"dzmin",dzminin,istat)
CALL hdfrdi
(bfid,"strhopt",strhoptin,istat)
CALL hdfrdr
(bfid,"zrefsfc",zrefsfcin,istat)
CALL hdfrdr
(bfid,"dlayer1",dlayer1in,istat)
CALL hdfrdr
(bfid,"dlayer2",dlayer2in,istat)
CALL hdfrdr
(bfid,"zflat",zflatin,istat)
CALL hdfrdr
(bfid,"strhtune",strhtunein,istat)
CALL hdfrdi
(bfid,"mapproj",maprojin,istat)
CALL hdfrdr
(bfid,"trulat1",trulat1in,istat)
CALL hdfrdr
(bfid,"trulat2",trulat2in,istat)
CALL hdfrdr
(bfid,"trulon",trulonin,istat)
CALL hdfrdr
(bfid,"sclfct",sclfctin,istat)
CALL hdfrdr
(bfid,"ctrlat",ctrlatin,istat)
CALL hdfrdr
(bfid,"ctrlon",ctrlonin,istat)
CALL hdfrdi
(bfid,"ubcflg",ubcrd,istat)
CALL hdfrdi
(bfid,"vbcflg",vbcrd,istat)
CALL hdfrdi
(bfid,"wbcflg",wbcrd,istat)
CALL hdfrdi
(bfid,"ptbcflg",ptbcrd,istat)
CALL hdfrdi
(bfid,"prbcflg",prbcrd,istat)
CALL hdfrdi
(bfid,"qvbcflg",qvbcrd,istat)
CALL hdfrdi
(bfid,"qcbcflg",qcbcrd,istat)
CALL hdfrdi
(bfid,"qrbcflg",qrbcrd,istat)
CALL hdfrdi
(bfid,"qibcflg",qibcrd,istat)
CALL hdfrdi
(bfid,"qsbcflg",qsbcrd,istat)
CALL hdfrdi
(bfid,"qhbcflg",qhbcrd,istat)
CALL hdfrdi
(bfid, 'clipxy', clipxy,istat)
IF (istat == 0 .AND. clipxy < ngbrz) THEN
WRITE (6,*) "READEXBC: ERROR, clipxy (ngbrz) in exbc file too small"
ierr = 1
GO TO 900
END IF
CALL hdfrdi
(bfid, 'clipz', clipz,istat)
IF (istat == 0 .AND. clipz > rayklow) THEN
WRITE (6,*) "READEXBC: ERROR, clipz (rayklow) in exbc file too large"
ierr = 1
GO TO 900
END IF
ELSE IF (exbcfmt == 7 .OR. exbcfmt == 8) THEN
!-----------------------------------------------------------------------
!
! NetCDF format
!
!-----------------------------------------------------------------------
IF (exbcfmt == 7) THEN
itime = 1
ELSE
itime = itime + 1
istop = NINT( (tstop-tstart)/thisdmp ) + 1
END IF
IF (itime == 1) &
CALL netopen
(TRIM(filename(1:lfname)), 'R', bfid)
CALL net_get_exbc
(bfid,nxin,nyin,nzin,itime,dxin,dyin,dzin, &
dzminin,strhoptin,zrefsfcin,dlayer1in,dlayer2in,zflatin,strhtunein, &
maprojin,sclfctin,trulat1in,trulat2in,trulonin,ctrlatin,ctrlonin, &
ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd, &
qcbcrd,qrbcrd,qibcrd,qsbcrd,qhbcrd, &
ctime,istat)
ELSE
! alternate exbc format ...
WRITE(6,'(1x,3a)') 'The supported exbc data format are ', &
'binary (exbcfmt=1), HDF4 (exbcfmt = 3). ', &
'and NetCDF (exbcfmt = 7).'
CALL arpsstop
('Exbc data format is not supported.',1)
END IF
!-----------------------------------------------------------------------
!
! Check the data file for consistent grid parameters.
!
!-----------------------------------------------------------------------
IF (exbcfmt == 1) THEN
IF (myproc == 0) WRITE (6,*) &
"READEXBC: WARNING, not checking all map projection parameters"
CALL checkgrid2d
(nx,ny,nxin,nyin, &
dx,dy,ctrlat,ctrlon, &
mapproj,trulat1,trulat2,trulon,sclfct, &
dxin,dyin,ctrlatin,ctrlonin, &
mapproj,trulat1,trulat2,trulon,sclfct,ireturn)
ELSE
CALL checkgrid3d
(nx,ny,nz,nxin,nyin,nzin, &
dx,dy,dz,dzmin,ctrlat,ctrlon, &
strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, &
mapproj,trulat1,trulat2,trulon,sclfct, &
dxin,dyin,dzin,dzminin,ctrlatin,ctrlonin, &
strhoptin,zrefsfcin,dlayer1in,dlayer2in,zflatin,strhtunein, &
maprojin,trulat1in,trulat2in,trulonin,sclfctin,ireturn)
END IF
IF (ireturn /= 0) THEN
WRITE (6,*) "READEXBC: ERROR, grid parameter mismatch"
ierr = 1
GO TO 900
END IF
!-----------------------------------------------------------------------
!
! Read in the external boundary file data
!
!-----------------------------------------------------------------------
IF (exbcfmt == 1) THEN
READ(bfid,ERR=999) u
READ(bfid,ERR=999) v
READ(bfid,ERR=999) w
READ(bfid,ERR=999) pt
READ(bfid,ERR=999) pr
IF(qvbcrd == 1) READ(bfid,ERR=999) qv
IF(qcbcrd == 1) READ(bfid,ERR=999) qc
IF(qrbcrd == 1) READ(bfid,ERR=999) qr
IF(qibcrd == 1) READ(bfid,ERR=999) qi
IF(qsbcrd == 1) READ(bfid,ERR=999) qs
IF(qhbcrd == 1) READ(bfid,ERR=999) qh
ELSE IF (exbcfmt == 3) THEN
IF (ubcrd == 1) THEN
CALL hdfrd3d
(bfid,"u",nx,ny,nz,u,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (vbcrd == 1) THEN
CALL hdfrd3d
(bfid,"v",nx,ny,nz,v,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (wbcrd == 1) THEN
CALL hdfrd3d
(bfid,"w",nx,ny,nz,w,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (ptbcrd == 1) THEN
CALL hdfrd3d
(bfid,"pt",nx,ny,nz,pt,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (prbcrd == 1) THEN
CALL hdfrd3d
(bfid,"p",nx,ny,nz,pr,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (qvbcrd == 1) THEN
CALL hdfrd3d
(bfid,"qv",nx,ny,nz,qv,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (qcbcrd == 1) THEN
CALL hdfrd3d
(bfid,"qc",nx,ny,nz,qc,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (qrbcrd == 1) THEN
CALL hdfrd3d
(bfid,"qr",nx,ny,nz,qr,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (qibcrd == 1) THEN
CALL hdfrd3d
(bfid,"qi",nx,ny,nz,qi,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (qsbcrd == 1) THEN
CALL hdfrd3d
(bfid,"qs",nx,ny,nz,qs,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
IF (qhbcrd == 1) THEN
CALL hdfrd3d
(bfid,"qh",nx,ny,nz,qh,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
ELSE IF (exbcfmt == 7 .OR. exbcfmt == 8) THEN
ALLOCATE(var3du(nx, ny-1,nz-1), STAT = istat)
ALLOCATE(var3dv(nx-1,ny, nz-1), STAT = istat)
ALLOCATE(var3dw(nx-1,ny-1,nz ), STAT = istat)
IF (ubcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"U",nx,ny-1,nz-1,var3du)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx
u(i,j,k) = var3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(u,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (vbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"V",nx-1,ny,nz-1,var3dv)
DO k = 1,nz-1
DO j = 1,ny
DO i = 1,nx-1
v(i,j,k) = var3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(v,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1)
END IF
IF (wbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"W",nx-1,ny-1,nz,var3dw)
DO k = 1,nz
DO j = 1,ny-1
DO i = 1,nx-1
w(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(w,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz)
END IF
IF (ptbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"PT",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
pt(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(pt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (prbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"P",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
pr(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(pr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (qvbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"QV",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
qv(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (qcbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"QC",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
qc(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (qrbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"QR",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
qr(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (qibcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"QI",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
qi(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qi,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (qsbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"QS",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
qs(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qs,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
IF (qhbcrd == 1) THEN
CALL netread3d
(bfid,0,itime,"QH",nx-1,ny-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
qh(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
END IF
END IF
IF(myproc == 0)THEN
write(6,'(/1x,a/)') 'Max. and Min. of EXBC data variables:'
IF (ubcrd == 1) THEN
CALL a3dmax0lcl
(u,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'umin = ', amin,', umax =',amax
END IF
IF (vbcrd == 1) THEN
CALL a3dmax0lcl
(v,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'vmin = ', amin,', vmax =',amax
END IF
IF (wbcrd == 1) THEN
CALL a3dmax0lcl
(w,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz,amax,amin)
write(6,'(1x,2(a,e13.6))') 'wmin = ', amin,', wmax =',amax
END IF
IF (ptbcrd == 1) THEN
CALL a3dmax0lcl
(pt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'ptmin= ', amin,', ptmax=',amax
END IF
IF (prbcrd == 1) THEN
CALL a3dmax0lcl
(pr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'pmin = ', amin,', pmax =',amax
END IF
IF (qvbcrd == 1) THEN
CALL a3dmax0lcl
(qv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qvmin= ', amin,', qvmax=',amax
END IF
IF (qcbcrd == 1) THEN
CALL a3dmax0lcl
(qc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qcmin= ', amin,', qcmax=',amax
END IF
IF (qrbcrd == 1) THEN
CALL a3dmax0lcl
(qr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qrmin= ', amin,', qrmax=',amax
END IF
IF (qibcrd == 1) THEN
CALL a3dmax0lcl
(qi,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qimin= ', amin,', qimax=',amax
END IF
IF (qsbcrd == 1) THEN
CALL a3dmax0lcl
(qs,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qsmin= ', amin,', qsmax=',amax
END IF
IF (qhbcrd == 1) THEN
CALL a3dmax0lcl
(qh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qhmin= ', amin,', qhmax=',amax
END IF
END IF
ierr = 0
GO TO 900
999 CONTINUE
WRITE (6,*) "READEXBC: ERROR reading data ", &
"from file ",trim(filename(1:lfname))," returning"
ierr = 2
900 CONTINUE
IF (exbcfmt == 1) THEN
CLOSE (bfid)
CALL retunit( bfid )
ELSE IF (exbcfmt == 3) THEN
CALL hdfclose
(bfid,istat)
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
! alternate dump format ...
ELSE IF (exbcfmt == 7 .OR. exbcfmt ==8 ) THEN
IF (exbcfmt == 7 .OR. itime >= istop) CALL netclose
(bfid)
DEALLOCATE(var3du,var3dv,var3dw)
END IF
RETURN
END SUBROUTINE readexbc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE READSPLITEXBC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE readsplitexbc(nx,ny,nz,filename,lfname, ctime, & 2,159
u,v,w,pt,pr,qv,qc,qr,qi,qs,qh, ierr)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in external boundary fields, and Split and scatter to MP
! processes from the root process.
!
! In general these data will come from another model.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang
! 08/30/2002
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! dx Expected x grid spacing
! dy Expected y grid spacing
! dz Expected z grid spacing
!
! ctrlat Expected center latitude
! ctrlon Expected center longitude
!
! filename File name of EXBC boundary data set.
! lfname Length of the filename
!
! OUTPUT:
!
! ctime Charater representation of the time of EXBC data
!
! ubcrd Flag indicating (1) if the u field is valid
! vbcrd Flag indicating (1) if the v field is valid
! wbcrd Flag indicating (1) if the w field is valid
! ptbcrd Flag indicating (1) if the pt field is valid
! prbcrd Flag indicating (1) if the pr field is valid
! qvbcrd Flag indicating (1) if the qv field is valid
! qcbcrd Flag indicating (1) if the qc field is valid
! qrbcrd Flag indicating (1) if the qr field is valid
! qibcrd Flag indicating (1) if the qi field is valid
! qsbcrd Flag indicating (1) if the qs field is valid
! qhbcrd Flag indicating (1) if the qh field is valid
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of Cartesian velocity (m/s)
! pt Potential temperature (K)
! pr Pressure (Pascal)
! qv Water vapor mixing ratio humidity (kg/kg)
! qc Cloud water mixing ratio humidity (kg/kg)
! qr Rain water mixing ratio humidity (kg/kg)
! qi Cloud ice mixing ratio humidity (kg/kg)
! qs Snow mixing ratio humidity (kg/kg)
! qh Hail water mixing ratio humidity (kg/kg)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
CHARACTER (LEN=* ) :: filename
INTEGER :: lfname
CHARACTER (LEN=* ) :: ctime
REAL :: u(nx,ny,nz) ! u-velocity (m/s)
REAL :: v(nx,ny,nz) ! v-velocity (m/s)
REAL :: w(nx,ny,nz) ! w-velocity (m/s)
REAL :: pt(nx,ny,nz) ! Potential temperature (K)
REAL :: pr(nx,ny,nz) ! Pressure (Pascal)
REAL :: qv(nx,ny,nz) ! Water vapor mixing ratio (kg/kg)
REAL :: qc(nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr(nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi(nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs(nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh(nx,ny,nz) ! Hail mixing ratio (kg/kg)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nxin,nyin,nzin
REAL :: ctrlatin,ctrlonin
INTEGER :: istat, ierr, idummy, old_v
REAL :: amax, amin
INTEGER :: ireturn
INTEGER :: strhoptin
REAL :: dxin,dyin,dzin,dzminin,zrefsfcin,dlayer1in, &
dlayer2in,zflatin,strhtunein
REAL :: trulat1in,trulat2in,trulonin,sclfctin
INTEGER :: maprojin
INTEGER(2), ALLOCATABLE :: itmp(:,:,:) ! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
INTEGER :: clipxy, clipz
INTEGER, SAVE :: bfid
INTEGER, SAVE :: itime
INTEGER :: istop
INTEGER :: i, j, k
INTEGER :: nxlg, nylg, nzlg
REAL, ALLOCATABLE :: var3d(:,:,:)
REAL, ALLOCATABLE :: var3du(:,:,:) ! for NetCDF I/O only
REAL, ALLOCATABLE :: var3dv(:,:,:)
REAL, ALLOCATABLE :: var3dw(:,:,:)
!
! Add the following only for HDF format, which is for
! split_hdf to work properly.
!
! fmtver??: to label each data a version.
!
CHARACTER (LEN=40) :: fmtverin,fmtverhdf410,fmtverhdf500
PARAMETER (fmtverhdf410='004.10 HDF4 Coded Data')
PARAMETER (fmtverhdf500='005.00 HDF4 Coded Data')
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'exbc.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'mp.inc' ! mpi parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
nxlg = (nx-3)*nproc_x + 3
nylg = (ny-3)*nproc_y + 3
nzlg = nz
IF (myproc == 0) THEN
IF (exbcfmt == 3) THEN
ALLOCATE (itmp(nxlg,nylg,nzlg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "READSPLITEXBC: ERROR allocating itmp, returning"
ierr = 1
RETURN
END IF
ALLOCATE (hmax(nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "READSPLITEXBC: ERROR allocating hmax, returning"
ierr = 1
RETURN
END IF
ALLOCATE (hmin(nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "READSPLITEXBC: ERROR allocating hmin, returning"
ierr = 1
RETURN
END IF
END IF
ALLOCATE(var3d(nxlg, nylg, nzlg), stat=istat)
WRITE (6,*) "READSPLITEXBC: reading in external boundary data ", &
"from file ",filename(1:lfname)
!
!-----------------------------------------------------------------------
!
! Read in header information.
!
!-----------------------------------------------------------------------
!
IF (exbcfmt == 1) THEN
!-----------------------------------------------------------------------
!
! Fortran unformatted dump.
!
!-----------------------------------------------------------------------
CALL getunit
( bfid )
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filename(1:lfname), '-F f77 -N ieee', ierr)
OPEN(bfid,FILE=filename(1:lfname),STATUS='old', &
FORM='unformatted',IOSTAT=istat)
IF ( istat /= 0 ) THEN
ierr = 1
GO TO 900
END IF
READ(bfid,ERR=999) nxin,nyin,nzin,dxin,dyin,dzin, &
ctrlatin,ctrlonin
READ(bfid,ERR=999) ctime
old_v = 0 ! In case that the EXBC files are of an earlier
! version that does not contain water and ice variables,
! set old_v to 1. Otherwise, set it to 0.
IF( old_v == 1 ) THEN
READ(bfid,ERR=999) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
qcbcrd=0
qrbcrd=0
qibcrd=0
qsbcrd=0
qhbcrd=0
ELSE
READ(bfid,ERR=999) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd, &
qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd, &
qhbcrd,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
END IF
ELSE IF (exbcfmt == 3) THEN ! HDF4 format.
CALL hdfopen
(trim(filename(1:lfname)), 1, bfid)
IF (bfid < 0) THEN
WRITE (6,*) "READSPLITEXBC: ERROR opening ", &
trim(filename(1:lfname))," for reading."
ierr = 1
GO TO 900
END IF
CALL hdfrdc
(bfid,40,"fmtver",fmtverin,istat)
! Should check fmtverin here
CALL hdfrdc
(bfid,15,"ctime",ctime,istat)
CALL hdfrdi
(bfid,"nx",nxin,istat)
CALL hdfrdi
(bfid,"ny",nyin,istat)
CALL hdfrdi
(bfid,"nz",nzin,istat)
CALL hdfrdr
(bfid,"dx",dxin,istat)
CALL hdfrdr
(bfid,"dy",dyin,istat)
CALL hdfrdr
(bfid,"dz",dzin,istat)
CALL hdfrdr
(bfid,"dzmin",dzminin,istat)
CALL hdfrdi
(bfid,"strhopt",strhoptin,istat)
CALL hdfrdr
(bfid,"zrefsfc",zrefsfcin,istat)
CALL hdfrdr
(bfid,"dlayer1",dlayer1in,istat)
CALL hdfrdr
(bfid,"dlayer2",dlayer2in,istat)
CALL hdfrdr
(bfid,"zflat",zflatin,istat)
CALL hdfrdr
(bfid,"strhtune",strhtunein,istat)
CALL hdfrdi
(bfid,"mapproj",maprojin,istat)
CALL hdfrdr
(bfid,"trulat1",trulat1in,istat)
CALL hdfrdr
(bfid,"trulat2",trulat2in,istat)
CALL hdfrdr
(bfid,"trulon",trulonin,istat)
CALL hdfrdr
(bfid,"sclfct",sclfctin,istat)
CALL hdfrdr
(bfid,"ctrlat",ctrlatin,istat)
CALL hdfrdr
(bfid,"ctrlon",ctrlonin,istat)
CALL hdfrdi
(bfid,"ubcflg",ubcrd,istat)
CALL hdfrdi
(bfid,"vbcflg",vbcrd,istat)
CALL hdfrdi
(bfid,"wbcflg",wbcrd,istat)
CALL hdfrdi
(bfid,"ptbcflg",ptbcrd,istat)
CALL hdfrdi
(bfid,"prbcflg",prbcrd,istat)
CALL hdfrdi
(bfid,"qvbcflg",qvbcrd,istat)
CALL hdfrdi
(bfid,"qcbcflg",qcbcrd,istat)
CALL hdfrdi
(bfid,"qrbcflg",qrbcrd,istat)
CALL hdfrdi
(bfid,"qibcflg",qibcrd,istat)
CALL hdfrdi
(bfid,"qsbcflg",qsbcrd,istat)
CALL hdfrdi
(bfid,"qhbcflg",qhbcrd,istat)
CALL hdfrdi
(bfid, 'clipxy', clipxy,istat)
IF (istat == 0 .AND. clipxy < ngbrz) THEN
WRITE (6,*) "READSPLITEXBC: ERROR, clipxy (ngbrz) in exbc file too small"
ierr = 1
GO TO 900
END IF
CALL hdfrdi
(bfid, 'clipz', clipz,istat)
IF (istat == 0 .AND. clipz > rayklow) THEN
WRITE (6,*) "READSPLITEXBC: ERROR, clipz (rayklow) in exbc file too large"
ierr = 1
GO TO 900
END IF
ELSE IF (exbcfmt == 7 .OR. exbcfmt == 8) THEN ! NetCDF format
IF (exbcfmt == 7) THEN
itime = 1
ELSE
itime = itime + 1
istop = NINT((tstop-tstart)/thisdmp) + 1
END IF
IF (itime == 1) CALL netopen
(TRIM(filename(1:lfname)), 'R', bfid)
CALL net_get_exbc
(bfid,nxin,nyin,nzin,itime,dxin,dyin,dzin, &
dzminin,strhoptin,zrefsfcin,dlayer1in,dlayer2in, &
zflatin,strhtunein,maprojin,sclfctin,trulat1in, &
trulat2in,trulonin,ctrlatin,ctrlonin, &
ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd, &
qcbcrd,qrbcrd,qibcrd,qsbcrd,qhbcrd, &
ctime,istat)
ELSE
! alternate exbc format ...
WRITE(6,*) 'The supported exbc data format are ', &
'binary (exbcfmt=1) and HDF4 no compressed (exbcfmt = 3).'
CALL arpsstop
('Exbc data format is not supported.',1)
END IF ! exbcfmt
nxin = (nxin-3)/nproc_x + 3
nyin = (nyin-3)/nproc_y + 3
END IF ! myproc == 0
CALL mpupdatei
(nxin, 1)
CALL mpupdatei
(nyin, 1)
CALL mpupdatei
(nzin, 1)
CALL mpupdater
(dxin, 1)
CALL mpupdater
(dyin, 1)
CALL mpupdater
(dzin, 1)
CALL mpupdater
(ctrlatin, 1)
CALL mpupdater
(ctrlonin, 1)
CALL mpupdatec
(ctime, 15)
CALL mpupdatei
(ubcrd, 1)
CALL mpupdatei
(vbcrd, 1)
CALL mpupdatei
(wbcrd, 1)
CALL mpupdatei
(ptbcrd, 1)
CALL mpupdatei
(prbcrd, 1)
CALL mpupdatei
(qvbcrd, 1)
CALL mpupdatei
(qcbcrd, 1)
CALL mpupdatei
(qrbcrd, 1)
CALL mpupdatei
(qibcrd, 1)
CALL mpupdatei
(qsbcrd, 1)
CALL mpupdatei
(qhbcrd, 1)
IF(exbcfmt == 3 .OR. exbcfmt == 7 .OR. exbcfmt == 8) THEN
CALL mpupdater
(dzminin, 1)
CALL mpupdatei
(strhoptin, 1)
CALL mpupdater
(zrefsfcin, 1)
CALL mpupdater
(dlayer1in, 1)
CALL mpupdater
(dlayer2in, 1)
CALL mpupdater
(zflatin, 1)
CALL mpupdater
(strhtunein,1)
CALL mpupdatei
(maprojin, 1)
CALL mpupdater
(trulat1in, 1)
CALL mpupdater
(trulat2in, 1)
CALL mpupdater
(trulonin, 1)
CALL mpupdater
(sclfctin, 1)
END IF
IF (exbcfmt == 3) THEN ! HDF 4 format specific
CALL mpupdatec
(fmtverin, 40)
CALL mpupdatei
(clipxy, 1)
CALL mpupdatei
(clipz, 1)
END IF
!-----------------------------------------------------------------------
!
! Check the data file for consistent grid parameters.
!
!-----------------------------------------------------------------------
IF (exbcfmt == 1) THEN
IF (myproc == 0) WRITE (6,*) &
"READSPLITEXBC: WARNING, not checking all map projection parameters"
CALL checkgrid2d
(nx,ny,nxin,nyin, &
dx,dy,ctrlat,ctrlon, &
mapproj,trulat1,trulat2,trulon,sclfct, &
dxin,dyin,ctrlatin,ctrlonin, &
mapproj,trulat1,trulat2,trulon,sclfct,ireturn)
ELSE
CALL checkgrid3d
(nx,ny,nz,nxin,nyin,nzin, &
dx,dy,dz,dzmin,ctrlat,ctrlon, &
strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, &
mapproj,trulat1,trulat2,trulon,sclfct, &
dxin,dyin,dzin,dzminin,ctrlatin,ctrlonin, &
strhoptin,zrefsfcin,dlayer1in,dlayer2in,zflatin,strhtunein, &
maprojin,trulat1in,trulat2in,trulonin,sclfctin,ireturn)
END IF
IF (ireturn /= 0) THEN
WRITE (6,*) "READSPLITEXBC: ERROR, grid parameter mismatch"
ierr = 1
GO TO 900
END IF
!-----------------------------------------------------------------------
!
! Read in the external boundary file data
!
!-----------------------------------------------------------------------
IF (exbcfmt == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,u)
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,v)
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,w)
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,pt)
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,pr)
IF(qvbcrd == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,qv)
END IF
IF(qcbcrd == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,qc)
END IF
IF(qrbcrd == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,qr)
END IF
IF(qibcrd == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,qi)
END IF
IF(qsbcrd == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,qs)
END IF
IF(qhbcrd == 1) THEN
IF (myproc == 0) READ(bfid,ERR=999) var3d
CALL mpisplit3d
(var3d, nx,ny,nz,qh)
END IF
ELSE IF (exbcfmt == 3) THEN ! HDF 4 format
IF (ubcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"u",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,u)
END IF
IF (vbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"v",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,v)
END IF
IF (wbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"w",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,w)
END IF
IF (ptbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"pt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,pt)
END IF
IF (prbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"p",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,pr)
END IF
IF (qvbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"qv",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,qv)
END IF
IF (qcbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"qc",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,qc)
END IF
IF (qrbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"qr",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,qr)
END IF
IF (qibcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"qi",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,qi)
END IF
IF (qsbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"qs",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,qs)
END IF
IF (qhbcrd == 1) THEN
IF (myproc == 0) THEN
CALL hdfrd3d
(bfid,"qh",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 999
END IF
CALL mpisplit3d
(var3d,nx, ny, nz,qh)
END IF
ELSE IF (exbcfmt == 7 .OR. exbcfmt == 8) THEN ! NetCDF format
ALLOCATE(var3du(nxlg, nylg-1,nzlg-1), STAT = istat)
ALLOCATE(var3dv(nxlg-1,nylg, nzlg-1), STAT = istat)
ALLOCATE(var3dw(nxlg-1,nylg-1,nzlg), STAT = istat)
IF (ubcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"U",nxlg,nylg-1,nz-1,var3du)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3d(i,j,k) = var3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, u)
END IF
IF (vbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"V",nxlg-1,nylg,nzlg-1,var3dv)
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3d(i,j,k) = var3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, v)
END IF
IF (wbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"W",nxlg-1,nylg-1,nzlg,var3dw)
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, w)
END IF
IF (ptbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"PT",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, pt)
END IF
IF (prbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"P",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, pr)
END IF
IF (qvbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"QV",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, qv)
END IF
IF (qcbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"QC",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, qc)
END IF
IF (qrbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"QR",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, qr)
END IF
IF (qibcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"QI",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, qi)
END IF
IF (qsbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"QS",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, qs)
END IF
IF (qhbcrd == 1) THEN
IF (myproc == 0) THEN
CALL netread3d
(bfid,0,itime,"QH",nxlg-1,nylg-1,nz-1,var3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = var3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d, nx, ny, nz, qh)
END IF
END IF
IF(myproc == 0)THEN
write(6,'(/1x,a/)') 'Max. and Min. of EXBC data variables:'
IF (ubcrd == 1) THEN
CALL a3dmax0lcl
(u,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'umin = ', amin,', umax =',amax
END IF
IF (vbcrd == 1) THEN
CALL a3dmax0lcl
(v,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'vmin = ', amin,', vmax =',amax
END IF
IF (wbcrd == 1) THEN
CALL a3dmax0lcl
(w,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz,amax,amin)
write(6,'(1x,2(a,e13.6))') 'wmin = ', amin,', wmax =',amax
END IF
IF (ptbcrd == 1) THEN
CALL a3dmax0lcl
(pt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'ptmin= ', amin,', ptmax=',amax
END IF
IF (prbcrd == 1) THEN
CALL a3dmax0lcl
(pr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'pmin = ', amin,', pmax =',amax
END IF
IF (qvbcrd == 1) THEN
CALL a3dmax0lcl
(qv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qvmin= ', amin,', qvmax=',amax
END IF
IF (qcbcrd == 1) THEN
CALL a3dmax0lcl
(qc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qcmin= ', amin,', qcmax=',amax
END IF
IF (qrbcrd == 1) THEN
CALL a3dmax0lcl
(qr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qrmin= ', amin,', qrmax=',amax
END IF
IF (qibcrd == 1) THEN
CALL a3dmax0lcl
(qi,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qimin= ', amin,', qimax=',amax
END IF
IF (qsbcrd == 1) THEN
CALL a3dmax0lcl
(qs,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qsmin= ', amin,', qsmax=',amax
END IF
IF (qhbcrd == 1) THEN
CALL a3dmax0lcl
(qh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
write(6,'(1x,2(a,e13.6))') 'qhmin= ', amin,', qhmax=',amax
END IF
END IF
ierr = 0
GO TO 900
999 CONTINUE
WRITE (6,*) "READSPLITEXBC: ERROR reading data ", &
"from file ",trim(filename(1:lfname))," returning"
ierr = 2
900 CONTINUE
IF (myproc == 0) THEN
IF (exbcfmt == 1) THEN
CLOSE (bfid)
CALL retunit( bfid )
ELSE IF (exbcfmt == 3) THEN
CALL hdfclose
(bfid,istat)
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
ELSE IF (exbcfmt == 7 .OR. exbcfmt == 8) THEN
IF (exbcfmt == 7 .OR. itime >= istop) CALL netclose
(bfid)
DEALLOCATE (var3du)
DEALLOCATE (var3dv)
DEALLOCATE (var3dw)
END IF
DEALLOCATE(var3d, stat=istat)
END IF ! myproc == 0
CALL mpupdatei
(ierr,1)
RETURN
END SUBROUTINE readsplitexbc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GETBCFN ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE getbcfn( abstsec, exbcnam, tinite, tintve, filename, lfname, & 3,3
istat )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Get the external boundary data file name.
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/1994
!
! MODIFICATION HISTORY:
!
! 2000/03/24 (Gene Basett)
! Added HDF4 format dumps.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! abstsec Absolute seconds from 00:00:00, Jan. 1, 1980
! exbcnam A prefix of the external boundary condition file.
!
! tinite The boundary forecast initial time in yydddhhmm, In
! general, the boundary files are named in yydddhhmm.
! tintve EXBC forecast time interval in seconds
!
! OUTPUT:
!
! filename File name of EXBC boundary data set.
! lfname Length of the filename
!
! istat Status of finding the file.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations and COMMON blocks.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: abstsec
CHARACTER (LEN=* ) :: filename
INTEGER :: lfname
CHARACTER (LEN=* ) :: exbcnam
CHARACTER (LEN=* ) :: tinite
INTEGER :: tintve
INTEGER :: lenstr,istat
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=15) :: ctime
CHARACTER (LEN=1) :: chr
INTEGER :: abstsec1
INTEGER :: bcfcst, bcfcstop
INTEGER :: iyr, imon, idy, ihr, imin, isec
INTEGER, PARAMETER :: maxtry = 10
LOGICAL :: iexist
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
INCLUDE 'globcst.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
READ (tinite,'(i4,a,i2,a,i2,a,i2,a,i2,a,i2)') &
iyr,chr,imon,chr,idy,chr,ihr,chr,imin,chr,isec
CALL ctim2abss
( iyr,imon,idy,ihr,imin,isec, abstsec1 )
bcfcstop = abststop + maxtry * tintve
bcfcst = abstsec - MOD( abstsec-abstsec1, tintve )
IF ( abstsec < abstsec1 ) bcfcst = bcfcst - tintve
100 CONTINUE
bcfcst = bcfcst + tintve
IF ( bcfcst == abstsec .OR. bcfcst < abstsec1 ) GO TO 100
CALL abss2ctim
( bcfcst, iyr, imon, idy, ihr, imin, isec )
WRITE (ctime,'(i4.4,2i2.2,a,3i2.2)') iyr,imon,idy,'.',ihr,imin,isec
lenstr = 80
CALL strlnth
( exbcnam, lenstr )
lfname = lenstr + 16
filename(1:lfname) = exbcnam(1:lenstr)//'.'//ctime
IF (mp_opt > 0 .AND. readsplit /= 1) THEN
WRITE(filename,'(a,a,a,a,2i2.2)') &
exbcnam(1:lenstr),'.',ctime,'_',loc_x,loc_y
lfname = lfname + 5
END IF
INQUIRE(FILE=filename(1:lfname),EXIST=iexist)
IF ( iexist ) THEN
istat = 0
IF (myproc == 0) WRITE (6,'(a,a)') &
'External boundary data file has been found: ', filename(1:lfname)
ELSE IF ( bcfcst <= bcfcstop ) THEN
IF (myproc == 0) WRITE (6,'(a,a,a)') &
'External BC data file ', filename(1:lfname), &
' could not be found. Try another time.'
GO TO 100
ELSE
IF (myproc == 0) WRITE (6,'(a,a)') &
'No external BC data file could not be found within a time range' &
,'Job will stop.'
istat = 1
END IF
RETURN
END SUBROUTINE getbcfn
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE WRITEXBC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE writexbc(nx,ny,nz,filename,lfname,ctime, & 2,82
ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp, &
qvbcdmp,qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp,qhbcdmp, &
u,v,w,pt,pr,qv,qc,qr,qi,qs,qh)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Output 6 primary fields for use as external boundary conditions.
! In general these data come from another model.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! May, 1994
!
! MODIFICATION HISTORY:
!
! 5/26/94 (Yuhe Liu)
! Merged into the part of ARPS for external boundary conditions.
!
! 2000/03/24 (Gene Basett)
! Added HDF4 format dumps.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! filename File name of EXBC boundary data set.
! lfname Length of the filename
!
! ctime Charater representation of the time of the EXBC data
!
! dx Expected x grid spacing
! dy Expected y grid spacing
! dz Expected z grid spacing
!
! ctrlat Expected center latitude
! ctrlon Expected center longitude
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of Cartesian velocity (m/s)
! pt Potential temperature (K)
! pr Pressure (Pascal)
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio humidity (kg/kg)
! qr Rain water mixing ratio humidity (kg/kg)
! qi Cloud ice mixing ratio humidity (kg/kg)
! qs Snow mixing ratio humidity (kg/kg)
! qh Hail water mixing ratio humidity (kg/kg)
!
! OUTPUT:
!
! none
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
CHARACTER (LEN=*) :: filename
CHARACTER (LEN=*) :: ctime
INTEGER :: lfname
INTEGER :: ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp
INTEGER :: qvbcdmp,qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp,qhbcdmp
REAL :: u(nx,ny,nz) ! u-velocity (m/s)
REAL :: v(nx,ny,nz) ! v-velocity (m/s)
REAL :: w(nx,ny,nz) ! w-velocity (m/s)
REAL :: pt(nx,ny,nz) ! Potential temperature (K)
REAL :: pr(nx,ny,nz) ! Pressure (Pascal)
REAL :: qv(nx,ny,nz) ! Specific humidity (kg/kg)
REAL :: qc(nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr(nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi(nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs(nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh(nx,ny,nz) ! Hail mixing ratio (kg/kg)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
INTEGER :: istat, ierr, idummy
INTEGER :: i,j,k
INTEGER :: exbccompr
INTEGER(2), ALLOCATABLE :: itmp(:,:,:) ! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
REAL, ALLOCATABLE :: ctmp(:,:,:) ! Temporary array
REAL, ALLOCATABLE :: var3du(:,:,:)
REAL, ALLOCATABLE :: var3dv(:,:,:)
REAL, ALLOCATABLE :: var3dw(:,:,:)
INTEGER, SAVE :: itime = 0
INTEGER, SAVE :: bfid
INTEGER :: istop
!
! Add the following only for HDF formate which is for
! split_hdf to work properly.
!
! fmtver??: to label each data a version.
!
CHARACTER (LEN=40) :: fmtver,fmtverhdf410,fmtverhdf500
PARAMETER (fmtverhdf410='004.10 HDF4 Coded Data')
PARAMETER (fmtverhdf500='005.00 HDF4 Coded Data')
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'exbc.inc'
INCLUDE 'mp.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (exbcdmp == 0) RETURN
IF (exbcdmp == 3) exbccompr = exbchdfcompr
IF (exbcdmp == 3 .AND. exbccompr > 3) THEN
ALLOCATE (itmp(nx,ny,nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:itmp")
ALLOCATE (hmax(nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:hmax")
ALLOCATE (hmin(nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:hmin")
ALLOCATE (ctmp(nx,ny,nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:ctmp")
END IF
IF (myproc == 0) WRITE (6,'(1x,/,2a,/)') &
'WRITEXBC: Opening external boundary file ',TRIM(filename(1:lfname))
!-----------------------------------------------------------------------
!
! Write out in Fortran unformatted.
!
!-----------------------------------------------------------------------
IF (exbcdmp == 1) THEN
CALL getunit
( bfid )
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filename(1:lfname), '-F f77 -N ieee', ierr)
OPEN (bfid,FILE=trim(filename(1:lfname)),STATUS='unknown', &
FORM='unformatted')
!
!-----------------------------------------------------------------------
!
! Write grid and time descriptors
!
!-----------------------------------------------------------------------
!
WRITE (bfid) nx,ny,nz,dx,dy,dz,ctrlat,ctrlon
WRITE (bfid) ctime
!
!-----------------------------------------------------------------------
!
! Write integers which indicate whether each of the
! variables are valid. These must be properly set
! by the calling routine.
!
!-----------------------------------------------------------------------
!
idummy = 0
WRITE (bfid) ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp, &
qvbcdmp,qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp, &
qhbcdmp,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
!
!-----------------------------------------------------------------------
!
! Write each variable in a separate record
!
!-----------------------------------------------------------------------
!
IF( ubcdmp == 1) WRITE (bfid) u
IF( vbcdmp == 1) WRITE (bfid) v
IF( wbcdmp == 1) WRITE (bfid) w
IF(ptbcdmp == 1) WRITE (bfid) pt
IF(prbcdmp == 1) WRITE (bfid) pr
IF(qvbcdmp == 1) WRITE (bfid) qv
IF(qcbcdmp == 1) WRITE (bfid) qc
IF(qrbcdmp == 1) WRITE (bfid) qr
IF(qibcdmp == 1) WRITE (bfid) qi
IF(qsbcdmp == 1) WRITE (bfid) qs
IF(qhbcdmp == 1) WRITE (bfid) qh
CLOSE (bfid)
CALL retunit( bfid )
ELSE IF (exbcdmp == 3) THEN
!-----------------------------------------------------------------------
!
! Write out in HDF4.
!
!-----------------------------------------------------------------------
CALL hdfopen
(trim(filename(1:lfname)), 2, bfid)
IF (bfid < 0) THEN
WRITE (6,*) "WRITEXBC: ERROR creating HDF4 file: ", &
trim(filename(1:lfname))
CALL arpsstop
('Error on creating HDF4 file.',1)
END IF
fmtver = fmtverhdf500 ! for the time being, only version 5.00
CALL hdfwrtc
(bfid, 40, 'fmtver', fmtver, istat)
CALL hdfwrtc
(bfid, 15, 'ctime', ctime, istat)
CALL hdfwrti
(bfid, 'nx', nx, istat)
CALL hdfwrti
(bfid, 'ny', ny, istat)
CALL hdfwrti
(bfid, 'nz', nz, istat)
CALL hdfwrtr
(bfid, 'dx', dx, istat)
CALL hdfwrtr
(bfid, 'dy', dy, istat)
CALL hdfwrtr
(bfid, 'dz', dz, istat)
CALL hdfwrtr
(bfid, 'dzmin', dzmin, istat)
CALL hdfwrti
(bfid, 'strhopt', strhopt, istat)
CALL hdfwrtr
(bfid, 'zrefsfc', zrefsfc, istat)
CALL hdfwrtr
(bfid, 'dlayer1', dlayer1, istat)
CALL hdfwrtr
(bfid, 'dlayer2', dlayer2, istat)
CALL hdfwrtr
(bfid, 'zflat', zflat, istat)
CALL hdfwrtr
(bfid, 'strhtune', strhtune, istat)
CALL hdfwrti
(bfid, 'mapproj', mapproj, istat)
CALL hdfwrtr
(bfid, 'trulat1', trulat1, istat)
CALL hdfwrtr
(bfid, 'trulat2', trulat2, istat)
CALL hdfwrtr
(bfid, 'trulon', trulon, istat)
CALL hdfwrtr
(bfid, 'sclfct', sclfct, istat)
CALL hdfwrtr
(bfid, 'ctrlat', ctrlat, istat)
CALL hdfwrtr
(bfid, 'ctrlon', ctrlon, istat)
CALL hdfwrti
(bfid,"ubcflg",ubcdmp,istat)
CALL hdfwrti
(bfid,"vbcflg",vbcdmp,istat)
CALL hdfwrti
(bfid,"wbcflg",wbcdmp,istat)
CALL hdfwrti
(bfid,"ptbcflg",ptbcdmp,istat)
CALL hdfwrti
(bfid,"prbcflg",prbcdmp,istat)
CALL hdfwrti
(bfid,"qvbcflg",qvbcdmp,istat)
CALL hdfwrti
(bfid,"qcbcflg",qcbcdmp,istat)
CALL hdfwrti
(bfid,"qrbcflg",qrbcdmp,istat)
CALL hdfwrti
(bfid,"qibcflg",qibcdmp,istat)
CALL hdfwrti
(bfid,"qsbcflg",qsbcdmp,istat)
CALL hdfwrti
(bfid,"qhbcflg",qhbcdmp,istat)
IF (exbccompr > 4) THEN
CALL hdfwrti
(bfid, 'clipxy', ngbrz, istat)
CALL hdfwrti
(bfid, 'clipz', rayklow, istat)
END IF
IF( ubcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = u(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=2+ngbrz,nx-2-ngbrz
ctmp(i,j,k) = u(2,2,k) ! just need some value with max/min
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'u','u-velocity','m/s',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(u,nx,ny,nz,bfid,1,exbccompr, &
'u','u-velocity','m/s',itmp,hmax,hmin)
END IF
END IF
IF( vbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = v(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=2+ngbrz,ny-2-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = v(2,2,k) ! just need some value with max/min
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'v','v-velocity','m/s',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(v,nx,ny,nz,bfid,1,exbccompr, &
'v','v-velocity','m/s',itmp,hmax,hmin)
END IF
END IF
IF( wbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = w(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-2
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = w(2,2,k) ! just need some value with max/min
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'w','w-velocity','m/s',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(w,nx,ny,nz,bfid,1,exbccompr, &
'w','w-velocity','m/s',itmp,hmax,hmin)
END IF
END IF
IF(ptbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = pt(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = pt(2,2,k) ! just need some value with max/min
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'pt','Potential temperature','K',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(pt,nx,ny,nz,bfid,1,exbccompr, &
'pt','Potential temperature','K',itmp,hmax,hmin)
END IF
END IF
IF(prbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = pr(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = pr(2,2,k) ! just need some value with max/min
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'p','Pressure','Pascal',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(pr,nx,ny,nz,bfid,1,exbccompr, &
'p','Pressure','Pascal',itmp,hmax,hmin)
END IF
END IF
IF(qvbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = qv(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'qv','Water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(qv,nx,ny,nz,bfid,1,exbccompr, &
'qv','Water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
IF(qcbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = qc(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'qc','Cloud water mixing ratio','kg/kg',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(qc,nx,ny,nz,bfid,1,exbccompr, &
'qc','Cloud water mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
IF(qrbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = qr(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'qr','Rain water mixing ratio','kg/kg',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(qr,nx,ny,nz,bfid,1,exbccompr, &
'qr','Rain water mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
IF(qibcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = qi(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'qi','Cloud ice mixing ratio','kg/kg',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(qi,nx,ny,nz,bfid,1,exbccompr, &
'qi','Cloud ice mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
IF(qsbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = qs(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'qs','Snow mixing ratio','kg/kg',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(qs,nx,ny,nz,bfid,1,exbccompr, &
'qs','Snow mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
IF(qhbcdmp == 1) THEN
IF (exbccompr > 4) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
ctmp(i,j,k) = qh(i,j,k)
END DO
END DO
END DO
! reset values inside region not used by LBC forcing
DO k=1,rayklow-1
DO j=1+ngbrz,ny-1-ngbrz
DO i=1+ngbrz,nx-1-ngbrz
ctmp(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(ctmp,nx,ny,nz,bfid,1,exbccompr, &
'qh','Hail mixing ratio','kg/kg',itmp,hmax,hmin)
ELSE
CALL hdfwrt3d
(qh,nx,ny,nz,bfid,1,exbccompr, &
'qh','Hail mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
CALL hdfclose
(bfid,istat)
IF (exbccompr > 3) THEN
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
DEALLOCATE (ctmp,stat=istat)
END IF
ELSE IF (exbcdmp == 7 .OR. exbcdmp == 8) THEN
!
!-----------------------------------------------------------------------
!
! Write out in NetCDF format.
!
!-----------------------------------------------------------------------
IF (exbcdmp == 7) THEN
itime = 1
ELSE
itime = itime + 1
istop = NINT((tstop-tstart)/thisdmp) + 1
END IF
IF (itime == 1) THEN
!-----------------------------------------------------------------------
!
! Define ARPS boundary file dimension and variables
!
!-----------------------------------------------------------------------
CALL netopen
(TRIM(filename(1:lfname)), 'C', bfid)
CALL net_define_exbc
(bfid,nx,ny,nz,itime,dx,dy,dz, &
dzmin,strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, &
mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, &
ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp,qvbcdmp, &
qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp,qhbcdmp,ctime,istat)
END IF
ALLOCATE(var3du(nx, ny-1,nz-1), STAT = istat)
ALLOCATE(var3dv(nx-1,ny, nz-1), STAT = istat)
ALLOCATE(var3dw(nx-1,ny-1,nz ), STAT = istat)
IF( ubcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx
var3du(i,j,k) = u(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'U',var3du,nx,ny-1,nz-1)
END IF
IF( vbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny
DO i = 1,nx-1
var3dv(i,j,k) = v(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'V',var3dv,nx-1,ny,nz-1)
END IF
IF( wbcdmp == 1) THEN
DO k = 1,nz
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = w(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'W',var3dw,nx-1,ny-1,nz)
END IF
IF(ptbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = pt(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'PT',var3dw,nx-1,ny-1,nz-1)
END IF
IF(prbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = pr(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'P',var3dw,nx-1,ny-1,nz-1)
END IF
IF(qvbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = qv(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QV',var3dw,nx-1,ny-1,nz-1)
END IF
IF(qcbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = qc(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QC',var3dw,nx-1,ny-1,nz-1)
END IF
IF(qrbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = qr(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QR',var3dw,nx-1,ny-1,nz-1)
END IF
IF(qibcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = qi(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QI',var3dw,nx-1,ny-1,nz-1)
END IF
IF(qsbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = qs(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QS',var3dw,nx-1,ny-1,nz-1)
END IF
IF(qhbcdmp == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = qh(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QH',var3dw,nx-1,ny-1,nz-1)
END IF
IF (exbcdmp == 7 .OR. itime >= istop) &
CALL netclose
(bfid)
DEALLOCATE(var3du,var3dv,var3dw)
ELSE
! alternate dump format ...
WRITE(6,'(1x,3a)') 'The supported exbc data dump format are ', &
'binary (exbcdmp = 1), HDF4 (exbcdmp = 3) and ', &
'NetCDF format (exbcdmp = 7).'
CALL arpsstop
('EXBC data dump format is not supported.',1)
END IF
RETURN
END SUBROUTINE writexbc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE WRITEJOINEXBC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE writejoinexbc(nx,ny,nz,filename,lfname,ctime, & 1,104
ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp, &
qvbcdmp,qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp,qhbcdmp,&
u,v,w,pt,pr,qv,qc,qr,qi,qs,qh)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Output 6 primary fields for use as external boundary conditions.
! In general these data come from another model.
!
! NOTE:
! Rewrote from Kevin Thomas' joined subroutine writexbc. Maintain
! two separate subroutines will keep each subroutine short and
! managable.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (03/31/2005)
! Based on subroutine writexbc by Keith Browster and the upgraded
! version of writexbc by Kevin Thomas.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! filename File name of EXBC boundary data set.
! lfname Length of the filename
!
! ctime Charater representation of the time of the EXBC data
!
! dx Expected x grid spacing
! dy Expected y grid spacing
! dz Expected z grid spacing
!
! ctrlat Expected center latitude
! ctrlon Expected center longitude
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of Cartesian velocity (m/s)
! pt Potential temperature (K)
! pr Pressure (Pascal)
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio humidity (kg/kg)
! qr Rain water mixing ratio humidity (kg/kg)
! qi Cloud ice mixing ratio humidity (kg/kg)
! qs Snow mixing ratio humidity (kg/kg)
! qh Hail water mixing ratio humidity (kg/kg)
!
! OUTPUT:
!
! none
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
CHARACTER(LEN=256), INTENT(IN) :: filename
CHARACTER(LEN=15 ), INTENT(IN) :: ctime
INTEGER, INTENT(IN) :: nx,ny,nz
INTEGER, INTENT(IN) :: lfname
INTEGER, INTENT(IN) :: ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp
INTEGER, INTENT(IN) :: qvbcdmp,qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp,qhbcdmp
REAL, INTENT(IN) :: u(nx,ny,nz) ! u-velocity (m/s)
REAL, INTENT(IN) :: v(nx,ny,nz) ! v-velocity (m/s)
REAL, INTENT(IN) :: w(nx,ny,nz) ! w-velocity (m/s)
REAL, INTENT(IN) :: pt(nx,ny,nz) ! Potential temperature (K)
REAL, INTENT(IN) :: pr(nx,ny,nz) ! Pressure (Pascal)
REAL, INTENT(IN) :: qv(nx,ny,nz) ! Specific humidity (kg/kg)
REAL, INTENT(IN) :: qc(nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL, INTENT(IN) :: qr(nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL, INTENT(IN) :: qi(nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL, INTENT(IN) :: qs(nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL, INTENT(IN) :: qh(nx,ny,nz) ! Hail mixing ratio (kg/kg)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
INTEGER :: istat, ierr, idummy
INTEGER :: i,j,k
INTEGER :: nxlg, nylg
REAL :: tmp_val
INTEGER :: exbccompr
INTEGER(2), ALLOCATABLE :: itmp(:,:,:) ! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
INTEGER, SAVE :: bfid
INTEGER, SAVE :: itime
INTEGER :: istop
REAL, ALLOCATABLE :: out3d(:,:,:)
REAL, ALLOCATABLE :: var3du(:,:,:)
REAL, ALLOCATABLE :: var3dv(:,:,:)
REAL, ALLOCATABLE :: var3dw(:,:,:)
!
! Add the following only for HDF formate which is for
! split_hdf to work properly.
!
! fmtver??: to label each data a version.
!
CHARACTER (LEN=40) :: fmtver,fmtverhdf410,fmtverhdf500
PARAMETER (fmtverhdf410='004.10 HDF4 Coded Data')
PARAMETER (fmtverhdf500='005.00 HDF4 Coded Data')
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'exbc.inc'
INCLUDE 'mp.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (exbcdmp == 0) RETURN
nxlg = (nx-3) * nproc_x + 3
nylg = (ny-3) * nproc_y + 3
ALLOCATE(out3d(nxlg,nylg,nz), STAT = istat)
CALL check_alloc_status
(istat,"WRITEXBC:out3d")
IF (exbcdmp == 3) exbccompr = exbchdfcompr
IF (exbcdmp == 3 .AND. exbccompr > 3) THEN
ALLOCATE (itmp(nxlg,nylg,nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:itmp")
ALLOCATE (hmax(nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:hmax")
ALLOCATE (hmin(nz),stat=istat)
CALL check_alloc_status
(istat, "WRITEXBC:hmin")
END IF
IF (myproc == 0) WRITE (6,*) &
'WRITEJOINEXBC: Opening external boundary file ', &
trim(filename(1:lfname))
!-----------------------------------------------------------------------
!
! Write out in Fortran unformatted.
!
!-----------------------------------------------------------------------
IF (exbcdmp == 1) THEN
IF (myproc == 0) THEN
CALL getunit
( bfid )
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filename(1:lfname), '-F f77 -N ieee', ierr)
OPEN (bfid,FILE=trim(filename(1:lfname)),STATUS='unknown', &
FORM='unformatted')
!
!-----------------------------------------------------------------------
!
! Write grid and time descriptors
!
!-----------------------------------------------------------------------
!
WRITE (bfid) nxlg,nylg,nz,dx,dy,dz,ctrlat,ctrlon
WRITE (bfid) ctime
!
!-----------------------------------------------------------------------
!
! Write integers which indicate whether each of the
! variables are valid. These must be properly set
! by the calling routine.
!
!-----------------------------------------------------------------------
!
idummy = 0
WRITE (bfid) ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp, &
qvbcdmp,qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp, &
qhbcdmp,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
END IF
!
!-----------------------------------------------------------------------
!
! Write each variable in a separate record
!
!-----------------------------------------------------------------------
!
IF ( ubcdmp == 1 ) THEN
CALL mpimerge3d
(u,nx,ny,nz,out3d)
IF (myproc == 0) WRITE (bfid) out3d
END IF
IF ( vbcdmp == 1 ) THEN
CALL mpimerge3d
(v,nx,ny,nz,out3d)
IF (myproc == 0) WRITE (bfid) out3d
END IF
IF ( wbcdmp == 1 ) THEN
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( ptbcdmp == 1 ) THEN
CALL mpimerge3d
(pt,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( prbcdmp == 1 ) THEN
CALL mpimerge3d
(pr,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( qvbcdmp == 1 ) THEN
CALL mpimerge3d
(qv,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( qcbcdmp == 1 ) THEN
CALL mpimerge3d
(qc,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( qrbcdmp == 1 ) THEN
CALL mpimerge3d
(qr,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( qibcdmp == 1 ) THEN
CALL mpimerge3d
(qi,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( qsbcdmp == 1 ) THEN
CALL mpimerge3d
(qs,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF ( qhbcdmp == 1 ) THEN
CALL mpimerge3d
(qh,nx,ny,nz,out3d)
IF ( myproc == 0 ) WRITE (bfid) out3d
END IF
IF(myproc == 0) THEN
CLOSE (bfid)
CALL retunit( bfid )
END IF
ELSE IF (exbcdmp == 3) THEN
!-----------------------------------------------------------------------
!
! Write out in HDF4.
!
!-----------------------------------------------------------------------
IF ( myproc == 0 ) THEN
CALL hdfopen
(trim(filename(1:lfname)), 2, bfid)
IF (bfid < 0) THEN
WRITE (6,*) "WRITEXBC: ERROR creating HDF4 file: ", &
trim(filename(1:lfname))
CALL arpsstop
('Error on creating HDF4 file in writejoinexbc.',1)
END IF
fmtver = fmtverhdf500 ! for the time being, only version 5.00
CALL hdfwrtc
(bfid, 40, 'fmtver', fmtver, istat)
CALL hdfwrtc
(bfid, 15, 'ctime', ctime, istat)
CALL hdfwrti
(bfid, 'nx', nxlg, istat)
CALL hdfwrti
(bfid, 'ny', nylg, istat)
CALL hdfwrti
(bfid, 'nz', nz, istat)
CALL hdfwrtr
(bfid, 'dx', dx, istat)
CALL hdfwrtr
(bfid, 'dy', dy, istat)
CALL hdfwrtr
(bfid, 'dz', dz, istat)
CALL hdfwrtr
(bfid, 'dzmin', dzmin, istat)
CALL hdfwrti
(bfid, 'strhopt', strhopt, istat)
CALL hdfwrtr
(bfid, 'zrefsfc', zrefsfc, istat)
CALL hdfwrtr
(bfid, 'dlayer1', dlayer1, istat)
CALL hdfwrtr
(bfid, 'dlayer2', dlayer2, istat)
CALL hdfwrtr
(bfid, 'zflat', zflat, istat)
CALL hdfwrtr
(bfid, 'strhtune', strhtune, istat)
CALL hdfwrti
(bfid, 'mapproj', mapproj, istat)
CALL hdfwrtr
(bfid, 'trulat1', trulat1, istat)
CALL hdfwrtr
(bfid, 'trulat2', trulat2, istat)
CALL hdfwrtr
(bfid, 'trulon', trulon, istat)
CALL hdfwrtr
(bfid, 'sclfct', sclfct, istat)
CALL hdfwrtr
(bfid, 'ctrlat', ctrlat, istat)
CALL hdfwrtr
(bfid, 'ctrlon', ctrlon, istat)
CALL hdfwrti
(bfid,"ubcflg", ubcdmp, istat)
CALL hdfwrti
(bfid,"vbcflg", vbcdmp, istat)
CALL hdfwrti
(bfid,"wbcflg", wbcdmp, istat)
CALL hdfwrti
(bfid,"ptbcflg",ptbcdmp,istat)
CALL hdfwrti
(bfid,"prbcflg",prbcdmp,istat)
CALL hdfwrti
(bfid,"qvbcflg",qvbcdmp,istat)
CALL hdfwrti
(bfid,"qcbcflg",qcbcdmp,istat)
CALL hdfwrti
(bfid,"qrbcflg",qrbcdmp,istat)
CALL hdfwrti
(bfid,"qibcflg",qibcdmp,istat)
CALL hdfwrti
(bfid,"qsbcflg",qsbcdmp,istat)
CALL hdfwrti
(bfid,"qhbcflg",qhbcdmp,istat)
IF (exbccompr > 4) THEN
CALL hdfwrti
(bfid, 'clipxy', ngbrz, istat)
CALL hdfwrti
(bfid, 'clipz', rayklow, istat)
END IF
END IF
IF( ubcdmp == 1) THEN
CALL mpimerge3d
(u,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
tmp_val = out3d(2,2,k)
DO j = 1+ngbrz, nylg-1-ngbrz
DO i = 2+ngbrz, nxlg-2-ngbrz
out3d(i,j,k) = tmp_val ! just need some value with max/min
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'u','u-velocity','m/s',itmp,hmax,hmin)
END IF ! myproc == 0
END IF
IF( vbcdmp == 1) THEN
CALL mpimerge3d
(v,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
tmp_val = out3d(2,2,k)
DO j= 2+ngbrz, nylg-2-ngbrz
DO i= 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = tmp_val ! just need some value with max/min
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'v','v-velocity','m/s',itmp,hmax,hmin)
END IF
END IF
IF( wbcdmp == 1) THEN
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-2
tmp_val = out3d(2,2,k)
DO j = 1+ngbrz, nylg-1-ngbrz
DO i = 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = tmp_val ! just need some value with max/min
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'w','w-velocity','m/s',itmp,hmax,hmin)
END IF
END IF
IF(ptbcdmp == 1) THEN
CALL mpimerge3d
(pt,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
tmp_val = out3d(2,2,k)
DO j = 1+ngbrz, nylg-1-ngbrz
DO i = 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = tmp_val ! just need some value with max/min
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'pt','Potential temperature','K',itmp,hmax,hmin)
END IF
END IF
IF(prbcdmp == 1) THEN
CALL mpimerge3d
(pr,nx,ny,nz,out3d)
IF (myproc == 0) THEN
IF (exbccompr > 4) THEN !
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
tmp_val = out3d(2,2,k)
DO j = 1+ngbrz, nylg-1-ngbrz
DO i = 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = tmp_val ! just need some value with max/min
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'p','Pressure','Pascal',itmp,hmax,hmin)
END IF
END IF
IF(qvbcdmp == 1) THEN
CALL mpimerge3d
(qv,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
DO j = 1+ngbrz, nylg-1-ngbrz
DO i = 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = 0.0
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'qv','Water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
IF(qcbcdmp == 1) THEN
CALL mpimerge3d
(qc,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
DO j=1+ngbrz,nylg-1-ngbrz
DO i=1+ngbrz,nxlg-1-ngbrz
out3d(i,j,k) = 0.0
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'qc','Cloud water mixing ratio','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
IF(qrbcdmp == 1) THEN
CALL mpimerge3d
(qr,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
DO j= 1+ngbrz, nylg-1-ngbrz
DO i= 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = 0.0
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'qr','Rain water mixing ratio','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
IF(qibcdmp == 1) THEN
CALL mpimerge3d
(qi,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
DO j= 1+ngbrz, nylg-1-ngbrz
DO i= 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = 0.0
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'qi','Cloud ice mixing ratio','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
IF(qsbcdmp == 1) THEN
CALL mpimerge3d
(qs,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
DO j= 1+ngbrz, nylg-1-ngbrz
DO i= 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = 0.0
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'qs','Snow mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
IF(qhbcdmp == 1) THEN
CALL mpimerge3d
(qh,nx,ny,nz,out3d)
IF (myproc == 0 ) THEN
IF (exbccompr > 4) THEN
!
! reset values inside region not used by LBC forcing
!
DO k=1,rayklow-1
DO j= 1+ngbrz, nylg-1-ngbrz
DO i= 1+ngbrz, nxlg-1-ngbrz
out3d(i,j,k) = 0.0
END DO
END DO
END DO
END IF
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,bfid,1,exbccompr, &
'qh','Hail mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF
IF(myproc == 0) CALL hdfclose
(bfid,istat)
IF (exbccompr > 3) THEN
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
END IF
ELSE IF (exbcdmp == 7 .OR. exbcdmp == 8) THEN
!-----------------------------------------------------------------------
!
! Write out in NetCDF format.
!
!-----------------------------------------------------------------------
IF (exbcdmp == 7) THEN
itime = 1
ELSE
itime = itime + 1
istop = NINT((tstop-tstart)/thisdmp) + 1
END IF
IF (myproc == 0 .AND. itime == 1) THEN
!-----------------------------------------------------------------------
!
! Define ARPS boundary file dimension and variables
!
!-----------------------------------------------------------------------
CALL netopen
(TRIM(filename(1:lfname)), 'C', bfid)
CALL net_define_exbc
(bfid,nxlg,nylg,nz,itime,dx,dy,dz, &
dzmin,strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, &
mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, &
ubcdmp,vbcdmp,wbcdmp,ptbcdmp,prbcdmp,qvbcdmp, &
qcbcdmp,qrbcdmp,qibcdmp,qsbcdmp,qhbcdmp,ctime,istat)
END IF
ALLOCATE(var3du(nxlg, nylg-1,nz-1), STAT = istat)
ALLOCATE(var3dv(nxlg-1,nylg, nz-1), STAT = istat)
ALLOCATE(var3dw(nxlg-1,nylg-1,nz ), STAT = istat)
IF( ubcdmp == 1) THEN
CALL mpimerge3d
(u,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3du(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'U',var3du,nxlg,nylg-1,nz-1)
END IF
END IF
IF( vbcdmp == 1) THEN
CALL mpimerge3d
(v,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3dv(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'V',var3du,nxlg-1,nylg,nz-1)
END IF
END IF
IF( wbcdmp == 1) THEN
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'W',var3dw,nxlg-1,nylg-1,nz)
END IF
END IF
IF(ptbcdmp == 1) THEN
CALL mpimerge3d
(pt,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'PT',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(prbcdmp == 1) THEN
CALL mpimerge3d
(pr,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'P',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(qvbcdmp == 1) THEN
CALL mpimerge3d
(qv,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QV',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(qcbcdmp == 1) THEN
CALL mpimerge3d
(qc,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QC',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(qrbcdmp == 1) THEN
CALL mpimerge3d
(qr,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QR',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(qibcdmp == 1) THEN
CALL mpimerge3d
(qi,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QI',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(qsbcdmp == 1) THEN
CALL mpimerge3d
(qs,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QS',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF(qhbcdmp == 1) THEN
CALL mpimerge3d
(qh,nx,ny,nz,out3d)
IF (myproc == 0) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(bfid,0,itime,'QH',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF (myproc == 0 .AND.(exbcdmp == 7 .OR. itime >= istop) ) &
CALL netclose
(bfid)
DEALLOCATE(var3du,var3dv,var3dw)
ELSE
! alternate dump format ...
IF (myproc == 0) WRITE(6,'(1x,3a)') &
'The supported exbc data dump format are ', &
'binary (exbcdmp = 1), HDF4 (exbcdmp = 3) and ', &
'NetCDF format (exbcdmp = 7).'
CALL arpsstop
('EXBC data dump format is not supported.',1)
END IF
RETURN
END SUBROUTINE writejoinexbc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcdump( nx,ny,nz,nzsoil,nstyps, & 2,2
hisfmt,hisfnm,grdbas,flcmprs, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,zpsoil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
u0exb,v0exb,w0exb,pt0exb,pr0exb,qv0exb,qc0exb,qr0exb, &
qi0exb,qs0exb,qh0exb,udtexb,vdtexb,wdtexb, &
ptdtexb,prdtexb,qvdtexb,qcdtexb,qrdtexb,qidtexb, &
qsdtexb,qhdtexb, &
tem1,tem2,tem3 )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Dump EXBC fields interpolated to the model time in history
! dump format.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/27/94
!
! MODIFICATION HISTORY:
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 05/13/2002 (J. Brotzge)
! Added additional arrays for multiple soil schemes.
!-----------------------------------------------------------------------
!
! INPUT :
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the soil
!
! hisfmt
! hisfnm
! grdbas
! flcmprs
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of Cartesian velocity (m/s)
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! wbar Base state vertical velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
! zpsoil Vertical coordinate of grid points in the soil (m)
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! OUTPUT:
!
! None
!
! TEMPORATY WORKING ARRAY
!
! tem1
! tem2
! tem3
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx, ny, nz
INTEGER :: nzsoil
INTEGER :: hisfmt
CHARACTER (LEN=*) :: hisfnm
INTEGER :: grdbas
INTEGER :: flcmprs
!
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
!
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
!
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined at
! w-point of the soil.
INTEGER :: nstyps
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Soil type fratction
INTEGER :: vegtyp(nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! 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) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Reflected shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: u0exb (nx,ny,nz) ! External boundary u-velocity field
REAL :: v0exb (nx,ny,nz) ! External boundary v-velocity field
REAL :: w0exb (nx,ny,nz) ! External boundary w-velocity field
REAL :: pt0exb(nx,ny,nz) ! External boundary pt field
REAL :: pr0exb(nx,ny,nz) ! External boundary p field
REAL :: qv0exb(nx,ny,nz) ! External boundary qv field
REAL :: qc0exb(nx,ny,nz) ! External boundary qc field
REAL :: qr0exb(nx,ny,nz) ! External boundary qr field
REAL :: qi0exb(nx,ny,nz) ! External boundary qi field
REAL :: qs0exb(nx,ny,nz) ! External boundary qs field
REAL :: qh0exb(nx,ny,nz) ! External boundary qh field
REAL :: udtexb (nx,ny,nz) ! Time tendency of external boundary u
REAL :: vdtexb (nx,ny,nz) ! Time tendency of external boundary v
REAL :: wdtexb (nx,ny,nz) ! Time tendency of external boundary w
REAL :: ptdtexb(nx,ny,nz) ! Time tendency of external boundary pt
REAL :: prdtexb(nx,ny,nz) ! Time tendency of external boundary p
REAL :: qvdtexb(nx,ny,nz) ! Time tendency of external boundary qv
REAL :: qcdtexb(nx,ny,nz) ! Time tendency of external boundary qc
REAL :: qrdtexb(nx,ny,nz) ! Time tendency of external boundary qr
REAL :: qidtexb(nx,ny,nz) ! Time tendency of external boundary qi
REAL :: qsdtexb(nx,ny,nz) ! Time tendency of external boundary qs
REAL :: qhdtexb(nx,ny,nz) ! Time tendency of external boundary qh
REAL :: tem1 (nx,ny,nz)
REAL :: tem2 (nx,ny,nz)
REAL :: tem3 (nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
INTEGER :: nchexbc
REAL :: tema
SAVE nchexbc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
tema = curtim - ( abstfcst0 - abstinit )
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
u(i,j,k) = u0exb(i,j,k) + udtexb(i,j,k) * tema
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
v(i,j,k) = v0exb(i,j,k) + vdtexb(i,j,k) * tema
END DO
END DO
END DO
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
w(i,j,k) = w0exb(i,j,k) + wdtexb(i,j,k) * tema
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptprt(i,j,k) = pt0exb(i,j,k) + ptdtexb(i,j,k) * tema
pprt (i,j,k) = pr0exb(i,j,k) + prdtexb(i,j,k) * tema
qv (i,j,k) = qv0exb(i,j,k) + qvdtexb(i,j,k) * tema
!
! Since we do not have enough tem arrays to store qctem,
! qrtem, qitem, qstem and qhtem, we pass the model arrays
! into dtadump.
!
! qctem(i,j,k) = qc0exb(i,j,k) + qcdtexb(i,j,k) * tema
! qrtem(i,j,k) = qr0exb(i,j,k) + qrdtexb(i,j,k) * tema
! qitem(i,j,k) = qi0exb(i,j,k) + qidtexb(i,j,k) * tema
! qstem(i,j,k) = qs0exb(i,j,k) + qsdtexb(i,j,k) * tema
! qhtem(i,j,k) = qh0exb(i,j,k) + qhdtexb(i,j,k) * tema
END DO
END DO
END DO
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,dumpstride
IF(myproc >= i.AND.myproc <= i+dumpstride-1)THEN
CALL dtadump
( nx,ny,nz,nzsoil,nstyps, &
hisfmt,nchexbc,hisfnm,grdbas,filcmprs, &
u,v,w,ptprt,pprt,qv, &
qc,qr,qi,qs,qh,tke,kmh,kmv, &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,zpsoil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3 )
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
RETURN
END SUBROUTINE exbcdump