!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVUVW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
SUBROUTINE advuvw(nx,ny,nz,u,v,w,wcont,rhostr,ubar,vbar, mapfct, & 1,4
uforce,vforce,wforce,uadv,vadv,wadv, &
ustr,vstr,wstr,tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinates the calculation of the advection terms uadv, vadv and
! wadv of the u, v and w equations. These terms are written in
! equivalent advection form.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift.
!
! 4/9/93 (M. Xue & K. Brewster)
! Some index bounds for operators and loop bounds were corrected.
! Redundant calculations were done before at the boundaries that
! caused out-of-bound calculations, which should not have
! affected the results in normal situations though.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 2/9/94 (D. Jahn)
! Add tem3 work array in conjunction w/ changes to advu,advv,
! advw, and advcts.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 11/06/97 (D. Weber)
! Added three additional levels to the mapfct array. The three
! levels (4,5,6) represent the inverse of the first three in order.
! The inverse map factors are computed to improve efficiency.
!
! 9/11/98 (D. Weber)
! Removed most single operation loops and merged the advection
! contributions into the forcing arrays prior to the return.
!
!-----------------------------------------------------------------------
!
! 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
!
! mapfct Map factors at scalar, u and v points
!
! u x component of velocity at all time levels (m/s)
! v y component of velocity at all time levels (m/s)
! w Vertical component of velocity in Cartesian
! coordinates at all time levels (m/s).
! wcont Contravariant vertical velocity (m/s)
! rhostr Base state density rhobar times j3 (kg/m**3)
! ubar Base state x component of velocity (m/s)
! vbar Base state y component of velocity (m/s)
!
! OUTPUT:
!
! uadv u-equation advection terms (kg/m**3)*(m/s)/s
! vadv v-equation advection terms (kg/m**3)*(m/s)/s
! wadv w-equation advection terms (kg/m**3)*(m/s)/s
!
! WORK ARRAYS:
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: uadv (nx,ny,nz) ! u-eqn advection terms
! (kg/m**3)*(m/s)/s
REAL :: vadv (nx,ny,nz) ! v-eqn advection terms
! (kg/m**3)*(m/s)/s
REAL :: wadv (nx,ny,nz) ! w-eqn advection terms
! (kg/m**3)*(m/s)/s
REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
! uforce= -uadv + umix + ucorio
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (kg/(m*s)**2)
! vforce= -vadv + vmix + vcorio
REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in w-momentum equation (kg/(m*s)**2)
! wforce= -wadv + wmix + wbuoy
REAL :: ustr (nx,ny,nz) ! u * rhostr
REAL :: vstr (nx,ny,nz) ! v * rhostr
REAL :: wstr (nx,ny,nz) ! w * rhostr
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
REAL :: tema
INTEGER :: tlevel
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
tlevel=tpresent
!
!-----------------------------------------------------------------------
!
! Calculate ustr=rhostr*u, vstr=rhostr*v, wstr=rhostr*w
!
!-----------------------------------------------------------------------
!
CALL uvwrho
(nx,ny,nz,u(1,1,1,tlevel),v(1,1,1,tlevel), &
wcont,rhostr, &
ustr,vstr,wstr)
!
!-----------------------------------------------------------------------
!
! Calculate uadv:
!
!-----------------------------------------------------------------------
!
CALL advu
(nx,ny,nz, u,v,w, &
ustr,vstr,wstr, ubar, mapfct(1,1,2), uadv, uforce, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! Calculate vadv:
!
!-----------------------------------------------------------------------
!
CALL advv
(nx,ny,nz, u,v,w, &
ustr,vstr,wstr, vbar, mapfct(1,1,3), vadv, vforce, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! Calculate wadv:
!
!-----------------------------------------------------------------------
!
CALL advw
(nx,ny,nz, u,v,w, &
ustr,vstr,wstr, mapfct(1,1,1), wadv, wforce, &
tem1,tem2,tem3)
RETURN
END SUBROUTINE advuvw
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advp(nx,ny,nz,pprt,u,v,w,wcont,rhostr, mapfct, & 1,1
j3,aj3x,aj3y,aj3z, &
padv, &
uj3,vj3,wj3,tem1,tem2,tem3,tem4,mp_tem)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the advection of perturbation pressure.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 5/25/93 (M. Xue)
! Fixed the bug in the base state vertical pressure term.
! A j3 was missing before.
!
! 5/26/93 (M. Xue)
! Corrected pbar advection term.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 9/7/94 (M. Xue)
! This subroutine now calculates the perturbation pressure advection
! only, by calling subroutine ADVCTS.
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 9/18/98 (D. Weber)
! Added aj3x,y,z 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
!
! pprt Perturbation pressure at all time levels (Pascal)
! u x component of velocity at all time levels (m/s)
! v y component of velocity at all time levels (m/s)
! w Vertical component of velocity in Cartesian
! coordinates at al time levels (m/s).
! wcont Contravariant vertical velocity (m/s)
!
! rhostr Base state air density (kg/m**3)
!
! mapfct Map factors at scalar points
!
! aj3x Avgx of the coordinate transformation Jacobian d(zp)/dz
! aj3y Avgy of the coordinate transformation Jacobian d(zp)/dz
! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz
!
! OUTPUT:
!
! padv Pressure equation advection terms (kg/(m*s**3))
!
! WORK ARRAYS:
!
! uj3 Temporary work array.
! vj3 Temporary work array.
! wj3 Temporary work array.
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! mp_tem Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure from that
! of base state atmosphere (Pascal)
REAL :: rhostr(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: mapfct(nx,ny) ! Map factors at scalar points
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ).
REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE X-DIR.
REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Y-DIR.
REAL :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL :: padv (nx,ny,nz) ! Advection term of the pressure
! equation (kg/(m*s**3)
REAL :: uj3 (nx,ny,nz) ! Temporary work array to carry u*j3
REAL :: vj3 (nx,ny,nz) ! Temporary work array to carry v*j3
REAL :: wj3 (nx,ny,nz) ! Temporary work array to carry wcont*j3
REAL :: tem1(nx,ny,nz) ! Temporary work array
REAL :: tem2(nx,ny,nz) ! Temporary work array
REAL :: tem3(nx,ny,nz) ! Temporary work array
REAL :: tem4(nx,ny,nz) ! Temporary work array
REAL :: mp_tem(MAX(nx,ny)*nz) ! Temporary message passing array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: tlevel
REAL :: tema
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
tlevel=tpresent
!
!-----------------------------------------------------------------------
!
! Advection of the perturbation pressure
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Calculate the advection of perturbation pressure.
! (j3*u*dp/dx+j3*v*dp/dy+j3*wcont*dp/dz) =
! avgx( avgx(j3) * u * difx(p) )
! + avgy( avgy(j3) * u * dify(p) )
! + avgz( avgz(j3) * wcont * difz(p) )
!
! Subroutine ADVCTS is called to evaluate this term.
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
uj3(i,j,k)=u(i,j,k,tlevel)*aj3x(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
vj3(i,j,k)=v(i,j,k,tlevel)*aj3y(i,j,k)
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
wj3(i,j,k)=wcont(i,j,k)*aj3z(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Perturbation potential temperature advection
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem4(i,j,k) = 0.0
END DO
END DO
END DO
CALL advcts
(nx,ny,nz, pprt, &
u(1,1,1,tlevel),v(1,1,1,tlevel), &
uj3,vj3,wj3,tem4, mapfct, &
padv, tem1,tem2,tem3,mp_tem)
!
!-----------------------------------------------------------------------
!
! Note that the base state pressure advection term is evaluated
! inside the small time step, therefore padv does not include
! this part on exit of this subroutine.
!
!-----------------------------------------------------------------------
!
RETURN
END SUBROUTINE advp
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVQ ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advq(nx,ny,nz,q,u,v,wcont,ustr,vstr,wstr, & 3,1
rhostr,qbar, mapfct, &
qadv, &
tem1,tem2,tem3,mp_tem)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate water/ice advection.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 05/20/92.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift and order of argument list changed.
!
! 2/9/94 (D. Jahn)
! Add tem3 to the call of advcts.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 9/28/98 (Dan Weber)
! Moved u,v,wstr computations outside of this routine.
!
!-----------------------------------------------------------------------
!
! 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
!
! mapfct Map factors at scalar points
!
! q Water or ice mixing ratio (kg/kg)
!
! u x component of velocity at all time levels (m/s)
! v y component of velocity at all time levels (m/s)
! wcont Contravariant vertical velocity (m/s)
! rhostr Base state air density (kg/m**3)
! qbar Base state of water oy ice mixing ratio (kg/kg)
!
! OUTPUT:
!
! qadv Water or ice mixing ratio advection term in the
! conservation equation (kg/m**3)*(kg/kg)/s
!
! WORK ARRAYS:
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! mp_tem Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: mapfct(nx,ny) ! Map factors at scalar points
REAL :: q (nx,ny,nz,nt) ! One of the water/ice variables (kg/kg)
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: rhostr(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qbar (nx,ny,nz) ! Base state of the water/ice variable
REAL :: qadv (nx,ny,nz) ! Advection of a water/ice variable
REAL :: ustr (nx,ny,nz) ! u * rhostr
REAL :: vstr (nx,ny,nz) ! v * rhostr
REAL :: wstr (nx,ny,nz) ! w * rhostr
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
REAL :: mp_tem(MAX(nx,ny)*nz) ! Temporary message passing array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: tlevel
INTEGER :: i, j, k
REAL :: tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
tlevel=tpresent
!
!-----------------------------------------------------------------------
!
! Calculate ustr=rhostr*u, vstr=rhostr*v, wstr=rhostr*w
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Advection of the water/ice mixing ratio
!
!-----------------------------------------------------------------------
CALL advcts
(nx,ny,nz, q, &
u(1,1,1,tlevel),v(1,1,1,tlevel), &
ustr,vstr,wstr, qbar, mapfct, &
qadv, tem1,tem2,tem3,mp_tem)
RETURN
END SUBROUTINE advq
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVU ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advu(nx,ny,nz,u,v,w,ustr,vstr,wstr, ubar, mapfct, & 1,10
uadv, uforce, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the advection terms of the u-equation. These terms are
! written in equivalent advection form.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 2/9/94 (D. Jahn)
! Add 4th-order momentum advection.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 11/5/1995 (M. Xue)
! Added vertical fourth order advection for u.
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 9/1/98 (D. Weber and T. Chung)
! Removed operators and merged loops to improve code efficiency.
!
!-----------------------------------------------------------------------
!
! 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
!
! mapfct Map factors at u points
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at all time levels (m/s)
! w Vertical component of velocity in Cartesian
! coordinates at all time levels (m/s).
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! ubar Base state x component of velocity (m/s)
!
! OUTPUT:
!
! uforce Acoustically inactive forcing terms in u-momentum
! equation (kg/(m*s)**2).
!
! WORK ARRAYS:
!
! uadv u-equation advection terms (kg/m**3)*(m/s)/s
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: mapfct(nx,ny) ! Map factors at u points
REAL :: u (nx,ny,nz,nt) ! Total u-velocity at a given time level
! (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity at a given time level
! (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity at a given time level
! (m/s)
REAL :: ustr (nx,ny,nz) ! u*rhostr
REAL :: vstr (nx,ny,nz) ! v*rhostr
REAL :: wstr (nx,ny,nz) ! w*rhostr
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: uadv (nx,ny,nz) ! Advection term of the u-eq.
! (kg/m**3)*(m/s)/s
REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,onvf
INTEGER :: ibgn,iend,jbgn,jend
REAL :: vsb, vnb
REAL :: fourthirds,foursixth,onesix
REAL :: tema
INTEGER :: mptag
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'bndry.inc' ! Parameters for boundary conditions.
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
fourthirds = 4.0/3.0
foursixth = 4.0/6.0
onesix = 1.0/6.0
!-----------------------------------------------------------------------
!
! Calculate rho*u* du/dx = avgx( avgx( ustr )*difx( u ) ):
!
!-----------------------------------------------------------------------
tema = 0.25*dxinv
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
uadv(i,j,k)=tema*((ustr(i+1,j,k)+ustr(i,j,k))* &
(u(i+1,j,k,2)-u(i,j,k,2)) &
+(ustr(i,j,k)+ustr(i-1,j,k))* &
(u(i,j,k,2)-u(i-1,j,k,2)))
END DO
END DO
END DO
!call test_dump (uadv,"XXX2advu_uadv",nx,ny,nz,1,0)
!call test_dump (ustr,"XXXadvu_ustr",nx,ny,nz,1,0)
!-----------------------------------------------------------------------
!
! tem2 contains avgx((avgx(u*rho))*du/dx) (second order term)
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! If momentum advection 4th-order, calculate adjustment term:
! avg2x(avg2x(ustr)*dif2x(u))
!
!-----------------------------------------------------------------------
IF (madvopt == 2 .OR. madvopt == 3) THEN
tema = 0.25*dxinv
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
tem2(i,j,k)=tema*(ustr(i+1,j,k)+ustr(i-1,j,k))* &
(u(i+1,j,k,2)-u(i-1,j,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem2 contains avg2x(ustr)*dif2x(u)
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem2,"XXXadvct_tem2",nx,ny,nz,1,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem2,nx,ny,nz,ebc,wbc,1,mptag,tem1)
CALL mprecv2dew
(tem2,nx,ny,nz,ebc,wbc,1,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 3
iend = nx-2
jbgn = 1
jend = ny-1
IF (wbc == 0) ibgn=2
IF (wbc == 2) THEN
ibgn=2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=jbgn,jend
tem2(1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
END IF
IF (ebc == 0) iend = nx-1
IF (ebc == 2) THEN
iend = nx-1
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=jbgn,jend
tem2(nx,j,k) = tem2(3,j,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (wbc == 1) THEN
ibgn=2
DO k=2,nz-2
DO j=jbgn,jend
tem2(1,j,k) = -tem2(3,j,k)
END DO
END DO
END IF
IF (ebc == 1) THEN
iend = nx-1
DO k=2,nz-2
DO j=jbgn,jend
tem2(nx,j,k) = -tem2(nx-2,j,k)
END DO
END DO
END IF
! call test_dump (tem2,"XXXAadvct_tem2",nx,ny,nz,1,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate 2nd-order and adjusting term for 4th-order
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=jbgn,jend
DO i=ibgn,iend
uadv(i,j,k) = fourthirds*uadv(i,j,k) - &
onesix*(tem2(i+1,j,k)+tem2(i-1,j,k))
END DO
END DO
END DO
!call test_dump (uadv,"XXX1advu_uadv",nx,ny,nz,1,0)
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*v* du/dy = avgy( avgx( vstr )* dify( u ) )
!
!-----------------------------------------------------------------------
tema = 0.25*dyinv
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
tem2(i,j,k)=tema*((vstr(i,j,k)+vstr(i-1,j,k))* &
(u(i,j,k,2)-u(i,j-1,k,2)) &
+(vstr(i,j+1,k)+vstr(i-1,j+1,k))* &
(u(i,j+1,k,2)-u(i,j,k,2)))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! tem1 contains avgy( avgx( vstr )* dify( u ) ) second order term
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the adjustment term.
! avg2y( avgx( avgy (vstr) )* dif2y( u ))
!
!-----------------------------------------------------------------------
IF (madvopt == 2 .OR. madvopt == 3) THEN
DO k=2,nz-2 ! 2 bugs found here..multiply sb plus...
DO j=2,ny-2
DO i=2,nx-1
tem1(i,j,k)=0.25*((vstr(i,j+1,k)+vstr(i,j,k)) &
+(vstr(i-1,j+1,k)+vstr(i-1,j,k)))
END DO
END DO
END DO
tema = 0.5*dyinv
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
tem3(i,j,k)=tema*(u(i,j+1,k,2)-u(i,j-1,k,2))*tem1(i,j,k)
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem3 contains avgx( avgy (vstr) )* dif2y( u ))
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem3,"XXXadvct_tem3",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dns
(tem3,nx,ny,nz,nbc,sbc,0,mptag,tem1)
CALL mprecv2dns
(tem3,nx,ny,nz,nbc,sbc,0,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 2
iend = nx-1
jbgn = 3
jend = ny-3
IF (nbc == 0) jend = ny-2
IF (nbc == 2) THEN
jend = ny-2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,ny-1,k) = tem3(i,2,k)
END DO
END DO
END IF
END IF
IF (sbc == 0) jbgn = 2
IF (sbc == 2) THEN
jbgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,1,k) = tem3(i,ny-2,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (nbc == 1) THEN
jend = ny-2
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,ny-1,k) = tem3(i,ny-2,k)
END DO
END DO
END IF
IF (sbc == 1) THEN
jbgn = 2
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,1,k) = tem3(i,2,k)
END DO
END DO
END IF
! call test_dump (tem3,"XXXAadvct_tem3",nx,ny,nz,0,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! concatenate 2nd-order and adjusting term for 4th-order
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=jbgn,jend
DO i=ibgn,iend
tem2(i,j,k) = fourthirds*tem2(i,j,k) - &
onesix*(tem3(i,j+1,k)+tem3(i,j-1,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*v* du/dy on the north and south boundaries using
! one sided advection.
!
!-----------------------------------------------------------------------
!call test_dump (vstr,"XXXadvu_vstr",nx,ny,nz,1,0)
!call test_dump (u,"XXXadvu_u",nx,ny,3*nz,1,0)
!call test_dump (ubar,"XXXadvu_ubar",nx,ny,nz,1,0)
DO k=2,nz-2
DO i=2,nx-1
vsb=(vstr(i-1,1,k)+vstr(i-1,2,k) &
+vstr(i,1,k)+vstr(i,2,k))*0.25
vnb=(vstr(i-1,ny-1,k)+vstr(i-1,ny,k) &
+vstr(i,ny-1,k)+vstr(i,ny,k))*0.25
IF (vsb < 0.0) THEN
tem2(i,1,k)=vsb*(u(i,2,k,tpresent)-u(i,1,k,tpresent))*dyinv
ELSE
tem2(i,1,k)= rlxlbc* vsb*(u(i,1,k,tpast)-ubar(i,1,k))*dyinv
END IF
IF (vnb > 0.0) THEN
tem2(i,ny-1,k)=vnb* &
(u(i,ny-1,k,tpresent)-u(i,ny-2,k,tpresent))*dyinv
ELSE
tem2(i,ny-1,k)=-rlxlbc*vnb* &
(u(i,ny-1,k,tpast)-ubar(i,ny-1,k))*dyinv
END IF
END DO
END DO
!-----------------------------------------------------------------------
!
! Add the u-equation horizontal advection terms, rho*u*du/dx (uadv) and
! rho*v*du/dy (tem1).
!
!-----------------------------------------------------------------------
!call test_dump (uforce,"XXXBadvu_uforce",nx,ny,nz,1,0)
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
uforce(i,j,k)=uforce(i,j,k) - &
(uadv(i,j,k)+tem2(i,j,k)) * mapfct(i,j)
END DO
END DO
END DO
!call test_dump (uforce,"XXXadvu_uforce",nx,ny,nz,1,0)
!call test_dump (uadv,"XXXadvu_uadv",nx,ny,nz,1,0)
!call test_dump (tem2,"XXXadvu_tem2",nx,ny,nz,1,0)
!call test_dump (mapfct,"XXXadvu_mapfct",nx,ny,1,1,0)
!-----------------------------------------------------------------------
!
! Calculate rho*w* du/dz = avgz( avgx( wstr ) * difz ( u ) )
!
!-----------------------------------------------------------------------
tema=0.5*dzinv
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem2(i,j,k)=tema*(wstr(i,j,k)+wstr(i-1,j,k))* &
(u(i,j,k,2)-u(i,j,k-1,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! tem2 contains avgz( avgx( wstr ) * difz ( u ) )
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the fourth order
! contribution avg2z( avgz( avgx (wstr) )* dif2z( u ))
!
!-----------------------------------------------------------------------
IF (madvopt == 3) THEN
tema = 0.125*dzinv
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
tem3(i,j,k)=tema*((wstr(i,j,k+1)+wstr(i-1,j,k+1))+ &
(wstr(i,j,k)+wstr(i-1,j,k))) * &
(u(i,j,k+1,2)-u(i,j,k-1,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Add the fourth order adjustment term to the 2nd order term
! and add the u-equation vertical advection term to the
! horizontal advection terms.
!
!-----------------------------------------------------------------------
DO k=3,nz-3
DO j=1,ny-1
DO i=2,nx-1
uforce(i,j,k) = uforce(i,j,k) - &
foursixth*(tem2(i,j,k)+tem2(i,j,k+1)) + &
onesix*(tem3(i,j,k+1)+tem3(i,j,k-1))
END DO
END DO
END DO
!call test_dump (uforce,"XXX1advu_uforce",nx,ny,nz,1,0)
!call test_dump (tem2,"XXX1advu_tem2",nx,ny,nz,1,0)
!call test_dump (tem3,"XXX1advu_tem3",nx,ny,nz,1,0)
DO k=2,nz-2,nz-4
DO j=1,ny-1
DO i=2,nx-1
uforce(i,j,k)=uforce(i,j,k)-(tem2(i,j,k+1)+tem2(i,j,k))*0.5
END DO
END DO
END DO
!call test_dump (uforce,"XXX2advu_uforce",nx,ny,nz,1,0)
ELSE ! perform second order advection....
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
uforce(i,j,k)=uforce(i,j,k)-(tem2(i,j,k+1)+tem2(i,j,k))*0.5
END DO
END DO
END DO
!call test_dump (uforce,"XXX3advu_uforce",nx,ny,nz,1,0)
END IF
RETURN
END SUBROUTINE advu
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVV ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advv(nx,ny,nz,u,v,w,ustr,vstr,wstr, vbar, mapfct, & 1,10
vadv, vforce, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the advection terms of the v-equation. These terms are
! written in equivalent advection form.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift.
!
! 4/9/93 (M. Xue & K. Brewster)
! Some index bounds for operators and loop bounds were corrected.
! Redundant calculations were done before at the boundaries that
! caused out-of-bound calculations, which should not have
! affected the results in normal situations though.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 2/9/94 (D. Jahn)
! Add 4th-order momentum advection.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 11/5/1995 (M. Xue)
! Added vertical fourth order advection for v.
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 9/1/98 (D. Weber and T. Chung)
! Removed operators and merged loops to improve code efficiency.
!
!-----------------------------------------------------------------------
!
! 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
!
! mapfct Map factors at v points
!
! v y component of velocity at a given time level (m/s)
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! vbar Base state y component of velocity (m/s)
!
! OUTPUT:
!
! vforce Acoustically inactive forcing terms in v-momentum
! equation (kg/(m*s)**2).
!
! WORK ARRAYS:
!
! vadv v equation advection terms (kg/m**3)*(m/s)/s
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INCLUDE 'timelvls.inc'
REAL :: mapfct(nx,ny) ! Map factors at v points
REAL :: u (nx,ny,nz,nt) ! Total u-velocity at a given time level
! (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity at a given time level
! (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity at a given time level
! (m/s)
REAL :: ustr (nx,ny,nz) ! u*rhostr
REAL :: vstr (nx,ny,nz) ! v*rhostr
REAL :: wstr (nx,ny,nz) ! w*rhostr
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: vadv (nx,ny,nz) ! Advection term of the v-eq.
! (kg/m**3)*(m/s)/s
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (kg/(m*s)**2)
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,onvf
INTEGER :: ibgn,iend,jbgn,jend
REAL :: ueb, uwb
REAL :: fourthirds,foursixth,onesix
REAL :: tema
REAL :: temb
INTEGER :: mptag
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'bndry.inc' ! Parameters for boundary conditions.
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
fourthirds = (4.0/3.0)
foursixth = (4.0/6.0)
onesix = (1.0/6.0)
!-----------------------------------------------------------------------
!
! Calculate rho*u* dv/dx = avgx( avgy( ustr ) * difx( v ) )
!
!-----------------------------------------------------------------------
tema = 0.25*dxinv
DO k=2,nz-1
DO j=2,ny-1
DO i=2,nx-2
vadv(i,j,k)=tema*((ustr(i+1,j,k)+ustr(i+1,j-1,k))* &
(v(i+1,j,k,2)-v(i,j,k,2)) &
+(ustr(i,j,k)+ustr(i,j-1,k))* &
(v(i,j,k,2)-v(i-1,j,k,2)))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the adjustment term
! avg2x( avgx(avgy(ustr))*dif2x(v) )
!
!-----------------------------------------------------------------------
IF (madvopt == 2 .OR. madvopt == 3) THEN
tema = 0.125 * dxinv
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
tem2(i,j,k)=tema*((ustr(i,j,k)+ustr(i,j-1,k)) + &
(ustr(i+1,j,k)+ustr(i+1,j-1,k))) * &
(v(i+1,j,k,2)-v(i-1,j,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem2,"XXX1advct_tem2",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem2,nx,ny,nz,ebc,wbc,0,mptag,tem1)
CALL mprecv2dew
(tem2,nx,ny,nz,ebc,wbc,0,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 3
iend = nx-3
jbgn = 2
jend = ny-1
IF (wbc == 0) ibgn = 2
IF (wbc == 2) THEN
ibgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=jbgn,jend
tem2(1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
END IF
IF (ebc == 0) iend = nx-2
IF (ebc == 2) THEN
iend = nx-2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=jbgn,jend
tem2(nx-1,j,k) = tem2(2,j,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (wbc == 1) THEN
ibgn = 2
DO k=2,nz-2
DO j=jbgn,jend
tem2(1,j,k) = tem2(2,j,k)
END DO
END DO
END IF
IF (ebc == 1) THEN
iend = nx-2
DO k=2,nz-2
DO j=jbgn,jend
tem2(nx-1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
! call test_dump (tem2,"XXX1Aadvct_tem2",nx,ny,nz,0,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate the 2nd and 4th-order terms for urho*dv/dx
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=jbgn,jend
DO i=ibgn,iend
vadv(i,j,k) = fourthirds*vadv(i,j,k) - &
onesix*(tem2(i+1,j,k)+tem2(i-1,j,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*u* dv/dx at the east and west boundaries
! using one-sided advection.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=2,ny-1
uwb=(ustr(1,j,k)+ustr(2,j,k)+ustr(1,j-1,k)+ustr(2,j-1,k))*0.25
ueb=(ustr(nx-1,j,k)+ustr(nx,j,k)+ustr(nx-1,j-1,k) &
+ustr(nx,j-1,k))*0.25
IF (uwb < 0.0) THEN
vadv(1,j,k)=uwb*(v(2,j,k,tpresent)-v(1,j,k,tpresent))*dxinv
ELSE
vadv(1,j,k)=rlxlbc*uwb*(v(1,j,k,tpast)-vbar(1,j,k))*dxinv
END IF
IF (ueb > 0.0) THEN
vadv(nx-1,j,k)=ueb* &
(v(nx-1,j,k,tpresent)-v(nx-2,j,k,tpresent))*dxinv
ELSE
vadv(nx-1,j,k)=-rlxlbc*ueb* &
(v(nx-1,j,k,tpast)-vbar(nx-1,j,k))*dxinv
END IF
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rho*v* dv/dy = avgy( avgy( vstr ) * dify( v ) )
!
!-----------------------------------------------------------------------
tema = 0.25*dyinv
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=tema*((vstr(i,j+1,k)+vstr(i,j,k))* &
(v(i,j+1,k,2)-v(i,j,k,2)) &
+(vstr(i,j,k)+vstr(i,j-1,k))* &
(v(i,j,k,2)-v(i,j-1,k,2)))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! tem2 contains avgy( avgy( vstr ) * dify( v ) ) second order term
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the adjustment term:
! avg2y (avg2y(vstr) * dif2y(v) )
!
!-----------------------------------------------------------------------
IF (madvopt == 2 .OR. madvopt == 3) THEN
tema = 0.25*dyinv
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tem3(i,j,k)=tema*(vstr(i,j+1,k)+vstr(i,j-1,k))* &
(v(i,j+1,k,2)-v(i,j-1,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem3 contains avg2y(vstr) * dif2y(v)
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem3,"XXX1advct_tem3",nx,ny,nz,2,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dns
(tem3,nx,ny,nz,nbc,sbc,2,mptag,tem1)
CALL mprecv2dns
(tem3,nx,ny,nz,nbc,sbc,2,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 1
iend = nx-1
jbgn = 3
jend = ny-2
IF (nbc == 0) jend = ny-1
IF (nbc == 2) THEN
jend = ny-1
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,ny,k) = tem3(i,3,k)
END DO
END DO
END IF
END IF
IF (sbc == 0) jbgn = 2
IF (sbc == 2) THEN
jbgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,1,k) = tem3(i,ny-2,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (nbc == 1) THEN
jend = ny-1
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,ny,k) = -tem3(i,ny-2,k)
END DO
END DO
END IF
IF (sbc == 1) THEN
jbgn = 2
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,1,k) = -tem3(i,3,k)
END DO
END DO
END IF
! call test_dump (tem3,"XXX1Aadvct_tem3",nx,ny,nz,2,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate the 2nd- and 4th-order terms: vstr*dv/dy
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=jbgn,jend
DO i=ibgn,iend
tem2(i,j,k) = fourthirds*tem2(i,j,k) - &
onesix*(tem3(i,j+1,k)+tem3(i,j-1,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Sum the x and y contributions to v advection
! At this point tem1 contains the y contribution to the v advection
!
!-----------------------------------------------------------------------
!
! Add the v-equation horizontal advection terms, rho*u*dv/dx (vadv) and
! rho*v*dv/dy (tem1).
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vforce(i,j,k)=vforce(i,j,k) - &
(vadv(i,j,k)+tem2(i,j,k)) * mapfct(i,j)
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rho*w* dv/dz = avgz( avgy( wstr ) * difz( v ) )
!
!-----------------------------------------------------------------------
tema = 0.5*dzinv
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=tema*(wstr(i,j,k)+wstr(i,j-1,k))* &
(v(i,j,k,2)-v(i,j,k-1,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! tem2 contains avgz( avgy( wstr ) * difz( v ) )
!
!-----------------------------------------------------------------------
IF (madvopt == 3) THEN
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the adjustment term.
! avg2z( avgz( avgy (wstr) )* dif2z( v ))
!
!-----------------------------------------------------------------------
tema = 0.125 * dzinv
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tem3(i,j,k) = tema*((wstr(i,j,k+1)+wstr(i,j-1,k+1))+ &
(wstr(i,j,k)+wstr(i,j-1,k))) * &
(v(i,j,k+1,2)-v(i,j,k-1,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Add the fourth order contribution to the 2nd order term and
! add the v-equation vertical advection term rho*w*dv/dz (tem1) to
! the horizontal advection terms.
!
!-----------------------------------------------------------------------
DO k=3,nz-3
DO j=2,ny-1
DO i=1,nx-1
vforce(i,j,k) = vforce(i,j,k) - &
foursixth*(tem2(i,j,k+1)+tem2(i,j,k)) + &
onesix*(tem3(i,j,k+1)+tem3(i,j,k-1))
END DO
END DO
END DO
DO k=2,nz-2,nz-4
DO j=2,ny-1
DO i=1,nx-1
vforce(i,j,k)=vforce(i,j,k) - (tem2(i,j,k+1)+tem2(i,j,k))*0.5
END DO
END DO
END DO
ELSE ! perform second order advection...
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vforce(i,j,k)=vforce(i,j,k) - (tem2(i,j,k+1)+tem2(i,j,k))*0.5
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE advv
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advw(nx,ny,nz,u,v,w,ustr,vstr,wstr, mapfct, & 1,10
wadv, wforce, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!
! Calculate the advection terms of the w-equation. These terms are
! written in equivalent advection form.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift.
!
! 4/9/93 (M. Xue & K. Brewster)
! Some index bounds for operators and loop bounds were corrected.
! Redundant calculations were done before at the boundaries that
! caused out-of-bound calculations, which should not have
! affected the results in normal situations though.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 2/9/94 (D. Jahn)
! Add 4th-order momentum advection.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 11/5/1995 (M. Xue)
! Added vertical fourth order advection for w.
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 9/1/98 (D. Weber and T. Chung)
! Removed operators and merged loops to improve code efficiency.
!
!-----------------------------------------------------------------------
!
! 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
!
! mapfct Map factors at scalar points
!
! w z component of velocity at a given time level (m/s)
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! OUTPUT:
!
! wforce Acoustically inactive forcing terms in w-momentum
! equation (kg/(m*s)**2).
!
! WORK ARRAYS:
!
! wadv Advection term in w equation (kg/m**3)*(m/s)/s
!
! 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
INCLUDE 'timelvls.inc'
REAL :: mapfct(nx,ny) ! Map factors at scalar points
REAL :: u (nx,ny,nz,nt) ! Total u-velocity at a given time level
! (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity at a given time level
! (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity at a given time level
! (m/s)
REAL :: ustr (nx,ny,nz) ! u*rhostr
REAL :: vstr (nx,ny,nz) ! v*rhostr
REAL :: wstr (nx,ny,nz) ! w*rhostr
REAL :: wadv (nx,ny,nz) ! w-eqn advection term (kg/m**3)*(m/s)/s
REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in w-momentum equation (kg/(m*s)**2)
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,onvf
INTEGER :: ibgn,iend,jbgn,jend
REAL :: ueb, uwb, vsb, vnb
REAL :: fourthirds,foursixth,onesix
REAL :: tema
REAL :: temb
INTEGER :: mptag
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'bndry.inc' ! Parameters for boundary conditions.
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
fourthirds = (4.0/3.0)
foursixth = (4.0/6.0)
onesix = (1.0/6.0)
!
!-----------------------------------------------------------------------
!
! Calculate rho*u* dw/dx = avgx( avgz( ustr ) * difx( w ) )
!
!-----------------------------------------------------------------------
tema = 0.25 * dxinv
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-2
wadv(i,j,k)=tema*((ustr(i+1,j,k)+ustr(i+1,j,k-1))* &
(w(i+1,j,k,2)-w(i,j,k,2)) &
+(ustr(i,j,k)+ustr(i,j,k-1))* &
(w(i,j,k,2)-w(i-1,j,k,2)))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point wadv contains avgx(avgz(u*rho)*dw/dx)
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the 4th-order
! adjustment term for ustr*dw/dx:
! avg2x( avgx(avgz(ustr)) * dif2x(w) )
!
!-----------------------------------------------------------------------
IF (madvopt == 2 .OR. madvopt == 3) THEN
tema = 0.125 * dxinv
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-2
tem2(i,j,k)=tema*((ustr(i,j,k-1)+ustr(i,j,k)) + &
(ustr(i+1,j,k-1)+ustr(i+1,j,k))) * &
(w(i+1,j,k,2)-w(i-1,j,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem2 contains avgxz(ustr)*dw/dx
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem2,"XXX2advct_tem2",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem2,nx,ny,nz,ebc,wbc,0,mptag,tem1)
CALL mprecv2dew
(tem2,nx,ny,nz,ebc,wbc,0,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 3
iend = nx-3
jbgn = 1
jend = ny-1
IF (ebc == 0) iend = nx-2
IF (ebc == 2) THEN
iend = nx-2
IF (mp_opt == 0) THEN
DO k=2,nz-1
DO j=jbgn,jend
tem2(nx-1,j,k) = tem2(2,j,k)
END DO
END DO
END IF
END IF
IF (wbc == 0) ibgn = 2
IF (wbc == 2) THEN
ibgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-1
DO j=jbgn,jend
tem2(1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (ebc == 1) THEN
iend = nx-2
DO k=2,nz-1
DO j=jbgn,jend
tem2(nx-1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
IF (wbc == 1) THEN
ibgn = 2
DO k=2,nz-1
DO j=jbgn,jend
tem2(1,j,k) = tem2(2,j,k)
END DO
END DO
END IF
! call test_dump (tem2,"XXX2Aadvct_tem2",nx,ny,nz,0,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate the 2nd- and 4th-order terms.
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=jbgn,jend
DO i=ibgn,iend
wadv(i,j,k) = fourthirds*wadv(i,j,k)- &
onesix*(tem2(i+1,j,k)+tem2(i-1,j,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*u* dw/dx on the east and west boundaries
! using one-sided advection.
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
uwb=(ustr(1,j,k)+ustr(2,j,k)+ustr(1,j,k-1)+ustr(2,j,k-1))*0.25
ueb=(ustr(nx-1,j,k)+ustr(nx,j,k)+ustr(nx-1,j,k-1) &
+ustr(nx,j,k-1))*0.25
IF (uwb < 0.0) THEN
wadv(1,j,k)=uwb*(w(2,j,k,tpresent)-w(1,j,k,tpresent))*dxinv
ELSE
wadv(1,j,k)=rlxlbc*uwb*w(1,j,k,tpast)*dxinv
END IF
IF (ueb > 0.0) THEN
wadv(nx-1,j,k)=ueb* &
(w(nx-1,j,k,tpresent)-w(nx-2,j,k,tpresent))*dxinv
ELSE
wadv(nx-1,j,k)=-rlxlbc*ueb*w(nx-1,j,k,tpast)*dxinv
END IF
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rho*v* dw/dy = avgy( avgz( vstr ) * dify ( w ) )
!
!-----------------------------------------------------------------------
tema=0.25*dyinv
DO k=2,nz-1
DO j=2,ny-2
DO i=1,nx-1
tem2(i,j,k)=tema*((vstr(i,j+1,k)+vstr(i,j+1,k-1)) * &
(w(i,j+1,k,2)-w(i,j,k,2)) &
+(vstr(i,j,k)+vstr(i,j,k-1)) * &
(w(i,j,k,2)-w(i,j-1,k,2)))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem2 contains avgz(v*rho)*dw/dy second order term
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! For 4th-order momentum advection, calculate the adjustment
! term for vstr*dw/dy:
! avg2y( avgz(avgy(vstr)) * dif2y(w) )
!
!-----------------------------------------------------------------------
IF (madvopt == 2 .OR. madvopt == 3) THEN
tema = 0.125*dyinv
DO k=2,nz-1
DO j=2,ny-2
DO i=1,nx-1
tem3(i,j,k)=tema*((vstr(i,j+1,k)+vstr(i,j,k)) + &
(vstr(i,j+1,k-1)+vstr(i,j,k-1))) * &
(w(i,j+1,k,2)-w(i,j-1,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem3 contains avgyz(vstr)*dw/dy
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem3,"XXX2advct_tem3",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dns
(tem3,nx,ny,nz,nbc,sbc,0,mptag,tem1)
CALL mprecv2dns
(tem3,nx,ny,nz,nbc,sbc,0,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 1
iend = nx-1
jbgn = 3
jend = ny-3
IF (nbc == 0) jend = ny-2
IF (nbc == 2) THEN
jend = ny-2
IF (mp_opt == 0) THEN
DO k=2,nz-1
DO i=ibgn,iend
tem3(i,ny-1,k) = tem3(i,2,k)
END DO
END DO
END IF
END IF
IF (sbc == 0) jbgn = 2
IF (sbc == 2) THEN
jbgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-1
DO i=ibgn,iend
tem3(i,1,k)=tem3(i,ny-2,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (nbc == 1) THEN
jend = ny-2
DO k=2,nz-1
DO i=ibgn,iend
tem3(i,ny-1,k) = tem3(i,ny-2,k)
END DO
END DO
END IF
IF (sbc == 1) THEN
jbgn = 2
DO k=2,nz-1
DO i=ibgn,iend
tem3(i,1,k)=tem3(i,2,k)
END DO
END DO
END IF
! call test_dump (tem3,"XXX2Aadvct_tem3",nx,ny,nz,0,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate the 2nd- and 4th- order terms.
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=jbgn,jend
DO i=ibgn,iend
tem2(i,j,k) = fourthirds*tem2(i,j,k) - &
onesix*(tem3(i,j+1,k)+tem3(i,j-1,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*v* dw/dy on the north and south boundaries
! using one-sided advection.
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO i=1,nx-1
vsb=(vstr(i,1,k)+vstr(i,2,k)+vstr(i,1,k-1)+vstr(i,2,k-1))*0.25
vnb=(vstr(i,ny-1,k)+vstr(i,ny,k)+vstr(i,ny-1,k-1) &
+vstr(i,ny,k-1))*0.25
IF (vsb < 0.0) THEN
tem2(i,1,k)=vsb*(w(i,2,k,tpresent)-w(i,1,k,tpresent))*dyinv
ELSE
tem2(i,1,k)=rlxlbc*vsb*w(i,1,k,tpast)*dyinv
END IF
IF (vnb > 0.0) THEN
tem2(i,ny-1,k)=vnb* &
(w(i,ny-1,k,tpresent)-w(i,ny-2,k,tpresent))*dyinv
ELSE
tem2(i,ny-1,k)=-rlxlbc*vnb*w(i,ny-1,k,tpast)*dyinv
END IF
END DO
END DO
!-----------------------------------------------------------------------
!
! Add the w-equation horizontal advection terms, rho*u*dw/dx (wadv) and
! rho*v*dw/dy (tem1).
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wforce(i,j,k)=wforce(i,j,k) - &
(wadv(i,j,k)+tem2(i,j,k)) * mapfct(i,j)
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rho*w* dw/dz = avgz( avgz( wstr ) * difz( w ) )
!
!-----------------------------------------------------------------------
tema = 0.5*dzinv
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=tema*(wstr(i,j,k+1)+wstr(i,j,k))* &
(w(i,j,k+1,2)-w(i,j,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! tem2 contains avgz(w*rho)*dw/dz
!
!-----------------------------------------------------------------------
IF (madvopt == 3) THEN
!-----------------------------------------------------------------------
!
! If momentum advection 4th-order, calculate adjustment term:
! avg2z(avg2z(wstr)*dif2z(w))
!
!-----------------------------------------------------------------------
tema = 0.25*dzinv
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=tema*(wstr(i,j,k+1)+wstr(i,j,k-1))* &
(w(i,j,k+1,2)-w(i,j,k-1,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Add the fourth order contribution to the 2nd order term and
! add the w-equation vertical advection term rho*w*dw/dz (tem1)
! to the horizontal advection terms.
!
!-----------------------------------------------------------------------
DO k=3,nz-2
DO j=1,ny-1
DO i=1,nx-1
wforce(i,j,k) = wforce(i,j,k) - &
foursixth*(tem1(i,j,k-1)+tem1(i,j,k)) + &
onesix*(tem2(i,j,k+1)+tem2(i,j,k-1))
END DO
END DO
END DO
DO k=2,nz-1,nz-3
DO j=1,ny-1
DO i=1,nx-1
wforce(i,j,k)=wforce(i,j,k) - (tem1(i,j,k)+tem1(i,j,k-1))*0.5
END DO
END DO
END DO
ELSE ! perform second order advection....
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wforce(i,j,k)=wforce(i,j,k) - (tem1(i,j,k)+tem1(i,j,k-1))*0.5
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE advw
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVPT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advpt(nx,ny,nz,ptprt,u,v,w,wcont, & 1,2
rhostr,ptbar, mapfct,j3,j3inv, &
ptadv, &
ustr,vstr,wstr,tem1,tem2,tem3,tem4,mp_tem)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the advection of total potential temperature
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 5/29/92 (K. Brewster)
! Further facelift and order of argument list changed.
!
! 4/10/93 (M. Xue & Hao Jin)
! Added the terrain.
!
! 5/26/93 (M. Xue)
! Corrected ptbar advection term and added w and j3 into the
! argument list.
!
! 9/4/94 (D. Jahn)
! Add tem4 to the call of advcts.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 3/8/96 (Ming Xue)
! Fixed a bug in DO 510 i=1,nx-1, which was written as DO 510 i=i,nx-1.
! Effectively, the vertical advection remained 2nd order with the error.
!
! 9/1/98 (D. Weber and T. Chung)
! Removed operators and merged loops to improve code efficiency.
!
!-----------------------------------------------------------------------
!
! 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 at all time levels
! (K)
! u x component of velocity at all time levels (m/s)
! v y component of velocity at all time levels (m/s)
! w Vertical component of velocity in Cartesian
! coordinates at all time levels (m/s).
! wcont Contravariant vertical velocity (m/s)
! rhostr Base state air density (kg/m**3)
! ptbar Base state potential temperature (K)
!
! mapfct Map factors at scalar points
!
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! OUTPUT:
!
! ptadv Advection term of potential temperature eqn
! (kg/m**3)*K/s
!
! WORK ARRAYS:
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! mp_tem Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INCLUDE 'timelvls.inc'
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: rhostr(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: mapfct(nx,ny) ! Map factors at scalar points
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/d(z)
REAL :: j3inv (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/d(z)
REAL :: ptadv(nx,ny,nz) ! Potential temperature advection
REAL :: ustr (nx,ny,nz) ! u * rhostr
REAL :: vstr (nx,ny,nz) ! v * rhostr
REAL :: wstr (nx,ny,nz) ! w * rhostr
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
REAL :: tem4 (nx,ny,nz) ! Temporary work array
REAL :: mp_tem(MAX(nx,ny)*nz) ! Temporary message passing array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,onvf,tlevel
REAL :: tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'bndry.inc' ! Parameters for boundary conditions.
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
tlevel=tpresent
!
!-----------------------------------------------------------------------
!
! Calculate ustr=rhostr*u, vstr=rhostr*v, wstr=rhostr*w
!
!-----------------------------------------------------------------------
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
ustr(i,j,k)=u(i,j,k,tlevel)*tem1(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
vstr(i,j,k)=v(i,j,k,tlevel)*tem2(i,j,k)
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
wstr(i,j,k)=wcont(i,j,k)*tem3(i,j,k)
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Perturbation potential temperature advection
!
!-----------------------------------------------------------------------
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem3(i,j,k) = 0.0
END DO
END DO
END DO
CALL advcts
(nx,ny,nz, ptprt, &
u(1,1,1,tlevel),v(1,1,1,tlevel), &
ustr,vstr,wstr,tem3, mapfct, &
ptadv, tem1,tem2,tem4,mp_tem)
IF( ptsmlstp == 0 ) THEN
!-----------------------------------------------------------------------
!
! Base state potential temperature advection. This term is added to
! the array ptadv to yield the total potential temperature advection.
!
! ptbar is assumed to be independent of physical x and y, therefore
! d(ptbar)/dx and d(ptbar)/dy for constant z are zero, the base state
! advection is -w*d(ptbar)/dzp = -w/j3*d(ptbar)/dz.
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k) = rhostr(i,j,k)*j3inv(i,j,k)
END DO
END DO
END DO
tema=0.5*dzinv
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=tema*(tem2(i,j,k)+tem2(i,j,k-1))*w(i,j,k,2)* &
(ptbar(i,j,k)-ptbar(i,j,k-1))
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
ptadv(i,j,k)=ptadv(i,j,k)+0.5*(tem1(i,j,k+1)+tem1(i,j,k))
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE advpt
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ADVCTS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE advcts(nx,ny,nz,s,u,v,ustr,vstr,wstr,sbar, mapfct, & 3,10
sadv, &
tem1,tem2,tem3,mp_tem)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the scalar equation advection terms. These terms are
! written in equivalent advection form.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/20/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (M. Xue)
! Added full documentation.
!
! 4/9/93 (M. Xue & K. Brewster)
! Some index bounds for operators and loop bounds were corrected.
! Redundant calculations were done before at the boundaries that
! caused out-of-bound calculations, which should not have
! affected the results in normal situations though.
!
! 5/29/92 (K. Brewster)
! Further facelift.
!
! 2/9/94 (D. Jahn)
! Add 4th-order momentum advection.
!
! 9/1/94 (D. Weber & Y. Lu)
! Cleaned up documentation
!
! 11/5/1995 (M. Xue)
! Added vertical fourth order advection for scalars.
!
! 1/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 3/8/96 (Ming Xue)
! Fixed a bug in DO 510 i=1,nx-1, which was written as DO 510 i=i,nx-1.
! Effectively, the vertical advection remained 2nd order with the error.
!
! 9/1/98 (D. Weber and T. Chung)
! Removed operators and merged loops to improve code efficiency.
!
!-----------------------------------------------------------------------
!
! 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
!
! mapfct Map factors at scalar points
!
! s scalar field at a given time level (scalar units)
!
! ustr u * rhostr
! vstr v * rhostr
! wstr w * rhostr
!
! OUTPUT:
!
! sadv Advection term in scalar equation (kg/m**3)*scalar
! unit/s
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
! mp_tem Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INCLUDE 'timelvls.inc'
REAL :: mapfct(nx,ny) ! Map factors at scalar points
REAL :: s (nx,ny,nz,nt) ! a scalar field to be advected.
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: ustr (nx,ny,nz) ! u * rhostr
REAL :: vstr (nx,ny,nz) ! v * rhostr
REAL :: wstr (nx,ny,nz) ! w * rhostr
REAL :: sbar (nx,ny,nz) ! A state of 's' towards which 's' is
! relaxed on the inflow boundaries.
REAL :: sadv (nx,ny,nz) ! advection term in scalar equation
! (kg/m**3)*(scalar units)/s
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
REAL :: mp_tem(MAX(nx,ny)*nz) ! Temporary message passing array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,onvf
INTEGER :: ibgn,iend,jbgn,jend
REAL :: ueb, uwb, vsb, vnb
REAL :: fourthirds,foursixth,onesix
REAL :: tema
INTEGER :: mptag
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Physical constants
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'bndry.inc' ! Parameters for boundary conditions.
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
fourthirds = (4.0/3.0)
foursixth = (4.0/6.0)
onesix = (1.0/6.0)
!-----------------------------------------------------------------------
!
! Calculate rho*u* ds/dx = avgx( ustr * difx ( s ) )
!
!-----------------------------------------------------------------------
tema = dxinv*0.5
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-2
sadv(i,j,k)=tema*((s(i,j,k,2)-s(i-1,j,k,2))*ustr(i,j,k) &
+(s(i+1,j,k,2)-s(i,j,k,2))*ustr(i+1,j,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! For 4th-order scalar advection, calculate the 4th-order
! adjustment term for ustr*ds/dx:
! avg2x( avgx(ustr) * dif2x(s) )
!
!-----------------------------------------------------------------------
IF (sadvopt == 2.OR.sadvopt == 3) THEN
tema = 0.25*dxinv
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-2
tem2(i,j,k)=tema*(ustr(i+1,j,k)+ustr(i,j,k))* &
(s(i+1,j,k,2)-s(i-1,j,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem2,"XXX3advct_tem2",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem2,nx,ny,nz,ebc,wbc,0,mptag,tem1)
CALL mprecv2dew
(tem2,nx,ny,nz,ebc,wbc,0,mptag,tem1)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 3
iend = nx-3
jbgn = 1
jend = ny-1
IF (ebc == 0) iend = nx-2
IF (ebc == 2) THEN
iend = nx-2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=jbgn,jend
tem2(nx-1,j,k) = tem2(2,j,k)
END DO
END DO
END IF
END IF
IF (wbc == 0) ibgn = 2
IF (wbc == 2) THEN
ibgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=jbgn,jend
tem2(1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (ebc == 1) THEN
iend = nx-2
DO k=2,nz-2
DO j=jbgn,jend
tem2(nx-1,j,k) = tem2(nx-2,j,k)
END DO
END DO
END IF
IF (wbc == 1) THEN
ibgn = 2
DO k=2,nz-2
DO j=jbgn,jend
tem2(1,j,k) = tem2(2,j,k)
END DO
END DO
END IF
! call test_dump (tem2,"XXX3Aadvct_tem2",nx,ny,nz,0,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate the 2nd- and 4th- order terms for ustr*ds/dx
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=jbgn,jend
DO i=ibgn,iend
sadv(i,j,k) = fourthirds*sadv(i,j,k) - &
onesix*(tem2(i+1,j,k)+tem2(i-1,j,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*u* ds/dx on the east and west boundaries
! using one-sided advection.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=1,ny-1
uwb=(ustr(1,j,k)+ustr(2,j,k))*0.5
ueb=(ustr(nx-1,j,k)+ustr(nx,j,k))*0.5
IF (uwb < 0.0) THEN
sadv(1,j,k)=uwb*(s(2,j,k,tpresent)-s(1,j,k,tpresent))*dxinv
ELSE
sadv(1,j,k)=rlxlbc*uwb*(s(1,j,k,tpast)-sbar(1,j,k))*dxinv
END IF
IF (ueb > 0.0) THEN
sadv(nx-1,j,k)=ueb* &
(s(nx-1,j,k,tpresent)-s(nx-2,j,k,tpresent))*dxinv
ELSE
sadv(nx-1,j,k)=-rlxlbc*ueb* &
(s(nx-1,j,k,tpast)-sbar(nx-1,j,k))*dxinv
END IF
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rho*v* ds/dy = avgy( vstr * dify( s ) )
!
!-----------------------------------------------------------------------
tema = 0.5*dyinv
DO k=2,nz-2
DO j=2,ny-2
DO i=1,nx-1
tem1(i,j,k)=tema*((s(i,j,k,2)-s(i,j-1,k,2))*vstr(i,j,k) &
+(s(i,j+1,k,2)-s(i,j,k,2))*vstr(i,j+1,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! For 4th-order scalar advection, calculate the 4th-order
! adjustment term for vstr*ds/dy:
! avg2y( avgy(vstr) * dif2y(s) )
!
!-----------------------------------------------------------------------
IF (sadvopt == 2.OR.sadvopt == 3) THEN
tema = 0.25*dyinv
DO k=2,nz-2
DO j=2,ny-2
DO i=1,nx-1
tem3(i,j,k)=tema*(vstr(i,j+1,k)+vstr(i,j,k))* &
(s(i,j+1,k,2)-s(i,j-1,k,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! In the case of periodic boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
! call test_dump (tem3,"XXX3advct_tem3",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dns
(tem3,nx,ny,nz,nbc,sbc,0,mptag,mp_tem)
CALL mprecv2dns
(tem3,nx,ny,nz,nbc,sbc,0,mptag,mp_tem)
END IF
CALL acct_interrupt
(bc_acct)
ibgn = 1
iend = nx-1
jbgn = 3
jend = ny-3
IF (nbc == 0) jend = ny-2
IF (nbc == 2) THEN
jend = ny-2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,ny-1,k) = tem3(i,2,k)
END DO
END DO
END IF
END IF
IF (sbc == 0) jbgn = 2
IF (sbc == 2) THEN
jbgn = 2
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,1,k) = tem3(i,ny-2,k)
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! In the case of rigid boundary condition, need to calculate
! the 4th-order term for one additional point near boundary.
!
!-----------------------------------------------------------------------
IF (nbc == 1) THEN
jend = ny-2
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,ny-1,k) = tem3(i,ny-2,k)
END DO
END DO
END IF
IF (sbc == 1) THEN
jbgn = 2
DO k=2,nz-2
DO i=ibgn,iend
tem3(i,1,k) = tem3(i,2,k)
END DO
END DO
END IF
! call test_dump (tem3,"XXX3Aadvct_tem3",nx,ny,nz,0,0) ! k=1,nz-1 not set
CALL acct_stop_inter
!-----------------------------------------------------------------------
!
! Concatenate the 2nd- and 4th-order terms for vstr*ds/dy.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=jbgn,jend
DO i=ibgn,iend
tem1(i,j,k) = fourthirds*tem1(i,j,k) - &
onesix*(tem3(i,j+1,k)+tem3(i,j-1,k))
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Calculate rho*v* ds/dy on the north and south boundaries
! using one-sided advection.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO i=1,nx-1
vsb=(vstr(i,1,k)+vstr(i,2,k))*0.5
vnb=(vstr(i,ny-1,k)+vstr(i,ny,k))*0.5
IF (vsb < 0.0) THEN
tem1(i,1,k)=vsb*(s(i,2,k,tpresent)-s(i,1,k,tpresent))*dyinv
ELSE
tem1(i,1,k)=rlxlbc*vsb*(s(i,1,k,tpast)-sbar(i,1,k))*dyinv
END IF
IF (vnb > 0.0) THEN
tem1(i,ny-1,k)=vnb* &
(s(i,ny-1,k,tpresent)-s(i,ny-2,k,tpresent))*dyinv
ELSE
tem1(i,ny-1,k)=-rlxlbc*vnb* &
(s(i,ny-1,k,tpast)-sbar(i,ny-1,k))*dyinv
END IF
END DO
END DO
!-----------------------------------------------------------------------
!
! Add the scalar equation horizontal advection terms, rho*u*ds/dx (sadv)
! and rho*v*ds/dy (tem2).
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
sadv(i,j,k)=(sadv(i,j,k)+tem1(i,j,k)) * mapfct(i,j)
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rho*w* ds/dz = avgz( wstr * difz( s ) )
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=dzinv*(s(i,j,k,2)-s(i,j,k-1,2))*wstr(i,j,k)
END DO
END DO
END DO
IF (sadvopt == 3) THEN
!-----------------------------------------------------------------------
!
! For 4th-order scalar advection, calculate the 4th-order
! adjustment term for wstr*ds/dz: avg2z( avgz(wstr) * dif2z(s) )
! and combine it with the second order term.
!
! Note that we apply the 4th order scheme only upto the second point
! from the top and bottom boundary. We do not give special treatment
! to the periodic or wall boundary cases as we do for the side
! boundaries.
!
! Add the scalar equation vertical advection term rho*w*ds/dz (tem2)
! to the horizontal advection terms.
!
!-----------------------------------------------------------------------
tema = 0.25*dzinv
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=tema*(wstr(i,j,k+1)+wstr(i,j,k))* &
(s(i,j,k+1,2)-s(i,j,k-1,2))
END DO
END DO
END DO
DO k=3,nz-3
DO j=1,ny-1
DO i=1,nx-1
sadv(i,j,k) = sadv(i,j,k)+ &
foursixth*(tem1(i,j,k+1)+tem1(i,j,k)) - &
onesix*(tem3(i,j,k+1)+tem3(i,j,k-1))
END DO
END DO
END DO
DO k=2,nz-2,nz-4
DO j=1,ny-1
DO i=1,nx-1
sadv(i,j,k)= sadv(i,j,k) + (tem1(i,j,k+1)+tem1(i,j,k))*0.5
END DO
END DO
END DO
ELSE ! perform second order advection...
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
sadv(i,j,k)= sadv(i,j,k) + (tem1(i,j,k+1)+tem1(i,j,k))*0.5
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE advcts