! ======================================================================================
! This file was generated by the version 4.3.6 of ADG on 07/13/2010. The Adjoint Code
! Generator (ADG) was developed and sponsored by LASG of IAP (1999-2010)
! The Copyright of the ADG system was declared by Walls at LASG, 1999-2010
! ======================================================================================
MODULE a_module_big_step_utilities_em
USE module_model_constants
USE module_state_description, only: p_qg, p_qs, p_qi, gdscheme, tiedtkescheme, ntiedtkescheme, &
kfetascheme, mskfscheme, g3scheme, p_qv, param_first_scalar, p_qr, p_qc, DFI_FWD
USE module_configure, ONLY : grid_config_rec_type
USE module_wrf_error
#ifndef DOUBLE_PRECISION
# define VPOWX vspowx
# define VPOW vspow
#else
# define VPOWX vpowx
# define VPOW vpow
#endif
CONTAINS
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of calc_mu_uv in reverse (adjoint) mode:
! gradient of useful results: muu muv mu
! with respect to varying inputs: muu muv mu
! RW status of diff variables: muu:in-out muv:in-out mu:incr
SUBROUTINE A_CALC_MU_UV(config_flags, mub0, muub, &
& muvb, ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its&
& , ite, jts, jte, kts, kte)
IMPLICIT NONE
! Input data
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, jms:jme) :: muub, muvb
REAL, DIMENSION(ims:ime, jms:jme) :: mub0
! local stuff
INTEGER :: i, j, itf, jtf, im, jm
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: ad_to3
INTEGER :: ad_to4
INTEGER :: ad_to5
INTEGER :: ad_to6
INTEGER :: ad_to7
INTEGER :: ad_to8
INTEGER :: ad_to9
INTEGER :: ad_to10
INTEGER :: branch
!
!
! calc_mu_uv calculates the full column dry-air mass at the staggered
! horizontal velocity points (u,v) and places the results in muu and muv.
! This routine uses the reference state (mub) and perturbation state (mu)
!
!
itf = ite
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
IF (its .NE. ids .AND. ite .NE. ide) THEN
DO j=jts,jtf
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL3B(4)
ELSE IF (its .EQ. ids .AND. ite .NE. ide) THEN
DO j=jts,jtf
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
CALL PUSHINTEGER4(j - 1)
i = its
im = its
IF (config_flags%periodic_x) im = its - 1
j = jtf + 1
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL3B(3)
ELSE IF (its .NE. ids .AND. ite .EQ. ide) THEN
DO j=jts,jtf
i = itf
CALL PUSHINTEGER4(i - 1)
END DO
CALL PUSHINTEGER4(j - 1)
i = ite
im = ite - 1
IF (config_flags%periodic_x) im = ite
j = jtf + 1
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL3B(2)
ELSE IF (its .EQ. ids .AND. ite .EQ. ide) THEN
DO j=jts,jtf
i = itf
CALL PUSHINTEGER4(i - 1)
END DO
CALL PUSHINTEGER4(j - 1)
im = its
IF (config_flags%periodic_x) im = its - 1
j = jtf + 1
CALL PUSHINTEGER4(j - 1)
i = ite
CALL PUSHINTEGER4(im)
im = ite - 1
IF (config_flags%periodic_x) im = ite
j = jtf + 1
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL3B(1)
ELSE
CALL PUSHCONTROL3B(0)
END IF
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
jtf = jte
IF (jts .NE. jds .AND. jte .NE. jde) THEN
DO j=jts,jtf
CALL PUSHINTEGER4(i)
END DO
DO j=jtf,jts,-1
DO i=itf,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muvb(i, j)
mub0(i, j-1) = mub0(i, j-1) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
END DO
ELSE IF (jts .EQ. jds .AND. jte .NE. jde) THEN
DO j=jts+1,jtf
CALL PUSHINTEGER4(i)
END DO
j = jts
jm = jts
IF (config_flags%periodic_y) jm = jts - 1
CALL PUSHINTEGER4(i)
DO i=itf,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muvb(i, j)
mub0(i, jm) = mub0(i, jm) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
DO j=jtf,jts+1,-1
DO i=itf,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muvb(i, j)
mub0(i, j-1) = mub0(i, j-1) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
END DO
ELSE IF (jts .NE. jds .AND. jte .EQ. jde) THEN
DO j=jts,jtf-1
CALL PUSHINTEGER4(i)
END DO
j = jte
jm = jte - 1
IF (config_flags%periodic_y) jm = jte
CALL PUSHINTEGER4(i)
DO i=itf,its,-1
mub0(i, j-1) = mub0(i, j-1) + 0.5*muvb(i, j)
mub0(i, jm) = mub0(i, jm) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
DO j=jtf-1,jts,-1
DO i=itf,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muvb(i, j)
mub0(i, j-1) = mub0(i, j-1) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
END DO
ELSE IF (jts .EQ. jds .AND. jte .EQ. jde) THEN
DO j=jts+1,jtf-1
CALL PUSHINTEGER4(i)
END DO
jm = jts
IF (config_flags%periodic_y) jm = jts - 1
CALL PUSHINTEGER4(i)
j = jte
CALL PUSHINTEGER4(jm)
jm = jte - 1
IF (config_flags%periodic_y) jm = jte
DO i=itf,its,-1
mub0(i, j-1) = mub0(i, j-1) + 0.5*muvb(i, j)
mub0(i, jm) = mub0(i, jm) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(jm)
j = jts
DO i=itf,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muvb(i, j)
mub0(i, jm) = mub0(i, jm) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
DO j=jtf-1,jts+1,-1
DO i=itf,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muvb(i, j)
mub0(i, j-1) = mub0(i, j-1) + 0.5*muvb(i, j)
muvb(i, j) = 0.0
END DO
CALL POPINTEGER4(i)
END DO
END IF
CALL POPCONTROL3B(branch)
IF (branch .LT. 2) THEN
IF (branch .NE. 0) THEN
CALL POPINTEGER4(ad_to8)
DO j=ad_to8,jts,-1
mub0(i-1, j) = mub0(i-1, j) + 0.5*muub(i, j)
mub0(im, j) = mub0(im, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
CALL POPINTEGER4(im)
i = its
CALL POPINTEGER4(ad_to7)
DO j=ad_to7,jts,-1
mub0(i, j) = mub0(i, j) + 0.5*muub(i, j)
mub0(im, j) = mub0(im, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
CALL POPINTEGER4(ad_to6)
DO j=ad_to6,jts,-1
CALL POPINTEGER4(ad_to5)
DO i=ad_to5,its+1,-1
mub0(i, j) = mub0(i, j) + 0.5*muub(i, j)
mub0(i-1, j) = mub0(i-1, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
END DO
END IF
ELSE IF (branch .EQ. 2) THEN
CALL POPINTEGER4(ad_to4)
DO j=ad_to4,jts,-1
mub0(i-1, j) = mub0(i-1, j) + 0.5*muub(i, j)
mub0(im, j) = mub0(im, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
CALL POPINTEGER4(ad_to3)
DO j=ad_to3,jts,-1
CALL POPINTEGER4(ad_to2)
DO i=ad_to2,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muub(i, j)
mub0(i-1, j) = mub0(i-1, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
END DO
ELSE IF (branch .EQ. 3) THEN
CALL POPINTEGER4(ad_to1)
DO j=ad_to1,jts,-1
mub0(i, j) = mub0(i, j) + 0.5*muub(i, j)
mub0(im, j) = mub0(im, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
CALL POPINTEGER4(ad_to0)
DO j=ad_to0,jts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its+1,-1
mub0(i, j) = mub0(i, j) + 0.5*muub(i, j)
mub0(i-1, j) = mub0(i-1, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
END DO
ELSE
CALL POPINTEGER4(ad_to10)
DO j=ad_to10,jts,-1
CALL POPINTEGER4(ad_to9)
DO i=ad_to9,its,-1
mub0(i, j) = mub0(i, j) + 0.5*muub(i, j)
mub0(i-1, j) = mub0(i-1, j) + 0.5*muub(i, j)
muub(i, j) = 0.0
END DO
END DO
END IF
END SUBROUTINE A_CALC_MU_UV
SUBROUTINE a_calc_mu_uv_1(config_flags,mu,a_mu,muu,a_muu,muv,a_muv,ids,ide, &
jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,jms:jme) :: muu,a_muu,muv,a_muv
REAL,DIMENSION(ims:ime,jms:jme) :: mu,a_mu
INTEGER :: i,j,itf,jtf,im,jm
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002
!PART II: CALCULATIONS OF B. S. TRAJECTORY
! IF ( ( its .NE. ids ) .AND. ( ite .NE. ide ) ) THEN
! if(config_flags%periodic_x) im = its-1
! if(config_flags%periodic_x) im = ite
! if(config_flags%periodic_x) im = its-1
! if(config_flags%periodic_x) im = ite
! IF ( ( jts .NE. jds ) .AND. ( jte .NE. jde ) ) THEN
! if(config_flags%periodic_y) jm = jts-1
! if(config_flags%periodic_y) jm = jte
! if(config_flags%periodic_y) jm = jts-1
! if(config_flags%periodic_y) jm = jte
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
! IF( ( jts .NE. jds ) .AND. ( jte .NE. jde ) ) THEN
! DO j =jts, jtf
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i,j-1)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! ENDDO
! ELSE IF( ( jts .EQ. jds ) .AND. ( jte .NE. jde ) ) THEN
! DO j =jts+1, jtf
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i,j-1)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! ENDDO
! j =jts
! jm =jts
! IF(config_flags%periodic_y) THEN
! jm =jts-1
! END IF
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i,jm)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! ELSE IF( ( jts .NE. jds ) .AND. ( jte .EQ. jde ) ) THEN
! DO j =jts, jtf-1
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i,j-1)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! ENDDO
! j =jte
! jm =jte-1
! IF(config_flags%periodic_y) THEN
! jm =jte
! END IF
! DO i =its, itf
! Tmpv001 =mu(i,j-1) +mu(i,jm)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! ELSE IF( ( jts .EQ. jds ) .AND. ( jte .EQ. jde ) ) THEN
! DO j =jts+1, jtf-1
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i,j-1)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! ENDDO
! j =jts
! jm =jts
! IF(config_flags%periodic_y) THEN
! jm =jts-1
! END IF
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i,jm)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! j =jte
! jm =jte-1
! IF(config_flags%periodic_y) THEN
! jm =jte
! END IF
! DO i =its, itf
! Tmpv001 =mu(i,j-1) +mu(i,jm)
! Tmpv002 =0.5*Tmpv001
! muv(i,j) =Tmpv002
! ENDDO
! END IF
! Added by Ning Pan, 2010-07-17
itf =min(ite,ide-1)
jtf =jte
IF( ( jts .NE. jds ) .AND. ( jte .NE. jde ) ) THEN
DO j =jtf, jts, -1
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
ENDDO
ENDDO
ELSE IF( ( jts .EQ. jds ) .AND. ( jte .NE. jde ) ) THEN
! Added by Ning Pan, 2010-07-17
j =jts
jm =jts
IF(config_flags%periodic_y) jm =jts-1
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,jm) =a_mu(i,jm) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_y) THEN
! END IF
DO j =jtf, jts+1, -1
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
ENDDO
ENDDO
ELSE IF( ( jts .NE. jds ) .AND. ( jte .EQ. jde ) ) THEN
! Added by Ning Pan, 2010-07-17
j =jte
jm =jte-1
IF(config_flags%periodic_y) jm =jte
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
a_mu(i,jm) =a_mu(i,jm) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_y) THEN
! END IF
DO j =jtf-1, jts, -1
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
ENDDO
ENDDO
ELSE IF( ( jts .EQ. jds ) .AND. ( jte .EQ. jde ) ) THEN
! Added by Ning Pan, 2010-07-17
j =jte
jm =jte-1
IF(config_flags%periodic_y) jm =jte
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
a_mu(i,jm) =a_mu(i,jm) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_y) THEN
! END IF
j =jts
jm =jts
IF(config_flags%periodic_y) jm =jts-1
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,jm) =a_mu(i,jm) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_y) THEN
! END IF
DO j =jtf-1, jts+1, -1
DO i =itf, its, -1
a_Tmpv2 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
ENDDO
ENDDO
END IF
!LPB[2]
! itf =min(ite, ide-1)
! jtf =jte
!LPB[1]
! IF( ( its .NE. ids ) .AND. ( ite .NE. ide ) ) THEN
! DO j =jts, jtf
! DO i =its, itf
! Tmpv001 =mu(i,j) +mu(i-1,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! ENDDO
! ELSE IF( ( its .EQ. ids ) .AND. ( ite .NE. ide ) ) THEN
! DO j =jts, jtf
! DO i =its+1, itf
! Tmpv001 =mu(i,j) +mu(i-1,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! ENDDO
! i =its
! im =its
! IF(config_flags%periodic_x) THEN
! im =its-1
! END IF
! DO j =jts, jtf
! Tmpv001 =mu(i,j) +mu(im,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! ELSE IF( ( its .NE. ids ) .AND. ( ite .EQ. ide ) ) THEN
! DO j =jts, jtf
! DO i =its, itf-1
! Tmpv001 =mu(i,j) +mu(i-1,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! ENDDO
! i =ite
! im =ite-1
! IF(config_flags%periodic_x) THEN
! im =ite
! END IF
! DO j =jts, jtf
! Tmpv001 =mu(i-1,j) +mu(im,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! ELSE IF( ( its .EQ. ids ) .AND. ( ite .EQ. ide ) ) THEN
! DO j =jts, jtf
! DO i =its+1, itf-1
! Tmpv001 =mu(i,j) +mu(i-1,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! ENDDO
! i =its
! im =its
! IF(config_flags%periodic_x) THEN
! im =its-1
! END IF
! DO j =jts, jtf
! Tmpv001 =mu(i,j) +mu(im,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! i =ite
! im =ite-1
! IF(config_flags%periodic_x) THEN
! im =ite
! END IF
! DO j =jts, jtf
! Tmpv001 =mu(i-1,j) +mu(im,j)
! Tmpv002 =0.5*Tmpv001
! muu(i,j) =Tmpv002
! ENDDO
! END IF
! Added by Ning Pan, 2010-07-17
itf =ite
jtf =min(jte,jde-1)
IF( ( its .NE. ids ) .AND. ( ite .NE. ide ) ) THEN
DO j =jtf, jts, -1
DO i =itf, its, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
ENDDO
ENDDO
ELSE IF( ( its .EQ. ids ) .AND. ( ite .NE. ide ) ) THEN
! Added by Ning Pan, 2010-07-17
i =its
im =its
IF(config_flags%periodic_x) im =its-1
DO j =jtf, jts, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(im,j) =a_mu(im,j) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_x) THEN
! END IF
DO j =jtf, jts, -1
DO i =itf, its+1, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
ENDDO
ENDDO
ELSE IF( ( its .NE. ids ) .AND. ( ite .EQ. ide ) ) THEN
! Added by Ning Pan, 2010-07-17
i =ite
im =ite-1
IF(config_flags%periodic_x) im =ite
DO j =jtf, jts, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
a_mu(im,j) =a_mu(im,j) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_x) THEN
! END IF
DO j =jtf, jts, -1
DO i =itf-1, its, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
ENDDO
ENDDO
ELSE IF( ( its .EQ. ids ) .AND. ( ite .EQ. ide ) ) THEN
! Added by Ning Pan, 2010-07-17
i =ite
im =ite-1
IF(config_flags%periodic_x) im =ite
DO j =jtf, jts, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
a_mu(im,j) =a_mu(im,j) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_x) THEN
! END IF
! Added by Ning Pan, 2010-07-17
i =its
im =its
IF(config_flags%periodic_x) im =its-1
DO j =jtf, jts, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(im,j) =a_mu(im,j) +a_Tmpv1
ENDDO
! Remarked by Ning Pan, 2010-07-17
! IF(config_flags%periodic_x) THEN
! END IF
DO j =jtf, jts, -1
DO i =itf-1, its+1, -1
a_Tmpv2 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
ENDDO
ENDDO
END IF
!LPB[0]
! itf =ite
! jtf =min(jte, jde-1)
END SUBROUTINE a_calc_mu_uv_1
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of couple_momentum in reverse (adjoint) mode:
! gradient of useful results: u v w ru rv rw mut muu muv
! with respect to varying inputs: u v w ru rv rw mut muu muv
! RW status of diff variables: u:incr v:incr w:incr ru:in-out
! rv:in-out rw:in-out mut:incr muu:incr muv:incr
! Map scale factor comments for this routine:
! Locally not changed, but sent the correct map scale factors
! from module_em (msfuy, msfvx, msfty)
SUBROUTINE A_COUPLE_MOMENTUM(muu, muub, rub, u, ub, msfu, muv, muvb&
& , rvb, v, vb, msfv, msfv_inv, mut, mutb, rwb, w, wb, msft, ids&
& , ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts&
& , jte, kts, kte)
IMPLICIT NONE
! Input data
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rub, rvb, rwb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: muu, muv, mut
REAL, DIMENSION(ims:ime, jms:jme) :: muub, muvb, mutb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: msfu, msfv, msft, &
& msfv_inv
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: u, v, w
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: ub, vb, wb
! Local data
INTEGER :: i, j, k, itf, jtf, ktf
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
REAL :: tempb
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
itf = ite
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
DO j=jts,jtf
DO k=kts,ktf
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
jtf = jte
DO j=jts,jtf
DO k=kts,ktf
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
DO j=jtf,jts,-1
DO k=kte,kts,-1
DO i=itf,its,-1
wb(i, k, j) = wb(i, k, j) + mut(i, j)*rwb(i, k, j)/msft(i, j)
mutb(i, j) = mutb(i, j) + w(i, k, j)*rwb(i, k, j)/msft(i, j)
rwb(i, k, j) = 0.0
END DO
END DO
END DO
CALL POPINTEGER4(ad_to2)
DO j=ad_to2,jts,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,its,-1
tempb = msfv_inv(i, j)*rvb(i, k, j)
vb(i, k, j) = vb(i, k, j) + muv(i, j)*tempb
muvb(i, j) = muvb(i, j) + v(i, k, j)*tempb
rvb(i, k, j) = 0.0
END DO
END DO
END DO
CALL POPINTEGER4(ad_to0)
DO j=ad_to0,jts,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
ub(i, k, j) = ub(i, k, j) + muu(i, j)*rub(i, k, j)/msfu(i, j)
muub(i, j) = muub(i, j) + u(i, k, j)*rub(i, k, j)/msfu(i, j)
rub(i, k, j) = 0.0
END DO
END DO
END DO
END SUBROUTINE A_COUPLE_MOMENTUM
SUBROUTINE a_calc_ww_cp(u,a_u,v,a_v,mup,a_mup,mub,ww,a_ww,rdx,rdy,msftx, &
msfty,msfux,msfuy,msfvx,msfvx_inv,msfvy,dnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: u,a_u,v,a_v
REAL,DIMENSION(ims:ime,jms:jme) :: mup,a_mup,mub,msftx,msfty,msfux,msfuy,msfvx, &
msfvy,msfvx_inv
REAL,DIMENSION(kms:kme) :: dnw
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ww,a_ww
REAL :: rdx,rdy
INTEGER :: i,j,k,itf,jtf,ktf
REAL,DIMENSION(its:ite) :: dmdt,a_dmdt
REAL,DIMENSION(its:ite,kts:kte) :: divv,a_divv
REAL,DIMENSION(its:ite+1,jts:jte+1) :: muu,a_muu,muv,a_muv
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9, &
Tmpv009,a_Tmpv10,Tmpv010
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
jtf=MIN(jte,jde-1)
ktf=MIN(kte,kde-1)
itf=MIN(ite,ide-1)
!LPB[1]
DO j=jts,jtf
DO i=its,min(ite+1,ide)
muu(i,j) = 0.5*(mup(i,j)+mub(i,j)+mup(i-1,j)+mub(i-1,j))/msfuy(i,j)
ENDDO
ENDDO
!LPB[2]
DO j=jts,min(jte+1,jde)
DO i=its,itf
muv(i,j) = 0.5*(mup(i,j)+mub(i,j)+mup(i,j-1)+mub(i,j-1))*msfvx_inv(i,j)
ENDDO
ENDDO
!!LPB[3]
! DO j=jts,jtf
! DO i=its,ite
! dmdt(i) = 0.
! ww(i,1,j) = 0.
! ww(i,kte,j) = 0.
! ENDDO
! DO k=kts,ktf
! DO i=its,itf
! divv(i,k) = msftx(i,j)*dnw(k)*( rdx*(muu(i+1,j)*u(i+1,k,j)-muu(i,j) &
! *u(i,k,j)) &
! +rdy*(muv(i,j+1)*v(i,k,j+1)-muv(i,j)*v(i,k,j)) )
! dmdt(i) = dmdt(i) + divv(i,k)
! ENDDO
! ENDDO
! DO k=2,ktf
! DO i=its,itf
! ww(i,k,j)=ww(i,k-1,j) - dnw(k-1)*dmdt(i) - divv(i,k-1)
! ENDDO
! ENDDO
! ENDDO
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
Do K0_ADJ =its, ite
a_dmdt(K0_ADJ) =0.0
End Do
Do K1_ADJ =kts, kte
Do K0_ADJ =its, ite
a_divv(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
Do K1_ADJ =jts, jte+1
Do K0_ADJ =its, ite+1
a_muu(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
Do K1_ADJ =jts, jte+1
Do K0_ADJ =its, ite+1
a_muv(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
DO j =jtf, jts, -1
! Remarked by Ning Pan, 2010-08-31 : not need to recalculate
! DO i =its, ite
! dmdt(i) =0.
! ww(i,1,j) =0.
! ww(i,kte,j) =0.
! ENDDO
! DO k =kts, ktf
! DO i =its, itf
! Tmpv001 =muu(i+1,j)*u(i+1,k,j)
! Tmpv002 =muu(i,j)*u(i,k,j)
! Tmpv003 =Tmpv001 -Tmpv002
! Tmpv004 =rdx*Tmpv003
! Tmpv005 =muv(i,j+1)*v(i,k,j+1)
! Tmpv006 =muv(i,j)*v(i,k,j)
! Tmpv007 =Tmpv005 -Tmpv006
! Tmpv008 =rdy*Tmpv007
! Tmpv009 =Tmpv004 +Tmpv008
! Tmpv010 =msftx(i,j)*dnw(k)*Tmpv009
!! divv(i,k) =Tmpv010
! Tmpv001 =dmdt(i) +divv(i,k)
!! dmdt(i) =Tmpv001
! ENDDO
! ENDDO
! DO k =2, ktf
! DO i =its, itf
! Tmpv001 =ww(i,k-1,j) -dnw(k-1)*dmdt(i)
! Tmpv002 =Tmpv001 -divv(i,k-1)
!! ww(i,k,j) =Tmpv002
! ENDDO
! ENDDO
DO k =ktf, 2, -1
DO i =itf, its, -1
a_Tmpv2 =a_ww(i,k,j)
a_ww(i,k,j) =0.0
a_Tmpv1 =a_Tmpv2
a_divv(i,k-1) =a_divv(i,k-1) -a_Tmpv2
a_ww(i,k-1,j) =a_ww(i,k-1,j) +a_Tmpv1
a_dmdt(i) =a_dmdt(i) -dnw(k-1)*a_Tmpv1
ENDDO
ENDDO
DO k =ktf, kts, -1
DO i =itf, its, -1
a_Tmpv1 =a_dmdt(i)
a_dmdt(i) =0.0
a_dmdt(i) =a_dmdt(i) +a_Tmpv1
a_divv(i,k) =a_divv(i,k) +a_Tmpv1
a_Tmpv10 =a_divv(i,k)
a_divv(i,k) =0.0
a_Tmpv9 =msftx(i,j)*dnw(k)*a_Tmpv10
a_Tmpv4 =a_Tmpv9
a_Tmpv8 =a_Tmpv9
a_Tmpv7 =rdy*a_Tmpv8
a_Tmpv5 =a_Tmpv7
a_Tmpv6 =-a_Tmpv7
a_muv(i,j) =a_muv(i,j) +v(i,k,j)*a_Tmpv6
a_v(i,k,j) =a_v(i,k,j) +muv(i,j)*a_Tmpv6
a_muv(i,j+1) =a_muv(i,j+1) +v(i,k,j+1)*a_Tmpv5
a_v(i,k,j+1) =a_v(i,k,j+1) +muv(i,j+1)*a_Tmpv5
a_Tmpv3 =rdx*a_Tmpv4
a_Tmpv1 =a_Tmpv3
a_Tmpv2 =-a_Tmpv3
a_muu(i,j) =a_muu(i,j) +u(i,k,j)*a_Tmpv2
a_u(i,k,j) =a_u(i,k,j) +muu(i,j)*a_Tmpv2
a_muu(i+1,j) =a_muu(i+1,j) +u(i+1,k,j)*a_Tmpv1
a_u(i+1,k,j) =a_u(i+1,k,j) +muu(i+1,j)*a_Tmpv1
ENDDO
ENDDO
DO i =ite, its, -1
a_ww(i,kte,j) =0.0
a_ww(i,1,j) =0.0
a_dmdt(i) =0.0
ENDDO
ENDDO
!LPB[2]
DO j =min(jte+1, jde), jts, -1
! DO i =its, itf
! Tmpv001 =mup(i,j) +mub(i,j) +mup(i,j-1)
! Tmpv002 =Tmpv001 +mub(i,j-1)
! Tmpv003 =0.5*Tmpv002
! Tmpv004 =Tmpv003*msfvx_inv(i,j)
! muv(i,j) =Tmpv004
! ENDDO
DO i =itf, its, -1
a_Tmpv4 =a_muv(i,j)
a_muv(i,j) =0.0
a_Tmpv3 =msfvx_inv(i,j)*a_Tmpv4
a_Tmpv2 =0.5*a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mup(i,j) =a_mup(i,j) +a_Tmpv1
a_mup(i,j-1) =a_mup(i,j-1) +a_Tmpv1
ENDDO
ENDDO
!LPB[1]
DO j =jtf, jts, -1
! DO i =its, min(ite+1, ide)
! Tmpv001 =mup(i,j) +mub(i,j) +mup(i-1,j)
! Tmpv002 =Tmpv001 +mub(i-1,j)
! Tmpv003 =0.5*Tmpv002
! Tmpv004 =Tmpv003/msfuy(i,j)
! muu(i,j) =Tmpv004
! ENDDO
DO i =min(ite+1, ide), its, -1
a_Tmpv4 =a_muu(i,j)
a_muu(i,j) =0.0
a_Tmpv3 =a_Tmpv4/msfuy(i,j)
a_Tmpv2 =0.5*a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mup(i,j) =a_mup(i,j) +a_Tmpv1
a_mup(i-1,j) =a_mup(i-1,j) +a_Tmpv1
ENDDO
ENDDO
!LPB[0]
! jtf =min(jte, jde-1)
! ktf =min(kte, kde-1)
! itf =min(ite, ide-1)
END SUBROUTINE a_calc_ww_cp
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of calc_cq in reverse (adjoint) mode:
! gradient of useful results: cqu cqv cqw moist
! with respect to varying inputs: cqu cqv cqw moist
! RW status of diff variables: cqu:in-out cqv:in-out cqw:in-out
! moist:incr
SUBROUTINE A_CALC_CQ(moist, moistb, cqu, cqub, cqv, cqvb, cqw, cqwb, &
& n_moist, ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, &
& its, ite, jts, jte, kts, kte)
IMPLICIT NONE
! Input data
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
INTEGER, INTENT(IN) :: n_moist
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), INTENT(IN) :: &
& moist
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist) :: moistb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: cqu, cqv, cqw
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: cqub, cqvb, cqwb
! Local stuff
! Changes from Larry Meadows, Intel Corp. Improve vectorization of this routine
REAL :: qtot(its:ite)
REAL :: qtotb(its:ite)
INTEGER :: i, j, k, itf, jtf, ktf, ispe
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: ad_to3
INTEGER :: ad_to4
INTEGER :: ad_to5
INTEGER :: ad_to6
INTEGER :: ad_to7
INTEGER :: ad_to8
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
IF (n_moist .GE. param_first_scalar) THEN
itf = ite
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
DO j=jts,jtf
DO k=kts,ktf
CALL PUSHREAL8ARRAY(qtot, ite - its + 1)
qtot = 0.
DO ispe=param_first_scalar,n_moist
DO i=its,itf
qtot(i) = qtot(i) + moist(i, k, j, ispe) + moist(i-1, k, j, &
& ispe)
END DO
CALL PUSHINTEGER4(i - 1)
END DO
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
jtf = jte
DO j=jts,jtf
DO k=kts,ktf
CALL PUSHREAL8ARRAY(qtot, ite - its + 1)
qtot = 0.
DO ispe=param_first_scalar,n_moist
DO i=its,itf
qtot(i) = qtot(i) + moist(i, k, j, ispe) + moist(i, k, j-1, &
& ispe)
END DO
CALL PUSHINTEGER4(i - 1)
END DO
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
DO j=jtf,jts,-1
DO k=ktf,kts+1,-1
qtotb = 0.0
DO i=itf,its,-1
qtotb(i) = qtotb(i) + 0.5*cqwb(i, k, j)
cqwb(i, k, j) = 0.0
END DO
DO ispe=n_moist,param_first_scalar,-1
DO i=itf,its,-1
moistb(i, k, j, ispe) = moistb(i, k, j, ispe) + qtotb(i)
moistb(i, k-1, j, ispe) = moistb(i, k-1, j, ispe) + qtotb(i)
END DO
END DO
END DO
END DO
CALL POPINTEGER4(ad_to8)
DO j=ad_to8,jts,-1
DO k=ktf,kts,-1
qtotb = 0.0
CALL POPINTEGER4(ad_to7)
DO i=ad_to7,its,-1
qtotb(i) = qtotb(i) - 0.5*cqvb(i, k, j)/(0.5*qtot(i)+1.)**2
cqvb(i, k, j) = 0.0
END DO
DO ispe=n_moist,param_first_scalar,-1
CALL POPINTEGER4(ad_to6)
DO i=ad_to6,its,-1
moistb(i, k, j, ispe) = moistb(i, k, j, ispe) + qtotb(i)
moistb(i, k, j-1, ispe) = moistb(i, k, j-1, ispe) + qtotb(i)
END DO
END DO
CALL POPREAL8ARRAY(qtot, ite - its + 1)
END DO
END DO
CALL POPINTEGER4(ad_to5)
DO j=ad_to5,jts,-1
DO k=ktf,kts,-1
qtotb = 0.0
CALL POPINTEGER4(ad_to4)
DO i=ad_to4,its,-1
qtotb(i) = qtotb(i) - 0.5*cqub(i, k, j)/(0.5*qtot(i)+1.)**2
cqub(i, k, j) = 0.0
END DO
DO ispe=n_moist,param_first_scalar,-1
CALL POPINTEGER4(ad_to3)
DO i=ad_to3,its,-1
moistb(i, k, j, ispe) = moistb(i, k, j, ispe) + qtotb(i)
moistb(i-1, k, j, ispe) = moistb(i-1, k, j, ispe) + qtotb(i)
END DO
END DO
CALL POPREAL8ARRAY(qtot, ite - its + 1)
END DO
END DO
ELSE
itf = ite
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
DO j=jts,jtf
DO k=kts,ktf
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
jtf = jte
DO j=jts,jtf
DO k=kts,ktf
i = itf + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
DO j=jtf,jts,-1
DO k=ktf,kts+1,-1
DO i=itf,its,-1
cqwb(i, k, j) = 0.0
END DO
END DO
END DO
CALL POPINTEGER4(ad_to2)
DO j=ad_to2,jts,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,its,-1
cqvb(i, k, j) = 0.0
END DO
END DO
END DO
CALL POPINTEGER4(ad_to0)
DO j=ad_to0,jts,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
cqub(i, k, j) = 0.0
END DO
END DO
END DO
END IF
END SUBROUTINE A_CALC_CQ
SUBROUTINE a_calc_alt(alt,a_alt,al,a_al,alb,ids,ide,jds,jde,kds,kde,ims,ime, &
jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: alb,al,a_al
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: alt,a_alt
INTEGER :: i,j,k,itf,jtf,ktf
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
! Added by Ning Pan, 2010-07-13
itf =min(ite,ide-1)
jtf =min(jte,jde-1)
ktf =min(kte,kde-1)
!LPB[1]
DO j =jtf, jts, -1
! DO k =kts, ktf
! DO i =its, itf
! alt(i,k,j) =al(i,k,j) +alb(i,k,j)
! ENDDO
! ENDDO
DO k =ktf, kts, -1
DO i =itf, its, -1
a_al(i,k,j) =a_al(i,k,j) +a_alt(i,k,j)
a_alt(i,k,j) =0.0
ENDDO
ENDDO
ENDDO
!LPB[0]
! itf =min(ite, ide-1)
! jtf =min(jte, jde-1)
! ktf =min(kte, kde-1)
END SUBROUTINE a_calc_alt
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of calc_p_rho_phi in reverse (adjoint) mode:
! gradient of useful results: p al t muts ph moist mu
! with respect to varying inputs: p al t muts ph moist mu
! RW status of diff variables: p:in-out al:in-out t:incr muts:incr
! ph:in-out moist:incr mu:incr
SUBROUTINE A_CALC_P_RHO_PHI(moist, moistb, n_moist, hypsometric_opt, al&
& , alb0, alb, mu, mub, muts, mutsb, ph, phb0, phb, p, pb0, pb, t, tb, &
& p0, t0, ptop, znu, znw, dnw, rdnw, rdn, non_hydrostatic, ids, ide, jds&
& , jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts&
& , kte)
IMPLICIT NONE
! Input data
LOGICAL, INTENT(IN) :: non_hydrostatic
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
INTEGER, INTENT(IN) :: n_moist
INTEGER, INTENT(IN) :: hypsometric_opt
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: alb, pb, t
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: tb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), INTENT(IN) :: &
& moist
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist) :: moistb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: al, p
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: alb0, pb0
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ph, phb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: phb0
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, muts
REAL, DIMENSION(ims:ime, jms:jme) :: mub, mutsb
REAL, DIMENSION(kms:kme), INTENT(IN) :: znu, znw, dnw, rdnw, rdn
REAL, INTENT(IN) :: t0, p0, ptop
! Local stuff
INTEGER :: i, j, k, itf, jtf, ktf, ispe
REAL :: qvf, qtot, qf1, qf2
REAL :: qvfb, qtotb, qf1b
REAL, DIMENSION(its:ite) :: temp, cpovcv_v
REAL, DIMENSION(its:ite) :: tempb
REAL :: pfu, phm, pfd
REAL :: pfub, phmb, pfdb
INTEGER :: arg1
INTEGER :: branch
REAL :: temp3
REAL :: temp2
REAL :: temp1
REAL :: temp0
REAL :: temp16b
REAL :: temp0b
REAL :: temp3b
REAL :: temp18
REAL :: temp17
REAL :: temp12b
REAL :: temp16
REAL :: temp6b
REAL :: temp15
REAL :: temp14
REAL :: temp13
REAL :: temp12
REAL :: temp11
REAL :: temp10
REAL :: temp0b0
REAL :: temp8b0
REAL :: temp14b
REAL :: temp8b
REAL :: temp3b0
REAL :: temp12b2
REAL :: temp12b1
REAL :: temp12b0
REAL :: temp6b0
REAL :: temp9
REAL :: temp8
REAL :: temp7
REAL :: temp10b
REAL :: temp6
REAL :: temp10b1
REAL :: temp5
REAL :: temp10b0
REAL :: temp4
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
!#ifndef INTELMKL
cpovcv_v = cpovcv
!#endif
IF (non_hydrostatic) THEN
IF (hypsometric_opt .EQ. 1) THEN
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
al(i, k, j) = -(1./muts(i, j)*(alb(i, k, j)*mu(i, j)+rdnw(k)&
& *(ph(i, k+1, j)-ph(i, k, j))))
END DO
END DO
END DO
CALL PUSHCONTROL2B(0)
ELSE IF (hypsometric_opt .EQ. 2) THEN
! The relation used to get specific volume, al, is: al = -dZ/dp,
! where dp = mut * d(eta). The pressure depth, dp, is replaced with
! p*(dp/p) ~ p*LOG((p+0.5dp)/(p-0.5dp)). Difference between dp and p*dLOG(p)
! is as follows: p*dLOG(p) - dp = 1/12*(dp/p)**3 + 1/90*(dp/p)**5 + ...
! Therefore, p*dLOG(p) is always larger than dp and the difference is
! in proportion to dp/p. TKW, 02/16/2010
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
pfu = muts(i, j)*znw(k+1) + ptop
pfd = muts(i, j)*znw(k) + ptop
phm = muts(i, j)*znu(k) + ptop
al(i, k, j) = (ph(i, k+1, j)-ph(i, k, j)+phb(i, k+1, j)-phb(&
& i, k, j))/phm/LOG(pfd/pfu) - alb(i, k, j)
END DO
END DO
END DO
CALL PUSHCONTROL2B(1)
ELSE
CALL PUSHCONTROL2B(2)
END IF
IF (n_moist .GE. param_first_scalar) THEN
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
qvf = 1. + rvovrd*moist(i, k, j, p_qv)
CALL PUSHREAL8(temp(i))
temp(i) = r_d*(t0+t(i, k, j))*qvf/(p0*(al(i, k, j)+alb(i, k&
& , j)))
END DO
END DO
END DO
tempb = 0.0
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
pb0(i, k, j) = p0*pb0(i, k, j)
END DO
arg1 = itf - its + 1
CALL A_VPOW(p(its, k, j), pb0(its, k, j), temp(its), tempb(its&
& ), cpovcv_v(its), arg1)
DO i=itf,its,-1
qvf = 1. + rvovrd*moist(i, k, j, p_qv)
CALL POPREAL8(temp(i))
temp15 = p0*(alb(i, k, j)+al(i, k, j))
temp14 = t0 + t(i, k, j)
temp14b = r_d*tempb(i)/temp15
tb(i, k, j) = tb(i, k, j) + qvf*temp14b
qvfb = temp14*temp14b
alb0(i, k, j) = alb0(i, k, j) - temp14*qvf*p0*temp14b/temp15
tempb(i) = 0.0
moistb(i, k, j, p_qv) = moistb(i, k, j, p_qv) + rvovrd*qvfb
END DO
END DO
END DO
ELSE
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
temp18 = p0*(alb(i, k, j)+al(i, k, j))
temp17 = t0 + t(i, k, j)
temp16 = temp17/temp18
IF (r_d*temp16 .LE. 0.0 .AND. (cpovcv .EQ. 0.0 .OR. cpovcv &
& .NE. INT(cpovcv))) THEN
temp16b = 0.0
ELSE
temp16b = r_d*cpovcv*(r_d*temp16)**(cpovcv-1)*p0*pb0(i, k&
& , j)/temp18
END IF
tb(i, k, j) = tb(i, k, j) + temp16b
alb0(i, k, j) = alb0(i, k, j) - temp16*p0*temp16b
pb0(i, k, j) = 0.0
END DO
END DO
END DO
END IF
CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
temp12b = -(alb0(i, k, j)/muts(i, j))
mub(i, j) = mub(i, j) + alb(i, k, j)*temp12b
phb0(i, k+1, j) = phb0(i, k+1, j) + rdnw(k)*temp12b
phb0(i, k, j) = phb0(i, k, j) - rdnw(k)*temp12b
mutsb(i, j) = mutsb(i, j) - (alb(i, k, j)*mu(i, j)+rdnw(k)*(&
& ph(i, k+1, j)-ph(i, k, j)))*temp12b/muts(i, j)
alb0(i, k, j) = 0.0
END DO
END DO
END DO
ELSE IF (branch .EQ. 1) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
pfu = muts(i, j)*znw(k+1) + ptop
phm = muts(i, j)*znu(k) + ptop
pfd = muts(i, j)*znw(k) + ptop
temp12 = pfd/pfu
temp13 = LOG(temp12)
temp12b0 = alb0(i, k, j)/(phm*temp13)
temp12b1 = -((phb(i, k+1, j)-phb(i, k, j)+ph(i, k+1, j)-ph(i&
& , k, j))*temp12b0/(phm*temp13))
temp12b2 = phm*temp12b1/(temp12*pfu)
phb0(i, k+1, j) = phb0(i, k+1, j) + temp12b0
phb0(i, k, j) = phb0(i, k, j) - temp12b0
phmb = temp13*temp12b1
pfdb = temp12b2
pfub = -(temp12*temp12b2)
alb0(i, k, j) = 0.0
mutsb(i, j) = mutsb(i, j) + znw(k)*pfdb + znw(k+1)*pfub + &
& znu(k)*phmb
END DO
END DO
END DO
END IF
ELSE
! hydrostatic pressure, al, and ph1 calc; WCS, 5 sept 2001
IF (n_moist .GE. param_first_scalar) THEN
DO j=jts,jtf
! top layer
k = ktf
DO i=its,itf
qtot = 0.
DO ispe=param_first_scalar,n_moist
qtot = qtot + moist(i, k, j, ispe)
END DO
qf2 = 1.
CALL PUSHREAL8(qf1)
qf1 = qtot*qf2
p(i, k, j) = -(0.5*(mu(i, j)+qf1*muts(i, j))/rdnw(k)/qf2)
qvf = 1. + rvovrd*moist(i, k, j, p_qv)
al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*((p(i, k, j)+pb(&
& i, k, j))/p1000mb)**cvpm - alb(i, k, j)
END DO
CALL PUSHINTEGER4(k)
! remaining layers, integrate down
DO k=ktf-1,kts,-1
DO i=its,itf
qtot = 0.
DO ispe=param_first_scalar,n_moist
qtot = qtot + 0.5*(moist(i, k, j, ispe)+moist(i, k+1, j, &
& ispe))
END DO
qf2 = 1.
CALL PUSHREAL8(qf1)
qf1 = qtot*qf2
CALL PUSHREAL8(p(i, k, j))
p(i, k, j) = p(i, k+1, j) - (mu(i, j)+qf1*muts(i, j))/qf2/&
& rdn(k+1)
qvf = 1. + rvovrd*moist(i, k, j, p_qv)
al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*((p(i, k, j)+&
& pb(i, k, j))/p1000mb)**cvpm - alb(i, k, j)
END DO
END DO
END DO
CALL PUSHCONTROL1B(0)
ELSE
DO j=jts,jtf
! top layer
k = ktf
DO i=its,itf
qtot = 0.
qf2 = 1.
qf1 = qtot*qf2
p(i, k, j) = -(0.5*(mu(i, j)+qf1*muts(i, j))/rdnw(k)/qf2)
qvf = 1.
al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*((p(i, k, j)+pb(&
& i, k, j))/p1000mb)**cvpm - alb(i, k, j)
END DO
CALL PUSHINTEGER4(k)
! remaining layers, integrate down
DO k=ktf-1,kts,-1
DO i=its,itf
qtot = 0.
qf2 = 1.
qf1 = qtot*qf2
CALL PUSHREAL8(p(i, k, j))
p(i, k, j) = p(i, k+1, j) - (mu(i, j)+qf1*muts(i, j))/qf2/&
& rdn(k+1)
qvf = 1.
al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*((p(i, k, j)+&
& pb(i, k, j))/p1000mb)**cvpm - alb(i, k, j)
END DO
END DO
END DO
CALL PUSHCONTROL1B(1)
END IF
IF (hypsometric_opt .EQ. 1) THEN
DO j=jtf,jts,-1
DO k=ktf+1,2,-1
DO i=itf,its,-1
temp10b = -(dnw(k-1)*phb0(i, k, j))
phb0(i, k-1, j) = phb0(i, k-1, j) + phb0(i, k, j)
mutsb(i, j) = mutsb(i, j) + al(i, k-1, j)*temp10b
alb0(i, k-1, j) = alb0(i, k-1, j) + muts(i, j)*temp10b
mub(i, j) = mub(i, j) + alb(i, k-1, j)*temp10b
phb0(i, k, j) = 0.0
END DO
END DO
END DO
ELSE
DO j=jtf,jts,-1
DO k=ktf+1,kts+1,-1
DO i=itf,its,-1
pfu = muts(i, j)*znw(k) + ptop
phm = muts(i, j)*znu(k-1) + ptop
pfd = muts(i, j)*znw(k-1) + ptop
temp10 = pfd/pfu
temp10b0 = LOG(temp10)*phb0(i, k, j)
temp11 = alb(i, k-1, j) + al(i, k-1, j)
temp10b1 = temp11*phm*phb0(i, k, j)/(temp10*pfu)
phb0(i, k-1, j) = phb0(i, k-1, j) + phb0(i, k, j)
alb0(i, k-1, j) = alb0(i, k-1, j) + phm*temp10b0
phmb = temp11*temp10b0
pfdb = temp10b1
pfub = -(temp10*temp10b1)
phb0(i, k, j) = 0.0
mutsb(i, j) = mutsb(i, j) + znw(k-1)*pfdb + znw(k)*pfub + &
& znu(k-1)*phmb
END DO
END DO
DO i=itf,its,-1
phb0(i, kts, j) = 0.0
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO k=kts,ktf-1,1
DO i=itf,its,-1
qvf = 1. + rvovrd*moist(i, k, j, p_qv)
temp5 = pb(i, k, j) + p(i, k, j)
temp4 = temp5/p1000mb
temp3 = t0 + t(i, k, j)
temp3b = r_d*temp4**cvpm*alb0(i, k, j)
tb(i, k, j) = tb(i, k, j) + qvf*temp3b/p1000mb
qvfb = temp3*temp3b/p1000mb
IF (.NOT.(temp4 .LE. 0.0 .AND. (cvpm .EQ. 0.0 .OR. cvpm .NE.&
& INT(cvpm)))) pb0(i, k, j) = pb0(i, k, j) + cvpm*temp4**(&
& cvpm-1)*temp3*qvf*r_d*alb0(i, k, j)/p1000mb**2
alb0(i, k, j) = 0.0
moistb(i, k, j, p_qv) = moistb(i, k, j, p_qv) + rvovrd*qvfb
qf2 = 1.
CALL POPREAL8(p(i, k, j))
temp3b0 = -(pb0(i, k, j)/(qf2*rdn(k+1)))
pb0(i, k+1, j) = pb0(i, k+1, j) + pb0(i, k, j)
mub(i, j) = mub(i, j) + temp3b0
qf1b = muts(i, j)*temp3b0
mutsb(i, j) = mutsb(i, j) + qf1*temp3b0
pb0(i, k, j) = 0.0
CALL POPREAL8(qf1)
qtotb = qf2*qf1b
DO ispe=n_moist,param_first_scalar,-1
moistb(i, k, j, ispe) = moistb(i, k, j, ispe) + 0.5*qtotb
moistb(i, k+1, j, ispe) = moistb(i, k+1, j, ispe) + 0.5*&
& qtotb
END DO
END DO
END DO
CALL POPINTEGER4(k)
DO i=itf,its,-1
qvf = 1. + rvovrd*moist(i, k, j, p_qv)
temp2 = pb(i, k, j) + p(i, k, j)
temp1 = temp2/p1000mb
temp0 = t0 + t(i, k, j)
temp0b = r_d*temp1**cvpm*alb0(i, k, j)
tb(i, k, j) = tb(i, k, j) + qvf*temp0b/p1000mb
qvfb = temp0*temp0b/p1000mb
IF (.NOT.(temp1 .LE. 0.0 .AND. (cvpm .EQ. 0.0 .OR. cvpm .NE. &
& INT(cvpm)))) pb0(i, k, j) = pb0(i, k, j) + cvpm*temp1**(&
& cvpm-1)*temp0*qvf*r_d*alb0(i, k, j)/p1000mb**2
alb0(i, k, j) = 0.0
moistb(i, k, j, p_qv) = moistb(i, k, j, p_qv) + rvovrd*qvfb
qf2 = 1.
temp0b0 = -(0.5*pb0(i, k, j)/(rdnw(k)*qf2))
mub(i, j) = mub(i, j) + temp0b0
qf1b = muts(i, j)*temp0b0
mutsb(i, j) = mutsb(i, j) + qf1*temp0b0
pb0(i, k, j) = 0.0
CALL POPREAL8(qf1)
qtotb = qf2*qf1b
DO ispe=n_moist,param_first_scalar,-1
moistb(i, k, j, ispe) = moistb(i, k, j, ispe) + qtotb
END DO
END DO
END DO
ELSE
DO j=jtf,jts,-1
DO k=kts,ktf-1,1
DO i=itf,its,-1
qvf = 1.
temp9 = pb(i, k, j) + p(i, k, j)
temp8 = temp9/p1000mb
temp8b = r_d*qvf*alb0(i, k, j)
tb(i, k, j) = tb(i, k, j) + temp8**cvpm*temp8b/p1000mb
IF (.NOT.(temp8 .LE. 0.0 .AND. (cvpm .EQ. 0.0 .OR. cvpm .NE.&
& INT(cvpm)))) pb0(i, k, j) = pb0(i, k, j) + cvpm*temp8**(&
& cvpm-1)*(t0+t(i, k, j))*temp8b/p1000mb**2
alb0(i, k, j) = 0.0
qf2 = 1.
qtot = 0.
qf1 = qtot*qf2
CALL POPREAL8(p(i, k, j))
temp8b0 = -(pb0(i, k, j)/(qf2*rdn(k+1)))
pb0(i, k+1, j) = pb0(i, k+1, j) + pb0(i, k, j)
mub(i, j) = mub(i, j) + temp8b0
mutsb(i, j) = mutsb(i, j) + qf1*temp8b0
pb0(i, k, j) = 0.0
END DO
END DO
CALL POPINTEGER4(k)
DO i=itf,its,-1
qvf = 1.
temp7 = pb(i, k, j) + p(i, k, j)
temp6 = temp7/p1000mb
temp6b = r_d*qvf*alb0(i, k, j)
tb(i, k, j) = tb(i, k, j) + temp6**cvpm*temp6b/p1000mb
IF (.NOT.(temp6 .LE. 0.0 .AND. (cvpm .EQ. 0.0 .OR. cvpm .NE. &
& INT(cvpm)))) pb0(i, k, j) = pb0(i, k, j) + cvpm*temp6**(&
& cvpm-1)*(t0+t(i, k, j))*temp6b/p1000mb**2
alb0(i, k, j) = 0.0
qf2 = 1.
qtot = 0.
qf1 = qtot*qf2
temp6b0 = -(0.5*pb0(i, k, j)/(rdnw(k)*qf2))
mub(i, j) = mub(i, j) + temp6b0
mutsb(i, j) = mutsb(i, j) + qf1*temp6b0
pb0(i, k, j) = 0.0
END DO
END DO
END IF
END IF
END SUBROUTINE A_CALC_P_RHO_PHI
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of vpow in reverse (adjoint) mode:
! gradient of useful results: y z
! with respect to varying inputs: y z
SUBROUTINE A_VPOW(z, zb, y, yb, x, n)
IMPLICIT NONE
REAL :: x(*), y(*), z(*)
REAL :: yb(*), zb(*)
INTEGER :: j
INTEGER :: n
DO j=n,1,-1
IF (.NOT.(y(j) .LE. 0.0 .AND. (x(j) .EQ. 0.0 .OR. x(j) .NE. INT(x(j)&
& )))) yb(j) = yb(j) + x(j)*y(j)**(x(j)-1)*zb(j)
zb(j) = 0.0_8
END DO
END SUBROUTINE A_VPOW
SUBROUTINE a_calc_php(php,a_php,ph,a_ph,phb,ids,ide,jds,jde,kds,kde,ims,ime, &
jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: phb,ph,a_ph
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: php,a_php
INTEGER :: i,j,k,itf,jtf,ktf
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
! Added by Ning Pan, 2010-07-13
itf =min(ite,ide-1)
jtf =min(jte,jde-1)
ktf =min(kte,kde-1)
!LPB[1]
DO j =jtf, jts, -1
! DO k =kts, ktf
! DO i =its, itf
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =0.5*Tmpv001
! php(i,k,j) =Tmpv002
! ENDDO
! ENDDO
DO k =ktf, kts, -1
DO i =itf, its, -1
a_Tmpv2 =a_php(i,k,j)
a_php(i,k,j) =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[0]
! itf =min(ite, ide-1)
! jtf =min(jte, jde-1)
! ktf =min(kte, kde-1)
END SUBROUTINE a_calc_php
SUBROUTINE a_diagnose_w(ph_tend,a_ph_tend,ph_new,a_ph_new,ph_old,a_ph_old,w, &
a_w,mu,a_mu,dt,u,a_u,v,a_v,ht,cf1,cf2,cf3,rdx,rdy,msftx,msfty,ids,ide,jds, &
jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ph_tend,a_ph_tend,ph_new,a_ph_new, &
ph_old,a_ph_old,u,a_u,v,a_v
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: w,a_w
REAL,DIMENSION(ims:ime,jms:jme) :: mu,a_mu,ht,msftx,msfty
REAL :: dt,cf1,cf2,cf3,rdx,rdy
INTEGER :: i,j,k,itf,jtf
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9, &
Tmpv009,a_Tmpv10,Tmpv010,a_Tmpv11,Tmpv011,a_Tmpv12,Tmpv012,a_Tmpv13,Tmpv013, &
a_Tmpv14,Tmpv014,a_Tmpv15,Tmpv015,a_Tmpv16,Tmpv016,a_Tmpv17,Tmpv017
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
!!LPB[1]
! DO j = jts, jtf
! DO i = its, itf
! w(i,1,j)= msfty(i,j)*.5*rdy*( &
! (ht(i,j+1)-ht(i,j )) &
! *(cf1*v(i,1,j+1)+cf2*v(i,2,j+1)+cf3*v(i,3,j+1)) &
! +(ht(i,j )-ht(i,j-1)) &
! *(cf1*v(i,1,j )+cf2*v(i,2,j )+cf3*v(i,3,j )) ) &
! +msftx(i,j)*.5*rdx*( &
! (ht(i+1,j)-ht(i,j )) &
! *(cf1*u(i+1,1,j)+cf2*u(i+1,2,j)+cf3*u(i+1,3,j)) &
! +(ht(i,j )-ht(i-1,j)) &
! *(cf1*u(i ,1,j)+cf2*u(i ,2,j)+cf3*u(i ,3,j)) )
! ENDDO
! DO k = 2, kte
! DO i = its, itf
! w(i,k,j) = msfty(i,j)*( (ph_new(i,k,j)-ph_old(i,k,j))/dt &
! - ph_tend(i,k,j)/mu(i,j) )/g
! ENDDO
! ENDDO
! ENDDO
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[1]
DO j =jtf, jts, -1
DO i =its, itf
Tmpv001 =cf1*v(i,1,j+1) +cf2*v(i,2,j+1)
Tmpv002 =Tmpv001 +cf3*v(i,3,j+1)
Tmpv003 =(ht(i,j+1)-ht(i,j))*Tmpv002
Tmpv004 =cf1*v(i,1,j) +cf2*v(i,2,j)
Tmpv005 =Tmpv004 +cf3*v(i,3,j)
Tmpv006 =(ht(i,j)-ht(i,j-1))*Tmpv005
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =msfty(i,j)*.5*rdy*Tmpv007
Tmpv009 =cf1*u(i+1,1,j) +cf2*u(i+1,2,j)
Tmpv010 =Tmpv009 +cf3*u(i+1,3,j)
Tmpv011 =(ht(i+1,j)-ht(i,j))*Tmpv010
Tmpv012 =cf1*u(i,1,j) +cf2*u(i,2,j)
Tmpv013 =Tmpv012 +cf3*u(i,3,j)
Tmpv014 =(ht(i,j)-ht(i-1,j))*Tmpv013
Tmpv015 =Tmpv011 +Tmpv014
Tmpv016 =msftx(i,j)*.5*rdx*Tmpv015
Tmpv017 =Tmpv008 +Tmpv016
! w(i,1,j) =Tmpv017
ENDDO
DO k =2, kte
DO i =its, itf
Tmpv001 =ph_new(i,k,j) -ph_old(i,k,j)
Tmpv002 =Tmpv001/dt
Tmpv003 =ph_tend(i,k,j)/mu(i,j)
Tmpv004 =Tmpv002 -Tmpv003
Tmpv005 =msfty(i,j)*Tmpv004
Tmpv006 =Tmpv005/g
! w(i,k,j) =Tmpv006
ENDDO
ENDDO
DO k =kte, 2, -1
DO i =itf, its, -1
a_Tmpv6 =a_w(i,k,j)
a_w(i,k,j) =0.0
a_Tmpv5 =a_Tmpv6/g
a_Tmpv4 =msfty(i,j)*a_Tmpv5
a_Tmpv2 =a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv3/mu(i,j)
a_mu(i,j) =a_mu(i,j) -ph_tend(i,k,j)/(mu(i,j)*mu(i,j))*a_Tmpv3
a_Tmpv1 =a_Tmpv2/dt
a_ph_new(i,k,j) =a_ph_new(i,k,j) +a_Tmpv1
a_ph_old(i,k,j) =a_ph_old(i,k,j) -a_Tmpv1
ENDDO
ENDDO
DO i =itf, its, -1
a_Tmpv17 =a_w(i,1,j)
a_w(i,1,j) =0.0
a_Tmpv8 =a_Tmpv17
a_Tmpv16 =a_Tmpv17
a_Tmpv15 =msftx(i,j)*.5*rdx*a_Tmpv16
a_Tmpv11 =a_Tmpv15
a_Tmpv14 =a_Tmpv15
a_Tmpv13 =(ht(i,j)-ht(i-1,j))*a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_u(i,3,j) =a_u(i,3,j) +cf3*a_Tmpv13
a_u(i,1,j) =a_u(i,1,j) +cf1*a_Tmpv12
a_u(i,2,j) =a_u(i,2,j) +cf2*a_Tmpv12
a_Tmpv10 =(ht(i+1,j)-ht(i,j))*a_Tmpv11
a_Tmpv9 =a_Tmpv10
a_u(i+1,3,j) =a_u(i+1,3,j) +cf3*a_Tmpv10
a_u(i+1,1,j) =a_u(i+1,1,j) +cf1*a_Tmpv9
a_u(i+1,2,j) =a_u(i+1,2,j) +cf2*a_Tmpv9
a_Tmpv7 =msfty(i,j)*.5*rdy*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =(ht(i,j)-ht(i,j-1))*a_Tmpv6
a_Tmpv4 =a_Tmpv5
a_v(i,3,j) =a_v(i,3,j) +cf3*a_Tmpv5
a_v(i,1,j) =a_v(i,1,j) +cf1*a_Tmpv4
a_v(i,2,j) =a_v(i,2,j) +cf2*a_Tmpv4
a_Tmpv2 =(ht(i,j+1)-ht(i,j))*a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_v(i,3,j+1) =a_v(i,3,j+1) +cf3*a_Tmpv2
a_v(i,1,j+1) =a_v(i,1,j+1) +cf1*a_Tmpv1
a_v(i,2,j+1) =a_v(i,2,j+1) +cf2*a_Tmpv1
ENDDO
ENDDO
!LPB[0]
! itf =min(ite, ide-1)
! jtf =min(jte, jde-1)
END SUBROUTINE a_diagnose_w
SUBROUTINE a_rhs_ph(ph_tend,a_ph_tend,u,a_u,v,a_v,ww,a_ww,ph,a_ph,ph_old, &
a_ph_old,phb,w,a_w,mut,a_mut,muu,a_muu,muv,a_muv,fnm,fnp,rdnw,cfn,cfn1,rdx, &
rdy,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,non_hydrostatic,config_flags,ids, &
ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: u,a_u,v,a_v,ww,a_ww,ph,a_ph, &
ph_old,a_ph_old,phb,w,a_w
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ph_tend,a_ph_tend
REAL,DIMENSION(ims:ime,jms:jme) :: muu,a_muu,muv,a_muv,mut,a_mut,msfux,msfuy, &
msfvx,msfvy,msftx,msfty,msfvx_inv
REAL,DIMENSION(kms:kme) :: rdnw,fnm,fnp
REAL :: cfn,cfn1,rdx,rdy
LOGICAL :: non_hydrostatic
INTEGER :: i,j,k,itf,jtf,ktf,kz,i_start,j_start
REAL :: ur,a_ur,ul,a_ul,ub,a_ub,vr,a_vr,vl,a_vl,vb,a_vb
REAL,DIMENSION(its:ite,kts:kte) :: wdwn,a_wdwn
INTEGER :: advective_order
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9, &
Tmpv009,a_Tmpv10,Tmpv010,a_Tmpv11,Tmpv011,a_Tmpv12,Tmpv012,a_Tmpv13,Tmpv013, &
a_Tmpv14,Tmpv014,a_Tmpv15,Tmpv015,a_Tmpv16,Tmpv016,a_Tmpv17,Tmpv017, &
a_Tmpv18,Tmpv018,a_Tmpv19,Tmpv019,a_Tmpv20,Tmpv020,a_Tmpv21,Tmpv021
!REVISED BY WALLS
REAL,DIMENSION(min0(its,jts):max0(MAX(ite,ide-1),MAX(jte,jde-1))) :: Tmpv200
REAL,DIMENSION(min0(its,jts):max0(MAX(ite,ide-1),MAX(jte,jde-1))) :: Tmpv201
REAL,DIMENSION(min0(its,jts):max0(MAX(ite,ide-1),MAX(jte,jde-1))) :: Tmpv202
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv203
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv204
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv205
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv206
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv207
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv208
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv209
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2010
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2011
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2012
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2013
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2014
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2015
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2016
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2017
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2018
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2019
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2020
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2021
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2022
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2023
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2024
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2025
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2026
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2027
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2028
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2029
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2030
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2031
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2032
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2033
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2034
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2035
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2036
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2037
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2038
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2039
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2040
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2041
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2042
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv2043
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2044
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2045
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2046
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2047
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2048
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2049
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2050
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2051
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2052
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2053
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2054
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2055
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2056
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2057
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2058
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2059
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2060
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2061
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2062
REAL,DIMENSION(jts:MAX(jte,jde-1)) :: Tmpv2063
REAL,DIMENSION(min0(its,2):max0(MAX(ite,ide-1),kde-1),min0(2,jts+1,jts) &
:max0(kte,MAX(jte,jde-1)-2,kde,MAX(jte,jde-1))) :: Tmpv300
REAL,DIMENSION(min0(its,2):max0(MAX(ite,ide-1),kde-1),min0(2,jts+1,jts) &
:max0(kte,MAX(jte,jde-1)-2,kde,MAX(jte,jde-1))) :: Tmpv301
REAL,DIMENSION(min0(its,2):max0(MAX(ite,ide-1),kde-1),min0(jts+1,2,jts) &
:max0(MAX(jte,jde-1)-2,kde,MAX(jte,jde-1))) :: Tmpv302
REAL,DIMENSION(its:MAX(ite,ide-1),jts+1:MAX(jte,jde-1)) :: Tmpv303
REAL,DIMENSION(its:MAX(ite,ide-1),jts+1:MAX(jte,jde-1)) :: Tmpv304
REAL,DIMENSION(its:MAX(ite,ide-1),jts+1:MAX(jte,jde-1)) :: Tmpv305
REAL,DIMENSION(its+1:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv306
REAL,DIMENSION(its+1:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv307
REAL,DIMENSION(its+1:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv308
REAL,DIMENSION(its+1:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv309
REAL,DIMENSION(its+1:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3010
REAL,DIMENSION(its+1:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3011
REAL,DIMENSION(its:MAX(ite,ide-1),jts+2:MAX(jte,jde-1)) :: Tmpv3012
REAL,DIMENSION(its:MAX(ite,ide-1),jts+2:MAX(jte,jde-1)) :: Tmpv3013
REAL,DIMENSION(its:MAX(ite,ide-1),jts+2:MAX(jte,jde-1)) :: Tmpv3014
REAL,DIMENSION(its:MAX(ite,ide-1),jts+2:MAX(jte,jde-1)) :: Tmpv3015
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3016
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3017
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3018
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3019
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3020
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3021
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3022
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3023
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3024
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3025
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3026
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3027
REAL,DIMENSION(its+2:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3028
REAL,DIMENSION(its+2:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3029
REAL,DIMENSION(its+2:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3030
REAL,DIMENSION(its+2:MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3031
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3032
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3033
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3034
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3035
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3036
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3037
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3038
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3039
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3040
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3041
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3042
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3043
REAL,DIMENSION(its:MAX(ite,ide-1),MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv3044
REAL,DIMENSION(its:MAX(ite,ide-1),MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv3045
REAL,DIMENSION(its:MAX(ite,ide-1),MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv3046
REAL,DIMENSION(its:MAX(ite,ide-1),MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv3047
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3048
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3049
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3050
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3051
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3052
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3053
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3054
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3055
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3056
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3057
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3058
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3059
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3060
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3061
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3062
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3063
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3064
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3065
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3066
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1) :: Tmpv3067
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3068
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3069
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3070
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),jts:MAX(jte,jde-1)) :: Tmpv3071
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3072
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3073
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3074
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3075
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3076
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3077
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3078
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3079
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3080
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3081
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3082
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3083
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3084
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3085
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3086
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3087
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3088
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3089
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3090
REAL,DIMENSION(2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv3091
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+1:MAX(jte,jde-1)) :: Tmpv400
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+1:MAX(jte,jde-1)) :: Tmpv401
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+1:MAX(jte,jde-1)) :: Tmpv402
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+1:MAX(jte,jde-1)) :: Tmpv403
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+1:MAX(jte,jde-1)) :: Tmpv404
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+1:MAX(jte,jde-1)) :: Tmpv405
REAL,DIMENSION(its+1:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv406
REAL,DIMENSION(its+1:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv407
REAL,DIMENSION(its+1:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv408
REAL,DIMENSION(its+1:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv409
REAL,DIMENSION(its+1:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4010
REAL,DIMENSION(its+1:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4011
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+2:MAX(jte,jde-1)) :: Tmpv4012
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+2:MAX(jte,jde-1)) :: Tmpv4013
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+2:MAX(jte,jde-1)) :: Tmpv4014
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,jts+2:MAX(jte,jde-1)) :: Tmpv4015
REAL,DIMENSION(its+2:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4016
REAL,DIMENSION(its+2:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4017
REAL,DIMENSION(its+2:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4018
REAL,DIMENSION(its+2:MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4019
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv4020
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv4021
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv4022
REAL,DIMENSION(its:MAX(ite,ide-1),2:kte-1,MIN(jts,jds+3):MAX(jte,jde-1)) :: Tmpv4023
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4024
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4025
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4026
REAL,DIMENSION(MIN(its,ids+3):MAX(ite,ide-1),2:kte-1,jts:MAX(jte,jde-1)) :: Tmpv4027
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
advective_order = config_flags%h_sca_adv_order
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
ktf=MIN(kte,kde-1)
! Remarked by Ning Pan, 2010-07-20: LPB[3]-LPB[14] are useless
!!LPB[3]
! DO j = jts, jtf
! DO k = 2, kte
! DO i = its, itf
! wdwn(i,k) = .5*(ww(i,k,j)+ww(i,k-1,j))*rdnw(k-1) &
! *(ph(i,k,j)-ph(i,k-1,j)+phb(i,k,j)-phb(i,k-1,j))
! ENDDO
! ENDDO
! DO k = 2, kte-1
! DO i = its, itf
! ph_tend(i,k,j) = ph_tend(i,k,j) &
! - (fnm(k)*wdwn(i,k+1)+fnp(k)*wdwn(i,k))
! ENDDO
! ENDDO
! ENDDO
!LPB[4]
!LPB[5]
! IF (non_hydrostatic) THEN
! DO j = jts, jtf
! DO i = its, itf
! ph_tend(i,kde,j) = 0.
! ENDDO
! DO k = 2, kte
! DO i = its, itf
! ph_tend(i,k,j) = ph_tend(i,k,j) + mut(i,j)*g*w(i,k,j)/msfty(i,j)
! ENDDO
! ENDDO
! ENDDO
! END IF
!LPB[6]
!LPB[7]
! IF (advective_order <= 2) THEN
! i_start = its
! j_start = jts
! itf=MIN(ite,ide-1)
! jtf=MIN(jte,jde-1)
! IF ( (config_flags%open_ys .or. specified) .and. jts == jds ) j_start = jts+1
! IF ( (config_flags%open_ye .or. specified) .and. jte == jde ) jtf = jtf-2
! DO j = j_start, jtf
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1)* &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j )* &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
! * &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j ) &
! * &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! ENDDO
! i_start = its
! j_start = jts
! itf=MIN(ite,ide-1)
! jtf=MIN(jte,jde-1)
! IF ( (config_flags%open_xs .or. specified) .and. its == ids ) i_start = its+1
! IF ( (config_flags%open_xe .or. specified) .and. ite == ide ) itf = itf-2
! DO j = j_start, jtf
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))* &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j)* &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
! +muu(i ,j)*(u(i ,k,j)+u(i ,k-1,j))*msfux(i ,j)* &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))* &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
! * &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
!! &
! +muu(i ,j)*(cfn*u(i ,k-1,j)+cfn1*u(i ,k-2,j))*msfux( i,j) &
! * &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! ENDDO
! ELSE IF (advective_order <= 4) THEN
! i_start = its
! j_start = jts
! itf=MIN(ite,ide-1)
! jtf=MIN(jte,jde-1)
! IF ( (config_flags%open_ys .or. specified) .and. jts == jds ) j_start = jts+2
! IF ( (config_flags%open_ye .or. specified) .and. jte == jde ) jtf = jtf-3
! DO j = j_start, jtf
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))*( &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j ))* (1./12.) &
! *( &
! 8.*(ph(i,k,j+1)-ph(i,k,j-1)) &
! -(ph(i,k,j+2)-ph(i,k,j-2)) &
! +8.*(phb(i,k,j+1)-phb(i,k,j-1)) &
! -(phb(i,k,j+2)-phb(i,k,j-2)) ) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))*( &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j )) &
! * (1./12.)*( &
! 8.*(ph(i,k,j+1)-ph(i,k,j-1)) &
!! &
! -(ph(i,k,j+2)-ph(i,k,j-2)) &
!! &
! +8.*(phb(i,k,j+1)-phb(i,k,j-1)) &
!! &
! -(phb(i,k,j+2)-phb(i,k,j-2)) ) )
! ENDDO
! ENDDO
! IF ( (config_flags%open_ys .or. specified) .and. jts <= jds+1 ) THEN
! j = jds+1
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1)* &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j )* &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
! * &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j ) &
! * &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! END IF
! IF ( (config_flags%open_ye .or. specified) .and. jte >= jde-2 ) THEN
! j = jde-2
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1)* &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j )* &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
! * &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j ) &
! * &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! END IF
! i_start = its
! j_start = jts
! itf=MIN(ite,ide-1)
! jtf=MIN(jte,jde-1)
! IF ( (config_flags%open_xs) .and. its == ids ) i_start = its+2
! IF ( (config_flags%open_xe) .and. ite == ide ) itf = itf-3
! DO j = j_start, jtf
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))*( &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j) &
! +muu(i,j )*(u(i ,k,j)+u(i ,k-1,j))*msfux(i ,j) )* (1./12.)*( &
! 8.*(ph(i+1,k,j)-ph(i-1,k,j)) &
! -(ph(i+2,k,j)-ph(i-2,k,j)) &
! +8.*(phb(i+1,k,j)-phb(i-1,k,j)) &
! -(phb(i+2,k,j)-phb(i-2,k,j)) ) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))*( &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
!! &
! +muu(i,j )*(cfn*u(i ,k-1,j)+cfn1*u(i ,k-2,j))*msfux(i ,j) ) &
! * (1./12.)*( &
! 8.*(ph(i+1,k,j)-ph(i-1,k,j)) &
!! &
! -(ph(i+2,k,j)-ph(i-2,k,j)) &
!! &
! +8.*(phb(i+1,k,j)-phb(i-1,k,j)) &
!! &
! -(phb(i+2,k,j)-phb(i-2,k,j)) ) )
! ENDDO
! ENDDO
! IF ( (config_flags%open_xs .or. specified) .and. its <= ids+1 ) THEN
! i = ids + 1
! DO j = j_start, jtf
! DO k = 2, kte-1
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))* &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j)* &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
! +muu(i ,j)*(u(i ,k,j)+u(i ,k-1,j))*msfux(i ,j)* &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! ENDDO
! k = kte
! DO j = j_start, jtf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))* &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
! * &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
!! &
! +muu(i ,j)*(cfn*u(i ,k-1,j)+cfn1*u(i ,k-2,j))*msfux( i,j) &
! * &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! END IF
! IF ( (config_flags%open_xe .or. specified) .and. ite >= ide-2 ) THEN
! i = ide-2
! DO j = j_start, jtf
! DO k = 2, kte-1
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))* &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j)* &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
! +muu(i ,j)*(u(i ,k,j)+u(i ,k-1,j))*msfux(i ,j)* &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! ENDDO
! k = kte
! DO j = j_start, jtf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))* &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
! * &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
!! &
! +muu(i ,j)*(cfn*u(i ,k-1,j)+cfn1*u(i ,k-2,j))*msfux( i,j) &
! * &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! END IF
! ELSE IF (advective_order <= 6) THEN
! i_start = its
! j_start = jts
! itf=MIN(ite,ide-1)
! jtf=MIN(jte,jde-1)
! IF (config_flags%open_ys .or. specified ) j_start = max(jts,jds+3)
! IF (config_flags%open_ye .or. specified ) jtf = min(jtf,jde-4)
! DO j = j_start, jtf
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* ( &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j ) )* (1./60.) &
! *( &
! 45.*(ph(i,k,j+1)-ph(i,k,j-1)) &
! -9.*(ph(i,k,j+2)-ph(i,k,j-2)) &
! +(ph(i,k,j+3)-ph(i,k,j-3)) &
! +45.*(phb(i,k,j+1)-phb(i,k,j-1)) &
! -9.*(phb(i,k,j+2)-phb(i,k,j-2)) &
! +(phb(i,k,j+3)-phb(i,k,j-3)) ) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* ( &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j ) ) &
! * (1./60.)*( &
! 45.*(ph(i,k,j+1)-ph(i,k,j-1)) &
!! &
! -9.*(ph(i,k,j+2)-ph(i,k,j-2)) &
!! &
! +(ph(i,k,j+3)-ph(i,k,j-3)) &
!! &
! +45.*(phb(i,k,j+1)-phb(i,k,j-1)) &
!! &
! -9.*(phb(i,k,j+2)-phb(i,k,j-2)) &
!! &
! +(phb(i,k,j+3)-phb(i,k,j-3)) ) )
! ENDDO
! ENDDO
! IF ( (config_flags%open_ys .or. specified) .and. jts <= jds+2 .and. jds+2 <= jte ) &
! THEN
! j = jds+2
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* ( &
!! &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j ) )* (1./12.) &
! *( &
! 8.*(ph(i,k,j+1)-ph(i,k,j-1)) &
! -(ph(i,k,j+2)-ph(i,k,j-2)) &
! +8.*(phb(i,k,j+1)-phb(i,k,j-1)) &
! -(phb(i,k,j+2)-phb(i,k,j-2)) ) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* ( &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j) ) &
! * (1./12.)*( &
! 8.*(ph(i,k,j+1)-ph(i,k,j-1)) &
!! &
! -(ph(i,k,j+2)-ph(i,k,j-2)) &
!! &
! +8.*(phb(i,k,j+1)-phb(i,k,j-1)) &
!! &
! -(phb(i,k,j+2)-phb(i,k,j-2)) ) )
! ENDDO
! END IF
! IF ( (config_flags%open_ye .or. specified) .and. jts <= jde-3 .and. jde-3 <= jte ) &
! THEN
! j = jde-3
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* ( &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j) )* (1./12.)*( &
! 8.*(ph(i,k,j+1)-ph(i,k,j-1)) &
! -(ph(i,k,j+2)-ph(i,k,j-2)) &
! +8.*(phb(i,k,j+1)-phb(i,k,j-1)) &
! -(phb(i,k,j+2)-phb(i,k,j-2)) ) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* ( &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j) ) &
! * (1./12.)*( &
! 8.*(ph(i,k,j+1)-ph(i,k,j-1)) &
!! &
! -(ph(i,k,j+2)-ph(i,k,j-2)) &
!! &
! +8.*(phb(i,k,j+1)-phb(i,k,j-1)) &
!! &
! -(phb(i,k,j+2)-phb(i,k,j-2)) ) )
! ENDDO
! END IF
! IF ( (config_flags%open_ys .or. specified) .and. jts <= jds+1 .and. jds+1 <= jte ) &
! THEN
! j = jds+1
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1)* &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j )* &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
! * &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j ) &
! * &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! END IF
! IF ( (config_flags%open_ye .or. specified) .and. jts <= jde-2 .and. jde-2 <= jte ) &
! THEN
! j = jde-2
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdy/msfty(i,j))* &
! ( muv(i,j+1)*(v(i,k,j+1)+v(i,k-1,j+1))*msfvy(i,j+1)* &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
! +muv(i,j )*(v(i,k,j )+v(i,k-1,j ))*msfvy(i,j )* &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdy/msfty(i,j))* &
!! &
! ( muv(i,j+1)*(cfn*v(i,k-1,j+1)+cfn1*v(i,k-2,j+1))*msfvy(i,j+1) &
! * &
! (phb(i,k,j+1)-phb(i,k,j )+ph(i,k,j+1)-ph(i,k,j )) &
!! &
! +muv(i,j )*(cfn*v(i,k-1,j )+cfn1*v(i,k-2,j ))*msfvy(i,j ) &
! * &
! (phb(i,k,j )-phb(i,k,j-1)+ph(i,k,j )-ph(i,k,j-1)) )
! ENDDO
! END IF
! i_start = its
! j_start = jts
! itf=MIN(ite,ide-1)
! jtf=MIN(jte,jde-1)
! IF (config_flags%open_xs .or. specified ) i_start = max(its,ids+3)
! IF (config_flags%open_xe .or. specified ) itf = min(itf,ide-4)
! DO j = j_start, jtf
! DO k = 2, kte-1
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))*( &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j) &
! +muu(i,j )*(u(i,k,j )+u(i,k-1,j ))*msfux(i,j) )* (1./60.)*( &
! 45.*(ph(i+1,k,j)-ph(i-1,k,j)) &
! -9.*(ph(i+2,k,j)-ph(i-2,k,j)) &
! +(ph(i+3,k,j)-ph(i-3,k,j)) &
! +45.*(phb(i+1,k,j)-phb(i-1,k,j)) &
! -9.*(phb(i+2,k,j)-phb(i-2,k,j)) &
! +(phb(i+3,k,j)-phb(i-3,k,j)) ) )
! ENDDO
! ENDDO
! k = kte
! DO i = i_start, itf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))*( &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
!! &
! +muu(i,j )*(cfn*u(i ,k-1,j)+cfn1*u(i,k-2,j))*msfux(i,j) ) &
! * (1./60.)*( &
! 45.*(ph(i+1,k,j)-ph(i-1,k,j)) &
!! &
! -9.*(ph(i+2,k,j)-ph(i-2,k,j)) &
!! &
! +(ph(i+3,k,j)-ph(i-3,k,j)) &
!! &
! +45.*(phb(i+1,k,j)-phb(i-1,k,j)) &
!! &
! -9.*(phb(i+2,k,j)-phb(i-2,k,j)) &
!! &
! +(phb(i+3,k,j)-phb(i-3,k,j)) ) )
! ENDDO
! ENDDO
! IF ( (config_flags%open_xs) .and. its <= ids+2 .and. ids+2 <= ite ) THEN
! i = ids + 2
! DO j = j_start, jtf
! DO k = 2, kte-1
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))*( &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j) &
! +muu(i,j )*(u(i,k,j )+u(i,k-1,j ))*msfux(i,j) )* (1./12.)*( &
! 8.*(ph(i+1,k,j)-ph(i-1,k,j)) &
! -(ph(i+2,k,j)-ph(i-2,k,j)) &
! +8.*(phb(i+1,k,j)-phb(i-1,k,j)) &
! -(phb(i+2,k,j)-phb(i-2,k,j)) ) )
! ENDDO
! k = kte
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))*( &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
!! &
! +muu(i,j )*(cfn*u(i ,k-1,j)+cfn1*u(i,k-2,j))*msfux(i,j) ) &
! * (1./12.)*( &
! 8.*(ph(i+1,k,j)-ph(i-1,k,j)) &
!! &
! -(ph(i+2,k,j)-ph(i-2,k,j)) &
!! &
! +8.*(phb(i+1,k,j)-phb(i-1,k,j)) &
!! &
! -(phb(i+2,k,j)-phb(i-2,k,j)) ) )
! ENDDO
! END IF
! IF ( (config_flags%open_xe) .and. its <= ide-3 .and. ide-3 <= ite ) THEN
! i = ide-3
! DO j = j_start, jtf
! DO k = 2, kte-1
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))*( &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j) &
! +muu(i,j )*(u(i,k,j )+u(i,k-1,j ))*msfux(i,j) )* (1./12.)*( &
! 8.*(ph(i+1,k,j)-ph(i-1,k,j)) &
! -(ph(i+2,k,j)-ph(i-2,k,j)) &
! +8.*(phb(i+1,k,j)-phb(i-1,k,j)) &
! -(phb(i+2,k,j)-phb(i-2,k,j)) ) )
! ENDDO
! k = kte
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))*( &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
!! &
! +muu(i,j )*(cfn*u(i ,k-1,j)+cfn1*u(i,k-2,j))*msfux(i,j) ) &
! * (1./12.)*( &
! 8.*(ph(i+1,k,j)-ph(i-1,k,j)) &
!! &
! -(ph(i+2,k,j)-ph(i-2,k,j)) &
!! &
! +8.*(phb(i+1,k,j)-phb(i-1,k,j)) &
!! &
! -(phb(i+2,k,j)-phb(i-2,k,j)) ) )
! ENDDO
! END IF
! IF ( (config_flags%open_xs .or. specified) .and. its <= ids+1 .and. ids+1 <= ite ) &
! THEN
! i = ids + 1
! DO j = j_start, jtf
! DO k = 2, kte-1
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))* &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j)* &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
! +muu(i ,j)*(u(i ,k,j)+u(i ,k-1,j))*msfux(i ,j)* &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! ENDDO
! k = kte
! DO j = j_start, jtf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))* &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
! * &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
!! &
! +muu(i ,j)*(cfn*u(i ,k-1,j)+cfn1*u(i ,k-2,j))*msfux( i,j) &
! * &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! END IF
! IF ( (config_flags%open_xe .or. specified) .and. its <= ide-2 .and. ide-2 <= ite ) &
! THEN
! i = ide-2
! DO j = j_start, jtf
! DO k = 2, kte-1
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.25*rdx/msfty(i,j))* &
! ( muu(i+1,j)*(u(i+1,k,j)+u(i+1,k-1,j))*msfux(i+1,j)* &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
! +muu(i ,j)*(u(i ,k,j)+u(i ,k-1,j))*msfux(i ,j)* &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! ENDDO
! k = kte
! DO j = j_start, jtf
! ph_tend(i,k,j)=ph_tend(i,k,j) - (0.5*rdx/msfty(i,j))* &
!! &
! ( muu(i+1,j)*(cfn*u(i+1,k-1,j)+cfn1*u(i+1,k-2,j))*msfux(i+1,j) &
! * &
! (phb(i+1,k,j)-phb(i ,k,j)+ph(i+1,k,j)-ph(i ,k,j)) &
!! &
! +muu(i ,j)*(cfn*u(i ,k-1,j)+cfn1*u(i ,k-2,j))*msfux( i,j) &
! * &
! (phb(i ,k,j)-phb(i-1,k,j)+ph(i ,k,j)-ph(i-1,k,j)) )
! ENDDO
! END IF
! END IF
!LPB[8]
! i_start = its
! itf=MIN(ite,ide-1)
!LPB[9]
! IF ( (config_flags%open_ys) .and. jts == jds ) THEN
! j=jts
! DO k=2,kde
! kz = min(k,kde-1)
! DO i = its,itf
! vb =.5*( fnm(kz)*(v(i,kz ,j+1)+v(i,kz ,j )) &
! +fnp(kz)*(v(i,kz-1,j+1)+v(i,kz-1,j )) )
! vl=amin1(vb,0.)
! ph_tend(i,k,j)=ph_tend(i,k,j)-rdy*mut(i,j)*( &
! +vl*(ph_old(i,k,j+1)-ph_old(i,k,j)))
! ENDDO
! ENDDO
! END IF
!LPB[10]
!LPB[11]
! IF ( (config_flags%open_ye) .and. jte == jde ) THEN
! j=jte-1
! DO k=2,kde
! kz = min(k,kde-1)
! DO i = its,itf
! vb=.5*( fnm(kz)*(v(i,kz ,j+1)+v(i,kz ,j)) &
! +fnp(kz)*(v(i,kz-1,j+1)+v(i,kz-1,j)) )
! vr=amax1(vb,0.)
! ph_tend(i,k,j)=ph_tend(i,k,j)-rdy*mut(i,j)*( &
! +vr*(ph_old(i,k,j)-ph_old(i,k,j-1)))
! ENDDO
! ENDDO
! END IF
!LPB[12]
! j_start = its
! jtf=MIN(jte,jde-1)
!LPB[13]
! IF ( (config_flags%open_xs) .and. its == ids ) THEN
! i=its
! DO j = jts,jtf
! DO k=2,kde-1
! kz = k
! ub =.5*( fnm(kz)*(u(i+1,kz ,j)+u(i ,kz ,j)) &
! +fnp(kz)*(u(i+1,kz-1,j)+u(i ,kz-1,j)) )
! ul=amin1(ub,0.)
! ph_tend(i,k,j)=ph_tend(i,k,j)-(msftx(i,j)/msfty(i,j))*rdx*mut(i,j) &
! *( &
! +ul*(ph_old(i+1,k,j)-ph_old(i,k,j)))
! ENDDO
! k = kde
! kz = k
! ub =.5*( fnm(kz)*(u(i+1,kz ,j)+u(i ,kz ,j)) &
! +fnp(kz)*(u(i+1,kz-1,j)+u(i ,kz-1,j)) )
! ul=amin1(ub,0.)
! ph_tend(i,k,j)=ph_tend(i,k,j)-(msftx(i,j)/msfty(i,j))*rdx*mut(i,j) &
! *( &
! +ul*(ph_old(i+1,k,j)-ph_old(i,k,j)))
! ENDDO
! END IF
!!LPB[14]
!!LPB[15]
!
! IF ( (config_flags%open_xe) .and. ite == ide ) THEN
! i = ite-1
! DO j = jts,jtf
! DO k=2,kde-1
! kz = k
! ub=.5*( fnm(kz)*(u(i+1,kz ,j)+u(i,kz ,j)) &
! +fnp(kz)*(u(i+1,kz-1,j)+u(i,kz-1,j)) )
! ur=amax1(ub,0.)
! ph_tend(i,k,j)=ph_tend(i,k,j)-(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*( &
! +ur*(ph_old(i,k,j)-ph_old(i-1,k,j)))
! ENDDO
! k = kde
! kz = k-1
! ub=.5*( fnm(kz)*(u(i+1,kz ,j)+u(i,kz ,j)) &
! +fnp(kz)*(u(i+1,kz-1,j)+u(i,kz-1,j)) )
! ur=amax1(ub,0.)
! ph_tend(i,k,j)=ph_tend(i,k,j)-(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*( &
! +ur*(ph_old(i,k,j)-ph_old(i-1,k,j)))
! ENDDO
! END IF
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
a_ur =0.0
a_ul =0.0
a_ub =0.0
a_vr =0.0
a_vl =0.0
a_vb =0.0
Do K1_ADJ =kts, kte
Do K0_ADJ =its, ite
a_wdwn(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
! Added by Ning Pan, 2010-07-20
j_start =its
jtf =min(jte, jde-1)
!LPB[15]
IF( (config_flags%open_xe) .and. ite == ide ) THEN
i =ite-1
DO j =jts, jtf
DO k =2, kde-1
kz =k
Tmpv001 =u(i+1,kz,j) +u(i,kz,j)
Tmpv002 =fnm(kz)*Tmpv001
Tmpv003 =u(i+1,kz-1,j) +u(i,kz-1,j)
Tmpv004 =fnp(kz)*Tmpv003
Tmpv005 =Tmpv002 +Tmpv004
Tmpv006 =.5*Tmpv005
ub =Tmpv006 ! Removed remark by Ning Pan, 2010-07-20
! Revised by Ning Pan, 2010-07-20
! Tmpv300(k,j) =ur
! ur =max(ub, 0.)
Tmpv300(k,j) =ub
ur =amax1(ub, 0.)
Tmpv001 =ph_old(i,k,j) -ph_old(i-1,k,j)
Tmpv301(k,j) =Tmpv001
Tmpv002 =ur*Tmpv301(k,j)
Tmpv302(k,j) =+Tmpv002
! Tmpv003 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*Tmpv302(k,j) ! Remarked by Ning Pan, 2010-07-20
! Tmpv004 =ph_tend(i,k,j) -Tmpv003 ! Remarked by Ning Pan, 2010-07-20
! ph_tend(i,k,j) =Tmpv004
ENDDO
k =kde
kz =k-1
Tmpv001 =u(i+1,kz,j) +u(i,kz,j)
Tmpv002 =fnm(kz)*Tmpv001
Tmpv003 =u(i+1,kz-1,j) +u(i,kz-1,j)
Tmpv004 =fnp(kz)*Tmpv003
Tmpv005 =Tmpv002 +Tmpv004
Tmpv006 =.5*Tmpv005
ub =Tmpv006 ! Removed remark by Ning Pan, 2010-07-20
! Revised by Ning Pan, 2010-07-20
! Tmpv200(j) =ur
! ur =max(ub, 0.)
Tmpv200(j) =ub
ur =amax1(ub, 0.)
Tmpv001 =ph_old(i,k,j) -ph_old(i-1,k,j)
Tmpv201(j) =Tmpv001
Tmpv002 =ur*Tmpv201(j)
Tmpv202(j) =+Tmpv002
! Tmpv003 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*Tmpv202(j) ! Remarked by Ning Pan, 2010-07-20
! Tmpv004 =ph_tend(i,k,j) -Tmpv003 ! Remarked by Ning Pan, 2010-07-20
! ph_tend(i,k,j) =Tmpv004
ENDDO
END IF
IF( (config_flags%open_xe) .and. ite == ide ) THEN
! Added by Ning Pan, 2010-07-20
i =ite-1
DO j =jtf, jts, -1
! Added by Ning Pan, 2010-07-20
k =kde
kz =k-1
ub =Tmpv200(j)
ur =amax1(ub, 0.)
a_Tmpv4 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_mut(i,j) =a_mut(i,j) +(msftx(i,j)/msfty(i,j))*rdx*Tmpv202(j)*a_Tmpv3
a_Tmpv2 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*a_Tmpv3
a_ur =a_ur +Tmpv201(j)*a_Tmpv2
a_Tmpv1 =ur*a_Tmpv2
a_ph_old(i,k,j) =a_ph_old(i,k,j) +a_Tmpv1
a_ph_old(i-1,k,j) =a_ph_old(i-1,k,j) -a_Tmpv1
! ur =Tmpv200(j) ! Remarked by Ning Pan, 2010-07-20
a_ub =a_ub +(1.0 +(1.0)*sign(1.0, ub -0.))*0.5*a_ur
a_ur =0.0
a_Tmpv6 =a_ub
a_ub =0.0
a_Tmpv5 =.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fnp(kz)*a_Tmpv4
a_u(i+1,kz-1,j) =a_u(i+1,kz-1,j) +a_Tmpv3
a_u(i,kz-1,j) =a_u(i,kz-1,j) +a_Tmpv3
a_Tmpv1 =fnm(kz)*a_Tmpv2
a_u(i+1,kz,j) =a_u(i+1,kz,j) +a_Tmpv1
a_u(i,kz,j) =a_u(i,kz,j) +a_Tmpv1
DO k =kde-1, 2, -1
! Added by Ning Pan, 2010-07-20
kz =k
ub =Tmpv300(k,j)
ur =amax1(ub, 0.)
a_Tmpv4 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_mut(i,j) =a_mut(i,j) +(msftx(i,j)/msfty(i,j))*rdx*Tmpv302(k,j)*a_Tmpv3
a_Tmpv2 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*a_Tmpv3
a_ur =a_ur +Tmpv301(k,j)*a_Tmpv2
a_Tmpv1 =ur*a_Tmpv2
a_ph_old(i,k,j) =a_ph_old(i,k,j) +a_Tmpv1
a_ph_old(i-1,k,j) =a_ph_old(i-1,k,j) -a_Tmpv1
! ur =Tmpv300(k,j) ! Remarked by Ning Pan, 2010-07-20
a_ub =a_ub +(1.0 +(1.0)*sign(1.0, ub -0.))*0.5*a_ur
a_ur =0.0
a_Tmpv6 =a_ub
a_ub =0.0
a_Tmpv5 =.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fnp(kz)*a_Tmpv4
a_u(i+1,kz-1,j) =a_u(i+1,kz-1,j) +a_Tmpv3
a_u(i,kz-1,j) =a_u(i,kz-1,j) +a_Tmpv3
a_Tmpv1 =fnm(kz)*a_Tmpv2
a_u(i+1,kz,j) =a_u(i+1,kz,j) +a_Tmpv1
a_u(i,kz,j) =a_u(i,kz,j) +a_Tmpv1
ENDDO
ENDDO
END IF
!LPB[14]
!LPB[13]
IF( (config_flags%open_xs) .and. its == ids ) THEN
i =its
DO j =jts, jtf
DO k =2, kde-1
kz =k
Tmpv001 =u(i+1,kz,j) +u(i,kz,j)
Tmpv002 =fnm(kz)*Tmpv001
Tmpv003 =u(i+1,kz-1,j) +u(i,kz-1,j)
Tmpv004 =fnp(kz)*Tmpv003
Tmpv005 =Tmpv002 +Tmpv004
Tmpv006 =.5*Tmpv005
ub =Tmpv006 ! Removed remark by Ning Pan, 2010-07-20
! Revised by Ning Pan, 2010-07-20
! Tmpv300(k,j) =ul
! ul =min(ub, 0.)
Tmpv300(k,j) =ub
ul =amin1(ub, 0.)
Tmpv001 =ph_old(i+1,k,j) -ph_old(i,k,j)
Tmpv301(k,j) =Tmpv001
Tmpv002 =ul*Tmpv301(k,j)
Tmpv302(k,j) =+Tmpv002
! Tmpv003 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*Tmpv302(k,j) ! Remarked by Ning Pan, 2010-07-20
! Tmpv004 =ph_tend(i,k,j) -Tmpv003 ! Remarked by Ning Pan, 2010-07-20
! ph_tend(i,k,j) =Tmpv004
ENDDO
k =kde
kz =k
Tmpv001 =u(i+1,kz,j) +u(i,kz,j)
Tmpv002 =fnm(kz)*Tmpv001
Tmpv003 =u(i+1,kz-1,j) +u(i,kz-1,j)
Tmpv004 =fnp(kz)*Tmpv003
Tmpv005 =Tmpv002 +Tmpv004
Tmpv006 =.5*Tmpv005
ub =Tmpv006 ! Removed remark by Ning Pan, 2010-07-20
! Revised by Ning Pan, 2010-07-20
! Tmpv200(j) =ul
! ul =min(ub, 0.)
Tmpv200(j) =ub
ul =amin1(ub, 0.)
Tmpv001 =ph_old(i+1,k,j) -ph_old(i,k,j)
Tmpv201(j) =Tmpv001
Tmpv002 =ul*Tmpv201(j)
Tmpv202(j) =+Tmpv002
! Tmpv003 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*Tmpv202(j) ! Remarked by Ning Pan, 2010-07-20
! Tmpv004 =ph_tend(i,k,j) -Tmpv003 ! Remarked by Ning Pan, 2010-07-20
! ph_tend(i,k,j) =Tmpv004
ENDDO
END IF
IF( (config_flags%open_xs) .and. its == ids ) THEN
! Added by Ning Pan, 2010-07-20
i =its
DO j =jtf, jts, -1
! Added by Ning Pan, 2010-07-20
k =kde
kz =k
ub =Tmpv200(j)
ul =amin1(ub, 0.)
a_Tmpv4 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_mut(i,j) =a_mut(i,j) +(msftx(i,j)/msfty(i,j))*rdx*Tmpv202(j)*a_Tmpv3
a_Tmpv2 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*a_Tmpv3
a_ul =a_ul +Tmpv201(j)*a_Tmpv2
a_Tmpv1 =ul*a_Tmpv2
a_ph_old(i+1,k,j) =a_ph_old(i+1,k,j) +a_Tmpv1
a_ph_old(i,k,j) =a_ph_old(i,k,j) -a_Tmpv1
! ul =Tmpv200(j) ! Remarked by Ning Pan, 2010-07-20
a_ub =a_ub +(1.0 -(1.0)*sign(1.0, ub -0.))*0.5*a_ul
a_ul =0.0
a_Tmpv6 =a_ub
a_ub =0.0
a_Tmpv5 =.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fnp(kz)*a_Tmpv4
a_u(i+1,kz-1,j) =a_u(i+1,kz-1,j) +a_Tmpv3
a_u(i,kz-1,j) =a_u(i,kz-1,j) +a_Tmpv3
a_Tmpv1 =fnm(kz)*a_Tmpv2
a_u(i+1,kz,j) =a_u(i+1,kz,j) +a_Tmpv1
a_u(i,kz,j) =a_u(i,kz,j) +a_Tmpv1
DO k =kde-1, 2, -1
! Added by Ning Pan, 2010-07-20
kz =k
ub =Tmpv300(k,j)
ul =amin1(ub, 0.)
a_Tmpv4 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_mut(i,j) =a_mut(i,j) +(msftx(i,j)/msfty(i,j))*rdx*Tmpv302(k,j)*a_Tmpv3
a_Tmpv2 =(msftx(i,j)/msfty(i,j))*rdx*mut(i,j)*a_Tmpv3
a_ul =a_ul +Tmpv301(k,j)*a_Tmpv2
a_Tmpv1 =ul*a_Tmpv2
a_ph_old(i+1,k,j) =a_ph_old(i+1,k,j) +a_Tmpv1
a_ph_old(i,k,j) =a_ph_old(i,k,j) -a_Tmpv1
! ul =Tmpv300(k,j) ! Remarked by Ning Pan, 2010-07-20
a_ub =a_ub +(1.0 -(1.0)*sign(1.0, ub -0.))*0.5*a_ul
a_ul =0.0
a_Tmpv6 =a_ub
a_ub =0.0
a_Tmpv5 =.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fnp(kz)*a_Tmpv4
a_u(i+1,kz-1,j) =a_u(i+1,kz-1,j) +a_Tmpv3
a_u(i,kz-1,j) =a_u(i,kz-1,j) +a_Tmpv3
a_Tmpv1 =fnm(kz)*a_Tmpv2
a_u(i+1,kz,j) =a_u(i+1,kz,j) +a_Tmpv1
a_u(i,kz,j) =a_u(i,kz,j) +a_Tmpv1
ENDDO
ENDDO
END IF
!LPB[12]
! j_start =its
! jtf =min(jte, jde-1)
!LPB[11]
! Added by Ning Pan, 2010-07-20
i_start =its
itf =min(ite,ide-1)
IF( (config_flags%open_ye) .and. jte == jde ) THEN
j =jte-1
DO k =2, kde
kz =min(k, kde-1)
DO i =its, itf
Tmpv001 =v(i,kz,j+1) +v(i,kz,j)
Tmpv002 =fnm(kz)*Tmpv001
Tmpv003 =v(i,kz-1,j+1) +v(i,kz-1,j)
Tmpv004 =fnp(kz)*Tmpv003
Tmpv005 =Tmpv002 +Tmpv004
Tmpv006 =.5*Tmpv005
vb =Tmpv006 ! Removed remark by Ning Pan, 2010-07-20
! Revised by Ning Pan, 2010-07-20
! Tmpv300(i,k) =vr
! vr =max(vb, 0.)
Tmpv300(i,k) =vb
vr =amax1(vb, 0.)
Tmpv001 =ph_old(i,k,j) -ph_old(i,k,j-1)
Tmpv301(i,k) =Tmpv001
Tmpv002 =vr*Tmpv301(i,k)
Tmpv302(i,k) =+Tmpv002
! Tmpv003 =rdy*mut(i,j)*Tmpv302(i,k) ! Remarked by Ning Pan, 2010-07-20
! Tmpv004 =ph_tend(i,k,j) -Tmpv003 ! Remarked by Ning Pan, 2010-07-20
! ph_tend(i,k,j) =Tmpv004
ENDDO
ENDDO
END IF
IF( (config_flags%open_ye) .and. jte == jde ) THEN
j =jte-1 ! Added by Ning Pan, 2010-07-20
DO k =kde, 2, -1
kz =min(k, kde-1) ! Added by Ning Pan, 2010-07-20
DO i =itf, its, -1
! Added by Ning Pan, 2010-07-20
vb =Tmpv300(i,k)
vr =amax1(vb, 0.)
a_Tmpv4 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_mut(i,j) =a_mut(i,j) +rdy*Tmpv302(i,k)*a_Tmpv3
a_Tmpv2 =rdy*mut(i,j)*a_Tmpv3
a_vr =a_vr +Tmpv301(i,k)*a_Tmpv2
a_Tmpv1 =vr*a_Tmpv2
a_ph_old(i,k,j) =a_ph_old(i,k,j) +a_Tmpv1
a_ph_old(i,k,j-1) =a_ph_old(i,k,j-1) -a_Tmpv1
! vr =Tmpv300(i,k) ! Remarked by Ning Pan, 2010-07-20
a_vb =a_vb +(1.0 +(1.0)*sign(1.0, vb -0.))*0.5*a_vr
a_vr =0.0
a_Tmpv6 =a_vb
a_vb =0.0
a_Tmpv5 =.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fnp(kz)*a_Tmpv4
a_v(i,kz-1,j+1) =a_v(i,kz-1,j+1) +a_Tmpv3
a_v(i,kz-1,j) =a_v(i,kz-1,j) +a_Tmpv3
a_Tmpv1 =fnm(kz)*a_Tmpv2
a_v(i,kz,j+1) =a_v(i,kz,j+1) +a_Tmpv1
a_v(i,kz,j) =a_v(i,kz,j) +a_Tmpv1
ENDDO
ENDDO
END IF
!LPB[10]
!LPB[9]
IF( (config_flags%open_ys) .and. jts == jds ) THEN
j =jts
DO k =2, kde
kz =min(k, kde-1)
DO i =its, itf
Tmpv001 =v(i,kz,j+1) +v(i,kz,j)
Tmpv002 =fnm(kz)*Tmpv001
Tmpv003 =v(i,kz-1,j+1) +v(i,kz-1,j)
Tmpv004 =fnp(kz)*Tmpv003
Tmpv005 =Tmpv002 +Tmpv004
Tmpv006 =.5*Tmpv005
vb =Tmpv006 ! Removed remark by Ning Pan, 2010-07-20
! Revised by Ning Pan, 2010-07-20
! Tmpv300(i,k) =vl
! vl =min(vb, 0.)
Tmpv300(i,k) =vb
vl =amin1(vb, 0.)
Tmpv001 =ph_old(i,k,j+1) -ph_old(i,k,j)
Tmpv301(i,k) =Tmpv001
Tmpv002 =vl*Tmpv301(i,k)
Tmpv302(i,k) =+Tmpv002
! Tmpv003 =rdy*mut(i,j)*Tmpv302(i,k) ! Remarked by Ning Pan, 2010-07-20
! Tmpv004 =ph_tend(i,k,j) -Tmpv003 ! Remarked by Ning Pan, 2010-07-20
! ph_tend(i,k,j) =Tmpv004
ENDDO
ENDDO
END IF
IF( (config_flags%open_ys) .and. jts == jds ) THEN
j =jts ! Added by Ning Pan, 2010-07-20
DO k =kde, 2, -1
kz =min(k, kde-1) ! Added by Ning Pan, 2010-07-20
DO i =itf, its, -1
! Added by Ning Pan, 2010-07-20
vb =Tmpv300(i,k)
vl =amin1(vb, 0.)
a_Tmpv4 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_mut(i,j) =a_mut(i,j) +rdy*Tmpv302(i,k)*a_Tmpv3
a_Tmpv2 =rdy*mut(i,j)*a_Tmpv3
a_vl =a_vl +Tmpv301(i,k)*a_Tmpv2
a_Tmpv1 =vl*a_Tmpv2
a_ph_old(i,k,j+1) =a_ph_old(i,k,j+1) +a_Tmpv1
a_ph_old(i,k,j) =a_ph_old(i,k,j) -a_Tmpv1
! vl =Tmpv300(i,k) ! Remarked by Ning Pan, 2010-07-20
a_vb =a_vb +(1.0 -(1.0)*sign(1.0, vb -0.))*0.5*a_vl
a_vl =0.0
a_Tmpv6 =a_vb
a_vb =0.0
a_Tmpv5 =.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fnp(kz)*a_Tmpv4
a_v(i,kz-1,j+1) =a_v(i,kz-1,j+1) +a_Tmpv3
a_v(i,kz-1,j) =a_v(i,kz-1,j) +a_Tmpv3
a_Tmpv1 =fnm(kz)*a_Tmpv2
a_v(i,kz,j+1) =a_v(i,kz,j+1) +a_Tmpv1
a_v(i,kz,j) =a_v(i,kz,j) +a_Tmpv1
ENDDO
ENDDO
END IF
!LPB[8]
! i_start =its
! itf =min(ite, ide-1)
!LPB[7]
IF(advective_order <= 2) THEN
i_start =its
j_start =jts
itf =min(ite, ide-1)
jtf =min(jte, jde-1)
IF( (config_flags%open_ys .or. specified) .and. jts == jds ) THEN
j_start =jts+1
END IF
IF( (config_flags%open_ye .or. specified) .and. jte == jde ) THEN
jtf =jtf-2
END IF
DO j =j_start, jtf
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv400(i,k,j) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv400(i,k,j)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv401(i,k,j) =Tmpv003
Tmpv402(i,k,j) =Tmpv004
Tmpv005 =Tmpv401(i,k,j)*Tmpv402(i,k,j)
Tmpv006 =v(i,k,j) +v(i,k-1,j)
Tmpv403(i,k,j) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv403(i,k,j)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv404(i,k,j) =Tmpv008
Tmpv405(i,k,j) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv404(i,k,j)*Tmpv405(i,k,j)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.25*rdy/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv300(i,j) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv300(i,j)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv301(i,j) =Tmpv003
Tmpv302(i,j) =Tmpv004
Tmpv005 =Tmpv301(i,j)*Tmpv302(i,j)
Tmpv006 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv303(i,j) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv303(i,j)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv304(i,j) =Tmpv008
Tmpv305(i,j) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv304(i,j)*Tmpv305(i,j)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.5*rdy/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
i_start =its
j_start =jts
itf =min(ite, ide-1)
jtf =min(jte, jde-1)
IF( (config_flags%open_xs .or. specified) .and. its == ids ) THEN
i_start =its+1
END IF
IF( (config_flags%open_xe .or. specified) .and. ite == ide ) THEN
itf =itf-2
END IF
DO j =j_start, jtf
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv406(i,k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv406(i,k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv407(i,k,j) =Tmpv003
Tmpv408(i,k,j) =Tmpv004
Tmpv005 =Tmpv407(i,k,j)*Tmpv408(i,k,j)
Tmpv006 =u(i,k,j) +u(i,k-1,j)
Tmpv409(i,k,j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv409(i,k,j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv4010(i,k,j) =Tmpv008
Tmpv4011(i,k,j) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv4010(i,k,j)*Tmpv4011(i,k,j)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.25*rdx/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv306(i,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv306(i,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv307(i,j) =Tmpv003
Tmpv308(i,j) =Tmpv004
Tmpv005 =Tmpv307(i,j)*Tmpv308(i,j)
Tmpv006 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv309(i,j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv309(i,j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv3010(i,j) =Tmpv008
Tmpv3011(i,j) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv3010(i,j)*Tmpv3011(i,j)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.5*rdx/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
ELSE IF(advective_order <= 4) THEN
i_start =its
j_start =jts
itf =min(ite, ide-1)
jtf =min(jte, jde-1)
IF( (config_flags%open_ys .or. specified) .and. jts == jds ) THEN
j_start =jts+2
END IF
IF( (config_flags%open_ye .or. specified) .and. jte == jde ) THEN
jtf =jtf-3
END IF
DO j =j_start, jtf
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv4012(i,k,j) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv4012(i,k,j)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =v(i,k,j) +v(i,k-1,j)
Tmpv4013(i,k,j) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv4013(i,k,j)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv014 =Tmpv013 -(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv4014(i,k,j) =Tmpv008
Tmpv4015(i,k,j) =Tmpv014
! Remarked by Ning Pan, 2010-07-20
! Tmpv015 =Tmpv4014(i,k,j)*Tmpv4015(i,k,j)
! Tmpv016 =(0.25*rdy/msfty(i,j))*Tmpv015
! Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv3012(i,j) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3012(i,j)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv3013(i,j) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv3013(i,j)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv014 =Tmpv013 -(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv3014(i,j) =Tmpv008
Tmpv3015(i,j) =Tmpv014
! Remarked by Ning Pan, 2010-07-20
! Tmpv015 =Tmpv3014(i,j)*Tmpv3015(i,j)
! Tmpv016 =(0.5*rdy/msfty(i,j))*Tmpv015
! Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
ENDDO
IF( (config_flags%open_ys .or. specified) .and. jts <= jds+1 ) THEN
j =jds+1
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv3016(i,k) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3016(i,k)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv3017(i,k) =Tmpv003
Tmpv3018(i,k) =Tmpv004
Tmpv005 =Tmpv3017(i,k)*Tmpv3018(i,k)
Tmpv006 =v(i,k,j) +v(i,k-1,j)
Tmpv3019(i,k) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv3019(i,k)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv3020(i,k) =Tmpv008
Tmpv3021(i,k) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv3020(i,k)*Tmpv3021(i,k)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.25*rdy/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv200(i) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv200(i)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv201(i) =Tmpv003
Tmpv202(i) =Tmpv004
Tmpv005 =Tmpv201(i)*Tmpv202(i)
Tmpv006 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv203(i) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv203(i)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv204(i) =Tmpv008
Tmpv205(i) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv204(i)*Tmpv205(i)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.5*rdy/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
IF( (config_flags%open_ye .or. specified) .and. jte >= jde-2 ) THEN
j =jde-2
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv3022(i,k) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3022(i,k)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv3023(i,k) =Tmpv003
Tmpv3024(i,k) =Tmpv004
Tmpv005 =Tmpv3023(i,k)*Tmpv3024(i,k)
Tmpv006 =v(i,k,j) +v(i,k-1,j)
Tmpv3025(i,k) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv3025(i,k)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv3026(i,k) =Tmpv008
Tmpv3027(i,k) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv3026(i,k)*Tmpv3027(i,k)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.25*rdy/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv206(i) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv206(i)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv207(i) =Tmpv003
Tmpv208(i) =Tmpv004
Tmpv005 =Tmpv207(i)*Tmpv208(i)
Tmpv006 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv209(i) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv209(i)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv2010(i) =Tmpv008
Tmpv2011(i) =Tmpv009
! Remarked by Ning Pan, 2010-07-20
! Tmpv010 =Tmpv2010(i)*Tmpv2011(i)
! Tmpv011 =Tmpv005 +Tmpv010
! Tmpv012 =(0.5*rdy/msfty(i,j))*Tmpv011
! Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
i_start =its
j_start =jts
itf =min(ite, ide-1)
jtf =min(jte, jde-1)
IF( (config_flags%open_xs) .and. its == ids ) THEN
i_start =its+2
END IF
IF( (config_flags%open_xe) .and. ite == ide ) THEN
itf =itf-3
END IF
DO j =j_start, jtf
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv4016(i,k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv4016(i,k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =u(i,k,j) +u(i,k-1,j)
Tmpv4017(i,k,j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv4017(i,k,j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv014 =Tmpv013 -(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv4018(i,k,j) =Tmpv008
Tmpv4019(i,k,j) =Tmpv014
! Remarked by Ning Pan, 2010-07-20
! Tmpv015 =Tmpv4018(i,k,j)*Tmpv4019(i,k,j)
! Tmpv016 =(0.25*rdx/msfty(i,j))*Tmpv015
! Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv3028(i,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3028(i,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv3029(i,j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv3029(i,j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv014 =Tmpv013 -(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv3030(i,j) =Tmpv008
Tmpv3031(i,j) =Tmpv014
! Remarked by Ning Pan, 2010-07-20
! Tmpv015 =Tmpv3030(i,j)*Tmpv3031(i,j)
! Tmpv016 =(0.5*rdx/msfty(i,j))*Tmpv015
! Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
ENDDO
IF( (config_flags%open_xs .or. specified) .and. its <= ids+1 ) THEN
i =ids+1
DO j =j_start, jtf
DO k =2, kte-1
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv3032(k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3032(k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv3033(k,j) =Tmpv003
Tmpv3034(k,j) =Tmpv004
Tmpv005 =Tmpv3033(k,j)*Tmpv3034(k,j)
Tmpv006 =u(i,k,j) +u(i,k-1,j)
Tmpv3035(k,j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv3035(k,j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv3036(k,j) =Tmpv008
Tmpv3037(k,j) =Tmpv009
Tmpv010 =Tmpv3036(k,j)*Tmpv3037(k,j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.25*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO j =j_start, jtf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv2012(j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv2012(j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv2013(j) =Tmpv003
Tmpv2014(j) =Tmpv004
Tmpv005 =Tmpv2013(j)*Tmpv2014(j)
Tmpv006 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv2015(j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv2015(j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv2016(j) =Tmpv008
Tmpv2017(j) =Tmpv009
Tmpv010 =Tmpv2016(j)*Tmpv2017(j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.5*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
IF( (config_flags%open_xe .or. specified) .and. ite >= ide-2 ) THEN
i =ide-2
DO j =j_start, jtf
DO k =2, kte-1
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv3038(k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3038(k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv3039(k,j) =Tmpv003
Tmpv3040(k,j) =Tmpv004
Tmpv005 =Tmpv3039(k,j)*Tmpv3040(k,j)
Tmpv006 =u(i,k,j) +u(i,k-1,j)
Tmpv3041(k,j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv3041(k,j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv3042(k,j) =Tmpv008
Tmpv3043(k,j) =Tmpv009
Tmpv010 =Tmpv3042(k,j)*Tmpv3043(k,j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.25*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO j =j_start, jtf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv2018(j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv2018(j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv2019(j) =Tmpv003
Tmpv2020(j) =Tmpv004
Tmpv005 =Tmpv2019(j)*Tmpv2020(j)
Tmpv006 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv2021(j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv2021(j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv2022(j) =Tmpv008
Tmpv2023(j) =Tmpv009
Tmpv010 =Tmpv2022(j)*Tmpv2023(j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.5*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
ELSE IF(advective_order <= 6) THEN
i_start =its
j_start =jts
itf =min(ite, ide-1)
jtf =min(jte, jde-1)
IF(config_flags%open_ys .or. specified ) THEN
j_start =max(jts, jds+3)
END IF
IF(config_flags%open_ye .or. specified ) THEN
jtf =min(jtf, jde-4)
END IF
DO j =j_start, jtf
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv4020(i,k,j) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv4020(i,k,j)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =v(i,k,j) +v(i,k-1,j)
Tmpv4021(i,k,j) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv4021(i,k,j)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./60.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =45.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =9.*Tmpv011
Tmpv013 =Tmpv010 -Tmpv012
Tmpv014 =ph(i,k,j+3) -ph(i,k,j-3)
Tmpv015 =Tmpv013 +Tmpv014
Tmpv016 =Tmpv015 +45.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv017 =Tmpv016 -9.*(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv018 =Tmpv017 +(phb(i,k,j+3)-phb(i,k,j-3))
Tmpv4022(i,k,j) =Tmpv008
Tmpv4023(i,k,j) =Tmpv018
Tmpv019 =Tmpv4022(i,k,j)*Tmpv4023(i,k,j)
Tmpv020 =(0.25*rdy/msfty(i,j))*Tmpv019
Tmpv021 =ph_tend(i,k,j) -Tmpv020
! ph_tend(i,k,j) =Tmpv021
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv3044(i,j) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3044(i,j)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv3045(i,j) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv3045(i,j)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./60.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =45.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =9.*Tmpv011
Tmpv013 =Tmpv010 -Tmpv012
Tmpv014 =ph(i,k,j+3) -ph(i,k,j-3)
Tmpv015 =Tmpv013 +Tmpv014
Tmpv016 =Tmpv015 +45.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv017 =Tmpv016 -9.*(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv018 =Tmpv017 +(phb(i,k,j+3)-phb(i,k,j-3))
Tmpv3046(i,j) =Tmpv008
Tmpv3047(i,j) =Tmpv018
Tmpv019 =Tmpv3046(i,j)*Tmpv3047(i,j)
Tmpv020 =(0.5*rdy/msfty(i,j))*Tmpv019
Tmpv021 =ph_tend(i,k,j) -Tmpv020
! ph_tend(i,k,j) =Tmpv021
ENDDO
ENDDO
IF( (config_flags%open_ys .or. specified) .and. jts <= jds+2 .and. jds+2 <= jte ) THEN
j =jds+2
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv3048(i,k) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3048(i,k)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =v(i,k,j) +v(i,k-1,j)
Tmpv3049(i,k) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv3049(i,k)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv014 =Tmpv013 -(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv3050(i,k) =Tmpv008
Tmpv3051(i,k) =Tmpv014
Tmpv015 =Tmpv3050(i,k)*Tmpv3051(i,k)
Tmpv016 =(0.25*rdy/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv2024(i) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv2024(i)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv2025(i) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv2025(i)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv014 =Tmpv013 -(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv2026(i) =Tmpv008
Tmpv2027(i) =Tmpv014
Tmpv015 =Tmpv2026(i)*Tmpv2027(i)
Tmpv016 =(0.5*rdy/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
END IF
IF( (config_flags%open_ye .or. specified) .and. jts <= jde-3 .and. jde-3 <= jte ) THEN
j =jde-3
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv3052(i,k) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3052(i,k)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =v(i,k,j) +v(i,k-1,j)
Tmpv3053(i,k) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv3053(i,k)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv014 =Tmpv013 -(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv3054(i,k) =Tmpv008
Tmpv3055(i,k) =Tmpv014
Tmpv015 =Tmpv3054(i,k)*Tmpv3055(i,k)
Tmpv016 =(0.25*rdy/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv2028(i) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv2028(i)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv2029(i) =Tmpv004
Tmpv005 =muv(i,j)*Tmpv2029(i)
Tmpv006 =Tmpv005*msfvy(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i,k,j+1) -ph(i,k,j-1)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i,k,j+2) -ph(i,k,j-2)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i,k,j+1)-phb(i,k,j-1))
Tmpv014 =Tmpv013 -(phb(i,k,j+2)-phb(i,k,j-2))
Tmpv2030(i) =Tmpv008
Tmpv2031(i) =Tmpv014
Tmpv015 =Tmpv2030(i)*Tmpv2031(i)
Tmpv016 =(0.5*rdy/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
END IF
IF( (config_flags%open_ys .or. specified) .and. jts <= jds+1 .and. jds+1 <= jte ) THEN
j =jds+1
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv3056(i,k) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3056(i,k)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv3057(i,k) =Tmpv003
Tmpv3058(i,k) =Tmpv004
Tmpv005 =Tmpv3057(i,k)*Tmpv3058(i,k)
Tmpv006 =v(i,k,j) +v(i,k-1,j)
Tmpv3059(i,k) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv3059(i,k)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv3060(i,k) =Tmpv008
Tmpv3061(i,k) =Tmpv009
Tmpv010 =Tmpv3060(i,k)*Tmpv3061(i,k)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.25*rdy/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv2032(i) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv2032(i)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv2033(i) =Tmpv003
Tmpv2034(i) =Tmpv004
Tmpv005 =Tmpv2033(i)*Tmpv2034(i)
Tmpv006 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv2035(i) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv2035(i)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv2036(i) =Tmpv008
Tmpv2037(i) =Tmpv009
Tmpv010 =Tmpv2036(i)*Tmpv2037(i)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.5*rdy/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
IF( (config_flags%open_ye .or. specified) .and. jts <= jde-2 .and. jde-2 <= jte ) THEN
j =jde-2
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =v(i,k,j+1) +v(i,k-1,j+1)
Tmpv3062(i,k) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv3062(i,k)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv3063(i,k) =Tmpv003
Tmpv3064(i,k) =Tmpv004
Tmpv005 =Tmpv3063(i,k)*Tmpv3064(i,k)
Tmpv006 =v(i,k,j) +v(i,k-1,j)
Tmpv3065(i,k) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv3065(i,k)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv3066(i,k) =Tmpv008
Tmpv3067(i,k) =Tmpv009
Tmpv010 =Tmpv3066(i,k)*Tmpv3067(i,k)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.25*rdy/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)
Tmpv2038(i) =Tmpv001
Tmpv002 =muv(i,j+1)*Tmpv2038(i)
Tmpv003 =Tmpv002*msfvy(i,j+1)
Tmpv004 =phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)
Tmpv2039(i) =Tmpv003
Tmpv2040(i) =Tmpv004
Tmpv005 =Tmpv2039(i)*Tmpv2040(i)
Tmpv006 =cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)
Tmpv2041(i) =Tmpv006
Tmpv007 =muv(i,j)*Tmpv2041(i)
Tmpv008 =Tmpv007*msfvy(i,j)
Tmpv009 =phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)
Tmpv2042(i) =Tmpv008
Tmpv2043(i) =Tmpv009
Tmpv010 =Tmpv2042(i)*Tmpv2043(i)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.5*rdy/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
i_start =its
j_start =jts
itf =min(ite, ide-1)
jtf =min(jte, jde-1)
IF(config_flags%open_xs .or. specified ) THEN
i_start =max(its, ids+3)
END IF
IF(config_flags%open_xe .or. specified ) THEN
itf =min(itf, ide-4)
END IF
DO j =j_start, jtf
DO k =2, kte-1
DO i =i_start, itf
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv4024(i,k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv4024(i,k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =u(i,k,j) +u(i,k-1,j)
Tmpv4025(i,k,j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv4025(i,k,j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./60.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =45.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =9.*Tmpv011
Tmpv013 =Tmpv010 -Tmpv012
Tmpv014 =ph(i+3,k,j) -ph(i-3,k,j)
Tmpv015 =Tmpv013 +Tmpv014
Tmpv016 =Tmpv015 +45.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv017 =Tmpv016 -9.*(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv018 =Tmpv017 +(phb(i+3,k,j)-phb(i-3,k,j))
Tmpv4026(i,k,j) =Tmpv008
Tmpv4027(i,k,j) =Tmpv018
Tmpv019 =Tmpv4026(i,k,j)*Tmpv4027(i,k,j)
Tmpv020 =(0.25*rdx/msfty(i,j))*Tmpv019
Tmpv021 =ph_tend(i,k,j) -Tmpv020
! ph_tend(i,k,j) =Tmpv021
ENDDO
ENDDO
k =kte
DO i =i_start, itf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv3068(i,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3068(i,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv3069(i,j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv3069(i,j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./60.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =45.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =9.*Tmpv011
Tmpv013 =Tmpv010 -Tmpv012
Tmpv014 =ph(i+3,k,j) -ph(i-3,k,j)
Tmpv015 =Tmpv013 +Tmpv014
Tmpv016 =Tmpv015 +45.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv017 =Tmpv016 -9.*(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv018 =Tmpv017 +(phb(i+3,k,j)-phb(i-3,k,j))
Tmpv3070(i,j) =Tmpv008
Tmpv3071(i,j) =Tmpv018
Tmpv019 =Tmpv3070(i,j)*Tmpv3071(i,j)
Tmpv020 =(0.5*rdx/msfty(i,j))*Tmpv019
Tmpv021 =ph_tend(i,k,j) -Tmpv020
! ph_tend(i,k,j) =Tmpv021
ENDDO
ENDDO
IF( (config_flags%open_xs) .and. its <= ids+2 .and. ids+2 <= ite ) THEN
i =ids+2
DO j =j_start, jtf
DO k =2, kte-1
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv3072(k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3072(k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =u(i,k,j) +u(i,k-1,j)
Tmpv3073(k,j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv3073(k,j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv014 =Tmpv013 -(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv3074(k,j) =Tmpv008
Tmpv3075(k,j) =Tmpv014
Tmpv015 =Tmpv3074(k,j)*Tmpv3075(k,j)
Tmpv016 =(0.25*rdx/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
k =kte
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv2044(j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv2044(j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv2045(j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv2045(j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv014 =Tmpv013 -(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv2046(j) =Tmpv008
Tmpv2047(j) =Tmpv014
Tmpv015 =Tmpv2046(j)*Tmpv2047(j)
Tmpv016 =(0.5*rdx/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
END IF
IF( (config_flags%open_xe) .and. its <= ide-3 .and. ide-3 <= ite ) THEN
i =ide-3
DO j =j_start, jtf
DO k =2, kte-1
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv3076(k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3076(k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =u(i,k,j) +u(i,k-1,j)
Tmpv3077(k,j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv3077(k,j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv014 =Tmpv013 -(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv3078(k,j) =Tmpv008
Tmpv3079(k,j) =Tmpv014
Tmpv015 =Tmpv3078(k,j)*Tmpv3079(k,j)
Tmpv016 =(0.25*rdx/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
k =kte
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv2048(j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv2048(j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv2049(j) =Tmpv004
Tmpv005 =muu(i,j)*Tmpv2049(j)
Tmpv006 =Tmpv005*msfux(i,j)
Tmpv007 =Tmpv003 +Tmpv006
Tmpv008 =Tmpv007*(1./12.)
Tmpv009 =ph(i+1,k,j) -ph(i-1,k,j)
Tmpv010 =8.*Tmpv009
Tmpv011 =ph(i+2,k,j) -ph(i-2,k,j)
Tmpv012 =Tmpv010 -Tmpv011
Tmpv013 =Tmpv012 +8.*(phb(i+1,k,j)-phb(i-1,k,j))
Tmpv014 =Tmpv013 -(phb(i+2,k,j)-phb(i-2,k,j))
Tmpv2050(j) =Tmpv008
Tmpv2051(j) =Tmpv014
Tmpv015 =Tmpv2050(j)*Tmpv2051(j)
Tmpv016 =(0.5*rdx/msfty(i,j))*Tmpv015
Tmpv017 =ph_tend(i,k,j) -Tmpv016
! ph_tend(i,k,j) =Tmpv017
ENDDO
END IF
IF( (config_flags%open_xs .or. specified) .and. its <= ids+1 .and. ids+1 <= ite ) THEN
i =ids+1
DO j =j_start, jtf
DO k =2, kte-1
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv3080(k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3080(k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv3081(k,j) =Tmpv003
Tmpv3082(k,j) =Tmpv004
Tmpv005 =Tmpv3081(k,j)*Tmpv3082(k,j)
Tmpv006 =u(i,k,j) +u(i,k-1,j)
Tmpv3083(k,j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv3083(k,j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv3084(k,j) =Tmpv008
Tmpv3085(k,j) =Tmpv009
Tmpv010 =Tmpv3084(k,j)*Tmpv3085(k,j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.25*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO j =j_start, jtf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv2052(j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv2052(j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv2053(j) =Tmpv003
Tmpv2054(j) =Tmpv004
Tmpv005 =Tmpv2053(j)*Tmpv2054(j)
Tmpv006 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv2055(j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv2055(j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv2056(j) =Tmpv008
Tmpv2057(j) =Tmpv009
Tmpv010 =Tmpv2056(j)*Tmpv2057(j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.5*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
IF( (config_flags%open_xe .or. specified) .and. its <= ide-2 .and. ide-2 <= ite ) THEN
i =ide-2
DO j =j_start, jtf
DO k =2, kte-1
Tmpv001 =u(i+1,k,j) +u(i+1,k-1,j)
Tmpv3086(k,j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv3086(k,j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv3087(k,j) =Tmpv003
Tmpv3088(k,j) =Tmpv004
Tmpv005 =Tmpv3087(k,j)*Tmpv3088(k,j)
Tmpv006 =u(i,k,j) +u(i,k-1,j)
Tmpv3089(k,j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv3089(k,j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv3090(k,j) =Tmpv008
Tmpv3091(k,j) =Tmpv009
Tmpv010 =Tmpv3090(k,j)*Tmpv3091(k,j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.25*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
ENDDO
k =kte
DO j =j_start, jtf
Tmpv001 =cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)
Tmpv2058(j) =Tmpv001
Tmpv002 =muu(i+1,j)*Tmpv2058(j)
Tmpv003 =Tmpv002*msfux(i+1,j)
Tmpv004 =phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)
Tmpv2059(j) =Tmpv003
Tmpv2060(j) =Tmpv004
Tmpv005 =Tmpv2059(j)*Tmpv2060(j)
Tmpv006 =cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)
Tmpv2061(j) =Tmpv006
Tmpv007 =muu(i,j)*Tmpv2061(j)
Tmpv008 =Tmpv007*msfux(i,j)
Tmpv009 =phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)
Tmpv2062(j) =Tmpv008
Tmpv2063(j) =Tmpv009
Tmpv010 =Tmpv2062(j)*Tmpv2063(j)
Tmpv011 =Tmpv005 +Tmpv010
Tmpv012 =(0.5*rdx/msfty(i,j))*Tmpv011
Tmpv013 =ph_tend(i,k,j) -Tmpv012
! ph_tend(i,k,j) =Tmpv013
ENDDO
END IF
END IF
IF(advective_order <= 2) THEN
! Added by Ning Pan, 2010-07-20
! x (u) advection
i_start = its
j_start = jts
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF ( (config_flags%open_xs .or. specified) .and. its == ids ) i_start = its+1
IF ( (config_flags%open_xe .or. specified) .and. ite == ide ) itf = itf-2
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3011(i,j)*a_Tmpv10
a_Tmpv9 =Tmpv3010(i,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv309(i,j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv6
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv308(i,j)*a_Tmpv5
a_Tmpv4 =Tmpv307(i,j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv306(i,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv4011(i,k,j)*a_Tmpv10
a_Tmpv9 =Tmpv4010(i,k,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv409(i,k,j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv6
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv408(i,k,j)*a_Tmpv5
a_Tmpv4 =Tmpv407(i,k,j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv406(i,k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! IF( (config_flags%open_xe .or. specified) .and. ite == ide ) THEN
! END IF
! IF( (config_flags%open_xs .or. specified) .and. its == ids ) THEN
! END IF
! Added by Ning Pan, 2010-07-20
! y (v) advection
i_start = its
j_start = jts
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF ( (config_flags%open_ys .or. specified) .and. jts == jds ) j_start = jts+1
IF ( (config_flags%open_ye .or. specified) .and. jte == jde ) jtf = jtf-2
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv305(i,j)*a_Tmpv10
a_Tmpv9 =Tmpv304(i,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv303(i,j)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv6
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv302(i,j)*a_Tmpv5
a_Tmpv4 =Tmpv301(i,j)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv300(i,j)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv405(i,k,j)*a_Tmpv10
a_Tmpv9 =Tmpv404(i,k,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv403(i,k,j)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv6
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv402(i,k,j)*a_Tmpv5
a_Tmpv4 =Tmpv401(i,k,j)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv400(i,k,j)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! IF( (config_flags%open_ye .or. specified) .and. jte == jde ) THEN
! END IF
! IF( (config_flags%open_ys .or. specified) .and. jts == jds ) THEN
! END IF
ELSE IF(advective_order <= 4) THEN
! Added by Ning Pan, 2010-07-20
! x (u) advection
i_start = its
j_start = jts
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF ( (config_flags%open_xs) .and. its == ids ) i_start = its+2
IF ( (config_flags%open_xe) .and. ite == ide ) itf = itf-3
IF( (config_flags%open_xe .or. specified) .and. ite >= ide-2 ) THEN
i = ide-2 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO j =jtf, j_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2023(j)*a_Tmpv10
a_Tmpv9 =Tmpv2022(j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv2021(j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv6
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv2020(j)*a_Tmpv5
a_Tmpv4 =Tmpv2019(j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2018(j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO j =jtf, j_start, -1
DO k =kte-1, 2, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3043(k,j)*a_Tmpv10
a_Tmpv9 =Tmpv3042(k,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv3041(k,j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv6
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3040(k,j)*a_Tmpv5
a_Tmpv4 =Tmpv3039(k,j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3038(k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_xs .or. specified) .and. its <= ids+1 ) THEN
! Added by Ning Pan, 2010-07-20
i = ids + 1 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO j =jtf, j_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2017(j)*a_Tmpv10
a_Tmpv9 =Tmpv2016(j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv2015(j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv6
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv2014(j)*a_Tmpv5
a_Tmpv4 =Tmpv2013(j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2012(j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO j =jtf, j_start, -1
DO k =kte-1, 2, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3037(k,j)*a_Tmpv10
a_Tmpv9 =Tmpv3036(k,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv3035(k,j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv6
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3034(k,j)*a_Tmpv5
a_Tmpv4 =Tmpv3033(k,j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3032(k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
! DO j =jtf, j_start, -1
! a_Tmpv13 =a_ph_tend(i,k,j)
! a_ph_tend(i,k,j) =0.0
! a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
! a_Tmpv12 =-a_Tmpv13
! a_Tmpv11 =(0.5*rdx/msfty(i,j))*a_Tmpv12
! a_Tmpv5 =a_Tmpv11
! a_Tmpv10 =a_Tmpv11
! a_Tmpv8 =Tmpv2017(j)*a_Tmpv10
! a_Tmpv9 =Tmpv2016(j)*a_Tmpv10
! a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
! a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
! a_Tmpv7 =msfux(i,j)*a_Tmpv8
! a_muu(i,j) =a_muu(i,j) +Tmpv2015(j)*a_Tmpv7
! a_Tmpv6 =muu(i,j)*a_Tmpv7
! a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv6
! a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv6
! a_Tmpv3 =Tmpv2014(j)*a_Tmpv5
! a_Tmpv4 =Tmpv2013(j)*a_Tmpv5
! a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
! a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
! a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
! a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2012(j)*a_Tmpv2
! a_Tmpv1 =muu(i+1,j)*a_Tmpv2
! a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
! a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
! ENDDO
END IF
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.5*rdx/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv3031(i,j)*a_Tmpv15
a_Tmpv14 =Tmpv3030(i,j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv3029(i,j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv4
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3028(i,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.25*rdx/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv4019(i,k,j)*a_Tmpv15
a_Tmpv14 =Tmpv4018(i,k,j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv4017(i,k,j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv4
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv4016(i,k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! IF( (config_flags%open_xe) .and. ite == ide ) THEN
! END IF
! IF( (config_flags%open_xs) .and. its == ids ) THEN
! END IF
! Added by Ning Pan, 2010-07-20
! y (v) advection
i_start = its
j_start = jts
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF ( (config_flags%open_ys .or. specified) .and. jts == jds ) j_start = jts+2
IF ( (config_flags%open_ye .or. specified) .and. jte == jde ) jtf = jtf-3
IF( (config_flags%open_ye .or. specified) .and. jte >= jde-2 ) THEN
j = jde-2 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2011(i)*a_Tmpv10
a_Tmpv9 =Tmpv2010(i)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv209(i)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv6
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv208(i)*a_Tmpv5
a_Tmpv4 =Tmpv207(i)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv206(i)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3027(i,k)*a_Tmpv10
a_Tmpv9 =Tmpv3026(i,k)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv3025(i,k)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv6
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3024(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv3023(i,k)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3022(i,k)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_ys .or. specified) .and. jts <= jds+1 ) THEN
j = jds+1 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv205(i)*a_Tmpv10
a_Tmpv9 =Tmpv204(i)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv203(i)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv6
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv202(i)*a_Tmpv5
a_Tmpv4 =Tmpv201(i)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv200(i)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3021(i,k)*a_Tmpv10
a_Tmpv9 =Tmpv3020(i,k)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv3019(i,k)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv6
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3018(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv3017(i,k)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3016(i,k)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! DO i =itf, i_start, -1
! a_Tmpv13 =a_ph_tend(i,k,j)
! a_ph_tend(i,k,j) =0.0
! a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
! a_Tmpv12 =-a_Tmpv13
! a_Tmpv11 =(0.5*rdy/msfty(i,j))*a_Tmpv12
! a_Tmpv5 =a_Tmpv11
! a_Tmpv10 =a_Tmpv11
! a_Tmpv8 =Tmpv205(i)*a_Tmpv10
! a_Tmpv9 =Tmpv204(i)*a_Tmpv10
! a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
! a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
! a_Tmpv7 =msfvy(i,j)*a_Tmpv8
! a_muv(i,j) =a_muv(i,j) +Tmpv203(i)*a_Tmpv7
! a_Tmpv6 =muv(i,j)*a_Tmpv7
! a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv6
! a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv6
! a_Tmpv3 =Tmpv202(i)*a_Tmpv5
! a_Tmpv4 =Tmpv201(i)*a_Tmpv5
! a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
! a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
! a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
! a_muv(i,j+1) =a_muv(i,j+1) +Tmpv200(i)*a_Tmpv2
! a_Tmpv1 =muv(i,j+1)*a_Tmpv2
! a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
! a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
! ENDDO
END IF
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.5*rdy/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv3015(i,j)*a_Tmpv15
a_Tmpv14 =Tmpv3014(i,j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv3013(i,j)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv4
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3012(i,j)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.25*rdy/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv4015(i,k,j)*a_Tmpv15
a_Tmpv14 =Tmpv4014(i,k,j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv4013(i,k,j)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv4
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv4012(i,k,j)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! IF( (config_flags%open_ye .or. specified) .and. jte == jde ) THEN
! END IF
! IF( (config_flags%open_ys .or. specified) .and. jts == jds ) THEN
! END IF
ELSE IF(advective_order <= 6) THEN
! Added by Ning Pan, 2010-07-20
! x (u) advection
i_start = its
j_start = jts
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF (config_flags%open_xs .or. specified ) i_start = max(its,ids+3)
IF (config_flags%open_xe .or. specified ) itf = min(itf,ide-4)
IF( (config_flags%open_xe .or. specified) .and. its <= ide-2 .and. ide-2 <= ite ) THEN
i = ide-2 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO j =jtf, j_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2063(j)*a_Tmpv10
a_Tmpv9 =Tmpv2062(j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv2061(j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv6
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv2060(j)*a_Tmpv5
a_Tmpv4 =Tmpv2059(j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2058(j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO j =jtf, j_start, -1
DO k =kte-1, 2, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3091(k,j)*a_Tmpv10
a_Tmpv9 =Tmpv3090(k,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv3089(k,j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv6
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3088(k,j)*a_Tmpv5
a_Tmpv4 =Tmpv3087(k,j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3086(k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_xs .or. specified) .and. its <= ids+1 .and. ids+1 <= ite ) THEN
i = ids + 1 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO j =jtf, j_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2057(j)*a_Tmpv10
a_Tmpv9 =Tmpv2056(j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv2055(j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv6
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv2054(j)*a_Tmpv5
a_Tmpv4 =Tmpv2053(j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2052(j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO j =jtf, j_start, -1
DO k =kte-1, 2, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdx/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3085(k,j)*a_Tmpv10
a_Tmpv9 =Tmpv3084(k,j)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =msfux(i,j)*a_Tmpv8
a_muu(i,j) =a_muu(i,j) +Tmpv3083(k,j)*a_Tmpv7
a_Tmpv6 =muu(i,j)*a_Tmpv7
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv6
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3082(k,j)*a_Tmpv5
a_Tmpv4 =Tmpv3081(k,j)*a_Tmpv5
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3080(k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_xe) .and. its <= ide-3 .and. ide-3 <= ite ) THEN
i = ide-3 ! Added by Ning Pan, 2010-07-20
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.5*rdx/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv2051(j)*a_Tmpv15
a_Tmpv14 =Tmpv2050(j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv2049(j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv4
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2048(j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
DO k =kte-1, 2, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.25*rdx/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv3079(k,j)*a_Tmpv15
a_Tmpv14 =Tmpv3078(k,j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv3077(k,j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv4
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3076(k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_xs) .and. its <= ids+2 .and. ids+2 <= ite ) THEN
i = ids + 2 ! Added by Ning Pan, 2010-07-20
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.5*rdx/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv2047(j)*a_Tmpv15
a_Tmpv14 =Tmpv2046(j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv2045(j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv4
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv2044(j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
DO k =kte-1, 2, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.25*rdx/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv3075(k,j)*a_Tmpv15
a_Tmpv14 =Tmpv3074(k,j)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv3073(k,j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv4
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3072(k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
END IF
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv21 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv21
a_Tmpv20 =-a_Tmpv21
a_Tmpv19 =(0.5*rdx/msfty(i,j))*a_Tmpv20
a_Tmpv8 =Tmpv3071(i,j)*a_Tmpv19
a_Tmpv18 =Tmpv3070(i,j)*a_Tmpv19
a_Tmpv17 =a_Tmpv18
a_Tmpv16 =a_Tmpv17
a_Tmpv15 =a_Tmpv16
a_Tmpv13 =a_Tmpv15
a_Tmpv14 =a_Tmpv15
a_ph(i+3,k,j) =a_ph(i+3,k,j) +a_Tmpv14
a_ph(i-3,k,j) =a_ph(i-3,k,j) -a_Tmpv14
a_Tmpv10 =a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =9.*a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =45.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./60.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv3069(i,j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k-1,j) =a_u(i,k-1,j) +cfn*a_Tmpv4
a_u(i,k-2,j) =a_u(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv3068(i,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +cfn*a_Tmpv1
a_u(i+1,k-2,j) =a_u(i+1,k-2,j) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv21 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv21
a_Tmpv20 =-a_Tmpv21
a_Tmpv19 =(0.25*rdx/msfty(i,j))*a_Tmpv20
a_Tmpv8 =Tmpv4027(i,k,j)*a_Tmpv19
a_Tmpv18 =Tmpv4026(i,k,j)*a_Tmpv19
a_Tmpv17 =a_Tmpv18
a_Tmpv16 =a_Tmpv17
a_Tmpv15 =a_Tmpv16
a_Tmpv13 =a_Tmpv15
a_Tmpv14 =a_Tmpv15
a_ph(i+3,k,j) =a_ph(i+3,k,j) +a_Tmpv14
a_ph(i-3,k,j) =a_ph(i-3,k,j) -a_Tmpv14
a_Tmpv10 =a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =9.*a_Tmpv12
a_ph(i+2,k,j) =a_ph(i+2,k,j) +a_Tmpv11
a_ph(i-2,k,j) =a_ph(i-2,k,j) -a_Tmpv11
a_Tmpv9 =45.*a_Tmpv10
a_ph(i+1,k,j) =a_ph(i+1,k,j) +a_Tmpv9
a_ph(i-1,k,j) =a_ph(i-1,k,j) -a_Tmpv9
a_Tmpv7 =(1./60.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfux(i,j)*a_Tmpv6
a_muu(i,j) =a_muu(i,j) +Tmpv4025(i,k,j)*a_Tmpv5
a_Tmpv4 =muu(i,j)*a_Tmpv5
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv4
a_u(i,k-1,j) =a_u(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfux(i+1,j)*a_Tmpv3
a_muu(i+1,j) =a_muu(i+1,j) +Tmpv4024(i,k,j)*a_Tmpv2
a_Tmpv1 =muu(i+1,j)*a_Tmpv2
a_u(i+1,k,j) =a_u(i+1,k,j) +a_Tmpv1
a_u(i+1,k-1,j) =a_u(i+1,k-1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! IF(config_flags%open_xe .or. specified ) THEN
! END IF
! IF(config_flags%open_xs .or. specified ) THEN
! END IF
! Added by Ning Pan, 2010-07-20
! y (v) advection
i_start = its
j_start = jts
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF (config_flags%open_ys .or. specified ) j_start = max(jts,jds+3)
IF (config_flags%open_ye .or. specified ) jtf = min(jtf,jde-4)
IF( (config_flags%open_ye .or. specified) .and. jts <= jde-2 .and. jde-2 <= jte ) THEN
j = jde-2 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2043(i)*a_Tmpv10
a_Tmpv9 =Tmpv2042(i)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv2041(i)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv6
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv2040(i)*a_Tmpv5
a_Tmpv4 =Tmpv2039(i)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv2038(i)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3067(i,k)*a_Tmpv10
a_Tmpv9 =Tmpv3066(i,k)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv3065(i,k)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv6
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3064(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv3063(i,k)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3062(i,k)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_ys .or. specified) .and. jts <= jds+1 .and. jds+1 <= jte ) THEN
j = jds+1 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.5*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv2037(i)*a_Tmpv10
a_Tmpv9 =Tmpv2036(i)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv2035(i)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv6
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv6
a_Tmpv3 =Tmpv2034(i)*a_Tmpv5
a_Tmpv4 =Tmpv2033(i)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv2032(i)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv13 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(0.25*rdy/msfty(i,j))*a_Tmpv12
a_Tmpv5 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv8 =Tmpv3061(i,k)*a_Tmpv10
a_Tmpv9 =Tmpv3060(i,k)*a_Tmpv10
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =msfvy(i,j)*a_Tmpv8
a_muv(i,j) =a_muv(i,j) +Tmpv3059(i,k)*a_Tmpv7
a_Tmpv6 =muv(i,j)*a_Tmpv7
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv6
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv6
a_Tmpv3 =Tmpv3058(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv3057(i,k)*a_Tmpv5
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) -a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3056(i,k)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_ye .or. specified) .and. jts <= jde-3 .and. jde-3 <= jte ) THEN
j = jde-3 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.5*rdy/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv2031(i)*a_Tmpv15
a_Tmpv14 =Tmpv2030(i)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv2029(i)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv4
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv2028(i)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.25*rdy/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv3055(i,k)*a_Tmpv15
a_Tmpv14 =Tmpv3054(i,k)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv3053(i,k)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv4
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3052(i,k)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
END IF
IF( (config_flags%open_ys .or. specified) .and. jts <= jds+2 .and. jds+2 <= jte ) THEN
j = jds+2 ! Added by Ning Pan, 2010-07-20
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.5*rdy/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv2027(i)*a_Tmpv15
a_Tmpv14 =Tmpv2026(i)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv2025(i)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv4
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv2024(i)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv17 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
a_Tmpv16 =-a_Tmpv17
a_Tmpv15 =(0.25*rdy/msfty(i,j))*a_Tmpv16
a_Tmpv8 =Tmpv3051(i,k)*a_Tmpv15
a_Tmpv14 =Tmpv3050(i,k)*a_Tmpv15
a_Tmpv13 =a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv10 =a_Tmpv12
a_Tmpv11 =-a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =8.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./12.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv3049(i,k)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv4
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3048(i,k)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
! DO i =itf, i_start, -1
! a_Tmpv17 =a_ph_tend(i,k,j)
! a_ph_tend(i,k,j) =0.0
! a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv17
! a_Tmpv16 =-a_Tmpv17
! a_Tmpv15 =(0.5*rdy/msfty(i,j))*a_Tmpv16
! a_Tmpv8 =Tmpv2027(i)*a_Tmpv15
! a_Tmpv14 =Tmpv2026(i)*a_Tmpv15
! a_Tmpv13 =a_Tmpv14
! a_Tmpv12 =a_Tmpv13
! a_Tmpv10 =a_Tmpv12
! a_Tmpv11 =-a_Tmpv12
! a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
! a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
! a_Tmpv9 =8.*a_Tmpv10
! a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
! a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
! a_Tmpv7 =(1./12.)*a_Tmpv8
! a_Tmpv3 =a_Tmpv7
! a_Tmpv6 =a_Tmpv7
! a_Tmpv5 =msfvy(i,j)*a_Tmpv6
! a_muv(i,j) =a_muv(i,j) +Tmpv2025(i)*a_Tmpv5
! a_Tmpv4 =muv(i,j)*a_Tmpv5
! a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv4
! a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv4
! a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
! a_muv(i,j+1) =a_muv(i,j+1) +Tmpv2024(i)*a_Tmpv2
! a_Tmpv1 =muv(i,j+1)*a_Tmpv2
! a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
! a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
! ENDDO
END IF
DO j =jtf, j_start, -1
k = kte ! Added by Ning Pan, 2010-07-20
DO i =itf, i_start, -1
a_Tmpv21 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv21
a_Tmpv20 =-a_Tmpv21
a_Tmpv19 =(0.5*rdy/msfty(i,j))*a_Tmpv20
a_Tmpv8 =Tmpv3047(i,j)*a_Tmpv19
a_Tmpv18 =Tmpv3046(i,j)*a_Tmpv19
a_Tmpv17 =a_Tmpv18
a_Tmpv16 =a_Tmpv17
a_Tmpv15 =a_Tmpv16
a_Tmpv13 =a_Tmpv15
a_Tmpv14 =a_Tmpv15
a_ph(i,k,j+3) =a_ph(i,k,j+3) +a_Tmpv14
a_ph(i,k,j-3) =a_ph(i,k,j-3) -a_Tmpv14
a_Tmpv10 =a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =9.*a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =45.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./60.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv3045(i,j)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k-1,j) =a_v(i,k-1,j) +cfn*a_Tmpv4
a_v(i,k-2,j) =a_v(i,k-2,j) +cfn1*a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv3044(i,j)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +cfn*a_Tmpv1
a_v(i,k-2,j+1) =a_v(i,k-2,j+1) +cfn1*a_Tmpv1
ENDDO
DO k =kte-1, 2, -1
DO i =itf, i_start, -1
a_Tmpv21 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv21
a_Tmpv20 =-a_Tmpv21
a_Tmpv19 =(0.25*rdy/msfty(i,j))*a_Tmpv20
a_Tmpv8 =Tmpv4023(i,k,j)*a_Tmpv19
a_Tmpv18 =Tmpv4022(i,k,j)*a_Tmpv19
a_Tmpv17 =a_Tmpv18
a_Tmpv16 =a_Tmpv17
a_Tmpv15 =a_Tmpv16
a_Tmpv13 =a_Tmpv15
a_Tmpv14 =a_Tmpv15
a_ph(i,k,j+3) =a_ph(i,k,j+3) +a_Tmpv14
a_ph(i,k,j-3) =a_ph(i,k,j-3) -a_Tmpv14
a_Tmpv10 =a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =9.*a_Tmpv12
a_ph(i,k,j+2) =a_ph(i,k,j+2) +a_Tmpv11
a_ph(i,k,j-2) =a_ph(i,k,j-2) -a_Tmpv11
a_Tmpv9 =45.*a_Tmpv10
a_ph(i,k,j+1) =a_ph(i,k,j+1) +a_Tmpv9
a_ph(i,k,j-1) =a_ph(i,k,j-1) -a_Tmpv9
a_Tmpv7 =(1./60.)*a_Tmpv8
a_Tmpv3 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =msfvy(i,j)*a_Tmpv6
a_muv(i,j) =a_muv(i,j) +Tmpv4021(i,k,j)*a_Tmpv5
a_Tmpv4 =muv(i,j)*a_Tmpv5
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv4
a_v(i,k-1,j) =a_v(i,k-1,j) +a_Tmpv4
a_Tmpv2 =msfvy(i,j+1)*a_Tmpv3
a_muv(i,j+1) =a_muv(i,j+1) +Tmpv4020(i,k,j)*a_Tmpv2
a_Tmpv1 =muv(i,j+1)*a_Tmpv2
a_v(i,k,j+1) =a_v(i,k,j+1) +a_Tmpv1
a_v(i,k-1,j+1) =a_v(i,k-1,j+1) +a_Tmpv1
ENDDO
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! IF(config_flags%open_ye .or. specified ) THEN
! END IF
! IF(config_flags%open_ys .or. specified ) THEN
! END IF
END IF
!LPB[6]
!LPB[5]
! IF(non_hydrostatic) THEN
! DO j =jts, jtf
! DO i =its, itf
! ph_tend(i,kde,j) =0.
! ENDDO
! DO k =2, kte
! DO i =its, itf
! Tmpv001 =mut(i,j)*g*w(i,k,j)
! Tmpv002 =Tmpv001/msfty(i,j)
! Tmpv003 =ph_tend(i,k,j) +Tmpv002
!! ph_tend(i,k,j) =Tmpv003
! ENDDO
! ENDDO
! ENDDO
! END IF
! Added by Ning Pan, 2010-07-20
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
IF(non_hydrostatic) THEN
DO j =jtf, jts, -1
DO k =kte, 2, -1
DO i =itf, its, -1
a_Tmpv3 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv3
a_Tmpv2 =a_Tmpv3
a_Tmpv1 =a_Tmpv2/msfty(i,j)
a_mut(i,j) =a_mut(i,j) +g*w(i,k,j)*a_Tmpv1
a_w(i,k,j) =a_w(i,k,j) +mut(i,j)*g*a_Tmpv1
ENDDO
ENDDO
DO i =itf, its, -1
a_ph_tend(i,kde,j) =0.0
ENDDO
ENDDO
END IF
!LPB[4]
!LPB[3]
DO j =jtf, jts, -1
DO k =2, kte
DO i =its, itf
Tmpv001 =ww(i,k,j) +ww(i,k-1,j)
Tmpv002 =.5*Tmpv001
Tmpv003 =Tmpv002*rdnw(k-1)
Tmpv004 =ph(i,k,j) -ph(i,k-1,j)
Tmpv005 =Tmpv004 +phb(i,k,j)
Tmpv006 =Tmpv005 -phb(i,k-1,j)
Tmpv300(i,k) =Tmpv003
Tmpv301(i,k) =Tmpv006
Tmpv007 =Tmpv300(i,k)*Tmpv301(i,k)
! wdwn(i,k) =Tmpv007
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-20
! DO k =2, kte-1
! DO i =its, itf
! Tmpv001 =fnm(k)*wdwn(i,k+1) +fnp(k)*wdwn(i,k)
! Tmpv002 =ph_tend(i,k,j) -Tmpv001
!! ph_tend(i,k,j) =Tmpv002
! ENDDO
! ENDDO
DO k =kte-1, 2, -1
DO i =itf, its, -1
a_Tmpv2 =a_ph_tend(i,k,j)
a_ph_tend(i,k,j) =0.0
a_ph_tend(i,k,j) =a_ph_tend(i,k,j) +a_Tmpv2
a_Tmpv1 =-a_Tmpv2
a_wdwn(i,k+1) =a_wdwn(i,k+1) +fnm(k)*a_Tmpv1
a_wdwn(i,k) =a_wdwn(i,k) +fnp(k)*a_Tmpv1
ENDDO
ENDDO
DO k =kte, 2, -1
DO i =itf, its, -1
a_Tmpv7 =a_wdwn(i,k)
a_wdwn(i,k) =0.0
a_Tmpv3 =Tmpv301(i,k)*a_Tmpv7
a_Tmpv6 =Tmpv300(i,k)*a_Tmpv7
a_Tmpv5 =a_Tmpv6
a_Tmpv4 =a_Tmpv5
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv4
a_ph(i,k-1,j) =a_ph(i,k-1,j) -a_Tmpv4
a_Tmpv2 =rdnw(k-1)*a_Tmpv3
a_Tmpv1 =.5*a_Tmpv2
a_ww(i,k,j) =a_ww(i,k,j) +a_Tmpv1
a_ww(i,k-1,j) =a_ww(i,k-1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[2]
! advective_order =config_flags%h_sca_adv_order
! itf =min(ite, ide-1)
! jtf =min(jte, jde-1)
! ktf =min(kte, kde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_rhs_ph
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of horizontal_pressure_gradient in reverse (adjoint) mode:
! gradient of useful results: p al ru_tend cqu cqv php rv_tend
! ph alt muu muv mu
! with respect to varying inputs: p al ru_tend cqu cqv php rv_tend
! ph alt muu muv mu
! RW status of diff variables: p:incr al:incr ru_tend:in-out
! cqu:incr cqv:incr php:incr rv_tend:in-out ph:incr
! alt:incr muu:incr muv:incr mu:incr
SUBROUTINE A_HORIZONTAL_PRESSURE_GRADIENT(ru_tend, ru_tendb, rv_tend, &
& rv_tendb, ph, phb, alt, altb, p, pb0, pb, al, alb, php, phpb, cqu, &
& cqub, cqv, cqvb, muu, muub, muv, muvb, mu, mub, fnm, fnp, rdnw, cf1, &
& cf2, cf3, cfn, cfn1, rdx, rdy, msfux, msfuy, msfvx, msfvy, msftx, msfty, &
& config_flags, non_hydrostatic, top_lid, ids, ide, jds, jde, kds, kde, &
& ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
! Input data
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
LOGICAL, INTENT(IN) :: non_hydrostatic, top_lid
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: ph, alt, al&
& , p, pb, php, cqu, cqv
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: phb, altb, alb, pb0, &
& phpb, cqub, cqvb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ru_tend, &
& rv_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: ru_tendb, rv_tendb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: muu, muv, mu, msfux, &
& msfuy, msfvx, msfvy, msftx, msfty
REAL, DIMENSION(ims:ime, jms:jme) :: muub, muvb, mub
REAL, DIMENSION(kms:kme), INTENT(IN) :: rdnw, fnm, fnp
REAL, INTENT(IN) :: rdx, rdy, cf1, cf2, cf3, cfn, cfn1
INTEGER :: i, j, k, itf, jtf, ktf, i_start, j_start
REAL, DIMENSION(ims:ime, kms:kme) :: dpn
REAL, DIMENSION(ims:ime, kms:kme) :: dpnb
REAL :: dpx, dpy
REAL :: dpxb, dpyb
LOGICAL :: specified
INTEGER :: ad_from
INTEGER :: ad_to
INTEGER :: ad_from0
INTEGER :: ad_to0
INTEGER :: ad_from1
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: ad_from2
INTEGER :: ad_to3
INTEGER :: ad_to4
INTEGER :: ad_from3
INTEGER :: ad_to5
INTEGER :: ad_to6
INTEGER :: branch
INTEGER :: ad_from4
INTEGER :: ad_to7
REAL :: temp3
REAL :: temp2
REAL :: temp1
REAL :: temp0
REAL :: tempb3
REAL :: tempb2
REAL :: tempb1
REAL :: tempb0
REAL :: temp2b3
REAL :: temp2b2
REAL :: temp2b1
REAL :: temp2b0
REAL :: temp10
REAL :: temp5b3
REAL :: temp5b2
REAL :: temp5b1
REAL :: temp5b0
REAL :: tempb
REAL :: temp2b
REAL :: temp5b
REAL :: temp8b3
REAL :: temp8b2
REAL :: temp8b1
REAL :: temp8b0
REAL :: temp8b
INTRINSIC MIN
REAL :: temp
REAL :: temp9
REAL :: temp8
REAL :: temp7
REAL :: temp6
REAL :: temp5
REAL :: temp4
!
!
! horizontal_pressure_gradient calculates the
! horizontal pressure gradient terms for the large-timestep tendency
! in the horizontal momentum equations (u,v).
!
!
specified = .false.
IF (config_flags%specified .OR. config_flags%nested) specified = &
& .true.
IF (ite .GT. ide - 1) THEN
itf = ide - 1
ELSE
itf = ite
END IF
jtf = jte
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
i_start = its
j_start = jts
IF ((((config_flags%open_ys .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) .AND. jts .EQ. jds) j_start = jts + 1
IF ((((config_flags%open_ye .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) .AND. jte .EQ. jde) jtf = jtf - 1
ad_from4 = j_start
DO j=ad_from4,jtf
IF (non_hydrostatic) THEN
k = 1
ad_from = i_start
DO i=ad_from,itf
CALL PUSHREAL8(dpn(i, k))
dpn(i, k) = .5*(cf1*(p(i, k, j-1)+p(i, k, j))+cf2*(p(i, k+1, j-1&
& )+p(i, k+1, j))+cf3*(p(i, k+2, j-1)+p(i, k+2, j)))
CALL PUSHREAL8(dpn(i, kde))
dpn(i, kde) = 0.
END DO
CALL PUSHINTEGER4(i - 1)
CALL PUSHINTEGER4(ad_from)
IF (top_lid) THEN
ad_from0 = i_start
DO i=ad_from0,itf
CALL PUSHREAL8(dpn(i, kde))
!commented out for bug fix, Jan 2016
! dpn(i, kde) = .5*(cf1*(p(i, kde-1, j-1)+p(i, kde-1, j))+cf2*(p&
!& (i, kde-2, j-1)+p(i, kde-2, j))+cf3*(p(i, kde-3, j-1)+p(i, &
!& kde-3, j)))
dpn(i,kde) = .5*( cfn *(p(i,kde-1,j-1)+p(i,kde-1,j)) &
+cfn1*(p(i,kde-2,j-1)+p(i,kde-2,j)) )
END DO
CALL PUSHINTEGER4(i - 1)
CALL PUSHINTEGER4(ad_from0)
CALL PUSHCONTROL1B(1)
ELSE
CALL PUSHCONTROL1B(0)
END IF
CALL PUSHINTEGER4(k)
DO k=2,ktf
ad_from1 = i_start
DO i=ad_from1,itf
CALL PUSHREAL8(dpn(i, k))
dpn(i, k) = .5*(fnm(k)*(p(i, k, j-1)+p(i, k, j))+fnp(k)*(p(i, &
& k-1, j-1)+p(i, k-1, j)))
END DO
CALL PUSHINTEGER4(i - 1)
CALL PUSHINTEGER4(ad_from1)
END DO
CALL PUSHINTEGER4(k - 1)
! ADT eqn 45: -mu*(my/mx)*(1/rho)*partial dp/dy
! [alt, al are 1/rho terms; muv, mu are NOT coupled]
DO k=1,ktf
ad_from2 = i_start
DO i=ad_from2,itf
CALL PUSHREAL8(dpy)
! Here are mu dp/dy terms 1-3
dpy = msfvy(i, j)/msfvx(i, j)*.5*rdy*muv(i, j)*(ph(i, k+1, j)-&
& ph(i, k+1, j-1)+ph(i, k, j)-ph(i, k, j-1)+(alt(i, k, j)+alt(&
& i, k, j-1))*(p(i, k, j)-p(i, k, j-1))+(al(i, k, j)+al(i, k, &
& j-1))*(pb(i, k, j)-pb(i, k, j-1)))
! Here is mu dp/dy term 4
dpy = dpy + msfvy(i, j)/msfvx(i, j)*rdy*(php(i, k, j)-php(i, k&
& , j-1))*(rdnw(k)*(dpn(i, k+1)-dpn(i, k))-.5*(mu(i, j-1)+mu(i&
& , j)))
END DO
CALL PUSHINTEGER4(i - 1)
CALL PUSHINTEGER4(ad_from2)
END DO
CALL PUSHINTEGER4(k - 1)
CALL PUSHCONTROL1B(1)
ELSE
! ADT eqn 45: -mu*(my/mx)*(1/rho)*partial dp/dy
! [alt, al are 1/rho terms; muv, mu are NOT coupled]
DO k=1,ktf
ad_from3 = i_start
DO i=ad_from3,itf
CALL PUSHREAL8(dpy)
! Here are mu dp/dy terms 1-3; term 4 not needed if hydrostatic
dpy = msfvy(i, j)/msfvx(i, j)*.5*rdy*muv(i, j)*(ph(i, k+1, j)-&
& ph(i, k+1, j-1)+ph(i, k, j)-ph(i, k, j-1)+(alt(i, k, j)+alt(&
& i, k, j-1))*(p(i, k, j)-p(i, k, j-1))+(al(i, k, j)+al(i, k, &
& j-1))*(pb(i, k, j)-pb(i, k, j-1)))
END DO
CALL PUSHINTEGER4(i - 1)
CALL PUSHINTEGER4(ad_from3)
END DO
CALL PUSHINTEGER4(k - 1)
CALL PUSHCONTROL1B(0)
END IF
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHINTEGER4(ad_from4)
! now the east-west (x) pressure gradient
itf = ite
IF (jte .GT. jde - 1) THEN
jtf = jde - 1
ELSE
jtf = jte
END IF
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
i_start = its
j_start = jts
IF (((config_flags%open_xs .OR. specified) .OR. config_flags%nested) &
& .AND. its .EQ. ids) i_start = its + 1
IF (((config_flags%open_xe .OR. specified) .OR. config_flags%nested) &
& .AND. ite .EQ. ide) itf = itf - 1
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) itf = ite
DO j=j_start,jtf
IF (non_hydrostatic) THEN
k = 1
DO i=i_start,itf
CALL PUSHREAL8(dpn(i, k))
dpn(i, k) = .5*(cf1*(p(i-1, k, j)+p(i, k, j))+cf2*(p(i-1, k+1, j&
& )+p(i, k+1, j))+cf3*(p(i-1, k+2, j)+p(i, k+2, j)))
CALL PUSHREAL8(dpn(i, kde))
dpn(i, kde) = 0.
END DO
IF (top_lid) THEN
DO i=i_start,itf
CALL PUSHREAL8(dpn(i, kde))
!commented out for bug fix, Jan 2016
! dpn(i, kde) = .5*(cf1*(p(i-1, kde-1, j)+p(i, kde-1, j))+cf2*(p&
!& (i-1, kde-2, j)+p(i, kde-2, j))+cf3*(p(i-1, kde-3, j)+p(i, &
!& kde-3, j)))
dpn(i,kde) = .5*( cfn *(p(i-1,kde-1,j)+p(i,kde-1,j)) &
+cfn1*(p(i-1,kde-2,j)+p(i,kde-2,j)) )
END DO
CALL PUSHCONTROL1B(1)
ELSE
CALL PUSHCONTROL1B(0)
END IF
CALL PUSHINTEGER4(k)
DO k=2,ktf
DO i=i_start,itf
CALL PUSHREAL8(dpn(i, k))
dpn(i, k) = .5*(fnm(k)*(p(i-1, k, j)+p(i, k, j))+fnp(k)*(p(i-1&
& , k-1, j)+p(i, k-1, j)))
END DO
END DO
! ADT eqn 44: -mu*(mx/my)*(1/rho)*partial dp/dx
! [alt, al are 1/rho terms; muu, mu are NOT coupled]
DO k=1,ktf
DO i=i_start,itf
CALL PUSHREAL8(dpx)
! Here are mu dp/dy terms 1-3
dpx = msfux(i, j)/msfuy(i, j)*.5*rdx*muu(i, j)*(ph(i, k+1, j)-&
& ph(i-1, k+1, j)+ph(i, k, j)-ph(i-1, k, j)+(alt(i, k, j)+alt(&
& i-1, k, j))*(p(i, k, j)-p(i-1, k, j))+(al(i, k, j)+al(i-1, k&
& , j))*(pb(i, k, j)-pb(i-1, k, j)))
! Here is mu dp/dy term 4
dpx = dpx + msfux(i, j)/msfuy(i, j)*rdx*(php(i, k, j)-php(i-1&
& , k, j))*(rdnw(k)*(dpn(i, k+1)-dpn(i, k))-.5*(mu(i-1, j)+mu(&
& i, j)))
END DO
END DO
CALL PUSHCONTROL1B(1)
ELSE
! ADT eqn 44: -mu*(mx/my)*(1/rho)*partial dp/dx
! [alt, al are 1/rho terms; muu, mu are NOT coupled]
DO k=1,ktf
DO i=i_start,itf
CALL PUSHREAL8(dpx)
! Here are mu dp/dy terms 1-3; term 4 not needed if hydrostatic
dpx = msfux(i, j)/msfuy(i, j)*.5*rdx*muu(i, j)*(ph(i, k+1, j)-&
& ph(i-1, k+1, j)+ph(i, k, j)-ph(i-1, k, j)+(alt(i, k, j)+alt(&
& i-1, k, j))*(p(i, k, j)-p(i-1, k, j))+(al(i, k, j)+al(i-1, k&
& , j))*(pb(i, k, j)-pb(i-1, k, j)))
END DO
END DO
CALL PUSHCONTROL1B(0)
END IF
END DO
dpnb = 0.0
DO j=jtf,j_start,-1
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO k=ktf,1,-1
DO i=itf,i_start,-1
dpxb = -(ru_tendb(i, k, j))
CALL POPREAL8(dpx)
temp10 = pb(i, k, j) - pb(i-1, k, j)
temp9 = p(i, k, j) - p(i-1, k, j)
temp8 = alt(i, k, j) + alt(i-1, k, j)
temp8b2 = msfux(i, j)*rdx*.5*dpxb
temp8b3 = muu(i, j)*temp8b2/msfuy(i, j)
phb(i, k+1, j) = phb(i, k+1, j) + temp8b3
phb(i-1, k+1, j) = phb(i-1, k+1, j) - temp8b3
phb(i, k, j) = phb(i, k, j) + temp8b3
altb(i, k, j) = altb(i, k, j) + temp9*temp8b3
altb(i-1, k, j) = altb(i-1, k, j) + temp9*temp8b3
pb0(i, k, j) = pb0(i, k, j) + temp8*temp8b3
pb0(i-1, k, j) = pb0(i-1, k, j) - temp8*temp8b3
phb(i-1, k, j) = phb(i-1, k, j) - temp8b3
alb(i, k, j) = alb(i, k, j) + temp10*temp8b3
alb(i-1, k, j) = alb(i-1, k, j) + temp10*temp8b3
muub(i, j) = muub(i, j) + (ph(i, k+1, j)-ph(i-1, k+1, j)+ph(i&
& , k, j)+temp8*temp9-ph(i-1, k, j)+temp10*(al(i, k, j)+al(i-1&
& , k, j)))*temp8b2/msfuy(i, j)
END DO
END DO
ELSE
DO k=ktf,1,-1
DO i=itf,i_start,-1
cqub(i, k, j) = cqub(i, k, j) - dpx*ru_tendb(i, k, j)
dpxb = -(cqu(i, k, j)*ru_tendb(i, k, j))
temp8b = msfux(i, j)*rdx*dpxb
temp8b0 = (rdnw(k)*(dpn(i, k+1)-dpn(i, k))-.5*(mu(i-1, j)+mu(i&
& , j)))*temp8b/msfuy(i, j)
temp8b1 = (php(i, k, j)-php(i-1, k, j))*temp8b/msfuy(i, j)
phpb(i, k, j) = phpb(i, k, j) + temp8b0
phpb(i-1, k, j) = phpb(i-1, k, j) - temp8b0
dpnb(i, k+1) = dpnb(i, k+1) + rdnw(k)*temp8b1
dpnb(i, k) = dpnb(i, k) - rdnw(k)*temp8b1
mub(i-1, j) = mub(i-1, j) - .5*temp8b1
mub(i, j) = mub(i, j) - .5*temp8b1
CALL POPREAL8(dpx)
temp7 = pb(i, k, j) - pb(i-1, k, j)
temp6 = p(i, k, j) - p(i-1, k, j)
temp5 = alt(i, k, j) + alt(i-1, k, j)
temp5b2 = msfux(i, j)*rdx*.5*dpxb
temp5b3 = muu(i, j)*temp5b2/msfuy(i, j)
phb(i, k+1, j) = phb(i, k+1, j) + temp5b3
phb(i-1, k+1, j) = phb(i-1, k+1, j) - temp5b3
phb(i, k, j) = phb(i, k, j) + temp5b3
altb(i, k, j) = altb(i, k, j) + temp6*temp5b3
altb(i-1, k, j) = altb(i-1, k, j) + temp6*temp5b3
pb0(i, k, j) = pb0(i, k, j) + temp5*temp5b3
pb0(i-1, k, j) = pb0(i-1, k, j) - temp5*temp5b3
phb(i-1, k, j) = phb(i-1, k, j) - temp5b3
alb(i, k, j) = alb(i, k, j) + temp7*temp5b3
alb(i-1, k, j) = alb(i-1, k, j) + temp7*temp5b3
muub(i, j) = muub(i, j) + (ph(i, k+1, j)-ph(i-1, k+1, j)+ph(i&
& , k, j)+temp5*temp6-ph(i-1, k, j)+temp7*(al(i, k, j)+al(i-1&
& , k, j)))*temp5b2/msfuy(i, j)
END DO
END DO
DO k=ktf,2,-1
DO i=itf,i_start,-1
CALL POPREAL8(dpn(i, k))
temp5b1 = .5*dpnb(i, k)
pb0(i-1, k, j) = pb0(i-1, k, j) + fnm(k)*temp5b1
pb0(i, k, j) = pb0(i, k, j) + fnm(k)*temp5b1
pb0(i-1, k-1, j) = pb0(i-1, k-1, j) + fnp(k)*temp5b1
pb0(i, k-1, j) = pb0(i, k-1, j) + fnp(k)*temp5b1
dpnb(i, k) = 0.0
END DO
END DO
CALL POPINTEGER4(k)
CALL POPCONTROL1B(branch)
IF (branch .NE. 0) THEN
DO i=itf,i_start,-1
CALL POPREAL8(dpn(i, kde))
temp5b0 = .5*dpnb(i, kde)
pb0(i-1, kde-1, j) = pb0(i-1, kde-1, j) + cf1*temp5b0
pb0(i, kde-1, j) = pb0(i, kde-1, j) + cf1*temp5b0
pb0(i-1, kde-2, j) = pb0(i-1, kde-2, j) + cf2*temp5b0
pb0(i, kde-2, j) = pb0(i, kde-2, j) + cf2*temp5b0
pb0(i-1, kde-3, j) = pb0(i-1, kde-3, j) + cf3*temp5b0
pb0(i, kde-3, j) = pb0(i, kde-3, j) + cf3*temp5b0
dpnb(i, kde) = 0.0
END DO
END IF
k = 1
DO i=itf,i_start,-1
CALL POPREAL8(dpn(i, kde))
dpnb(i, kde) = 0.0
CALL POPREAL8(dpn(i, k))
temp5b = .5*dpnb(i, k)
pb0(i-1, k, j) = pb0(i-1, k, j) + cf1*temp5b
pb0(i, k, j) = pb0(i, k, j) + cf1*temp5b
pb0(i-1, k+1, j) = pb0(i-1, k+1, j) + cf2*temp5b
pb0(i, k+1, j) = pb0(i, k+1, j) + cf2*temp5b
pb0(i-1, k+2, j) = pb0(i-1, k+2, j) + cf3*temp5b
pb0(i, k+2, j) = pb0(i, k+2, j) + cf3*temp5b
dpnb(i, k) = 0.0
END DO
END IF
END DO
CALL POPINTEGER4(ad_from4)
CALL POPINTEGER4(ad_to7)
DO j=ad_to7,ad_from4,-1
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
CALL POPINTEGER4(ad_to6)
DO k=ad_to6,1,-1
CALL POPINTEGER4(ad_from3)
CALL POPINTEGER4(ad_to5)
DO i=ad_to5,ad_from3,-1
dpyb = -(rv_tendb(i, k, j))
CALL POPREAL8(dpy)
temp4 = pb(i, k, j) - pb(i, k, j-1)
temp3 = p(i, k, j) - p(i, k, j-1)
temp2 = alt(i, k, j) + alt(i, k, j-1)
temp2b2 = msfvy(i, j)*rdy*.5*dpyb
temp2b3 = muv(i, j)*temp2b2/msfvx(i, j)
phb(i, k+1, j) = phb(i, k+1, j) + temp2b3
phb(i, k+1, j-1) = phb(i, k+1, j-1) - temp2b3
phb(i, k, j) = phb(i, k, j) + temp2b3
altb(i, k, j) = altb(i, k, j) + temp3*temp2b3
altb(i, k, j-1) = altb(i, k, j-1) + temp3*temp2b3
pb0(i, k, j) = pb0(i, k, j) + temp2*temp2b3
pb0(i, k, j-1) = pb0(i, k, j-1) - temp2*temp2b3
phb(i, k, j-1) = phb(i, k, j-1) - temp2b3
alb(i, k, j) = alb(i, k, j) + temp4*temp2b3
alb(i, k, j-1) = alb(i, k, j-1) + temp4*temp2b3
muvb(i, j) = muvb(i, j) + (ph(i, k+1, j)-ph(i, k+1, j-1)+ph(i&
& , k, j)+temp2*temp3-ph(i, k, j-1)+temp4*(al(i, k, j)+al(i, k&
& , j-1)))*temp2b2/msfvx(i, j)
END DO
END DO
ELSE
CALL POPINTEGER4(ad_to4)
DO k=ad_to4,1,-1
CALL POPINTEGER4(ad_from2)
CALL POPINTEGER4(ad_to3)
DO i=ad_to3,ad_from2,-1
cqvb(i, k, j) = cqvb(i, k, j) - dpy*rv_tendb(i, k, j)
dpyb = -(cqv(i, k, j)*rv_tendb(i, k, j))
temp2b = msfvy(i, j)*rdy*dpyb
temp2b0 = (rdnw(k)*(dpn(i, k+1)-dpn(i, k))-.5*(mu(i, j-1)+mu(i&
& , j)))*temp2b/msfvx(i, j)
temp2b1 = (php(i, k, j)-php(i, k, j-1))*temp2b/msfvx(i, j)
phpb(i, k, j) = phpb(i, k, j) + temp2b0
phpb(i, k, j-1) = phpb(i, k, j-1) - temp2b0
dpnb(i, k+1) = dpnb(i, k+1) + rdnw(k)*temp2b1
dpnb(i, k) = dpnb(i, k) - rdnw(k)*temp2b1
mub(i, j-1) = mub(i, j-1) - .5*temp2b1
mub(i, j) = mub(i, j) - .5*temp2b1
CALL POPREAL8(dpy)
temp1 = pb(i, k, j) - pb(i, k, j-1)
temp0 = p(i, k, j) - p(i, k, j-1)
temp = alt(i, k, j) + alt(i, k, j-1)
tempb2 = msfvy(i, j)*rdy*.5*dpyb
tempb3 = muv(i, j)*tempb2/msfvx(i, j)
phb(i, k+1, j) = phb(i, k+1, j) + tempb3
phb(i, k+1, j-1) = phb(i, k+1, j-1) - tempb3
phb(i, k, j) = phb(i, k, j) + tempb3
altb(i, k, j) = altb(i, k, j) + temp0*tempb3
altb(i, k, j-1) = altb(i, k, j-1) + temp0*tempb3
pb0(i, k, j) = pb0(i, k, j) + temp*tempb3
pb0(i, k, j-1) = pb0(i, k, j-1) - temp*tempb3
phb(i, k, j-1) = phb(i, k, j-1) - tempb3
alb(i, k, j) = alb(i, k, j) + temp1*tempb3
alb(i, k, j-1) = alb(i, k, j-1) + temp1*tempb3
muvb(i, j) = muvb(i, j) + (ph(i, k+1, j)-ph(i, k+1, j-1)+ph(i&
& , k, j)+temp*temp0-ph(i, k, j-1)+temp1*(al(i, k, j)+al(i, k&
& , j-1)))*tempb2/msfvx(i, j)
END DO
END DO
CALL POPINTEGER4(ad_to2)
DO k=ad_to2,2,-1
CALL POPINTEGER4(ad_from1)
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,ad_from1,-1
CALL POPREAL8(dpn(i, k))
tempb1 = .5*dpnb(i, k)
pb0(i, k, j-1) = pb0(i, k, j-1) + fnm(k)*tempb1
pb0(i, k, j) = pb0(i, k, j) + fnm(k)*tempb1
pb0(i, k-1, j-1) = pb0(i, k-1, j-1) + fnp(k)*tempb1
pb0(i, k-1, j) = pb0(i, k-1, j) + fnp(k)*tempb1
dpnb(i, k) = 0.0
END DO
END DO
CALL POPINTEGER4(k)
CALL POPCONTROL1B(branch)
IF (branch .NE. 0) THEN
CALL POPINTEGER4(ad_from0)
CALL POPINTEGER4(ad_to0)
DO i=ad_to0,ad_from0,-1
CALL POPREAL8(dpn(i, kde))
tempb0 = .5*dpnb(i, kde)
pb0(i, kde-1, j-1) = pb0(i, kde-1, j-1) + cf1*tempb0
pb0(i, kde-1, j) = pb0(i, kde-1, j) + cf1*tempb0
pb0(i, kde-2, j-1) = pb0(i, kde-2, j-1) + cf2*tempb0
pb0(i, kde-2, j) = pb0(i, kde-2, j) + cf2*tempb0
pb0(i, kde-3, j-1) = pb0(i, kde-3, j-1) + cf3*tempb0
pb0(i, kde-3, j) = pb0(i, kde-3, j) + cf3*tempb0
dpnb(i, kde) = 0.0
END DO
END IF
k = 1
CALL POPINTEGER4(ad_from)
CALL POPINTEGER4(ad_to)
DO i=ad_to,ad_from,-1
CALL POPREAL8(dpn(i, kde))
dpnb(i, kde) = 0.0
CALL POPREAL8(dpn(i, k))
tempb = .5*dpnb(i, k)
pb0(i, k, j-1) = pb0(i, k, j-1) + cf1*tempb
pb0(i, k, j) = pb0(i, k, j) + cf1*tempb
pb0(i, k+1, j-1) = pb0(i, k+1, j-1) + cf2*tempb
pb0(i, k+1, j) = pb0(i, k+1, j) + cf2*tempb
pb0(i, k+2, j-1) = pb0(i, k+2, j-1) + cf3*tempb
pb0(i, k+2, j) = pb0(i, k+2, j) + cf3*tempb
dpnb(i, k) = 0.0
END DO
END IF
END DO
END SUBROUTINE A_HORIZONTAL_PRESSURE_GRADIENT
SUBROUTINE a_pg_buoy_w(rw_tend,a_rw_tend,p,a_p,cqw,a_cqw,mu,a_mu,mub,rdnw, &
rdn,g,msftx,msfty,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: p,a_p
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: cqw,a_cqw
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: rw_tend,a_rw_tend
REAL,DIMENSION(ims:ime,jms:jme) :: mub,mu,a_mu,msftx,msfty
REAL,DIMENSION(kms:kme) :: rdnw,rdn
REAL :: g
INTEGER :: itf,jtf,i,j,k
REAL :: cq1,a_cq1,cq2,a_cq2
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb1_cqw
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006
REAL,DIMENSION(its:MAX(ite,ide-1)) :: Tmpv200
REAL,DIMENSION(its:MAX(ite,ide-1),2:kde-1) :: Tmpv300
REAL,DIMENSION(its:MAX(ite,ide-1),2:kde-1) :: Tmpv301
REAL,DIMENSION(its:MAX(ite,ide-1),2:kde-1) :: Tmpv302
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
!!LPB[1]
! DO j = jts,jtf
!! DO k=2, kde-1
!! DO i=its, min(ite,ide-1)
! ! Keep_Lpb1_cqw(i,k,j) =cqw(i,k,j)
!! END DO
!! END DO
! k=kde
! DO i=its,itf
! cq1 = 1./(1.+cqw(i,k-1,j))
! cq2 = cqw(i,k-1,j)*cq1
! rw_tend(i,k,j) = rw_tend(i,k,j)+(1./msfty(i,j))*g*( &
! cq1*2.*rdnw(k-1)*( -p(i,k-1,j)) &
! -mu(i,j)-cq2*mub(i,j) )
! END DO
! DO k = 2, kde-1
! DO i = its,itf
! cq1 = 1./(1.+cqw(i,k,j))
! cq2 = cqw(i,k,j)*cq1
! cqw(i,k,j) = cq1
! rw_tend(i,k,j) = rw_tend(i,k,j)+(1./msfty(i,j))*g*( &
! cq1*rdn(k)*(p(i,k,j)-p(i,k-1,j)) &
! -mu(i,j)-cq2*mub(i,j) )
! END DO
! ENDDO
! ENDDO
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
a_cq1 =0.0
a_cq2 =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[1]
DO j =jtf, jts, -1
! DO k=2, kde-1
! DO i=its, min(ite,ide-1)
! cqw(i,k,j) =Keep_Lpb1_cqw(i,k,j)
! END DO
! END DO
k =kde
DO i =its, itf
! Revised by Ning Pan, 2010-07-21
! Tmpv200(i) =cq1
! cq1 =1./(1. +cqw(i,k-1,j))
cq1 =1./(1. +cqw(i,k-1,j))
Tmpv200(i) =cq1
! Tmpv001 =cqw(i,k-1,j)*cq1 ! Remarked by Ning Pan, 2010-07-21
! cq2 =Tmpv001
! Remarked by Ning Pan, 2010-07-21
! Tmpv001 =cq1*2.*rdnw(k-1)*(-p(i,k-1,j))
! Tmpv002 =Tmpv001 -mu(i,j)
! Tmpv003 =Tmpv002 -cq2*mub(i,j)
! Tmpv004 =(1./msfty(i,j))*g*Tmpv003
! Tmpv005 =rw_tend(i,k,j) +Tmpv004
!! rw_tend(i,k,j) =Tmpv005
ENDDO
DO k =2, kde-1
DO i =its, itf
! Revised by Ning Pan, 2010-07-21
! Tmpv300(i,k) =cq1
! cq1 =1./(1. +cqw(i,k,j))
cq1 =1./(1. +cqw(i,k,j))
Tmpv300(i,k) =cq1
! Tmpv001 =cqw(i,k,j)*cq1 ! Remarked by Ning Pan, 2010-07-21
! cq2 =Tmpv001
! Remarked by Ning Pan, 2010-07-21
! Tmpv301(i,k) =cqw(i,k,j)
! cqw(i,k,j) =cq1
Tmpv001 =p(i,k,j) -p(i,k-1,j)
Tmpv302(i,k) =Tmpv001
! Remarked by Ning Pan, 2010-07-21
! Tmpv002 =cq1*rdn(k)*Tmpv302(i,k)
! Tmpv003 =Tmpv002 -mu(i,j)
! Tmpv004 =Tmpv003 -cq2*mub(i,j)
! Tmpv005 =(1./msfty(i,j))*g*Tmpv004
! Tmpv006 =rw_tend(i,k,j) +Tmpv005
!! rw_tend(i,k,j) =Tmpv006
ENDDO
ENDDO
DO k =kde-1, 2, -1
DO i =itf, its, -1
cq1 =Tmpv300(i,k) ! Added by Ning Pan, 2010-07-21
a_Tmpv6 =a_rw_tend(i,k,j)
a_rw_tend(i,k,j) =0.0
a_rw_tend(i,k,j) =a_rw_tend(i,k,j) +a_Tmpv6
a_Tmpv5 =a_Tmpv6
a_Tmpv4 =(1./msfty(i,j))*g*a_Tmpv5
a_Tmpv3 =a_Tmpv4
a_cq2 =a_cq2 -mub(i,j)*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_mu(i,j) =a_mu(i,j) -a_Tmpv3
a_cq1 =a_cq1 +rdn(k)*Tmpv302(i,k)*a_Tmpv2
a_Tmpv1 =cq1*rdn(k)*a_Tmpv2
a_p(i,k,j) =a_p(i,k,j) +a_Tmpv1
a_p(i,k-1,j) =a_p(i,k-1,j) -a_Tmpv1
! cqw(i,k,j) =Tmpv301(i,k) ! Remarked by Ning Pan, 2010-07-21
a_cq1 =a_cq1 +a_cqw(i,k,j)
a_cqw(i,k,j) =0.0
a_Tmpv1 =a_cq2
a_cq2 =0.0
a_cqw(i,k,j) =a_cqw(i,k,j) +cq1*a_Tmpv1
a_cq1 =a_cq1 +cqw(i,k,j)*a_Tmpv1
! cq1 =Tmpv300(i,k) ! Remarked by Ning Pan, 2010-07-21
a_cqw(i,k,j) =a_cqw(i,k,j) -1./((1. +cqw(i,k,j))*(1. +cqw(i,k,j)))*a_cq1
a_cq1 =0.0
ENDDO
ENDDO
k=kde ! Added by Ning Pan, 2010-07-21
DO i =itf, its, -1
cq1 =Tmpv200(i) ! Added by Ning Pan, 2010-07-21
a_Tmpv5 =a_rw_tend(i,k,j)
a_rw_tend(i,k,j) =0.0
a_rw_tend(i,k,j) =a_rw_tend(i,k,j) +a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =(1./msfty(i,j))*g*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_cq2 =a_cq2 -mub(i,j)*a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mu(i,j) =a_mu(i,j) -a_Tmpv2
a_cq1 =a_cq1 +2.*rdnw(k-1)*(-p(i,k-1,j))*a_Tmpv1
a_p(i,k-1,j) =a_p(i,k-1,j) -1.0*cq1*2.*rdnw(k-1)*a_Tmpv1
a_Tmpv1 =a_cq2
a_cq2 =0.0
a_cqw(i,k-1,j) =a_cqw(i,k-1,j) +cq1*a_Tmpv1
a_cq1 =a_cq1 +cqw(i,k-1,j)*a_Tmpv1
! cq1 =Tmpv200(i) ! Remarkded by Ning Pan, 2010-07-21
a_cqw(i,k-1,j) =a_cqw(i,k-1,j) -1./((1. +cqw(i,k-1,j))*(1. +cqw(i,k-1,j)))*a_cq1
a_cq1 =0.0
ENDDO
ENDDO
!LPB[0]
! itf =min(ite, ide-1)
! jtf =min(jte, jde-1)
END SUBROUTINE a_pg_buoy_w
! Revised by Ning Pan, 2010-07-21
! SUBROUTINE a_w_damp(rw_tend,a_rw_tend,max_vert_cfl,a_max_vert_cfl, &
! max_horiz_cfl,a_max_horiz_cfl,u,a_u,v,a_v,ww,a_ww,w,a_w,mut,a_mut,rdnw, &
SUBROUTINE a_w_damp(rw_tend,a_rw_tend,max_vert_cfl, &
max_horiz_cfl,u,a_u,v,a_v,ww,a_ww,w,a_w,mut,a_mut,rdnw, &
rdx,rdy,msfux,msfuy,msfvx,msfvy,dt,config_flags,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
USE module_llxy
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: u,a_u,v,a_v,ww,a_ww,w,a_w
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: rw_tend,a_rw_tend
! Revised by Ning Pan, 2010-07-21
! REAL :: max_vert_cfl,a_max_vert_cfl
! REAL :: max_horiz_cfl,a_max_horiz_cfl
REAL :: max_vert_cfl
REAL :: max_horiz_cfl
REAL :: horiz_cfl,a_horiz_cfl
REAL,DIMENSION(ims:ime,jms:jme) :: mut,a_mut
REAL,DIMENSION(kms:kme) :: rdnw
REAL :: dt
REAL :: rdx,rdy
REAL,DIMENSION(ims:ime,jms:jme) :: msfux,msfuy
REAL,DIMENSION(ims:ime,jms:jme) :: msfvx,msfvy
! Revised by Ning Pan, 2010-07-21
! REAL :: vert_cfl,a_vert_cfl,cf_n,a_cf_n,cf_d,a_cf_d,maxdub,a_maxdub,maxdeta, &
! a_maxdeta
REAL :: vert_cfl,a_vert_cfl,cf_n,a_cf_n,cf_d,a_cf_d,maxdub,maxdeta
INTEGER :: itf,jtf,i,j,k,maxi,maxj,maxk
INTEGER :: some
CHARACTER*512 :: temp
CHARACTER (LEN=256) :: time_str
CHARACTER (LEN=256) :: grid_str
integer :: total
! Revised by Ning Pan, 2010-07-21
! REAL :: msfuxt,a_msfuxt,msfxffl,a_msfxffl
REAL :: msfuxt,msfxffl
! Revised by Ning Pan, 2010-07-21
! REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004
REAL :: a_Tmpv1,Tmpv1
! Remarked by Ning Pan, 2010-07-21
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv400
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv401
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv402
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv403
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv404
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv405
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv406
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv407
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv408
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv409
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv4010
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv4011
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv4012
! REAL,DIMENSION(its:min(ite,ide-1),2:kde-1,jts:min(jte,jde-1)) :: Tmpv4013
!DELETED BY WALLS
!#if 1
!#else
!#endif
!This line is fail to be recognized
! CALL wrf_debug ( 100 , TRIM(temp) ) ! Remarked by Ning Pan, 2010-07-21
!#if 1
!#else
!#endif
!This line is fail to be recognized
! CALL wrf_debug ( 100 , TRIM(temp) ) ! Remarked by Ning Pan, 2010-07-21
!This line is fail to be recognized
! CALL get_current_time_string( time_str ) ! Remarked by Ning Pan, 2010-07-21
!This line is fail to be recognized
! CALL get_current_grid_name( grid_str ) ! Remarked by Ning Pan, 2010-07-21
!This line is fail to be recognized
! CALL wrf_debug ( 0 , TRIM(wrf_err_message) ) ! Remarked by Ning Pan, 2010-07-21
!This line is fail to be recognized
! CALL wrf_debug ( 0 , TRIM(wrf_err_message) ) ! Remarked by Ning Pan, 2010-07-21
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
some = 0
max_vert_cfl = 0.
max_horiz_cfl = 0.
total = 0
!LPB[1]
IF(config_flags%polar) then
msfxffl = 1.0/COS(config_flags%fft_filter_lat*degrad)
END IF
!LPB[2]
!!LPB[3]
!
! IF ( config_flags%w_damping == 1 ) THEN
! DO j = jts,jtf
! DO k = 2, kde-1
! DO i = its,itf
! IF(config_flags%polar) then
! msfuxt = MIN(msfux(i,j), msfxffl)
! ELSE
! msfuxt = msfux(i,j)
! END IF
! vert_cfl = abs(ww(i,k,j)/mut(i,j)*rdnw(k)*dt)
! IF ( vert_cfl > max_vert_cfl ) THEN
! max_vert_cfl = vert_cfl
! maxi = i
! maxj = j
! maxk = k
! maxdub = w(i,k,j)
! maxdeta = -1./rdnw(k)
! ENDIF
! horiz_cfl = max( abs(u(i,k,j) * rdx * msfuxt * dt), &
! &
! abs(v(i,k,j) * rdy * msfvy(i,j) * dt) )
! if (horiz_cfl > max_horiz_cfl) then
! max_horiz_cfl = horiz_cfl
! endif
! if(vert_cfl .gt. w_beta)then
! cf_n = abs(ww(i,k,j)*rdnw(k)*dt)
! cf_d = abs(mut(i,j))
! if(cf_n .gt. cf_d*w_beta )then
! WRITE(temp,*)i,j,k,' vert_cfl,w,d(eta)=',vert_cfl,w(i,k,j),-1./rdnw(k)
! if ( vert_cfl > 2. ) some = some + 1
! rw_tend(i,k,j) = rw_tend(i,k,j)-sign(1.,w(i,k,j))*w_alpha*(vert_cfl- &
! w_beta)*mut(i,j)
! endif
! END DO
! ENDDO
! ENDDO
! ELSE
! DO j = jts,jtf
! DO k = 2, kde-1
! DO i = its,itf
! IF(config_flags%polar) then
! msfuxt = MIN(msfux(i,j), msfxffl)
! ELSE
! msfuxt = msfux(i,j)
! END IF
! vert_cfl = abs(ww(i,k,j)/mut(i,j)*rdnw(k)*dt)
! IF ( vert_cfl > max_vert_cfl ) THEN
! max_vert_cfl = vert_cfl
! maxi = i
! maxj = j
! maxk = k
! maxdub = w(i,k,j)
! maxdeta = -1./rdnw(k)
! ENDIF
! horiz_cfl = max( abs(u(i,k,j) * rdx * msfuxt * dt), &
! &
! abs(v(i,k,j) * rdy * msfvy(i,j) * dt) )
! if (horiz_cfl > max_horiz_cfl) then
! max_horiz_cfl = horiz_cfl
! endif
! if(vert_cfl .gt. w_beta)then
! cf_n = abs(ww(i,k,j)*rdnw(k)*dt)
! cf_d = abs(mut(i,j))
! if(cf_n .gt. cf_d*w_beta )then
! WRITE(temp,*)i,j,k,' vert_cfl,w,d(eta)=',vert_cfl,w(i,k,j),-1./rdnw(k)
! if ( vert_cfl > 2. ) some = some + 1
! endif
! END DO
! ENDDO
! ENDDO
! ENDIF
! IF ( some .GT. 0 ) THEN
! WRITE(wrf_err_message,*)some, &
! ' points exceeded cfl=2 in domain '//TRIM(grid_str)//' at time '//TRIM( &
! time_str)//' hours'
! WRITE(wrf_err_message,*)'MAX AT i,j,k: ',maxi,maxj,maxk,' vert_cfl,w,d(eta) &
! =',max_vert_cfl, &
! maxdub,maxdeta
! ENDIF
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
!REVISED BY WALLS
! a_PROJ_GAUSS =0.0
! a_PROJ_CYL =0.0
! a_PROJ_CASSINI =0.0
! a_PROJ_ROTLL =0.0
a_horiz_cfl =0.0
a_vert_cfl =0.0
a_cf_n =0.0
a_cf_d =0.0
a_Tmpv1 = 0.0 ! Added by Ning Pan, 2010-07-21
! Remarked by Ning Pan, 2010-07-21
! a_maxdub =0.0
! a_maxdeta =0.0
! a_msfuxt =0.0
! a_msfxffl =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
! Reconstructed by Ning Pan, 2010-07-21
IF( config_flags%w_damping == 1 ) THEN
DO j =jts, jtf
DO k =2, kde-1
DO i =its, itf
IF(config_flags%polar) THEN
msfuxt =min(msfux(i,j), msfxffl)
ELSE
msfuxt =msfux(i,j)
END IF
vert_cfl =abs(ww(i,k,j)/mut(i,j)*rdnw(k)*dt)
IF( vert_cfl > max_vert_cfl ) THEN
max_vert_cfl = vert_cfl ; maxi = i ; maxj = j ; maxk = k
maxdub = w(i,k,j) ; maxdeta = -1./rdnw(k)
ENDIF
horiz_cfl =max( abs(u(i,k,j) * rdx * msfuxt * dt), &
abs(v(i,k,j) * rdy * msfvy(i,j) * dt) )
IF(horiz_cfl > max_horiz_cfl) THEN
max_horiz_cfl =horiz_cfl
ENDIF
IF(vert_cfl .gt. w_beta) THEN
WRITE(temp,*)i,j,k,' vert_cfl,w,d(eta)=',vert_cfl,w(i,k,j),-1./rdnw(k)
CALL wrf_debug ( 100 , TRIM(temp) )
IF( vert_cfl > 2. ) some =some+1
a_Tmpv1 = -a_rw_tend(i,k,j)
a_vert_cfl = a_vert_cfl + sign(1., w(i,k,j)) *w_alpha*(a_Tmpv1)*mut(i,j)
a_mut(i,j) = a_mut(i,j) + sign(1., w(i,k,j)) *w_alpha*(vert_cfl -w_beta)*a_Tmpv1
a_Tmpv1 = 0.0
ENDIF
! a_v(i,k,j) =a_v(i,k,j) - sign(1.0,v(i,k,j)*rdy*msfvy(i,j)*dt)*a_horiz_cfl*rdy*msfvy(i,j)*dt &
! *sign(1.0, abs(Tmpv1*dt)-(abs(v(i,k,j)*rdy*msfvy(i,j)*dt)))*0.5
! a_Tmpv1 =a_Tmpv1 + sign(1.0, Tmpv1*dt)*a_horiz_cfl*dt &
! *sign(1.0, abs(Tmpv1*dt)-(abs(v(i,k,j)*rdy*msfvy(i,j)*dt)))*0.5
! a_v(i,k,j) =a_v(i,k,j) + sign(1.0, v(i,k,j)*rdy*msfvy(i,j)*dt)*a_horiz_cfl*rdy*msfvy(i,j)*dt*0.5
! a_Tmpv1 =a_Tmpv1 + sign(1.0, Tmpv1*dt)*a_horiz_cfl*dt*0.5
! a_horiz_cfl =0.0
! a_u(i,k,j) =a_u(i,k,j) + a_Tmpv1*rdx*msfuxt
! a_Tmpv1 =0.0
Tmpv1 =ww(i,k,j)/mut(i,j)
a_Tmpv1 = a_Tmpv1 + sign(1.0, Tmpv1*rdnw(k)*dt)*a_vert_cfl*rdnw(k)*dt
a_vert_cfl = 0.0
a_mut(i,j) = a_mut(i,j) - a_Tmpv1*ww(i,k,j)/(mut(i,j)*mut(i,j))
a_ww(i,k,j) = a_ww(i,k,j) + a_Tmpv1/mut(i,j)
a_Tmpv1 = 0.0
ENDDO
ENDDO
ENDDO
ELSE
DO j =jts, jtf
DO k =2, kde-1
DO i =its, itf
IF(config_flags%polar) THEN
msfuxt =min(msfux(i,j), msfxffl)
ELSE
msfuxt =msfux(i,j)
END IF
vert_cfl =abs(ww(i,k,j)/mut(i,j)*rdnw(k)*dt)
IF( vert_cfl > max_vert_cfl ) THEN
max_vert_cfl = vert_cfl ; maxi = i ; maxj = j ; maxk = k
maxdub = w(i,k,j) ; maxdeta = -1./rdnw(k)
ENDIF
horiz_cfl = max( abs(u(i,k,j) * rdx * msfuxt * dt), &
abs(v(i,k,j) * rdy * msfvy(i,j) * dt) )
IF(horiz_cfl > max_horiz_cfl) THEN
max_horiz_cfl =horiz_cfl
ENDIF
IF(vert_cfl .gt. w_beta) THEN
WRITE(temp,*)i,j,k,' vert_cfl,w,d(eta)=',vert_cfl,w(i,k,j),-1./rdnw(k)
CALL wrf_debug ( 100 , TRIM(temp) )
IF( vert_cfl > 2. ) some =some+1
ENDIF
ENDDO
ENDDO
ENDDO
ENDIF
IF ( some .GT. 0 ) THEN
CALL get_current_time_string( time_str )
CALL get_current_grid_name( grid_str )
WRITE(temp,*)some, &
' points exceeded cfl=2 in domain '//TRIM(grid_str)//' at time '//TRIM(time_str)//' hours'
CALL wrf_debug ( 0 , TRIM(temp) )
WRITE(temp,*)'MAX AT i,j,k: ',maxi,maxj,maxk,' vert_cfl,w,d(eta)=',max_vert_cfl, &
maxdub,maxdeta
CALL wrf_debug ( 0 , TRIM(temp) )
ENDIF
!DELETED BY WALLS
! IF( config_flags%w_damping == 1 ) THEN
! DO j =jts, jtf
! DO k =2, kde-1
! DO i =its, itf
! IF(config_flags%polar) THEN
! Tmpv400(i,k,j) =msfuxt
! msfuxt =min(msfux(i,j), msfxffl)
!
! ELSE
! Tmpv401(i,k,j) =msfuxt
! msfuxt =msfux(i,j)
!
! END IF
! Tmpv001 =ww(i,k,j)/mut(i,j)
! Tmpv002 =Tmpv001*rdnw(k)
! Tmpv003 =Tmpv002*dt
! Tmpv402(i,k,j) =Tmpv003
! Tmpv004 =abs(Tmpv402(i,k,j))
! Tmpv403(i,k,j) =vert_cfl
! vert_cfl =Tmpv004
!
! IF( vert_cfl > max_vert_cfl ) THEN
!! max_vert_cfl =vert_cfl
!
! maxi =i
! maxj =j
! maxk =k
!! maxdub =w(i,k,j)
!
! maxdeta =-1./rdnw(k)
!
! ENDIF
! Tmpv001 =u(i,k,j)*rdx*msfuxt
! Tmpv002 =Tmpv001*dt
! Tmpv404(i,k,j) =Tmpv002
! Tmpv003 =abs(Tmpv404(i,k,j))
! Tmpv405(i,k,j) =Tmpv003
! Tmpv406(i,k,j) =Tmpv405(i,k,j)
! Tmpv004 =max(Tmpv406(i,k,j), abs(v(i,k,j)*rdy*msfvy(i,j)*dt))
!! horiz_cfl =Tmpv004
!
! IF(horiz_cfl > max_horiz_cfl) THEN
!! max_horiz_cfl =horiz_cfl
!
!DELETED BY WALLS
! endif
! IF(vert_cfl .gt. w_beta) THEN
!! cf_n =abs(ww(i,k,j)*rdnw(k)*dt)
!! cf_d =abs(mut(i,j))
! IF(cf_n .gt. cf_d*w_beta ) THEN
! IF( vert_cfl > 2. ) THEN
! some =some+1
! END IF
! Tmpv001 =sign(1., w(i,k,j))*w_alpha*(vert_cfl -w_beta)*mut(i,j)
! Tmpv002 =rw_tend(i,k,j) -Tmpv001
!! rw_tend(i,k,j) =Tmpv002
! endif
! ENDDO
! ENDDO
! ENDDO
! ELSE
! DO j =jts, jtf
! DO k =2, kde-1
! DO i =its, itf
! IF(config_flags%polar) THEN
! Tmpv407(i,k,j) =msfuxt
! msfuxt =min(msfux(i,j), msfxffl)
! ELSE
! Tmpv408(i,k,j) =msfuxt
! msfuxt =msfux(i,j)
! END IF
! Tmpv001 =ww(i,k,j)/mut(i,j)
! Tmpv002 =Tmpv001*rdnw(k)
! Tmpv003 =Tmpv002*dt
! Tmpv409(i,k,j) =Tmpv003
! Tmpv004 =abs(Tmpv409(i,k,j))
! Tmpv4010(i,k,j) =vert_cfl
! vert_cfl =Tmpv004
! IF( vert_cfl > max_vert_cfl ) THEN
!! max_vert_cfl =vert_cfl
! maxi =i
! maxj =j
! maxk =k
!! maxdub =w(i,k,j)
! maxdeta =-1./rdnw(k)
! ENDIF
! Tmpv001 =u(i,k,j)*rdx*msfuxt
! Tmpv002 =Tmpv001*dt
! Tmpv4011(i,k,j) =Tmpv002
! Tmpv003 =abs(Tmpv4011(i,k,j))
! Tmpv4012(i,k,j) =Tmpv003
! Tmpv4013(i,k,j) =Tmpv4012(i,k,j)
! Tmpv004 =max(Tmpv4013(i,k,j), abs(v(i,k,j)*rdy*msfvy(i,j)*dt))
! horiz_cfl =Tmpv004
! IF(horiz_cfl > max_horiz_cfl) THEN
!! max_horiz_cfl =horiz_cfl
! endif
! IF(vert_cfl .gt. w_beta) THEN
!! cf_n =abs(ww(i,k,j)*rdnw(k)*dt)
!! cf_d =abs(mut(i,j))
! IF(cf_n .gt. cf_d*w_beta ) THEN
! IF( vert_cfl > 2. ) THEN
! some =some+1
! END IF
! endif
! ENDDO
! ENDDO
! ENDDO
! ENDIF
!! IF( some .GT. 0 ) THEN
! ENDIF
!
!!WARNING: DEADLY ERRORS OCCUR IN ADJOINT ACCUMULATING PROCESS.
!WARNING: DEADLY ERRORS OCCUR IN ADJOINT ACCUMULATING PROCESS.
!
!LPB[2]
!LPB[1]
! IF(config_flags%polar) THEN
! msfxffl =1.0/cos(config_flags%fft_filter_lat*degrad)
! END IF
! IF(config_flags%polar) THEN ! Remarked by Ning Pan, 2010-07-21
!STOP ! Remarked by Ning Pan, 2010-07-21
!DELETED BY WALLS
! a_config_flags%fft_filter_lat =a_config_flags%fft_filter_lat +1.0*degrad*sin( &
! config_flags%fft_filter_lat*degrad)/(cos(config_flags%fft_filter_lat*degrad) &
! *cos(config_flags%fft_filter_lat*degrad))*a_msfxffl
! a_msfxffl =0.0 ! Remarked by Ning Pan, 2010-07-21
! END IF ! Remarked by Ning Pan, 2010-07-21
!LPB[0]
! itf =min(ite, ide-1)
! jtf =min(jte, jde-1)
! some =0
! max_vert_cfl =0.
! max_horiz_cfl =0.
! total =0
! Remarked by Ning Pan, 2010-07-21
! a_max_horiz_cfl =0.0
! a_max_vert_cfl =0.0
END SUBROUTINE a_w_damp
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of horizontal_diffusion in reverse (adjoint) mode:
! gradient of useful results: field tendency xkmhd mu
! with respect to varying inputs: field tendency xkmhd mu
! RW status of diff variables: field:incr tendency:in-out xkmhd:incr
! mu:incr
SUBROUTINE A_HORIZONTAL_DIFFUSION(name, field, fieldb, tendency, &
& tendencyb, mu, mub, config_flags, msfux, msfuy, msfvx, msfvx_inv, &
& msfvy, msftx, msfty, khdif, xkmhd, xkmhdb, rdx, rdy, ids, ide, jds, &
& jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts, &
& kte)
IMPLICIT NONE
! Input data
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
CHARACTER(len=1), INTENT(IN) :: name
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: field, xkmhd
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: fieldb, xkmhdb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: tendencyb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu
REAL, DIMENSION(ims:ime, jms:jme) :: mub
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: msfux, msfuy, msfvx, &
& msfvx_inv, msfvy, msftx, msfty
REAL, INTENT(IN) :: rdx, rdy, khdif
! Local data
INTEGER :: i, j, k, itf, jtf, ktf
INTEGER :: i_start, i_end, j_start, j_end
REAL :: mrdx, mkrdxm, mkrdxp, mrdy, mkrdym, mkrdyp
REAL :: mkrdxmb, mkrdxpb, mkrdymb, mkrdypb
LOGICAL :: specified
REAL :: temp2
REAL :: temp1
REAL :: temp1b33
REAL :: temp0
REAL :: temp1b32
REAL :: temp1b31
REAL :: temp1b30
REAL :: tempb1
REAL :: temp0b
REAL :: tempb0
REAL :: temp1b29
REAL :: temp1b28
REAL :: temp3b
REAL :: temp1b27
REAL :: temp1b26
REAL :: temp1b25
REAL :: temp1b24
REAL :: temp1b23
REAL :: temp1b22
REAL :: temp2b1
REAL :: temp1b21
REAL :: temp2b0
REAL :: temp1b20
REAL :: tempb
REAL :: temp0b1
REAL :: temp0b0
REAL :: temp1b19
REAL :: temp1b18
REAL :: temp2b
REAL :: temp1b17
REAL :: temp1b16
REAL :: temp1b15
REAL :: temp1b14
REAL :: temp1b13
REAL :: temp1b12
REAL :: temp1b11
REAL :: temp1b10
REAL :: temp3b0
REAL :: temp1b9
REAL :: temp1b8
REAL :: temp1b7
REAL :: temp1b
REAL :: temp1b6
REAL :: temp
REAL :: temp1b5
REAL :: temp1b4
REAL :: temp1b3
REAL :: temp1b2
REAL :: temp1b1
REAL :: temp1b0
!
!
! horizontal_diffusion computes the horizontal diffusion tendency
! on model horizontal coordinate surfaces.
!
!
specified = .false.
IF (config_flags%specified .OR. config_flags%nested) specified = &
& .true.
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
IF (name .EQ. 'u') THEN
i_start = its
i_end = ite
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
IF (config_flags%open_xs .OR. specified) THEN
IF (ids + 1 .LT. its) THEN
i_start = its
ELSE
i_start = ids + 1
END IF
END IF
IF (config_flags%open_xe .OR. specified) THEN
IF (ide - 1 .GT. ite) THEN
i_end = ite
ELSE
i_end = ide - 1
END IF
END IF
IF (config_flags%open_ys .OR. specified) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (config_flags%open_ye .OR. specified) THEN
IF (jde - 2 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 2
END IF
END IF
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) i_end = ite
DO j=j_start,j_end
DO k=kts,ktf
DO i=i_start,i_end
CALL PUSHREAL8(mkrdxm)
! The interior is grad: (m_x*d/dx), the exterior is div: (m_x*m_y*d/dx(/m_y))
! setting up different averagings of m^2 partial d/dX and m^2 partial d/dY
mkrdxm = msftx(i-1, j)/msfty(i-1, j)*mu(i-1, j)*xkmhd(i-1, k, &
& j)*rdx
CALL PUSHREAL8(mkrdxp)
mkrdxp = msftx(i, j)/msfty(i, j)*mu(i, j)*xkmhd(i, k, j)*rdx
CALL PUSHREAL8(mkrdym)
mkrdym = (msfuy(i, j)+msfuy(i, j-1))/(msfux(i, j)+msfux(i, j-1&
& ))*0.25*(mu(i, j)+mu(i, j-1)+mu(i-1, j-1)+mu(i-1, j))*0.25*(&
& xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i-1, k, j-1)+xkmhd(i-1&
& , k, j))*rdy
CALL PUSHREAL8(mkrdyp)
mkrdyp = (msfuy(i, j)+msfuy(i, j+1))/(msfux(i, j)+msfux(i, j+1&
& ))*0.25*(mu(i, j)+mu(i, j+1)+mu(i-1, j+1)+mu(i-1, j))*0.25*(&
& xkmhd(i, k, j)+xkmhd(i, k, j+1)+xkmhd(i-1, k, j+1)+xkmhd(i-1&
& , k, j))*rdy
! need to do four-corners (t) for diffusion coefficient as there are
! no values at u,v points
! msfuy - has to be y as part of d/dY
! has to be u as we're at a u point
! correctly averaged version of rho~ * m^2 *
! [partial d/dX(partial du^/dX) + partial d/dY(partial du^/dY)]
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=ktf,kts,-1
DO i=i_end,i_start,-1
mrdx = msfux(i, j)*msfuy(i, j)*rdx
mrdy = msfux(i, j)*msfuy(i, j)*rdy
temp3b = mrdx*tendencyb(i, k, j)
temp3b0 = mrdy*tendencyb(i, k, j)
mkrdxpb = (field(i+1, k, j)-field(i, k, j))*temp3b
fieldb(i+1, k, j) = fieldb(i+1, k, j) + mkrdxp*temp3b
fieldb(i, k, j) = fieldb(i, k, j) + (-mkrdym-mkrdyp)*temp3b0 +&
& (-mkrdxm-mkrdxp)*temp3b
mkrdxmb = -((field(i, k, j)-field(i-1, k, j))*temp3b)
fieldb(i-1, k, j) = fieldb(i-1, k, j) + mkrdxm*temp3b
mkrdypb = (field(i, k, j+1)-field(i, k, j))*temp3b0
fieldb(i, k, j+1) = fieldb(i, k, j+1) + mkrdyp*temp3b0
mkrdymb = -((field(i, k, j)-field(i, k, j-1))*temp3b0)
fieldb(i, k, j-1) = fieldb(i, k, j-1) + mkrdym*temp3b0
CALL POPREAL8(mkrdyp)
temp2 = msfux(i, j) + msfux(i, j+1)
temp2b = (msfuy(i, j)+msfuy(i, j+1))*rdy*0.25**2*mkrdypb
temp2b0 = (xkmhd(i, k, j)+xkmhd(i, k, j+1)+xkmhd(i-1, k, j+1)+&
& xkmhd(i-1, k, j))*temp2b/temp2
temp2b1 = (mu(i, j)+mu(i, j+1)+mu(i-1, j+1)+mu(i-1, j))*temp2b&
& /temp2
mub(i, j) = mub(i, j) + temp2b0
mub(i, j+1) = mub(i, j+1) + temp2b0
mub(i-1, j+1) = mub(i-1, j+1) + temp2b0
mub(i-1, j) = mub(i-1, j) + temp2b0
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp2b1
xkmhdb(i, k, j+1) = xkmhdb(i, k, j+1) + temp2b1
xkmhdb(i-1, k, j+1) = xkmhdb(i-1, k, j+1) + temp2b1
xkmhdb(i-1, k, j) = xkmhdb(i-1, k, j) + temp2b1
CALL POPREAL8(mkrdym)
temp1 = msfux(i, j) + msfux(i, j-1)
temp1b29 = (msfuy(i, j)+msfuy(i, j-1))*rdy*0.25**2*mkrdymb
temp1b30 = (xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i-1, k, j-1)&
& +xkmhd(i-1, k, j))*temp1b29/temp1
temp1b31 = (mu(i, j)+mu(i, j-1)+mu(i-1, j-1)+mu(i-1, j))*&
& temp1b29/temp1
mub(i, j) = mub(i, j) + temp1b30
mub(i, j-1) = mub(i, j-1) + temp1b30
mub(i-1, j-1) = mub(i-1, j-1) + temp1b30
mub(i-1, j) = mub(i-1, j) + temp1b30
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b31
xkmhdb(i, k, j-1) = xkmhdb(i, k, j-1) + temp1b31
xkmhdb(i-1, k, j-1) = xkmhdb(i-1, k, j-1) + temp1b31
xkmhdb(i-1, k, j) = xkmhdb(i-1, k, j) + temp1b31
CALL POPREAL8(mkrdxp)
temp1b32 = msftx(i, j)*rdx*mkrdxpb
xkmhdb(i, k, j) = xkmhdb(i, k, j) + mu(i, j)*temp1b32/msfty(i&
& , j)
mub(i, j) = mub(i, j) + xkmhd(i, k, j)*temp1b32/msfty(i, j)
CALL POPREAL8(mkrdxm)
temp1b33 = msftx(i-1, j)*rdx*mkrdxmb
xkmhdb(i-1, k, j) = xkmhdb(i-1, k, j) + mu(i-1, j)*temp1b33/&
& msfty(i-1, j)
mub(i-1, j) = mub(i-1, j) + xkmhd(i-1, k, j)*temp1b33/msfty(i-&
& 1, j)
END DO
END DO
END DO
ELSE IF (name .EQ. 'v') THEN
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
j_end = jte
IF (config_flags%open_xs .OR. specified) THEN
IF (ids + 1 .LT. its) THEN
i_start = its
ELSE
i_start = ids + 1
END IF
END IF
IF (config_flags%open_xe .OR. specified) THEN
IF (ide - 2 .GT. ite) THEN
i_end = ite
ELSE
i_end = ide - 2
END IF
END IF
IF (config_flags%open_ys .OR. specified) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (config_flags%open_ye .OR. specified) THEN
IF (jde - 1 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 1
END IF
END IF
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) THEN
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
END IF
IF (config_flags%polar) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (config_flags%polar) THEN
IF (jde - 1 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 1
END IF
END IF
DO j=j_start,j_end
DO k=kts,ktf
DO i=i_start,i_end
CALL PUSHREAL8(mkrdxm)
mkrdxm = (msfvx(i, j)+msfvx(i-1, j))/(msfvy(i, j)+msfvy(i-1, j&
& ))*0.25*(mu(i, j)+mu(i, j-1)+mu(i-1, j-1)+mu(i-1, j))*0.25*(&
& xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i-1, k, j-1)+xkmhd(i-1&
& , k, j))*rdx
CALL PUSHREAL8(mkrdxp)
mkrdxp = (msfvx(i, j)+msfvx(i+1, j))/(msfvy(i, j)+msfvy(i+1, j&
& ))*0.25*(mu(i, j)+mu(i, j-1)+mu(i+1, j-1)+mu(i+1, j))*0.25*(&
& xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i+1, k, j-1)+xkmhd(i+1&
& , k, j))*rdx
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=ktf,kts,-1
DO i=i_end,i_start,-1
mkrdym = msfty(i, j-1)/msftx(i, j-1)*xkmhd(i, k, j-1)*rdy
mkrdyp = msfty(i, j)/msftx(i, j)*xkmhd(i, k, j)*rdy
mrdx = msfvx(i, j)*msfvy(i, j)*rdx
mrdy = msfvx(i, j)*msfvy(i, j)*rdy
temp1b = mrdx*tendencyb(i, k, j)
temp1b0 = mrdy*tendencyb(i, k, j)
mkrdxpb = (field(i+1, k, j)-field(i, k, j))*temp1b
fieldb(i+1, k, j) = fieldb(i+1, k, j) + mkrdxp*temp1b
fieldb(i, k, j) = fieldb(i, k, j) + (-mkrdym-mkrdyp)*temp1b0 +&
& (-mkrdxm-mkrdxp)*temp1b
mkrdxmb = -((field(i, k, j)-field(i-1, k, j))*temp1b)
fieldb(i-1, k, j) = fieldb(i-1, k, j) + mkrdxm*temp1b
mkrdypb = (field(i, k, j+1)-field(i, k, j))*temp1b0
fieldb(i, k, j+1) = fieldb(i, k, j+1) + mkrdyp*temp1b0
mkrdymb = -((field(i, k, j)-field(i, k, j-1))*temp1b0)
fieldb(i, k, j-1) = fieldb(i, k, j-1) + mkrdym*temp1b0
xkmhdb(i, k, j) = xkmhdb(i, k, j) + msfty(i, j)*rdy*mkrdypb/&
& msftx(i, j)
xkmhdb(i, k, j-1) = xkmhdb(i, k, j-1) + msfty(i, j-1)*rdy*&
& mkrdymb/msftx(i, j-1)
CALL POPREAL8(mkrdxp)
temp0 = msfvy(i, j) + msfvy(i+1, j)
temp0b = (msfvx(i, j)+msfvx(i+1, j))*rdx*0.25**2*mkrdxpb
temp0b0 = (xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i+1, k, j-1)+&
& xkmhd(i+1, k, j))*temp0b/temp0
temp0b1 = (mu(i, j)+mu(i, j-1)+mu(i+1, j-1)+mu(i+1, j))*temp0b&
& /temp0
mub(i, j) = mub(i, j) + temp0b0
mub(i, j-1) = mub(i, j-1) + temp0b0
mub(i+1, j-1) = mub(i+1, j-1) + temp0b0
mub(i+1, j) = mub(i+1, j) + temp0b0
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp0b1
xkmhdb(i, k, j-1) = xkmhdb(i, k, j-1) + temp0b1
xkmhdb(i+1, k, j-1) = xkmhdb(i+1, k, j-1) + temp0b1
xkmhdb(i+1, k, j) = xkmhdb(i+1, k, j) + temp0b1
CALL POPREAL8(mkrdxm)
temp = msfvy(i, j) + msfvy(i-1, j)
tempb = (msfvx(i, j)+msfvx(i-1, j))*rdx*0.25**2*mkrdxmb
tempb0 = (xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i-1, k, j-1)+&
& xkmhd(i-1, k, j))*tempb/temp
tempb1 = (mu(i, j)+mu(i, j-1)+mu(i-1, j-1)+mu(i-1, j))*tempb/&
& temp
mub(i, j) = mub(i, j) + tempb0
mub(i, j-1) = mub(i, j-1) + tempb0
mub(i-1, j-1) = mub(i-1, j-1) + tempb0
mub(i-1, j) = mub(i-1, j) + tempb0
xkmhdb(i, k, j) = xkmhdb(i, k, j) + tempb1
xkmhdb(i, k, j-1) = xkmhdb(i, k, j-1) + tempb1
xkmhdb(i-1, k, j-1) = xkmhdb(i-1, k, j-1) + tempb1
xkmhdb(i-1, k, j) = xkmhdb(i-1, k, j) + tempb1
END DO
END DO
END DO
ELSE IF (name .EQ. 'w') THEN
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
IF (config_flags%open_xs .OR. specified) THEN
IF (ids + 1 .LT. its) THEN
i_start = its
ELSE
i_start = ids + 1
END IF
END IF
IF (config_flags%open_xe .OR. specified) THEN
IF (ide - 2 .GT. ite) THEN
i_end = ite
ELSE
i_end = ide - 2
END IF
END IF
IF (config_flags%open_ys .OR. specified) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (config_flags%open_ye .OR. specified) THEN
IF (jde - 2 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 2
END IF
END IF
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) THEN
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
END IF
DO j=j_start,j_end
DO k=kts+1,ktf
DO i=i_start,i_end
CALL PUSHREAL8(mkrdxm)
mkrdxm = msfux(i, j)/msfuy(i, j)*0.25*(mu(i, j)+mu(i-1, j)+mu(&
& i, j)+mu(i-1, j))*0.25*(xkmhd(i, k, j)+xkmhd(i-1, k, j)+&
& xkmhd(i, k-1, j)+xkmhd(i-1, k-1, j))*rdx
CALL PUSHREAL8(mkrdxp)
mkrdxp = msfux(i+1, j)/msfuy(i+1, j)*0.25*(mu(i+1, j)+mu(i, j)&
& +mu(i+1, j)+mu(i, j))*0.25*(xkmhd(i+1, k, j)+xkmhd(i, k, j)+&
& xkmhd(i+1, k-1, j)+xkmhd(i, k-1, j))*rdx
CALL PUSHREAL8(mkrdym)
! mkrdym=(msfvy(i,j)/msfvx(i,j))* &
mkrdym = msfvy(i, j)*msfvx_inv(i, j)*0.25*(mu(i, j)+mu(i, j-1)&
& +mu(i, j)+mu(i, j-1))*0.25*(xkmhd(i, k, j)+xkmhd(i, k, j-1)+&
& xkmhd(i, k-1, j)+xkmhd(i, k-1, j-1))*rdy
CALL PUSHREAL8(mkrdyp)
! mkrdyp=(msfvy(i,j+1)/msfvx(i,j+1))* &
mkrdyp = msfvy(i, j+1)*msfvx_inv(i, j+1)*0.25*(mu(i, j+1)+mu(i&
& , j)+mu(i, j+1)+mu(i, j))*0.25*(xkmhd(i, k, j+1)+xkmhd(i, k&
& , j)+xkmhd(i, k-1, j+1)+xkmhd(i, k-1, j))*rdy
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=ktf,kts+1,-1
DO i=i_end,i_start,-1
mrdx = msftx(i, j)*msfty(i, j)*rdx
mrdy = msftx(i, j)*msfty(i, j)*rdy
temp1b1 = mrdx*tendencyb(i, k, j)
temp1b2 = mrdy*tendencyb(i, k, j)
mkrdxpb = (field(i+1, k, j)-field(i, k, j))*temp1b1
fieldb(i+1, k, j) = fieldb(i+1, k, j) + mkrdxp*temp1b1
fieldb(i, k, j) = fieldb(i, k, j) + (-mkrdym-mkrdyp)*temp1b2 +&
& (-mkrdxm-mkrdxp)*temp1b1
mkrdxmb = -((field(i, k, j)-field(i-1, k, j))*temp1b1)
fieldb(i-1, k, j) = fieldb(i-1, k, j) + mkrdxm*temp1b1
mkrdypb = (field(i, k, j+1)-field(i, k, j))*temp1b2
fieldb(i, k, j+1) = fieldb(i, k, j+1) + mkrdyp*temp1b2
mkrdymb = -((field(i, k, j)-field(i, k, j-1))*temp1b2)
fieldb(i, k, j-1) = fieldb(i, k, j-1) + mkrdym*temp1b2
CALL POPREAL8(mkrdyp)
temp1b3 = msfvy(i, j+1)*msfvx_inv(i, j+1)*rdy*0.25**2*mkrdypb
temp1b4 = (xkmhd(i, k, j+1)+xkmhd(i, k, j)+xkmhd(i, k-1, j+1)+&
& xkmhd(i, k-1, j))*temp1b3
temp1b5 = (2*mu(i, j+1)+2*mu(i, j))*temp1b3
mub(i, j+1) = mub(i, j+1) + 2*temp1b4
xkmhdb(i, k, j+1) = xkmhdb(i, k, j+1) + temp1b5
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b5
xkmhdb(i, k-1, j+1) = xkmhdb(i, k-1, j+1) + temp1b5
xkmhdb(i, k-1, j) = xkmhdb(i, k-1, j) + temp1b5
CALL POPREAL8(mkrdym)
temp1b7 = msfvy(i, j)*msfvx_inv(i, j)*rdy*0.25**2*mkrdymb
temp1b6 = (xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i, k-1, j)+&
& xkmhd(i, k-1, j-1))*temp1b7
mub(i, j) = mub(i, j) + 2*temp1b6 + 2*temp1b4
temp1b8 = (2*mu(i, j)+2*mu(i, j-1))*temp1b7
mub(i, j-1) = mub(i, j-1) + 2*temp1b6
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b8
xkmhdb(i, k, j-1) = xkmhdb(i, k, j-1) + temp1b8
xkmhdb(i, k-1, j) = xkmhdb(i, k-1, j) + temp1b8
xkmhdb(i, k-1, j-1) = xkmhdb(i, k-1, j-1) + temp1b8
CALL POPREAL8(mkrdxp)
temp1b9 = msfux(i+1, j)*rdx*0.25**2*mkrdxpb
temp1b10 = (xkmhd(i+1, k, j)+xkmhd(i, k, j)+xkmhd(i+1, k-1, j)&
& +xkmhd(i, k-1, j))*temp1b9/msfuy(i+1, j)
temp1b11 = (2*mu(i+1, j)+2*mu(i, j))*temp1b9/msfuy(i+1, j)
mub(i+1, j) = mub(i+1, j) + 2*temp1b10
xkmhdb(i+1, k, j) = xkmhdb(i+1, k, j) + temp1b11
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b11
xkmhdb(i+1, k-1, j) = xkmhdb(i+1, k-1, j) + temp1b11
xkmhdb(i, k-1, j) = xkmhdb(i, k-1, j) + temp1b11
CALL POPREAL8(mkrdxm)
temp1b13 = msfux(i, j)*rdx*0.25**2*mkrdxmb
temp1b12 = (xkmhd(i, k, j)+xkmhd(i-1, k, j)+xkmhd(i, k-1, j)+&
& xkmhd(i-1, k-1, j))*temp1b13/msfuy(i, j)
mub(i, j) = mub(i, j) + 2*temp1b12 + 2*temp1b10
temp1b14 = (2*mu(i, j)+2*mu(i-1, j))*temp1b13/msfuy(i, j)
mub(i-1, j) = mub(i-1, j) + 2*temp1b12
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b14
xkmhdb(i-1, k, j) = xkmhdb(i-1, k, j) + temp1b14
xkmhdb(i, k-1, j) = xkmhdb(i, k-1, j) + temp1b14
xkmhdb(i-1, k-1, j) = xkmhdb(i-1, k-1, j) + temp1b14
END DO
END DO
END DO
ELSE
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
IF (config_flags%open_xs .OR. specified) THEN
IF (ids + 1 .LT. its) THEN
i_start = its
ELSE
i_start = ids + 1
END IF
END IF
IF (config_flags%open_xe .OR. specified) THEN
IF (ide - 2 .GT. ite) THEN
i_end = ite
ELSE
i_end = ide - 2
END IF
END IF
IF (config_flags%open_ys .OR. specified) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (config_flags%open_ye .OR. specified) THEN
IF (jde - 2 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 2
END IF
END IF
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) THEN
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
END IF
DO j=j_start,j_end
DO k=kts,ktf
DO i=i_start,i_end
CALL PUSHREAL8(mkrdxm)
mkrdxm = msfux(i, j)/msfuy(i, j)*0.5*(xkmhd(i, k, j)+xkmhd(i-1&
& , k, j))*0.5*(mu(i, j)+mu(i-1, j))*rdx
CALL PUSHREAL8(mkrdxp)
mkrdxp = msfux(i+1, j)/msfuy(i+1, j)*0.5*(xkmhd(i+1, k, j)+&
& xkmhd(i, k, j))*0.5*(mu(i+1, j)+mu(i, j))*rdx
CALL PUSHREAL8(mkrdym)
! mkrdym=(msfvy(i,j)/msfvx(i,j))*0.5*(xkmhd(i,k,j)+xkmhd(i,k,j-1))*0.5*(mu(i,j)+mu(i,j-1))*rdy
mkrdym = msfvy(i, j)*msfvx_inv(i, j)*0.5*(xkmhd(i, k, j)+xkmhd&
& (i, k, j-1))*0.5*(mu(i, j)+mu(i, j-1))*rdy
CALL PUSHREAL8(mkrdyp)
! mkrdyp=(msfvy(i,j+1)/msfvx(i,j+1))*0.5*(xkmhd(i,k,j+1)+xkmhd(i,k,j))*0.5*(mu(i,j+1)+mu(i,j))*rdy
mkrdyp = msfvy(i, j+1)*msfvx_inv(i, j+1)*0.5*(xkmhd(i, k, j+1)&
& +xkmhd(i, k, j))*0.5*(mu(i, j+1)+mu(i, j))*rdy
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=ktf,kts,-1
DO i=i_end,i_start,-1
mrdx = msftx(i, j)*msfty(i, j)*rdx
mrdy = msftx(i, j)*msfty(i, j)*rdy
temp1b15 = mrdx*tendencyb(i, k, j)
temp1b16 = mrdy*tendencyb(i, k, j)
mkrdxpb = (field(i+1, k, j)-field(i, k, j))*temp1b15
fieldb(i+1, k, j) = fieldb(i+1, k, j) + mkrdxp*temp1b15
fieldb(i, k, j) = fieldb(i, k, j) + (-mkrdym-mkrdyp)*temp1b16 &
& + (-mkrdxm-mkrdxp)*temp1b15
mkrdxmb = -((field(i, k, j)-field(i-1, k, j))*temp1b15)
fieldb(i-1, k, j) = fieldb(i-1, k, j) + mkrdxm*temp1b15
mkrdypb = (field(i, k, j+1)-field(i, k, j))*temp1b16
fieldb(i, k, j+1) = fieldb(i, k, j+1) + mkrdyp*temp1b16
mkrdymb = -((field(i, k, j)-field(i, k, j-1))*temp1b16)
fieldb(i, k, j-1) = fieldb(i, k, j-1) + mkrdym*temp1b16
CALL POPREAL8(mkrdyp)
temp1b17 = msfvy(i, j+1)*msfvx_inv(i, j+1)*rdy*0.5**2*mkrdypb
temp1b18 = (mu(i, j+1)+mu(i, j))*temp1b17
temp1b19 = (xkmhd(i, k, j+1)+xkmhd(i, k, j))*temp1b17
xkmhdb(i, k, j+1) = xkmhdb(i, k, j+1) + temp1b18
mub(i, j+1) = mub(i, j+1) + temp1b19
CALL POPREAL8(mkrdym)
temp1b22 = msfvy(i, j)*msfvx_inv(i, j)*rdy*0.5**2*mkrdymb
temp1b20 = (mu(i, j)+mu(i, j-1))*temp1b22
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b20 + temp1b18
temp1b21 = (xkmhd(i, k, j)+xkmhd(i, k, j-1))*temp1b22
mub(i, j) = mub(i, j) + temp1b21 + temp1b19
xkmhdb(i, k, j-1) = xkmhdb(i, k, j-1) + temp1b20
mub(i, j-1) = mub(i, j-1) + temp1b21
CALL POPREAL8(mkrdxp)
temp1b23 = msfux(i+1, j)*rdx*0.5**2*mkrdxpb
temp1b24 = (mu(i+1, j)+mu(i, j))*temp1b23/msfuy(i+1, j)
temp1b25 = (xkmhd(i+1, k, j)+xkmhd(i, k, j))*temp1b23/msfuy(i+&
& 1, j)
xkmhdb(i+1, k, j) = xkmhdb(i+1, k, j) + temp1b24
mub(i+1, j) = mub(i+1, j) + temp1b25
CALL POPREAL8(mkrdxm)
temp1b28 = msfux(i, j)*rdx*0.5**2*mkrdxmb
temp1b26 = (mu(i, j)+mu(i-1, j))*temp1b28/msfuy(i, j)
xkmhdb(i, k, j) = xkmhdb(i, k, j) + temp1b26 + temp1b24
temp1b27 = (xkmhd(i, k, j)+xkmhd(i-1, k, j))*temp1b28/msfuy(i&
& , j)
mub(i, j) = mub(i, j) + temp1b27 + temp1b25
xkmhdb(i-1, k, j) = xkmhdb(i-1, k, j) + temp1b26
mub(i-1, j) = mub(i-1, j) + temp1b27
END DO
END DO
END DO
END IF
END SUBROUTINE A_HORIZONTAL_DIFFUSION
SUBROUTINE a_horizontal_diffusion_3dmp(name,field,a_field,tendency,a_tendency, &
mu,a_mu,config_flags,base_3d,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif, &
xkmhd,a_xkmhd,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
CHARACTER (LEN=1) :: name
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field,xkmhd,a_xkmhd,base_3d
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,jms:jme) :: mu,a_mu
REAL,DIMENSION(ims:ime,jms:jme) :: msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty
REAL :: rdx,rdy,khdif
INTEGER :: i,j,k,itf,jtf,ktf
INTEGER :: i_start,i_end,j_start,j_end
! Revised by Ning Pan, 2010-07-23
! REAL :: mrdx,a_mrdx,mkrdxm,a_mkrdxm,mkrdxp,a_mkrdxp,mrdy,a_mrdy,mkrdym, &
REAL :: mrdx,mkrdxm,a_mkrdxm,mkrdxp,a_mkrdxp,mrdy,mkrdym, &
a_mkrdym,mkrdyp,a_mkrdyp
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9, &
Tmpv009,a_Tmpv10,Tmpv010,a_Tmpv11,Tmpv011,a_Tmpv12,Tmpv012,a_Tmpv13,Tmpv013, &
a_Tmpv14,Tmpv014,a_Tmpv15,Tmpv015,a_Tmpv16,Tmpv016,a_Tmpv17,Tmpv017, &
a_Tmpv18,Tmpv018,a_Tmpv19,Tmpv019,a_Tmpv20,Tmpv020,a_Tmpv21,Tmpv021,a_Tmpv22,Tmpv022
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv300
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv301
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv302
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv303
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv304
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv305
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv306
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv307
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv308
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv309
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3010
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3011
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3012
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3013
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3014
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3015
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3016
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3017
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3018
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv3019
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
i_start = its
i_end = MIN(ite,ide-1)
j_start = jts
j_end = MIN(jte,jde-1)
!LPB[3]
IF ( config_flags%open_xs .or. specified ) i_start = MAX(ids+1,its)
!LPB[4]
!LPB[5]
IF ( config_flags%open_xe .or. specified ) i_end = MIN(ide-2,ite)
!LPB[6]
!LPB[7]
IF ( config_flags%open_ys .or. specified ) j_start = MAX(jds+1,jts)
!LPB[8]
!LPB[9]
IF ( config_flags%open_ye .or. specified ) j_end = MIN(jde-2,jte)
!LPB[10]
!LPB[11]
IF ( config_flags%periodic_x ) i_start = its
!LPB[12]
!LPB[13]
IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
!!LPB[14]
! DO j = j_start, j_end
! DO k=kts,ktf
! DO i = i_start, i_end
! mkrdxm=(msfux(i,j)/msfuy(i,j))*0.5*(xkmhd(i,k,j)+xkmhd(i-1,k,j)) &
! *0.5*(mu(i,j)+mu(i-1,j))*rdx
! mkrdxp=(msfux(i+1,j)/msfuy(i+1,j))*0.5*(xkmhd(i+1,k,j)+xkmhd(i,k,j)) &
! *0.5*(mu(i+1,j)+mu(i,j))*rdx
! mrdx=msftx(i,j)*msfty(i,j)*rdx
! mkrdym=(msfvy(i,j)*msfvx_inv(i,j))*0.5*(xkmhd(i,k,j)+xkmhd(i,k,j-1)) &
! *0.5*(mu(i,j)+mu(i,j-1))*rdy
! mkrdyp=(msfvy(i,j+1)*msfvx_inv(i,j+1))*0.5*(xkmhd(i,k,j+1)+xkmhd(i,k,j)) &
! *0.5*(mu(i,j+1)+mu(i,j))*rdy
! mrdy=msftx(i,j)*msfty(i,j)*rdy
! tendency(i,k,j)=tendency(i,k,j)+( &
! mrdx*( mkrdxp*( field(i+1,k,j) -field(i ,k,j) &
! -base_3d(i+1,k,j)+base_3d(i ,k,j) ) &
! -mkrdxm*( field(i ,k,j) -field(i-1,k,j) &
! -base_3d(i ,k,j)+base_3d(i-1,k,j) ) ) &
! +mrdy*( mkrdyp*( field(i,k,j+1) -field(i,k,j ) &
! -base_3d(i,k,j+1)+base_3d(i,k,j ) ) &
! -mkrdym*( field(i,k,j ) -field(i,k,j-1) &
! -base_3d(i,k,j )+base_3d(i,k,j-1) ) ) &
! )
! ENDDO
! ENDDO
! ENDDO
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
! a_mrdx =0.0 ! Remarked by Ning Pan, 2010-07-23
a_mkrdxm =0.0
a_mkrdxp =0.0
! a_mrdy =0.0 ! Remarked by Ning Pan, 2010-07-23
a_mkrdym =0.0
a_mkrdyp =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[14]
DO j =j_end, j_start, -1
DO k =kts, ktf
DO i =i_start, i_end
Tmpv001 =xkmhd(i,k,j) +xkmhd(i-1,k,j)
Tmpv002 =(msfux(i,j)/msfuy(i,j))*0.5*Tmpv001
Tmpv003 =Tmpv002*0.5
Tmpv004 =mu(i,j) +mu(i-1,j)
Tmpv300(i,k) =Tmpv003
Tmpv301(i,k) =Tmpv004
Tmpv005 =Tmpv300(i,k)*Tmpv301(i,k)
Tmpv006 =Tmpv005*rdx
! Revised by Ning Pan, 2010-07-23
! Tmpv302(i,k) =mkrdxm
! mkrdxm =Tmpv006
mkrdxm =Tmpv006
Tmpv302(i,k) =mkrdxm
Tmpv001 =xkmhd(i+1,k,j) +xkmhd(i,k,j)
Tmpv002 =(msfux(i+1,j)/msfuy(i+1,j))*0.5*Tmpv001
Tmpv003 =Tmpv002*0.5
Tmpv004 =mu(i+1,j) +mu(i,j)
Tmpv303(i,k) =Tmpv003
Tmpv304(i,k) =Tmpv004
Tmpv005 =Tmpv303(i,k)*Tmpv304(i,k)
Tmpv006 =Tmpv005*rdx
! Revised by Ning Pan, 2010-07-23
! Tmpv305(i,k) =mkrdxp
! mkrdxp =Tmpv006
mkrdxp =Tmpv006
Tmpv305(i,k) =mkrdxp
! Revised by Ning Pan, 2010-07-23
! Tmpv306(i,k) =mrdx
! mrdx =msftx(i,j)*msfty(i,j)*rdx
mrdx =msftx(i,j)*msfty(i,j)*rdx
Tmpv306(i,k) =mrdx
Tmpv001 =xkmhd(i,k,j) +xkmhd(i,k,j-1)
Tmpv002 =(msfvy(i,j)*msfvx_inv(i,j))*0.5*Tmpv001
Tmpv003 =Tmpv002*0.5
Tmpv004 =mu(i,j) +mu(i,j-1)
Tmpv307(i,k) =Tmpv003
Tmpv308(i,k) =Tmpv004
Tmpv005 =Tmpv307(i,k)*Tmpv308(i,k)
Tmpv006 =Tmpv005*rdy
! Revised by Ning Pan, 2010-07-23
! Tmpv309(i,k) =mkrdym
! mkrdym =Tmpv006
mkrdym =Tmpv006
Tmpv309(i,k) =mkrdym
Tmpv001 =xkmhd(i,k,j+1) +xkmhd(i,k,j)
Tmpv002 =(msfvy(i,j+1)*msfvx_inv(i,j+1))*0.5*Tmpv001
Tmpv003 =Tmpv002*0.5
Tmpv004 =mu(i,j+1) +mu(i,j)
Tmpv3010(i,k) =Tmpv003
Tmpv3011(i,k) =Tmpv004
Tmpv005 =Tmpv3010(i,k)*Tmpv3011(i,k)
Tmpv006 =Tmpv005*rdy
! Revised by Ning Pan, 2010-07-23
! Tmpv3012(i,k) =mkrdyp
! mkrdyp =Tmpv006
mkrdyp =Tmpv006
Tmpv3012(i,k) =mkrdyp
! Revised by Ning Pan, 2010-07-23
! Tmpv3013(i,k) =mrdy
! mrdy =msftx(i,j)*msfty(i,j)*rdy
mrdy =msftx(i,j)*msfty(i,j)*rdy
Tmpv3013(i,k) =mrdy
Tmpv001 =field(i+1,k,j) -field(i,k,j)
Tmpv002 =Tmpv001 -base_3d(i+1,k,j)
Tmpv003 =Tmpv002 +base_3d(i,k,j)
Tmpv3014(i,k) =Tmpv003
Tmpv004 =mkrdxp*Tmpv3014(i,k)
Tmpv005 =field(i,k,j) -field(i-1,k,j)
Tmpv006 =Tmpv005 -base_3d(i,k,j)
Tmpv007 =Tmpv006 +base_3d(i-1,k,j)
Tmpv3015(i,k) =Tmpv007
Tmpv008 =mkrdxm*Tmpv3015(i,k)
Tmpv009 =Tmpv004 -Tmpv008
Tmpv3016(i,k) =Tmpv009
Tmpv010 =mrdx*Tmpv3016(i,k)
Tmpv011 =field(i,k,j+1) -field(i,k,j)
Tmpv012 =Tmpv011 -base_3d(i,k,j+1)
Tmpv013 =Tmpv012 +base_3d(i,k,j)
Tmpv3017(i,k) =Tmpv013
Tmpv014 =mkrdyp*Tmpv3017(i,k)
Tmpv015 =field(i,k,j) -field(i,k,j-1)
Tmpv016 =Tmpv015 -base_3d(i,k,j)
Tmpv017 =Tmpv016 +base_3d(i,k,j-1)
Tmpv3018(i,k) =Tmpv017
Tmpv018 =mkrdym*Tmpv3018(i,k)
Tmpv019 =Tmpv014 -Tmpv018
Tmpv3019(i,k) =Tmpv019
! Remarked by Ning Pan, 2010-07-23
! Tmpv020 =mrdy*Tmpv3019(i,k)
! Tmpv021 =Tmpv010 +Tmpv020
! Tmpv022 =tendency(i,k,j) +Tmpv021
!! tendency(i,k,j) =Tmpv022
ENDDO
ENDDO
DO k =ktf, kts, -1
DO i =i_end, i_start, -1
! Added by Ning Pan, 2010-07-23
mkrdxm = Tmpv302(i,k)
mkrdxp = Tmpv305(i,k)
mrdx = Tmpv306(i,k)
mkrdym = Tmpv309(i,k)
mkrdyp = Tmpv3012(i,k)
mrdy = Tmpv3013(i,k)
a_Tmpv22 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv22
a_Tmpv21 =a_Tmpv22
a_Tmpv10 =a_Tmpv21
a_Tmpv20 =a_Tmpv21
! a_mrdy =a_mrdy +Tmpv3019(i,k)*a_Tmpv20 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv19 =mrdy*a_Tmpv20
a_Tmpv14 =a_Tmpv19
a_Tmpv18 =-a_Tmpv19
a_mkrdym =a_mkrdym +Tmpv3018(i,k)*a_Tmpv18
a_Tmpv17 =mkrdym*a_Tmpv18
a_Tmpv16 =a_Tmpv17
a_Tmpv15 =a_Tmpv16
a_field(i,k,j) =a_field(i,k,j) +a_Tmpv15
a_field(i,k,j-1) =a_field(i,k,j-1) -a_Tmpv15
a_mkrdyp =a_mkrdyp +Tmpv3017(i,k)*a_Tmpv14
a_Tmpv13 =mkrdyp*a_Tmpv14
a_Tmpv12 =a_Tmpv13
a_Tmpv11 =a_Tmpv12
a_field(i,k,j+1) =a_field(i,k,j+1) +a_Tmpv11
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv11
! a_mrdx =a_mrdx +Tmpv3016(i,k)*a_Tmpv10 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv9 =mrdx*a_Tmpv10
a_Tmpv4 =a_Tmpv9
a_Tmpv8 =-a_Tmpv9
a_mkrdxm =a_mkrdxm +Tmpv3015(i,k)*a_Tmpv8
a_Tmpv7 =mkrdxm*a_Tmpv8
a_Tmpv6 =a_Tmpv7
a_Tmpv5 =a_Tmpv6
a_field(i,k,j) =a_field(i,k,j) +a_Tmpv5
a_field(i-1,k,j) =a_field(i-1,k,j) -a_Tmpv5
a_mkrdxp =a_mkrdxp +Tmpv3014(i,k)*a_Tmpv4
a_Tmpv3 =mkrdxp*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_field(i+1,k,j) =a_field(i+1,k,j) +a_Tmpv1
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv1
! mrdy =Tmpv3013(i,k) ! Remarked by Ning Pan, 2010-07-23
! a_mrdy =0.0 ! Remarked by Ning Pan, 2010-07-23
! mkrdyp =Tmpv3012(i,k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv6 =a_mkrdyp
a_mkrdyp =0.0
a_Tmpv5 =rdy*a_Tmpv6
a_Tmpv3 =Tmpv3011(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv3010(i,k)*a_Tmpv5
a_mu(i,j+1) =a_mu(i,j+1) +a_Tmpv4
a_mu(i,j) =a_mu(i,j) +a_Tmpv4
a_Tmpv2 =0.5*a_Tmpv3
a_Tmpv1 =(msfvy(i,j+1)*msfvx_inv(i,j+1))*0.5*a_Tmpv2
a_xkmhd(i,k,j+1) =a_xkmhd(i,k,j+1) +a_Tmpv1
a_xkmhd(i,k,j) =a_xkmhd(i,k,j) +a_Tmpv1
! mkrdym =Tmpv309(i,k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv6 =a_mkrdym
a_mkrdym =0.0
a_Tmpv5 =rdy*a_Tmpv6
a_Tmpv3 =Tmpv308(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv307(i,k)*a_Tmpv5
a_mu(i,j) =a_mu(i,j) +a_Tmpv4
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv4
a_Tmpv2 =0.5*a_Tmpv3
a_Tmpv1 =(msfvy(i,j)*msfvx_inv(i,j))*0.5*a_Tmpv2
a_xkmhd(i,k,j) =a_xkmhd(i,k,j) +a_Tmpv1
a_xkmhd(i,k,j-1) =a_xkmhd(i,k,j-1) +a_Tmpv1
! mrdx =Tmpv306(i,k) ! Remarked by Ning Pan, 2010-07-23
! a_mrdx =0.0 ! Remarked by Ning Pan, 2010-07-23
! mkrdxp =Tmpv305(i,k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv6 =a_mkrdxp
a_mkrdxp =0.0
a_Tmpv5 =rdx*a_Tmpv6
a_Tmpv3 =Tmpv304(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv303(i,k)*a_Tmpv5
a_mu(i+1,j) =a_mu(i+1,j) +a_Tmpv4
a_mu(i,j) =a_mu(i,j) +a_Tmpv4
a_Tmpv2 =0.5*a_Tmpv3
a_Tmpv1 =(msfux(i+1,j)/msfuy(i+1,j))*0.5*a_Tmpv2
a_xkmhd(i+1,k,j) =a_xkmhd(i+1,k,j) +a_Tmpv1
a_xkmhd(i,k,j) =a_xkmhd(i,k,j) +a_Tmpv1
! mkrdxm =Tmpv302(i,k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv6 =a_mkrdxm
a_mkrdxm =0.0
a_Tmpv5 =rdx*a_Tmpv6
a_Tmpv3 =Tmpv301(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv300(i,k)*a_Tmpv5
a_mu(i,j) =a_mu(i,j) +a_Tmpv4
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv4
a_Tmpv2 =0.5*a_Tmpv3
a_Tmpv1 =(msfux(i,j)/msfuy(i,j))*0.5*a_Tmpv2
a_xkmhd(i,k,j) =a_xkmhd(i,k,j) +a_Tmpv1
a_xkmhd(i-1,k,j) =a_xkmhd(i-1,k,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[13]
! IF( config_flags%periodic_x ) THEN
! i_end =min(ite, ide-1)
! END IF
! IF( config_flags%periodic_x ) THEN
! END IF
!LPB[12]
!LPB[11]
! IF( config_flags%periodic_x ) THEN
! i_start =its
! END IF
! IF( config_flags%periodic_x ) THEN
! END IF
!LPB[10]
!LPB[9]
! IF( config_flags%open_ye .or. specified ) THEN
! j_end =min(jde-2, jte)
! END IF
! IF( config_flags%open_ye .or. specified ) THEN
! END IF
!LPB[8]
!LPB[7]
! IF( config_flags%open_ys .or. specified ) THEN
! j_start =max(jds+1, jts)
! END IF
! IF( config_flags%open_ys .or. specified ) THEN
! END IF
!LPB[6]
!LPB[5]
! IF( config_flags%open_xe .or. specified ) THEN
! i_end =min(ide-2, ite)
! END IF
! IF( config_flags%open_xe .or. specified ) THEN
! END IF
!LPB[4]
!LPB[3]
! IF( config_flags%open_xs .or. specified ) THEN
! i_start =max(ids+1, its)
! END IF
! IF( config_flags%open_xs .or. specified ) THEN
! END IF
!LPB[2]
! ktf =min(kte, kde-1)
! i_start =its
! i_end =min(ite, ide-1)
! j_start =jts
! j_end =min(jte, jde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_horizontal_diffusion_3dmp
SUBROUTINE a_vertical_diffusion(name,field,a_field,tendency,a_tendency, &
config_flags,alt,a_alt,mut,a_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime, &
jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
CHARACTER (LEN=1) :: name
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field,alt,a_alt
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,jms:jme) :: mut,a_mut
REAL,DIMENSION(kms:kme) :: rdn,rdnw
REAL :: kvdif
INTEGER :: i,j,k,itf,jtf,ktf
INTEGER :: i_start,i_end,j_start,j_end
! REAL,DIMENSION(its:ite,jts:jte) :: vfluxm,a_vfluxm,vfluxp,a_vfluxp,zz,a_zz ! Remarked by Ning Pan, 2010-07-23
REAL,DIMENSION(its:ite,0:kte+1) :: vflux,a_vflux
! REAL :: rdz,a_rdz ! Remarked by Ning Pan, 2010-07-23
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006
REAL,DIMENSION(its:MAX(ite,ide-1),kts:MAX(kte,kde-1)-1,jts:MAX(jte,jde-1)) :: Tmpv400
REAL,DIMENSION(its:MAX(ite,ide-1),kts+1:MAX(kte,kde-1),jts:MAX(jte,jde-1)) :: Tmpv401
REAL,DIMENSION(its:MAX(ite,ide-1),kts+1:MAX(kte,kde-1),jts:MAX(jte,jde-1)) :: Tmpv402
REAL,DIMENSION(its:MAX(ite,ide-1),kts+1:MAX(kte,kde-1),jts:MAX(jte,jde-1)) :: Tmpv403
REAL,DIMENSION(its:MAX(ite,ide-1),kts:MAX(kte,kde-1)-1,jts:MAX(jte,jde-1)) :: Tmpv404
REAL,DIMENSION(its:MAX(ite,ide-1),kts:MAX(kte,kde-1)-1,jts:MAX(jte,jde-1)) :: Tmpv405
REAL,DIMENSION(its:MAX(ite,ide-1),kts:MAX(kte,kde-1),jts:MAX(jte,jde-1)) :: Tmpv406
REAL,DIMENSION(its:MAX(ite,ide-1),kts:MAX(kte,kde-1),jts:MAX(jte,jde-1)) :: Tmpv407
REAL,DIMENSION(its:MAX(ite,ide-1),kts:MAX(kte,kde-1),jts:MAX(jte,jde-1)) :: Tmpv408
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
!!LPB[3]
! IF (name .EQ. 'w')THEN
! i_start = its
! i_end = MIN(ite,ide-1)
! j_start = jts
! j_end = MIN(jte,jde-1)
! j_loop_w : DO j = j_start, j_end
! DO k=kts,ktf-1
! DO i = i_start, i_end
! vflux(i,k)= (kvdif/alt(i,k,j))*rdnw(k)*(field(i,k+1,j)-field(i,k,j))
! ENDDO
! ENDDO
! DO i = i_start, i_end
! vflux(i,ktf)=0.
! ENDDO
! DO k=kts+1,ktf
! DO i = i_start, i_end
! tendency(i,k,j)=tendency(i,k,j) &
! +rdn(k)*g*g/mut(i,j)/(0.5*(alt(i,k,j)+alt(i,k-1,j))) &
! &
! *(vflux(i,k)-vflux(i,k-1))
! ENDDO
! ENDDO
! ENDDO j_loop_w
! ELSE IF(name .EQ. 'm')THEN
! i_start = its
! i_end = MIN(ite,ide-1)
! j_start = jts
! j_end = MIN(jte,jde-1)
! j_loop_s : DO j = j_start, j_end
! DO k=kts,ktf-1
! DO i = i_start, i_end
! vflux(i,k)=kvdif*rdn(k+1)/(0.5*(alt(i,k,j)+alt(i,k+1,j))) &
! *(field(i,k+1,j)-field(i,k,j))
! ENDDO
! ENDDO
! DO i = i_start, i_end
! vflux(i,0)=vflux(i,1)
! ENDDO
! DO i = i_start, i_end
! vflux(i,ktf)=0.
! ENDDO
! DO k=kts,ktf
! DO i = i_start, i_end
! tendency(i,k,j)=tendency(i,k,j)+g*g/mut(i,j)/alt(i,k,j) &
! *rdnw(k)*(vflux(i,k)-vflux(i,k-1))
! ENDDO
! ENDDO
! ENDDO j_loop_s
! ENDIF
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
! Remarked by Ning Pan, 2010-07-23
! Do K1_ADJ =jts, jte
! Do K0_ADJ =its, ite
! a_vfluxm(K0_ADJ,K1_ADJ) =0.0
! End Do
! End Do
! Do K1_ADJ =jts, jte
! Do K0_ADJ =its, ite
! a_vfluxp(K0_ADJ,K1_ADJ) =0.0
! End Do
! End Do
! Do K1_ADJ =jts, jte
! Do K0_ADJ =its, ite
! a_zz(K0_ADJ,K1_ADJ) =0.0
! End Do
! End Do
Do K1_ADJ =0, kte+1
Do K0_ADJ =its, ite
a_vflux(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
! a_rdz =0.0 ! Remarked by Ning Pan, 2010-07-23
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
IF(name .EQ. 'w') THEN
i_start =its
i_end =min(ite, ide-1)
j_start =jts
j_end =min(jte, jde-1)
DO j =j_start, j_end
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =field(i,k+1,j) -field(i,k,j)
Tmpv400(i,k,j) =Tmpv001
Tmpv002 =(kvdif/alt(i,k,j))*rdnw(k)*Tmpv400(i,k,j)
vflux(i,k) =Tmpv002
ENDDO
ENDDO
DO i =i_start, i_end
vflux(i,ktf) =0.
ENDDO
DO k =kts+1, ktf
DO i =i_start, i_end
Tmpv001 =alt(i,k,j) +alt(i,k-1,j)
Tmpv002 =0.5*Tmpv001
Tmpv401(i,k,j) =Tmpv002
Tmpv003 =rdn(k)*g*g/mut(i,j)/Tmpv401(i,k,j)
Tmpv004 =vflux(i,k) -vflux(i,k-1)
Tmpv402(i,k,j) =Tmpv003
Tmpv403(i,k,j) =Tmpv004
! Remarked by Ning Pan, 2010-07-23
! Tmpv005 =Tmpv402(i,k,j)*Tmpv403(i,k,j)
! Tmpv006 =tendency(i,k,j) +Tmpv005
!! tendency(i,k,j) =Tmpv006
ENDDO
ENDDO
ENDDO
ELSE IF(name .EQ. 'm') THEN
i_start =its
i_end =min(ite, ide-1)
j_start =jts
j_end =min(jte, jde-1)
DO j =j_start, j_end
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i,k,j) +alt(i,k+1,j)
Tmpv002 =0.5*Tmpv001
Tmpv408(i,k,j) =Tmpv002 ! Added by Ning Pan, 2010-07-23
Tmpv003 =kvdif*rdn(k+1)/Tmpv002
Tmpv004 =field(i,k+1,j) -field(i,k,j)
Tmpv404(i,k,j) =Tmpv003
Tmpv405(i,k,j) =Tmpv004
Tmpv005 =Tmpv404(i,k,j)*Tmpv405(i,k,j)
vflux(i,k) =Tmpv005
ENDDO
ENDDO
DO i =i_start, i_end
vflux(i,0) =vflux(i,1)
ENDDO
DO i =i_start, i_end
vflux(i,ktf) =0.
ENDDO
DO k =kts, ktf
DO i =i_start, i_end
Tmpv001 =g*g/mut(i,j)/alt(i,k,j)
Tmpv002 =Tmpv001*rdnw(k)
Tmpv003 =vflux(i,k) -vflux(i,k-1)
Tmpv406(i,k,j) =Tmpv002
Tmpv407(i,k,j) =Tmpv003
! Remarked by Ning Pan, 2010-07-23
! Tmpv004 =Tmpv406(i,k,j)*Tmpv407(i,k,j)
! Tmpv005 =tendency(i,k,j) +Tmpv004
!! tendency(i,k,j) =Tmpv005
ENDDO
ENDDO
ENDDO
ENDIF
IF(name .EQ. 'w') THEN
DO j =j_end, j_start, -1
DO k =ktf, kts+1, -1
DO i =i_end, i_start, -1
a_Tmpv6 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv6
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =Tmpv403(i,k,j)*a_Tmpv5
a_Tmpv4 =Tmpv402(i,k,j)*a_Tmpv5
a_vflux(i,k) =a_vflux(i,k) +a_Tmpv4
a_vflux(i,k-1) =a_vflux(i,k-1) -a_Tmpv4
a_mut(i,j) =a_mut(i,j) -rdn(k)*g*g/(mut(i,j)*mut(i,j))/Tmpv401(i,k,j)*a_Tmpv3
a_Tmpv2 =-rdn(k)*g*g/mut(i,j)/(Tmpv401(i,k,j)*Tmpv401(i,k,j))*a_Tmpv3
a_Tmpv1 =0.5*a_Tmpv2
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
a_alt(i,k-1,j) =a_alt(i,k-1,j) +a_Tmpv1
ENDDO
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,ktf) =0.0
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv2 =a_vflux(i,k)
a_vflux(i,k) =0.0
a_alt(i,k,j) =a_alt(i,k,j) -kvdif/(alt(i,k,j)*alt(i,k,j))*rdnw(k) &
*Tmpv400(i,k,j)*a_Tmpv2
a_Tmpv1 =(kvdif/alt(i,k,j))*rdnw(k)*a_Tmpv2
a_field(i,k+1,j) =a_field(i,k+1,j) +a_Tmpv1
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv1
ENDDO
ENDDO
ENDDO
ELSE IF(name .EQ. 'm') THEN
DO j =j_end, j_start, -1
DO k =ktf, kts, -1
DO i =i_end, i_start, -1
a_Tmpv5 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv2 =Tmpv407(i,k,j)*a_Tmpv4
a_Tmpv3 =Tmpv406(i,k,j)*a_Tmpv4
a_vflux(i,k) =a_vflux(i,k) +a_Tmpv3
a_vflux(i,k-1) =a_vflux(i,k-1) -a_Tmpv3
a_Tmpv1 =rdnw(k)*a_Tmpv2
a_mut(i,j) =a_mut(i,j) -g*g/(mut(i,j)*mut(i,j))/alt(i,k,j)*a_Tmpv1
a_alt(i,k,j) =a_alt(i,k,j) -g*g/mut(i,j)/(alt(i,k,j)*alt(i,k,j))*a_Tmpv1
ENDDO
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,ktf) =0.0
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,1) =a_vflux(i,1) +a_vflux(i,0)
a_vflux(i,0) =0.0
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv5 =a_vflux(i,k)
a_vflux(i,k) =0.0
a_Tmpv3 =Tmpv405(i,k,j)*a_Tmpv5
a_Tmpv4 =Tmpv404(i,k,j)*a_Tmpv5
a_field(i,k+1,j) =a_field(i,k+1,j) +a_Tmpv4
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv4
! Revised by Ning Pan, 2010-07-23
! a_Tmpv2 =-(kvdif*rdn(k+1))*a_Tmpv3/(Tmpv002*Tmpv002)
a_Tmpv2 =-(kvdif*rdn(k+1))*a_Tmpv3/(Tmpv408(i,k,j)*Tmpv408(i,k,j))
a_Tmpv1 =0.5*a_Tmpv2
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
a_alt(i,k+1,j) =a_alt(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
ENDIF
!LPB[2]
! ktf =min(kte, kde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_vertical_diffusion
SUBROUTINE a_vertical_diffusion_mp(field,a_field,tendency,a_tendency, &
config_flags,base,alt,a_alt,mut,a_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims, &
ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field,alt,a_alt
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,jms:jme) :: mut,a_mut
REAL,DIMENSION(kms:kme) :: rdn,rdnw,base
REAL :: kvdif
INTEGER :: i,j,k,itf,jtf,ktf
INTEGER :: i_start,i_end,j_start,j_end
REAL,DIMENSION(its:ite,0:kte+1) :: vflux,a_vflux
! REAL :: rdz,a_rdz ! Remarked by Ning Pan, 2010-07-25
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv300
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv301
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv302
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv303
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv304 ! Added by Ning Pan, 2010-07-25
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
i_start = its
i_end = MIN(ite,ide-1)
j_start = jts
j_end = MIN(jte,jde-1)
!!LPB[3]
! j_loop_s : DO j = j_start, j_end
! DO k=kts,ktf-1
! DO i = i_start, i_end
! vflux(i,k)=kvdif*rdn(k+1)/(0.5*(alt(i,k,j)+alt(i,k+1,j))) &
! *(field(i,k+1,j)-field(i,k,j)-base(k+1)+base(k))
! ENDDO
! ENDDO
! DO i = i_start, i_end
! vflux(i,0)=vflux(i,1)
! ENDDO
! DO i = i_start, i_end
! vflux(i,ktf)=0.
! ENDDO
! DO k=kts,ktf
! DO i = i_start, i_end
! tendency(i,k,j)=tendency(i,k,j)+g*g/mut(i,j)/alt(i,k,j) &
! *rdnw(k)*(vflux(i,k)-vflux(i,k-1))
! ENDDO
! ENDDO
! ENDDO j_loop_s
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
Do K1_ADJ =0, kte+1
Do K0_ADJ =its, ite
a_vflux(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
! a_rdz =0.0 ! Remarked by Ning Pan, 2010-07-25
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
DO j =j_end, j_start, -1
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i,k,j) +alt(i,k+1,j)
Tmpv002 =0.5*Tmpv001
Tmpv304(i,k) =Tmpv002 ! Added by Ning Pan, 2010-07-25
Tmpv003 =kvdif*rdn(k+1)/Tmpv002
Tmpv004 =field(i,k+1,j) -field(i,k,j)
Tmpv005 =Tmpv004 -base(k+1)
Tmpv006 =Tmpv005 +base(k)
Tmpv300(i,k) =Tmpv003
Tmpv301(i,k) =Tmpv006
Tmpv007 =Tmpv300(i,k)*Tmpv301(i,k)
vflux(i,k) =Tmpv007
ENDDO
ENDDO
DO i =i_start, i_end
vflux(i,0) =vflux(i,1)
ENDDO
DO i =i_start, i_end
vflux(i,ktf) =0.
ENDDO
DO k =kts, ktf
DO i =i_start, i_end
Tmpv001 =g*g/mut(i,j)/alt(i,k,j)
Tmpv002 =Tmpv001*rdnw(k)
Tmpv003 =vflux(i,k) -vflux(i,k-1)
Tmpv302(i,k) =Tmpv002
Tmpv303(i,k) =Tmpv003
! Remarked by Ning Pan, 2010-07-25
! Tmpv004 =Tmpv302(i,k)*Tmpv303(i,k)
! Tmpv005 =tendency(i,k,j) +Tmpv004
!! tendency(i,k,j) =Tmpv005
ENDDO
ENDDO
DO k =ktf, kts, -1
DO i =i_end, i_start, -1
a_Tmpv5 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv2 =Tmpv303(i,k)*a_Tmpv4
a_Tmpv3 =Tmpv302(i,k)*a_Tmpv4
a_vflux(i,k) =a_vflux(i,k) +a_Tmpv3
a_vflux(i,k-1) =a_vflux(i,k-1) -a_Tmpv3
a_Tmpv1 =rdnw(k)*a_Tmpv2
a_mut(i,j) =a_mut(i,j) -g*g/(mut(i,j)*mut(i,j))/alt(i,k,j)*a_Tmpv1
a_alt(i,k,j) =a_alt(i,k,j) -g*g/mut(i,j)/(alt(i,k,j)*alt(i,k,j))*a_Tmpv1
ENDDO
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,ktf) =0.0
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,1) =a_vflux(i,1) +a_vflux(i,0)
a_vflux(i,0) =0.0
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv7 =a_vflux(i,k)
a_vflux(i,k) =0.0
a_Tmpv3 =Tmpv301(i,k)*a_Tmpv7
a_Tmpv6 =Tmpv300(i,k)*a_Tmpv7
a_Tmpv5 =a_Tmpv6
a_Tmpv4 =a_Tmpv5
a_field(i,k+1,j) =a_field(i,k+1,j) +a_Tmpv4
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv4
! Revised by Ning Pan, 2010-07-25
! a_Tmpv2 =-(kvdif*rdn(k+1))*a_Tmpv3/(Tmpv002*Tmpv002)
a_Tmpv2 =-(kvdif*rdn(k+1))*a_Tmpv3/(Tmpv304(i,k)*Tmpv304(i,k))
a_Tmpv1 =0.5*a_Tmpv2
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
a_alt(i,k+1,j) =a_alt(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[2]
! ktf =min(kte, kde-1)
! i_start =its
! i_end =min(ite, ide-1)
! j_start =jts
! j_end =min(jte, jde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_vertical_diffusion_mp
SUBROUTINE a_vertical_diffusion_3dmp(field,a_field,tendency,a_tendency, &
config_flags,base_3d,alt,a_alt,mut,a_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde, &
ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field,alt,a_alt,base_3d
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,jms:jme) :: mut,a_mut
REAL,DIMENSION(kms:kme) :: rdn,rdnw
REAL :: kvdif
INTEGER :: i,j,k,itf,jtf,ktf
INTEGER :: i_start,i_end,j_start,j_end
REAL,DIMENSION(its:ite,0:kte+1) :: vflux,a_vflux
! REAL :: rdz,a_rdz ! Remarked by Ning Pan, 2010-07-23
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv300
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv301
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv302
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)) :: Tmpv303
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv304 ! Added by Ning Pan, 2010-07-23
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
i_start = its
i_end = MIN(ite,ide-1)
j_start = jts
j_end = MIN(jte,jde-1)
!!LPB[3]
! j_loop_s : DO j = j_start, j_end
! DO k=kts,ktf-1
! DO i = i_start, i_end
! vflux(i,k)=kvdif*rdn(k+1)/(0.5*(alt(i,k,j)+alt(i,k+1,j))) &
! *( field(i,k+1,j) -field(i,k,j) &
! -base_3d(i,k+1,j)+base_3d(i,k,j) )
! ENDDO
! ENDDO
! DO i = i_start, i_end
! vflux(i,0)=vflux(i,1)
! ENDDO
! DO i = i_start, i_end
! vflux(i,ktf)=0.
! ENDDO
! DO k=kts,ktf
! DO i = i_start, i_end
! tendency(i,k,j)=tendency(i,k,j)+g*g/mut(i,j)/alt(i,k,j) &
! *rdnw(k)*(vflux(i,k)-vflux(i,k-1))
! ENDDO
! ENDDO
! ENDDO j_loop_s
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
Do K1_ADJ =0, kte+1
Do K0_ADJ =its, ite
a_vflux(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
! a_rdz =0.0 ! Remarked by Ning Pan, 2010-07-23
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
DO j =j_end, j_start, -1
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i,k,j) +alt(i,k+1,j)
Tmpv002 =0.5*Tmpv001
Tmpv304(i,k) =Tmpv002
Tmpv003 =kvdif*rdn(k+1)/Tmpv002
Tmpv004 =field(i,k+1,j) -field(i,k,j)
Tmpv005 =Tmpv004 -base_3d(i,k+1,j)
Tmpv006 =Tmpv005 +base_3d(i,k,j)
Tmpv300(i,k) =Tmpv003
Tmpv301(i,k) =Tmpv006
Tmpv007 =Tmpv300(i,k)*Tmpv301(i,k)
vflux(i,k) =Tmpv007
ENDDO
ENDDO
DO i =i_start, i_end
vflux(i,0) =vflux(i,1)
ENDDO
DO i =i_start, i_end
vflux(i,ktf) =0.
ENDDO
DO k =kts, ktf
DO i =i_start, i_end
Tmpv001 =g*g/mut(i,j)/alt(i,k,j)
Tmpv002 =Tmpv001*rdnw(k)
Tmpv003 =vflux(i,k) -vflux(i,k-1)
Tmpv302(i,k) =Tmpv002
Tmpv303(i,k) =Tmpv003
! Remarked by Ning Pan, 2010-07-23
! Tmpv004 =Tmpv302(i,k)*Tmpv303(i,k)
! Tmpv005 =tendency(i,k,j) +Tmpv004
!! tendency(i,k,j) =Tmpv005
ENDDO
ENDDO
DO k =ktf, kts, -1
DO i =i_end, i_start, -1
a_Tmpv5 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv2 =Tmpv303(i,k)*a_Tmpv4
a_Tmpv3 =Tmpv302(i,k)*a_Tmpv4
a_vflux(i,k) =a_vflux(i,k) +a_Tmpv3
a_vflux(i,k-1) =a_vflux(i,k-1) -a_Tmpv3
a_Tmpv1 =rdnw(k)*a_Tmpv2
a_mut(i,j) =a_mut(i,j) -g*g/(mut(i,j)*mut(i,j))/alt(i,k,j)*a_Tmpv1
a_alt(i,k,j) =a_alt(i,k,j) -g*g/mut(i,j)/(alt(i,k,j)*alt(i,k,j))*a_Tmpv1
ENDDO
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,ktf) =0.0
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,1) =a_vflux(i,1) +a_vflux(i,0)
a_vflux(i,0) =0.0
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv7 =a_vflux(i,k)
a_vflux(i,k) =0.0
a_Tmpv3 =Tmpv301(i,k)*a_Tmpv7
a_Tmpv6 =Tmpv300(i,k)*a_Tmpv7
a_Tmpv5 =a_Tmpv6
a_Tmpv4 =a_Tmpv5
a_field(i,k+1,j) =a_field(i,k+1,j) +a_Tmpv4
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv4
! Revised by Ning Pan, 2010-07-23
! a_Tmpv2 =-(kvdif*rdn(k+1))*a_Tmpv3/(Tmpv002*Tmpv002)
a_Tmpv2 =-(kvdif*rdn(k+1))*a_Tmpv3/(Tmpv304(i,k)*Tmpv304(i,k))
a_Tmpv1 =0.5*a_Tmpv2
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
a_alt(i,k+1,j) =a_alt(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[2]
! ktf =min(kte, kde-1)
! i_start =its
! i_end =min(ite, ide-1)
! j_start =jts
! j_end =min(jte, jde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_vertical_diffusion_3dmp
SUBROUTINE a_vertical_diffusion_u(field,a_field,tendency,a_tendency, &
config_flags,u_base,alt,a_alt,muu,a_muu,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde, &
ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field,alt,a_alt
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,jms:jme) :: muu,a_muu
REAL,DIMENSION(kms:kme) :: rdn,rdnw,u_base
REAL :: kvdif
INTEGER :: i,j,k,itf,jtf,ktf
INTEGER :: i_start,i_end,j_start,j_end
REAL,DIMENSION(its:ite,0:kte+1) :: vflux,a_vflux
! REAL :: rdz,a_rdz,zz,a_zz ! Remarked by Ning Pan, 2010-07-23
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9,Tmpv009
REAL,DIMENSION(its:ite,kts:min(kte,kde-1)-1) :: Tmpv300
REAL,DIMENSION(its:ite,kts:min(kte,kde-1)-1) :: Tmpv301
REAL,DIMENSION(its:ite,kts:min(kte,kde-1)-1) :: Tmpv302
REAL,DIMENSION(its:ite,kts:min(kte,kde-1)-1) :: Tmpv303
REAL,DIMENSION(its:ite,kts:min(kte,kde-1)-1) :: Tmpv304
REAL,DIMENSION(its:ite,kts:min(kte,kde-1)-1) :: Tmpv305 ! Added by Ning Pan, 2010-07-23
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
i_start = its
i_end = ite
j_start = jts
j_end = MIN(jte,jde-1)
!LPB[3]
IF ( config_flags%open_xs .or. specified ) i_start = MAX(ids+1,its)
!LPB[4]
!LPB[5]
IF ( config_flags%open_xe .or. specified ) i_end = MIN(ide-1,ite)
!LPB[6]
!LPB[7]
IF ( config_flags%periodic_x ) i_start = its
!LPB[8]
!LPB[9]
IF ( config_flags%periodic_x ) i_end = ite
!!LPB[10]
! j_loop_u : DO j = j_start, j_end
! DO k=kts,ktf-1
! DO i = i_start, i_end
! vflux(i,k)=kvdif*rdn(k+1)/(0.25*( alt(i ,k ,j) &
! +alt(i-1,k ,j) &
! +alt(i ,k+1,j) &
! +alt(i-1,k+1,j) ) ) &
! *(field(i,k+1,j)-field(i,k,j) &
! -u_base(k+1) +u_base(k) )
! ENDDO
! ENDDO
! DO i = i_start, i_end
! vflux(i,0)=vflux(i,1)
! ENDDO
! DO i = i_start, i_end
! vflux(i,ktf)=0.
! ENDDO
! DO k=kts,ktf-1
! DO i = i_start, i_end
! tendency(i,k,j)=tendency(i,k,j)+ &
! g*g*rdnw(k)/muu(i,j)/(0.5*(alt(i-1,k,j)+alt(i,k,j)))* &
! (vflux(i,k)-vflux(i,k-1))
! ENDDO
! ENDDO
! ENDDO j_loop_u
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
Do K1_ADJ =0, kte+1
Do K0_ADJ =its, ite
a_vflux(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
! Remarked by Ning Pan, 2010-07-23
! a_rdz =0.0
! a_zz =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[10]
DO j =j_end, j_start, -1
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i,k,j) +alt(i-1,k,j)
Tmpv002 =Tmpv001 +alt(i,k+1,j)
Tmpv003 =Tmpv002 +alt(i-1,k+1,j)
Tmpv004 =0.25*Tmpv003
Tmpv305(i,k) =Tmpv004 ! Added by Ning Pan, 2010-07-23
Tmpv005 =kvdif*rdn(k+1)/Tmpv004
Tmpv006 =field(i,k+1,j) -field(i,k,j)
Tmpv007 =Tmpv006 -u_base(k+1)
Tmpv008 =Tmpv007 +u_base(k)
Tmpv300(i,k) =Tmpv005
Tmpv301(i,k) =Tmpv008
Tmpv009 =Tmpv300(i,k)*Tmpv301(i,k)
vflux(i,k) =Tmpv009
ENDDO
ENDDO
DO i =i_start, i_end
vflux(i,0) =vflux(i,1)
ENDDO
DO i =i_start, i_end
vflux(i,ktf) =0.
ENDDO
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i-1,k,j) +alt(i,k,j)
Tmpv002 =0.5*Tmpv001
Tmpv302(i,k) =Tmpv002
Tmpv003 =g*g*rdnw(k)/muu(i,j)/Tmpv302(i,k)
Tmpv004 =vflux(i,k) -vflux(i,k-1)
Tmpv303(i,k) =Tmpv003
Tmpv304(i,k) =Tmpv004
! Remarked by Ning Pan, 2010-07-23
! Tmpv005 =Tmpv303(i,k)*Tmpv304(i,k)
! Tmpv006 =tendency(i,k,j) +Tmpv005
!! tendency(i,k,j) =Tmpv006
ENDDO
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv6 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv6
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =Tmpv304(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv303(i,k)*a_Tmpv5
a_vflux(i,k) =a_vflux(i,k) +a_Tmpv4
a_vflux(i,k-1) =a_vflux(i,k-1) -a_Tmpv4
a_muu(i,j) =a_muu(i,j) -g*g*rdnw(k)/(muu(i,j)*muu(i,j))/Tmpv302(i,k)*a_Tmpv3
a_Tmpv2 =-g*g*rdnw(k)/muu(i,j)/(Tmpv302(i,k)*Tmpv302(i,k))*a_Tmpv3
a_Tmpv1 =0.5*a_Tmpv2
a_alt(i-1,k,j) =a_alt(i-1,k,j) +a_Tmpv1
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
ENDDO
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,ktf) =0.0
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,1) =a_vflux(i,1) +a_vflux(i,0)
a_vflux(i,0) =0.0
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv9 =a_vflux(i,k)
a_vflux(i,k) =0.0
a_Tmpv5 =Tmpv301(i,k)*a_Tmpv9
a_Tmpv8 =Tmpv300(i,k)*a_Tmpv9
a_Tmpv7 =a_Tmpv8
a_Tmpv6 =a_Tmpv7
a_field(i,k+1,j) =a_field(i,k+1,j) +a_Tmpv6
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv6
! Revised by Ning Pan, 2010-07-23
! a_Tmpv4 =-(kvdif*rdn(k+1))*a_Tmpv5/(Tmpv004*Tmpv004)
a_Tmpv4 =-(kvdif*rdn(k+1))*a_Tmpv5/(Tmpv305(i,k)*Tmpv305(i,k))
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_alt(i-1,k+1,j) =a_alt(i-1,k+1,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_alt(i,k+1,j) =a_alt(i,k+1,j) +a_Tmpv2
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
a_alt(i-1,k,j) =a_alt(i-1,k,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[9]
! IF( config_flags%periodic_x ) THEN
! i_end =ite
! END IF
! IF( config_flags%periodic_x ) THEN
! END IF
!LPB[8]
!LPB[7]
! IF( config_flags%periodic_x ) THEN
! i_start =its
! END IF
! IF( config_flags%periodic_x ) THEN
! END IF
!LPB[6]
!LPB[5]
! IF( config_flags%open_xe .or. specified ) THEN
! i_end =min(ide-1, ite)
! END IF
! IF( config_flags%open_xe .or. specified ) THEN
! END IF
!LPB[4]
!LPB[3]
! IF( config_flags%open_xs .or. specified ) THEN
! i_start =max(ids+1, its)
! END IF
! IF( config_flags%open_xs .or. specified ) THEN
! END IF
!LPB[2]
! ktf =min(kte, kde-1)
! i_start =its
! i_end =ite
! j_start =jts
! j_end =min(jte, jde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_vertical_diffusion_u
SUBROUTINE a_vertical_diffusion_v(field,a_field,tendency,a_tendency, &
config_flags,v_base,alt,a_alt,muv,a_muv,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde, &
ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field,alt,a_alt
REAL,DIMENSION(kms:kme) :: rdn,rdnw,v_base
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,jms:jme) :: muv,a_muv
REAL :: kvdif
INTEGER :: i,j,k,itf,jtf,ktf,jm1
INTEGER :: i_start,i_end,j_start,j_end
REAL,DIMENSION(its:ite,0:kte+1) :: vflux,a_vflux
! REAL :: rdz,a_rdz,zz,a_zz ! Remarked by Ning Pan, 2010-07-23
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9,Tmpv009
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv300
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv301
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv302
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv303
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv304
REAL,DIMENSION(its:min(ite,ide-1),kts:min(kte,kde-1)-1) :: Tmpv305 ! Added by Ning Pan, 2010-07-23
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
i_start = its
i_end = MIN(ite,ide-1)
j_start = jts
j_end = MIN(jte,jde-1)
!LPB[3]
IF ( config_flags%open_ys .or. specified ) j_start = MAX(jds+1,jts)
!LPB[4]
!LPB[5]
IF ( config_flags%open_ye .or. specified ) j_end = MIN(jde-1,jte)
!!LPB[6]
! j_loop_v : DO j = j_start, j_end
! jm1 = j-1
! DO k=kts,ktf-1
! DO i = i_start, i_end
! vflux(i,k)=kvdif*rdn(k+1)/(0.25*( alt(i,k ,j ) &
! +alt(i,k ,jm1) &
! +alt(i,k+1,j ) &
! +alt(i,k+1,jm1) ) ) &
! *(field(i,k+1,j)-field(i,k,j) &
! -v_base(k+1) +v_base(k) )
! ENDDO
! ENDDO
! DO i = i_start, i_end
! vflux(i,0)=vflux(i,1)
! ENDDO
! DO i = i_start, i_end
! vflux(i,ktf)=0.
! ENDDO
! DO k=kts,ktf-1
! DO i = i_start, i_end
! tendency(i,k,j)=tendency(i,k,j)+ &
! g*g*rdnw(k)/muv(i,j)/(0.5*(alt(i,k,jm1)+alt(i,k,j)))* &
! (vflux(i,k)-vflux(i,k-1))
! ENDDO
! ENDDO
! ENDDO j_loop_v
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
Do K1_ADJ =0, kte+1
Do K0_ADJ =its, ite
a_vflux(K0_ADJ,K1_ADJ) =0.0
End Do
End Do
! Remarked by Ning Pan, 2010-07-23
! a_rdz =0.0
! a_zz =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[6]
DO j =j_end, j_start, -1
jm1 =j-1
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i,k,j) +alt(i,k,jm1)
Tmpv002 =Tmpv001 +alt(i,k+1,j)
Tmpv003 =Tmpv002 +alt(i,k+1,jm1)
Tmpv004 =0.25*Tmpv003
Tmpv305(i,k) =Tmpv004 ! Added by Ning Pan, 2010-07-23
Tmpv005 =kvdif*rdn(k+1)/Tmpv004
Tmpv006 =field(i,k+1,j) -field(i,k,j)
Tmpv007 =Tmpv006 -v_base(k+1)
Tmpv008 =Tmpv007 +v_base(k)
Tmpv300(i,k) =Tmpv005
Tmpv301(i,k) =Tmpv008
Tmpv009 =Tmpv300(i,k)*Tmpv301(i,k)
vflux(i,k) =Tmpv009
ENDDO
ENDDO
DO i =i_start, i_end
vflux(i,0) =vflux(i,1)
ENDDO
DO i =i_start, i_end
vflux(i,ktf) =0.
ENDDO
DO k =kts, ktf-1
DO i =i_start, i_end
Tmpv001 =alt(i,k,jm1) +alt(i,k,j)
Tmpv002 =0.5*Tmpv001
Tmpv302(i,k) =Tmpv002
Tmpv003 =g*g*rdnw(k)/muv(i,j)/Tmpv302(i,k)
Tmpv004 =vflux(i,k) -vflux(i,k-1)
Tmpv303(i,k) =Tmpv003
Tmpv304(i,k) =Tmpv004
! Remarked by Ning Pan, 2010-07-23
! Tmpv005 =Tmpv303(i,k)*Tmpv304(i,k)
! Tmpv006 =tendency(i,k,j) +Tmpv005
!! tendency(i,k,j) =Tmpv006
ENDDO
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv6 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv6
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =Tmpv304(i,k)*a_Tmpv5
a_Tmpv4 =Tmpv303(i,k)*a_Tmpv5
a_vflux(i,k) =a_vflux(i,k) +a_Tmpv4
a_vflux(i,k-1) =a_vflux(i,k-1) -a_Tmpv4
a_muv(i,j) =a_muv(i,j) -g*g*rdnw(k)/(muv(i,j)*muv(i,j))/Tmpv302(i,k)*a_Tmpv3
a_Tmpv2 =-g*g*rdnw(k)/muv(i,j)/(Tmpv302(i,k)*Tmpv302(i,k))*a_Tmpv3
a_Tmpv1 =0.5*a_Tmpv2
a_alt(i,k,jm1) =a_alt(i,k,jm1) +a_Tmpv1
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
ENDDO
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,ktf) =0.0
ENDDO
DO i =i_end, i_start, -1
a_vflux(i,1) =a_vflux(i,1) +a_vflux(i,0)
a_vflux(i,0) =0.0
ENDDO
DO k =ktf-1, kts, -1
DO i =i_end, i_start, -1
a_Tmpv9 =a_vflux(i,k)
a_vflux(i,k) =0.0
a_Tmpv5 =Tmpv301(i,k)*a_Tmpv9
a_Tmpv8 =Tmpv300(i,k)*a_Tmpv9
a_Tmpv7 =a_Tmpv8
a_Tmpv6 =a_Tmpv7
a_field(i,k+1,j) =a_field(i,k+1,j) +a_Tmpv6
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv6
! Revised by Ning Pan, 2010-07-23
! a_Tmpv4 =-(kvdif*rdn(k+1))*a_Tmpv5/(Tmpv004*Tmpv004)
a_Tmpv4 =-(kvdif*rdn(k+1))*a_Tmpv5/(Tmpv305(i,k)*Tmpv305(i,k))
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_alt(i,k+1,jm1) =a_alt(i,k+1,jm1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_alt(i,k+1,j) =a_alt(i,k+1,j) +a_Tmpv2
a_alt(i,k,j) =a_alt(i,k,j) +a_Tmpv1
a_alt(i,k,jm1) =a_alt(i,k,jm1) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[5]
! IF( config_flags%open_ye .or. specified ) THEN
! j_end =min(jde-1, jte)
! END IF
! IF( config_flags%open_ye .or. specified ) THEN
! END IF
!LPB[4]
!LPB[3]
! IF( config_flags%open_ys .or. specified ) THEN
! j_start =max(jds+1, jts)
! END IF
! IF( config_flags%open_ys .or. specified ) THEN
! END IF
!LPB[2]
! ktf =min(kte, kde-1)
! i_start =its
! i_end =min(ite, ide-1)
! j_start =jts
! j_end =min(jte, jde-1)
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_vertical_diffusion_v
SUBROUTINE a_calculate_full ( a_rfield, a_rfieldp, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
IMPLICIT NONE
! Input data
INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte
REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: a_rfieldp
REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: a_rfield
! Local indices.
INTEGER :: i, j, k, itf, jtf, ktf
!
!
! calculate_full
! calculates full 3D field from pertubation and base field.
!
!
itf=MIN(ite,ide-1)
jtf=MIN(jte,jde-1)
ktf=MIN(kte,kde-1)
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
a_rfieldp(i,k,j)=a_rfieldp(i,k,j) + a_rfield(i,k,j)
a_rfield(i,k,j)=0.
ENDDO
ENDDO
ENDDO
END SUBROUTINE a_calculate_full
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of coriolis in reverse (adjoint) mode:
! gradient of useful results: ru_tend rw_tend ru rv rw rv_tend
! with respect to varying inputs: ru_tend rw_tend ru rv rw rv_tend
! RW status of diff variables: ru_tend:in-out rw_tend:in-out
! ru:incr rv:incr rw:incr rv_tend:in-out
SUBROUTINE A_CORIOLIS(ru, rub, rv, rvb, rw, rwb, ru_tend, ru_tendb, &
& rv_tend, rv_tendb, rw_tend, rw_tendb, config_flags, msftx, msfty, &
& msfux, msfuy, msfvx, msfvy, f, e, sina, cosa, fzm, fzp, ids, ide, jds&
& , jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts&
& , kte)
IMPLICIT NONE
! Input data
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ru_tend, &
& rv_tend, rw_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: ru_tendb, rv_tendb, &
& rw_tendb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: ru, rv, rw
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rub, rvb, rwb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: msfux, msfuy, msfvx, &
& msfvy, msftx, msfty
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: f, e, sina, cosa
REAL, DIMENSION(kms:kme), INTENT(IN) :: fzm, fzp
! Local indices.
INTEGER :: i, j, k, ktf
INTEGER :: i_start, i_end, j_start, j_end
LOGICAL :: specified
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: min4
INTEGER :: min3
INTEGER :: min2
INTEGER :: min1
REAL :: tempb5
REAL :: tempb4
REAL :: tempb3
REAL :: tempb2
REAL :: tempb1
REAL :: tempb0
REAL :: tempb
!
!
! coriolis calculates the large timestep tendency terms in the
! u, v, and w momentum equations arise from the coriolis force.
!
!
specified = .false.
IF (config_flags%specified .OR. config_flags%nested) specified = &
& .true.
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
! coriolis for u-momentum equation
! Notes on map scale factor
! cosa, sina are related to rotating the coordinate frame if desired
! generally sina=0, cosa=1
! ADT eqn 44, RHS terms 6 and 7: -2 mu w omega cos(lat)/my
! + 2 mu v omega sin(lat)/my
! Define f=2 omega sin(lat), e=2 omega cos(lat)
! => terms are: -e mu w / my + f mu v / my
! rv = mu v / mx ; rw = mu w / my
! => terms are: -e rw + f rv *mx / my
i_start = its
i_end = ite
IF ((config_flags%open_xs .OR. specified) .OR. config_flags%nested) &
& THEN
IF (ids + 1 .LT. its) THEN
i_start = its
ELSE
i_start = ids + 1
END IF
END IF
IF ((config_flags%open_xe .OR. specified) .OR. config_flags%nested) &
& THEN
IF (ide - 1 .GT. ite) THEN
i_end = ite
ELSE
i_end = ide - 1
END IF
END IF
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) i_end = ite
IF (jte .GT. jde - 1) THEN
min1 = jde - 1
ELSE
min1 = jte
END IF
! boundary loops for coriolis not needed for open bdy (commented out 20100611 JD)
! IF ( (config_flags%open_xs) .and. (its == ids) ) THEN
! DO k=kts,ktf
!
! ru_tend(its,k,j)=ru_tend(its,k,j) + (msfux(its,j)/msfuy(its,j))*0.5*(f(its,j)+f(its,j)) &
! *0.25*(rv(its,k,j+1)+rv(its,k,j+1)+rv(its,k,j)+rv(its,k,j)) &
! - 0.5*(e(its,j)+e(its,j))*0.5*(cosa(its,j)+cosa(its,j)) &
! *0.25*(rw(its,k+1,j)+rw(its,k,j)+rw(its,k+1,j)+rw(its,k,j))
! ENDDO
! ENDIF
! IF ( (config_flags%open_xe) .and. (ite == ide) ) THEN
! DO k=kts,ktf
!
! ru_tend(ite,k,j)=ru_tend(ite,k,j) + (msfux(ite,j)/msfuy(ite,j))*0.5*(f(ite-1,j)+f(ite-1,j)) &
! *0.25*(rv(ite-1,k,j+1)+rv(ite-1,k,j+1)+rv(ite-1,k,j)+rv(ite-1,k,j)) &
! - 0.5*(e(ite-1,j)+e(ite-1,j))*0.5*(cosa(ite-1,j)+cosa(ite-1,j)) &
! *0.25*(rw(ite-1,k+1,j)+rw(ite-1,k,j)+rw(ite-1,k+1,j)+rw(ite-1,k,j))
! ENDDO
! ENDIF
! coriolis term for v-momentum equation
! Notes on map scale factors
! ADT eqn 45, RHS terms 6 and 6b [0 for sina=0]: -2 mu u omega sin(lat)/mx + ?
! Define f=2 omega sin(lat), e=2 omega cos(lat)
! => terms are: -f mu u / mx
! ru = mu u / my ; rw = mu w / my
! => terms are: -f ru *my / mx + ?
j_start = jts
j_end = jte
IF (((config_flags%open_ys .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (((config_flags%open_ye .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) THEN
IF (jde - 1 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 1
END IF
END IF
! boundary loops for coriolis not needed for open bdy (commented out 20100611 JD)
! IF ( (config_flags%open_ys) .and. (jts == jds) ) THEN
! DO k=kts,ktf
! DO i=its,MIN(ide-1,ite)
!
! rv_tend(i,k,jts)=rv_tend(i,k,jts) - (msfvy(i,jts)/msfvx(i,jts))*0.5*(f(i,jts)+f(i,jts)) &
! *0.25*(ru(i,k,jts)+ru(i+1,k,jts)+ru(i,k,jts)+ru(i+1,k,jts)) &
! + (msfvy(i,jts)/msfvx(i,jts))*0.5*(e(i,jts)+e(i,jts))*0.5*(sina(i,jts)+sina(i,jts)) &
! *0.25*(rw(i,k+1,jts)+rw(i,k,jts)+rw(i,k+1,jts)+rw(i,k,jts))
! ENDDO
! ENDDO
! ENDIF
DO j=j_start,j_end
DO k=kts,ktf
IF (ide - 1 .GT. ite) THEN
min2 = ite
ELSE
min2 = ide - 1
END IF
i = min2 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
IF (jte .GT. jde - 1) THEN
min3 = jde - 1
ELSE
min3 = jte
END IF
! boundary loops for coriolis not needed for open bdy (commented out 20100611 JD)
! IF ( (config_flags%open_ye) .and. (jte == jde) ) THEN
! DO k=kts,ktf
! DO i=its,MIN(ide-1,ite)
!
! rv_tend(i,k,jte)=rv_tend(i,k,jte) - (msfvy(i,jte)/msfvx(i,jte))*0.5*(f(i,jte-1)+f(i,jte-1)) &
! *0.25*(ru(i,k,jte-1)+ru(i+1,k,jte-1)+ru(i,k,jte-1)+ru(i+1,k,jte-1)) &
! + (msfvy(i,jte)/msfvx(i,jte))*0.5*(e(i,jte-1)+e(i,jte-1))*0.5*(sina(i,jte-1)+sina(i,jte-1)) &
! *0.25*(rw(i,k+1,jte-1)+rw(i,k,jte-1)+rw(i,k+1,jte-1)+rw(i,k,jte-1))
! ENDDO
! ENDDO
! ENDIF
! coriolis term for w-mometum
! Notes on map scale factors
! ADT eqn 46/my, RHS terms 5 and 5b [0 for sina=0]: 2 mu u omega cos(lat)/my +?
! Define e=2 omega cos(lat)
! => terms are: e mu u / my + ???
! ru = mu u / my ; ru = mu v / mx
! => terms are: e ru + ???
DO j=jts,min3
DO k=kts+1,ktf
IF (ite .GT. ide - 1) THEN
min4 = ide - 1
ELSE
min4 = ite
END IF
i = min4 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
DO j=min3,jts,-1
DO k=ktf,kts+1,-1
CALL POPINTEGER4(ad_to0)
DO i=ad_to0,its,-1
tempb3 = e(i, j)*rw_tendb(i, k, j)
tempb4 = cosa(i, j)*0.5*tempb3
tempb5 = -(msftx(i, j)*0.5*sina(i, j)*tempb3/msfty(i, j))
rub(i, k, j) = rub(i, k, j) + fzm(k)*tempb4
rub(i+1, k, j) = rub(i+1, k, j) + fzm(k)*tempb4
rub(i, k-1, j) = rub(i, k-1, j) + fzp(k)*tempb4
rub(i+1, k-1, j) = rub(i+1, k-1, j) + fzp(k)*tempb4
rvb(i, k, j) = rvb(i, k, j) + fzm(k)*tempb5
rvb(i, k, j+1) = rvb(i, k, j+1) + fzm(k)*tempb5
rvb(i, k-1, j) = rvb(i, k-1, j) + fzp(k)*tempb5
rvb(i, k-1, j+1) = rvb(i, k-1, j+1) + fzp(k)*tempb5
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
tempb1 = -(msfvy(i, j)*0.25*0.5*(f(i, j)+f(i, j-1))*rv_tendb(i, &
& k, j)/msfvx(i, j))
tempb2 = (e(i, j)+e(i, j-1))*(sina(i, j)+sina(i, j-1))*msfvy(i, &
& j)*0.5**2*0.25*rv_tendb(i, k, j)/msfvx(i, j)
rub(i, k, j) = rub(i, k, j) + tempb1
rub(i+1, k, j) = rub(i+1, k, j) + tempb1
rub(i, k, j-1) = rub(i, k, j-1) + tempb1
rub(i+1, k, j-1) = rub(i+1, k, j-1) + tempb1
rwb(i, k+1, j-1) = rwb(i, k+1, j-1) + tempb2
rwb(i, k, j-1) = rwb(i, k, j-1) + tempb2
rwb(i, k+1, j) = rwb(i, k+1, j) + tempb2
rwb(i, k, j) = rwb(i, k, j) + tempb2
END DO
END DO
END DO
DO j=min1,jts,-1
DO k=ktf,kts,-1
DO i=i_end,i_start,-1
tempb = msfux(i, j)*0.25*0.5*(f(i, j)+f(i-1, j))*ru_tendb(i, k, &
& j)/msfuy(i, j)
tempb0 = -((e(i, j)+e(i-1, j))*0.5**2*0.25*(cosa(i, j)+cosa(i-1&
& , j))*ru_tendb(i, k, j))
rvb(i-1, k, j+1) = rvb(i-1, k, j+1) + tempb
rvb(i, k, j+1) = rvb(i, k, j+1) + tempb
rvb(i-1, k, j) = rvb(i-1, k, j) + tempb
rvb(i, k, j) = rvb(i, k, j) + tempb
rwb(i-1, k+1, j) = rwb(i-1, k+1, j) + tempb0
rwb(i-1, k, j) = rwb(i-1, k, j) + tempb0
rwb(i, k+1, j) = rwb(i, k+1, j) + tempb0
rwb(i, k, j) = rwb(i, k, j) + tempb0
END DO
END DO
END DO
END SUBROUTINE A_CORIOLIS
SUBROUTINE a_perturbation_coriolis(ru_in,a_ru_in,rv_in,a_rv_in,rw,a_rw, &
ru_tend,a_ru_tend,rv_tend,a_rv_tend,rw_tend,a_rw_tend,config_flags,u_base, &
v_base,z_base,muu,a_muu,muv,a_muv,phb,ph,a_ph,msftx,msfty,msfux,msfuy,msfvx, &
msfvy,f,e,sina,cosa,fzm,fzp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru_tend,a_ru_tend,rv_tend,a_rv_tend, &
rw_tend,a_rw_tend
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru_in,a_ru_in,rv_in,a_rv_in,rw,a_rw, &
ph,a_ph,phb
REAL,DIMENSION(ims:ime,jms:jme) :: msfux,msfuy,msfvx,msfvy,msftx,msfty
REAL,DIMENSION(ims:ime,jms:jme) :: f,e,sina,cosa
REAL,DIMENSION(ims:ime,jms:jme) :: muu,a_muu,muv,a_muv
REAL,DIMENSION(kms:kme) :: fzm,fzp
REAL,DIMENSION(kms:kme) :: u_base,v_base,z_base
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru,a_ru,rv,a_rv
REAL :: z_at_u,a_z_at_u,z_at_v,a_z_at_v,wkp1,a_wkp1,wk,a_wk,wkm1,a_wkm1
INTEGER :: i,j,k,ktf
INTEGER :: i_start,i_end,j_start,j_end
LOGICAL :: specified
!REVISED BY WALLS
! REAL,DIMENSION(jts:Tmpv001) :: Keep_Lpb11_wkp1
REAL,DIMENSION(jts:jme) :: Keep_Lpb11_wkp1
REAL,DIMENSION(jts:jme) :: Keep_Lpb11_wk
REAL,DIMENSION(jts:jme) :: Keep_Lpb11_wkm1
REAL,DIMENSION(max(jds+1,jts)-1:min(jde-1,jte)) :: Keep_Lpb17_wkp1
REAL,DIMENSION(max(jds+1,jts)-1:min(jde-1,jte)) :: Keep_Lpb17_wkm1
REAL,DIMENSION(max(jds+1,jts)-1:min(jde-1,jte)) :: Keep_Lpb17_wk
! REAL,DIMENSION(max(jds+1,jts)-1:min(jde-1,jte)) :: Keep_Lpb18_wkp1
! REAL,DIMENSION(max(jds+1,jts)-1:min(jde-1,jte)) :: Keep_Lpb18_wk
! REAL,DIMENSION(max(jds+1,jts)-1:min(jde-1,jte)) :: Keep_Lpb18_wkm1
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9, &
Tmpv009,a_Tmpv10,Tmpv010,a_Tmpv11,Tmpv011,a_Tmpv12,Tmpv012,a_Tmpv13,Tmpv013, &
a_Tmpv14,Tmpv014,a_Tmpv15,Tmpv015
!REVISED BY WALLS
! REAL,DIMENSION(min0(its-1,its):ite) :: Tmpv200
REAL,DIMENSION(min0(its-1,its):ite) :: Tmpv200
REAL,DIMENSION(min0(its-1,its):ite) :: Tmpv201
REAL,DIMENSION(min0(its-1,its):ite,kts+1:min(kte,kde-1)-1) :: Tmpv300
! Added by Ning Pan, 2010-07-22
REAL,DIMENSION(its-1:ite,kts:min(kte,kde-1),jts:min(jte,jde-1)+1) :: Tmpv400
REAL,DIMENSION(its-1:ite,kts:min(kte,kde-1),jts:min(jte,jde-1)+1) :: Tmpv401
REAL,DIMENSION(its:min(ite,ide-1)+1,kts:min(kte,kde-1),jts-1:jte) :: Tmpv500
REAL,DIMENSION(its:min(ite,ide-1)+1,kts:min(kte,kde-1),jts-1:jte) :: Tmpv501
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
specified = .false.
!LPB[1]
if(config_flags%specified .or. config_flags%nested) specified = .true.
!LPB[2]
ktf=MIN(kte,kde-1)
i_start = its
i_end = ite
!LPB[3]
IF ( config_flags%open_xs .or. specified .or. &
config_flags%nested) i_start = MAX(ids+1,its)
!LPB[4]
!LPB[5]
IF ( config_flags%open_xe .or. specified .or. &
config_flags%nested) i_end = MIN(ide-1,ite)
!LPB[6]
!LPB[7]
IF ( config_flags%periodic_x ) i_start = its
!LPB[8]
!LPB[9]
IF ( config_flags%periodic_x ) i_end = ite
!LPB[10]
DO j = jts, MIN(jte,jde-1)+1
DO k=kts+1,ktf-1
DO i = i_start-1, i_end
z_at_v = 0.25*( phb(i,k,j )+phb(i,k+1,j ) &
+phb(i,k,j-1)+phb(i,k+1,j-1) &
+ph(i,k,j )+ph(i,k+1,j ) &
+ph(i,k,j-1)+ph(i,k+1,j-1))/g
wkp1 = min(1.,max(0.,z_at_v-z_base(k))/(z_base(k+1)-z_base(k)))
wkm1 = min(1.,max(0.,z_base(k)-z_at_v)/(z_base(k)-z_base(k-1)))
wk = 1.-wkp1-wkm1
! Revised by Ning Pan, 2010-07-22
! rv(i,k,j) = rv_in(i,k,j) - muv(i,j)*( &
! wkm1*v_base(k-1) &
! +wk *v_base(k ) &
! +wkp1*v_base(k+1) )
Tmpv001 =wkm1*v_base(k-1) +wk*v_base(k)
Tmpv002 =Tmpv001 +wkp1*v_base(k+1)
Tmpv400(i,k,j) =Tmpv002
Tmpv003 =muv(i,j)*Tmpv400(i,k,j)
Tmpv004 =rv_in(i,k,j) -Tmpv003
rv(i,k,j) =Tmpv004
Tmpv401(i,k,j) =z_at_v
ENDDO
ENDDO
ENDDO
!LPB[11]
DO j = jts, MIN(jte,jde-1)+1
! Remarked by Ning Pan, 2010-07-22
! Keep_Lpb11_wkp1(j) =wkp1
! Keep_Lpb11_wk(j) =wk
! Keep_Lpb11_wkm1(j) =wkm1
DO i = i_start-1, i_end
k = kts
z_at_v = 0.25*( phb(i,k,j )+phb(i,k+1,j ) &
+phb(i,k,j-1)+phb(i,k+1,j-1) &
+ph(i,k,j )+ph(i,k+1,j ) &
+ph(i,k,j-1)+ph(i,k+1,j-1))/g
wkp1 = min(1.,max(0.,z_at_v-z_base(k))/(z_base(k+1)-z_base(k)))
wk = 1.-wkp1
! Revised by Ning Pan, 2010-07-22
! rv(i,k,j) = rv_in(i,k,j) - muv(i,j)*( &
! +wk *v_base(k ) &
! +wkp1*v_base(k+1) )
Tmpv001 =+wk*v_base(k) +wkp1*v_base(k+1)
Tmpv400(i,k,j) =Tmpv001
Tmpv002 =muv(i,j)*Tmpv400(i,k,j)
Tmpv003 =rv_in(i,k,j) -Tmpv002
rv(i,k,j) =Tmpv003
Tmpv401(i,k,j) =z_at_v
k = ktf
z_at_v = 0.25*( phb(i,k,j )+phb(i,k+1,j ) &
+phb(i,k,j-1)+phb(i,k+1,j-1) &
+ph(i,k,j )+ph(i,k+1,j ) &
+ph(i,k,j-1)+ph(i,k+1,j-1))/g
wkm1 = min(1.,max(0.,z_base(k)-z_at_v)/(z_base(k)-z_base(k-1)))
wk = 1.-wkm1
! Revised by Ning Pan, 2010-07-22
! rv(i,k,j) = rv_in(i,k,j) - muv(i,j)*( &
! wkm1*v_base(k-1) &
! +wk *v_base(k ) )
Tmpv001 =wkm1*v_base(k-1) +wk*v_base(k)
Tmpv400(i,k,j) =Tmpv001
Tmpv002 =muv(i,j)*Tmpv400(i,k,j)
Tmpv003 =rv_in(i,k,j) -Tmpv002
rv(i,k,j) =Tmpv003
Tmpv401(i,k,j) =z_at_v
ENDDO
ENDDO
! Remarked by Ning Pan, 2010-07-22: LPB[12] is useless
!LPB[12]
! DO j = jts, MIN(jte,jde-1)
! DO k=kts,ktf
! DO i = i_start, i_end
! ru_tend(i,k,j)=ru_tend(i,k,j) + (msfux(i,j)/msfuy(i,j))*0.5*(f(i,j)+f(i-1,j)) &
!REVISED! BY WALLS
!! &
! *0.25*(rv(i-1,k,j+1)+rv(i,k,j+1)+rv(i-1,k,j)+rv(i,k,j)) &
! - 0.5*(e(i,j)+e(i-1,j))*0.5*(cosa(i,j)+cosa(i-1,j)) &
! *0.25*(rw(i-1,k+1,j)+rw(i-1,k,j)+rw(i,k+1,j)+rw(i,k,j))
! ENDDO
! ENDDO
! IF ( (config_flags%open_xs) .and. (its == ids) ) THEN
! DO k=kts,ktf
! ru_tend(its,k,j)=ru_tend(its,k,j) + (msfux(its,j)/msfuy(its,j))*0.5*(f(its,j) &
! +f(its,j)) &
! *0.25*(rv(its,k,j+1)+rv(its,k,j+1)+rv(its,k,j)+rv(its,k,j)) &
! - 0.5*(e(its,j)+e(its,j))*0.5*(cosa(its,j)+cosa(its,j)) &
! *0.25*(rw(its,k+1,j)+rw(its,k,j)+rw(its,k+1,j)+rw(its,k,j))
! ENDDO
! ENDIF
! IF ( (config_flags%open_xe) .and. (ite == ide) ) THEN
! DO k=kts,ktf
! ru_tend(ite,k,j)=ru_tend(ite,k,j) + (msfux(ite,j)/msfuy(ite,j))*0.5*(f(ite-1, &
! j)+f(ite-1,j)) &
! *0.25*(rv(ite-1,k,j+1)+rv(ite-1,k,j+1)+rv(ite-1,k,j)+rv(ite-1,k,j)) &
! - 0.5*(e(ite-1,j)+e(ite-1,j))*0.5*(cosa(ite-1,j)+cosa(ite-1,j)) &
! *0.25*(rw(ite-1,k+1,j)+rw(ite-1,k,j)+rw(ite-1,k+1,j)+rw(ite-1,k,j))
! ENDDO
! ENDIF
! ENDDO
!LPB[13]
j_start = jts
j_end = jte
!LPB[14]
IF ( config_flags%open_ys .or. specified .or. &
config_flags%nested .or. config_flags%polar) j_start = MAX(jds+1,jts)
!LPB[15]
!LPB[16]
IF ( config_flags%open_ye .or. specified .or. &
config_flags%nested .or. config_flags%polar) j_end = MIN(jde-1,jte)
!LPB[17]
DO j = j_start-1,j_end
! Remarked by Ning Pan, 2010-07-22
! Keep_Lpb17_wkp1(j) =wkp1
! Keep_Lpb17_wkm1(j) =wkm1
! Keep_Lpb17_wk(j) =wk
DO k=kts+1,ktf-1
DO i = its, MIN(ite,ide-1)+1
z_at_u = 0.25*( phb(i ,k,j)+phb(i ,k+1,j) &
+phb(i-1,k,j)+phb(i-1,k+1,j) &
+ph(i ,k,j)+ph(i ,k+1,j) &
+ph(i-1,k,j)+ph(i-1,k+1,j))/g
wkp1 = min(1.,max(0.,z_at_u-z_base(k))/(z_base(k+1)-z_base(k)))
wkm1 = min(1.,max(0.,z_base(k)-z_at_u)/(z_base(k)-z_base(k-1)))
wk = 1.-wkp1-wkm1
! Revised by Ning Pan, 2010-07-22
! ru(i,k,j) = ru_in(i,k,j) - muu(i,j)*( &
! wkm1*u_base(k-1) &
! +wk *u_base(k ) &
! +wkp1*u_base(k+1) )
Tmpv001 =wkm1*u_base(k-1) +wk*u_base(k)
Tmpv002 =Tmpv001 +wkp1*u_base(k+1)
Tmpv500(i,k,j) =Tmpv002
Tmpv003 =muu(i,j)*Tmpv500(i,k,j)
Tmpv004 =ru_in(i,k,j) -Tmpv003
ru(i,k,j) =Tmpv004
Tmpv501(i,k,j) =z_at_u
ENDDO
ENDDO
ENDDO
!!LPB[18]
DO j = j_start-1,j_end
! Keep_Lpb18_wkp1(j) =wkp1
! Keep_Lpb18_wk(j) =wk
! Keep_Lpb18_wkm1(j) =wkm1
DO i = its, MIN(ite,ide-1)+1
k = kts
z_at_u = 0.25*( phb(i ,k,j)+phb(i ,k+1,j) &
+phb(i-1,k,j)+phb(i-1,k+1,j) &
+ph(i ,k,j)+ph(i ,k+1,j) &
+ph(i-1,k,j)+ph(i-1,k+1,j))/g
wkp1 = min(1.,max(0.,z_at_u-z_base(k))/(z_base(k+1)-z_base(k)))
wk = 1.-wkp1
! Revised by Ning Pan, 2010-07-22
! ru(i,k,j) = ru_in(i,k,j) - muu(i,j)*( &
! +wk *u_base(k ) &
! +wkp1*u_base(k+1) )
Tmpv001 =+wk*u_base(k) +wkp1*u_base(k+1)
Tmpv500(i,k,j) =Tmpv001
Tmpv002 =muu(i,j)*Tmpv500(i,k,j)
Tmpv003 =ru_in(i,k,j) -Tmpv002
ru(i,k,j) =Tmpv003
Tmpv501(i,k,j) =z_at_u
k = ktf
z_at_u = 0.25*( phb(i ,k,j)+phb(i ,k+1,j) &
+phb(i-1,k,j)+phb(i-1,k+1,j) &
+ph(i ,k,j)+ph(i ,k+1,j) &
+ph(i-1,k,j)+ph(i-1,k+1,j))/g
wkm1 = min(1.,max(0.,z_base(k)-z_at_u)/(z_base(k)-z_base(k-1)))
wk = 1.-wkm1
! Revised by Ning Pan, 2010-07-22
! ru(i,k,j) = ru_in(i,k,j) - muu(i,j)*( &
! wkm1*u_base(k-1) &
! +wk *u_base(k ) )
Tmpv001 =wkm1*u_base(k-1) +wk*u_base(k)
Tmpv500(i,k,j) =Tmpv001
Tmpv002 =muu(i,j)*Tmpv500(i,k,j)
Tmpv003 =ru_in(i,k,j) -Tmpv002
ru(i,k,j) =Tmpv003
Tmpv501(i,k,j) =z_at_u
ENDDO
ENDDO
!!LPB[19]
! Remarked by Ning Pan, 2010-07-22: LPB[20]-[24] are useless
!!LPB[20]
! IF ( (config_flags%open_ys) .and. (jts == jds) ) THEN
! DO k=kts,ktf
! DO i=its,MIN(ide-1,ite)
! rv_tend(i,k,jts)=rv_tend(i,k,jts) - (msfvy(i,jts)/msfvx(i,jts))*0.5*(f(i,jts) &
! +f(i,jts)) &
! *0.25*(ru(i,k,jts)+ru(i+1,k,jts)+ru(i,k,jts)+ru(i+1,k,jts)) &
! + (msfvy(i,jts)/msfvx(i,jts))*0.5*(e(i,jts)+e(i,jts))*0.5*(sina(i,jts) &
! +sina(i,jts)) &
! *0.25*(rw(i,k+1,jts)+rw(i,k,jts)+rw(i,k+1,jts)+rw(i,k,jts))
! ENDDO
! ENDDO
! ENDIF
!!LPB[21]
! DO j=j_start, j_end
!
! DO k=kts,ktf
! DO i=its,MIN(ide-1,ite)
! rv_tend(i,k,j)=rv_tend(i,k,j) - (msfvy(i,j)/msfvx(i,j))*0.5*(f(i,j)+f(i,j-1)) &
! &
! *0.25*(ru(i,k,j)+ru(i+1,k,j)+ru(i,k,j-1)+ru(i+1,k,j-1)) &
! + (msfvy(i,j)/msfvx(i,j))*0.5*(e(i,j)+e(i,j-1))*0.5*(sina(i,j) &
! +sina(i,j-1)) &
! *0.25*(rw(i,k+1,j-1)+rw(i,k,j-1)+rw(i,k+1,j)+rw(i,k,j))
! ENDDO
! ENDDO
! ENDDO
!!LPB[22]
!!LPB[23]
! IF ( (config_flags%open_ye) .and. (jte == jde) ) THEN
! DO k=kts,ktf
! DO i=its,MIN(ide-1,ite)
! rv_tend(i,k,jte)=rv_tend(i,k,jte) - (msfvy(i,jte)/msfvx(i,jte)) &
! *0.5*(f(i,jte-1)+f(i,jte-1)) &
! *0.25*(ru(i,k,jte-1)+ru(i+1,k,jte-1)+ru(i,k,jte-1)+ru(i+1,k,jte-1)) &
! + (msfvy(i,jte)/msfvx(i,jte))*0.5*(e(i,jte-1)+e(i,jte-1))*0.5*(sina(i, &
! jte-1)+sina(i,jte-1)) &
! *0.25*(rw(i,k+1,jte-1)+rw(i,k,jte-1)+rw(i,k+1,jte-1)+rw(i,k,jte-1))
! ENDDO
! ENDDO
! ENDIF
!!LPB[24]
! DO j=jts,MIN(jte, jde-1)
!
! DO k=kts+1,ktf
! DO i=its,MIN(ite, ide-1)
! rw_tend(i,k,j)=rw_tend(i,k,j) + e(i,j)* &
! (cosa(i,j)*0.5*(fzm(k)*(ru(i,k,j)+ru(i+1,k,j)) &
! +fzp(k)*(ru(i,k-1,j)+ru(i+1,k-1,j))) &
! -(msftx(i,j)/msfty(i,j))*sina(i,j)*0.5*(fzm(k)*(rv(i,k,j)+rv(i,k,j+1)) &
! +fzp(k)*(rv(i,k-1,j)+rv(i,k-1,j+1))))
! ENDDO
! ENDDO
! ENDDO
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
Do K2_ADJ =jms, jme
Do K1_ADJ =kms, kme
Do K0_ADJ =ims, ime
a_ru(K0_ADJ,K1_ADJ,K2_ADJ) =0.0
End Do
End Do
End Do
Do K2_ADJ =jms, jme
Do K1_ADJ =kms, kme
Do K0_ADJ =ims, ime
a_rv(K0_ADJ,K1_ADJ,K2_ADJ) =0.0
End Do
End Do
End Do
a_z_at_u =0.0
a_z_at_v =0.0
a_wkp1 =0.0
a_wk =0.0
a_wkm1 =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[24]
! coriolis term for w-momentum equation
DO j =min(jte, jde-1), jts, -1
! DO k =kts+1, ktf
! DO i =its, min(ite, ide-1)
! Tmpv001 =ru(i,k,j) +ru(i+1,k,j)
! Tmpv002 =fzm(k)*Tmpv001
! Tmpv003 =ru(i,k-1,j) +ru(i+1,k-1,j)
! Tmpv004 =fzp(k)*Tmpv003
! Tmpv005 =Tmpv002 +Tmpv004
! Tmpv006 =cosa(i,j)*0.5*Tmpv005
! Tmpv007 =rv(i,k,j) +rv(i,k,j+1)
! Tmpv008 =fzm(k)*Tmpv007
! Tmpv009 =rv(i,k-1,j) +rv(i,k-1,j+1)
! Tmpv010 =fzp(k)*Tmpv009
! Tmpv011 =Tmpv008 +Tmpv010
! Tmpv012 =(msftx(i,j)/msfty(i,j))*sina(i,j)*0.5*Tmpv011
! Tmpv013 =Tmpv006 -Tmpv012
! Tmpv014 =e(i,j)*Tmpv013
! Tmpv015 =rw_tend(i,k,j) +Tmpv014
! rw_tend(i,k,j) =Tmpv015
! ENDDO
! ENDDO
DO k =ktf, kts+1, -1
DO i =min(ite, ide-1), its, -1
a_Tmpv15 =a_rw_tend(i,k,j)
a_rw_tend(i,k,j) =0.0
a_rw_tend(i,k,j) =a_rw_tend(i,k,j) +a_Tmpv15
a_Tmpv14 =a_Tmpv15
a_Tmpv13 =e(i,j)*a_Tmpv14
a_Tmpv6 =a_Tmpv13
a_Tmpv12 =-a_Tmpv13
a_Tmpv11 =(msftx(i,j)/msfty(i,j))*sina(i,j)*0.5*a_Tmpv12
a_Tmpv8 =a_Tmpv11
a_Tmpv10 =a_Tmpv11
a_Tmpv9 =fzp(k)*a_Tmpv10
a_rv(i,k-1,j) =a_rv(i,k-1,j) +a_Tmpv9
a_rv(i,k-1,j+1) =a_rv(i,k-1,j+1) +a_Tmpv9
a_Tmpv7 =fzm(k)*a_Tmpv8
a_rv(i,k,j) =a_rv(i,k,j) +a_Tmpv7
a_rv(i,k,j+1) =a_rv(i,k,j+1) +a_Tmpv7
a_Tmpv5 =cosa(i,j)*0.5*a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =fzp(k)*a_Tmpv4
a_ru(i,k-1,j) =a_ru(i,k-1,j) +a_Tmpv3
a_ru(i+1,k-1,j) =a_ru(i+1,k-1,j) +a_Tmpv3
a_Tmpv1 =fzm(k)*a_Tmpv2
a_ru(i,k,j) =a_ru(i,k,j) +a_Tmpv1
a_ru(i+1,k,j) =a_ru(i+1,k,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[23]
! IF( (config_flags%open_ye) .and. (jte == jde) ) THEN
! DO k =kts, ktf
! DO i =its, min(ide-1, ite)
! Tmpv001 =ru(i,k,jte-1) +ru(i+1,k,jte-1)
! Tmpv002 =Tmpv001 +ru(i,k,jte-1)
! Tmpv003 =Tmpv002 +ru(i+1,k,jte-1)
! Tmpv004 =(msfvy(i,jte)/msfvx(i,jte))*0.5*(f(i,jte-1)+f(i,jte-1))*0.25*Tmpv003
! Tmpv005 =rv_tend(i,k,jte) -Tmpv004
! Tmpv006 =rw(i,k+1,jte-1) +rw(i,k,jte-1)
! Tmpv007 =Tmpv006 +rw(i,k+1,jte-1)
! Tmpv008 =Tmpv007 +rw(i,k,jte-1)
! Tmpv009 =(msfvy(i,jte)/msfvx(i,jte))*0.5*(e(i,jte-1)+e(i,jte-1))*0.5*(sina(i,jte-1)+sina(i,jte-1))*0.25*Tmpv008
! Tmpv010 =Tmpv005 +Tmpv009
! rv_tend(i,k,jte) =Tmpv010
! ENDDO
! ENDDO
! ENDIF
! Added by Ning Pan, 2010-07-22
! coriolis term for v-momentum equation
j_start = jts
j_end = jte
IF ( config_flags%open_ys .or. specified .or. &
config_flags%nested .or. config_flags%polar) j_start = MAX(jds+1,jts)
IF ( config_flags%open_ye .or. specified .or. &
config_flags%nested .or. config_flags%polar) j_end = MIN(jde-1,jte)
! boundary loops for coriolis not needed for open bdy (commented out 20100611 XZ)
! IF( (config_flags%open_ye) .and. (jte == jde) ) THEN
! DO k =ktf, kts, -1
! DO i =min(ide-1, ite), its, -1
! a_Tmpv10 =a_rv_tend(i,k,jte)
! a_rv_tend(i,k,jte) =0.0
! a_Tmpv5 =a_Tmpv10
! a_Tmpv9 =a_Tmpv10
! a_Tmpv8 =(msfvy(i,jte)/msfvx(i,jte))*0.5*(e(i,jte-1)+e(i,jte-1))*0.5*(sina(i, &
! jte-1)+sina(i,jte-1))*0.25*a_Tmpv9
! a_Tmpv7 =a_Tmpv8
! a_rw(i,k,jte-1) =a_rw(i,k,jte-1) +a_Tmpv8
! a_Tmpv6 =a_Tmpv7
! a_rw(i,k+1,jte-1) =a_rw(i,k+1,jte-1) +a_Tmpv7
! a_rw(i,k+1,jte-1) =a_rw(i,k+1,jte-1) +a_Tmpv6
! a_rw(i,k,jte-1) =a_rw(i,k,jte-1) +a_Tmpv6
! a_rv_tend(i,k,jte) =a_rv_tend(i,k,jte) +a_Tmpv5
! a_Tmpv4 =-a_Tmpv5
! a_Tmpv3 =(msfvy(i,jte)/msfvx(i,jte))*0.5*(f(i,jte-1)+f(i,jte-1))*0.25*a_Tmpv4
! a_Tmpv2 =a_Tmpv3
! a_ru(i+1,k,jte-1) =a_ru(i+1,k,jte-1) +a_Tmpv3
! a_Tmpv1 =a_Tmpv2
! a_ru(i,k,jte-1) =a_ru(i,k,jte-1) +a_Tmpv2
! a_ru(i,k,jte-1) =a_ru(i,k,jte-1) +a_Tmpv1
! a_ru(i+1,k,jte-1) =a_ru(i+1,k,jte-1) +a_Tmpv1
! ENDDO
! ENDDO
! ENDIF
!LPB[22]
!LPB[21]
DO j =j_end, j_start, -1
! DO k =kts, ktf
! DO i =its, min(ide-1, ite)
! Tmpv001 =ru(i,k,j) +ru(i+1,k,j)
! Tmpv002 =Tmpv001 +ru(i,k,j-1)
! Tmpv003 =Tmpv002 +ru(i+1,k,j-1)
! Tmpv004 =(msfvy(i,j)/msfvx(i,j))*0.5*(f(i,j)+f(i,j-1))*0.25*Tmpv003
! Tmpv005 =rv_tend(i,k,j) -Tmpv004
! Tmpv006 =rw(i,k+1,j-1) +rw(i,k,j-1)
! Tmpv007 =Tmpv006 +rw(i,k+1,j)
! Tmpv008 =Tmpv007 +rw(i,k,j)
! Tmpv009 =(msfvy(i,j)/msfvx(i,j))*0.5*(e(i,j)+e(i,j-1))*0.5*(sina(i,j)+sina(i,j-1))*0.25*Tmpv008
! Tmpv010 =Tmpv005 +Tmpv009
! rv_tend(i,k,j) =Tmpv010
! ENDDO
! ENDDO
DO k =ktf, kts, -1
DO i =min(ide-1, ite), its, -1
a_Tmpv10 =a_rv_tend(i,k,j)
a_rv_tend(i,k,j) =0.0
a_Tmpv5 =a_Tmpv10
a_Tmpv9 =a_Tmpv10
a_Tmpv8 =(msfvy(i,j)/msfvx(i,j))*0.5*(e(i,j)+e(i,j-1))*0.5*(sina(i,j) &
+sina(i,j-1))*0.25*a_Tmpv9
a_Tmpv7 =a_Tmpv8
a_rw(i,k,j) =a_rw(i,k,j) +a_Tmpv8
a_Tmpv6 =a_Tmpv7
a_rw(i,k+1,j) =a_rw(i,k+1,j) +a_Tmpv7
a_rw(i,k+1,j-1) =a_rw(i,k+1,j-1) +a_Tmpv6
a_rw(i,k,j-1) =a_rw(i,k,j-1) +a_Tmpv6
a_rv_tend(i,k,j) =a_rv_tend(i,k,j) +a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv3 =(msfvy(i,j)/msfvx(i,j))*0.5*(f(i,j)+f(i,j-1))*0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ru(i+1,k,j-1) =a_ru(i+1,k,j-1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ru(i,k,j-1) =a_ru(i,k,j-1) +a_Tmpv2
a_ru(i,k,j) =a_ru(i,k,j) +a_Tmpv1
a_ru(i+1,k,j) =a_ru(i+1,k,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[20]
! IF( (config_flags%open_ys) .and. (jts == jds) ) THEN
! DO k =kts, ktf
! DO i =its, min(ide-1, ite)
! Tmpv001 =ru(i,k,jts) +ru(i+1,k,jts)
! Tmpv002 =Tmpv001 +ru(i,k,jts)
! Tmpv003 =Tmpv002 +ru(i+1,k,jts)
! Tmpv004 =(msfvy(i,jts)/msfvx(i,jts))*0.5*(f(i,jts)+f(i,jts))*0.25*Tmpv003
! Tmpv005 =rv_tend(i,k,jts) -Tmpv004
! Tmpv006 =rw(i,k+1,jts) +rw(i,k,jts)
! Tmpv007 =Tmpv006 +rw(i,k+1,jts)
! Tmpv008 =Tmpv007 +rw(i,k,jts)
! Tmpv009 =(msfvy(i,jts)/msfvx(i,jts))*0.5*(e(i,jts)+e(i,jts))*0.5*(sina(i,jts)+sina(i,jts))*0.25*Tmpv008
! Tmpv010 =Tmpv005 +Tmpv009
! rv_tend(i,k,jts) =Tmpv010
! ENDDO
! ENDDO
! ENDIF
! boundary loops for coriolis not needed for open bdy (commented out 20100611 XZ)
! IF( (config_flags%open_ys) .and. (jts == jds) ) THEN
! DO k =ktf, kts, -1
! DO i =min(ide-1, ite), its, -1
! a_Tmpv10 =a_rv_tend(i,k,jts)
! a_rv_tend(i,k,jts) =0.0
! a_Tmpv5 =a_Tmpv10
! a_Tmpv9 =a_Tmpv10
! a_Tmpv8 =(msfvy(i,jts)/msfvx(i,jts))*0.5*(e(i,jts)+e(i,jts))*0.5*(sina(i,jts) &
! +sina(i,jts))*0.25*a_Tmpv9
! a_Tmpv7 =a_Tmpv8
! a_rw(i,k,jts) =a_rw(i,k,jts) +a_Tmpv8
! a_Tmpv6 =a_Tmpv7
! a_rw(i,k+1,jts) =a_rw(i,k+1,jts) +a_Tmpv7
! a_rw(i,k+1,jts) =a_rw(i,k+1,jts) +a_Tmpv6
! a_rw(i,k,jts) =a_rw(i,k,jts) +a_Tmpv6
! a_rv_tend(i,k,jts) =a_rv_tend(i,k,jts) +a_Tmpv5
! a_Tmpv4 =-a_Tmpv5
! a_Tmpv3 =(msfvy(i,jts)/msfvx(i,jts))*0.5*(f(i,jts)+f(i,jts))*0.25*a_Tmpv4
! a_Tmpv2 =a_Tmpv3
! a_ru(i+1,k,jts) =a_ru(i+1,k,jts) +a_Tmpv3
! a_Tmpv1 =a_Tmpv2
! a_ru(i,k,jts) =a_ru(i,k,jts) +a_Tmpv2
! a_ru(i,k,jts) =a_ru(i,k,jts) +a_Tmpv1
! a_ru(i+1,k,jts) =a_ru(i+1,k,jts) +a_Tmpv1
! ENDDO
! ENDDO
!
! ENDIF
!LPB[19]
!LPB[18]
DO j =j_end, j_start-1, -1
! wkp1 =Keep_Lpb18_wkp1(j)
! wk =Keep_Lpb18_wk(j)
! wkm1 =Keep_Lpb18_wkm1(j)
! Remarked by Ning Pan, 2010-07-22: redundant recalculation
! DO i =its, Tmpv001
! k =kts
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j)+phb(i-1,k,j)+phb(i-1,k+1,j) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =Tmpv001 +ph(i-1,k,j)
! Tmpv003 =Tmpv002 +ph(i-1,k+1,j)
! Tmpv004 =0.25*Tmpv003
! Tmpv005 =Tmpv004/g
!! z_at_u =Tmpv005
! wkp1 =min(1., max(0., z_at_u -z_base(k))/(z_base(k+1)-z_base(k)))
! wk =1. -wkp1
! Tmpv001 =+wk*u_base(k) +wkp1*u_base(k+1)
! Tmpv200(i) =Tmpv001
! Tmpv002 =muu(i,j)*Tmpv200(i)
! Tmpv003 =ru_in(i,k,j) -Tmpv002
!! ru(i,k,j) =Tmpv003
! k =ktf
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j)+phb(i-1,k,j)+phb(i-1,k+1,j) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =Tmpv001 +ph(i-1,k,j)
! Tmpv003 =Tmpv002 +ph(i-1,k+1,j)
! Tmpv004 =0.25*Tmpv003
! Tmpv005 =Tmpv004/g
!! z_at_u =Tmpv005
! wkm1 =min(1., max(0., z_base(k) -z_at_u)/(z_base(k)-z_base(k-1)))
! wk =1. -wkm1
! Tmpv001 =wkm1*u_base(k-1) +wk*u_base(k)
! Tmpv201(i) =Tmpv001
! Tmpv002 =muu(i,j)*Tmpv201(i)
! Tmpv003 =ru_in(i,k,j) -Tmpv002
!! ru(i,k,j) =Tmpv003
! ENDDO
! Revised by Ning Pan, 2010-07-22
! DO i =Tmpv001, its, -1
DO i =MIN(ite,ide-1)+1, its, -1
!STOP ! Remarked by Ning Pan, 2010-07-22
!REVISED BY WALLS
! 0.0 =a_Tmpv1
! Added by Ning Pan, 2010-07-22
k = ktf
z_at_u = Tmpv501(i,k,j)
a_Tmpv3 =a_ru(i,k,j)
a_ru(i,k,j) =0.0
a_ru_in(i,k,j) =a_ru_in(i,k,j) +a_Tmpv3
a_Tmpv2 =-a_Tmpv3
! Revised by Ning Pan, 2010-07-22
! a_muu(i,j) =a_muu(i,j) +Tmpv201(i)*a_Tmpv2
a_muu(i,j) =a_muu(i,j) +Tmpv500(i,k,j)*a_Tmpv2
a_Tmpv1 =muu(i,j)*a_Tmpv2
a_wkm1 =a_wkm1 +u_base(k-1)*a_Tmpv1
a_wk =a_wk +u_base(k)*a_Tmpv1
a_wkm1 =a_wkm1 -a_wk
a_wk =0.0
a_z_at_u =a_z_at_u +((-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_u)) &
*0.5/(z_base(k)-z_base(k-1)) -(-(-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_u)) &
*0.5/(z_base(k)-z_base(k-1)))*sign(1.0, 1. -max(0., z_base(k) -z_at_u)/(z_base(k) &
-z_base(k-1))))*0.5*a_wkm1
a_wkm1 =0.0
a_Tmpv5 =a_z_at_u
a_z_at_u =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i-1,k+1,j) =a_ph(i-1,k+1,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i-1,k,j) =a_ph(i-1,k,j) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
! Added by Ning Pan, 2010-07-22
k = kts
z_at_u = Tmpv501(i,k,j)
a_Tmpv3 =a_ru(i,k,j)
a_ru(i,k,j) =0.0
a_ru_in(i,k,j) =a_ru_in(i,k,j) +a_Tmpv3
a_Tmpv2 =-a_Tmpv3
! Revised by Ning Pan, 2010-07-22
! a_muu(i,j) =a_muu(i,j) +Tmpv200(i)*a_Tmpv2
a_muu(i,j) =a_muu(i,j) +Tmpv500(i,k,j)*a_Tmpv2
a_Tmpv1 =muu(i,j)*a_Tmpv2
a_wk =a_wk +u_base(k)*a_Tmpv1
a_wkp1 =a_wkp1 +u_base(k+1)*a_Tmpv1
a_wkp1 =a_wkp1 -a_wk
a_wk =0.0
a_z_at_u =a_z_at_u +((1.0 +(-1.0)*sign(1.0, 0. -z_at_u -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)) -(-(1.0 +(-1.0)*sign(1.0, 0. -z_at_u -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)))*sign(1.0, 1. -max(0., z_at_u -z_base(k))/(z_base(k+1) &
-z_base(k))))*0.5*a_wkp1
a_wkp1 =0.0
a_Tmpv5 =a_z_at_u
a_z_at_u =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i-1,k+1,j) =a_ph(i-1,k+1,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i-1,k,j) =a_ph(i-1,k,j) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
!LPB[17]
DO j =j_end, j_start-1, -1
! Remarked by Ning Pan, 2010-07-22: redundant recalculation
! wkp1 =Keep_Lpb17_wkp1(j)
! wkm1 =Keep_Lpb17_wkm1(j)
! wk =Keep_Lpb17_wk(j)
! DO k =kts+1, ktf-1
! DO i =its, Tmpv001
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j)+phb(i-1,k,j)+phb(i-1,k+1,j) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =Tmpv001 +ph(i-1,k,j)
! Tmpv003 =Tmpv002 +ph(i-1,k+1,j)
! Tmpv004 =0.25*Tmpv003
! Tmpv005 =Tmpv004/g
!! z_at_u =Tmpv005
! wkp1 =min(1., max(0., z_at_u -z_base(k))/(z_base(k+1)-z_base(k)))
! wkm1 =min(1., max(0., z_base(k) -z_at_u)/(z_base(k)-z_base(k-1)))
! Tmpv001 =1. -wkp1 -wkm1
! wk =Tmpv001
! Tmpv001 =wkm1*u_base(k-1) +wk*u_base(k)
! Tmpv002 =Tmpv001 +wkp1*u_base(k+1)
! Tmpv300(i,k) =Tmpv002
! Tmpv003 =muu(i,j)*Tmpv300(i,k)
! Tmpv004 =ru_in(i,k,j) -Tmpv003
!! ru(i,k,j) =Tmpv004
! ENDDO
! ENDDO
DO k =ktf-1, kts+1, -1
! Revised by Ning Pan, 2010-07-22
! DO i =Tmpv001, its, -1
DO i =MIN(ite,ide-1)+1, its, -1
!STOP ! Remarked by Ning Pan, 2010-07-22
!REVISED BY WALLS
! 0.0 =a_Tmpv1
z_at_u = Tmpv501(i,k,j) ! Added by Ning Pan, 2010-07-22
a_Tmpv4 =a_ru(i,k,j)
a_ru(i,k,j) =0.0
a_ru_in(i,k,j) =a_ru_in(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
! Revised by Ning Pan, 2010-07-22
! a_muu(i,j) =a_muu(i,j) +Tmpv300(i,k)*a_Tmpv3
a_muu(i,j) =a_muu(i,j) +Tmpv500(i,k,j)*a_Tmpv3
a_Tmpv2 =muu(i,j)*a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_wkp1 =a_wkp1 +u_base(k+1)*a_Tmpv2
a_wkm1 =a_wkm1 +u_base(k-1)*a_Tmpv1
a_wk =a_wk +u_base(k)*a_Tmpv1
a_Tmpv1 =a_wk
a_wk =0.0
a_wkp1 =a_wkp1 -a_Tmpv1
a_wkm1 =a_wkm1 -a_Tmpv1
!REVISED BY WALLS
! a_z_at_u =a_z_at_u +((-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_u)) &
a_z_at_u =a_z_at_u +((-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_u)) &
*0.5/(z_base(k)-z_base(k-1)) -(-(-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_u)) &
*0.5/(z_base(k)-z_base(k-1)))*sign(1.0, 1. -max(0., z_base(k) -z_at_u)/(z_base(k) &
-z_base(k-1))))*0.5*a_wkm1
a_wkm1 =0.0
a_z_at_u =a_z_at_u +((1.0 +(-1.0)*sign(1.0, 0. -z_at_u -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)) -(-(1.0 +(-1.0)*sign(1.0, 0. -z_at_u -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)))*sign(1.0, 1. -max(0., z_at_u -z_base(k))/(z_base(k+1) &
-z_base(k))))*0.5*a_wkp1
a_wkp1 =0.0
a_Tmpv5 =a_z_at_u
a_z_at_u =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i-1,k+1,j) =a_ph(i-1,k+1,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i-1,k,j) =a_ph(i-1,k,j) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[16]
! IF( config_flags%open_ye .or. specified .or. config_flags%nested .or. config_flags%polar) THEN
! j_end =min(jde-1, jte)
! END IF
! IF( config_flags%open_ye .or. specified .or. &
! config_flags%nested .or. config_flags%polar) THEN
! END IF
!LPB[15]
!LPB[14]
! IF( config_flags%open_ys .or. specified .or. config_flags%nested .or. config_flags%polar) THEN
! j_start =max(jds+1, jts)
! END IF
! IF( config_flags%open_ys .or. specified .or. &
! config_flags%nested .or. config_flags%polar) THEN
! END IF
!LPB[13]
! j_start =jts
! j_end =jte
! Added by Ning Pan, 2010-07-22
! coriolis for u-momentum equation
i_start = its
i_end = ite
IF ( config_flags%open_xs .or. specified .or. &
config_flags%nested) i_start = MAX(ids+1,its)
IF ( config_flags%open_xe .or. specified .or. &
config_flags%nested) i_end = MIN(ide-1,ite)
IF ( config_flags%periodic_x ) i_start = its
IF ( config_flags%periodic_x ) i_end = ite
!!LPB[12]
DO j =min(jte, jde-1), jts, -1
! DO k =kts, ktf
! DO i =i_start, i_end
! Tmpv001 =rv(i-1,k,j+1) +rv(i,k,j+1)
! Tmpv002 =Tmpv001 +rv(i-1,k,j)
! Tmpv003 =Tmpv002 +rv(i,k,j)
! Tmpv004 =(msfux(i,j)/msfuy(i,j))*0.5*(f(i,j)+f(i-1,j))*0.25*Tmpv003
! Tmpv005 =ru_tend(i,k,j) +Tmpv004
! Tmpv006 =rw(i-1,k+1,j) +rw(i-1,k,j)
! Tmpv007 =Tmpv006 +rw(i,k+1,j)
! Tmpv008 =Tmpv007 +rw(i,k,j)
! Tmpv009 =0.5*(e(i,j)+e(i-1,j))*0.5*(cosa(i,j)+cosa(i-1,j))*0.25*Tmpv008
! Tmpv010 =Tmpv005 -Tmpv009
! ru_tend(i,k,j) =Tmpv010
! ENDDO
! ENDDO
! IF( (config_flags%open_xs) .and. (its == ids) ) THEN
! DO k =kts, ktf
! Tmpv001 =rv(its,k,j+1) +rv(its,k,j+1) +rv(its,k,j)
! Tmpv002 =Tmpv001 +rv(its,k,j)
! Tmpv003 =(msfux(its,j)/msfuy(its,j))*0.5*(f(its,j)+f(its,j))*0.25*Tmpv002
! Tmpv004 =ru_tend(its,k,j) +Tmpv003
! Tmpv005 =rw(its,k+1,j) +rw(its,k,j)
! Tmpv006 =Tmpv005 +rw(its,k+1,j)
! Tmpv007 =Tmpv006 +rw(its,k,j)
! Tmpv008 =0.5*(e(its,j)+e(its,j))*0.5*(cosa(its,j)+cosa(its,j))*0.25*Tmpv007
! Tmpv009 =Tmpv004 -Tmpv008
! ru_tend(its,k,j) =Tmpv009
! ENDDO
! ENDIF
! IF( (config_flags%open_xe) .and. (ite == ide) ) THEN
! DO k =kts, ktf
! Tmpv001 =rv(ite-1,k,j+1) +rv(ite-1,k,j+1) +rv(ite-1,k,j)
! Tmpv002 =Tmpv001 +rv(ite-1,k,j)
! Tmpv003 =(msfux(ite,j)/msfuy(ite,j))*0.5*(f(ite-1,j)+f(ite-1,j))*0.25*Tmpv002
! Tmpv004 =ru_tend(ite,k,j) +Tmpv003
! Tmpv005 =rw(ite-1,k+1,j) +rw(ite-1,k,j)
! Tmpv006 =Tmpv005 +rw(ite-1,k+1,j)
! Tmpv007 =Tmpv006 +rw(ite-1,k,j)
! Tmpv008 =0.5*(e(ite-1,j)+e(ite-1,j))*0.5*(cosa(ite-1,j)+cosa(ite-1,j))*0.25*Tmpv007
! Tmpv009 =Tmpv004 -Tmpv008
! ru_tend(ite,k,j) =Tmpv009
! ENDDO
! ENDIF
! boundary loops for coriolis not needed for open bdy (commented out 20100611 XZ)
! IF( (config_flags%open_xe) .and. (ite == ide) ) THEN
! DO k =ktf, kts, -1
! a_Tmpv9 =a_ru_tend(ite,k,j)
! a_ru_tend(ite,k,j) =0.0
! a_Tmpv4 =a_Tmpv9
! a_Tmpv8 =-a_Tmpv9
! a_Tmpv7 =0.5*(e(ite-1,j)+e(ite-1,j))*0.5*(cosa(ite-1,j)+cosa(ite-1,j))*0.25*a_Tmpv8
! a_Tmpv6 =a_Tmpv7
! a_rw(ite-1,k,j) =a_rw(ite-1,k,j) +a_Tmpv7
! a_Tmpv5 =a_Tmpv6
! a_rw(ite-1,k+1,j) =a_rw(ite-1,k+1,j) +a_Tmpv6
! a_rw(ite-1,k+1,j) =a_rw(ite-1,k+1,j) +a_Tmpv5
! a_rw(ite-1,k,j) =a_rw(ite-1,k,j) +a_Tmpv5
! a_ru_tend(ite,k,j) =a_ru_tend(ite,k,j) +a_Tmpv4
! a_Tmpv3 =a_Tmpv4
! a_Tmpv2 =(msfux(ite,j)/msfuy(ite,j))*0.5*(f(ite-1,j)+f(ite-1,j))*0.25*a_Tmpv3
! a_Tmpv1 =a_Tmpv2
! a_rv(ite-1,k,j) =a_rv(ite-1,k,j) +a_Tmpv2
! a_rv(ite-1,k,j+1) =a_rv(ite-1,k,j+1) +(1.0 +1.0)*a_Tmpv1
! a_rv(ite-1,k,j) =a_rv(ite-1,k,j) +a_Tmpv1
! ENDDO
! ENDIF
! IF( (config_flags%open_xs) .and. (its == ids) ) THEN
! DO k =ktf, kts, -1
! a_Tmpv9 =a_ru_tend(its,k,j)
! a_ru_tend(its,k,j) =0.0
! a_Tmpv4 =a_Tmpv9
! a_Tmpv8 =-a_Tmpv9
! a_Tmpv7 =0.5*(e(its,j)+e(its,j))*0.5*(cosa(its,j)+cosa(its,j))*0.25*a_Tmpv8
! a_Tmpv6 =a_Tmpv7
! a_rw(its,k,j) =a_rw(its,k,j) +a_Tmpv7
! a_Tmpv5 =a_Tmpv6
! a_rw(its,k+1,j) =a_rw(its,k+1,j) +a_Tmpv6
! a_rw(its,k+1,j) =a_rw(its,k+1,j) +a_Tmpv5
! a_rw(its,k,j) =a_rw(its,k,j) +a_Tmpv5
! a_ru_tend(its,k,j) =a_ru_tend(its,k,j) +a_Tmpv4
! a_Tmpv3 =a_Tmpv4
! a_Tmpv2 =(msfux(its,j)/msfuy(its,j))*0.5*(f(its,j)+f(its,j))*0.25*a_Tmpv3
! a_Tmpv1 =a_Tmpv2
! a_rv(its,k,j) =a_rv(its,k,j) +a_Tmpv2
! a_rv(its,k,j+1) =a_rv(its,k,j+1) +(1.0 +1.0)*a_Tmpv1
! a_rv(its,k,j) =a_rv(its,k,j) +a_Tmpv1
! ENDDO
! ENDIF
DO k =ktf, kts, -1
DO i =i_end, i_start, -1
a_Tmpv10 =a_ru_tend(i,k,j)
a_ru_tend(i,k,j) =0.0
a_Tmpv5 =a_Tmpv10
a_Tmpv9 =-a_Tmpv10
a_Tmpv8 =0.5*(e(i,j)+e(i-1,j))*0.5*(cosa(i,j)+cosa(i-1,j))*0.25*a_Tmpv9
a_Tmpv7 =a_Tmpv8
a_rw(i,k,j) =a_rw(i,k,j) +a_Tmpv8
a_Tmpv6 =a_Tmpv7
a_rw(i,k+1,j) =a_rw(i,k+1,j) +a_Tmpv7
a_rw(i-1,k+1,j) =a_rw(i-1,k+1,j) +a_Tmpv6
a_rw(i-1,k,j) =a_rw(i-1,k,j) +a_Tmpv6
a_ru_tend(i,k,j) =a_ru_tend(i,k,j) +a_Tmpv5
a_Tmpv4 =a_Tmpv5
a_Tmpv3 =(msfux(i,j)/msfuy(i,j))*0.5*(f(i,j)+f(i-1,j))*0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_rv(i,k,j) =a_rv(i,k,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_rv(i-1,k,j) =a_rv(i-1,k,j) +a_Tmpv2
a_rv(i-1,k,j+1) =a_rv(i-1,k,j+1) +a_Tmpv1
a_rv(i,k,j+1) =a_rv(i,k,j+1) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[11]
! Revised by Ning Pan, 2010-07-22
! DO j =Tmpv001, jts, -1
DO j =MIN(jte,jde-1)+1, jts, -1
! Remarked by Ning Pan, 2010-07-22: redundant recalculation
! wkp1 =Keep_Lpb11_wkp1(j)
! wk =Keep_Lpb11_wk(j)
! wkm1 =Keep_Lpb11_wkm1(j)
! DO i =i_start-1, i_end
! k =kts
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j)+phb(i,k,j-1)+phb(i,k+1,j-1) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =Tmpv001 +ph(i,k,j-1)
! Tmpv003 =Tmpv002 +ph(i,k+1,j-1)
! Tmpv004 =0.25*Tmpv003
! Tmpv005 =Tmpv004/g
!! z_at_v =Tmpv005
! wkp1 =min(1., max(0., z_at_v -z_base(k))/(z_base(k+1)-z_base(k)))
! wk =1. -wkp1
! Tmpv001 =+wk*v_base(k) +wkp1*v_base(k+1)
! Tmpv200(i) =Tmpv001
! Tmpv002 =muv(i,j)*Tmpv200(i)
! Tmpv003 =rv_in(i,k,j) -Tmpv002
!! rv(i,k,j) =Tmpv003
! k =ktf
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j)+phb(i,k,j-1)+phb(i,k+1,j-1) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =Tmpv001 +ph(i,k,j-1)
! Tmpv003 =Tmpv002 +ph(i,k+1,j-1)
! Tmpv004 =0.25*Tmpv003
! Tmpv005 =Tmpv004/g
!! z_at_v =Tmpv005
! wkm1 =min(1., max(0., z_base(k) -z_at_v)/(z_base(k)-z_base(k-1)))
! wk =1. -wkm1
! Tmpv001 =wkm1*v_base(k-1) +wk*v_base(k)
! Tmpv201(i) =Tmpv001
! Tmpv002 =muv(i,j)*Tmpv201(i)
! Tmpv003 =rv_in(i,k,j) -Tmpv002
!! rv(i,k,j) =Tmpv003
! ENDDO
DO i =i_end, i_start-1, -1
! Added by Ning Pan, 2010-07-22
k = ktf
z_at_v = Tmpv401(i,k,j)
a_Tmpv3 =a_rv(i,k,j)
a_rv(i,k,j) =0.0
a_rv_in(i,k,j) =a_rv_in(i,k,j) +a_Tmpv3
a_Tmpv2 =-a_Tmpv3
! Revised by Ning Pan, 2010-07-22
! a_muv(i,j) =a_muv(i,j) +Tmpv201(i)*a_Tmpv2
a_muv(i,j) =a_muv(i,j) +Tmpv400(i,k,j)*a_Tmpv2
a_Tmpv1 =muv(i,j)*a_Tmpv2
a_wkm1 =a_wkm1 +v_base(k-1)*a_Tmpv1
a_wk =a_wk +v_base(k)*a_Tmpv1
a_wkm1 =a_wkm1 -a_wk
a_wk =0.0
a_z_at_v =a_z_at_v +((-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_v)) &
*0.5/(z_base(k)-z_base(k-1)) -(-(-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_v)) &
*0.5/(z_base(k)-z_base(k-1)))*sign(1.0, 1. -max(0., z_base(k) -z_at_v)/(z_base(k) &
-z_base(k-1))))*0.5*a_wkm1
a_wkm1 =0.0
a_Tmpv5 =a_z_at_v
a_z_at_v =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i,k+1,j-1) =a_ph(i,k+1,j-1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i,k,j-1) =a_ph(i,k,j-1) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
! Added by Ning Pan, 2010-07-22
k = kts
z_at_v = Tmpv401(i,k,j)
a_Tmpv3 =a_rv(i,k,j)
a_rv(i,k,j) =0.0
a_rv_in(i,k,j) =a_rv_in(i,k,j) +a_Tmpv3
a_Tmpv2 =-a_Tmpv3
! Revised by Ning Pan, 2010-07-22
! a_muv(i,j) =a_muv(i,j) +Tmpv200(i)*a_Tmpv2
a_muv(i,j) =a_muv(i,j) +Tmpv400(i,k,j)*a_Tmpv2
a_Tmpv1 =muv(i,j)*a_Tmpv2
a_wk =a_wk +v_base(k)*a_Tmpv1
a_wkp1 =a_wkp1 +v_base(k+1)*a_Tmpv1
a_wkp1 =a_wkp1 -a_wk
a_wk =0.0
a_z_at_v =a_z_at_v +((1.0 +(-1.0)*sign(1.0, 0. -z_at_v -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)) -(-(1.0 +(-1.0)*sign(1.0, 0. -z_at_v -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)))*sign(1.0, 1. -max(0., z_at_v -z_base(k))/(z_base(k+1) &
-z_base(k))))*0.5*a_wkp1
a_wkp1 =0.0
a_Tmpv5 =a_z_at_v
a_z_at_v =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i,k+1,j-1) =a_ph(i,k+1,j-1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i,k,j-1) =a_ph(i,k,j-1) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
!LPB[10]
! Revised by Ning Pan, 2010-07-22
! DO j =Tmpv001, jts, -1
DO j =MIN(jte,jde-1)+1, jts, -1
! Remarked by Ning Pan, 2010-07-22: redundant recalculation
! DO k =kts+1, ktf-1
! DO i =i_start-1, i_end
! Tmpv001 =phb(i,k,j)+phb(i,k+1,j)+phb(i,k,j-1)+phb(i,k+1,j-1) +ph(i,k,j) +ph(i,k+1,j)
! Tmpv002 =Tmpv001 +ph(i,k,j-1)
! Tmpv003 =Tmpv002 +ph(i,k+1,j-1)
! Tmpv004 =0.25*Tmpv003
! Tmpv005 =Tmpv004/g
!! z_at_v =Tmpv005
! wkp1 =min(1., max(0., z_at_v -z_base(k))/(z_base(k+1)-z_base(k)))
! wkm1 =min(1., max(0., z_base(k) -z_at_v)/(z_base(k)-z_base(k-1)))
! Tmpv001 =1. -wkp1 -wkm1
! wk =Tmpv001
! Tmpv001 =wkm1*v_base(k-1) +wk*v_base(k)
! Tmpv002 =Tmpv001 +wkp1*v_base(k+1)
! Tmpv300(i,k) =Tmpv002
! Tmpv003 =muv(i,j)*Tmpv300(i,k)
! Tmpv004 =rv_in(i,k,j) -Tmpv003
!! rv(i,k,j) =Tmpv004
! ENDDO
! ENDDO
DO k =ktf-1, kts+1, -1
DO i =i_end, i_start-1, -1
z_at_v = Tmpv401(i,k,j) ! Added by Ning Pan, 2010-07-22
a_Tmpv4 =a_rv(i,k,j)
a_rv(i,k,j) =0.0
a_rv_in(i,k,j) =a_rv_in(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
! Revised by Ning Pan, 2010-07-22
! a_muv(i,j) =a_muv(i,j) +Tmpv300(i,k)*a_Tmpv3
a_muv(i,j) =a_muv(i,j) +Tmpv400(i,k,j)*a_Tmpv3
a_Tmpv2 =muv(i,j)*a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_wkp1 =a_wkp1 +v_base(k+1)*a_Tmpv2
a_wkm1 =a_wkm1 +v_base(k-1)*a_Tmpv1
a_wk =a_wk +v_base(k)*a_Tmpv1
a_Tmpv1 =a_wk
a_wk =0.0
a_wkp1 =a_wkp1 -a_Tmpv1
a_wkm1 =a_wkm1 -a_Tmpv1
a_z_at_v =a_z_at_v +((-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_v)) &
*0.5/(z_base(k)-z_base(k-1)) -(-(-1.0 +(1.0)*sign(1.0, 0. -z_base(k) -z_at_v)) &
*0.5/(z_base(k)-z_base(k-1)))*sign(1.0, 1. -max(0., z_base(k) -z_at_v)/(z_base(k) &
-z_base(k-1))))*0.5*a_wkm1
a_wkm1 =0.0
a_z_at_v =a_z_at_v +((1.0 +(-1.0)*sign(1.0, 0. -z_at_v -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)) -(-(1.0 +(-1.0)*sign(1.0, 0. -z_at_v -z_base(k))) &
*0.5/(z_base(k+1)-z_base(k)))*sign(1.0, 1. -max(0., z_at_v -z_base(k))/(z_base(k+1) &
-z_base(k))))*0.5*a_wkp1
a_wkp1 =0.0
a_Tmpv5 =a_z_at_v
a_z_at_v =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i,k+1,j-1) =a_ph(i,k+1,j-1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i,k,j-1) =a_ph(i,k,j-1) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv1
ENDDO
ENDDO
ENDDO
!LPB[9]
! IF( config_flags%periodic_x ) THEN
! i_end =ite
! END IF
! IF( config_flags%periodic_x ) THEN
! END IF
!LPB[8]
!LPB[7]
! IF( config_flags%periodic_x ) THEN
! i_start =its
! END IF
! IF( config_flags%periodic_x ) THEN
! END IF
!LPB[6]
!LPB[5]
! IF( config_flags%open_xe .or. specified .or. config_flags%nested) THEN
! i_end =min(ide-1, ite)
! END IF
! IF( config_flags%open_xe .or. specified .or. &
! config_flags%nested) THEN
! END IF
!LPB[4]
!LPB[3]
! IF( config_flags%open_xs .or. specified .or. config_flags%nested) THEN
! i_start =max(ids+1, its)
! END IF
! IF( config_flags%open_xs .or. specified .or. &
! config_flags%nested) THEN
! END IF
!LPB[2]
! ktf =min(kte, kde-1)
! i_start =its
! i_end =ite
!LPB[1]
! IF(config_flags%specified .or. config_flags%nested) THEN
! specified =.true.
! END IF
! IF(config_flags%specified .or. config_flags%nested) THEN
! END IF
!LPB[0]
! specified =.false.
END SUBROUTINE a_perturbation_coriolis
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of curvature in reverse (adjoint) mode:
! gradient of useful results: u v ru_tend rw_tend ru rv rw
! rv_tend
! with respect to varying inputs: u v ru_tend rw_tend ru rv rw
! rv_tend
! RW status of diff variables: u:incr v:incr ru_tend:in-out rw_tend:in-out
! ru:incr rv:incr rw:incr rv_tend:in-out
SUBROUTINE A_CURVATURE(ru, rub, rv, rvb, rw, rwb, u, ub, v, vb, w, &
& ru_tend, ru_tendb, rv_tend, rv_tendb, rw_tend, rw_tendb, config_flags&
& , msfux, msfuy, msfvx, msfvy, msftx, msfty, xlat, fzm, fzp, rdx, rdy, &
& ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, &
& jts, jte, kts, kte)
IMPLICIT NONE
! Input data
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ru_tend, &
& rv_tend, rw_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: ru_tendb, rv_tendb, &
& rw_tendb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: ru, rv, rw, &
& u, v, w
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rub, rvb, rwb, ub, vb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: msfux, msfuy, msfvx, &
& msfvy, msftx, msfty, xlat
REAL, DIMENSION(kms:kme), INTENT(IN) :: fzm, fzp
REAL, INTENT(IN) :: rdx, rdy
! Local data
! INTEGER :: i, j, k, itf, jtf, ktf, kp1, im, ip, jm, jp
INTEGER :: i, j, k, itf, jtf, ktf
INTEGER :: i_start, i_end, j_start, j_end
! INTEGER :: irmin, irmax, jrmin, jrmax
REAL, DIMENSION(its - 1:ite, kts:kte, jts - 1:jte) :: vxgm
REAL, DIMENSION(its-1:ite, kts:kte, jts-1:jte) :: vxgmb
LOGICAL :: specified
INTEGER :: ad_from
INTEGER :: ad_to
INTEGER :: ad_from0
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: ad_to3
INTEGER :: ad_from1
INTEGER :: branch
INTEGER :: min6
INTEGER :: min5
INTEGER :: min4
INTEGER :: min3
INTEGER :: min2
INTEGER :: min1
REAL :: tempb3
REAL :: tempb2
REAL :: tempb1
REAL :: tempb0
REAL :: temp0b
REAL :: temp0b9
REAL :: temp0b8
REAL :: temp0b19
REAL :: temp0b7
REAL :: temp0b18
REAL :: temp0b6
REAL :: temp0b17
REAL :: temp0b5
REAL :: temp0b16
REAL :: tempb
REAL :: temp0b4
REAL :: temp0b15
REAL :: temp0b3
REAL :: temp0b14
REAL :: temp0b2
REAL :: temp0b13
REAL :: temp0b1
REAL :: temp0b12
REAL :: temp0b0
REAL :: temp0b11
REAL :: temp0b10
REAL :: temp
INTEGER :: max1
!
!
! curvature calculates the large timestep tendency terms in the
! u, v, and w momentum equations arise from the curvature terms.
!
!
specified = .false.
IF (config_flags%specified .OR. config_flags%nested) specified = &
& .true.
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
! irmin = ims
! irmax = ime
! jrmin = jms
! jrmax = jme
! IF ( config_flags%open_xs ) irmin = ids
! IF ( config_flags%open_xe ) irmax = ide-1
! IF ( config_flags%open_ys ) jrmin = jds
! IF ( config_flags%open_ye ) jrmax = jde-1
! Define v cross grad m at scalar points - vxgm(i,j)
i_start = its - 1
i_end = ite
j_start = jts - 1
j_end = jte
IF (((config_flags%open_xs .OR. specified) .OR. config_flags%nested) &
& .AND. its .EQ. ids) i_start = its
IF (((config_flags%open_xe .OR. specified) .OR. config_flags%nested) &
& .AND. ite .EQ. ide) i_end = ite - 1
IF ((((config_flags%open_ys .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) .AND. jts .EQ. jds) j_start = jts
IF ((((config_flags%open_ye .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) .AND. jte .EQ. jde) j_end = jte - 1
IF (config_flags%periodic_x) i_start = its - 1
IF (config_flags%periodic_x) i_end = ite
ad_from0 = j_start
DO j=ad_from0,j_end
DO k=kts,ktf
ad_from = i_start
DO i=ad_from,i_end
! Map scale factor notes:
! msf...y is constant everywhere for cylindrical map projection
! msf...x varies with y only
! But we know that this is not = 0 for cylindrical,
! therefore use msfvX in 1st line
! which => by symmetry use msfuY in 2nd line - ???
vxgm(i, k, j) = 0.5*(u(i, k, j)+u(i+1, k, j))*(msfvx(i, j+1)-&
& msfvx(i, j))*rdy - 0.5*(v(i, k, j)+v(i, k, j+1))*(msfuy(i+1, j&
& )-msfuy(i, j))*rdx
END DO
CALL PUSHINTEGER4(i - 1)
CALL PUSHINTEGER4(ad_from)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHINTEGER4(ad_from0)
! Pick up the boundary rows for open (radiation) lateral b.c.
! Rather crude at present, we are assuming there is no
! variation in this term at the boundary.
IF (((config_flags%open_xs .OR. (specified .AND. (.NOT.config_flags%&
& periodic_x))) .OR. config_flags%nested) .AND. its .EQ. ids) THEN
DO j=jts,jte-1
DO k=kts,ktf
vxgm(its-1, k, j) = vxgm(its, k, j)
END DO
END DO
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (((config_flags%open_xe .OR. (specified .AND. (.NOT.config_flags%&
& periodic_x))) .OR. config_flags%nested) .AND. ite .EQ. ide) THEN
DO j=jts,jte-1
DO k=kts,ktf
vxgm(ite, k, j) = vxgm(ite-1, k, j)
END DO
END DO
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
! Polar boundary condition:
! The following change is needed in case one tries using the vxgm route with
! polar B.C.'s in the future, but not needed if 'tan' used
IF ((((config_flags%open_ys .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) .AND. jts .EQ. jds) THEN
DO k=kts,ktf
DO i=its-1,ite
vxgm(i, k, jts-1) = vxgm(i, k, jts)
END DO
END DO
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
! Polar boundary condition:
! The following change is needed in case one tries using the vxgm route with
! polar B.C.'s in the future, but not needed if 'tan' used
IF ((((config_flags%open_ye .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) .AND. jte .EQ. jde) THEN
DO k=kts,ktf
DO i=its-1,ite
vxgm(i, k, jte) = vxgm(i, k, jte-1)
END DO
END DO
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
! curvature term for u momentum eqn.
! Map scale factor notes:
! ADT eqn 44, RHS terms 4 and 5, in cylindrical: mu u v tan(lat)/(a my)
! - mu u w /(a my)
! ru = mu u / my ; rw = mu w / my ; rv = mu v / mx
! => terms are:
! (mx/my)*u rv tan(lat) / a - u rw / a = (u/a)*[(mx/my) rv tan(lat) - rw]
! ru v tan(lat) / a - u rw / a
! xlat defined with end points half grid space from pole,
! hence are on u latitude points
i_start = its
IF ((config_flags%open_xs .OR. specified) .OR. config_flags%nested) &
& THEN
IF (ids + 1 .LT. its) THEN
i_start = its
ELSE
i_start = ids + 1
END IF
END IF
IF ((config_flags%open_xe .OR. specified) .OR. config_flags%nested) &
& THEN
IF (ide - 1 .GT. ite) THEN
i_end = ite
ELSE
i_end = ide - 1
END IF
END IF
IF (config_flags%periodic_x) i_start = its
IF (config_flags%periodic_x) i_end = ite
! Polar boundary condition
IF (config_flags%map_proj .EQ. 6 .OR. config_flags%polar) THEN
IF (jde - 1 .GT. jte) THEN
min1 = jte
ELSE
min1 = jde - 1
END IF
CALL PUSHCONTROL1B(0)
ELSE
IF (jde - 1 .GT. jte) THEN
min2 = jte
ELSE
min2 = jde - 1
END IF
CALL PUSHCONTROL1B(1)
END IF
! curvature term for v momentum eqn.
! Map scale factor notes
! ADT eqn 45, RHS terms 4 and 5, in cylindrical: - mu u*u tan(lat)/(a mx)
! - mu v w /(a mx)
! ru = mu u / my ; rw = mu w / my ; rv = mu v / mx
! terms are:
! - (my/mx)*u ru tan(lat) / a - (my/mx)*v rw / a
! = - [my/(mx*a)]*[u ru tan(lat) + v rw]
! - (1/a)*[(my/mx)*u ru tan(lat) + w rv]
! xlat defined with end points half grid space from pole, hence are on
! u latitude points => av here
!
! in original wrf, there was a sign error for the rw contribution
j_start = jts
IF (((config_flags%open_ys .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) THEN
IF (jds + 1 .LT. jts) THEN
j_start = jts
ELSE
j_start = jds + 1
END IF
END IF
IF (((config_flags%open_ye .OR. specified) .OR. config_flags%nested) &
& .OR. config_flags%polar) THEN
IF (jde - 1 .GT. jte) THEN
j_end = jte
ELSE
j_end = jde - 1
END IF
END IF
IF (config_flags%map_proj .EQ. 6 .OR. config_flags%polar) THEN
DO j=j_start,j_end
DO k=kts,ktf
IF (ite .GT. ide - 1) THEN
min3 = ide - 1
ELSE
min3 = ite
END IF
i = min3 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHCONTROL1B(1)
ELSE
! normal code
DO j=j_start,j_end
DO k=kts,ktf
IF (ite .GT. ide - 1) THEN
min4 = ide - 1
ELSE
min4 = ite
END IF
i = min4 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHCONTROL1B(0)
END IF
IF (jte .GT. jde - 1) THEN
min5 = jde - 1
ELSE
min5 = jte
END IF
! curvature term for vertical momentum eqn.
! Notes on map scale factors:
! ADT eqn 46, RHS term 4: [mu/(a my)]*[u*u + v*v]
! ru = mu u / my ; rw = mu w / my ; rv = mu v / mx
! terms are: u ru / a + (mx/my)v rv / a
DO j=jts,min5
IF (2 .LT. kts) THEN
max1 = kts
ELSE
max1 = 2
END IF
ad_from1 = max1
DO k=ad_from1,ktf
IF (ite .GT. ide - 1) THEN
min6 = ide - 1
ELSE
min6 = ite
END IF
i = min6 + 1
CALL PUSHINTEGER4(i - 1)
END DO
CALL PUSHINTEGER4(ad_from1)
END DO
DO j=min5,jts,-1
CALL POPINTEGER4(ad_from1)
DO k=ktf,ad_from1,-1
CALL POPINTEGER4(ad_to3)
DO i=ad_to3,its,-1
temp0b14 = reradius*0.5**2*rw_tendb(i, k, j)
temp0b15 = (fzm(k)*(u(i, k, j)+u(i+1, k, j))+fzp(k)*(u(i, k-1, j&
& )+u(i+1, k-1, j)))*temp0b14
temp0b16 = (fzm(k)*(ru(i, k, j)+ru(i+1, k, j))+fzp(k)*(ru(i, k-1&
& , j)+ru(i+1, k-1, j)))*temp0b14
temp0b17 = reradius*msftx(i, j)*0.5**2*rw_tendb(i, k, j)
temp0b18 = (fzm(k)*(v(i, k, j)+v(i, k, j+1))+fzp(k)*(v(i, k-1, j&
& )+v(i, k-1, j+1)))*temp0b17/msfty(i, j)
temp0b19 = (fzm(k)*(rv(i, k, j)+rv(i, k, j+1))+fzp(k)*(rv(i, k-1&
& , j)+rv(i, k-1, j+1)))*temp0b17/msfty(i, j)
rub(i, k, j) = rub(i, k, j) + fzm(k)*temp0b15
rub(i+1, k, j) = rub(i+1, k, j) + fzm(k)*temp0b15
rub(i, k-1, j) = rub(i, k-1, j) + fzp(k)*temp0b15
rub(i+1, k-1, j) = rub(i+1, k-1, j) + fzp(k)*temp0b15
ub(i, k, j) = ub(i, k, j) + fzm(k)*temp0b16
ub(i+1, k, j) = ub(i+1, k, j) + fzm(k)*temp0b16
ub(i, k-1, j) = ub(i, k-1, j) + fzp(k)*temp0b16
ub(i+1, k-1, j) = ub(i+1, k-1, j) + fzp(k)*temp0b16
rvb(i, k, j) = rvb(i, k, j) + fzm(k)*temp0b18
rvb(i, k, j+1) = rvb(i, k, j+1) + fzm(k)*temp0b18
rvb(i, k-1, j) = rvb(i, k-1, j) + fzp(k)*temp0b18
rvb(i, k-1, j+1) = rvb(i, k-1, j+1) + fzp(k)*temp0b18
vb(i, k, j) = vb(i, k, j) + fzm(k)*temp0b19
vb(i, k, j+1) = vb(i, k, j+1) + fzm(k)*temp0b19
vb(i, k-1, j) = vb(i, k-1, j) + fzp(k)*temp0b19
vb(i, k-1, j+1) = vb(i, k-1, j+1) + fzp(k)*temp0b19
END DO
END DO
END DO
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
vxgmb = 0.0
DO j=j_end,j_start,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to2)
DO i=ad_to2,its,-1
temp0b9 = -(0.25*0.5*rv_tendb(i, k, j))
temp0b10 = (ru(i, k, j)+ru(i+1, k, j)+ru(i, k, j-1)+ru(i+1, k&
& , j-1))*temp0b9
temp0b11 = (vxgm(i, k, j)+vxgm(i, k, j-1))*temp0b9
temp0b12 = -(msfvy(i, j)*reradius*0.25*rv_tendb(i, k, j))
temp0b13 = v(i, k, j)*temp0b12/msfvx(i, j)
vxgmb(i, k, j) = vxgmb(i, k, j) + temp0b10
vxgmb(i, k, j-1) = vxgmb(i, k, j-1) + temp0b10
rub(i, k, j) = rub(i, k, j) + temp0b11
rub(i+1, k, j) = rub(i+1, k, j) + temp0b11
rub(i, k, j-1) = rub(i, k, j-1) + temp0b11
rub(i+1, k, j-1) = rub(i+1, k, j-1) + temp0b11
vb(i, k, j) = vb(i, k, j) + (rw(i, k+1, j-1)+rw(i, k, j-1)+rw(&
& i, k+1, j)+rw(i, k, j))*temp0b12/msfvx(i, j)
rwb(i, k+1, j-1) = rwb(i, k+1, j-1) + temp0b13
rwb(i, k, j-1) = rwb(i, k, j-1) + temp0b13
rwb(i, k+1, j) = rwb(i, k+1, j) + temp0b13
rwb(i, k, j) = rwb(i, k, j) + temp0b13
END DO
END DO
END DO
ELSE
DO j=j_end,j_start,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,its,-1
temp0b4 = -(msfvy(i, j)*reradius*rv_tendb(i, k, j)/msfvx(i, j)&
& )
temp0b5 = TAN((xlat(i, j)+xlat(i, j-1))*(degrad*0.5))*0.25**2*&
& temp0b4
temp0b6 = (ru(i, k, j)+ru(i+1, k, j)+ru(i, k, j-1)+ru(i+1, k, &
& j-1))*temp0b5
temp0b7 = (u(i, k, j)+u(i+1, k, j)+u(i, k, j-1)+u(i+1, k, j-1)&
& )*temp0b5
temp0b8 = 0.25*v(i, k, j)*temp0b4
ub(i, k, j) = ub(i, k, j) + temp0b6
ub(i+1, k, j) = ub(i+1, k, j) + temp0b6
ub(i, k, j-1) = ub(i, k, j-1) + temp0b6
ub(i+1, k, j-1) = ub(i+1, k, j-1) + temp0b6
rub(i, k, j) = rub(i, k, j) + temp0b7
rub(i+1, k, j) = rub(i+1, k, j) + temp0b7
rub(i, k, j-1) = rub(i, k, j-1) + temp0b7
rub(i+1, k, j-1) = rub(i+1, k, j-1) + temp0b7
vb(i, k, j) = vb(i, k, j) + 0.25*(rw(i, k+1, j-1)+rw(i, k, j-1&
& )+rw(i, k+1, j)+rw(i, k, j))*temp0b4
rwb(i, k+1, j-1) = rwb(i, k+1, j-1) + temp0b8
rwb(i, k, j-1) = rwb(i, k, j-1) + temp0b8
rwb(i, k+1, j) = rwb(i, k+1, j) + temp0b8
rwb(i, k, j) = rwb(i, k, j) + temp0b8
END DO
END DO
END DO
vxgmb = 0.0
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=min1,jts,-1
DO k=ktf,kts,-1
DO i=i_end,i_start,-1
temp = 0.25*msfux(i, j)*TAN(xlat(i, j)*degrad)
tempb1 = reradius*u(i, k, j)*ru_tendb(i, k, j)
tempb2 = temp*tempb1/msfuy(i, j)
tempb3 = -(0.25*tempb1)
ub(i, k, j) = ub(i, k, j) + reradius*(temp*((rv(i-1, k, j+1)+&
& rv(i, k, j+1)+rv(i-1, k, j)+rv(i, k, j))/msfuy(i, j))-0.25*(&
& rw(i-1, k+1, j)+rw(i-1, k, j)+rw(i, k+1, j)+rw(i, k, j)))*&
& ru_tendb(i, k, j)
rvb(i-1, k, j+1) = rvb(i-1, k, j+1) + tempb2
rvb(i, k, j+1) = rvb(i, k, j+1) + tempb2
rvb(i-1, k, j) = rvb(i-1, k, j) + tempb2
rvb(i, k, j) = rvb(i, k, j) + tempb2
rwb(i-1, k+1, j) = rwb(i-1, k+1, j) + tempb3
rwb(i-1, k, j) = rwb(i-1, k, j) + tempb3
rwb(i, k+1, j) = rwb(i, k+1, j) + tempb3
rwb(i, k, j) = rwb(i, k, j) + tempb3
END DO
END DO
END DO
ELSE
DO j=min2,jts,-1
DO k=ktf,kts,-1
DO i=i_end,i_start,-1
temp0b = 0.25*0.5*ru_tendb(i, k, j)
temp0b0 = (rv(i-1, k, j+1)+rv(i, k, j+1)+rv(i-1, k, j)+rv(i, k&
& , j))*temp0b
temp0b1 = (vxgm(i, k, j)+vxgm(i-1, k, j))*temp0b
temp0b2 = -(reradius*0.25*ru_tendb(i, k, j))
temp0b3 = u(i, k, j)*temp0b2
vxgmb(i, k, j) = vxgmb(i, k, j) + temp0b0
vxgmb(i-1, k, j) = vxgmb(i-1, k, j) + temp0b0
rvb(i-1, k, j+1) = rvb(i-1, k, j+1) + temp0b1
rvb(i, k, j+1) = rvb(i, k, j+1) + temp0b1
rvb(i-1, k, j) = rvb(i-1, k, j) + temp0b1
rvb(i, k, j) = rvb(i, k, j) + temp0b1
ub(i, k, j) = ub(i, k, j) + (rw(i-1, k+1, j)+rw(i-1, k, j)+rw(&
& i, k+1, j)+rw(i, k, j))*temp0b2
rwb(i-1, k+1, j) = rwb(i-1, k+1, j) + temp0b3
rwb(i-1, k, j) = rwb(i-1, k, j) + temp0b3
rwb(i, k+1, j) = rwb(i, k+1, j) + temp0b3
rwb(i, k, j) = rwb(i, k, j) + temp0b3
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO k=ktf,kts,-1
DO i=ite,its-1,-1
vxgmb(i, k, jte-1) = vxgmb(i, k, jte-1) + vxgmb(i, k, jte)
vxgmb(i, k, jte) = 0.0
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO k=ktf,kts,-1
DO i=ite,its-1,-1
vxgmb(i, k, jts) = vxgmb(i, k, jts) + vxgmb(i, k, jts-1)
vxgmb(i, k, jts-1) = 0.0
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jte-1,jts,-1
DO k=ktf,kts,-1
vxgmb(ite-1, k, j) = vxgmb(ite-1, k, j) + vxgmb(ite, k, j)
vxgmb(ite, k, j) = 0.0
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jte-1,jts,-1
DO k=ktf,kts,-1
vxgmb(its, k, j) = vxgmb(its, k, j) + vxgmb(its-1, k, j)
vxgmb(its-1, k, j) = 0.0
END DO
END DO
END IF
CALL POPINTEGER4(ad_from0)
CALL POPINTEGER4(ad_to0)
DO j=ad_to0,ad_from0,-1
DO k=ktf,kts,-1
CALL POPINTEGER4(ad_from)
CALL POPINTEGER4(ad_to)
DO i=ad_to,ad_from,-1
tempb = (msfvx(i, j+1)-msfvx(i, j))*rdy*0.5*vxgmb(i, k, j)
tempb0 = -((msfuy(i+1, j)-msfuy(i, j))*rdx*0.5*vxgmb(i, k, j))
ub(i, k, j) = ub(i, k, j) + tempb
ub(i+1, k, j) = ub(i+1, k, j) + tempb
vb(i, k, j) = vb(i, k, j) + tempb0
vb(i, k, j+1) = vb(i, k, j+1) + tempb0
vxgmb(i, k, j) = 0.0
END DO
END DO
END DO
END SUBROUTINE A_CURVATURE
SUBROUTINE a_zero_tend(a_tendency,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: a_tendency
INTEGER :: i,j,k,itf,jtf,ktf
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[0]
DO j =jte, jts, -1
! DO k =kts, kte
! DO i =its, ite
! tendency(i,k,j) =0.
! ENDDO
! ENDDO
DO k =kte, kts, -1
DO i =ite, its, -1
a_tendency(i,k,j) =0.0
ENDDO
ENDDO
ENDDO
END SUBROUTINE a_zero_tend
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.6 (r4343) - 10 Feb 2012 10:52
!
! Differentiation of zero_tend2d in reverse (adjoint) mode:
! gradient of useful results: tendency
! with respect to varying inputs: tendency
! RW status of diff variables: tendency:in-out
SUBROUTINE A_ZERO_TEND2D(tendencyb, ids, ide, jds, jde, kds, &
& kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
! Input data
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: tendencyb
! Local data
INTEGER :: i, j, k, itf, jtf, ktf
DO j=jte,jts,-1
DO i=ite,its,-1
tendencyb(i, j) = 0.0
END DO
END DO
END SUBROUTINE A_ZERO_TEND2D
SUBROUTINE a_zero_pole(field,a_field,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field
INTEGER :: i,k
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!REVISED BY WALLS, BIG ERRORS
! IF (jts == jds) THEN
! IF (jte == jde) THEN
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
! IF(jte == jde) THEN
! DO k =kts, kte
! DO i =its-1, ite+1
! field(i,k,jte) =0.
! ENDDO
! ENDDO
! END IF
IF(jte == jde) THEN
DO k =kte, kts, -1
DO i =ite+1, its-1, -1
a_field(i,k,jte) =0.0
ENDDO
ENDDO
END IF
!LPB[2]
!LPB[1]
! IF(jts == jds) THEN
! DO k =kts, kte
! DO i =its-1, ite+1
! field(i,k,jts) =0.
! ENDDO
! ENDDO
! END IF
IF(jts == jds) THEN
DO k =kte, kts, -1
DO i =ite+1, its-1, -1
a_field(i,k,jts) =0.0
ENDDO
ENDDO
END IF
!LPB[0]
END SUBROUTINE a_zero_pole
SUBROUTINE a_pole_point_bc(field,a_field,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field
INTEGER :: i,k
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!REVISED BY WALLS, BIG ERROR
! IF (jts == jds) THEN
! IF (jte == jde) THEN
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[3]
! IF(jte == jde) THEN
! DO k =kts, kte
! DO i =its, ite
! field(i,k,jte) =field(i,k,jte-1)
! ENDDO
! ENDDO
! END IF
IF(jte == jde) THEN
DO k =kte, kts, -1
DO i =ite, its, -1
a_field(i,k,jte-1) =a_field(i,k,jte-1) +a_field(i,k,jte)
a_field(i,k,jte) =0.0
ENDDO
ENDDO
END IF
!LPB[2]
!LPB[1]
! IF(jts == jds) THEN
! DO k =kts, kte
! DO i =its, ite
! field(i,k,jts) =field(i,k,jts+1)
! ENDDO
! ENDDO
! END IF
IF(jts == jds) THEN
DO k =kte, kts, -1
DO i =ite, its, -1
a_field(i,k,jts+1) =a_field(i,k,jts+1) +a_field(i,k,jts)
a_field(i,k,jts) =0.0
ENDDO
ENDDO
END IF
!LPB[0]
END SUBROUTINE a_pole_point_bc
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of phy_prep in reverse (adjoint) mode:
! gradient of useful results: rthndgdten rublten v_phy rqvndgdten
! rthraten p rqccuten t rthcuten u v rqicuten z
! th_phy rthften rvndgdten rqscuten t8w rqrshten
! rqvshten rucuten pi_phy rvshten rqvblten rvblten
! rphndgdten t_phy rqcshten rqvften rthshten rqgshten
! p_hyd_w rqishten p_phy rqcblten moist ph rthblten
! u_phy rqrcuten rqiblten alt rqsshten rqvcuten
! p8w z_at_w rho rvcuten p_hyd rushten muu muv rundgdten
! mu dz8w
! with respect to varying inputs: rthndgdten rublten v_phy rqvndgdten
! rthraten p rqccuten t rthcuten u v rqicuten z
! th_phy rthften rvndgdten rqscuten t8w rqrshten
! rqvshten rucuten pi_phy rvshten rqvblten rvblten
! rphndgdten t_phy rqcshten rqvften rthshten rqgshten
! p_hyd_w rqishten p_phy rqcblten moist ph rthblten
! u_phy rqrcuten rqiblten alt rqsshten rqvcuten
! p8w z_at_w rho rvcuten p_hyd rushten muu muv rundgdten
! mu dz8w
! RW status of diff variables: rthndgdten:in-out rublten:in-out
! v_phy:in-out rqvndgdten:in-out rthraten:in-out
! p:incr rqccuten:in-out t:incr rthcuten:in-out
! u:incr v:incr rqicuten:in-out z:in-out th_phy:in-out
! rthften:in-out rvndgdten:in-out rqscuten:in-out
! t8w:in-out rqrshten:in-out rqvshten:in-out rucuten:in-out
! pi_phy:in-out rvshten:in-out rqvblten:in-out rvblten:in-out
! rphndgdten:in-out t_phy:in-out rqcshten:in-out
! rqvften:in-out rthshten:in-out rqgshten:in-out
! p_hyd_w:in-out rqishten:in-out p_phy:in-out rqcblten:in-out
! moist:incr ph:incr rthblten:in-out u_phy:in-out
! rqrcuten:in-out rqiblten:in-out alt:incr rqsshten:in-out
! rqvcuten:in-out p8w:in-out z_at_w:in-out rho:in-out
! rvcuten:in-out p_hyd:in-out rushten:in-out muu:incr
! muv:incr rundgdten:in-out mu:incr dz8w:in-out
! input
! input
! input
! output
! output
! output
! output
! params
!01/2017 decoupling mu in A_PHY_PREP is moved to A_PHY_PREP_part2
SUBROUTINE A_PHY_PREP_part2(config_flags, mu, mub, muu, muub, muv, muvb, &
& rthraten, rthratenb, rthblten, &
& rthbltenb, rublten, rubltenb, rvblten, rvbltenb, rqvblten, rqvbltenb, &
& rqcblten, rqcbltenb, rqiblten, rqibltenb, rucuten, rucutenb, rvcuten, &
& rvcutenb, rthcuten, rthcutenb, rqvcuten, rqvcutenb, rqccuten, &
& rqccutenb, rqrcuten, rqrcutenb, rqicuten, rqicutenb, rqscuten, &
& rqscutenb, rushten, rushtenb, rvshten, rvshtenb, rthshten, rthshtenb, &
& rqvshten, rqvshtenb, rqcshten, rqcshtenb, rqrshten, rqrshtenb, &
& rqishten, rqishtenb, rqsshten, rqsshtenb, rqgshten, rqgshtenb, rthften&
& , rthftenb, rqvften, rqvftenb, rundgdten, rundgdtenb, rvndgdten, &
& rvndgdtenb, rthndgdten, rthndgdtenb, rphndgdten, rphndgdtenb, &
& rqvndgdten, rqvndgdtenb, rmundgdten, ids, ide, jds, jde, kds, kde, ims&
& , ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
!----------------------------------------------------------------------
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, muu, muv
REAL, DIMENSION(ims:ime, jms:jme) :: mub, muub, muvb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthraten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rthratenb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rucuten, &
& rvcuten, rthcuten, rqvcuten, rqccuten, rqrcuten, rqicuten, rqscuten, &
& rushten, rvshten, rthshten, rqvshten, rqcshten, rqrshten, rqishten, &
& rqsshten, rqgshten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rucutenb, rvcutenb, &
& rthcutenb, rqvcutenb, rqccutenb, rqrcutenb, rqicutenb, rqscutenb, &
& rushtenb, rvshtenb, rthshtenb, rqvshtenb, rqcshtenb, rqrshtenb, &
& rqishtenb, rqsshtenb, rqgshtenb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rublten, &
& rvblten, rthblten, rqvblten, rqcblten, rqiblten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rubltenb, rvbltenb, &
& rthbltenb, rqvbltenb, rqcbltenb, rqibltenb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthften, &
& rqvften
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rthftenb, rqvftenb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rundgdten&
& , rvndgdten, rthndgdten, rphndgdten, rqvndgdten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rundgdtenb, rvndgdtenb, &
& rthndgdtenb, rphndgdtenb, rqvndgdtenb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: rmundgdten
INTEGER :: i_start, i_end, j_start, j_end, k_start, k_end, i_startu, &
& j_startv
INTEGER :: i, j, k
INTEGER :: branch
REAL :: temp1b29
REAL :: temp1b28
REAL :: temp1b27
REAL :: temp1b26
REAL :: temp1b25
REAL :: temp1b24
REAL :: temp1b23
REAL :: temp1b22
REAL :: temp1b21
REAL :: temp1b20
REAL :: temp1b19
REAL :: temp1b18
REAL :: temp1b17
REAL :: temp1b16
REAL :: temp1b15
REAL :: temp1b14
REAL :: temp1b13
REAL :: temp1b12
REAL :: temp1b11
REAL :: temp1b10
REAL :: temp1b9
REAL :: temp1b8
REAL :: temp1b7
REAL :: temp1b6
REAL :: temp1b5
REAL :: temp1b4
REAL :: temp1b3
REAL :: temp1b2
REAL :: temp1b1
REAL :: temp1b0
REAL :: temp1b
!-----------------------------------------------------------------------
!
!
! phys_prep_part2 decouples the physics tendencies from
! the column dry-air mass (the physics routines expect to see/update the
! uncoupled tendencies).
!
!
! set up loop bounds for this grid's boundary conditions
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
k_start = kts
IF (kte .GT. kde - 1) THEN
k_end = kde - 1
ELSE
k_end = kte
END IF
! decouple all physics tendencies
IF (config_flags%ra_lw_physics .GT. 0 .OR. config_flags%ra_sw_physics &
& .GT. 0) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (config_flags%cu_physics .GT. 0) THEN
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qr .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qi .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qs .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
IF (config_flags%shcu_physics .GT. 0) THEN
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qr .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qi .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qs .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qg .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
IF (config_flags%bl_pbl_physics .GT. 0) THEN
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qi .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
! decouple advective forcing required by Grell-Devenyi scheme
IF (((config_flags%cu_physics .EQ. gdscheme .OR. config_flags%&
& cu_physics .EQ. g3scheme) .OR. config_flags%cu_physics .EQ. &
& kfetascheme) .OR. config_flags%cu_physics .EQ. tiedtkescheme &
& .OR. (config_flags%cu_physics == NTIEDTKESCHEME) &
& .OR. (config_flags%cu_physics == MSKFSCHEME) ) THEN
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
! fdda
! note fdda u and v tendencies are staggered, also only interior points have muu/muv,
! so only decouple those
IF (config_flags%grid_fdda .GT. 0) THEN
IF (its .LT. ids + 1) THEN
i_startu = ids + 1
ELSE
i_startu = its
END IF
IF (jts .LT. jds + 1) THEN
j_startv = jds + 1
ELSE
j_startv = jts
END IF
! RMUNDGDTEN(I,J) - no coupling
IF (config_flags%grid_fdda .EQ. 2) THEN
DO j=j_end,j_start,-1
DO k=kte,k_start,-1
DO i=i_end,i_start,-1
temp1b28 = rphndgdtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rphndgdten(i, k, j)*temp1b28/mu(i, j&
& )
rphndgdtenb(i, k, j) = temp1b28
END DO
END DO
END DO
ELSE IF (config_flags%grid_fdda .EQ. 1) THEN
IF (p_qv .GE. param_first_scalar) THEN
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b29 = rqvndgdtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqvndgdten(i, k, j)*temp1b29/mu(i&
& , j)
rqvndgdtenb(i, k, j) = temp1b29
END DO
END DO
END DO
END IF
END IF
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b27 = rthndgdtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rthndgdten(i, k, j)*temp1b27/mu(i, j)
rthndgdtenb(i, k, j) = temp1b27
END DO
END DO
END DO
DO j=j_end,j_startv,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b26 = rvndgdtenb(i, k, j)/muv(i, j)
muvb(i, j) = muvb(i, j) - rvndgdten(i, k, j)*temp1b26/muv(i, j&
& )
rvndgdtenb(i, k, j) = temp1b26
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_startu,-1
temp1b25 = rundgdtenb(i, k, j)/muu(i, j)
muub(i, j) = muub(i, j) - rundgdten(i, k, j)*temp1b25/muu(i, j&
& )
rundgdtenb(i, k, j) = temp1b25
END DO
END DO
END DO
END IF
CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b24 = rqvftenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqvften(i, k, j)*temp1b24/mu(i, j)
rqvftenb(i, k, j) = temp1b24
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 100
END IF
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b23 = rthftenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rthften(i, k, j)*temp1b23/mu(i, j)
rthftenb(i, k, j) = temp1b23
END DO
END DO
END DO
100 CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b22 = rqibltenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqiblten(i, k, j)*temp1b22/mu(i, j)
rqibltenb(i, k, j) = temp1b22
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 110
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b21 = rqcbltenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqcblten(i, k, j)*temp1b21/mu(i, j)
rqcbltenb(i, k, j) = temp1b21
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b20 = rqvbltenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqvblten(i, k, j)*temp1b20/mu(i, j)
rqvbltenb(i, k, j) = temp1b20
END DO
END DO
END DO
END IF
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b19 = rubltenb(i, k, j)/mu(i, j)
temp1b18 = rvbltenb(i, k, j)/mu(i, j)
temp1b17 = rthbltenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rvblten(i, k, j)*temp1b18/mu(i, j) - &
& rublten(i, k, j)*temp1b19/mu(i, j) - rthblten(i, k, j)*&
& temp1b17/mu(i, j)
rthbltenb(i, k, j) = temp1b17
rvbltenb(i, k, j) = temp1b18
rubltenb(i, k, j) = temp1b19
END DO
END DO
END DO
110 CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b16 = rqgshtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqgshten(i, k, j)*temp1b16/mu(i, j)
rqgshtenb(i, k, j) = temp1b16
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 120
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b15 = rqsshtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqsshten(i, k, j)*temp1b15/mu(i, j)
rqsshtenb(i, k, j) = temp1b15
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b14 = rqishtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqishten(i, k, j)*temp1b14/mu(i, j)
rqishtenb(i, k, j) = temp1b14
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b13 = rqrshtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqrshten(i, k, j)*temp1b13/mu(i, j)
rqrshtenb(i, k, j) = temp1b13
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b12 = rqcshtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqcshten(i, k, j)*temp1b12/mu(i, j)
rqcshtenb(i, k, j) = temp1b12
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b11 = rqvshtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqvshten(i, k, j)*temp1b11/mu(i, j)
rqvshtenb(i, k, j) = temp1b11
END DO
END DO
END DO
END IF
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b10 = rushtenb(i, k, j)/mu(i, j)
temp1b9 = rvshtenb(i, k, j)/mu(i, j)
temp1b8 = rthshtenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rvshten(i, k, j)*temp1b9/mu(i, j) - &
& rushten(i, k, j)*temp1b10/mu(i, j) - rthshten(i, k, j)*temp1b8&
& /mu(i, j)
rthshtenb(i, k, j) = temp1b8
rvshtenb(i, k, j) = temp1b9
rushtenb(i, k, j) = temp1b10
END DO
END DO
END DO
120 CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b7 = rqscutenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqscuten(i, k, j)*temp1b7/mu(i, j)
rqscutenb(i, k, j) = temp1b7
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 130
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b6 = rqicutenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqicuten(i, k, j)*temp1b6/mu(i, j)
rqicutenb(i, k, j) = temp1b6
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b5 = rqrcutenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqrcuten(i, k, j)*temp1b5/mu(i, j)
rqrcutenb(i, k, j) = temp1b5
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b4 = rqccutenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqccuten(i, k, j)*temp1b4/mu(i, j)
rqccutenb(i, k, j) = temp1b4
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b3 = rqvcutenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rqvcuten(i, k, j)*temp1b3/mu(i, j)
rqvcutenb(i, k, j) = temp1b3
END DO
END DO
END DO
END IF
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
DO k=k_end,k_start,-1
temp1b2 = rucutenb(i, k, j)/mu(i, j)
temp1b1 = rvcutenb(i, k, j)/mu(i, j)
temp1b0 = rthcutenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rvcuten(i, k, j)*temp1b1/mu(i, j) - &
& rucuten(i, k, j)*temp1b2/mu(i, j) - rthcuten(i, k, j)*temp1b0/&
& mu(i, j)
rthcutenb(i, k, j) = temp1b0
rvcutenb(i, k, j) = temp1b1
rucutenb(i, k, j) = temp1b2
END DO
END DO
END DO
130 CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
temp1b = rthratenb(i, k, j)/mu(i, j)
mub(i, j) = mub(i, j) - rthraten(i, k, j)*temp1b/mu(i, j)
rthratenb(i, k, j) = temp1b
END DO
END DO
END DO
END IF
END SUBROUTINE A_PHY_PREP_part2
SUBROUTINE A_PHY_PREP(config_flags, mu, mub, muu, muub, muv, muvb, u, ub&
& , v, vb, p, pb0, pb, alt, altb, ph, phb0, phb, t, tb, moist, &
& moistb, n_moist, rho, rhob, th_phy, th_phyb, p_phy, p_phyb, pi_phy, &
& pi_phyb, u_phy, u_phyb, v_phy, v_phyb, p8w, p8wb, t_phy, t_phyb, t8w, &
& t8wb, z, zb, z_at_w, z_at_wb, dz8w, dz8wb, p_hyd, p_hydb, p_hyd_w, &
& p_hyd_wb, dnw, fzm, fzp, znw, p_top, &
& ids, ide, jds, jde, kds, kde, ims&
& , ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
!----------------------------------------------------------------------
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
INTEGER, INTENT(IN) :: n_moist
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), INTENT(IN) :: &
& moist
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist) :: moistb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, muu, muv
REAL, DIMENSION(ims:ime, jms:jme) :: mub, muub, muvb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: u_phy, v_phy, pi_phy, &
& p_phy, p8w, t_phy, th_phy, t8w, rho, z, dz8w, z_at_w
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: u_phyb, v_phyb, pi_phyb&
& , p_phyb, p8wb, t_phyb, th_phyb, t8wb, rhob, zb, dz8wb, z_at_wb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: p_hyd, p_hyd_w
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: p_hydb, p_hyd_wb
REAL, INTENT(IN) :: p_top
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: pb, p, u, v&
& , alt, ph, phb, t
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: pb0, ub, vb, altb, phb0&
& , tb
REAL, DIMENSION(kms:kme), INTENT(IN) :: fzm, fzp
REAL, DIMENSION(kms:kme), INTENT(IN) :: znw, dnw
INTEGER :: i_start, i_end, j_start, j_end, k_start, k_end, i_startu, &
& j_startv
INTEGER :: i, j, k
REAL :: w1, w2, z0, z1, z2
REAL :: w1b, w2b, z0b, z1b, z2b
REAL :: qtot
REAL :: qtotb
INTEGER :: n
INTEGER :: branch
REAL :: temp0
REAL :: tempb4
REAL :: tempb3
REAL :: tempb2
REAL :: tempb1
REAL :: tempb0
REAL :: tempb
REAL :: temp
!-----------------------------------------------------------------------
!
!
! phys_prep calculates a number of diagnostic quantities needed by
! the physics routines.
!
!
! set up loop bounds for this grid's boundary conditions
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
k_start = kts
IF (kte .GT. kde - 1) THEN
k_end = kde - 1
ELSE
k_end = kte
END IF
! compute thermodynamics and velocities at pressure points (or half levels)
DO j=j_start,j_end
DO k=k_start,k_end
DO i=i_start,i_end
th_phy(i, k, j) = t(i, k, j) + t0
p_phy(i, k, j) = p(i, k, j) + pb(i, k, j)
pi_phy(i, k, j) = (p_phy(i, k, j)/p1000mb)**rcp
t_phy(i, k, j) = th_phy(i, k, j)*pi_phy(i, k, j)
END DO
END DO
END DO
! compute z at w points
DO j=j_start,j_end
DO k=k_start,kte
DO i=i_start,i_end
z_at_w(i, k, j) = (phb(i, k, j)+ph(i, k, j))/g
END DO
END DO
END DO
! compute z at p points or half levels (average of z at full levels)
DO j=j_start,j_end
DO k=k_start,k_end
DO i=i_start,i_end
z(i, k, j) = 0.5*(z_at_w(i, k, j)+z_at_w(i, k+1, j))
END DO
END DO
END DO
DO j=j_start,j_end
DO k=kte-1,k_start,-1
DO i=i_start,i_end
CALL PUSHREAL8(qtot)
qtot = 0.
DO n=param_first_scalar,n_moist
qtot = qtot + moist(i, k, j, n)
END DO
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
p_hyd_wb(i, k, j) = p_hyd_wb(i, k, j) + 0.5*p_hydb(i, k, j)
p_hyd_wb(i, k+1, j) = p_hyd_wb(i, k+1, j) + 0.5*p_hydb(i, k, j)
p_hydb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_start,kte-1,1
DO i=i_end,i_start,-1
p_hyd_wb(i, k+1, j) = p_hyd_wb(i, k+1, j) + p_hyd_wb(i, k, j)
qtotb = -(dnw(k)*mu(i, j)*p_hyd_wb(i, k, j))
mub(i, j) = mub(i, j) - dnw(k)*(qtot+1.)*p_hyd_wb(i, k, j)
p_hyd_wb(i, k, j) = 0.0
DO n=n_moist,param_first_scalar,-1
moistb(i, k, j, n) = moistb(i, k, j, n) + qtotb
END DO
CALL POPREAL8(qtot)
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
p_hyd_wb(i, kte, j) = 0.0
END DO
END DO
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
z0 = z_at_w(i, kte, j)
z1 = z(i, k_end, j)
z2 = z(i, k_end-1, j)
w1 = (z0-z2)/(z1-z2)
w2 = 1. - w1
t_phyb(i, kde-1, j) = t_phyb(i, kde-1, j) + w1*t8wb(i, kde, j)
t_phyb(i, kde-2, j) = t_phyb(i, kde-2, j) + w2*t8wb(i, kde, j)
temp0 = LOG(p_phy(i, kde-2, j))
temp = LOG(p_phy(i, kde-1, j))
tempb0 = EXP(w1*temp+w2*temp0)*p8wb(i, kde, j)
w2b = temp0*tempb0 + t_phy(i, kde-2, j)*t8wb(i, kde, j)
w1b = temp*tempb0 - w2b + t_phy(i, kde-1, j)*t8wb(i, kde, j)
t8wb(i, kde, j) = 0.0
p_phyb(i, kde-1, j) = p_phyb(i, kde-1, j) + w1*tempb0/p_phy(i, kde&
& -1, j)
p_phyb(i, kde-2, j) = p_phyb(i, kde-2, j) + w2*tempb0/p_phy(i, kde&
& -2, j)
p8wb(i, kde, j) = 0.0
tempb1 = w1b/(z1-z2)
tempb2 = -((z0-z2)*tempb1/(z1-z2))
z0b = tempb1
z2b = -tempb2 - tempb1
z1b = tempb2
zb(i, k_end-1, j) = zb(i, k_end-1, j) + z2b
zb(i, k_end, j) = zb(i, k_end, j) + z1b
z_at_wb(i, kte, j) = z_at_wb(i, kte, j) + z0b
z0 = z_at_w(i, 1, j)
z1 = z(i, 1, j)
z2 = z(i, 2, j)
w1 = (z0-z2)/(z1-z2)
w2 = 1. - w1
t_phyb(i, 1, j) = t_phyb(i, 1, j) + w1*t8wb(i, 1, j)
w2b = p_phy(i, 2, j)*p8wb(i, 1, j) + t_phy(i, 2, j)*t8wb(i, 1, j)
w1b = p_phy(i, 1, j)*p8wb(i, 1, j) - w2b + t_phy(i, 1, j)*t8wb(i, &
& 1, j)
t_phyb(i, 2, j) = t_phyb(i, 2, j) + w2*t8wb(i, 1, j)
t8wb(i, 1, j) = 0.0
p_phyb(i, 1, j) = p_phyb(i, 1, j) + w1*p8wb(i, 1, j)
p_phyb(i, 2, j) = p_phyb(i, 2, j) + w2*p8wb(i, 1, j)
p8wb(i, 1, j) = 0.0
tempb3 = w1b/(z1-z2)
tempb4 = -((z0-z2)*tempb3/(z1-z2))
z0b = tempb3
z2b = -tempb4 - tempb3
z1b = tempb4
zb(i, 2, j) = zb(i, 2, j) + z2b
zb(i, 1, j) = zb(i, 1, j) + z1b
z_at_wb(i, 1, j) = z_at_wb(i, 1, j) + z0b
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,2,-1
DO i=i_end,i_start,-1
t_phyb(i, k, j) = t_phyb(i, k, j) + fzm(k)*t8wb(i, k, j)
t_phyb(i, k-1, j) = t_phyb(i, k-1, j) + fzp(k)*t8wb(i, k, j)
t8wb(i, k, j) = 0.0
p_phyb(i, k, j) = p_phyb(i, k, j) + fzm(k)*p8wb(i, k, j)
p_phyb(i, k-1, j) = p_phyb(i, k-1, j) + fzp(k)*p8wb(i, k, j)
p8wb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
z_at_wb(i, k, j) = z_at_wb(i, k, j) + 0.5*zb(i, k, j)
z_at_wb(i, k+1, j) = z_at_wb(i, k+1, j) + 0.5*zb(i, k, j)
zb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
dz8wb(i, kte, j) = 0.0
END DO
END DO
DO j=j_end,j_start,-1
DO k=kte-1,k_start,-1
DO i=i_end,i_start,-1
z_at_wb(i, k+1, j) = z_at_wb(i, k+1, j) + dz8wb(i, k, j)
z_at_wb(i, k, j) = z_at_wb(i, k, j) - dz8wb(i, k, j)
dz8wb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=kte,k_start,-1
DO i=i_end,i_start,-1
phb0(i, k, j) = phb0(i, k, j) + z_at_wb(i, k, j)/g
z_at_wb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
vb(i, k, j) = vb(i, k, j) + 0.5*v_phyb(i, k, j)
vb(i, k, j+1) = vb(i, k, j+1) + 0.5*v_phyb(i, k, j)
v_phyb(i, k, j) = 0.0
ub(i, k, j) = ub(i, k, j) + 0.5*u_phyb(i, k, j)
ub(i+1, k, j) = ub(i+1, k, j) + 0.5*u_phyb(i, k, j)
u_phyb(i, k, j) = 0.0
tempb = rhob(i, k, j)/alt(i, k, j)
moistb(i, k, j, p_qv) = moistb(i, k, j, p_qv) + tempb
altb(i, k, j) = altb(i, k, j) - (moist(i, k, j, p_qv)+1.)*tempb/&
& alt(i, k, j)
rhob(i, k, j) = 0.0
th_phyb(i, k, j) = th_phyb(i, k, j) + pi_phy(i, k, j)*t_phyb(i, &
& k, j)
pi_phyb(i, k, j) = pi_phyb(i, k, j) + th_phy(i, k, j)*t_phyb(i, &
& k, j)
t_phyb(i, k, j) = 0.0
IF (.NOT.(p_phy(i, k, j)/p1000mb .LE. 0.0 .AND. (rcp .EQ. 0.0 &
& .OR. rcp .NE. INT(rcp)))) p_phyb(i, k, j) = p_phyb(i, k, j) &
& + rcp*(p_phy(i, k, j)/p1000mb)**(rcp-1)*pi_phyb(i, k, j)/&
& p1000mb
pi_phyb(i, k, j) = 0.0
pb0(i, k, j) = pb0(i, k, j) + p_phyb(i, k, j)
p_phyb(i, k, j) = 0.0
tb(i, k, j) = tb(i, k, j) + th_phyb(i, k, j)
th_phyb(i, k, j) = 0.0
END DO
END DO
END DO
END SUBROUTINE A_PHY_PREP
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of moist_physics_prep_em in reverse (adjoint) mode:
! gradient of useful results: p al z th_phy h_diabatic t_new
! pf ph p8w z_at_w rho pii dz8w
! with respect to varying inputs: p al z th_phy h_diabatic t_new
! pf ph p8w z_at_w rho pii dz8w
! RW status of diff variables: p:incr al:incr z:in-out th_phy:in-out
! h_diabatic:in-out t_new:incr pf:in-out ph:incr
! p8w:in-out z_at_w:in-out rho:in-out pii:in-out
! dz8w:in-out
SUBROUTINE A_MOIST_PHYSICS_PREP_EM(t_new, t_newb, t_old, t0, rho, rhob, &
& al, alb0, alb, p, pb0, p8w, p8wb, p0, pb, ph, phb0, phb, th_phy, &
& th_phyb, pii, piib, pf, pfb, z, zb, z_at_w, z_at_wb, dz8w, dz8wb, dt, &
& h_diabatic, h_diabaticb, &
& qv, qvb, qv_diabatic, qv_diabaticb, &
& qc, qcb, qc_diabatic, qc_diabaticb, &
& config_flags, fzm, fzp, ids, ide, jds, jde, &
& kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
! Here we construct full fields
! needed by the microphysics
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde
INTEGER, INTENT(IN) :: ims, ime, jms, jme, kms, kme
INTEGER, INTENT(IN) :: its, ite, jts, jte, kts, kte
REAL, INTENT(IN) :: dt
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: al, alb, p, &
& pb, ph, phb, qv, qc
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: alb0, pb0, phb0
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: qvb, qcb
REAL, DIMENSION(kms:kme), INTENT(IN) :: fzm, fzp
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rho, th_phy, pii, pf, z&
& , z_at_w, dz8w, p8w
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rhob, th_phyb, piib, pfb&
& , zb, z_at_wb, dz8wb, p8wb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
& h_diabatic, qv_diabatic, qc_diabatic
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: h_diabaticb, &
& qv_diabaticb, qc_diabaticb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_new, &
& t_old
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: t_newb
REAL, INTENT(IN) :: t0, p0
REAL :: z0, z1, z2, w1, w2
REAL :: z0b, z1b, z2b, w1b, w2b
INTEGER :: i_start, i_end, j_start, j_end, k_start, k_end
INTEGER :: i, j, k
INTEGER :: branch
REAL :: temp1
REAL :: temp0
REAL :: temp0b
REAL :: temp0b3
REAL :: temp0b2
REAL :: temp0b1
REAL :: temp0b0
REAL :: temp
!--------------------------------------------------------------------
!
!
! moist_phys_prep_em calculates a number of diagnostic quantities needed by
! the microphysics routines.
!
!
! set up loop bounds for this grid's boundary conditions
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
k_start = kts
IF (kte .GT. kde - 1) THEN
k_end = kde - 1
ELSE
k_end = kte
END IF
DO j=j_start,j_end
DO k=k_start,kte
DO i=i_start,i_end
z_at_w(i, k, j) = (ph(i, k, j)+phb(i, k, j))/g
END DO
END DO
END DO
! compute full pii, rho, and z at the new time-level
! (needed for physics).
! convert perturbation theta to full theta (th_phy)
! use h_diabatic to temporarily save pre-microphysics full theta
DO j=j_start,j_end
DO k=k_start,k_end
DO i=i_start,i_end
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
z(i, k, j) = 0.5*(z_at_w(i, k, j)+z_at_w(i, k+1, j))
pf(i, k, j) = p(i, k, j) + pb(i, k, j)
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
z0 = z_at_w(i, kte, j)
z1 = z(i, k_end, j)
z2 = z(i, k_end-1, j)
w1 = (z0-z2)/(z1-z2)
w2 = 1. - w1
temp1 = LOG(pf(i, kde-2, j))
temp0 = LOG(pf(i, kde-1, j))
temp0b = EXP(w1*temp0+w2*temp1)*p8wb(i, kde, j)
pfb(i, kde-1, j) = pfb(i, kde-1, j) + w1*temp0b/pf(i, kde-1, j)
w2b = temp1*temp0b
w1b = temp0*temp0b - w2b
pfb(i, kde-2, j) = pfb(i, kde-2, j) + w2*temp0b/pf(i, kde-2, j)
p8wb(i, kde, j) = 0.0
temp0b0 = w1b/(z1-z2)
temp0b1 = -((z0-z2)*temp0b0/(z1-z2))
z0b = temp0b0
z2b = -temp0b1 - temp0b0
z1b = temp0b1
zb(i, k_end-1, j) = zb(i, k_end-1, j) + z2b
zb(i, k_end, j) = zb(i, k_end, j) + z1b
z_at_wb(i, kte, j) = z_at_wb(i, kte, j) + z0b
z0 = z_at_w(i, 1, j)
z1 = z(i, 1, j)
z2 = z(i, 2, j)
w1 = (z0-z2)/(z1-z2)
w2 = 1. - w1
pfb(i, 1, j) = pfb(i, 1, j) + w1*p8wb(i, 1, j)
w2b = pf(i, 2, j)*p8wb(i, 1, j)
w1b = pf(i, 1, j)*p8wb(i, 1, j) - w2b
pfb(i, 2, j) = pfb(i, 2, j) + w2*p8wb(i, 1, j)
p8wb(i, 1, j) = 0.0
temp0b2 = w1b/(z1-z2)
temp0b3 = -((z0-z2)*temp0b2/(z1-z2))
z0b = temp0b2
z2b = -temp0b3 - temp0b2
z1b = temp0b3
zb(i, 2, j) = zb(i, 2, j) + z2b
zb(i, 1, j) = zb(i, 1, j) + z1b
z_at_wb(i, 1, j) = z_at_wb(i, 1, j) + z0b
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,2,-1
DO i=i_end,i_start,-1
pfb(i, k, j) = pfb(i, k, j) + fzm(k)*p8wb(i, k, j)
pfb(i, k-1, j) = pfb(i, k-1, j) + fzp(k)*p8wb(i, k, j)
p8wb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
IF ((pb(i, k, j)+p(i, k, j))/p0 .LE. 0.0 .AND. (rcp .EQ. 0.0 &
& .OR. rcp .NE. INT(rcp))) THEN
pb0(i, k, j) = pb0(i, k, j) + pfb(i, k, j)
ELSE
pb0(i, k, j) = pb0(i, k, j) + rcp*((pb(i, k, j)+p(i, k, j))/p0&
& )**(rcp-1)*piib(i, k, j)/p0 + pfb(i, k, j)
END IF
pfb(i, k, j) = 0.0
z_at_wb(i, k, j) = z_at_wb(i, k, j) + 0.5*zb(i, k, j)
z_at_wb(i, k+1, j) = z_at_wb(i, k+1, j) + 0.5*zb(i, k, j)
zb(i, k, j) = 0.0
piib(i, k, j) = 0.0
temp = alb(i, k, j) + al(i, k, j)
alb0(i, k, j) = alb0(i, k, j) - rhob(i, k, j)/temp**2
rhob(i, k, j) = 0.0
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
qcb(i, k, j) = qcb(i, k, j) + qc_diabaticb(i, k, j)
qc_diabaticb(i, k, j) = 0.0
ELSE
qc_diabaticb(i, k, j) = 0.0
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
qvb(i, k, j) = qvb(i, k, j) + qv_diabaticb(i, k, j)
qv_diabaticb(i, k, j) = 0.0
ELSE
qv_diabaticb(i, k, j) = 0.0
END IF
th_phyb(i, k, j) = th_phyb(i, k, j) + h_diabaticb(i, k, j)
h_diabaticb(i, k, j) = 0.0
t_newb(i, k, j) = t_newb(i, k, j) + th_phyb(i, k, j)
th_phyb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO i=i_end,i_start,-1
dz8wb(i, kte, j) = 0.0
END DO
END DO
DO j=j_end,j_start,-1
DO k=kte-1,k_start,-1
DO i=i_end,i_start,-1
z_at_wb(i, k+1, j) = z_at_wb(i, k+1, j) + dz8wb(i, k, j)
z_at_wb(i, k, j) = z_at_wb(i, k, j) - dz8wb(i, k, j)
dz8wb(i, k, j) = 0.0
END DO
END DO
END DO
DO j=j_end,j_start,-1
DO k=kte,k_start,-1
DO i=i_end,i_start,-1
phb0(i, k, j) = phb0(i, k, j) + z_at_wb(i, k, j)/g
z_at_wb(i, k, j) = 0.0
END DO
END DO
END DO
END SUBROUTINE A_MOIST_PHYSICS_PREP_EM
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.7 (r4786) - 21 Feb 2013 15:53
!
! Differentiation of moist_physics_finish_em in reverse (adjoint) mode (with options i4 r8):
! gradient of useful results: th_phy h_diabatic t_new
! with respect to varying inputs: th_phy h_diabatic t_new
! RW status of diff variables: th_phy:incr h_diabatic:in-out
! t_new:in-out
SUBROUTINE A_MOIST_PHYSICS_FINISH_EM(t_new, t_newb, t_old, t0, mut, &
& th_phy, th_phyb, h_diabatic, h_diabaticb, &
& qv, qvb, qv_diabatic, qv_diabaticb, &
& qc, qcb, qc_diabatic, qc_diabaticb, &
& dt, config_flags, ids, ide, &
& jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, &
& kts, kte)
IMPLICIT NONE
! Here we construct full fields
! needed by the microphysics
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde
INTEGER, INTENT(IN) :: ims, ime, jms, jme, kms, kme
INTEGER, INTENT(IN) :: its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_new, &
& t_old, th_phy, h_diabatic
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: qv, qc
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: qvb, qcb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
& qv_diabatic, qv_diabaticb, qc_diabatic, qc_diabaticb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_newb
REAL :: mpten, qvten, qcten
REAL :: mptenb, qvtenb, qctenb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: mut
REAL, INTENT(IN) :: t0, dt
INTEGER :: i_start, i_end, j_start, j_end, k_start, k_end
INTEGER :: i, j, k, imax, jmax, imin, jmin
INTEGER :: branch
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
& h_diabaticb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: th_phyb
!--------------------------------------------------------------------
!
!
! moist_phys_finish_em resets theta to its perturbation value and
! computes and stores the microphysics diabatic heating term.
!
!
! set up loop bounds for this grid's boundary conditions
i_start = its
IF (ite .GT. ide - 1) THEN
i_end = ide - 1
ELSE
i_end = ite
END IF
j_start = jts
IF (jte .GT. jde - 1) THEN
j_end = jde - 1
ELSE
j_end = jte
END IF
k_start = kts
IF (kte .GT. kde - 1) THEN
k_end = kde - 1
ELSE
k_end = kte
END IF
! add microphysics theta diff to perturbation theta, set h_diabatic
IF (config_flags%no_mp_heating .EQ. 0) THEN
DO j=j_start,j_end
DO k=k_start,k_end
DO i=i_start,i_end
mpten = th_phy(i, k, j) - h_diabatic(i, k, j)
IF (p_qv .GE. param_first_scalar) THEN
!qvten = qv(i, k, j) - qv_diabatic(i, k, j)
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
!qcten = qc(i, k, j) - qc_diabatic(i, k, j)
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (config_flags%mp_tend_lim*dt .GT. mpten) THEN
CALL PUSHCONTROL1B(0)
mpten = mpten
ELSE
mpten = config_flags%mp_tend_lim*dt
CALL PUSHCONTROL1B(1)
END IF
IF (-(config_flags%mp_tend_lim*dt) .LT. mpten) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
END DO
END DO
END DO
qvtenb = 0.0
qctenb = 0.0
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
qctenb = qctenb + qc_diabaticb(i, k, j)/dt
qc_diabaticb(i, k, j) = 0.0
ELSE
qc_diabaticb(i, k, j) = 0.0
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
qvtenb = qvtenb + qv_diabaticb(i, k, j)/dt
qv_diabaticb(i, k, j) = 0.0
ELSE
qv_diabaticb(i, k, j) = 0.0
END IF
mptenb = t_newb(i, k, j) + h_diabaticb(i, k, j)/dt
h_diabaticb(i, k, j) = 0.0_8
CALL POPCONTROL1B(branch)
IF (branch .NE. 0) mptenb = 0.0_8
CALL POPCONTROL1B(branch)
IF (branch .NE. 0) mptenb = 0.0_8
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
qcb(i, k, j) = qcb(i, k, j) + qctenb
qc_diabaticb(i, k, j) = qc_diabaticb(i, k, j) - qctenb
qctenb = 0.0
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
qvb(i, k, j) = qvb(i, k, j) + qvtenb
qv_diabaticb(i, k, j) = qv_diabaticb(i, k, j) - qvtenb
qvtenb = 0.0
END IF
th_phyb(i, k, j) = th_phyb(i, k, j) + mptenb
h_diabaticb(i, k, j) = h_diabaticb(i, k, j) - mptenb
END DO
END DO
END DO
ELSE
DO j=j_end,j_start,-1
DO k=k_end,k_start,-1
DO i=i_end,i_start,-1
qc_diabaticb(i, k, j) = 0.0
qv_diabaticb(i, k, j) = 0.0
h_diabaticb(i, k, j) = 0.0_8
END DO
END DO
END DO
END IF
END SUBROUTINE A_MOIST_PHYSICS_FINISH_EM
SUBROUTINE a_init_module_big_step
END SUBROUTINE a_init_module_big_step
SUBROUTINE a_set_tend(field,a_field,field_adv_tend,a_field_adv_tend,msf, &
! Revised by Ning Pan, 2010-07-19
! a_msf,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field_adv_tend,a_field_adv_tend
! Revised by Ning Pan, 2010-07-19
! REAL,DIMENSION(ims:ime,jms:jme) :: msf,a_msf
REAL,DIMENSION(ims:ime,jms:jme) :: msf
INTEGER :: i,j,k,itf,jtf,ktf
REAL :: a_Tmpv1,Tmpv001
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
jtf = MIN(jte,jde-1)
ktf = MIN(kte,kde-1)
itf = MIN(ite,ide-1)
!!LPB[1]
! DO j = jts, jtf
! DO k = kts, ktf
! DO i = its, itf
! field(i,k,j) = field_adv_tend(i,k,j)*msf(i,j)
! ENDDO
! ENDDO
! ENDDO
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[1]
DO j =jtf, jts, -1
! DO k =kts, ktf
! DO i =its, itf
! Tmpv001 =field_adv_tend(i,k,j)*msf(i,j)
! field(i,k,j) =Tmpv001
! ENDDO
! ENDDO
DO k =ktf, kts, -1
DO i =itf, its, -1
a_Tmpv1 =a_field(i,k,j)
a_field(i,k,j) =0.0
a_field_adv_tend(i,k,j) =a_field_adv_tend(i,k,j) +msf(i,j)*a_Tmpv1
! a_msf(i,j) =a_msf(i,j) +field_adv_tend(i,k,j)*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-19
ENDDO
ENDDO
ENDDO
!LPB[0]
! jtf =min(jte, jde-1)
! ktf =min(kte, kde-1)
! itf =min(ite, ide-1)
END SUBROUTINE a_set_tend
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3805) - 29 Mar 2011 12:57
!
! Differentiation of theta_relaxation in reverse (adjoint) mode:
! gradient of useful results: t ph t_tendf mut
! with respect to varying inputs: t ph t_tendf mut
! RW status of diff variables: t:incr ph:incr t_tendf:in-out
! mut:incr
SUBROUTINE A_THETA_RELAXATION(t_tendf, t_tendfb, t, tb, t_init, mut, &
& mutb, ph, phb0, phb, t_base, z_base, ids, ide, jds, jde, kds, kde, ims&
& , ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_tendf
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: t_tendfb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: t, t_init, &
& ph, phb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: tb, phb0
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mut
REAL, DIMENSION(ims:ime, jms:jme) :: mutb
REAL, DIMENSION(kms:kme), INTENT(IN) :: t_base, z_base
! Local variables.
INTEGER :: i, j, k, ktf, k2
REAL :: tau_r, rmax, rmin, inv_tau_r, inv_g, rterm
REAL :: rtermb
REAL, DIMENSION(kms:kme) :: z00, t00
REAL, DIMENSION(kms:kme) :: z00b, t00b
INTEGER :: branch
INTEGER :: ad_to
INTEGER :: min2
INTEGER :: min1
REAL :: tempb
! End declarations.
!-----------------------------------------------------------------------
! set tau_r to 12 h, following RE87
tau_r = 12.0*3600.0
! limit rterm to +/- 2 K/day
rmax = 2.0/86400.0
rmin = -rmax
IF (kte .GT. kde - 1) THEN
ktf = kde - 1
ELSE
ktf = kte
END IF
inv_tau_r = 1.0/tau_r
inv_g = 1.0/g
IF (jte .GT. jde - 1) THEN
min1 = jde - 1
ELSE
min1 = jte
END IF
!-----------------------------------------------------------------------
! Adjust potential temperature to base state.
DO j=jts,min1
IF (ite .GT. ide - 1) THEN
min2 = ide - 1
ELSE
min2 = ite
END IF
DO i=its,min2
! Get height of model levels:
DO k=kts,ktf
z00(k) = 0.5*(phb(i, k, j)+phb(i, k+1, j)+ph(i, k, j)+ph(i, k+1&
& , j))*inv_g
END DO
! Get reference state:
DO k=kts,ktf
CALL PUSHINTEGER4(k2)
k2 = ktf
DO WHILE (z_base(k2) .GT. z00(k) .AND. k2 .GT. 1)
k2 = k2 - 1
END DO
IF (k2 + 1 .GT. ktf) THEN
t00(k) = t_base(k2) + (t_base(k2)-t_base(k2-1))*(z00(k)-z_base&
& (k2))/(z_base(k2)-z_base(k2-1))
CALL PUSHCONTROL1B(1)
ELSE
t00(k) = t_base(k2) + (t_base(k2+1)-t_base(k2))*(z00(k)-z_base&
& (k2))/(z_base(k2+1)-z_base(k2))
CALL PUSHCONTROL1B(0)
END IF
END DO
! Apply the RE87 R term:
DO k=kts,ktf
CALL PUSHREAL8(rterm)
rterm = -((t(i, k, j)-t00(k))*inv_tau_r)
IF (rterm .GT. rmax) THEN
rterm = rmax
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
rterm = rterm
END IF
IF (rterm .LT. rmin) THEN
rterm = rmin
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
rterm = rterm
END IF
END DO
END DO
CALL PUSHINTEGER4(i - 1)
END DO
t00b = 0.0
z00b = 0.0
DO j=min1,jts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
DO k=ktf,kts,-1
mutb(i, j) = mutb(i, j) + rterm*t_tendfb(i, k, j)
rtermb = mut(i, j)*t_tendfb(i, k, j)
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) rtermb = 0.0
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) rtermb = 0.0
CALL POPREAL8(rterm)
tb(i, k, j) = tb(i, k, j) - inv_tau_r*rtermb
t00b(k) = t00b(k) + inv_tau_r*rtermb
END DO
DO k=ktf,kts,-1
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
z00b(k) = z00b(k) + (t_base(k2+1)-t_base(k2))*t00b(k)/(z_base(&
& k2+1)-z_base(k2))
t00b(k) = 0.0
ELSE
z00b(k) = z00b(k) + (t_base(k2)-t_base(k2-1))*t00b(k)/(z_base(&
& k2)-z_base(k2-1))
t00b(k) = 0.0
END IF
CALL POPINTEGER4(k2)
END DO
DO k=ktf,kts,-1
tempb = inv_g*0.5*z00b(k)
phb0(i, k, j) = phb0(i, k, j) + tempb
phb0(i, k+1, j) = phb0(i, k+1, j) + tempb
z00b(k) = 0.0
END DO
END DO
END DO
END SUBROUTINE A_THETA_RELAXATION
SUBROUTINE a_rk_rayleigh_damp(ru_tendf,a_ru_tendf,rv_tendf,a_rv_tendf,rw_tendf, &
! Revised by Ning Pan, 2010-07-23
! a_rw_tendf,t_tendf,a_t_tendf,u,a_u,v,a_v,w,a_w,t,a_t,t_init,a_t_init, &
! mut,a_mut,muu,a_muu,muv,a_muv,ph,a_ph,phb,a_phb,u_base,a_u_base,v_base, &
! a_v_base,t_base,a_t_base,z_base,a_z_base,dampcoef,a_dampcoef,zdamp,a_zdamp, &
a_rw_tendf,t_tendf,a_t_tendf,u,a_u,v,a_v,w,a_w,t,a_t,t_init, &
mut,a_mut,muu,a_muu,muv,a_muv,ph,a_ph,phb,u_base,v_base, &
t_base,z_base,dampcoef,zdamp, &
ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru_tendf,a_ru_tendf,rv_tendf, &
a_rv_tendf,rw_tendf,a_rw_tendf,t_tendf,a_t_tendf
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: u,a_u,v,a_v,w,a_w,t,a_t,t_init, &
! Revised by Ning Pan, 2010-07-23
! a_t_init,ph,a_ph,phb,a_phb
ph,a_ph,phb
REAL,DIMENSION(ims:ime,jms:jme) :: mut,a_mut,muu,a_muu,muv,a_muv
! Revised by Ning Pan, 2010-07-23
! REAL,DIMENSION(kms:kme) :: u_base,a_u_base,v_base,a_v_base,t_base,a_t_base, &
! z_base,a_z_base
! REAL :: dampcoef,a_dampcoef,zdamp,a_zdamp
REAL,DIMENSION(kms:kme) :: u_base,v_base,t_base,z_base
REAL :: dampcoef,zdamp
INTEGER :: i_start,i_end,j_start,j_end,k_start,k_end,i,j,k,ktf,k1,k2
! Revised by Ning Pan, 2010-07-23
! REAL :: pii,a_pii,dcoef,a_dcoef,z,a_z,ztop,a_ztop
! REAL :: wkp1,a_wkp1,wk,a_wk,wkm1,a_wkm1
REAL :: pii,dcoef,a_dcoef,z,a_z,ztop,a_ztop
REAL,DIMENSION(kms:kme) :: z00,a_z00,u00,a_u00,v00,a_v00,t00,a_t00
REAL,DIMENSION(jts:min(jte, jde)) :: Keep_Lpb2_ztop
REAL,DIMENSION(jts:min(jte, jde)) :: Keep_Lpb2_dcoef
REAL,DIMENSION(jts:min(jte, jde-1)) :: Keep_Lpb3_ztop
REAL,DIMENSION(jts:min(jte, jde-1)) :: Keep_Lpb3_dcoef
! REAL,DIMENSION(jts:min(jte, jde-1)) :: Keep_Lpb4_ztop
! REAL,DIMENSION(jts:min(jte, jde-1)) :: Keep_Lpb4_dcoef
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,a_Tmpv8,Tmpv008,a_Tmpv9,Tmpv009
!REVISED BY WALLS
! REAL,DIMENSION(k1+2:min(kte,kde-1)) :: Tmpv200
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv200
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv201
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv202
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv203
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv204
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv205
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv206
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv207
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv208
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv209
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2010
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2011
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2012
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2013
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2014
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2015
REAL,DIMENSION(kts:min(kte,kde-1)) :: Tmpv2016
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv300
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv301
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv302
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv303
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv304
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv305
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv306
REAL,DIMENSION(kts:min(kte, kde),its:min(ite, ide-1)) :: Tmpv307
!REVISED BY WALLS
!!This line is fail to be recognized
! DO WHILE( z >= (ztop-zdamp) )
!
!!This line is fail to be recognized
! DO WHILE( z >= (ztop-zdamp) )
!
!!This line is fail to be recognized
! DO WHILE( z >= (ztop-zdamp) )
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
pii = 2.0 * asin(1.0)
ktf = MIN( kte, kde-1 )
!LPB[1]
!DELETED BY WALLS, ERRORS IN DO WHILE STRUCTURES
! DO j = jts, MIN( jte, jde-1 )
!
! DO i = its, MIN( ite, ide )
! ztop = 0.5*( phb(i ,kde,j)+phb(i-1,kde,j) &
! +ph(i ,kde,j)+ph(i-1,kde,j) )/g
! k1 = ktf
! z = ztop
! z = 0.25*( phb(i ,k1,j)+phb(i ,k1+1,j) &
! +phb(i-1,k1,j)+phb(i-1,k1+1,j) &
! +ph(i ,k1,j)+ph(i ,k1+1,j) &
! +ph(i-1,k1,j)+ph(i-1,k1+1,j))/g
! z00(k1) = z
! k1 = k1 - 1
! ENDDO
! k1 = k1 + 2
!
! DO k = k1, ktf
! k2 = ktf
!
! DO WHILE( z_base(k2) .gt. z00(k) )
! k2 = k2 - 1
! ENDDO
! if(k2+1.gt.ktf)then
!
! u00(k) = u_base(k2) + ( u_base(k2) - u_base(k2-1) ) &
! * ( z00(k) - z_base(k2) ) &
! / ( z_base(k2) - z_base(k2-1) )
! else
! u00(k) = u_base(k2) + ( u_base(k2+1) - u_base(k2) ) &
! * ( z00(k) - z_base(k2) ) &
! / ( z_base(k2+1) - z_base(k2) )
! endif
! ENDDO
!
! DO k = k1, ktf
! dcoef = 1.0 - MIN( 1.0, ( ztop - z00(k) ) / zdamp )
! dcoef = (SIN( 0.5 * pii * dcoef ) )**2
! ru_tendf(i,k,j) = ru_tendf(i,k,j) - &
! muu(i,j) * ( dcoef * dampcoef ) * &
! ( u(i,k,j) - u00(k) )
! END DO
!
! END DO
!
!!LPB[2]
! DO j = jts, MIN( jte, jde )
!
! Keep_Lpb2_ztop(j) =ztop
! Keep_Lpb2_dcoef(j) =dcoef
!
! END DO
! DO i = its, MIN( ite, ide-1 )
! ztop = 0.5*( phb(i,kde,j )+phb(i,kde,j-1) &
! +ph(i,kde,j )+ph(i,kde,j-1) )/g
! k1 = ktf
! z = ztop
! z = 0.25*( phb(i,k1,j )+phb(i,k1+1,j ) &
! +phb(i,k1,j-1)+phb(i,k1+1,j-1) &
! +ph(i,k1,j )+ph(i,k1+1,j ) &
! +ph(i,k1,j-1)+ph(i,k1+1,j-1))/g
! z00(k1) = z
! k1 = k1 - 1
! ENDDO
! k1 = k1 + 2
!
! DO k = k1, ktf
! k2 = ktf
!
! DO WHILE( z_base(k2) .gt. z00(k) )
! k2 = k2 - 1
! ENDDO
! if(k2+1.gt.ktf)then
!
! v00(k) = v_base(k2) + ( v_base(k2) - v_base(k2-1) ) &
! * ( z00(k) - z_base(k2) ) &
! / ( z_base(k2) - z_base(k2-1) )
! else
! v00(k) = v_base(k2) + ( v_base(k2+1) - v_base(k2) ) &
! * ( z00(k) - z_base(k2) ) &
! / ( z_base(k2+1) - z_base(k2) )
! endif
! ENDDO
!
! DO k = k1, ktf
! dcoef = 1.0 - MIN( 1.0, ( ztop - z00(k) ) / zdamp )
! dcoef = (SIN( 0.5 * pii * dcoef ) )**2
! rv_tendf(i,k,j) = rv_tendf(i,k,j) - &
! muv(i,j) * ( dcoef * dampcoef ) * &
! ( v(i,k,j) - v00(k) )
! END DO
!
! END DO
!LPB[3]
! DO j = jts, MIN( jte, jde-1 )
!
! Keep_Lpb3_ztop(j) =ztop
! Keep_Lpb3_dcoef(j) =dcoef
!
! END DO
! DO i = its, MIN( ite, ide-1 )
! ztop = ( phb(i,kde,j) + ph(i,kde,j) ) / g
!
! DO k = kts, MIN( kte, kde )
! z = ( phb(i,k,j) + ph(i,k,j) ) / g
! IF ( z >= (ztop-zdamp) ) THEN
!
! dcoef = 1.0 - MIN( 1.0, ( ztop - z ) / zdamp )
! dcoef = ( SIN( 0.5 * pii * dcoef ) )**2
! rw_tendf(i,k,j) = rw_tendf(i,k,j) - &
! mut(i,j) * ( dcoef * dampcoef ) * w(i,k,j)
! END IF
! END DO
! END DO
!
! END DO
!
!!!LPB[4]
! DO j = jts, MIN( jte, jde-1 )
!
!! ! Keep_Lpb4_ztop(j) =ztop
!! ! Keep_Lpb4_dcoef(j) =dcoef
!! DO i = its, MIN( ite, ide-1 )
!! ztop = ( phb(i,kde,j) + ph(i,kde,j) ) / g
!! k1 = ktf
!! z = ztop
! z = 0.5 * ( phb(i,k1,j) + phb(i,k1+1,j) + &
!!! ph(i,k1,j) + ph(i,k1+1,j) ) / g
!! z00(k1) = z
!! k1 = k1 - 1
! ENDDO
!! k1 = k1 + 2
!
!! DO k = k1, ktf
!! k2 = ktf
!
!! DO WHILE( z_base(k2) .gt. z00(k) )
!! k2 = k2 - 1
!! ENDDO
!! if(k2+1.gt.ktf)then
!
!! t00(k) = t_base(k2) + ( t_base(k2) - t_base(k2-1) ) &
! * ( z00(k) - z_base(k2) ) &
!! / ( z_base(k2) - z_base(k2-1) )
!! else
!! t00(k) = t_base(k2) + ( t_base(k2+1) - t_base(k2) ) &
!! * ( z00(k) - z_base(k2) ) &
!! / ( z_base(k2+1) - z_base(k2) )
!! endif
! ENDDO
!
!! DO k = k1, ktf
!! dcoef = 1.0 - MIN( 1.0, ( ztop - z00(k) ) / zdamp )
!! dcoef = (SIN( 0.5 * pii * dcoef ) )**2
!! t_tendf(i,k,j) = t_tendf(i,k,j) - &
! mut(i,j) * ( dcoef * dampcoef ) * &
!! ( t(i,k,j) - t00(k) )
!! END DO
!
!! END DO
!
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
! a_pii =0.0 ! Remarked by Ning Pan, 2010-07-23
a_dcoef =0.0
a_z =0.0
a_ztop =0.0
! Remarked by Ning Pan, 2010-07-23
! a_wkp1 =0.0
! a_wk =0.0
! a_wkm1 =0.0
Do K0_ADJ =kms, kme
a_z00(K0_ADJ) =0.0
End Do
Do K0_ADJ =kms, kme
a_u00(K0_ADJ) =0.0
End Do
Do K0_ADJ =kms, kme
a_v00(K0_ADJ) =0.0
End Do
Do K0_ADJ =kms, kme
a_t00(K0_ADJ) =0.0
End Do
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[4]
DO j =min(jte, jde-1), jts, -1
! ztop =Keep_Lpb4_ztop(j)
! dcoef =Keep_Lpb4_dcoef(j)
DO i =its, min(ite, ide-1)
Tmpv001 =phb(i,kde,j) +ph(i,kde,j)
Tmpv002 =Tmpv001/g
ztop =Tmpv002
k1 =ktf
z =ztop ! Removed remark by Ning Pan, 2010-07-23
DO WHILE( z >= (ztop-zdamp) ) ! Added by Ning Pan, 2010-07-23
Tmpv001 =phb(i,k1,j) +phb(i,k1+1,j)
Tmpv002 =Tmpv001 +ph(i,k1,j)
Tmpv003 =Tmpv002 +ph(i,k1+1,j)
Tmpv004 =0.5*Tmpv003
Tmpv005 =Tmpv004/g
z =Tmpv005 ! Removed remark by Ning Pan, 2010-07-23
z00(k1) =z
k1 =k1-1
ENDDO
k1 =k1+2
DO k =k1, ktf
k2 =ktf
DO WHILE(z_base(k2) .gt. z00(k))
k2 =k2-1
ENDDO
IF(k2+1.gt.ktf) THEN
Tmpv001 =t_base(k2) -t_base(k2-1)
Tmpv002 =z00(k) -z_base(k2)
Tmpv200(k) =Tmpv001
Tmpv201(k) =Tmpv002
Tmpv003 =Tmpv200(k)*Tmpv201(k)
Tmpv004 =z_base(k2) -z_base(k2-1)
Tmpv202(k) =Tmpv003
Tmpv203(k) =Tmpv004
Tmpv005 =Tmpv202(k)/Tmpv203(k)
Tmpv006 =t_base(k2) +Tmpv005
t00(k) =Tmpv006
else
Tmpv001 =t_base(k2+1) -t_base(k2)
Tmpv002 =z00(k) -z_base(k2)
Tmpv204(k) =Tmpv001
Tmpv205(k) =Tmpv002
Tmpv003 =Tmpv204(k)*Tmpv205(k)
Tmpv004 =z_base(k2+1) -z_base(k2)
Tmpv206(k) =Tmpv003
Tmpv207(k) =Tmpv004
Tmpv005 =Tmpv206(k)/Tmpv207(k)
Tmpv006 =t_base(k2) +Tmpv005
t00(k) =Tmpv006
endif
ENDDO
DO k =k1, ktf
Tmpv001 =ztop -z00(k)
Tmpv208(k) =Tmpv001
Tmpv002 =Tmpv208(k)/zdamp
Tmpv209(k) =Tmpv002
Tmpv003 =1.0 -min(1.0, Tmpv209(k))
Tmpv2010(k) =dcoef
dcoef =Tmpv003
Tmpv001 =0.5*pii*dcoef
Tmpv2011(k) =Tmpv001
Tmpv002 =sin(Tmpv2011(k))
Tmpv2012(k) =Tmpv002
Tmpv003 =Tmpv2012(k)**2
Tmpv2013(k) =dcoef
dcoef =Tmpv003
Tmpv001 =dcoef*dampcoef
Tmpv2014(k) =Tmpv001
Tmpv002 =mut(i,j)*Tmpv2014(k)
Tmpv003 =t(i,k,j) -t00(k)
Tmpv2015(k) =Tmpv002
Tmpv2016(k) =Tmpv003
! Remarked by Ning Pan, 2010-07-23
! Tmpv004 =Tmpv2015(k)*Tmpv2016(k)
! Tmpv005 =t_tendf(i,k,j) -Tmpv004
!! t_tendf(i,k,j) =Tmpv005
ENDDO
DO k =ktf, k1, -1
a_Tmpv5 =a_t_tendf(i,k,j)
a_t_tendf(i,k,j) =0.0
a_t_tendf(i,k,j) =a_t_tendf(i,k,j) +a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv2 =Tmpv2016(k)*a_Tmpv4
a_Tmpv3 =Tmpv2015(k)*a_Tmpv4
a_t(i,k,j) =a_t(i,k,j) +a_Tmpv3
a_t00(k) =a_t00(k) -a_Tmpv3
a_mut(i,j) =a_mut(i,j) +Tmpv2014(k)*a_Tmpv2
a_Tmpv1 =mut(i,j)*a_Tmpv2
a_dcoef =a_dcoef +dampcoef*a_Tmpv1
! a_dampcoef =a_dampcoef +dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
! dcoef =Tmpv2013(k) ! Remarked by Ning Pan, 2010-07-24
a_Tmpv3 =a_dcoef
a_dcoef =0.0
a_Tmpv2 =2.0*Tmpv2012(k)*a_Tmpv3
a_Tmpv1 =cos(Tmpv2011(k))*a_Tmpv2
! a_pii =a_pii +0.5*dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_dcoef =a_dcoef +0.5*pii*a_Tmpv1
! dcoef =Tmpv2010(k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv3 =a_dcoef
a_dcoef =0.0
!STOP ! Remarked by Ning Pan, 2010-07-23
!REVISED BY WALLS
! (1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv209(k)))*0.5* =-a_Tmpv3
a_Tmpv2 = -(1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv209(k)))*0.5*a_Tmpv3 ! Added by Ning Pan, 2010-07-23
a_Tmpv1 =a_Tmpv2/zdamp
! a_zdamp =a_zdamp -Tmpv208(k)/(zdamp*zdamp)*a_Tmpv2 ! Remarked by Ning Pan, 2010-07-23
a_ztop =a_ztop +a_Tmpv1
a_z00(k) =a_z00(k) -a_Tmpv1
ENDDO
DO k =ktf, k1, -1
! Added by Ning Pan, 2010-07-23
k2 = ktf
DO WHILE(z_base(k2) .gt. z00(k))
k2 =k2-1
ENDDO
IF(k2+1.gt.ktf) THEN
a_Tmpv6 =a_t00(k)
a_t00(k) =0.0
! a_t_base(k2) =a_t_base(k2) +a_Tmpv6 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =a_Tmpv5/Tmpv203(k)
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv4 =-Tmpv202(k)/(Tmpv203(k)*Tmpv203(k))*a_Tmpv5
! a_z_base(k2) =a_z_base(k2) +a_Tmpv4
! a_z_base(k2-1) =a_z_base(k2-1) -a_Tmpv4
! a_Tmpv1 =Tmpv201(k)*a_Tmpv3
a_Tmpv2 =Tmpv200(k)*a_Tmpv3
a_z00(k) =a_z00(k) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_z_base(k2) =a_z_base(k2) -a_Tmpv2
! a_t_base(k2) =a_t_base(k2) +a_Tmpv1
! a_t_base(k2-1) =a_t_base(k2-1) -a_Tmpv1
else
a_Tmpv6 =a_t00(k)
a_t00(k) =0.0
! a_t_base(k2) =a_t_base(k2) +a_Tmpv6 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =a_Tmpv5/Tmpv207(k)
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv4 =-Tmpv206(k)/(Tmpv207(k)*Tmpv207(k))*a_Tmpv5
! a_z_base(k2+1) =a_z_base(k2+1) +a_Tmpv4
! a_z_base(k2) =a_z_base(k2) -a_Tmpv4
! a_Tmpv1 =Tmpv205(k)*a_Tmpv3
a_Tmpv2 =Tmpv204(k)*a_Tmpv3
a_z00(k) =a_z00(k) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_z_base(k2) =a_z_base(k2) -a_Tmpv2
! a_t_base(k2+1) =a_t_base(k2+1) +a_Tmpv1
! a_t_base(k2) =a_t_base(k2) -a_Tmpv1
endif
! Remarked by Ning Pan, 2010-07-23
! DO
! ENDDO
ENDDO
! DO i =min(ite, ide-1), its, -1 ! Remarked by Ning Pan, 2010-07-23
DO k = k1-1, ktf ! Added by Ning Pan, 2010-07-23
! Revised by Ning Pan, 2010-07-23
! a_z =a_z +a_z00(k1)
! a_z00(k1) =0.0
a_z =a_z +a_z00(k)
a_z00(k) =0.0
a_Tmpv5 =a_z
a_z =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.5*a_Tmpv4
a_Tmpv2 =a_Tmpv3
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1+1,j) =a_ph(i,k1+1,j) +a_Tmpv3
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1,j) =a_ph(i,k1,j) +a_Tmpv2
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_phb(i,k1,j) =a_phb(i,k1,j) +a_Tmpv1
! a_phb(i,k1+1,j) =a_phb(i,k1+1,j) +a_Tmpv1
ENDDO ! Added by Ning Pan, 2010-07-23
a_Tmpv2 =a_ztop
a_ztop =0.0
a_Tmpv1 =a_Tmpv2/g
! a_phb(i,kde,j) =a_phb(i,kde,j) +a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_ph(i,kde,j) =a_ph(i,kde,j) +a_Tmpv1
ENDDO
ENDDO
!LPB[3]
DO j =min(jte, jde-1), jts, -1
! Remarked by Ning Pan, 2010-07-23
! ztop =Keep_Lpb3_ztop(j)
! dcoef =Keep_Lpb3_dcoef(j)
DO i =its, min(ite, ide-1)
Tmpv001 =phb(i,kde,j) +ph(i,kde,j)
Tmpv002 =Tmpv001/g
ztop =Tmpv002
DO k =kts, min(kte, kde)
Tmpv001 =phb(i,k,j) +ph(i,k,j)
Tmpv002 =Tmpv001/g
z =Tmpv002
IF( z >= (ztop-zdamp) ) THEN
Tmpv001 =ztop -z
Tmpv300(k,i) =Tmpv001
Tmpv002 =Tmpv300(k,i)/zdamp
Tmpv301(k,i) =Tmpv002
Tmpv003 =1.0 -min(1.0, Tmpv301(k,i))
Tmpv302(k,i) =dcoef
dcoef =Tmpv003
Tmpv001 =0.5*pii*dcoef
Tmpv303(k,i) =Tmpv001
Tmpv002 =sin(Tmpv303(k,i))
Tmpv304(k,i) =Tmpv002
Tmpv003 =Tmpv304(k,i)**2
Tmpv305(k,i) =dcoef
dcoef =Tmpv003
Tmpv001 =dcoef*dampcoef
Tmpv306(k,i) =Tmpv001
Tmpv002 =mut(i,j)*Tmpv306(k,i)
Tmpv307(k,i) =Tmpv002
! Remarked by Ning Pan, 2010-07-24
! Tmpv003 =Tmpv307(k,i)*w(i,k,j)
! Tmpv004 =rw_tendf(i,k,j) -Tmpv003
!! rw_tendf(i,k,j) =Tmpv004
END IF
! Remarked by Ning Pan, 2010-07-23
! ENDDO
! ENDDO
! Remarked by Ning Pan, 2010-07-23
! DO i =min(ite, ide-1), its, -1
! DO k =min(kte, kde), kts, -1
IF( z >= (ztop-zdamp) ) THEN
a_Tmpv4 =a_rw_tendf(i,k,j)
a_rw_tendf(i,k,j) =0.0
a_rw_tendf(i,k,j) =a_rw_tendf(i,k,j) +a_Tmpv4
a_Tmpv3 =-a_Tmpv4
a_Tmpv2 =w(i,k,j)*a_Tmpv3
a_w(i,k,j) =a_w(i,k,j) +Tmpv307(k,i)*a_Tmpv3
a_mut(i,j) =a_mut(i,j) +Tmpv306(k,i)*a_Tmpv2
a_Tmpv1 =mut(i,j)*a_Tmpv2
a_dcoef =a_dcoef +dampcoef*a_Tmpv1
! a_dampcoef =a_dampcoef +dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
! dcoef =Tmpv305(k,i) ! Remarkedby Ning Pan, 2010-07-24
a_Tmpv3 =a_dcoef
a_dcoef =0.0
a_Tmpv2 =2.0*Tmpv304(k,i)*a_Tmpv3
a_Tmpv1 =cos(Tmpv303(k,i))*a_Tmpv2
! a_pii =a_pii +0.5*dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_dcoef =a_dcoef +0.5*pii*a_Tmpv1
! dcoef =Tmpv302(k,i) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv3 =a_dcoef
a_dcoef =0.0
!STOP ! Remarked by Ning Pan, 2010-07-23
!REVISED BY WALLS
! (1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv301(k,i)))*0.5* =-a_Tmpv3
a_Tmpv2 = -(1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv301(k,i)))*0.5*a_Tmpv3 ! Added by Ning Pan, 2010-07-23
a_Tmpv1 =a_Tmpv2/zdamp
! a_zdamp =a_zdamp -Tmpv300(k,i)/(zdamp*zdamp)*a_Tmpv2 ! Remarked by Ning Pan, 2010-07-23
a_ztop =a_ztop +a_Tmpv1
a_z =a_z -a_Tmpv1
END IF
a_Tmpv2 =a_z
a_z =0.0
a_Tmpv1 =a_Tmpv2/g
! a_phb(i,k,j) =a_phb(i,k,j) +a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv1
ENDDO
a_Tmpv2 =a_ztop
a_ztop =0.0
a_Tmpv1 =a_Tmpv2/g
! a_phb(i,kde,j) =a_phb(i,kde,j) +a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_ph(i,kde,j) =a_ph(i,kde,j) +a_Tmpv1
ENDDO
ENDDO
!LPB[2]
DO j =min(jte, jde), jts, -1
! Remarked by Ning Pan, 2010-07-23
! ztop =Keep_Lpb2_ztop(j)
! dcoef =Keep_Lpb2_dcoef(j)
DO i =its, min(ite, ide-1)
Tmpv001 =phb(i,kde,j) +phb(i,kde,j-1)
Tmpv002 =Tmpv001 +ph(i,kde,j)
Tmpv003 =Tmpv002 +ph(i,kde,j-1)
Tmpv004 =0.5*Tmpv003
Tmpv005 =Tmpv004/g
ztop =Tmpv005
k1 =ktf
z =ztop ! Removed remark by Ning Pan, 2010-07-23
DO WHILE( z >= (ztop-zdamp) ) ! Added by Ning Pan, 2010-07-23
Tmpv001 =phb(i,k1,j) +phb(i,k1+1,j)
Tmpv002 =Tmpv001 +phb(i,k1,j-1)
Tmpv003 =Tmpv002 +phb(i,k1+1,j-1)
Tmpv004 =Tmpv003 +ph(i,k1,j)
Tmpv005 =Tmpv004 +ph(i,k1+1,j)
Tmpv006 =Tmpv005 +ph(i,k1,j-1)
Tmpv007 =Tmpv006 +ph(i,k1+1,j-1)
Tmpv008 =0.25*Tmpv007
Tmpv009 =Tmpv008/g
z =Tmpv009 ! Removed remark by Ning Pan, 2010-07-23
z00(k1) =z
k1 =k1-1
ENDDO
k1 =k1+2
DO k =k1, ktf
k2 =ktf
DO WHILE(z_base(k2) .gt. z00(k))
k2 =k2-1
ENDDO
IF(k2+1.gt.ktf) THEN
Tmpv001 =v_base(k2) -v_base(k2-1)
Tmpv002 =z00(k) -z_base(k2)
Tmpv200(k) =Tmpv001
Tmpv201(k) =Tmpv002
Tmpv003 =Tmpv200(k)*Tmpv201(k)
Tmpv004 =z_base(k2) -z_base(k2-1)
Tmpv202(k) =Tmpv003
Tmpv203(k) =Tmpv004
Tmpv005 =Tmpv202(k)/Tmpv203(k)
Tmpv006 =v_base(k2) +Tmpv005
v00(k) =Tmpv006
else
Tmpv001 =v_base(k2+1) -v_base(k2)
Tmpv002 =z00(k) -z_base(k2)
Tmpv204(k) =Tmpv001
Tmpv205(k) =Tmpv002
Tmpv003 =Tmpv204(k)*Tmpv205(k)
Tmpv004 =z_base(k2+1) -z_base(k2)
Tmpv206(k) =Tmpv003
Tmpv207(k) =Tmpv004
Tmpv005 =Tmpv206(k)/Tmpv207(k)
Tmpv006 =v_base(k2) +Tmpv005
v00(k) =Tmpv006
endif
ENDDO
DO k =k1, ktf
Tmpv001 =ztop -z00(k)
Tmpv208(k) =Tmpv001
Tmpv002 =Tmpv208(k)/zdamp
Tmpv209(k) =Tmpv002
Tmpv003 =1.0 -min(1.0, Tmpv209(k))
Tmpv2010(k) =dcoef
dcoef =Tmpv003
Tmpv001 =0.5*pii*dcoef
Tmpv2011(k) =Tmpv001
Tmpv002 =sin(Tmpv2011(k))
Tmpv2012(k) =Tmpv002
Tmpv003 =Tmpv2012(k)**2
Tmpv2013(k) =dcoef
dcoef =Tmpv003
Tmpv001 =dcoef*dampcoef
Tmpv2014(k) =Tmpv001
Tmpv002 =muv(i,j)*Tmpv2014(k)
Tmpv003 =v(i,k,j) -v00(k)
Tmpv2015(k) =Tmpv002
Tmpv2016(k) =Tmpv003
Tmpv004 =Tmpv2015(k)*Tmpv2016(k)
Tmpv005 =rv_tendf(i,k,j) -Tmpv004
! rv_tendf(i,k,j) =Tmpv005
ENDDO
DO k =ktf, k1, -1
a_Tmpv5 =a_rv_tendf(i,k,j)
a_rv_tendf(i,k,j) =0.0
a_rv_tendf(i,k,j) =a_rv_tendf(i,k,j) +a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv2 =Tmpv2016(k)*a_Tmpv4
a_Tmpv3 =Tmpv2015(k)*a_Tmpv4
a_v(i,k,j) =a_v(i,k,j) +a_Tmpv3
a_v00(k) =a_v00(k) -a_Tmpv3
a_muv(i,j) =a_muv(i,j) +Tmpv2014(k)*a_Tmpv2
a_Tmpv1 =muv(i,j)*a_Tmpv2
a_dcoef =a_dcoef +dampcoef*a_Tmpv1
! a_dampcoef =a_dampcoef +dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
! dcoef =Tmpv2013(k) ! Remarked by Ning Pan, 2010-07-24
a_Tmpv3 =a_dcoef
a_dcoef =0.0
a_Tmpv2 =2.0*Tmpv2012(k)*a_Tmpv3
a_Tmpv1 =cos(Tmpv2011(k))*a_Tmpv2
! a_pii =a_pii +0.5*dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_dcoef =a_dcoef +0.5*pii*a_Tmpv1
! dcoef =Tmpv2010(k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv3 =a_dcoef
a_dcoef =0.0
!STOP ! Remarked by Ning Pan, 2010-07-23
!REVISED BY WALLS
! (1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv209(k)))*0.5* =-a_Tmpv3
a_Tmpv2 = -(1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv209(k)))*0.5*a_Tmpv3 ! Added by Ning Pan, 2010-07-23
a_Tmpv1 =a_Tmpv2/zdamp
! a_zdamp =a_zdamp -Tmpv208(k)/(zdamp*zdamp)*a_Tmpv2 ! Remarked by Ning Pan, 2010-07-23
a_ztop =a_ztop +a_Tmpv1
a_z00(k) =a_z00(k) -a_Tmpv1
ENDDO
DO k =ktf, k1, -1
! Added by Ning Pan, 2010-07-23
k2 = ktf
DO WHILE( z_base(k2) .gt. z00(k) )
k2 = k2 - 1
ENDDO
IF(k2+1.gt.ktf) THEN
a_Tmpv6 =a_v00(k)
a_v00(k) =0.0
! a_v_base(k2) =a_v_base(k2) +a_Tmpv6 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =a_Tmpv5/Tmpv203(k)
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv4 =-Tmpv202(k)/(Tmpv203(k)*Tmpv203(k))*a_Tmpv5
! a_z_base(k2) =a_z_base(k2) +a_Tmpv4
! a_z_base(k2-1) =a_z_base(k2-1) -a_Tmpv4
! a_Tmpv1 =Tmpv201(k)*a_Tmpv3
a_Tmpv2 =Tmpv200(k)*a_Tmpv3
a_z00(k) =a_z00(k) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_z_base(k2) =a_z_base(k2) -a_Tmpv2
! a_v_base(k2) =a_v_base(k2) +a_Tmpv1
! a_v_base(k2-1) =a_v_base(k2-1) -a_Tmpv1
else
a_Tmpv6 =a_v00(k)
a_v00(k) =0.0
! a_v_base(k2) =a_v_base(k2) +a_Tmpv6 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =a_Tmpv5/Tmpv207(k)
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv4 =-Tmpv206(k)/(Tmpv207(k)*Tmpv207(k))*a_Tmpv5
! a_z_base(k2+1) =a_z_base(k2+1) +a_Tmpv4
! a_z_base(k2) =a_z_base(k2) -a_Tmpv4
! a_Tmpv1 =Tmpv205(k)*a_Tmpv3
a_Tmpv2 =Tmpv204(k)*a_Tmpv3
a_z00(k) =a_z00(k) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_z_base(k2) =a_z_base(k2) -a_Tmpv2
! a_v_base(k2+1) =a_v_base(k2+1) +a_Tmpv1
! a_v_base(k2) =a_v_base(k2) -a_Tmpv1
endif
! Remarked by Ning Pan, 2010-07-23
! DO
! ENDDO
ENDDO
! DO i =min(ite, ide-1), its, -1 ! Remarked by Ning Pan, 2010-07-23
DO k = k1-1, ktf ! Added by Ning Pan, 2010-07-23
! Revised by Ning Pan, 2010-07-23
! a_z =a_z +a_z00(k1)
! a_z00(k1) =0.0
a_z =a_z +a_z00(k)
a_z00(k) =0.0
a_Tmpv9 =a_z
a_z =0.0
a_Tmpv8 =a_Tmpv9/g
a_Tmpv7 =0.25*a_Tmpv8
a_Tmpv6 =a_Tmpv7
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1+1,j-1) =a_ph(i,k1+1,j-1) +a_Tmpv7
a_ph(i,k+1,j-1) =a_ph(i,k+1,j-1) +a_Tmpv7
a_Tmpv5 =a_Tmpv6
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1,j-1) =a_ph(i,k1,j-1) +a_Tmpv6
a_ph(i,k,j-1) =a_ph(i,k,j-1) +a_Tmpv6
a_Tmpv4 =a_Tmpv5
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1+1,j) =a_ph(i,k1+1,j) +a_Tmpv5
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv5
a_Tmpv3 =a_Tmpv4
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1,j) =a_ph(i,k1,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv4
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv2 =a_Tmpv3
! a_phb(i,k1+1,j-1) =a_phb(i,k1+1,j-1) +a_Tmpv3
! a_Tmpv1 =a_Tmpv2
! a_phb(i,k1,j-1) =a_phb(i,k1,j-1) +a_Tmpv2
! a_phb(i,k1,j) =a_phb(i,k1,j) +a_Tmpv1
! a_phb(i,k1+1,j) =a_phb(i,k1+1,j) +a_Tmpv1
ENDDO ! Added by Ning Pan, 2010-07-23
a_Tmpv5 =a_ztop
a_ztop =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.5*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i,kde,j-1) =a_ph(i,kde,j-1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i,kde,j) =a_ph(i,kde,j) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_phb(i,kde,j) =a_phb(i,kde,j) +a_Tmpv1
! a_phb(i,kde,j-1) =a_phb(i,kde,j-1) +a_Tmpv1
ENDDO
ENDDO
!LPB[1]
DO j =min(jte, jde-1), jts, -1
! Revised by Ning Pan, 2010-07-23
! DO i =its, min(ite, ide)
DO i =min(ite, ide), its, -1
Tmpv001 =phb(i,kde,j) +phb(i-1,kde,j)
Tmpv002 =Tmpv001 +ph(i,kde,j)
Tmpv003 =Tmpv002 +ph(i-1,kde,j)
Tmpv004 =0.5*Tmpv003
Tmpv005 =Tmpv004/g
ztop =Tmpv005
k1 =ktf
z =ztop ! Removed remark by Ning Pan, 2010-07-23
DO WHILE( z >= (ztop-zdamp) ) ! Added by Ning Pan, 2010-07-23
Tmpv001 =phb(i,k1,j) +phb(i,k1+1,j)
Tmpv002 =Tmpv001 +phb(i-1,k1,j)
Tmpv003 =Tmpv002 +phb(i-1,k1+1,j)
Tmpv004 =Tmpv003 +ph(i,k1,j)
Tmpv005 =Tmpv004 +ph(i,k1+1,j)
Tmpv006 =Tmpv005 +ph(i-1,k1,j)
Tmpv007 =Tmpv006 +ph(i-1,k1+1,j)
Tmpv008 =0.25*Tmpv007
Tmpv009 =Tmpv008/g
z =Tmpv009 ! Removed remark by Ning Pan, 2010-07-23
z00(k1) =z
k1 =k1-1
ENDDO
k1 =k1+2
DO k =k1, ktf
k2 =ktf
DO WHILE(z_base(k2) .gt. z00(k))
k2 =k2-1
ENDDO
IF(k2+1.gt.ktf) THEN
Tmpv001 =u_base(k2) -u_base(k2-1)
Tmpv002 =z00(k) -z_base(k2)
Tmpv200(k) =Tmpv001
Tmpv201(k) =Tmpv002
Tmpv003 =Tmpv200(k)*Tmpv201(k)
Tmpv004 =z_base(k2) -z_base(k2-1)
Tmpv202(k) =Tmpv003
Tmpv203(k) =Tmpv004
Tmpv005 =Tmpv202(k)/Tmpv203(k)
Tmpv006 =u_base(k2) +Tmpv005
u00(k) =Tmpv006
else
Tmpv001 =u_base(k2+1) -u_base(k2)
Tmpv002 =z00(k) -z_base(k2)
Tmpv204(k) =Tmpv001
Tmpv205(k) =Tmpv002
Tmpv003 =Tmpv204(k)*Tmpv205(k)
Tmpv004 =z_base(k2+1) -z_base(k2)
Tmpv206(k) =Tmpv003
Tmpv207(k) =Tmpv004
Tmpv005 =Tmpv206(k)/Tmpv207(k)
Tmpv006 =u_base(k2) +Tmpv005
u00(k) =Tmpv006
endif
ENDDO
DO k =k1, ktf
Tmpv001 =ztop -z00(k)
Tmpv208(k) =Tmpv001
Tmpv002 =Tmpv208(k)/zdamp
Tmpv209(k) =Tmpv002
Tmpv003 =1.0 -min(1.0, Tmpv209(k))
Tmpv2010(k) =dcoef
dcoef =Tmpv003
Tmpv001 =0.5*pii*dcoef
Tmpv2011(k) =Tmpv001
Tmpv002 =sin(Tmpv2011(k))
Tmpv2012(k) =Tmpv002
Tmpv003 =Tmpv2012(k)**2
Tmpv2013(k) =dcoef
dcoef =Tmpv003
Tmpv001 =dcoef*dampcoef
Tmpv2014(k) =Tmpv001
Tmpv002 =muu(i,j)*Tmpv2014(k)
Tmpv003 =u(i,k,j) -u00(k)
Tmpv2015(k) =Tmpv002
Tmpv2016(k) =Tmpv003
! Remarked by Ning Pan, 2010-07-24
! Tmpv004 =Tmpv2015(k)*Tmpv2016(k)
! Tmpv005 =ru_tendf(i,k,j) -Tmpv004
!! ru_tendf(i,k,j) =Tmpv005
ENDDO
DO k =ktf, k1, -1
a_Tmpv5 =a_ru_tendf(i,k,j)
a_ru_tendf(i,k,j) =0.0
a_ru_tendf(i,k,j) =a_ru_tendf(i,k,j) +a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv2 =Tmpv2016(k)*a_Tmpv4
a_Tmpv3 =Tmpv2015(k)*a_Tmpv4
a_u(i,k,j) =a_u(i,k,j) +a_Tmpv3
a_u00(k) =a_u00(k) -a_Tmpv3
a_muu(i,j) =a_muu(i,j) +Tmpv2014(k)*a_Tmpv2
a_Tmpv1 =muu(i,j)*a_Tmpv2
a_dcoef =a_dcoef +dampcoef*a_Tmpv1
! a_dampcoef =a_dampcoef +dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
! dcoef =Tmpv2013(k) ! Remarked by Ning Pan, 2010-07-24
a_Tmpv3 =a_dcoef
a_dcoef =0.0
a_Tmpv2 =2.0*Tmpv2012(k)*a_Tmpv3
a_Tmpv1 =cos(Tmpv2011(k))*a_Tmpv2
! a_pii =a_pii +0.5*dcoef*a_Tmpv1 ! Remarked by Ning Pan, 2010-07-23
a_dcoef =a_dcoef +0.5*pii*a_Tmpv1
! dcoef =Tmpv2010(k) ! Remarked by Ning Pan, 2010-07-23
a_Tmpv3 =a_dcoef
a_dcoef =0.0
!STOP ! Remarked by Ning Pan, 2010-07-23
!REVISED BY WALLS
! (1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv209(k)))*0.5* =-a_Tmpv3
a_Tmpv2 = -(1.0 -(-1.0)*sign(1.0, 1.0 -Tmpv209(k)))*0.5*a_Tmpv3 ! Added by Ning Pan, 2010-07-23
a_Tmpv1 =a_Tmpv2/zdamp
! a_zdamp =a_zdamp -Tmpv208(k)/(zdamp*zdamp)*a_Tmpv2 ! Added by Ning Pan, 2010-07-23
a_ztop =a_ztop +a_Tmpv1
a_z00(k) =a_z00(k) -a_Tmpv1
ENDDO
DO k =ktf, k1, -1
! Added by Ning Pan, 2010-07-23
k2 = ktf
DO WHILE( z_base(k2) .gt. z00(k) )
k2 = k2 - 1
ENDDO
IF(k2+1.gt.ktf) THEN
a_Tmpv6 =a_u00(k)
a_u00(k) =0.0
! a_u_base(k2) =a_u_base(k2) +a_Tmpv6 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =a_Tmpv5/Tmpv203(k)
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv4 =-Tmpv202(k)/(Tmpv203(k)*Tmpv203(k))*a_Tmpv5
! a_z_base(k2) =a_z_base(k2) +a_Tmpv4
! a_z_base(k2-1) =a_z_base(k2-1) -a_Tmpv4
! a_Tmpv1 =Tmpv201(k)*a_Tmpv3
a_Tmpv2 =Tmpv200(k)*a_Tmpv3
a_z00(k) =a_z00(k) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_z_base(k2) =a_z_base(k2) -a_Tmpv2
! a_u_base(k2) =a_u_base(k2) +a_Tmpv1
! a_u_base(k2-1) =a_u_base(k2-1) -a_Tmpv1
else
a_Tmpv6 =a_u00(k)
a_u00(k) =0.0
! a_u_base(k2) =a_u_base(k2) +a_Tmpv6 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv5 =a_Tmpv6
a_Tmpv3 =a_Tmpv5/Tmpv207(k)
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv4 =-Tmpv206(k)/(Tmpv207(k)*Tmpv207(k))*a_Tmpv5
! a_z_base(k2+1) =a_z_base(k2+1) +a_Tmpv4
! a_z_base(k2) =a_z_base(k2) -a_Tmpv4
! a_Tmpv1 =Tmpv205(k)*a_Tmpv3
a_Tmpv2 =Tmpv204(k)*a_Tmpv3
a_z00(k) =a_z00(k) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_z_base(k2) =a_z_base(k2) -a_Tmpv2
! a_u_base(k2+1) =a_u_base(k2+1) +a_Tmpv1
! a_u_base(k2) =a_u_base(k2) -a_Tmpv1
endif
! Remarked by Ning Pan, 2010-07-23
! DO
! ENDDO
ENDDO
! DO i =min(ite, ide), its, -1 ! Remarked by Ning Pan, 2010-07-23
DO k = k1-1, ktf ! Added by Ning Pan, 2010-07-23
! Revised by Ning Pan, 2010-07-23
! a_z =a_z +a_z00(k1)
! a_z00(k1) =0.0
a_z =a_z +a_z00(k)
a_z00(k) =0.0
a_Tmpv9 =a_z
a_z =0.0
a_Tmpv8 =a_Tmpv9/g
a_Tmpv7 =0.25*a_Tmpv8
a_Tmpv6 =a_Tmpv7
! Revised by Ning Pan, 2010-07-23
! a_ph(i-1,k1+1,j) =a_ph(i-1,k1+1,j) +a_Tmpv7
a_ph(i-1,k+1,j) =a_ph(i-1,k+1,j) +a_Tmpv7
a_Tmpv5 =a_Tmpv6
! Revised by Ning Pan, 2010-07-23
! a_ph(i-1,k1,j) =a_ph(i-1,k1,j) +a_Tmpv6
a_ph(i-1,k,j) =a_ph(i-1,k,j) +a_Tmpv6
a_Tmpv4 =a_Tmpv5
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1+1,j) =a_ph(i,k1+1,j) +a_Tmpv5
a_ph(i,k+1,j) =a_ph(i,k+1,j) +a_Tmpv5
a_Tmpv3 =a_Tmpv4
! Revised by Ning Pan, 2010-07-23
! a_ph(i,k1,j) =a_ph(i,k1,j) +a_Tmpv4
a_ph(i,k,j) =a_ph(i,k,j) +a_Tmpv4
! Remarked by Ning Pan, 2010-07-23
! a_Tmpv2 =a_Tmpv3
! a_phb(i-1,k1+1,j) =a_phb(i-1,k1+1,j) +a_Tmpv3
! a_Tmpv1 =a_Tmpv2
! a_phb(i-1,k1,j) =a_phb(i-1,k1,j) +a_Tmpv2
! a_phb(i,k1,j) =a_phb(i,k1,j) +a_Tmpv1
! a_phb(i,k1+1,j) =a_phb(i,k1+1,j) +a_Tmpv1
ENDDO ! Added by Ning Pan, 2010-07-23
a_Tmpv5 =a_ztop
a_ztop =0.0
a_Tmpv4 =a_Tmpv5/g
a_Tmpv3 =0.5*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_ph(i-1,kde,j) =a_ph(i-1,kde,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_ph(i,kde,j) =a_ph(i,kde,j) +a_Tmpv2
! Remarked by Ning Pan, 2010-07-23
! a_phb(i,kde,j) =a_phb(i,kde,j) +a_Tmpv1
! a_phb(i-1,kde,j) =a_phb(i-1,kde,j) +a_Tmpv1
ENDDO
ENDDO
!LPB[0]
! pii =2.0*Asin(1.0)
! ktf =min(kte, kde-1)
! a_pii =0.0 ! Remarked by Ning Pan, 2010-07-23
END SUBROUTINE a_rk_rayleigh_damp
SUBROUTINE a_sixth_order_diffusion(name,field,a_field,tendency,a_tendency,mu, &
a_mu,dt,config_flags,diff_6th_opt,diff_6th_factor,ids, &
ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
TYPE(grid_config_rec_type) :: config_flags
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,a_tendency
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,a_field
REAL,DIMENSION(ims:ime,jms:jme) :: mu,a_mu
REAL :: dt
REAL :: diff_6th_factor
INTEGER :: diff_6th_opt
CHARACTER (LEN=1) :: name
INTEGER :: i,j,k,i_start,i_end,j_start,j_end,k_start,k_end,ktf
REAL :: dflux_x_p0,a_dflux_x_p0,dflux_y_p0,a_dflux_y_p0,dflux_x_p1, &
a_dflux_x_p1,dflux_y_p1,a_dflux_y_p1,tendency_x,a_tendency_x,tendency_y, &
a_tendency_y,mu_avg_p0,a_mu_avg_p0,mu_avg_p1,a_mu_avg_p1,diff_6th_coef
LOGICAL :: specified
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3,Tmpv003,a_Tmpv4,Tmpv004, &
a_Tmpv5,Tmpv005,a_Tmpv6,Tmpv006,a_Tmpv7,Tmpv007,Tmpv300, Tmpv301,Tmpv3011,Tmpv3012
!ADDED BY WALLS
! REAL :: a_diff_6th_coef ! Remarked by Ning Pan, 2010-07-23
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
diff_6th_coef = diff_6th_factor * 0.015625 / ( 2.0 * dt )
ktf = MIN( kte, kde-1 )
IF ( name .EQ. 'u' ) THEN
i_start = its
i_end = ite
j_start = jts
j_end = MIN(jde-1,jte)
k_start = kts
k_end = ktf
ELSE IF ( name .EQ. 'v' ) THEN
i_start = its
i_end = MIN(ide-1,ite)
j_start = jts
j_end = jte
k_start = kts
k_end = ktf
ELSE IF ( name .EQ. 'w' ) THEN
i_start = its
i_end = MIN(ide-1,ite)
j_start = jts
j_end = MIN(jde-1,jte)
k_start = kts+1
k_end = ktf
ELSE
i_start = its
i_end = MIN(ide-1,ite)
j_start = jts
j_end = MIN(jde-1,jte)
k_start = kts
k_end = ktf
ENDIF
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
a_dflux_x_p0 =0.0
a_dflux_y_p0 =0.0
a_dflux_x_p1 =0.0
a_dflux_y_p1 =0.0
a_tendency_x =0.0
a_tendency_y =0.0
a_mu_avg_p0 =0.0
a_mu_avg_p1 =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[2]
DO j =j_end, j_start, -1
DO k =k_end, k_start, -1
DO i =i_end, i_start, -1
Tmpv001 =field(i,k,j) -field(i,k,j-1)
Tmpv002 =10.0*Tmpv001
Tmpv003 =field(i,k,j+1) -field(i,k,j-2)
Tmpv004 =5.0*Tmpv003
Tmpv005 =Tmpv002 -Tmpv004
Tmpv006 =field(i,k,j+2) -field(i,k,j-3)
Tmpv007 =Tmpv005 +Tmpv006
dflux_y_p0 =Tmpv007
Tmpv3011 =dflux_y_p0
Tmpv001 =field(i,k,j+1) -field(i,k,j)
Tmpv002 =10.0*Tmpv001
Tmpv003 =field(i,k,j+2) -field(i,k,j-1)
Tmpv004 =5.0*Tmpv003
Tmpv005 =Tmpv002 -Tmpv004
Tmpv006 =field(i,k,j+3) -field(i,k,j-2)
Tmpv007 =Tmpv005 +Tmpv006
dflux_y_p1 =Tmpv007
Tmpv3012 =dflux_y_p1
IF( diff_6th_opt .EQ. 2 ) THEN
IF( dflux_y_p0 * ( field(i,k,j )-field(i,k,j-1) ) .LE. 0.0 ) THEN
dflux_y_p0 =0.0
END IF
IF( dflux_y_p1 * ( field(i,k,j+1)-field(i,k,j ) ) .LE. 0.0 ) THEN
dflux_y_p1 =0.0
END IF
END IF
IF( name .EQ. 'u' ) THEN
Tmpv001 =mu(i-1,j-1) +mu(i,j-1)
Tmpv002 =Tmpv001 +mu(i-1,j)
Tmpv003 =Tmpv002 +mu(i,j)
Tmpv004 =0.25*Tmpv003
mu_avg_p0 =Tmpv004
Tmpv001 =mu(i-1,j) +mu(i,j)
Tmpv002 =Tmpv001 +mu(i-1,j+1)
Tmpv003 =Tmpv002 +mu(i,j+1)
Tmpv004 =0.25*Tmpv003
mu_avg_p1 =Tmpv004
ELSE IF( name .EQ. 'v' ) THEN
mu_avg_p0 =mu(i,j-1)
mu_avg_p1 =mu(i,j)
ELSE
Tmpv001 =mu(i,j-1) +mu(i,j)
Tmpv002 =0.5*Tmpv001
mu_avg_p0 =Tmpv002
Tmpv001 =mu(i,j) +mu(i,j+1)
Tmpv002 =0.5*Tmpv001
mu_avg_p1 =Tmpv002
END IF
a_Tmpv2 =a_tendency(i,k,j)
a_tendency(i,k,j) =0.0
a_Tmpv1 =a_Tmpv2
a_tendency_y =a_tendency_y +a_Tmpv2
a_tendency(i,k,j) =a_tendency(i,k,j) +a_Tmpv1
a_tendency_x =a_tendency_x +a_Tmpv1
a_Tmpv4 =a_tendency_y
a_tendency_y =0.0
! a_diff_6th_coef =a_diff_6th_coef +Tmpv3021(i,k)*a_Tmpv4 ! Remarked by Ning Pan, 2010-07-23
a_Tmpv3 =diff_6th_coef*a_Tmpv4
a_Tmpv1 =a_Tmpv3
a_Tmpv2 =-a_Tmpv3
a_mu_avg_p0 =a_mu_avg_p0 +dflux_y_p0*a_Tmpv2
a_dflux_y_p0 =a_dflux_y_p0 +mu_avg_p0*a_Tmpv2
a_mu_avg_p1 =a_mu_avg_p1 +dflux_y_p1*a_Tmpv1
a_dflux_y_p1 =a_dflux_y_p1 +mu_avg_p1*a_Tmpv1
! Added by Ning Pan, 2010-07-23
IF( name .EQ. 'u' ) THEN
a_Tmpv4 =a_mu_avg_p1
a_mu_avg_p1 =0.0
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_mu(i,j+1) =a_mu(i,j+1) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mu(i-1,j+1) =a_mu(i-1,j+1) +a_Tmpv2
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_Tmpv4 =a_mu_avg_p0
a_mu_avg_p0 =0.0
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_mu(i,j) =a_mu(i,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv2
a_mu(i-1,j-1) =a_mu(i-1,j-1) +a_Tmpv1
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
ELSE IF( name .EQ. 'v' ) THEN
a_mu(i,j) =a_mu(i,j) +a_mu_avg_p1
a_mu_avg_p1 =0.0
a_mu(i,j-1) =a_mu(i,j-1) +a_mu_avg_p0
a_mu_avg_p0 =0.0
ELSE
a_Tmpv2 =a_mu_avg_p1
a_mu_avg_p1 =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i,j+1) =a_mu(i,j+1) +a_Tmpv1
a_Tmpv2 =a_mu_avg_p0
a_mu_avg_p0 =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
END IF
dflux_y_p0 = Tmpv3011
dflux_y_p1 = Tmpv3012
IF( diff_6th_opt .EQ. 2 ) THEN
IF( dflux_y_p1 * ( field(i,k,j+1)-field(i,k,j ) ) .LE. 0.0 ) THEN
a_dflux_y_p1 =0.0
END IF
IF( dflux_y_p0 * ( field(i,k,j )-field(i,k,j-1) ) .LE. 0.0 ) THEN
a_dflux_y_p0 =0.0
END IF
END IF
a_Tmpv7 =a_dflux_y_p1
a_dflux_y_p1 =0.0
a_Tmpv5 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_field(i,k,j+3) =a_field(i,k,j+3) +a_Tmpv6
a_field(i,k,j-2) =a_field(i,k,j-2) -a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv3 =5.0*a_Tmpv4
a_field(i,k,j+2) =a_field(i,k,j+2) +a_Tmpv3
a_field(i,k,j-1) =a_field(i,k,j-1) -a_Tmpv3
a_Tmpv1 =10.0*a_Tmpv2
a_field(i,k,j+1) =a_field(i,k,j+1) +a_Tmpv1
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv1
a_Tmpv7 =a_dflux_y_p0
a_dflux_y_p0 =0.0
a_Tmpv5 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_field(i,k,j+2) =a_field(i,k,j+2) +a_Tmpv6
a_field(i,k,j-3) =a_field(i,k,j-3) -a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv3 =5.0*a_Tmpv4
a_field(i,k,j+1) =a_field(i,k,j+1) +a_Tmpv3
a_field(i,k,j-2) =a_field(i,k,j-2) -a_Tmpv3
a_Tmpv1 =10.0*a_Tmpv2
a_field(i,k,j) =a_field(i,k,j) +a_Tmpv1
a_field(i,k,j-1) =a_field(i,k,j-1) -a_Tmpv1
Tmpv001 =field(i,k,j) -field(i-1,k,j)
Tmpv002 =10.0*Tmpv001
Tmpv003 =field(i+1,k,j) -field(i-2,k,j)
Tmpv004 =5.0*Tmpv003
Tmpv005 =Tmpv002 -Tmpv004
Tmpv006 =field(i+2,k,j) -field(i-3,k,j)
Tmpv007 =Tmpv005 +Tmpv006
dflux_x_p0 =Tmpv007
Tmpv300 =dflux_x_p0
Tmpv001 =field(i+1,k,j) -field(i,k,j)
Tmpv002 =10.0*Tmpv001
Tmpv003 =field(i+2,k,j) -field(i-1,k,j)
Tmpv004 =5.0*Tmpv003
Tmpv005 =Tmpv002 -Tmpv004
Tmpv006 =field(i+3,k,j) -field(i-2,k,j)
Tmpv007 =Tmpv005 +Tmpv006
dflux_x_p1 =Tmpv007
Tmpv301 =dflux_x_p1
IF( diff_6th_opt .EQ. 2 ) THEN
IF( dflux_x_p0 * ( field(i ,k,j)-field(i-1,k,j) ) .LE. 0.0 ) THEN
dflux_x_p0 =0.0
END IF
IF( dflux_x_p1 * ( field(i+1,k,j)-field(i ,k,j) ) .LE. 0.0 ) THEN
dflux_x_p1 =0.0
END IF
END IF
IF( name .EQ. 'u' ) THEN
mu_avg_p0 =mu(i-1,j)
mu_avg_p1 =mu(i,j)
ELSE IF( name .EQ. 'v' ) THEN
Tmpv001 =mu(i-1,j-1) +mu(i,j-1)
Tmpv002 =Tmpv001 +mu(i-1,j)
Tmpv003 =Tmpv002 +mu(i,j)
Tmpv004 =0.25*Tmpv003
mu_avg_p0 =Tmpv004
Tmpv001 =mu(i,j-1) +mu(i+1,j-1)
Tmpv002 =Tmpv001 +mu(i,j)
Tmpv003 =Tmpv002 +mu(i+1,j)
Tmpv004 =0.25*Tmpv003
mu_avg_p1 =Tmpv004
ELSE
Tmpv001 =mu(i-1,j) +mu(i,j)
Tmpv002 =0.5*Tmpv001
mu_avg_p0 =Tmpv002
Tmpv001 =mu(i,j) +mu(i+1,j)
Tmpv002 =0.5*Tmpv001
mu_avg_p1 =Tmpv002
END IF
a_Tmpv4 =a_tendency_x
a_tendency_x =0.0
a_Tmpv3 =diff_6th_coef*a_Tmpv4
a_Tmpv1 =a_Tmpv3
a_Tmpv2 =-a_Tmpv3
a_mu_avg_p0 =a_mu_avg_p0 +dflux_x_p0*a_Tmpv2
a_dflux_x_p0 =a_dflux_x_p0 +mu_avg_p0*a_Tmpv2
a_mu_avg_p1 =a_mu_avg_p1 +dflux_x_p1*a_Tmpv1
a_dflux_x_p1 =a_dflux_x_p1 +mu_avg_p1*a_Tmpv1
IF( name .EQ. 'u' ) THEN
a_mu(i,j) =a_mu(i,j) +a_mu_avg_p1
a_mu_avg_p1 =0.0
a_mu(i-1,j) =a_mu(i-1,j) +a_mu_avg_p0
a_mu_avg_p0 =0.0
ELSE IF( name .EQ. 'v' ) THEN
a_Tmpv4 =a_mu_avg_p1
a_mu_avg_p1 =0.0
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_mu(i+1,j) =a_mu(i+1,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv2
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
a_mu(i+1,j-1) =a_mu(i+1,j-1) +a_Tmpv1
a_Tmpv4 =a_mu_avg_p0
a_mu_avg_p0 =0.0
a_Tmpv3 =0.25*a_Tmpv4
a_Tmpv2 =a_Tmpv3
a_mu(i,j) =a_mu(i,j) +a_Tmpv3
a_Tmpv1 =a_Tmpv2
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv2
a_mu(i-1,j-1) =a_mu(i-1,j-1) +a_Tmpv1
a_mu(i,j-1) =a_mu(i,j-1) +a_Tmpv1
ELSE
a_Tmpv2 =a_mu_avg_p1
a_mu_avg_p1 =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
a_mu(i+1,j) =a_mu(i+1,j) +a_Tmpv1
a_Tmpv2 =a_mu_avg_p0
a_mu_avg_p0 =0.0
a_Tmpv1 =0.5*a_Tmpv2
a_mu(i-1,j) =a_mu(i-1,j) +a_Tmpv1
a_mu(i,j) =a_mu(i,j) +a_Tmpv1
END IF
dflux_x_p0 = Tmpv300
dflux_x_p1 = Tmpv301
IF( diff_6th_opt .EQ. 2 ) THEN
IF( dflux_x_p1 * ( field(i+1,k,j)-field(i ,k,j) ) .LE. 0.0 ) THEN
a_dflux_x_p1 =0.0
END IF
IF( dflux_x_p0 * ( field(i ,k,j)-field(i-1,k,j) ) .LE. 0.0 ) THEN
a_dflux_x_p0 =0.0
END IF
END IF
a_Tmpv7 =a_dflux_x_p1
a_dflux_x_p1 =0.0
a_Tmpv5 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_field(i+3,k,j) =a_field(i+3,k,j) +a_Tmpv6
a_field(i-2,k,j) =a_field(i-2,k,j) -a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv3 =5.0*a_Tmpv4
a_field(i+2,k,j) =a_field(i+2,k,j) +a_Tmpv3
a_field(i-1,k,j) =a_field(i-1,k,j) -a_Tmpv3
a_Tmpv1 =10.0*a_Tmpv2
a_field(i+1,k,j) =a_field(i+1,k,j) +a_Tmpv1
a_field(i,k,j) =a_field(i,k,j) -a_Tmpv1
a_Tmpv7 =a_dflux_x_p0
a_dflux_x_p0 =0.0
a_Tmpv5 =a_Tmpv7
a_Tmpv6 =a_Tmpv7
a_field(i+2,k,j) =a_field(i+2,k,j) +a_Tmpv6
a_field(i-3,k,j) =a_field(i-3,k,j) -a_Tmpv6
a_Tmpv2 =a_Tmpv5
a_Tmpv4 =-a_Tmpv5
a_Tmpv3 =5.0*a_Tmpv4
a_field(i+1,k,j) =a_field(i+1,k,j) +a_Tmpv3
a_field(i-2,k,j) =a_field(i-2,k,j) -a_Tmpv3
a_Tmpv1 =10.0*a_Tmpv2
a_field(i,k,j) =a_field(i,k,j) +a_Tmpv1
a_field(i-1,k,j) =a_field(i-1,k,j) -a_Tmpv1
ENDDO
ENDDO
ENDDO
END SUBROUTINE a_sixth_order_diffusion
END MODULE a_module_big_step_utilities_em