!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTBDTINI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE extbdtini(nx,ny,nz, & 1,6
u,v,w, ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ptbar,pbar, &
u0exb,v0exb,w0exb,pt0exb,pr0exb,qv0exb,qc0exb,qr0exb, &
qi0exb,qs0exb,qh0exb,udtexb,vdtexb,wdtexb, &
ptdtexb,prdtexb,qvdtexb,qcdtexb,qrdtexb,qidtexb, &
qsdtexb,qhdtexb,bcrlx, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc, ireturn)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in predicted variables from the first available external data
! sets to calculate the linear time tendencies of the external data
! set.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 8/10/94
!
! MODIFICATION HISTORY:
!
! 08/30/1995 (Yuhe Liu)
! Changed the initial boundary arrays, for restart run, from the
! model arrays to the time interplated external boundary arrays.
!
!-----------------------------------------------------------------------
!
! 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
!
! nx,ny,nz Number of grid points in x, y, and z dir.
!
! u u-velocity
! v v-velocity
! w w-velocity
! ptprt Potential temperature perturbation
! pprt Pressure perturbation
! qv Specific humidity
! qc Cloud water mixing ratio (kg/kg)
! qr Rain water mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
!
! ptbar Base state potential temperature
! pbar Base state pressure
!
! OUTPUT:
!
! uexbc EXBC u array
! vexbc EXBC v array
! wexbc EXBC w array
! ptexbc EXBC pt array
! prexbc EXBC pr array
! qvexbc EXBC qv array
! qcexbc EXBC qc array
! qrexbc EXBC qr array
! qiexbc EXBC qi array
! qsexbc EXBC qs array
! qhexbc EXBC qh array
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations and COMMON blocks.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: u(nx,ny,nz) ! u-velocity
REAL :: v(nx,ny,nz) ! v-velocity
REAL :: w(nx,ny,nz) ! w-velocity
REAL :: ptprt(nx,ny,nz) ! Potential temperature perturbation
REAL :: pprt(nx,ny,nz) ! Pressure perturbation
REAL :: qv(nx,ny,nz) ! Specific humidity
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 :: ptbar(nx,ny,nz) ! Base state potential temperature
REAL :: pbar(nx,ny,nz) ! Base state pressure
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 :: bcrlx (nx,ny) ! EXBC relaxation coefficients
REAL :: uexbc (nx,ny,nz) ! EXBC u array
REAL :: vexbc (nx,ny,nz) ! EXBC v array
REAL :: wexbc (nx,ny,nz) ! EXBC w array
REAL :: ptexbc(nx,ny,nz) ! EXBC pt array
REAL :: prexbc(nx,ny,nz) ! EXBC p array
REAL :: qvexbc(nx,ny,nz) ! EXBC qv array
REAL :: qcexbc(nx,ny,nz) ! EXBC qc array
REAL :: qrexbc(nx,ny,nz) ! EXBC qr array
REAL :: qiexbc(nx,ny,nz) ! EXBC qi array
REAL :: qsexbc(nx,ny,nz) ! EXBC qs array
REAL :: qhexbc(nx,ny,nz) ! EXBC qh array
INTEGER :: abststrt
CHARACTER (LEN=80) :: filename
INTEGER :: lfname
CHARACTER (LEN=15) :: ctime
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k, n
INTEGER :: istat, ierr, ireturn
INTEGER :: iyr, imon,idy, ihr, imin,isec
INTEGER :: iebc,iwbc,jnbc,jsbc, idist
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Make sure the external boundary fields match and fit the model
! domain.
!
!-----------------------------------------------------------------------
!
n = 2*ngbrz
!
!-----------------------------------------------------------------------
!
! Fill the boundary relaxation varibles with zero.
!
!-----------------------------------------------------------------------
!
DO j = 1, ny
DO i = 1, nx
bcrlx(i,j) = 0.
END DO
END DO
iebc=1
! iwbc=nx-1
! jnbc=ny-1
iwbc=nx-1+(nproc_x-1)*(nx-3)
jnbc=ny-1+(nproc_y-1)*(ny-3)
jsbc=1
IF (mp_opt > 0) THEN
END IF
DO j = 1, ny-1
DO i = 1, nx-1
! idist=min(i-iebc,iwbc-i,jnbc-j,j-jsbc)
idist=MIN(i+(loc_x-1)*(nx-3)-iebc, &
iwbc-i-(loc_x-1)*(nx-3), &
jnbc-j-(loc_y-1)*(ny-3), &
j+(loc_y-1)*(ny-3)-jsbc)
IF(idist < ngbrz ) bcrlx(i,j) = 1./(1.+(FLOAT(idist)/brlxhw)**2)
END DO
END DO
IF (myproc == 0) THEN
WRITE (6,'(/a)') 'Boundary relaxation coefficients'
WRITE (6,'(/a,a)') &
' j\\i 1 2 3 4 5 6 7', &
' 8 9'
WRITE (6,'(i3,9f8.5)') (j,(bcrlx(i,j),i=1,9),j=1,ny)
END IF
CALL ctim2abss
( year,month,day,hour,minute,second, abstinit )
abststop = abstinit + nint(tstop)
abststrt = abstinit + nint(tstart)
CALL getbcfn
( abststrt, exbcname, tinitebd, tintvebd, &
filename, lfname, istat )
IF ( istat /= 0 ) THEN
ireturn = 1
RETURN
END IF
IF ( initopt == 2 ) THEN
RETURN
END IF
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
u0exb(i,j,k) = u(i,j,k)
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
v0exb(i,j,k) = v(i,j,k)
END DO
END DO
END DO
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
w0exb(i,j,k) = w(i,j,k)
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
pt0exb(i,j,k) = ptprt(i,j,k)
pr0exb(i,j,k) = pprt(i,j,k)
qv0exb(i,j,k) = qv(i,j,k)
qc0exb(i,j,k) = qc(i,j,k)
qr0exb(i,j,k) = qr(i,j,k)
qi0exb(i,j,k) = qi(i,j,k)
qs0exb(i,j,k) = qs(i,j,k)
qh0exb(i,j,k) = qh(i,j,k)
END DO
END DO
END DO
abstfcst0 = abststrt
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
CALL readexbc
(nx,ny,nz, &
filename,lfname, ctime, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc,ierr)
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
IF ( ierr == 1 ) THEN
ireturn = 2
RETURN
ELSE IF ( ierr == 2 ) THEN
ireturn = 3
RETURN
END IF
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptexbc(i,j,k) = ptexbc(i,j,k) - ptbar(i,j,k)
prexbc(i,j,k) = prexbc(i,j,k) - pbar(i,j,k)
END DO
END DO
END DO
READ (ctime, '(i4,2i2,1x,3i2)') &
iyr,imon,idy,ihr,imin,isec
CALL ctim2abss
( iyr,imon,idy,ihr,imin,isec, abstfcst )
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
udtexb (i,j,k) = 0.0 ! Initialize the tendencies with zero.
vdtexb (i,j,k) = 0.0
wdtexb (i,j,k) = 0.0
ptdtexb(i,j,k) = 0.0
prdtexb(i,j,k) = 0.0
qvdtexb(i,j,k) = 0.0
qcdtexb(i,j,k) = 0.0
qrdtexb(i,j,k) = 0.0
qidtexb(i,j,k) = 0.0
qsdtexb(i,j,k) = 0.0
qhdtexb(i,j,k) = 0.0
END DO
END DO
END DO
CALL exbcdt
(nx,ny,nz, &
u0exb,v0exb,w0exb,pt0exb,pr0exb, &
qv0exb,qc0exb,qr0exb,qi0exb,qs0exb,qh0exb, &
udtexb,vdtexb,wdtexb,ptdtexb,prdtexb, &
qvdtexb,qcdtexb,qrdtexb,qidtexb,qsdtexb,qhdtexb, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc)
!call test_dump (uexbc,"XXX0uexbc",nx,ny,nz,1,1)
!call test_dump (vexbc,"XXX0vexbc",nx,ny,nz,2,1)
!call test_dump (wexbc,"XXX0wexbc",nx,ny,nz,3,1)
!call test_dump (ptexbc,"XXX0ptexbc",nx,ny,nz,0,1)
!call test_dump (prexbc,"XXX0prexbc",nx,ny,nz,0,1)
!call test_dump (qvexbc,"XXX0qvexbc",nx,ny,nz,0,1)
!call test_dump (qcexbc,"XXX0qcexbc",nx,ny,nz,0,1)
!call test_dump (qrexbc,"XXX0qrexbc",nx,ny,nz,0,1)
!call test_dump (qiexbc,"XXX0qiexbc",nx,ny,nz,0,1)
!call test_dump (qsexbc,"XXX0qsexbc",nx,ny,nz,0,1)
!call test_dump (qhexbc,"XXX0qhexbc",nx,ny,nz,0,1)
!call test_dump (udtexb,"XXX0udtexb",nx,ny,nz,1,1)
!call test_dump (vdtexb,"XXX0vdtexb",nx,ny,nz,2,1)
!call test_dump (wdtexb,"XXX0wdtexb",nx,ny,nz,3,1)
!call test_dump (ptdtexb,"XXX0ptdtexb",nx,ny,nz,0,1)
!call test_dump (prdtexb,"XXX0prdtexb",nx,ny,nz,0,1)
!call test_dump (qvdtexb,"XXX0qvdtexb",nx,ny,nz,0,1)
!call test_dump (qcdtexb,"XXX0qcdtexb",nx,ny,nz,0,1)
!call test_dump (qrdtexb,"XXX0qrdtexb",nx,ny,nz,0,1)
!call test_dump (qidtexb,"XXX0qidtexb",nx,ny,nz,0,1)
!call test_dump (qsdtexb,"XXX0qsdtexb",nx,ny,nz,0,1)
!call test_dump (qhdtexb,"XXX0qhdtexb",nx,ny,nz,0,1)
RETURN
END SUBROUTINE extbdtini
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTBDT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE extbdt(nx,ny,nz, ptbar,pbar, ireturn, & 1,5
u0exb,v0exb,w0exb,pt0exb,pr0exb, &
qv0exb,qc0exb,qr0exb,qi0exb,qs0exb,qh0exb, &
udtexb,vdtexb,wdtexb,ptdtexb,prdtexb, &
qvdtexb,qcdtexb,qrdtexb,qidtexb,qsdtexb,qhdtexb, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in predicted variables from external boundary file to
! calculate the linear time tendencies of the external data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! MODIFICATION HISTORY:
!
! 8/10/94 (Yuhe Liu)
! Split the initial call to calculate the time tendency into another
! subroutine, EXTBDTINI.
!
!
!-----------------------------------------------------------------------
!
! 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
!
! OUTPUT:
!
! uexbc EXBC u array
! vexbc EXBC v array
! wexbc EXBC w array
! ptexbc EXBC pt array
! prexbc EXBC pr array
! qvexbc EXBC qv array
! qcexbc EXBC qc array
! qrexbc EXBC qr array
! qiexbc EXBC qi array
! qsexbc EXBC qs array
! qhexbc EXBC qh array
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations and COMMON blocks.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: ptbar(nx,ny,nz) ! Base state potential temperature
REAL :: pbar(nx,ny,nz) ! Base state pressure
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 :: uexbc (nx,ny,nz) ! EXBC u array
REAL :: vexbc (nx,ny,nz) ! EXBC v array
REAL :: wexbc (nx,ny,nz) ! EXBC w array
REAL :: ptexbc(nx,ny,nz) ! EXBC pt array
REAL :: prexbc(nx,ny,nz) ! EXBC p array
REAL :: qvexbc(nx,ny,nz) ! EXBC qv array
REAL :: qcexbc(nx,ny,nz) ! EXBC qc array
REAL :: qrexbc(nx,ny,nz) ! EXBC qr array
REAL :: qiexbc(nx,ny,nz) ! EXBC qi array
REAL :: qsexbc(nx,ny,nz) ! EXBC qs array
REAL :: qhexbc(nx,ny,nz) ! EXBC qh array
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=80) :: filename
INTEGER :: lfname
CHARACTER (LEN=15) :: ctime
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
INTEGER :: istat, ierr, ireturn
REAL :: tinc
INTEGER :: abstcur
INTEGER :: iyr, imon,idy, ihr, imin,isec
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'exbc.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
abstcur = abstinit + nint(curtim+dtbig)
IF ( abstcur <= abstfcst ) THEN
ireturn = 0
RETURN
END IF
CALL getbcfn
( abstcur, exbcname, tinitebd, tintvebd, &
filename, lfname, istat )
IF ( istat /= 0 ) THEN
ireturn = 1
RETURN
END IF
tinc = FLOAT( abstfcst - abstfcst0 )
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
u0exb(i,j,k) = u0exb(i,j,k) + udtexb(i,j,k) * tinc
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
v0exb(i,j,k) = v0exb(i,j,k) + vdtexb(i,j,k) * tinc
END DO
END DO
END DO
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
w0exb(i,j,k) = w0exb(i,j,k) + wdtexb(i,j,k) * tinc
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
pt0exb(i,j,k) = pt0exb(i,j,k) + ptdtexb(i,j,k) * tinc
pr0exb(i,j,k) = pr0exb(i,j,k) + prdtexb(i,j,k) * tinc
qv0exb(i,j,k) = qv0exb(i,j,k) + qvdtexb(i,j,k) * tinc
qc0exb(i,j,k) = qc0exb(i,j,k) + qcdtexb(i,j,k) * tinc
qr0exb(i,j,k) = qr0exb(i,j,k) + qrdtexb(i,j,k) * tinc
qi0exb(i,j,k) = qi0exb(i,j,k) + qidtexb(i,j,k) * tinc
qs0exb(i,j,k) = qs0exb(i,j,k) + qsdtexb(i,j,k) * tinc
qh0exb(i,j,k) = qh0exb(i,j,k) + qhdtexb(i,j,k) * tinc
END DO
END DO
END DO
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
CALL readexbc
(nx,ny,nz, &
filename,lfname, ctime, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc,ierr)
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
IF ( ierr == 1 ) THEN
ireturn = 2
RETURN
ELSE IF ( ierr == 2 ) THEN
ireturn = 3
RETURN
END IF
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptexbc(i,j,k) = ptexbc(i,j,k) - ptbar(i,j,k)
prexbc(i,j,k) = prexbc(i,j,k) - pbar(i,j,k)
END DO
END DO
END DO
abstfcst0 = abstfcst
READ (ctime, '(i4,2i2,1x,3i2)') &
iyr,imon,idy,ihr,imin,isec
CALL ctim2abss
( iyr,imon,idy,ihr,imin,isec, abstfcst )
CALL exbcdt
(nx,ny,nz, &
u0exb,v0exb,w0exb,pt0exb,pr0exb,qv0exb,qc0exb,qr0exb, &
qi0exb,qs0exb,qh0exb,udtexb,vdtexb,wdtexb, &
ptdtexb,prdtexb,qvdtexb,qcdtexb,qrdtexb,qidtexb, &
qsdtexb,qhdtexb, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc)
ireturn = 0
!call test_dump(u0exb ,"XXXAextbdt_u0exb",nx,ny,nz,1,1)
!call test_dump(v0exb ,"XXXAextbdt_v0exb",nx,ny,nz,2,1)
!call test_dump(w0exb ,"XXXAextbdt_w0exb",nx,ny,nz,3,1)
!call test_dump(pt0exb,"XXXAextbdt_pt0exb",nx,ny,nz,0,1)
!call test_dump(pr0exb,"XXXAextbdt_pr0exb",nx,ny,nz,0,1)
!call test_dump(qv0exb,"XXXAextbdt_qv0exb",nx,ny,nz,0,1)
!call test_dump(qc0exb,"XXXAextbdt_qc0exb",nx,ny,nz,0,1)
!call test_dump(qr0exb,"XXXAextbdt_qr0exb",nx,ny,nz,0,1)
!call test_dump(qi0exb,"XXXAextbdt_qi0exb",nx,ny,nz,0,1)
!call test_dump(qs0exb,"XXXAextbdt_qs0exb",nx,ny,nz,0,1)
!call test_dump(qh0exb,"XXXAextbdt_qh0exb",nx,ny,nz,0,1)
!call test_dump(udtexb ,"XXXAextbdt_udtexb",nx,ny,nz,1,1)
!call test_dump(vdtexb ,"XXXAextbdt_vdtexb",nx,ny,nz,2,1)
!call test_dump(wdtexb ,"XXXAextbdt_wdtexb",nx,ny,nz,3,1)
!call test_dump(ptdtexb,"XXXAextbdt_ptdtexb",nx,ny,nz,0,1)
!call test_dump(prdtexb,"XXXAextbdt_prdtexb",nx,ny,nz,0,1)
!call test_dump(qvdtexb,"XXXAextbdt_qvdtexb",nx,ny,nz,0,1)
!call test_dump(qcdtexb,"XXXAextbdt_qcdtexb",nx,ny,nz,0,1)
!call test_dump(qrdtexb,"XXXAextbdt_qrdtexb",nx,ny,nz,0,1)
!call test_dump(qidtexb,"XXXAextbdt_qidtexb",nx,ny,nz,0,1)
!call test_dump(qsdtexb,"XXXAextbdt_qsdtexb",nx,ny,nz,0,1)
!call test_dump(qhdtexb,"XXXAextbdt_qhdtexb",nx,ny,nz,0,1)
!call test_dump(uexbc ,"XXXAextbdt_uexbc",nx,ny,nz,1,1)
!call test_dump(vexbc ,"XXXAextbdt_vexbc",nx,ny,nz,2,1)
!call test_dump(wexbc ,"XXXAextbdt_wexbc",nx,ny,nz,3,1)
!call test_dump(ptexbc,"XXXAextbdt_ptexbc",nx,ny,nz,0,1)
!call test_dump(prexbc,"XXXAextbdt_prexbc",nx,ny,nz,0,1)
!call test_dump(qvexbc,"XXXAextbdt_qvexbc",nx,ny,nz,0,1)
!call test_dump(qcexbc,"XXXAextbdt_qcexbc",nx,ny,nz,0,1)
!call test_dump(qrexbc,"XXXAextbdt_qrexbc",nx,ny,nz,0,1)
!call test_dump(qiexbc,"XXXAextbdt_qiexbc",nx,ny,nz,0,1)
!call test_dump(qsexbc,"XXXAextbdt_qsexbc",nx,ny,nz,0,1)
!call test_dump(qhexbc,"XXXAextbdt_qhexbc",nx,ny,nz,0,1)
RETURN
END SUBROUTINE extbdt
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCDT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcdt(nx,ny,nz, & 2
u0exb,v0exb,w0exb,pt0exb,pr0exb,qv0exb,qc0exb,qr0exb, &
qi0exb,qs0exb,qh0exb,udtexb,vdtexb,wdtexb, &
ptdtexb,prdtexb,qvdtexb,qcdtexb,qrdtexb,qidtexb, &
qsdtexb,qhdtexb, &
uexbc,vexbc,wexbc,ptexbc,prexbc, &
qvexbc,qcexbc,qrexbc,qiexbc,qsexbc,qhexbc)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the linear time-dependent tendencies of external
! boundary data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! 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
!
! OUTPUT:
!
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations and COMMON blocks.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
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 :: uexbc (nx,ny,nz) ! EXBC u array
REAL :: vexbc (nx,ny,nz) ! EXBC v array
REAL :: wexbc (nx,ny,nz) ! EXBC w array
REAL :: ptexbc(nx,ny,nz) ! EXBC pt array
REAL :: prexbc(nx,ny,nz) ! EXBC p array
REAL :: qvexbc(nx,ny,nz) ! EXBC qv array
REAL :: qcexbc(nx,ny,nz) ! EXBC qc array
REAL :: qrexbc(nx,ny,nz) ! EXBC qr array
REAL :: qiexbc(nx,ny,nz) ! EXBC qi array
REAL :: qsexbc(nx,ny,nz) ! EXBC qs array
REAL :: qhexbc(nx,ny,nz) ! EXBC qh array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCDT')
tinc = FLOAT( abstfcst - abstfcst0 )
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
udtexb(i,j,k) = (uexbc(i,j,k)-u0exb(i,j,k))/tinc
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
vdtexb(i,j,k) = (vexbc(i,j,k)-v0exb(i,j,k))/tinc
END DO
END DO
END DO
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
wdtexb(i,j,k) = (wexbc(i,j,k)-w0exb(i,j,k))/tinc
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptdtexb(i,j,k) = (ptexbc(i,j,k)-pt0exb(i,j,k))/tinc
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
prdtexb(i,j,k) = (prexbc(i,j,k)-pr0exb(i,j,k))/tinc
END DO
END DO
END DO
IF ( qvbcrd /= 0 ) THEN
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qvdtexb(i,j,k) = (qvexbc(i,j,k)-qv0exb(i,j,k))/tinc
END DO
END DO
END DO
END IF
IF ( qcbcrd /= 0 ) THEN
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qcdtexb(i,j,k) = (qcexbc(i,j,k)-qc0exb(i,j,k))/tinc
END DO
END DO
END DO
END IF
IF ( qrbcrd /= 0 ) THEN
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qrdtexb(i,j,k) = (qrexbc(i,j,k)-qr0exb(i,j,k))/tinc
END DO
END DO
END DO
END IF
IF ( qibcrd /= 0 ) THEN
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qidtexb(i,j,k) = (qiexbc(i,j,k)-qi0exb(i,j,k))/tinc
END DO
END DO
END DO
END IF
IF ( qsbcrd /= 0 ) THEN
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qsdtexb(i,j,k) = (qsexbc(i,j,k)-qs0exb(i,j,k))/tinc
END DO
END DO
END DO
END IF
IF ( qhbcrd /= 0 ) THEN
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qhdtexb(i,j,k) = (qhexbc(i,j,k)-qh0exb(i,j,k))/tinc
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE exbcdt
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCUV ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcuv(nx,ny,nz, time, u,v, u0exb,v0exb,udtexb,vdtexb) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the external boundary conditions for u and v.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! 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
!
! time The time at which the boundary conditions of u and v are set.
!
! u u-velocity
! v v-velocity
!
! OUTPUT:
!
! u u-velocity
! v v-velocity
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: time ! The time at which the boundary conditions
! of u and v are set.
REAL :: u(nx,ny,nz) ! v-velocity
REAL :: v(nx,ny,nz) ! v-velocity
REAL :: u0exb(nx,ny,nz) ! External boundary u-velocity field
REAL :: v0exb(nx,ny,nz) ! External boundary v-velocity field
REAL :: udtexb(nx,ny,nz) ! Time tendency of external boundary u
REAL :: vdtexb(nx,ny,nz) ! Time tendency of external boundary v
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCUV')
tinc = time - FLOAT(abstfcst0-abstinit)
IF (loc_x == 1) THEN
DO k = 1, nz-1
DO j = 1, ny-1
u( 1,j,k) = u0exb( 1,j,k) + udtexb( 1,j,k) * tinc
END DO
END DO
END IF
IF (loc_x == nproc_x) THEN
DO k = 1, nz-1
DO j = 1, ny-1
u(nx,j,k) = u0exb(nx,j,k) + udtexb(nx,j,k) * tinc
END DO
END DO
END IF
IF (loc_y == 1) THEN
DO k = 1, nz-1
DO i = 1, nx
u(i, 1,k) = u0exb(i, 1,k) + udtexb(i, 1,k) * tinc
END DO
END DO
END IF
IF (loc_y == nproc_y) THEN
DO k = 1, nz-1
DO i = 1, nx
u(i,ny-1,k) = u0exb(i,ny-1,k) + udtexb(i,ny-1,k) * tinc
END DO
END DO
END IF
IF (loc_x == 1) THEN
DO k = 1, nz-1
DO j = 1, ny
v( 1,j,k) = v0exb( 1,j,k) + vdtexb( 1,j,k) * tinc
END DO
END DO
END IF
IF (loc_x == nproc_x) THEN
DO k = 1, nz-1
DO j = 1, ny
v(nx-1,j,k) = v0exb(nx-1,j,k) + vdtexb(nx-1,j,k) * tinc
END DO
END DO
END IF
IF (loc_y == 1) THEN
DO k = 1, nz-1
DO i = 1, nx-1
v(i, 1,k) = v0exb(i, 1,k) + vdtexb(i, 1,k) * tinc
END DO
END DO
END IF
IF (loc_y == nproc_y) THEN
DO k = 1, nz-1
DO i = 1, nx-1
v(i,ny,k) = v0exb(i,ny,k) + vdtexb(i,ny,k) * tinc
END DO
END DO
END IF
RETURN
END SUBROUTINE exbcuv
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcw( nx,ny,nz, time, w, w0exb,wdtexb )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the external boundary conditions for w.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! 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
!
! time The time at which the boundary condition of w is set.
!
! w w-velocity
!
! OUTPUT:
!
! w w-velocity
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: time ! The time at which the boundary condition
! of w is set.
REAL :: w(nx,ny,nz) ! w-velocity
REAL :: w0exb(nx,ny,nz) ! External boundary w-velocity field
REAL :: wdtexb(nx,ny,nz) ! Time tendency of external boundary w
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCW')
tinc = time - FLOAT(abstfcst0-abstinit)
IF (loc_x == 1) THEN
DO k = 1, nz-1
DO j = 1, ny-1
w( 1,j,k) = w0exb( 1,j,k) + wdtexb( 1,j,k) * tinc
END DO
END DO
END IF
IF (loc_x == nproc_x) THEN
DO k = 1, nz-1
DO j = 1, ny-1
w(nx-1,j,k) = w0exb(nx-1,j,k) + wdtexb(nx-1,j,k) * tinc
END DO
END DO
END IF
IF (loc_y == 1) THEN
DO k = 1, nz-1
DO i = 1, nx-1
w(i, 1,k) = w0exb(i, 1,k) + wdtexb(i, 1,k) * tinc
END DO
END DO
END IF
IF (loc_y == nproc_y) THEN
DO k = 1, nz-1
DO i = 1, nx-1
w(i,ny-1,k) = w0exb(i,ny-1,k) + wdtexb(i,ny-1,k) * tinc
END DO
END DO
END IF
RETURN
END SUBROUTINE exbcw
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCPT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcpt( nx,ny,nz, time, ptprt, pt0exb,ptdtexb ) 6,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the external boundary conditions for ptprt.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! 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
!
! time The time at which the boundary condition of ptprt is set.
!
! ptprt Potential temperature perturbation
!
! OUTPUT:
!
! ptprt Potential temperature perturbation
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: time ! The time at which the boundary condition
! of ptprt is set.
REAL :: ptprt(nx,ny,nz) ! Perturbation potential temperature.
REAL :: pt0exb(nx,ny,nz) ! External boundary pt field
REAL :: ptdtexb(nx,ny,nz) ! Time tendency of external boundary pt
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCPT')
tinc = time - FLOAT(abstfcst0-abstinit)
CALL exbcs
( nx,ny,nz, ptprt, pt0exb, ptdtexb, tinc)
RETURN
END SUBROUTINE exbcpt
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcp( nx,ny,nz, time , pprt, pr0exb,prdtexb ) 3,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the external boundary conditions for pprt.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! 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
!
! time The time at which the boundary condition of pprt is set.
!
! pprt Pressure perturbation
!
! OUTPUT:
!
! pprt Pressure perturbation
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: time ! The time at which the boundary condition
! of pprt is set.
REAL :: pprt(nx,ny,nz) ! Pressure perturbation
REAL :: pr0exb(nx,ny,nz) ! External boundary p field
REAL :: prdtexb(nx,ny,nz) ! Time tendency of external boundary pt
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCP')
tinc = time - FLOAT(abstfcst0-abstinit)
CALL exbcs
( nx,ny,nz, pprt, pr0exb, prdtexb, tinc)
RETURN
END SUBROUTINE exbcp
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCQ ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcq(nx,ny,nz, qflag, time, q, q0exb,qdtexb) 18,6
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the external boundary conditions for q.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 5/26/94
!
! 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
! qflag Indicator of water/ice species
!
! time The time at which the boundary condition of q is set.
!
! q One of the water or ice species.
!
! OUTPUT:
!
! q q updated at the lateral boundary
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
INTEGER :: qflag ! Indicator of water/ice species
REAL :: time ! The time at which the boundary condition
! of q is set.
REAL :: q(nx,ny,nz) ! Water vapor mixing ratio
REAL :: q0exb(nx,ny,nz) ! External boundary qv field
REAL :: qdtexb(nx,ny,nz) ! Time tendency of external boundary qv
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: tinc
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCQ')
tinc = time - FLOAT(abstfcst0-abstinit)
IF( qflag == 1) THEN
IF(qvbcrd == 1) CALL exbcs
(nx,ny,nz,q,q0exb,qdtexb,tinc)
ELSE IF( qflag == 2) THEN
IF(qcbcrd == 1) CALL exbcs
(nx,ny,nz,q,q0exb,qdtexb,tinc)
ELSE IF( qflag == 3) THEN
IF(qrbcrd == 1) CALL exbcs
(nx,ny,nz,q,q0exb,qdtexb,tinc)
ELSE IF( qflag == 4) THEN
IF(qibcrd == 1) CALL exbcs
(nx,ny,nz,q,q0exb,qdtexb,tinc)
ELSE IF( qflag == 5) THEN
IF(qsbcrd == 1) CALL exbcs
(nx,ny,nz,q,q0exb,qdtexb,tinc)
ELSE IF( qflag == 6) THEN
IF(qhbcrd == 1) CALL exbcs
(nx,ny,nz,q,q0exb,qdtexb,tinc)
END IF
RETURN
END SUBROUTINE exbcq
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXBCS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE exbcs( nx,ny,nz, s, s0, sdt, tinc) 8
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the external boundary conditions for a scalar s.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue based on Yuhe Liu's EXBCP.
! 8/12/95
!
! 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
! s A scalar whose boundary values is to be set
! s0 s at a past time
! sdt Time tendency of s
! tinc Time increment between currnet s and s0
!
! OUTPUT:
!
! s Boundary values of s.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x, y, and z dir.
REAL :: s (nx,ny,nz) ! A scalar
REAL :: s0 (nx,ny,nz) ! s at a past time
REAL :: sdt(nx,ny,nz) ! Time tendency of s
REAL :: tinc ! Time increment between s and s0
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (loc_x == 1) THEN
DO k = 1, nz-1
DO j = 1, ny-1
s( 1,j,k) = s0( 1,j,k) + sdt( 1,j,k) * tinc
END DO
END DO
END IF
IF (loc_x == nproc_x) THEN
DO k = 1, nz-1
DO j = 1, ny-1
s(nx-1,j,k) = s0(nx-1,j,k) + sdt(nx-1,j,k) * tinc
END DO
END DO
END IF
IF (loc_y == 1) THEN
DO k = 1, nz-1
DO i = 1, nx-1
s(i, 1,k) = s0(i, 1,k) + sdt(i, 1,k) * tinc
END DO
END DO
END IF
IF (loc_y == nproc_y) THEN
DO k = 1, nz-1
DO i = 1, nx-1
s(i,ny-1,k) = s0(i,ny-1,k) + sdt(i,ny-1,k) * tinc
END DO
END DO
END IF
RETURN
END SUBROUTINE exbcs
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BRLXUVW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE brlxuvw( nx,ny,nz, dtbig1, & 1,5
u,v,w,rhostr, &
uforce,vforce,wforce, &
u0exb,v0exb,w0exb, udtexb,vdtexb,wdtexb,bcrlx, &
tem1,tem2,tem3,tem4,tem5,tem6 )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the boundary relaxation and computational mixing for u,
! v, and w in the boundary zone.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Xue Ming & Yuhe Liu
! 5/26/94
!
! 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
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of velocity in Cartesian
! coordinates (m/s).
!
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! INPUT/OUTPUT :
!
! uforce forcing terms in u-momentum equation (kg/(m*s)**2).
! uforce= uforce_others + uforce_boundary
! vforce forcing terms in v-momentum equation (kg/(m*s)**2).
! vforce= vforce_others + vforce_boundary
! wforce forcing terms in w-momentum equation (kg/(m*s)**2).
! wforce= wforce_others + wforce_boundary
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! tem5 Temporary work array.
! tem6 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: dtbig1
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 :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: uforce(nx,ny,nz) ! forcing terms in u-momentum equ (kg/(m*s)**2)
! uforce = uforce_others + uforce_boundary
REAL :: vforce(nx,ny,nz) ! forcing terms in v-momentum equ (kg/(m*s)**2)
! vforce = vforce_others + vforce_boundary
REAL :: wforce(nx,ny,nz) ! forcing terms in w-momentum equ (kg/(m*s)**2)
! wforce = wforce_others + wforce_boundary
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 :: 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 :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: tem1(nx,ny,nz) ! Temporary array
REAL :: tem2(nx,ny,nz) ! Temporary array
REAL :: tem3(nx,ny,nz) ! Temporary array
REAL :: tem4(nx,ny,nz) ! Temporary array
REAL :: tem5(nx,ny,nz) ! Temporary array
REAL :: tem6(nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: tinc, temb
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model execution
INCLUDE 'grid.inc' ! Grid parameters
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'EXBCP')
tinc = (curtim +dtbig-2.*dtbig1) - FLOAT(abstfcst0-abstinit)
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
temb = u0exb(i,j,k) + udtexb(i,j,k) * tinc
tem4(i,j,k) = ( u(i,j,k) - temb ) * tem1(i,j,k)
END DO
END DO
END DO
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
temb = v0exb(i,j,k) + vdtexb(i,j,k) * tinc
tem5(i,j,k) = ( v(i,j,k) - temb ) * tem2(i,j,k)
END DO
END DO
END DO
! DO 30 k = 1, nz
! DO 30 j = 1, ny-1
! DO 30 i = 1, nx-1
! temb = w0exb(i,j,k) + wdtexb(i,j,k) * tinc
! tem6(i,j,k) = ( w(i,j,k) - temb ) * tem3(i,j,k)
!30 CONTINUE
CALL difxx
(tem4, nx,ny,nz, 2,nx-1,1,ny-1,1,nz-1, dx, tem1)
CALL difyy
(tem4, nx,ny,nz, 2,nx-1,2,ny-2,1,nz-1, dy, tem2)
DO k = 1, nz-1
DO j = 2, ny-2
DO i = 2, nx-1
uforce(i,j,k) = uforce(i,j,k) &
- cbcdmp * .5 * (bcrlx(i-1,j)+bcrlx(i,j)) &
* tem4(i,j,k) &
+ cbcmixh* ( 1.+2.*(bcrlx(i-1,j)+bcrlx(i,j)) ) &
* ( tem1(i,j,k) + tem2(i,j,k) )
END DO
END DO
END DO
CALL difxx
(tem5, nx,ny,nz, 2,nx-2,2,ny-1,1,nz-1, dx, tem1)
CALL difyy
(tem5, nx,ny,nz, 1,nx-1,2,ny-1,1,nz-1, dy, tem2)
DO k = 1, nz-1
DO j = 2, ny-1
DO i = 2, nx-2
vforce(i,j,k) = vforce(i,j,k) &
- cbcdmp * .5 * (bcrlx(i,j-1)+bcrlx(i,j)) &
* tem5(i,j,k) &
+ cbcmixh* ( 1. + 2.*(bcrlx(i,j-1)+bcrlx(i,j)) ) &
* ( tem1(i,j,k) + tem2(i,j,k) )
END DO
END DO
END DO
! CALL difxx(tem6, nx,ny,nz, 2,nx-2,1,ny-1,1,nz-1, dx, tem1)
! CALL difyy(tem6, nx,ny,nz, 1,nx-1,2,ny-2,1,nz-1, dy, tem2)
!
! DO 300 k = 1, nz
! DO 300 j = 2, ny-2
! DO 300 i = 2, nx-2
! wforce(i,j,k) = wforce(i,j,k)
! : - cbcdmp * bcrlx(i,j) * tem6(i,j,k)
! : + cbcmixh* ( 1. + 4.*bcrlx(i,j) )
! : * ( tem1(i,j,k) + tem2(i,j,k) )
!300 CONTINUE
!
RETURN
END SUBROUTINE brlxuvw
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BRLXPT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE brlxpt( nx,ny,nz, dtbig1, ptprt,rhostr, ptforce, & 1,1
pt0exb,ptdtexb, bcrlx, &
tem1, tem2, tem3,tem4 )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the boundary relaxation and computational mixing for
! potential temperature perturbation, ptprt, in the boundary zone.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Xue Ming & Yuhe Liu
! 5/26/94
!
! MODIFICATION HISTORY:
!
! 8/15/95 (M. Xue)
! BRLXS is now called to calculated the boundary relaxation term
!
!-----------------------------------------------------------------------
!
!
! 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
!
! ptprt Perturbation potential temperature (K)
!
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! INPUT/OUTPUT :
!
! ptforce Source terms in potential temperature equation (kg/(m*s)**2).
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: dtbig1
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: rhostr (nx,ny,nz) ! Base state density rhobar times j3.
REAL :: ptforce(nx,ny,nz) ! Forcing term in ptprt euation
REAL :: pt0exb(nx,ny,nz) ! External boundary pt field
REAL :: ptdtexb(nx,ny,nz) ! Time tendency of external boundary pt
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: tem1(nx,ny,nz) ! Temporary array
REAL :: tem2(nx,ny,nz) ! Temporary array
REAL :: tem3(nx,ny,nz) ! Temporary array
REAL :: tem4(nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model execution
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'BRLXPT')
tinc = (curtim+dtbig-2.*dtbig1) - FLOAT(abstfcst0-abstinit)
CALL brlxs
(nx,ny,nz,ptprt,pt0exb,ptdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
DO k = 1, nz-1
DO j = 2, ny-2
DO i = 2, nx-2
ptforce(i,j,k) = ptforce(i,j,k) + tem4(i,j,k)
END DO
END DO
END DO
RETURN
END SUBROUTINE brlxpt
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BRLXP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE brlxp( nx,ny,nz, dtbig1, pprt,rhostr, pforce, & 1,1
pr0exb,prdtexb, bcrlx, &
tem1, tem2, tem3,tem4)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the boundary relaxation and computational mixing for
! pprt in the boundary zone.
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Xue Ming & Yuhe Liu
! 5/26/94
!
! MODIFICATION HISTORY:
!
! 8/15/95 (M. Xue)
! BRLXS is now called to calculated the boundary relaxation term
!
!-----------------------------------------------------------------------
!
! 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
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of velocity in Cartesian
! coordinates (m/s).
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
!
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! INPUT/OUTPUT :
!
! pforce forcing terms in pressure equation (kg/(m*s)**2).
! pforce = pforce_others + pforce_boundary
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: dtbig1
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: pforce(nx,ny,nz) ! forcing terms in pert. pressure (Pascal)
! pforce = pforce_others + pforce_boundary
REAL :: pr0exb(nx,ny,nz) ! External boundary p field
REAL :: prdtexb(nx,ny,nz) ! Time tendency of external boundary p
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: tem1(nx,ny,nz) ! Temporary array
REAL :: tem2(nx,ny,nz) ! Temporary array
REAL :: tem3(nx,ny,nz) ! Temporary array
REAL :: tem4(nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model execution
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'BRLXP')
tinc = (curtim+dtbig-2.*dtbig1) - FLOAT(abstfcst0-abstinit)
CALL brlxs
(nx,ny,nz,pprt,pr0exb,prdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
DO k = 1, nz-1
DO j = 2, ny-1
DO i = 2, nx-1
pforce(i,j,k) = pforce(i,j,k) + tem4(i,j,k)
END DO
END DO
END DO
RETURN
END SUBROUTINE brlxp
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BRLXQ ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE brlxq( nx,ny,nz, dtbig1, qflag, q,rhostr, qsrc, & 2,6
qv0exb,qc0exb,qr0exb,qi0exb,qs0exb,qh0exb, &
qvdtexb,qcdtexb,qrdtexb,qidtexb,qsdtexb,qhdtexb,bcrlx, &
tem1, tem2, tem3 ,tem4)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the boundary relaxation and computational mixing for
! a water/ice variable q in the boundary zone.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Xue Ming & Yuhe Liu
! 5/26/94
!
! MODIFICATION HISTORY:
!
! 8/15/95 (M. Xue)
! Generalized for any wter/ice variable q, by calling BRLXS.
!
! 9/15/97 (M. Xue and G. Bassett)
! Added in subroutine BRLXQ checks like (qsbcrd.eq.1) in the IF
! tests so that boundary relaxation or smoothing is NOT done when
! variable is not found in the exbc file (when q*bcrd=0).
! Previously it was ralaxing the variables to the initial state,
! therefore initial storms in the boundary zone tend to stick.
!
!-----------------------------------------------------------------------
!
!
! 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
! dtbig1 Big time step size (s)
! qflag Indicator for water/ice variable
! q One of the water or ice variable
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! INPUT/OUTPUT :
!
! qsrc Source terms in water/ice water equation (kg/(m*s)**2).
! qvsrc = qvsrc_others + qvsrc_boundary
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: dtbig1
INTEGER :: qflag ! Indicator for water/ice variable
REAL :: q (nx,ny,nz) ! Water/ice variable
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: qsrc(nx,ny,nz) ! Source term in q euation
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 :: 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 :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: tem1(nx,ny,nz) ! Temporary array
REAL :: tem2(nx,ny,nz) ! Temporary array
REAL :: tem3(nx,ny,nz) ! Temporary array
REAL :: tem4(nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: tinc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model execution
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! CALL checkdims(nx,ny,nz, nxebc,nyebc,nzebc, 'BRLXQ')
tinc = (curtim+dtbig-2.*dtbig1) - FLOAT(abstfcst0-abstinit)
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
tem4(i,j,k) = 0.0
END DO
END DO
END DO
IF( qvbcrd == 1 .AND. qflag == 1 ) THEN
CALL brlxs
(nx,ny,nz,q,qv0exb,qvdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
ELSE IF( qcbcrd == 1 .AND. qflag == 2 ) THEN
CALL brlxs
(nx,ny,nz,q,qc0exb,qcdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
ELSE IF( qrbcrd == 1 .AND. qflag == 3 ) THEN
CALL brlxs
(nx,ny,nz,q,qr0exb,qrdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
ELSE IF( qibcrd == 1 .AND. qflag == 4 ) THEN
CALL brlxs
(nx,ny,nz,q,qi0exb,qidtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
ELSE IF( qsbcrd == 1 .AND. qflag == 5 ) THEN
CALL brlxs
(nx,ny,nz,q,qs0exb,qsdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
ELSE IF( qhbcrd == 1 .AND. qflag == 6 ) THEN
CALL brlxs
(nx,ny,nz,q,qh0exb,qhdtexb,bcrlx,tinc,rhostr,tem4, &
tem1,tem2,tem3)
END IF
DO k = 1, nz-1
DO j = 2, ny-2
DO i = 2, nx-2
qsrc(i,j,k) = qsrc(i,j,k) + tem4(i,j,k)
END DO
END DO
END DO
RETURN
END SUBROUTINE brlxq
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BRLXS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE brlxs( nx,ny,nz, s, s0,sdt,bcrlx, tinc, rhostr, srlx, & 8,2
tem1, tem2, tem3 )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the boundary relaxation and computational mixing term
! for a scalar 's' in the boundary zone.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 8/15/95
!
! MODIFICATION HISTORY:
!
! 8/24/95 (M. Xue)
! Corrected a sign error in loop 60.
!
!-----------------------------------------------------------------------
!
! 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
! s A scalar whose boundary values is to be set
! s0 s at a past time
! sdt Time tendency of s
! tinc Time increment between currnet s and s0
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! OUTPUT:
!
! srlx Relaxation and spatial smoothing term in the boundary zone
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: s (nx,ny,nz) ! A scalar
REAL :: s0 (nx,ny,nz) ! s at a past time
REAL :: sdt(nx,ny,nz) ! Time tendency of s
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: tinc ! Time increment between s and s0
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: srlx(nx,ny,nz) ! Source term in qv euation
REAL :: tem1(nx,ny,nz) ! Temporary array
REAL :: tem2(nx,ny,nz) ! Temporary array
REAL :: tem3(nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Declare the external boundary fields.
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model execution
INCLUDE 'grid.inc' ! Grid parameters
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
tem1(i,j,k)=(s(i,j,k)-(s0(i,j,k)+sdt(i,j,k)*tinc))*rhostr(i,j,k)
END DO
END DO
END DO
CALL difxx
(tem1, nx,ny,nz, 2,nx-2,1,ny-1,2,nz-1, dx, tem2)
CALL difyy
(tem1, nx,ny,nz, 1,nx-1,2,ny-2,2,nz-1, dy, tem3)
DO k = 2, nz-2
DO j = 2, ny-2
DO i = 2, nx-2
srlx(i,j,k) = - cbcdmp * bcrlx(i,j) * tem1(i,j,k) &
+ cbcmixh* ( 1. + 4.*bcrlx(i,j) ) &
* ( tem2(i,j,k) + tem3(i,j,k) )
END DO
END DO
END DO
RETURN
END SUBROUTINE brlxs
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CHECKDIMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE checkdims(nx,ny,nz, nxebc,nyebc,nzebc, subname),1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Check if two sets of grid dimensions are the same.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 8/12/95
!
! 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
! nxebc nx in the external boundary condition data
! nyebc ny in the external boundary condition data
! nzebc nz in the external boundary condition data
!
! OUTPUT:
!
! None
!
!-----------------------------------------------------------------------
!
! Variable Declarations and COMMON blocks.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: nxebc,nyebc,nzebc
CHARACTER (LEN=*) :: subname
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (nxebc /= nx .OR. nyebc /= ny .OR. nzebc /= nz) THEN
WRITE (6,'(a/a/a/a,i5,a,i5,a,i5/a/a,i5,a,i5,a,i5)') &
' Array dimension(s) of the external boundary fields ', &
' inconsistent with model definitions. ', &
' Dimensions for boundary fields were', &
' nxebc = ', nxebc, ', nyebc = ', nyebc, &
', nzebc = ', nzebc, &
' and the model definitions were', &
' nx = ', nx, ', ny = ', ny, ', nz = ', nz
CALL arpsstop
('arpsstop called from checkdims',1)
END IF
RETURN
END SUBROUTINE checkdims
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SETEXBCCST ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE setexbcptr(nx,ny,nz) 3
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Set the pointers to EXBC variables in the EXBC buffer array.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 04/17/1997
!
! 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 z-direction (vertical)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number grid points in 3 directions
INTEGER :: nxy, nxyz
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
nxy = nx*ny
nxyz = nxy*nz
!
!-----------------------------------------------------------------------
!
! Pointers to previous EXBC data arrays
!
!-----------------------------------------------------------------------
!
nu0exb = 1 + 00*nxyz
nv0exb = 1 + 01*nxyz
nw0exb = 1 + 02*nxyz
npt0exb = 1 + 03*nxyz
npr0exb = 1 + 04*nxyz
nqv0exb = 1 + 05*nxyz
nqc0exb = 1 + 06*nxyz
nqr0exb = 1 + 07*nxyz
nqi0exb = 1 + 08*nxyz
nqs0exb = 1 + 09*nxyz
nqh0exb = 1 + 10*nxyz
!
!-----------------------------------------------------------------------
!
! Pointers to previous EXBC time tendency arrays
!
!-----------------------------------------------------------------------
!
nudtexb = 1 + 11*nxyz
nvdtexb = 1 + 12*nxyz
nwdtexb = 1 + 13*nxyz
nptdtexb = 1 + 14*nxyz
nprdtexb = 1 + 15*nxyz
nqvdtexb = 1 + 16*nxyz
nqcdtexb = 1 + 17*nxyz
nqrdtexb = 1 + 18*nxyz
nqidtexb = 1 + 19*nxyz
nqsdtexb = 1 + 20*nxyz
nqhdtexb = 1 + 21*nxyz
RETURN
END SUBROUTINE setexbcptr