! ====================================================================================== ! This file was generated by the version 5.3.5 of DFT on 07/13/2010. The differentiation ! transforming system(DFT) was jointly developed and sponsored by LASG of IAP(1998-2010) ! and LSEC of ICMSEC, AMSS(2001-2003) ! The copyright of the DFT system was declared by Walls at LASG, 1998-2010 ! ====================================================================================== #ifndef DOUBLE_PRECISION # define VPOWX vspowx # define VPOW vspow #else # define VPOWX vpowx # define VPOW vpow #endif MODULE g_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 CONTAINS ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of calc_mu_uv in forward (tangent) mode: ! variations of useful results: muu muv ! with respect to varying inputs: muu muv mu ! RW status of diff variables: muu:in-out muv:in-out mu:in SUBROUTINE G_CALC_MU_UV(config_flags, mu, mud, mub, muu, muud, muv, muvd& & , 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), INTENT(OUT) :: muu, muv REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: muud, muvd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, mub REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mud ! local stuff INTEGER :: i, j, itf, jtf, im, jm INTRINSIC MIN ! ! ! 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 DO i=its,itf muud(i, j) = 0.5*(mud(i, j)+mud(i-1, j)) muu(i, j) = 0.5*(mu(i, j)+mu(i-1, j)+mub(i, j)+mub(i-1, j)) END DO END DO ELSE IF (its .EQ. ids .AND. ite .NE. ide) THEN DO j=jts,jtf DO i=its+1,itf muud(i, j) = 0.5*(mud(i, j)+mud(i-1, j)) muu(i, j) = 0.5*(mu(i, j)+mu(i-1, j)+mub(i, j)+mub(i-1, j)) END DO END DO i = its im = its IF (config_flags%periodic_x) im = its - 1 DO j=jts,jtf ! muu(i,j) = mu(i,j) +mub(i,j) ! fix for periodic b.c., 13 march 2004, wcs muud(i, j) = 0.5*(mud(i, j)+mud(im, j)) muu(i, j) = 0.5*(mu(i, j)+mu(im, j)+mub(i, j)+mub(im, j)) END DO ELSE IF (its .NE. ids .AND. ite .EQ. ide) THEN DO j=jts,jtf DO i=its,itf-1 muud(i, j) = 0.5*(mud(i, j)+mud(i-1, j)) muu(i, j) = 0.5*(mu(i, j)+mu(i-1, j)+mub(i, j)+mub(i-1, j)) END DO END DO i = ite im = ite - 1 IF (config_flags%periodic_x) im = ite DO j=jts,jtf ! muu(i,j) = mu(i-1,j) +mub(i-1,j) ! fix for periodic b.c., 13 march 2004, wcs muud(i, j) = 0.5*(mud(i-1, j)+mud(im, j)) muu(i, j) = 0.5*(mu(i-1, j)+mu(im, j)+mub(i-1, j)+mub(im, j)) END DO ELSE IF (its .EQ. ids .AND. ite .EQ. ide) THEN DO j=jts,jtf DO i=its+1,itf-1 muud(i, j) = 0.5*(mud(i, j)+mud(i-1, j)) muu(i, j) = 0.5*(mu(i, j)+mu(i-1, j)+mub(i, j)+mub(i-1, j)) END DO END DO i = its im = its IF (config_flags%periodic_x) im = its - 1 DO j=jts,jtf ! muu(i,j) = mu(i,j) +mub(i,j) ! fix for periodic b.c., 13 march 2004, wcs muud(i, j) = 0.5*(mud(i, j)+mud(im, j)) muu(i, j) = 0.5*(mu(i, j)+mu(im, j)+mub(i, j)+mub(im, j)) END DO i = ite im = ite - 1 IF (config_flags%periodic_x) im = ite DO j=jts,jtf ! muu(i,j) = mu(i-1,j) +mub(i-1,j) ! fix for periodic b.c., 13 march 2004, wcs muud(i, j) = 0.5*(mud(i-1, j)+mud(im, j)) muu(i, j) = 0.5*(mu(i-1, j)+mu(im, j)+mub(i-1, j)+mub(im, j)) END DO 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 DO i=its,itf muvd(i, j) = 0.5*(mud(i, j)+mud(i, j-1)) muv(i, j) = 0.5*(mu(i, j)+mu(i, j-1)+mub(i, j)+mub(i, j-1)) END DO END DO ELSE IF (jts .EQ. jds .AND. jte .NE. jde) THEN DO j=jts+1,jtf DO i=its,itf muvd(i, j) = 0.5*(mud(i, j)+mud(i, j-1)) muv(i, j) = 0.5*(mu(i, j)+mu(i, j-1)+mub(i, j)+mub(i, j-1)) END DO END DO j = jts jm = jts IF (config_flags%periodic_y) jm = jts - 1 DO i=its,itf ! muv(i,j) = mu(i,j) +mub(i,j) ! fix for periodic b.c., 13 march 2004, wcs muvd(i, j) = 0.5*(mud(i, j)+mud(i, jm)) muv(i, j) = 0.5*(mu(i, j)+mu(i, jm)+mub(i, j)+mub(i, jm)) END DO ELSE IF (jts .NE. jds .AND. jte .EQ. jde) THEN DO j=jts,jtf-1 DO i=its,itf muvd(i, j) = 0.5*(mud(i, j)+mud(i, j-1)) muv(i, j) = 0.5*(mu(i, j)+mu(i, j-1)+mub(i, j)+mub(i, j-1)) END DO END DO j = jte jm = jte - 1 IF (config_flags%periodic_y) jm = jte DO i=its,itf ! comment out the following statement. NPan 05/26/10 ! muv(i,j) = mu(i,j-1) +mub(i,j-1) ! fix for periodic b.c., 13 march 2004, wcs muvd(i, j) = 0.5*(mud(i, j-1)+mud(i, jm)) muv(i, j) = 0.5*(mu(i, j-1)+mu(i, jm)+mub(i, j-1)+mub(i, jm)) END DO ELSE IF (jts .EQ. jds .AND. jte .EQ. jde) THEN DO j=jts+1,jtf-1 DO i=its,itf muvd(i, j) = 0.5*(mud(i, j)+mud(i, j-1)) muv(i, j) = 0.5*(mu(i, j)+mu(i, j-1)+mub(i, j)+mub(i, j-1)) END DO END DO j = jts jm = jts IF (config_flags%periodic_y) jm = jts - 1 DO i=its,itf ! muv(i,j) = mu(i,j) +mub(i,j) ! fix for periodic b.c., 13 march 2004, wcs muvd(i, j) = 0.5*(mud(i, j)+mud(i, jm)) muv(i, j) = 0.5*(mu(i, j)+mu(i, jm)+mub(i, j)+mub(i, jm)) END DO j = jte jm = jte - 1 IF (config_flags%periodic_y) jm = jte DO i=its,itf ! muv(i,j) = mu(i,j-1) +mub(i,j-1) ! fix for periodic b.c., 13 march 2004, wcs muvd(i, j) = 0.5*(mud(i, j-1)+mud(i, jm)) muv(i, j) = 0.5*(mu(i, j-1)+mu(i, jm)+mub(i, j-1)+mub(i, jm)) END DO END IF END SUBROUTINE G_CALC_MU_UV SUBROUTINE g_calc_mu_uv_1(config_flags,mu,g_mu,muu,g_muu,muv,g_muv,ids, & ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1 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,g_muu,muv,g_muv REAL,DIMENSION(ims:ime,jms:jme) :: mu,g_mu INTEGER :: i,j,itf,jtf,im,jm itf =ite jtf =min(jte,jde-1) IF( ( its .NE. ids ) .AND. ( ite .NE. ide ) ) THEN DO j =jts,jtf DO i =its,itf g_muu(i,j) =0.5*(g_mu(i,j) +g_mu(i-1,j)) muu(i,j) =0.5*(mu(i,j) +mu(i-1,j)) ENDDO ENDDO ELSE IF( ( its .EQ. ids ) .AND. ( ite .NE. ide ) ) THEN DO j =jts,jtf DO i =its+1,itf g_muu(i,j) =0.5*(g_mu(i,j) +g_mu(i-1,j)) muu(i,j) =0.5*(mu(i,j) +mu(i-1,j)) ENDDO ENDDO i =its im =its if(config_flags%periodic_x) im =its-1 DO j =jts,jtf g_muu(i,j) =0.5*(g_mu(i,j) +g_mu(im,j)) muu(i,j) =0.5*(mu(i,j) +mu(im,j)) ENDDO ELSE IF( ( its .NE. ids ) .AND. ( ite .EQ. ide ) ) THEN DO j =jts,jtf DO i =its,itf-1 g_muu(i,j) =0.5*(g_mu(i,j) +g_mu(i-1,j)) muu(i,j) =0.5*(mu(i,j) +mu(i-1,j)) ENDDO ENDDO i =ite im =ite-1 if(config_flags%periodic_x) im =ite DO j =jts,jtf g_muu(i,j) =0.5*(g_mu(i-1,j) +g_mu(im,j)) muu(i,j) =0.5*(mu(i-1,j) +mu(im,j)) ENDDO ELSE IF( ( its .EQ. ids ) .AND. ( ite .EQ. ide ) ) THEN DO j =jts,jtf DO i =its+1,itf-1 g_muu(i,j) =0.5*(g_mu(i,j) +g_mu(i-1,j)) muu(i,j) =0.5*(mu(i,j) +mu(i-1,j)) ENDDO ENDDO i =its im =its if(config_flags%periodic_x) im =its-1 DO j =jts,jtf g_muu(i,j) =0.5*(g_mu(i,j) +g_mu(im,j)) muu(i,j) =0.5*(mu(i,j) +mu(im,j)) ENDDO i =ite im =ite-1 if(config_flags%periodic_x) im =ite DO j =jts,jtf g_muu(i,j) =0.5*(g_mu(i-1,j) +g_mu(im,j)) muu(i,j) =0.5*(mu(i-1,j) +mu(im,j)) ENDDO END IF itf =min(ite,ide-1) jtf =jte IF( ( jts .NE. jds ) .AND. ( jte .NE. jde ) ) THEN DO j =jts,jtf DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j) +g_mu(i,j-1)) muv(i,j) =0.5*(mu(i,j) +mu(i,j-1)) ENDDO ENDDO ELSE IF( ( jts .EQ. jds ) .AND. ( jte .NE. jde ) ) THEN DO j =jts+1,jtf DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j) +g_mu(i,j-1)) muv(i,j) =0.5*(mu(i,j) +mu(i,j-1)) ENDDO ENDDO j =jts jm =jts if(config_flags%periodic_y) jm =jts-1 DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j) +g_mu(i,jm)) muv(i,j) =0.5*(mu(i,j) +mu(i,jm)) ENDDO ELSE IF( ( jts .NE. jds ) .AND. ( jte .EQ. jde ) ) THEN DO j =jts,jtf-1 DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j) +g_mu(i,j-1)) muv(i,j) =0.5*(mu(i,j) +mu(i,j-1)) ENDDO ENDDO j =jte jm =jte-1 if(config_flags%periodic_y) jm =jte DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j-1) +g_mu(i,jm)) muv(i,j) =0.5*(mu(i,j-1) +mu(i,jm)) ENDDO ELSE IF( ( jts .EQ. jds ) .AND. ( jte .EQ. jde ) ) THEN DO j =jts+1,jtf-1 DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j) +g_mu(i,j-1)) muv(i,j) =0.5*(mu(i,j) +mu(i,j-1)) ENDDO ENDDO j =jts jm =jts if(config_flags%periodic_y) jm =jts-1 DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j) +g_mu(i,jm)) muv(i,j) =0.5*(mu(i,j) +mu(i,jm)) ENDDO j =jte jm =jte-1 if(config_flags%periodic_y) jm =jte DO i =its,itf g_muv(i,j) =0.5*(g_mu(i,j-1) +g_mu(i,jm)) muv(i,j) =0.5*(mu(i,j-1) +mu(i,jm)) ENDDO END IF END SUBROUTINE g_calc_mu_uv_1 ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of couple_momentum in forward (tangent) mode: ! variations of useful results: ru rv rw ! with respect to varying inputs: u v w ru rv rw mut muu muv ! RW status of diff variables: u:in v:in w:in ru:in-out rv:in-out ! rw:in-out mut:in muu:in muv:in ! Map scale factor comments for this routine: ! Locally not changed, but sent the correct map scale factors ! from module_em (msfuy, msfvx, msfty) SUBROUTINE G_COUPLE_MOMENTUM(muu, muud, ru, rud, u, ud, msfu, muv, muvd& & , rv, rvd, v, vd, msfv, msfv_inv, mut, mutd, rw, rwd, w, wd, 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), INTENT(OUT) :: ru, rv, rw REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: rud, rvd, & & rwd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: muu, muv, mut REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: muud, muvd, mutd 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), INTENT(IN) :: ud, vd, wd ! Local data INTEGER :: i, j, k, itf, jtf, ktf 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 DO i=its,itf rud(i, k, j) = (ud(i, k, j)*muu(i, j)+u(i, k, j)*muud(i, j))/& & msfu(i, j) ru(i, k, j) = u(i, k, j)*muu(i, j)/msfu(i, j) END DO END DO END DO IF (ite .GT. ide - 1) THEN itf = ide - 1 ELSE itf = ite END IF jtf = jte DO j=jts,jtf DO k=kts,ktf DO i=its,itf rvd(i, k, j) = msfv_inv(i, j)*(vd(i, k, j)*muv(i, j)+v(i, k, j)*& & muvd(i, j)) rv(i, k, j) = v(i, k, j)*muv(i, j)*msfv_inv(i, j) END DO END DO END DO 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=jts,jtf DO k=kts,kte DO i=its,itf rwd(i, k, j) = (wd(i, k, j)*mut(i, j)+w(i, k, j)*mutd(i, j))/& & msft(i, j) rw(i, k, j) = w(i, k, j)*mut(i, j)/msft(i, j) END DO END DO END DO END SUBROUTINE G_COUPLE_MOMENTUM SUBROUTINE g_calc_ww_cp(u,g_u,v,g_v,mup,g_mup,mub,ww,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5, & g_Tmpv5,Tmpv6,g_Tmpv6,Tmpv7,g_Tmpv7,Tmpv8,g_Tmpv8 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,g_u,v,g_v REAL,DIMENSION(ims:ime,jms:jme) :: mup,g_mup,mub,msftx,msfty,msfux,msfuy,msfvx, & msfvy,msfvx_inv REAL,DIMENSION(kms:kme) :: dnw REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ww,g_ww REAL :: rdx,rdy INTEGER :: i,j,k,itf,jtf,ktf REAL,DIMENSION(its:ite) :: dmdt,g_dmdt REAL,DIMENSION(its:ite,kts:kte) :: divv,g_divv REAL,DIMENSION(its:ite+1,jts:jte+1) :: muu,g_muu,muv,g_muv jtf =min(jte,jde-1) ktf =min(kte,kde-1) itf =min(ite,ide-1) DO j =jts,jtf DO i =its,min(ite+1,ide) g_muu(i,j) =0.5*(g_mup(i,j) +g_mup(i-1,j))/msfuy(i,j) muu(i,j) =0.5*(mup(i,j) +mub(i,j) +mup(i-1,j) +mub(i-1,j))/msfuy(i,j) ENDDO ENDDO DO j =jts,min(jte+1,jde) DO i =its,itf g_muv(i,j) =0.5*(g_mup(i,j) +g_mup(i,j-1))*msfvx_inv(i,j) 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 DO j =jts,jtf DO i =its,ite g_dmdt(i) =0.0 dmdt(i) =0. g_ww(i,1,j) =0.0 ww(i,1,j) =0. g_ww(i,kte,j) =0.0 ww(i,kte,j) =0. ENDDO DO k =kts,ktf DO i =its,itf g_Tmpv1 =muu(i+1,j)*g_u(i+1,k,j) +g_muu(i+1,j)*u(i+1,k,j) Tmpv1 =muu(i+1,j)*u(i+1,k,j) g_Tmpv2 =muu(i,j)*g_u(i,k,j) +g_muu(i,j)*u(i,k,j) Tmpv2 =muu(i,j)*u(i,k,j) g_Tmpv3 =muv(i,j+1)*g_v(i,k,j+1) +g_muv(i,j+1)*v(i,k,j+1) Tmpv3 =muv(i,j+1)*v(i,k,j+1) g_Tmpv4 =muv(i,j)*g_v(i,k,j) +g_muv(i,j)*v(i,k,j) Tmpv4 =muv(i,j)*v(i,k,j) g_divv(i,k) =msftx(i,j) *dnw(k)*(rdx*(g_Tmpv1 -g_Tmpv2) +rdy*(g_Tmpv3 - & g_Tmpv4)) divv(i,k) =msftx(i,j) *dnw(k)*(rdx*(Tmpv1 -Tmpv2) +rdy*(Tmpv3 -Tmpv4)) g_dmdt(i) =g_dmdt(i) +g_divv(i,k) dmdt(i) =dmdt(i) +divv(i,k) ENDDO ENDDO DO k =2,ktf DO i =its,itf g_ww(i,k,j) =g_ww(i,k-1,j) -dnw(k-1)*g_dmdt(i) -g_divv(i,k-1) ww(i,k,j) =ww(i,k-1,j) -dnw(k-1)*dmdt(i) -divv(i,k-1) ENDDO ENDDO ENDDO END SUBROUTINE g_calc_ww_cp ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of calc_cq in forward (tangent) mode: ! variations of useful results: cqu cqv cqw ! with respect to varying inputs: cqu cqv cqw moist ! RW status of diff variables: cqu:in-out cqv:in-out cqw:in-out ! moist:in SUBROUTINE G_CALC_CQ(moist, moistd, cqu, cqud, cqv, cqvd, cqw, cqwd, & & 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), INTENT(IN) :: & & moistd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: cqu, cqv, & & cqw REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: cqud, cqvd& & , cqwd ! Local stuff ! Changes from Larry Meadows, Intel Corp. Improve vectorization of this routine REAL :: qtot(its:ite) REAL :: qtotd(its:ite) INTEGER :: i, j, k, itf, jtf, ktf, ispe 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 qtot = 0. qtotd = 0.0 DO ispe=param_first_scalar,n_moist DO i=its,itf qtotd(i) = qtotd(i) + moistd(i, k, j, ispe) + moistd(i-1, k& & , j, ispe) qtot(i) = qtot(i) + moist(i, k, j, ispe) + moist(i-1, k, j, & & ispe) END DO END DO DO i=its,itf cqud(i, k, j) = -(0.5*qtotd(i)/(1.+0.5*qtot(i))**2) cqu(i, k, j) = 1./(1.+0.5*qtot(i)) END DO END DO END DO IF (ite .GT. ide - 1) THEN itf = ide - 1 ELSE itf = ite END IF jtf = jte DO j=jts,jtf DO k=kts,ktf qtot = 0. qtotd = 0.0 DO ispe=param_first_scalar,n_moist DO i=its,itf qtotd(i) = qtotd(i) + moistd(i, k, j, ispe) + moistd(i, k, j& & -1, ispe) qtot(i) = qtot(i) + moist(i, k, j, ispe) + moist(i, k, j-1, & & ispe) END DO END DO DO i=its,itf cqvd(i, k, j) = -(0.5*qtotd(i)/(1.+0.5*qtot(i))**2) cqv(i, k, j) = 1./(1.+0.5*qtot(i)) END DO END DO END DO 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=jts,jtf DO k=kts+1,ktf qtot = 0. qtotd = 0.0 DO ispe=param_first_scalar,n_moist DO i=its,itf qtotd(i) = qtotd(i) + moistd(i, k, j, ispe) + moistd(i, k-1& & , j, ispe) qtot(i) = qtot(i) + moist(i, k, j, ispe) + moist(i, k-1, j, & & ispe) END DO END DO DO i=its,itf cqwd(i, k, j) = 0.5*qtotd(i) cqw(i, k, j) = 0.5*qtot(i) END DO 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 DO i=its,itf cqud(i, k, j) = 0.0 cqu(i, k, j) = 1. END DO END DO END DO IF (ite .GT. ide - 1) THEN itf = ide - 1 ELSE itf = ite END IF jtf = jte DO j=jts,jtf DO k=kts,ktf DO i=its,itf cqvd(i, k, j) = 0.0 cqv(i, k, j) = 1. END DO END DO END DO 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=jts,jtf DO k=kts+1,ktf DO i=its,itf cqwd(i, k, j) = 0.0 cqw(i, k, j) = 0. END DO END DO END DO END IF END SUBROUTINE G_CALC_CQ SUBROUTINE g_calc_alt(alt,g_alt,al,g_al,alb,ids,ide,jds,jde,kds,kde,ims,ime, & jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1 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,g_al REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: alt,g_alt INTEGER :: i,j,k,itf,jtf,ktf 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 g_alt(i,k,j) =g_al(i,k,j) alt(i,k,j) =al(i,k,j) +alb(i,k,j) ENDDO ENDDO ENDDO END SUBROUTINE g_calc_alt ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of calc_p_rho_phi in forward (tangent) mode: ! variations of useful results: p al ph ! with respect to varying inputs: p al t muts ph moist mu ! RW status of diff variables: p:in-out al:in-out t:in muts:in ! ph:in-out moist:in mu:in SUBROUTINE G_CALC_P_RHO_PHI(moist, moistd, n_moist, hypsometric_opt, al& & , ald, alb, mu, mud, muts, mutsd, ph, phd, phb, p, pd, pb, t, td, 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), INTENT(IN) :: td REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), INTENT(IN) :: & & moist REAL, DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), INTENT(IN) :: & & moistd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: al, p REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: ald, pd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ph, phb REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: phd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, muts REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mud, mutsd 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 :: qvfd, qtotd, qf1d REAL, DIMENSION(its:ite) :: temp, cpovcv_v REAL, DIMENSION(its:ite) :: tempd REAL :: pfu, phm, pfd REAL :: pfud, phmd, pfdd REAL :: pwx1 REAL :: pwx1d REAL :: pwr1 REAL :: pwr1d 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 ald(i, k, j) = -((alb(i, k, j)*mud(i, j)+rdnw(k)*(phd(i, k+1& & , j)-phd(i, k, j)))/muts(i, j)-mutsd(i, j)*(alb(i, k, j)*& & mu(i, j)+rdnw(k)*(ph(i, k+1, j)-ph(i, k, j)))/muts(i, j)**& & 2) 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 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 pfud = znw(k+1)*mutsd(i, j) pfu = muts(i, j)*znw(k+1) + ptop pfdd = znw(k)*mutsd(i, j) pfd = muts(i, j)*znw(k) + ptop phmd = znu(k)*mutsd(i, j) phm = muts(i, j)*znu(k) + ptop ald(i, k, j) = (((phd(i, k+1, j)-phd(i, k, j))*phm-(ph(i, k+& & 1, j)-ph(i, k, j)+phb(i, k+1, j)-phb(i, k, j))*phmd)*LOG(& & pfd/pfu)/phm**2-(ph(i, k+1, j)-ph(i, k, j)+phb(i, k+1, j)-& & phb(i, k, j))*(pfdd*pfu-pfd*pfud)/(phm*pfu*pfd))/LOG(pfd/& & pfu)**2 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 ELSE CALL WRF_ERROR_FATAL(& & 'calc_p_rho_phi: hypsometric_opt should be 1 or 2') END IF IF (n_moist .GE. param_first_scalar) THEN tempd = 0.0 DO j=jts,jtf DO k=kts,ktf DO i=its,itf qvfd = rvovrd*moistd(i, k, j, p_qv) qvf = 1. + rvovrd*moist(i, k, j, p_qv) tempd(i) = (r_d*(td(i, k, j)*qvf+(t0+t(i, k, j))*qvfd)*p0*(& & al(i, k, j)+alb(i, k, j))-r_d*(t0+t(i, k, j))*qvf*p0*ald(i& & , k, j))/(p0*(al(i, k, j)+alb(i, k, j)))**2 temp(i) = r_d*(t0+t(i, k, j))*qvf/(p0*(al(i, k, j)+alb(i, k& & , j))) END DO !#ifdef INTELMKL ! CALL VPOWX ( itf-its+1, temp(its), cpovcv, p(its,k,j) ) !#else ! use vector version from libmassv or from compat lib in frame/libmassv.F CALL G_VPOW(p(its, k, j), pd(its, k, j), temp(its), tempd(its)& & , cpovcv_v(its), itf - its + 1) !#endif DO i=its,itf pd(i, k, j) = p0*pd(i, k, j) p(i, k, j) = p(i, k, j)*p0 - pb(i, k, j) END DO END DO END DO ELSE DO j=jts,jtf DO k=kts,ktf DO i=its,itf pwx1d = (r_d*td(i, k, j)*p0*(al(i, k, j)+alb(i, k, j))-r_d*(& & t0+t(i, k, j))*p0*ald(i, k, j))/(p0*(al(i, k, j)+alb(i, k& & , j)))**2 pwx1 = r_d*(t0+t(i, k, j))/(p0*(al(i, k, j)+alb(i, k, j))) IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. cpovcv .EQ. INT(& & cpovcv))) THEN pwr1d = cpovcv*pwx1**(cpovcv-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. cpovcv .EQ. 1.0) THEN pwr1d = pwx1d ELSE pwr1d = 0.0 END IF pwr1 = pwx1**cpovcv pd(i, k, j) = p0*pwr1d p(i, k, j) = p0*pwr1 - pb(i, k, j) 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. qtotd = 0.0 DO ispe=param_first_scalar,n_moist qtotd = qtotd + moistd(i, k, j, ispe) qtot = qtot + moist(i, k, j, ispe) END DO qf2 = 1. qf1d = qf2*qtotd qf1 = qtot*qf2 pd(i, k, j) = -(0.5*(mud(i, j)+qf1d*muts(i, j)+qf1*mutsd(i, j)& & )/rdnw(k)/qf2) p(i, k, j) = -(0.5*(mu(i, j)+qf1*muts(i, j))/rdnw(k)/qf2) qvfd = rvovrd*moistd(i, k, j, p_qv) qvf = 1. + rvovrd*moist(i, k, j, p_qv) pwx1d = pd(i, k, j)/p1000mb pwx1 = (p(i, k, j)+pb(i, k, j))/p1000mb IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. cvpm .EQ. INT(cvpm& & ))) THEN pwr1d = cvpm*pwx1**(cvpm-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. cvpm .EQ. 1.0) THEN pwr1d = pwx1d ELSE pwr1d = 0.0 END IF pwr1 = pwx1**cvpm ald(i, k, j) = r_d*(td(i, k, j)*qvf*pwr1+(t(i, k, j)+t0)*(qvfd& & *pwr1+qvf*pwr1d))/p1000mb al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*pwr1 - alb(i, k& & , j) END DO ! remaining layers, integrate down DO k=ktf-1,kts,-1 DO i=its,itf qtot = 0. qtotd = 0.0 DO ispe=param_first_scalar,n_moist qtotd = qtotd + 0.5*(moistd(i, k, j, ispe)+moistd(i, k+1, & & j, ispe)) qtot = qtot + 0.5*(moist(i, k, j, ispe)+moist(i, k+1, j, & & ispe)) END DO qf2 = 1. qf1d = qf2*qtotd qf1 = qtot*qf2 pd(i, k, j) = pd(i, k+1, j) - (mud(i, j)+qf1d*muts(i, j)+qf1& & *mutsd(i, j))/qf2/rdn(k+1) p(i, k, j) = p(i, k+1, j) - (mu(i, j)+qf1*muts(i, j))/qf2/& & rdn(k+1) qvfd = rvovrd*moistd(i, k, j, p_qv) qvf = 1. + rvovrd*moist(i, k, j, p_qv) pwx1d = pd(i, k, j)/p1000mb pwx1 = (p(i, k, j)+pb(i, k, j))/p1000mb IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. cvpm .EQ. INT(& & cvpm))) THEN pwr1d = cvpm*pwx1**(cvpm-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. cvpm .EQ. 1.0) THEN pwr1d = pwx1d ELSE pwr1d = 0.0 END IF pwr1 = pwx1**cvpm ald(i, k, j) = r_d*(td(i, k, j)*qvf*pwr1+(t(i, k, j)+t0)*(& & qvfd*pwr1+qvf*pwr1d))/p1000mb al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*pwr1 - alb(i, & & k, j) END DO END DO END DO ELSE DO j=jts,jtf ! top layer k = ktf DO i=its,itf qtot = 0. qf2 = 1. qf1 = qtot*qf2 pd(i, k, j) = -(0.5*(mud(i, j)+qf1*mutsd(i, j))/rdnw(k)/qf2) p(i, k, j) = -(0.5*(mu(i, j)+qf1*muts(i, j))/rdnw(k)/qf2) qvf = 1. pwx1d = pd(i, k, j)/p1000mb pwx1 = (p(i, k, j)+pb(i, k, j))/p1000mb IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. cvpm .EQ. INT(cvpm& & ))) THEN pwr1d = cvpm*pwx1**(cvpm-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. cvpm .EQ. 1.0) THEN pwr1d = pwx1d ELSE pwr1d = 0.0 END IF pwr1 = pwx1**cvpm ald(i, k, j) = r_d*qvf*(td(i, k, j)*pwr1+(t(i, k, j)+t0)*pwr1d& & )/p1000mb al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*pwr1 - alb(i, k& & , j) END DO ! remaining layers, integrate down DO k=ktf-1,kts,-1 DO i=its,itf qtot = 0. qf2 = 1. qf1 = qtot*qf2 pd(i, k, j) = pd(i, k+1, j) - (mud(i, j)+qf1*mutsd(i, j))/& & qf2/rdn(k+1) p(i, k, j) = p(i, k+1, j) - (mu(i, j)+qf1*muts(i, j))/qf2/& & rdn(k+1) qvf = 1. pwx1d = pd(i, k, j)/p1000mb pwx1 = (p(i, k, j)+pb(i, k, j))/p1000mb IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. cvpm .EQ. INT(& & cvpm))) THEN pwr1d = cvpm*pwx1**(cvpm-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. cvpm .EQ. 1.0) THEN pwr1d = pwx1d ELSE pwr1d = 0.0 END IF pwr1 = pwx1**cvpm ald(i, k, j) = r_d*qvf*(td(i, k, j)*pwr1+(t(i, k, j)+t0)*& & pwr1d)/p1000mb al(i, k, j) = r_d/p1000mb*(t(i, k, j)+t0)*qvf*pwr1 - alb(i, & & k, j) END DO END DO END DO END IF IF (hypsometric_opt .EQ. 1) THEN DO j=jts,jtf ! integrate hydrostatic equation for geopotential DO k=2,ktf+1 DO i=its,itf phd(i, k, j) = phd(i, k-1, j) - dnw(k-1)*(mutsd(i, j)*al(i, & & k-1, j)+muts(i, j)*ald(i, k-1, j)+alb(i, k-1, j)*mud(i, j)& & ) ph(i, k, j) = ph(i, k-1, j) - dnw(k-1)*(muts(i, j)*al(i, k-1& & , j)+mu(i, j)*alb(i, k-1, j)) END DO END DO END DO ELSE ! Revised hypsometric eq.: dZ=-al*p*dLOG(p), where p is dry pressure DO j=jts,jtf DO i=its,itf phd(i, kts, j) = 0.0 ph(i, kts, j) = phb(i, kts, j) END DO DO k=kts+1,ktf+1 DO i=its,itf pfud = znw(k)*mutsd(i, j) pfu = muts(i, j)*znw(k) + ptop pfdd = znw(k-1)*mutsd(i, j) pfd = muts(i, j)*znw(k-1) + ptop phmd = znu(k-1)*mutsd(i, j) phm = muts(i, j)*znu(k-1) + ptop phd(i, k, j) = phd(i, k-1, j) + (ald(i, k-1, j)*phm+(al(i, k& & -1, j)+alb(i, k-1, j))*phmd)*LOG(pfd/pfu) + (al(i, k-1, j)& & +alb(i, k-1, j))*phm*(pfdd*pfu-pfd*pfud)/(pfu*pfd) ph(i, k, j) = ph(i, k-1, j) + (al(i, k-1, j)+alb(i, k-1, j))& & *phm*LOG(pfd/pfu) END DO END DO DO k=kts,ktf+1 DO i=its,itf ph(i, k, j) = ph(i, k, j) - phb(i, k, j) END DO END DO END DO END IF END IF END SUBROUTINE G_CALC_P_RHO_PHI ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of vpow in forward (tangent) mode: ! variations of useful results: z ! with respect to varying inputs: y z SUBROUTINE G_VPOW(z, zd, y, yd, x, n) IMPLICIT NONE REAL :: x(*), y(*), z(*) REAL :: yd(*), zd(*) INTEGER :: j INTEGER :: n DO j=1,n IF (y(j) .GT. 0.0 .OR. (y(j) .LT. 0.0 .AND. x(j) .EQ. INT(x(j)))) & & THEN zd(j) = x(j)*y(j)**(x(j)-1)*yd(j) ELSE IF (y(j) .EQ. 0.0 .AND. x(j) .EQ. 1.0) THEN zd(j) = yd(j) ELSE zd(j) = 0.0 END IF z(j) = y(j)**x(j) END DO RETURN END SUBROUTINE G_VPOW SUBROUTINE g_calc_php(php,g_php,ph,g_ph,phb,ids,ide,jds,jde,kds,kde,ims,ime, & jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1 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,g_ph REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: php,g_php INTEGER :: i,j,k,itf,jtf,ktf 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 g_php(i,k,j) =0.5*(g_ph(i,k,j) +g_ph(i,k+1,j)) php(i,k,j) =0.5*(phb(i,k,j)+phb(i,k+1,j) +ph(i,k,j) +ph(i,k+1,j)) ENDDO ENDDO ENDDO END SUBROUTINE g_calc_php SUBROUTINE g_diagnose_w(ph_tend,g_ph_tend,ph_new,g_ph_new,ph_old, & g_ph_old,w,g_w,mu,g_mu,dt,u,g_u,v,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5, & g_Tmpv5,Tmpv6,g_Tmpv6,Tmpv7,g_Tmpv7,Tmpv8,g_Tmpv8,Tmpv9,g_Tmpv9, & Tmpv10,g_Tmpv10,Tmpv11,g_Tmpv11,Tmpv12,g_Tmpv12,Tmpv13,g_Tmpv13,Tmpv14, & g_Tmpv14,Tmpv15,g_Tmpv15,Tmpv16,g_Tmpv16,Tmpv17,g_Tmpv17,Tmpv18, & g_Tmpv18,Tmpv19,g_Tmpv19,Tmpv20,g_Tmpv20 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,g_ph_tend,ph_new,g_ph_new, & ph_old,g_ph_old,u,g_u,v,g_v REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: w,g_w REAL,DIMENSION(ims:ime,jms:jme) :: mu,g_mu,ht,msftx,msfty REAL :: dt,cf1,cf2,cf3,rdx,rdy INTEGER :: i,j,k,itf,jtf itf =min(ite,ide-1) jtf =min(jte,jde-1) DO j =jts,jtf DO i =its,itf g_w(i,1,j) =msfty(i,j) *.5 *rdy*((ht(i,j+1)-ht(i,j))*(cf1*g_v(i,1,j+1) & +cf2*g_v(i,2,j+1) +cf3*g_v(i,3,j+1)) +(ht(i,j)-ht(i,j-1))*(cf1*g_v(i,1,j) & +cf2*g_v(i,2,j) +cf3*g_v(i,3,j))) +msftx(i,j) *.5 *rdx*((ht(i+1,j)-ht(i,j)) & *(cf1*g_u(i+1,1,j) +cf2*g_u(i+1,2,j) +cf3*g_u(i+1,3,j)) +(ht(i,j)-ht(i-1,j)) & *(cf1*g_u(i,1,j) +cf2*g_u(i,2,j) +cf3*g_u(i,3,j))) 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 g_Tmpv1 =(g_ph_tend(i,k,j)*mu(i,j) -g_mu(i,j)*ph_tend(i,k,j))/(mu(i,j)*mu(i,j)) Tmpv1 =ph_tend(i,k,j)/mu(i,j) g_w(i,k,j) =msfty(i,j)*((g_ph_new(i,k,j) -g_ph_old(i,k,j))/dt -g_Tmpv1)/g w(i,k,j) =msfty(i,j)*((ph_new(i,k,j) -ph_old(i,k,j))/dt -Tmpv1)/g ENDDO ENDDO ENDDO END SUBROUTINE g_diagnose_w SUBROUTINE g_rhs_ph(ph_tend,g_ph_tend,u,g_u,v,g_v,ww,g_ww,ph,g_ph, & ph_old,g_ph_old,phb,w,g_w,mut,g_mut,muu,g_muu,muv,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5, & g_Tmpv5,Tmpv6,g_Tmpv6,Tmpv7,g_Tmpv7,Tmpv8,g_Tmpv8,Tmpv9,g_Tmpv9, & Tmpv10,g_Tmpv10,Tmpv11,g_Tmpv11,Tmpv12,g_Tmpv12 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,g_u,v,g_v,ww,g_ww,ph,g_ph, & ph_old,g_ph_old,phb,w,g_w REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ph_tend,g_ph_tend REAL,DIMENSION(ims:ime,jms:jme) :: muu,g_muu,muv,g_muv,mut,g_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,g_ur,ul,g_ul,ub,g_ub,vr,g_vr,vl,g_vl,vb,g_vb REAL,DIMENSION(its:ite,kts:kte) :: wdwn,g_wdwn INTEGER :: advective_order LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. advective_order =config_flags%h_sca_adv_order itf =min(ite,ide-1) jtf =min(jte,jde-1) ktf =min(kte,kde-1) DO j =jts,jtf DO k =2,kte DO i =its,itf g_Tmpv1 =.5*(ww(i,k,j) +ww(i,k-1,j))*rdnw(k-1)*(g_ph(i,k,j) -g_ph(i,k-1,j)) & +.5*(g_ww(i,k,j) +g_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)) Tmpv1 =.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)) g_wdwn(i,k) =g_Tmpv1 wdwn(i,k) =Tmpv1 ENDDO ENDDO DO k =2,kte-1 DO i =its,itf g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(fnm(k)*g_wdwn(i,k+1) +fnp(k)*g_wdwn(i,k)) ph_tend(i,k,j) =ph_tend(i,k,j) -(fnm(k)*wdwn(i,k+1) +fnp(k)*wdwn(i,k)) ENDDO ENDDO ENDDO IF(non_hydrostatic) THEN DO j =jts,jtf DO i =its,itf g_ph_tend(i,kde,j) =0.0 ph_tend(i,kde,j) =0. ENDDO DO k =2,kte DO i =its,itf g_Tmpv1 =mut(i,j)*g*g_w(i,k,j) +g_mut(i,j)*g*w(i,k,j) Tmpv1 =mut(i,j)*g*w(i,k,j) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) +(g_Tmpv1/msfty(i,j)) ph_tend(i,k,j) =ph_tend(i,k,j) +Tmpv1/msfty(i,j) ENDDO ENDDO ENDDO END IF 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv3 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv3 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv3 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv3 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv2 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./12.)*(8.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -(g_ph(i,k,j+2) -g_ph(i,k,j-2))) +(g_Tmpv1*msfvy(i,j+1) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv3) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv2 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./12.)*(8.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -(g_ph(i,k,j+2) -g_ph(i,k,j-2))) +(g_Tmpv1*msfvy(i,j+1) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv3 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv3 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv3 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv3 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv2 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./12.)*(8.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -(g_ph(i+2,k,j) -g_ph(i-2,k,j))) +(g_Tmpv1*msfux(i+1,j) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv3) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv2 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./12.)*(8.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -(g_ph(i+2,k,j) -g_ph(i-2,k,j))) +(g_Tmpv1*msfux(i+1,j) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv3 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO j =j_start,jtf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv3 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv3 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO j =j_start,jtf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv3 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv2 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./60.)*(45.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -9.*(g_ph(i,k,j+2) -g_ph(i,k,j-2)) +(g_ph(i,k,j+3) & -g_ph(i,k,j-3))) +(g_Tmpv1*msfvy(i,j+1) +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv3) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv2 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./60.)*(45.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -9.*(g_ph(i,k,j+2) -g_ph(i,k,j-2)) +(g_ph(i,k,j+3) & -g_ph(i,k,j-3))) +(g_Tmpv1*msfvy(i,j+1) +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv2 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./12.)*(8.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -(g_ph(i,k,j+2) -g_ph(i,k,j-2))) +(g_Tmpv1*msfvy(i,j+1) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv3) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv2 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./12.)*(8.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -(g_ph(i,k,j+2) -g_ph(i,k,j-2))) +(g_Tmpv1*msfvy(i,j+1) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv2 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./12.)*(8.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -(g_ph(i,k,j+2) -g_ph(i,k,j-2))) +(g_Tmpv1*msfvy(i,j+1) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv3) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv2 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*msfvy(i,j))*(1./12.)*(8.*(g_ph(i,k,j+1) & -g_ph(i,k,j-1)) -(g_ph(i,k,j+2) -g_ph(i,k,j-2))) +(g_Tmpv1*msfvy(i,j+1) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfvy(i,j+1) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv3 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv3 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muv(i,j+1)*(g_v(i,k,j+1) +g_v(i,k-1,j+1)) +g_muv(i,j+1) & *(v(i,k,j+1) +v(i,k-1,j+1)) Tmpv1 =muv(i,j+1)*(v(i,k,j+1) +v(i,k-1,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(g_v(i,k,j) +g_v(i,k-1,j)) +g_muv(i,j)*(v(i,k,j) +v(i,k-1,j)) Tmpv3 =muv(i,j)*(v(i,k,j) +v(i,k-1,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muv(i,j+1)*(cfn*g_v(i,k-1,j+1) +cfn1*g_v(i,k-2,j+1)) & +g_muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) Tmpv1 =muv(i,j+1)*(cfn*v(i,k-1,j+1) +cfn1*v(i,k-2,j+1)) g_Tmpv2 =Tmpv1*msfvy(i,j+1)*(g_ph(i,k,j+1) -g_ph(i,k,j)) +g_Tmpv1*msfvy( & i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) Tmpv2 =Tmpv1*msfvy(i,j+1)*(phb(i,k,j+1)-phb(i,k,j) +ph(i,k,j+1) -ph(i,k,j)) g_Tmpv3 =muv(i,j)*(cfn*g_v(i,k-1,j) +cfn1*g_v(i,k-2,j)) +g_muv(i,j) & *(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) Tmpv3 =muv(i,j)*(cfn*v(i,k-1,j) +cfn1*v(i,k-2,j)) g_Tmpv4 =Tmpv3*msfvy(i,j)*(g_ph(i,k,j) -g_ph(i,k,j-1)) +g_Tmpv3*msfvy(i, & j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) Tmpv4 =Tmpv3*msfvy(i,j)*(phb(i,k,j)-phb(i,k,j-1) +ph(i,k,j) -ph(i,k,j-1)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdy/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv2 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./60.)*(45.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -9.*(g_ph(i+2,k,j) -g_ph(i-2,k,j)) +(g_ph(i+3,k,j) & -g_ph(i-3,k,j))) +(g_Tmpv1*msfux(i+1,j) +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv3) ENDDO ENDDO k =kte DO i =i_start,itf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv2 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./60.)*(45.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -9.*(g_ph(i+2,k,j) -g_ph(i-2,k,j)) +(g_ph(i+3,k,j) & -g_ph(i-3,k,j))) +(g_Tmpv1*msfux(i+1,j) +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv2 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./12.)*(8.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -(g_ph(i+2,k,j) -g_ph(i-2,k,j))) +(g_Tmpv1*msfux(i+1,j) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv3) ENDDO k =kte g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv2 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./12.)*(8.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -(g_ph(i+2,k,j) -g_ph(i-2,k,j))) +(g_Tmpv1*msfux(i+1,j) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv2 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./12.)*(8.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -(g_ph(i+2,k,j) -g_ph(i-2,k,j))) +(g_Tmpv1*msfux(i+1,j) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv3) ENDDO k =kte g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv2 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*msfux(i,j))*(1./12.)*(8.*(g_ph(i+1,k,j) & -g_ph(i-1,k,j)) -(g_ph(i+2,k,j) -g_ph(i-2,k,j))) +(g_Tmpv1*msfux(i+1,j) & +g_Tmpv2*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))) Tmpv3 =(Tmpv1*msfux(i+1,j) +Tmpv2*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))) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv3) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv3) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv3 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO j =j_start,jtf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv3 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) 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 g_Tmpv1 =muu(i+1,j)*(g_u(i+1,k,j) +g_u(i+1,k-1,j)) +g_muu(i+1,j) & *(u(i+1,k,j) +u(i+1,k-1,j)) Tmpv1 =muu(i+1,j)*(u(i+1,k,j) +u(i+1,k-1,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(g_u(i,k,j) +g_u(i,k-1,j)) +g_muu(i,j)*(u(i,k,j) +u(i,k-1,j)) Tmpv3 =muu(i,j)*(u(i,k,j) +u(i,k-1,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.25 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO ENDDO k =kte DO j =j_start,jtf g_Tmpv1 =muu(i+1,j)*(cfn*g_u(i+1,k-1,j) +cfn1*g_u(i+1,k-2,j)) & +g_muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) Tmpv1 =muu(i+1,j)*(cfn*u(i+1,k-1,j) +cfn1*u(i+1,k-2,j)) g_Tmpv2 =Tmpv1*msfux(i+1,j)*(g_ph(i+1,k,j) -g_ph(i,k,j)) +g_Tmpv1*msfux( & i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) Tmpv2 =Tmpv1*msfux(i+1,j)*(phb(i+1,k,j)-phb(i,k,j) +ph(i+1,k,j) -ph(i,k,j)) g_Tmpv3 =muu(i,j)*(cfn*g_u(i,k-1,j) +cfn1*g_u(i,k-2,j)) +g_muu(i,j) & *(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) Tmpv3 =muu(i,j)*(cfn*u(i,k-1,j) +cfn1*u(i,k-2,j)) g_Tmpv4 =Tmpv3*msfux(i,j)*(g_ph(i,k,j) -g_ph(i-1,k,j)) +g_Tmpv3*msfux(i, & j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) Tmpv4 =Tmpv3*msfux(i,j)*(phb(i,k,j)-phb(i-1,k,j) +ph(i,k,j) -ph(i-1,k,j)) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(g_Tmpv2 +g_Tmpv4) ph_tend(i,k,j) =ph_tend(i,k,j) -(0.5 *rdx/msfty(i,j))*(Tmpv2 +Tmpv4) ENDDO END IF END IF i_start =its itf =min(ite,ide-1) IF( (config_flags%open_ys) .and. jts == jds ) THEN j =jts DO k =2,kde kz =min(k,kde-1) DO i =its,itf g_vb =.5*(fnm(kz)*(g_v(i,kz,j+1) +g_v(i,kz,j)) +fnp(kz)*(g_v(i,kz-1,j+1) & +g_v(i,kz-1,j))) 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))) g_vl =(g_vb +0.0 -(g_vb -0.0)*sign(1.0, vb -(0.)))*0.5 ! Revised by Ning Pan, 2010-07-21 ! vl =min(vb,0.) vl =amin1(vb,0.) g_Tmpv1 =vl*(g_ph_old(i,k,j+1) -g_ph_old(i,k,j)) +g_vl*(ph_old(i,k,j+1) & -ph_old(i,k,j)) Tmpv1 =vl*(ph_old(i,k,j+1) -ph_old(i,k,j)) g_Tmpv2 =rdy*mut(i,j)*(g_Tmpv1) +rdy*g_mut(i,j)*(Tmpv1) Tmpv2 =rdy*mut(i,j)*(Tmpv1) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -g_Tmpv2 ph_tend(i,k,j) =ph_tend(i,k,j) -Tmpv2 ENDDO ENDDO END IF 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 g_vb =.5*(fnm(kz)*(g_v(i,kz,j+1) +g_v(i,kz,j)) +fnp(kz)*(g_v(i,kz-1,j+1) & +g_v(i,kz-1,j))) 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))) g_vr =(g_vb +0.0 +(g_vb -0.0)*sign(1.0, vb -(0.)))*0.5 ! Revised by Ning Pan, 2010-07-21 ! vr =max(vb,0.) vr =amax1(vb,0.) g_Tmpv1 =vr*(g_ph_old(i,k,j) -g_ph_old(i,k,j-1)) +g_vr*(ph_old(i,k,j) & -ph_old(i,k,j-1)) Tmpv1 =vr*(ph_old(i,k,j) -ph_old(i,k,j-1)) g_Tmpv2 =rdy*mut(i,j)*(g_Tmpv1) +rdy*g_mut(i,j)*(Tmpv1) Tmpv2 =rdy*mut(i,j)*(Tmpv1) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -g_Tmpv2 ph_tend(i,k,j) =ph_tend(i,k,j) -Tmpv2 ENDDO ENDDO END IF j_start =its jtf =min(jte,jde-1) IF( (config_flags%open_xs) .and. its == ids ) THEN i =its DO j =jts,jtf DO k =2,kde-1 kz =k g_ub =.5*(fnm(kz)*(g_u(i+1,kz,j) +g_u(i,kz,j)) +fnp(kz)*(g_u(i+1,kz-1,j) & +g_u(i,kz-1,j))) 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))) g_ul =(g_ub +0.0 -(g_ub -0.0)*sign(1.0, ub -(0.)))*0.5 ! Revised by Ning Pan, 2010-07-20 ! ul =min(ub,0.) ul =amin1(ub,0.) g_Tmpv1 =ul*(g_ph_old(i+1,k,j) -g_ph_old(i,k,j)) +g_ul*(ph_old(i+1,k,j) & -ph_old(i,k,j)) Tmpv1 =ul*(ph_old(i+1,k,j) -ph_old(i,k,j)) g_Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(g_Tmpv1) +(msftx(i,j) & /msfty(i,j)) *rdx*g_mut(i,j)*(Tmpv1) Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(Tmpv1) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -g_Tmpv2 ph_tend(i,k,j) =ph_tend(i,k,j) -Tmpv2 ENDDO k =kde kz =k g_ub =.5*(fnm(kz)*(g_u(i+1,kz,j) +g_u(i,kz,j)) +fnp(kz)*(g_u(i+1,kz-1,j) & +g_u(i,kz-1,j))) 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))) g_ul =(g_ub +0.0 -(g_ub -0.0)*sign(1.0, ub -(0.)))*0.5 ! Revised by Ning Pan, 2010-07-20 ! ul =min(ub,0.) ul =amin1(ub,0.) g_Tmpv1 =ul*(g_ph_old(i+1,k,j) -g_ph_old(i,k,j)) +g_ul*(ph_old(i+1,k,j) & -ph_old(i,k,j)) Tmpv1 =ul*(ph_old(i+1,k,j) -ph_old(i,k,j)) g_Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(g_Tmpv1) +(msftx(i,j) & /msfty(i,j)) *rdx*g_mut(i,j)*(Tmpv1) Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(Tmpv1) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -g_Tmpv2 ph_tend(i,k,j) =ph_tend(i,k,j) -Tmpv2 ENDDO END IF IF( (config_flags%open_xe) .and. ite == ide ) THEN i =ite-1 DO j =jts,jtf DO k =2,kde-1 kz =k g_ub =.5*(fnm(kz)*(g_u(i+1,kz,j) +g_u(i,kz,j)) +fnp(kz)*(g_u(i+1,kz-1,j) & +g_u(i,kz-1,j))) 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))) g_ur =(g_ub +0.0 +(g_ub -0.0)*sign(1.0, ub -(0.)))*0.5 ! Revised by Ning Pan, 2010-07-20 ! ur =max(ub,0.) ur =amax1(ub,0.) g_Tmpv1 =ur*(g_ph_old(i,k,j) -g_ph_old(i-1,k,j)) +g_ur*(ph_old(i,k,j) & -ph_old(i-1,k,j)) Tmpv1 =ur*(ph_old(i,k,j) -ph_old(i-1,k,j)) g_Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(g_Tmpv1) +(msftx(i,j) & /msfty(i,j)) *rdx*g_mut(i,j)*(Tmpv1) Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(Tmpv1) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -g_Tmpv2 ph_tend(i,k,j) =ph_tend(i,k,j) -Tmpv2 ENDDO k =kde kz =k-1 g_ub =.5*(fnm(kz)*(g_u(i+1,kz,j) +g_u(i,kz,j)) +fnp(kz)*(g_u(i+1,kz-1,j) & +g_u(i,kz-1,j))) 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))) g_ur =(g_ub +0.0 +(g_ub -0.0)*sign(1.0, ub -(0.)))*0.5 ! Revised by Ning Pan, 2010-07-20 ! ur =max(ub,0.) ur =amax1(ub,0.) g_Tmpv1 =ur*(g_ph_old(i,k,j) -g_ph_old(i-1,k,j)) +g_ur*(ph_old(i,k,j) & -ph_old(i-1,k,j)) Tmpv1 =ur*(ph_old(i,k,j) -ph_old(i-1,k,j)) g_Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(g_Tmpv1) +(msftx(i,j) & /msfty(i,j)) *rdx*g_mut(i,j)*(Tmpv1) Tmpv2 =(msftx(i,j)/msfty(i,j)) *rdx*mut(i,j)*(Tmpv1) g_ph_tend(i,k,j) =g_ph_tend(i,k,j) -g_Tmpv2 ph_tend(i,k,j) =ph_tend(i,k,j) -Tmpv2 ENDDO END IF END SUBROUTINE g_rhs_ph ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of horizontal_pressure_gradient in forward (tangent) mode: ! variations of useful results: ru_tend rv_tend ! 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:in al:in ru_tend:in-out cqu:in ! cqv:in php:in rv_tend:in-out ph:in alt:in muu:in ! muv:in mu:in SUBROUTINE G_HORIZONTAL_PRESSURE_GRADIENT(ru_tend, ru_tendd, rv_tend, & & rv_tendd, ph, phd, alt, altd, p, pd, pb, al, ald, php, phpd, cqu, cqud& & , cqv, cqvd, muu, muud, muv, muvd, mu, mud, 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), INTENT(IN) :: phd, altd, & & ald, pd, phpd, cqud, cqvd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ru_tend, & & rv_tend REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ru_tendd& & , rv_tendd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: muu, muv, mu, msfux, & & msfuy, msfvx, msfvy, msftx, msfty REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: muud, muvd, mud 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) :: dpnd REAL :: dpx, dpy REAL :: dpxd, dpyd LOGICAL :: specified INTRINSIC MIN ! ! ! 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) THEN jtf = jtf - 1 dpnd = 0.0 ELSE dpnd = 0.0 END IF DO j=j_start,jtf IF (non_hydrostatic) THEN k = 1 DO i=i_start,itf dpnd(i, k) = .5*(cf1*(pd(i, k, j-1)+pd(i, k, j))+cf2*(pd(i, k+1& & , j-1)+pd(i, k+1, j))+cf3*(pd(i, k+2, j-1)+pd(i, k+2, j))) 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))) dpnd(i, kde) = 0.0 dpn(i, kde) = 0. END DO IF (top_lid) THEN DO i=i_start,itf !commented out for bug fix, Jan 2016 ! dpnd(i, kde) = .5*(cf1*(pd(i, kde-1, j-1)+pd(i, kde-1, j))+cf2& !& *(pd(i, kde-2, j-1)+pd(i, kde-2, j))+cf3*(pd(i, kde-3, j-1)+& !& pd(i, kde-3, j))) ! 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))) dpnd(i,kde) = .5*( cfn *(pd(i,kde-1,j-1)+pd(i,kde-1,j)) & +cfn1*(pd(i,kde-2,j-1)+pd(i,kde-2,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 END IF DO k=2,ktf DO i=i_start,itf dpnd(i, k) = .5*(fnm(k)*(pd(i, k, j-1)+pd(i, k, j))+fnp(k)*(pd& & (i, k-1, j-1)+pd(i, k-1, j))) 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 END DO ! 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 DO i=i_start,itf ! Here are mu dp/dy terms 1-3 dpyd = msfvy(i, j)*.5*rdy*(muvd(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)))+muv(i, j)*(phd(i, k+1, j)-phd(i, k& & +1, j-1)+phd(i, k, j)-phd(i, k, j-1)+(altd(i, k, j)+altd(i, & & k, j-1))*(p(i, k, j)-p(i, k, j-1))+(alt(i, k, j)+alt(i, k, j& & -1))*(pd(i, k, j)-pd(i, k, j-1))+(pb(i, k, j)-pb(i, k, j-1))& & *(ald(i, k, j)+ald(i, k, j-1))))/msfvx(i, j) 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 dpyd = dpyd + msfvy(i, j)*rdy*((phpd(i, k, j)-phpd(i, k, j-1))& & *(rdnw(k)*(dpn(i, k+1)-dpn(i, k))-.5*(mu(i, j-1)+mu(i, j)))+& & (php(i, k, j)-php(i, k, j-1))*(rdnw(k)*(dpnd(i, k+1)-dpnd(i& & , k))-.5*(mud(i, j-1)+mud(i, j))))/msfvx(i, j) 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))) rv_tendd(i, k, j) = rv_tendd(i, k, j) - cqvd(i, k, j)*dpy - & & cqv(i, k, j)*dpyd rv_tend(i, k, j) = rv_tend(i, k, j) - cqv(i, k, j)*dpy END DO END DO 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 DO i=i_start,itf ! Here are mu dp/dy terms 1-3; term 4 not needed if hydrostatic dpyd = msfvy(i, j)*.5*rdy*(muvd(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)))+muv(i, j)*(phd(i, k+1, j)-phd(i, k& & +1, j-1)+phd(i, k, j)-phd(i, k, j-1)+(altd(i, k, j)+altd(i, & & k, j-1))*(p(i, k, j)-p(i, k, j-1))+(alt(i, k, j)+alt(i, k, j& & -1))*(pd(i, k, j)-pd(i, k, j-1))+(pb(i, k, j)-pb(i, k, j-1))& & *(ald(i, k, j)+ald(i, k, j-1))))/msfvx(i, j) 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))) rv_tendd(i, k, j) = rv_tendd(i, k, j) - dpyd rv_tend(i, k, j) = rv_tend(i, k, j) - dpy END DO END DO END IF END DO ! 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 dpnd(i, k) = .5*(cf1*(pd(i-1, k, j)+pd(i, k, j))+cf2*(pd(i-1, k+& & 1, j)+pd(i, k+1, j))+cf3*(pd(i-1, k+2, j)+pd(i, k+2, j))) 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))) dpnd(i, kde) = 0.0 dpn(i, kde) = 0. END DO IF (top_lid) THEN DO i=i_start,itf !commented out for bug fix, Jan 2016 ! dpnd(i, kde) = .5*(cf1*(pd(i-1, kde-1, j)+pd(i, kde-1, j))+cf2& !& *(pd(i-1, kde-2, j)+pd(i, kde-2, j))+cf3*(pd(i-1, kde-3, j)+& !& pd(i, kde-3, j))) ! 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))) dpnd(i,kde) = .5*( cfn *(pd(i-1,kde-1,j)+pd(i,kde-1,j)) & +cfn1*(pd(i-1,kde-2,j)+pd(i,kde-2,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 END IF DO k=2,ktf DO i=i_start,itf dpnd(i, k) = .5*(fnm(k)*(pd(i-1, k, j)+pd(i, k, j))+fnp(k)*(pd& & (i-1, k-1, j)+pd(i, k-1, j))) 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 ! Here are mu dp/dy terms 1-3 dpxd = msfux(i, j)*.5*rdx*(muud(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)))+muu(i, j)*(phd(i, k+1, j)-phd(i-1& & , k+1, j)+phd(i, k, j)-phd(i-1, k, j)+(altd(i, k, j)+altd(i-& & 1, k, j))*(p(i, k, j)-p(i-1, k, j))+(alt(i, k, j)+alt(i-1, k& & , j))*(pd(i, k, j)-pd(i-1, k, j))+(pb(i, k, j)-pb(i-1, k, j)& & )*(ald(i, k, j)+ald(i-1, k, j))))/msfuy(i, j) 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 dpxd = dpxd + msfux(i, j)*rdx*((phpd(i, k, j)-phpd(i-1, k, j))& & *(rdnw(k)*(dpn(i, k+1)-dpn(i, k))-.5*(mu(i-1, j)+mu(i, j)))+& & (php(i, k, j)-php(i-1, k, j))*(rdnw(k)*(dpnd(i, k+1)-dpnd(i& & , k))-.5*(mud(i-1, j)+mud(i, j))))/msfuy(i, j) 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))) ru_tendd(i, k, j) = ru_tendd(i, k, j) - cqud(i, k, j)*dpx - & & cqu(i, k, j)*dpxd ru_tend(i, k, j) = ru_tend(i, k, j) - cqu(i, k, j)*dpx END DO END DO 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 ! Here are mu dp/dy terms 1-3; term 4 not needed if hydrostatic dpxd = msfux(i, j)*.5*rdx*(muud(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)))+muu(i, j)*(phd(i, k+1, j)-phd(i-1& & , k+1, j)+phd(i, k, j)-phd(i-1, k, j)+(altd(i, k, j)+altd(i-& & 1, k, j))*(p(i, k, j)-p(i-1, k, j))+(alt(i, k, j)+alt(i-1, k& & , j))*(pd(i, k, j)-pd(i-1, k, j))+(pb(i, k, j)-pb(i-1, k, j)& & )*(ald(i, k, j)+ald(i-1, k, j))))/msfuy(i, j) 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))) ru_tendd(i, k, j) = ru_tendd(i, k, j) - dpxd ru_tend(i, k, j) = ru_tend(i, k, j) - dpx END DO END DO END IF END DO END SUBROUTINE G_HORIZONTAL_PRESSURE_GRADIENT SUBROUTINE g_pg_buoy_w(rw_tend,g_rw_tend,p,g_p,cqw,g_cqw,mu,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5,g_Tmpv5 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,g_p REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: cqw,g_cqw REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: rw_tend,g_rw_tend REAL,DIMENSION(ims:ime,jms:jme) :: mub,mu,g_mu,msftx,msfty REAL,DIMENSION(kms:kme) :: rdnw,rdn REAL :: g INTEGER :: itf,jtf,i,j,k REAL :: cq1,g_cq1,cq2,g_cq2 itf =min(ite,ide-1) jtf =min(jte,jde-1) DO j =jts,jtf k =kde DO i =its,itf g_cq1 =-1.*(g_cqw(i,k-1,j))/((1. +cqw(i,k-1,j))*(1. +cqw(i,k-1,j))) cq1 =1./(1. +cqw(i,k-1,j)) g_Tmpv1 =cqw(i,k-1,j)*g_cq1 +g_cqw(i,k-1,j)*cq1 Tmpv1 =cqw(i,k-1,j)*cq1 g_cq2 =g_Tmpv1 cq2 =Tmpv1 g_Tmpv1 =cq1*2.*rdnw(k-1)*(-g_p(i,k-1,j)) +g_cq1*2.*rdnw(k-1)*(-p(i,k-1,j)) Tmpv1 =cq1*2.*rdnw(k-1)*(-p(i,k-1,j)) g_rw_tend(i,k,j) =g_rw_tend(i,k,j) +(1./msfty(i,j)) *g*(g_Tmpv1 -g_mu(i, & j) -g_cq2*mub(i,j)) rw_tend(i,k,j) =rw_tend(i,k,j) +(1./msfty(i,j)) *g*(Tmpv1 -mu(i,j) -cq2*mub(i,j)) ENDDO DO k =2,kde-1 DO i =its,itf g_cq1 =-1.*(g_cqw(i,k,j))/((1. +cqw(i,k,j))*(1. +cqw(i,k,j))) cq1 =1./(1. +cqw(i,k,j)) g_Tmpv1 =cqw(i,k,j)*g_cq1 +g_cqw(i,k,j)*cq1 Tmpv1 =cqw(i,k,j)*cq1 g_cq2 =g_Tmpv1 cq2 =Tmpv1 g_cqw(i,k,j) =g_cq1 cqw(i,k,j) =cq1 g_Tmpv1 =cq1*rdn(k)*(g_p(i,k,j) -g_p(i,k-1,j)) +g_cq1*rdn(k)*(p(i,k,j) & -p(i,k-1,j)) Tmpv1 =cq1*rdn(k)*(p(i,k,j) -p(i,k-1,j)) g_rw_tend(i,k,j) =g_rw_tend(i,k,j) +(1./msfty(i,j)) *g*(g_Tmpv1 -g_mu(i, & j) -g_cq2*mub(i,j)) rw_tend(i,k,j) =rw_tend(i,k,j) +(1./msfty(i,j)) *g*(Tmpv1 -mu(i,j) -cq2*mub(i,j)) ENDDO ENDDO ENDDO END SUBROUTINE g_pg_buoy_w ! Revised by Ning Pan, 2010-07-21 ! SUBROUTINE g_w_damp(rw_tend,g_rw_tend,max_vert_cfl,g_max_vert_cfl, & ! max_horiz_cfl,g_max_horiz_cfl,u,g_u,v,g_v,ww,g_ww,w,g_w,mut,g_mut, & SUBROUTINE g_w_damp(rw_tend,g_rw_tend,max_vert_cfl, & max_horiz_cfl,u,g_u,v,g_v,ww,g_ww,w,g_w,mut,g_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) USE module_llxy IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5, & g_Tmpv5,Tmpv6,g_Tmpv6 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,g_u,v,g_v,ww,g_ww,w,g_w REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: rw_tend,g_rw_tend ! Revised by Ning Pan, 2010-07-21 ! REAL :: max_vert_cfl,g_max_vert_cfl ! REAL :: max_horiz_cfl,g_max_horiz_cfl REAL :: max_vert_cfl REAL :: max_horiz_cfl REAL :: horiz_cfl,g_horiz_cfl REAL,DIMENSION(ims:ime,jms:jme) :: mut,g_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,g_vert_cfl,cf_n,g_cf_n,cf_d,g_cf_d,maxdub,g_maxdub, & ! maxdeta,g_maxdeta REAL :: vert_cfl,g_vert_cfl,cf_n,g_cf_n,cf_d,g_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,g_msfuxt,msfxffl,g_msfxffl REAL :: msfuxt,g_msfuxt,msfxffl,g_msfxffl itf =min(ite,ide-1) jtf =min(jte,jde-1) some =0 ! g_max_vert_cfl =0.0 ! Remarked by Ning Pan, 2010-07-21 max_vert_cfl =0. ! g_max_horiz_cfl =0.0 ! Remarked by Ning Pan, 2010-07-21 max_horiz_cfl =0. total =0 IF(config_flags%polar) THEN !PRINT*, 'DELETED FOR COMPILING BY WALLS' ! Remarked by Ning Pan, 2010-07-21 !STOP ! Remarked by Ning Pan, 2010-07-21 !g_msfxffl =-1.0*(-g_config_flags%fft_filter_lat*degrad*sin(config_flags%fft_fil & !ter_lat*degrad))/(cos(config_flags%fft_filter_lat*degrad)*cos(config_flags%fft_filter & !_lat*degrad)) msfxffl =1.0/cos(config_flags%fft_filter_lat*degrad) END IF IF( config_flags%w_damping == 1 ) THEN DO j =jts,jtf DO k =2,kde-1 DO i =its,itf #if 1 IF(config_flags%polar) THEN ! g_msfuxt =(0.0 +g_msfxffl -(0.0 -g_msfxffl)*sign(1.0, msfux(i,j) -(msfxffl)))*0.5 ! Remarked by Ning Pan, 2010-07-21 msfuxt =min(msfux(i,j),msfxffl) ELSE ! g_msfuxt =0.0 ! Remarked by Ning Pan, 2010-07-21 msfuxt =msfux(i,j) END IF g_Tmpv1 =(g_ww(i,k,j)*mut(i,j) -g_mut(i,j)*ww(i,k,j))/(mut(i,j)*mut(i,j)) Tmpv1 =ww(i,k,j)/mut(i,j) g_vert_cfl =sign(1.0, Tmpv1*rdnw(k)*dt)*g_Tmpv1*rdnw(k)*dt vert_cfl =abs(Tmpv1*rdnw(k)*dt) IF( vert_cfl > max_vert_cfl ) THEN ! g_max_vert_cfl =g_vert_cfl ! Remarked by Ning Pan, 2010-07-21 max_vert_cfl =vert_cfl maxi =i maxj =j maxk =k ! g_maxdub =g_w(i,k,j) ! Remarked by Ning Pan, 2010-07-21 maxdub =w(i,k,j) ! g_maxdeta =0.0 ! Remarked by Ning Pan, 2010-07-21 maxdeta =-1./rdnw(k) ENDIF ! Revised by Ning Pan, 2010-07-21 ! g_Tmpv1 =u(i,k,j)*rdx*g_msfuxt +g_u(i,k,j)*rdx*msfuxt g_Tmpv1 =g_u(i,k,j)*rdx*msfuxt Tmpv1 =u(i,k,j)*rdx*msfuxt g_horiz_cfl =(sign(1.0, Tmpv1*dt)*g_Tmpv1*dt +sign(1.0, v(i,k,j)*rdy*msfvy(i,j) & *dt)*g_v(i,k,j)*rdy*msfvy(i,j)*dt +(sign(1.0, Tmpv1*dt)*g_Tmpv1*dt -sign(1.0, & v(i,k,j)*rdy*msfvy(i,j)*dt)*g_v(i,k,j)*rdy*msfvy(i,j)*dt)*sign(1.0, abs(Tmpv1*dt) & -(abs(v(i,k,j)*rdy*msfvy(i,j)*dt))))*0.5 horiz_cfl =max(abs(Tmpv1*dt),abs(v(i,k,j)*rdy*msfvy(i,j)*dt)) IF(horiz_cfl > max_horiz_cfl) THEN ! g_max_horiz_cfl =g_horiz_cfl ! Remarked by Ning Pan, 2010-07-21 max_horiz_cfl =horiz_cfl endif IF(vert_cfl .gt. w_beta) THEN #else g_cf_n =sign(1.0, ww(i,k,j)*rdnw(k)*dt)*g_ww(i,k,j)*rdnw(k)*dt cf_n =abs(ww(i,k,j)*rdnw(k)*dt) g_cf_d =sign(1.0, mut(i,j))*g_mut(i,j) cf_d =abs(mut(i,j)) IF(cf_n .gt. cf_d*w_beta ) THEN #endif WRITE (temp,*) i,j,k,' vert_cfl,w,d(eta)=',vert_cfl,w(i,k,j),-1./rdnw(k) !This line is fail to be recognized CALL wrf_debug ( 100 , TRIM(temp) ) if( vert_cfl > 2. ) some =some+1 g_Tmpv1 =sign(1., w(i,k,j)) *w_alpha*(vert_cfl -w_beta)*g_mut(i,j) & +sign(1., w(i,k,j)) *w_alpha*(g_vert_cfl)*mut(i,j) Tmpv1 =sign(1., w(i,k,j)) *w_alpha*(vert_cfl -w_beta)*mut(i,j) g_rw_tend(i,k,j) =g_rw_tend(i,k,j) -g_Tmpv1 rw_tend(i,k,j) =rw_tend(i,k,j) -Tmpv1 endif ENDDO ENDDO ENDDO ELSE ! Remark all the computation of perturbation because this part (w_damping=0) ! is just for print (w_damping=0). Ning Pan, 2010-07-21 DO j =jts,jtf DO k =2,kde-1 DO i =its,itf #if 1 IF(config_flags%polar) THEN ! g_msfuxt =(0.0 +g_msfxffl -(0.0 -g_msfxffl)*sign(1.0, msfux(i,j) -(msfxffl)))*0.5 msfuxt =min(msfux(i,j),msfxffl) ELSE ! g_msfuxt =0.0 msfuxt =msfux(i,j) END IF ! g_Tmpv1 =(g_ww(i,k,j)*mut(i,j) -g_mut(i,j)*ww(i,k,j))/(mut(i,j)*mut(i,j)) Tmpv1 =ww(i,k,j)/mut(i,j) ! g_vert_cfl =sign(1.0, Tmpv1*rdnw(k)*dt)*g_Tmpv1*rdnw(k)*dt vert_cfl =abs(Tmpv1*rdnw(k)*dt) IF( vert_cfl > max_vert_cfl ) THEN ! g_max_vert_cfl =g_vert_cfl ! Remarked by Ning Pan, 2010-07-21 max_vert_cfl =vert_cfl maxi =i maxj =j maxk =k ! g_maxdub =g_w(i,k,j) maxdub =w(i,k,j) ! g_maxdeta =0.0 maxdeta =-1./rdnw(k) ENDIF ! g_Tmpv1 =u(i,k,j)*rdx*g_msfuxt +g_u(i,k,j)*rdx*msfuxt Tmpv1 =u(i,k,j)*rdx*msfuxt ! g_horiz_cfl =(sign(1.0, Tmpv1*dt)*g_Tmpv1*dt +sign(1.0, v(i,k,j)*rdy*msfvy(i,j) & !*dt)*g_v(i,k,j)*rdy*msfvy(i,j)*dt +(sign(1.0, Tmpv1*dt)*g_Tmpv1*dt -sign(1.0, & ! v(i,k,j)*rdy*msfvy(i,j)*dt)*g_v(i,k,j)*rdy*msfvy(i,j)*dt)*sign(1.0, abs(Tmpv1*dt) & ! -(abs(v(i,k,j)*rdy*msfvy(i,j)*dt))))*0.5 horiz_cfl =max(abs(Tmpv1*dt),abs(v(i,k,j)*rdy*msfvy(i,j)*dt)) IF(horiz_cfl > max_horiz_cfl) THEN ! g_max_horiz_cfl =g_horiz_cfl max_horiz_cfl =horiz_cfl endif IF(vert_cfl .gt. w_beta) THEN #else ! g_cf_n =sign(1.0, ww(i,k,j)*rdnw(k)*dt)*g_ww(i,k,j)*rdnw(k)*dt cf_n =abs(ww(i,k,j)*rdnw(k)*dt) ! g_cf_d =sign(1.0, mut(i,j))*g_mut(i,j) cf_d =abs(mut(i,j)) IF(cf_n .gt. cf_d*w_beta ) THEN #endif WRITE (temp,*) i,j,k,' vert_cfl,w,d(eta)=',vert_cfl,w(i,k,j),-1./rdnw(k) !This line is fail to be recognized CALL wrf_debug ( 100 , TRIM(temp) ) if( vert_cfl > 2. ) some =some+1 endif ENDDO ENDDO ENDDO ENDIF IF( some .GT. 0 ) THEN !This line is fail to be recognized CALL get_current_time_string( time_str ) !This line is fail to be recognized 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' !This line is fail to be recognized CALL wrf_debug ( 0 , TRIM(temp) ) !REVISED BY WALLS ! WRITE (temp,*) 'MAX AT i,j,k: ',maxi,maxj,maxk,' vert_cfl,w,d(eta) & !=',max_vert_cfl,maxdub,maxdeta !This line is fail to be recognized CALL wrf_debug ( 0 , TRIM(temp) ) ENDIF END SUBROUTINE g_w_damp ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of horizontal_diffusion in forward (tangent) mode: ! variations of useful results: tendency ! with respect to varying inputs: field tendency xkmhd mu ! RW status of diff variables: field:in tendency:in-out xkmhd:in ! mu:in SUBROUTINE G_HORIZONTAL_DIFFUSION(name, field, fieldd, tendency, & & tendencyd, mu, mud, config_flags, msfux, msfuy, msfvx, msfvx_inv, & & msfvy, msftx, msfty, khdif, xkmhd, xkmhdd, 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), INTENT(IN) :: fieldd, & & xkmhdd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendencyd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mud 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 :: mkrdxmd, mkrdxpd, mkrdymd, mkrdypd LOGICAL :: specified ! ! ! 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 ! 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 mkrdxmd = msftx(i-1, j)*rdx*(mud(i-1, j)*xkmhd(i-1, k, j)+mu(i& & -1, j)*xkmhdd(i-1, k, j))/msfty(i-1, j) mkrdxm = msftx(i-1, j)/msfty(i-1, j)*mu(i-1, j)*xkmhd(i-1, k, & & j)*rdx mkrdxpd = msftx(i, j)*rdx*(mud(i, j)*xkmhd(i, k, j)+mu(i, j)*& & xkmhdd(i, k, j))/msfty(i, j) mkrdxp = msftx(i, j)/msfty(i, j)*mu(i, j)*xkmhd(i, k, j)*rdx mrdx = msfux(i, j)*msfuy(i, j)*rdx mkrdymd = (msfuy(i, j)+msfuy(i, j-1))*0.25**2*rdy*((mud(i, j)+& & mud(i, j-1)+mud(i-1, j-1)+mud(i-1, j))*(xkmhd(i, k, j)+xkmhd& & (i, k, j-1)+xkmhd(i-1, k, j-1)+xkmhd(i-1, k, j))+(mu(i, j)+& & mu(i, j-1)+mu(i-1, j-1)+mu(i-1, j))*(xkmhdd(i, k, j)+xkmhdd(& & i, k, j-1)+xkmhdd(i-1, k, j-1)+xkmhdd(i-1, k, j)))/(msfux(i& & , j)+msfux(i, j-1)) 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 mkrdypd = (msfuy(i, j)+msfuy(i, j+1))*0.25**2*rdy*((mud(i, j)+& & mud(i, j+1)+mud(i-1, j+1)+mud(i-1, j))*(xkmhd(i, k, j)+xkmhd& & (i, k, j+1)+xkmhd(i-1, k, j+1)+xkmhd(i-1, k, j))+(mu(i, j)+& & mu(i, j+1)+mu(i-1, j+1)+mu(i-1, j))*(xkmhdd(i, k, j)+xkmhdd(& & i, k, j+1)+xkmhdd(i-1, k, j+1)+xkmhdd(i-1, k, j)))/(msfux(i& & , j)+msfux(i, j+1)) 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 mrdy = msfux(i, j)*msfuy(i, j)*rdy ! correctly averaged version of rho~ * m^2 * ! [partial d/dX(partial du^/dX) + partial d/dY(partial du^/dY)] tendencyd(i, k, j) = tendencyd(i, k, j) + mrdx*(mkrdxpd*(field& & (i+1, k, j)-field(i, k, j))+mkrdxp*(fieldd(i+1, k, j)-fieldd& & (i, k, j))-mkrdxmd*(field(i, k, j)-field(i-1, k, j))-mkrdxm*& & (fieldd(i, k, j)-fieldd(i-1, k, j))) + mrdy*(mkrdypd*(field(& & i, k, j+1)-field(i, k, j))+mkrdyp*(fieldd(i, k, j+1)-fieldd(& & i, k, j))-mkrdymd*(field(i, k, j)-field(i, k, j-1))-mkrdym*(& & fieldd(i, k, j)-fieldd(i, k, j-1))) tendency(i, k, j) = tendency(i, k, j) + (mrdx*(mkrdxp*(field(i& & +1, k, j)-field(i, k, j))-mkrdxm*(field(i, k, j)-field(i-1, & & k, j)))+mrdy*(mkrdyp*(field(i, k, j+1)-field(i, k, j))-& & mkrdym*(field(i, k, j)-field(i, k, j-1)))) 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 mkrdxmd = (msfvx(i, j)+msfvx(i-1, j))*0.25**2*rdx*((mud(i, j)+& & mud(i, j-1)+mud(i-1, j-1)+mud(i-1, j))*(xkmhd(i, k, j)+xkmhd& & (i, k, j-1)+xkmhd(i-1, k, j-1)+xkmhd(i-1, k, j))+(mu(i, j)+& & mu(i, j-1)+mu(i-1, j-1)+mu(i-1, j))*(xkmhdd(i, k, j)+xkmhdd(& & i, k, j-1)+xkmhdd(i-1, k, j-1)+xkmhdd(i-1, k, j)))/(msfvy(i& & , j)+msfvy(i-1, j)) 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 mkrdxpd = (msfvx(i, j)+msfvx(i+1, j))*0.25**2*rdx*((mud(i, j)+& & mud(i, j-1)+mud(i+1, j-1)+mud(i+1, j))*(xkmhd(i, k, j)+xkmhd& & (i, k, j-1)+xkmhd(i+1, k, j-1)+xkmhd(i+1, k, j))+(mu(i, j)+& & mu(i, j-1)+mu(i+1, j-1)+mu(i+1, j))*(xkmhdd(i, k, j)+xkmhdd(& & i, k, j-1)+xkmhdd(i+1, k, j-1)+xkmhdd(i+1, k, j)))/(msfvy(i& & , j)+msfvy(i+1, j)) 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 mrdx = msfvx(i, j)*msfvy(i, j)*rdx mkrdymd = msfty(i, j-1)*rdy*xkmhdd(i, k, j-1)/msftx(i, j-1) mkrdym = msfty(i, j-1)/msftx(i, j-1)*xkmhd(i, k, j-1)*rdy mkrdypd = msfty(i, j)*rdy*xkmhdd(i, k, j)/msftx(i, j) mkrdyp = msfty(i, j)/msftx(i, j)*xkmhd(i, k, j)*rdy mrdy = msfvx(i, j)*msfvy(i, j)*rdy tendencyd(i, k, j) = tendencyd(i, k, j) + mrdx*(mkrdxpd*(field& & (i+1, k, j)-field(i, k, j))+mkrdxp*(fieldd(i+1, k, j)-fieldd& & (i, k, j))-mkrdxmd*(field(i, k, j)-field(i-1, k, j))-mkrdxm*& & (fieldd(i, k, j)-fieldd(i-1, k, j))) + mrdy*(mkrdypd*(field(& & i, k, j+1)-field(i, k, j))+mkrdyp*(fieldd(i, k, j+1)-fieldd(& & i, k, j))-mkrdymd*(field(i, k, j)-field(i, k, j-1))-mkrdym*(& & fieldd(i, k, j)-fieldd(i, k, j-1))) tendency(i, k, j) = tendency(i, k, j) + (mrdx*(mkrdxp*(field(i& & +1, k, j)-field(i, k, j))-mkrdxm*(field(i, k, j)-field(i-1, & & k, j)))+mrdy*(mkrdyp*(field(i, k, j+1)-field(i, k, j))-& & mkrdym*(field(i, k, j)-field(i, k, j-1)))) 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 mkrdxmd = msfux(i, j)*0.25**2*rdx*((2*mud(i, j)+2*mud(i-1, j))& & *(xkmhd(i, k, j)+xkmhd(i-1, k, j)+xkmhd(i, k-1, j)+xkmhd(i-1& & , k-1, j))+(mu(i, j)+mu(i-1, j)+mu(i, j)+mu(i-1, j))*(xkmhdd& & (i, k, j)+xkmhdd(i-1, k, j)+xkmhdd(i, k-1, j)+xkmhdd(i-1, k-& & 1, j)))/msfuy(i, j) 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 mkrdxpd = msfux(i+1, j)*0.25**2*rdx*((2*mud(i+1, j)+2*mud(i, j& & ))*(xkmhd(i+1, k, j)+xkmhd(i, k, j)+xkmhd(i+1, k-1, j)+xkmhd& & (i, k-1, j))+(mu(i+1, j)+mu(i, j)+mu(i+1, j)+mu(i, j))*(& & xkmhdd(i+1, k, j)+xkmhdd(i, k, j)+xkmhdd(i+1, k-1, j)+xkmhdd& & (i, k-1, j)))/msfuy(i+1, j) 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 mrdx = msftx(i, j)*msfty(i, j)*rdx ! mkrdym=(msfvy(i,j)/msfvx(i,j))* & mkrdymd = msfvy(i, j)*msfvx_inv(i, j)*0.25**2*rdy*((2*mud(i, j& & )+2*mud(i, j-1))*(xkmhd(i, k, j)+xkmhd(i, k, j-1)+xkmhd(i, k& & -1, j)+xkmhd(i, k-1, j-1))+(mu(i, j)+mu(i, j-1)+mu(i, j)+mu(& & i, j-1))*(xkmhdd(i, k, j)+xkmhdd(i, k, j-1)+xkmhdd(i, k-1, j& & )+xkmhdd(i, k-1, j-1))) 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 ! mkrdyp=(msfvy(i,j+1)/msfvx(i,j+1))* & mkrdypd = msfvy(i, j+1)*msfvx_inv(i, j+1)*0.25**2*rdy*((2*mud(& & i, j+1)+2*mud(i, j))*(xkmhd(i, k, j+1)+xkmhd(i, k, j)+xkmhd(& & i, k-1, j+1)+xkmhd(i, k-1, j))+(mu(i, j+1)+mu(i, j)+mu(i, j+& & 1)+mu(i, j))*(xkmhdd(i, k, j+1)+xkmhdd(i, k, j)+xkmhdd(i, k-& & 1, j+1)+xkmhdd(i, k-1, j))) 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 mrdy = msftx(i, j)*msfty(i, j)*rdy tendencyd(i, k, j) = tendencyd(i, k, j) + mrdx*(mkrdxpd*(field& & (i+1, k, j)-field(i, k, j))+mkrdxp*(fieldd(i+1, k, j)-fieldd& & (i, k, j))-mkrdxmd*(field(i, k, j)-field(i-1, k, j))-mkrdxm*& & (fieldd(i, k, j)-fieldd(i-1, k, j))) + mrdy*(mkrdypd*(field(& & i, k, j+1)-field(i, k, j))+mkrdyp*(fieldd(i, k, j+1)-fieldd(& & i, k, j))-mkrdymd*(field(i, k, j)-field(i, k, j-1))-mkrdym*(& & fieldd(i, k, j)-fieldd(i, k, j-1))) tendency(i, k, j) = tendency(i, k, j) + (mrdx*(mkrdxp*(field(i& & +1, k, j)-field(i, k, j))-mkrdxm*(field(i, k, j)-field(i-1, & & k, j)))+mrdy*(mkrdyp*(field(i, k, j+1)-field(i, k, j))-& & mkrdym*(field(i, k, j)-field(i, k, j-1)))) 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 mkrdxmd = msfux(i, j)*0.5**2*rdx*((xkmhdd(i, k, j)+xkmhdd(i-1& & , k, j))*(mu(i, j)+mu(i-1, j))+(xkmhd(i, k, j)+xkmhd(i-1, k& & , j))*(mud(i, j)+mud(i-1, j)))/msfuy(i, j) 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 mkrdxpd = msfux(i+1, j)*0.5**2*rdx*((xkmhdd(i+1, k, j)+xkmhdd(& & i, k, j))*(mu(i+1, j)+mu(i, j))+(xkmhd(i+1, k, j)+xkmhd(i, k& & , j))*(mud(i+1, j)+mud(i, j)))/msfuy(i+1, j) 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(i,j))*0.5*(xkmhd(i,k,j)+xkmhd(i,k,j-1))*0.5*(mu(i,j)+mu(i,j-1))*rdy mkrdymd = msfvy(i, j)*msfvx_inv(i, j)*0.5**2*rdy*((xkmhdd(i, k& & , j)+xkmhdd(i, k, j-1))*(mu(i, j)+mu(i, j-1))+(xkmhd(i, k, j& & )+xkmhd(i, k, j-1))*(mud(i, j)+mud(i, j-1))) 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(i,j+1))*0.5*(xkmhd(i,k,j+1)+xkmhd(i,k,j))*0.5*(mu(i,j+1)+mu(i,j))*rdy mkrdypd = msfvy(i, j+1)*msfvx_inv(i, j+1)*0.5**2*rdy*((xkmhdd(& & i, k, j+1)+xkmhdd(i, k, j))*(mu(i, j+1)+mu(i, j))+(xkmhd(i, & & k, j+1)+xkmhd(i, k, j))*(mud(i, j+1)+mud(i, j))) 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 tendencyd(i, k, j) = tendencyd(i, k, j) + mrdx*(mkrdxpd*(field& & (i+1, k, j)-field(i, k, j))+mkrdxp*(fieldd(i+1, k, j)-fieldd& & (i, k, j))-mkrdxmd*(field(i, k, j)-field(i-1, k, j))-mkrdxm*& & (fieldd(i, k, j)-fieldd(i-1, k, j))) + mrdy*(mkrdypd*(field(& & i, k, j+1)-field(i, k, j))+mkrdyp*(fieldd(i, k, j+1)-fieldd(& & i, k, j))-mkrdymd*(field(i, k, j)-field(i, k, j-1))-mkrdym*(& & fieldd(i, k, j)-fieldd(i, k, j-1))) tendency(i, k, j) = tendency(i, k, j) + (mrdx*(mkrdxp*(field(i& & +1, k, j)-field(i, k, j))-mkrdxm*(field(i, k, j)-field(i-1, & & k, j)))+mrdy*(mkrdyp*(field(i, k, j+1)-field(i, k, j))-& & mkrdym*(field(i, k, j)-field(i, k, j-1)))) END DO END DO END DO END IF END SUBROUTINE G_HORIZONTAL_DIFFUSION SUBROUTINE g_horizontal_diffusion_3dmp(name,field,g_field,tendency, & g_tendency,mu,g_mu,config_flags,base_3d,msfux,msfuy,msfvx,msfvx_inv,msfvy, & msftx,msfty,khdif,xkmhd,g_xkmhd,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, & kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5, & g_Tmpv5,Tmpv6,g_Tmpv6 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,g_field,xkmhd,g_xkmhd,base_3d REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,g_tendency REAL,DIMENSION(ims:ime,jms:jme) :: mu,g_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,g_mrdx,mkrdxm,g_mkrdxm,mkrdxp,g_mkrdxp,mrdy,g_mrdy,mkrdym, & REAL :: mrdx,mkrdxm,g_mkrdxm,mkrdxp,g_mkrdxp,mrdy,mkrdym, & g_mkrdym,mkrdyp,g_mkrdyp LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) i_start =its i_end =min(ite,ide-1) j_start =jts j_end =min(jte,jde-1) IF( config_flags%open_xs .or. specified ) i_start =max(ids+1,its) IF( config_flags%open_xe .or. specified ) i_end =min(ide-2,ite) IF( config_flags%open_ys .or. specified ) j_start =max(jds+1,jts) IF( config_flags%open_ye .or. specified ) j_end =min(jde-2,jte) IF( config_flags%periodic_x ) i_start =its IF( config_flags%periodic_x ) i_end =min(ite,ide-1) DO j =j_start,j_end DO k =kts,ktf DO i =i_start,i_end g_Tmpv1 =(msfux(i,j)/msfuy(i,j)) *0.5*(xkmhd(i,k,j) +xkmhd(i-1,k,j)) & *0.5*(g_mu(i,j) +g_mu(i-1,j)) +(msfux(i,j)/msfuy(i,j)) *0.5*(g_xkmhd(i,k,j) & +g_xkmhd(i-1,k,j))*0.5*(mu(i,j) +mu(i-1,j)) Tmpv1 =(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)) g_mkrdxm =g_Tmpv1*rdx mkrdxm =Tmpv1*rdx g_Tmpv1 =(msfux(i+1,j)/msfuy(i+1,j)) *0.5*(xkmhd(i+1,k,j) +xkmhd(i,k,j)) & *0.5*(g_mu(i+1,j) +g_mu(i,j)) +(msfux(i+1,j)/msfuy(i+1,j)) *0.5*(g_xkmhd(i+ & 1,k,j) +g_xkmhd(i,k,j))*0.5*(mu(i+1,j) +mu(i,j)) Tmpv1 =(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)) g_mkrdxp =g_Tmpv1*rdx mkrdxp =Tmpv1*rdx ! g_mrdx =0.0 ! Remarked by Ning Pan, 2010-07-23 mrdx =msftx(i,j) *msfty(i,j) *rdx g_Tmpv1 =(msfvy(i,j) *msfvx_inv(i,j)) *0.5*(xkmhd(i,k,j) +xkmhd(i,k,j-1)) & *0.5*(g_mu(i,j) +g_mu(i,j-1)) +(msfvy(i,j) *msfvx_inv(i,j)) *0.5*(g_xkmhd(i, & k,j) +g_xkmhd(i,k,j-1))*0.5*(mu(i,j) +mu(i,j-1)) Tmpv1 =(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)) g_mkrdym =g_Tmpv1*rdy mkrdym =Tmpv1*rdy g_Tmpv1 =(msfvy(i,j+1) *msfvx_inv(i,j+1)) *0.5*(xkmhd(i,k,j+1) +xkmhd(i,k,j)) & *0.5*(g_mu(i,j+1) +g_mu(i,j)) +(msfvy(i,j+1) *msfvx_inv(i,j+1)) *0.5*( & g_xkmhd(i,k,j+1) +g_xkmhd(i,k,j))*0.5*(mu(i,j+1) +mu(i,j)) Tmpv1 =(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)) g_mkrdyp =g_Tmpv1*rdy mkrdyp =Tmpv1*rdy ! g_mrdy =0.0 ! Remarked by Ning Pan, 2010-07-23 mrdy =msftx(i,j) *msfty(i,j) *rdy g_Tmpv1 =mkrdxp*(g_field(i+1,k,j) -g_field(i,k,j)) +g_mkrdxp*(field(i+1, & k,j) -field(i,k,j) -base_3d(i+1,k,j) +base_3d(i,k,j)) Tmpv1 =mkrdxp*(field(i+1,k,j) -field(i,k,j) -base_3d(i+1,k,j) +base_3d(i,k,j)) g_Tmpv2 =mkrdxm*(g_field(i,k,j) -g_field(i-1,k,j)) +g_mkrdxm*(field(i,k, & j) -field(i-1,k,j) -base_3d(i,k,j) +base_3d(i-1,k,j)) Tmpv2 =mkrdxm*(field(i,k,j) -field(i-1,k,j) -base_3d(i,k,j) +base_3d(i-1,k,j)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv3 =mrdx*(g_Tmpv1 -g_Tmpv2) +g_mrdx*(Tmpv1 -Tmpv2) g_Tmpv3 =mrdx*(g_Tmpv1 -g_Tmpv2) Tmpv3 =mrdx*(Tmpv1 -Tmpv2) g_Tmpv4 =mkrdyp*(g_field(i,k,j+1) -g_field(i,k,j)) +g_mkrdyp*(field(i,k, & j+1) -field(i,k,j) -base_3d(i,k,j+1) +base_3d(i,k,j)) Tmpv4 =mkrdyp*(field(i,k,j+1) -field(i,k,j) -base_3d(i,k,j+1) +base_3d(i,k,j)) g_Tmpv5 =mkrdym*(g_field(i,k,j) -g_field(i,k,j-1)) +g_mkrdym*(field(i,k, & j) -field(i,k,j-1) -base_3d(i,k,j) +base_3d(i,k,j-1)) Tmpv5 =mkrdym*(field(i,k,j) -field(i,k,j-1) -base_3d(i,k,j) +base_3d(i,k,j-1)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv6 =mrdy*(g_Tmpv4 -g_Tmpv5) +g_mrdy*(Tmpv4 -Tmpv5) g_Tmpv6 =mrdy*(g_Tmpv4 -g_Tmpv5) Tmpv6 =mrdy*(Tmpv4 -Tmpv5) g_tendency(i,k,j) =g_tendency(i,k,j) +(g_Tmpv3 +g_Tmpv6) tendency(i,k,j) =tendency(i,k,j) +(Tmpv3 +Tmpv6) ENDDO ENDDO ENDDO END SUBROUTINE g_horizontal_diffusion_3dmp SUBROUTINE g_vertical_diffusion(name,field,g_field,tendency,g_tendency, & config_flags,alt,g_alt,mut,g_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims, & ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_field,alt,g_alt REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,g_tendency REAL,DIMENSION(ims:ime,jms:jme) :: mut,g_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,g_vfluxm,vfluxp,g_vfluxp,zz,g_zz ! Remarked by Ning Pan, 2010-07-23 REAL,DIMENSION(its:ite,0:kte+1) :: vflux,g_vflux ! REAL :: rdz,g_rdz ! Remarked by Ning Pan, 2010-07-23 LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) 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 g_Tmpv1 =(kvdif/alt(i,k,j))*rdnw(k)*(g_field(i,k+1,j) -g_field(i,k,j)) & +(-kvdif*g_alt(i,k,j)/(alt(i,k,j)*alt(i,k,j)))*rdnw(k)*(field(i,k+1,j) -field(i,k,j)) Tmpv1 =(kvdif/alt(i,k,j))*rdnw(k)*(field(i,k+1,j) -field(i,k,j)) g_vflux(i,k) =g_Tmpv1 vflux(i,k) =Tmpv1 ENDDO ENDDO DO i =i_start,i_end g_vflux(i,ktf) =0.0 vflux(i,ktf) =0. ENDDO DO k =kts+1,ktf DO i =i_start,i_end g_Tmpv1 =((-rdn(k) *g *g*g_mut(i,j)/(mut(i,j)*mut(i,j)))*(0.5*(alt(i,k,j) & +alt(i,k-1,j))) -(0.5*(g_alt(i,k,j) +g_alt(i,k-1,j)))*rdn(k) *g *g/mut(i,j)) & /((0.5*(alt(i,k,j) +alt(i,k-1,j)))*(0.5*(alt(i,k,j) +alt(i,k-1,j)))) Tmpv1 =rdn(k) *g *g/mut(i,j)/(0.5*(alt(i,k,j) +alt(i,k-1,j))) g_Tmpv2 =Tmpv1*(g_vflux(i,k) -g_vflux(i,k-1)) +g_Tmpv1*(vflux(i,k) -vflux(i,k-1)) Tmpv2 =Tmpv1*(vflux(i,k) -vflux(i,k-1)) g_tendency(i,k,j) =g_tendency(i,k,j) +g_Tmpv2 tendency(i,k,j) =tendency(i,k,j) +Tmpv2 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 g_Tmpv1 =kvdif *rdn(k+1)/(0.5*(alt(i,k,j) +alt(i,k+1,j)))*(g_field(i,k+1,j) & -g_field(i,k,j)) +(-kvdif *rdn(k+1)*(0.5*(g_alt(i,k,j) +g_alt(i,k+1,j))) & /((0.5*(alt(i,k,j) +alt(i,k+1,j)))*(0.5*(alt(i,k,j) +alt(i,k+1,j)))))*(field(i,k+1,j) & -field(i,k,j)) Tmpv1 =kvdif *rdn(k+1)/(0.5*(alt(i,k,j) +alt(i,k+1,j)))*(field(i,k+1,j) -field(i,k,j)) g_vflux(i,k) =g_Tmpv1 vflux(i,k) =Tmpv1 ENDDO ENDDO DO i =i_start,i_end g_vflux(i,0) =g_vflux(i,1) vflux(i,0) =vflux(i,1) ENDDO DO i =i_start,i_end g_vflux(i,ktf) =0.0 vflux(i,ktf) =0. ENDDO DO k =kts,ktf DO i =i_start,i_end g_Tmpv1 =((-g *g*g_mut(i,j)/(mut(i,j)*mut(i,j)))*alt(i,k,j) -g_alt(i,k,j) & *g *g/mut(i,j))/(alt(i,k,j)*alt(i,k,j)) Tmpv1 =g *g/mut(i,j)/alt(i,k,j) g_Tmpv2 =Tmpv1*rdnw(k)*(g_vflux(i,k) -g_vflux(i,k-1)) +g_Tmpv1*rdnw(k) & *(vflux(i,k) -vflux(i,k-1)) Tmpv2 =Tmpv1*rdnw(k)*(vflux(i,k) -vflux(i,k-1)) g_tendency(i,k,j) =g_tendency(i,k,j) +g_Tmpv2 tendency(i,k,j) =tendency(i,k,j) +Tmpv2 ENDDO ENDDO ENDDO ENDIF END SUBROUTINE g_vertical_diffusion SUBROUTINE g_vertical_diffusion_mp(field,g_field,tendency,g_tendency, & config_flags,base,alt,g_alt,mut,g_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_field,alt,g_alt REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,g_tendency REAL,DIMENSION(ims:ime,jms:jme) :: mut,g_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,g_vflux REAL :: rdz,g_rdz LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) 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 g_Tmpv1 =kvdif *rdn(k+1)/(0.5*(alt(i,k,j) +alt(i,k+1,j)))*(g_field(i,k+1,j) & -g_field(i,k,j)) +(-kvdif *rdn(k+1)*(0.5*(g_alt(i,k,j) +g_alt(i,k+1,j))) & /((0.5*(alt(i,k,j) +alt(i,k+1,j)))*(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)) Tmpv1 =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)) g_vflux(i,k) =g_Tmpv1 vflux(i,k) =Tmpv1 ENDDO ENDDO DO i =i_start,i_end g_vflux(i,0) =g_vflux(i,1) vflux(i,0) =vflux(i,1) ENDDO DO i =i_start,i_end g_vflux(i,ktf) =0.0 vflux(i,ktf) =0. ENDDO DO k =kts,ktf DO i =i_start,i_end g_Tmpv1 =((-g *g*g_mut(i,j)/(mut(i,j)*mut(i,j)))*alt(i,k,j) -g_alt(i,k,j) & *g *g/mut(i,j))/(alt(i,k,j)*alt(i,k,j)) Tmpv1 =g *g/mut(i,j)/alt(i,k,j) g_Tmpv2 =Tmpv1*rdnw(k)*(g_vflux(i,k) -g_vflux(i,k-1)) +g_Tmpv1*rdnw(k) & *(vflux(i,k) -vflux(i,k-1)) Tmpv2 =Tmpv1*rdnw(k)*(vflux(i,k) -vflux(i,k-1)) g_tendency(i,k,j) =g_tendency(i,k,j) +g_Tmpv2 tendency(i,k,j) =tendency(i,k,j) +Tmpv2 ENDDO ENDDO ENDDO END SUBROUTINE g_vertical_diffusion_mp SUBROUTINE g_vertical_diffusion_3dmp(field,g_field,tendency,g_tendency, & config_flags,base_3d,alt,g_alt,mut,g_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds, & kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_field,alt,g_alt,base_3d REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,g_tendency REAL,DIMENSION(ims:ime,jms:jme) :: mut,g_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,g_vflux ! REAL :: rdz,g_rdz ! Remarked by Ning Pan, 2010-07-23 LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) 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 g_Tmpv1 =kvdif *rdn(k+1)/(0.5*(alt(i,k,j) +alt(i,k+1,j)))*(g_field(i,k+1,j) & -g_field(i,k,j)) +(-kvdif *rdn(k+1)*(0.5*(g_alt(i,k,j) +g_alt(i,k+1,j))) & /((0.5*(alt(i,k,j) +alt(i,k+1,j)))*(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)) Tmpv1 =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)) g_vflux(i,k) =g_Tmpv1 vflux(i,k) =Tmpv1 ENDDO ENDDO DO i =i_start,i_end g_vflux(i,0) =g_vflux(i,1) vflux(i,0) =vflux(i,1) ENDDO DO i =i_start,i_end g_vflux(i,ktf) =0.0 vflux(i,ktf) =0. ENDDO DO k =kts,ktf DO i =i_start,i_end g_Tmpv1 =((-g *g*g_mut(i,j)/(mut(i,j)*mut(i,j)))*alt(i,k,j) -g_alt(i,k,j) & *g *g/mut(i,j))/(alt(i,k,j)*alt(i,k,j)) Tmpv1 =g *g/mut(i,j)/alt(i,k,j) g_Tmpv2 =Tmpv1*rdnw(k)*(g_vflux(i,k) -g_vflux(i,k-1)) +g_Tmpv1*rdnw(k) & *(vflux(i,k) -vflux(i,k-1)) Tmpv2 =Tmpv1*rdnw(k)*(vflux(i,k) -vflux(i,k-1)) g_tendency(i,k,j) =g_tendency(i,k,j) +g_Tmpv2 tendency(i,k,j) =tendency(i,k,j) +Tmpv2 ENDDO ENDDO ENDDO END SUBROUTINE g_vertical_diffusion_3dmp SUBROUTINE g_vertical_diffusion_u(field,g_field,tendency,g_tendency, & config_flags,u_base,alt,g_alt,muu,g_muu,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_field,alt,g_alt REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,g_tendency REAL,DIMENSION(ims:ime,jms:jme) :: muu,g_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,g_vflux REAL :: rdz,g_rdz,zz,g_zz LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) i_start =its i_end =ite j_start =jts j_end =min(jte,jde-1) IF( config_flags%open_xs .or. specified ) i_start =max(ids+1,its) IF( config_flags%open_xe .or. specified ) i_end =min(ide-1,ite) 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-1 DO i =i_start,i_end g_Tmpv1 =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)))*(g_field(i,k+1,j) -g_field(i,k,j)) +(-kvdif *rdn(k+1) & *(0.25*(g_alt(i,k,j) +g_alt(i-1,k,j) +g_alt(i,k+1,j) +g_alt(i-1,k+1,j))) & /((0.25*(alt(i,k,j) +alt(i-1,k,j) +alt(i,k+1,j) +alt(i-1,k+1,j)))*(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)) Tmpv1 =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)) g_vflux(i,k) =g_Tmpv1 vflux(i,k) =Tmpv1 ENDDO ENDDO DO i =i_start,i_end g_vflux(i,0) =g_vflux(i,1) vflux(i,0) =vflux(i,1) ENDDO DO i =i_start,i_end g_vflux(i,ktf) =0.0 vflux(i,ktf) =0. ENDDO DO k =kts,ktf-1 DO i =i_start,i_end g_Tmpv1 =((-g *g *rdnw(k)*g_muu(i,j)/(muu(i,j)*muu(i,j)))*(0.5*(alt(i-1,k,j) & +alt(i,k,j))) -(0.5*(g_alt(i-1,k,j) +g_alt(i,k,j)))*g *g *rdnw(k)/muu(i,j)) & /((0.5*(alt(i-1,k,j) +alt(i,k,j)))*(0.5*(alt(i-1,k,j) +alt(i,k,j)))) Tmpv1 =g *g *rdnw(k)/muu(i,j)/(0.5*(alt(i-1,k,j) +alt(i,k,j))) g_Tmpv2 =Tmpv1*(g_vflux(i,k) -g_vflux(i,k-1)) +g_Tmpv1*(vflux(i,k) -vflux(i,k-1)) Tmpv2 =Tmpv1*(vflux(i,k) -vflux(i,k-1)) g_tendency(i,k,j) =g_tendency(i,k,j) +g_Tmpv2 tendency(i,k,j) =tendency(i,k,j) +Tmpv2 ENDDO ENDDO ENDDO END SUBROUTINE g_vertical_diffusion_u SUBROUTINE g_vertical_diffusion_v(field,g_field,tendency,g_tendency, & config_flags,v_base,alt,g_alt,muv,g_muv,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_field,alt,g_alt REAL,DIMENSION(kms:kme) :: rdn,rdnw,v_base REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tendency,g_tendency REAL,DIMENSION(ims:ime,jms:jme) :: muv,g_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,g_vflux ! REAL :: rdz,g_rdz,zz,g_zz ! Remarked by Ning Pan, 2010-07-23 LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) i_start =its i_end =min(ite,ide-1) j_start =jts j_end =min(jte,jde-1) IF( config_flags%open_ys .or. specified ) j_start =max(jds+1,jts) IF( config_flags%open_ye .or. specified ) j_end =min(jde-1,jte) DO j =j_start,j_end jm1 =j-1 DO k =kts,ktf-1 DO i =i_start,i_end g_Tmpv1 =kvdif *rdn(k+1)/(0.25*(alt(i,k,j) +alt(i,k,jm1) +alt(i,k+1,j) & +alt(i,k+1,jm1)))*(g_field(i,k+1,j) -g_field(i,k,j)) +(-kvdif *rdn(k+1) & *(0.25*(g_alt(i,k,j) +g_alt(i,k,jm1) +g_alt(i,k+1,j) +g_alt(i,k+1,jm1))) & /((0.25*(alt(i,k,j) +alt(i,k,jm1) +alt(i,k+1,j) +alt(i,k+1,jm1)))*(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)) Tmpv1 =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)) g_vflux(i,k) =g_Tmpv1 vflux(i,k) =Tmpv1 ENDDO ENDDO DO i =i_start,i_end g_vflux(i,0) =g_vflux(i,1) vflux(i,0) =vflux(i,1) ENDDO DO i =i_start,i_end g_vflux(i,ktf) =0.0 vflux(i,ktf) =0. ENDDO DO k =kts,ktf-1 DO i =i_start,i_end g_Tmpv1 =((-g *g *rdnw(k)*g_muv(i,j)/(muv(i,j)*muv(i,j)))*(0.5*(alt(i,k,jm1) & +alt(i,k,j))) -(0.5*(g_alt(i,k,jm1) +g_alt(i,k,j)))*g *g *rdnw(k)/muv(i,j)) & /((0.5*(alt(i,k,jm1) +alt(i,k,j)))*(0.5*(alt(i,k,jm1) +alt(i,k,j)))) Tmpv1 =g *g *rdnw(k)/muv(i,j)/(0.5*(alt(i,k,jm1) +alt(i,k,j))) g_Tmpv2 =Tmpv1*(g_vflux(i,k) -g_vflux(i,k-1)) +g_Tmpv1*(vflux(i,k) -vflux(i,k-1)) Tmpv2 =Tmpv1*(vflux(i,k) -vflux(i,k-1)) g_tendency(i,k,j) =g_tendency(i,k,j) +g_Tmpv2 tendency(i,k,j) =tendency(i,k,j) +Tmpv2 ENDDO ENDDO ENDDO END SUBROUTINE g_vertical_diffusion_v SUBROUTINE g_calculate_full ( rfield, g_rfield, rfieldb, rfieldp, g_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(IN ) :: g_rfieldp REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(IN ) :: rfieldb, & rfieldp REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT ) :: g_rfield REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT ) :: 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 g_rfield(i,k,j)=g_rfieldp(i,k,j) rfield(i,k,j)=rfieldb(i,k,j)+rfieldp(i,k,j) ENDDO ENDDO ENDDO END SUBROUTINE g_calculate_full ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of coriolis in forward (tangent) mode: ! variations of useful results: ru_tend rw_tend 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:in rv:in rw:in rv_tend:in-out SUBROUTINE G_CORIOLIS(ru, rud, rv, rvd, rw, rwd, ru_tend, ru_tendd, & & rv_tend, rv_tendd, rw_tend, rw_tendd, 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), INTENT(INOUT) :: ru_tendd& & , rv_tendd, rw_tendd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: ru, rv, rw REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: rud, rvd, & & rwd 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 :: min4 INTEGER :: min3 INTEGER :: min2 INTEGER :: min1 ! ! ! 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 DO j=jts,min1 DO k=kts,ktf DO i=i_start,i_end ru_tendd(i, k, j) = ru_tendd(i, k, j) + msfux(i, j)*0.5*(f(i, j)& & +f(i-1, j))*0.25*(rvd(i-1, k, j+1)+rvd(i, k, j+1)+rvd(i-1, k, & & j)+rvd(i, k, j))/msfuy(i, j) - 0.5**2*(e(i, j)+e(i-1, j))*(& & cosa(i, j)+cosa(i-1, j))*0.25*(rwd(i-1, k+1, j)+rwd(i-1, k, j)& & +rwd(i, k+1, j)+rwd(i, k, j)) 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))*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)) END DO END DO END DO ! 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 DO i=its,min2 rv_tendd(i, k, j) = rv_tendd(i, k, j) - msfvy(i, j)*0.5*(f(i, j)& & +f(i, j-1))*0.25*(rud(i, k, j)+rud(i+1, k, j)+rud(i, k, j-1)+& & rud(i+1, k, j-1))/msfvx(i, j) + msfvy(i, j)*0.5**2*(e(i, j)+e(& & i, j-1))*(sina(i, j)+sina(i, j-1))*0.25*(rwd(i, k+1, j-1)+rwd(& & i, k, j-1)+rwd(i, k+1, j)+rwd(i, k, j))/msfvx(i, j) 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)) END DO 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 DO i=its,min4 rw_tendd(i, k, j) = rw_tendd(i, k, j) + e(i, j)*(cosa(i, j)*0.5*& & (fzm(k)*(rud(i, k, j)+rud(i+1, k, j))+fzp(k)*(rud(i, k-1, j)+& & rud(i+1, k-1, j)))-msftx(i, j)*sina(i, j)*0.5*(fzm(k)*(rvd(i, & & k, j)+rvd(i, k, j+1))+fzp(k)*(rvd(i, k-1, j)+rvd(i, k-1, j+1))& & )/msfty(i, j)) 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)))) END DO END DO END DO END SUBROUTINE G_CORIOLIS SUBROUTINE g_perturbation_coriolis(ru_in,g_ru_in,rv_in,g_rv_in,rw,g_rw, & ru_tend,g_ru_tend,rv_tend,g_rv_tend,rw_tend,g_rw_tend,config_flags,u_base, & v_base,z_base,muu,g_muu,muv,g_muv,phb,ph,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3,Tmpv4,g_Tmpv4,Tmpv5, & g_Tmpv5,Tmpv6,g_Tmpv6,Tmpv7,g_Tmpv7,Tmpv8,g_Tmpv8,Tmpv9,g_Tmpv9 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,g_ru_tend,rv_tend,g_rv_tend, & rw_tend,g_rw_tend REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru_in,g_ru_in,rv_in,g_rv_in,rw, & g_rw,ph,g_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,g_muu,muv,g_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,g_ru,rv,g_rv REAL :: z_at_u,g_z_at_u,z_at_v,g_z_at_v,wkp1,g_wkp1,wk,g_wk,wkm1,g_wkm1 INTEGER :: i,j,k,ktf INTEGER :: i_start,i_end,j_start,j_end LOGICAL :: specified specified =.false. if(config_flags%specified .or. config_flags%nested) specified =.true. ktf =min(kte,kde-1) 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 DO j =jts,min(jte,jde-1) +1 DO k =kts+1,ktf-1 DO i =i_start-1,i_end g_z_at_v =0.25*(g_ph(i,k,j) +g_ph(i,k+1,j) +g_ph(i,k,j-1) +g_ph(i,k+1,j-1))/g 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 g_wkp1 =(0.0 +((0.0 +g_z_at_v +(0.0 -g_z_at_v)*sign(1.0, 0. -(z_at_v - & z_base(k))))*0.5/(z_base(k+1)-z_base(k))) -(0.0 -((0.0 +g_z_at_v +(0.0 - & g_z_at_v)*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 wkp1 =min(1.,max(0.,z_at_v -z_base(k))/(z_base(k+1)-z_base(k))) !REVISED BY WALLS !g_wkm1 =(0.0 +((0.0 +g_z_at_v +(0.0 +g_z_at_v)*sign(1.0, 0. -(z_base(k) & ! Revised by Ning Pan, 2010-07-24 ! g_wkm1 =(0.0 +((0.0 +g_z_at_v +(0.0 +g_z_at_v)*sign(1.0, 0. -(z_base(k) & ! -z_at_v)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 +g_z_at_v +(0.0 + & ! g_z_at_v)*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 g_wkm1 =(0.0 +((0.0 -g_z_at_v +(0.0 +g_z_at_v)*sign(1.0, 0. -(z_base(k) & -z_at_v)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 -g_z_at_v +(0.0 + & g_z_at_v)*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 wkm1 =min(1.,max(0.,z_base(k) -z_at_v)/(z_base(k)-z_base(k-1))) g_wk =-g_wkp1 -g_wkm1 wk =1. -wkp1 -wkm1 g_Tmpv1 =muv(i,j)*(g_wkm1*v_base(k-1) +g_wk*v_base(k) +g_wkp1*v_base(k+ & 1)) +g_muv(i,j)*(wkm1*v_base(k-1) +wk*v_base(k) +wkp1*v_base(k+1)) Tmpv1 =muv(i,j)*(wkm1*v_base(k-1) +wk*v_base(k) +wkp1*v_base(k+1)) g_rv(i,k,j) =g_rv_in(i,k,j) -g_Tmpv1 rv(i,k,j) =rv_in(i,k,j) -Tmpv1 ENDDO ENDDO ENDDO DO j =jts,min(jte,jde-1) +1 DO i =i_start-1,i_end k =kts g_z_at_v =0.25*(g_ph(i,k,j) +g_ph(i,k+1,j) +g_ph(i,k,j-1) +g_ph(i,k+1,j-1))/g 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 g_wkp1 =(0.0 +((0.0 +g_z_at_v +(0.0 -g_z_at_v)*sign(1.0, 0. -(z_at_v - & z_base(k))))*0.5/(z_base(k+1)-z_base(k))) -(0.0 -((0.0 +g_z_at_v +(0.0 - & g_z_at_v)*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 wkp1 =min(1.,max(0.,z_at_v -z_base(k))/(z_base(k+1)-z_base(k))) g_wk =-g_wkp1 wk =1. -wkp1 g_Tmpv1 =muv(i,j)*(g_wk*v_base(k) +g_wkp1*v_base(k+1)) +g_muv(i,j) & *(wk*v_base(k) +wkp1*v_base(k+1)) Tmpv1 =muv(i,j)*(wk*v_base(k) +wkp1*v_base(k+1)) g_rv(i,k,j) =g_rv_in(i,k,j) -g_Tmpv1 rv(i,k,j) =rv_in(i,k,j) -Tmpv1 k =ktf g_z_at_v =0.25*(g_ph(i,k,j) +g_ph(i,k+1,j) +g_ph(i,k,j-1) +g_ph(i,k+1,j-1))/g 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 ! Revised by Ning Pan, 2010-07-24 ! g_wkm1 =(0.0 +((0.0 +g_z_at_v +(0.0 +g_z_at_v)*sign(1.0, 0. -(z_base(k) & ! -z_at_v)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 +g_z_at_v +(0.0 + & ! g_z_at_v)*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 g_wkm1 =(0.0 +((0.0 -g_z_at_v +(0.0 +g_z_at_v)*sign(1.0, 0. -(z_base(k) & -z_at_v)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 -g_z_at_v +(0.0 + & g_z_at_v)*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 wkm1 =min(1.,max(0.,z_base(k) -z_at_v)/(z_base(k)-z_base(k-1))) g_wk =-g_wkm1 wk =1. -wkm1 g_Tmpv1 =muv(i,j)*(g_wkm1*v_base(k-1) +g_wk*v_base(k)) +g_muv(i,j) & *(wkm1*v_base(k-1) +wk*v_base(k)) Tmpv1 =muv(i,j)*(wkm1*v_base(k-1) +wk*v_base(k)) g_rv(i,k,j) =g_rv_in(i,k,j) -g_Tmpv1 rv(i,k,j) =rv_in(i,k,j) -Tmpv1 ENDDO ENDDO DO j =jts,min(jte,jde-1) DO k =kts,ktf DO i =i_start,i_end g_ru_tend(i,k,j) =g_ru_tend(i,k,j) +(msfux(i,j)/msfuy(i,j)) *0.5 *(f(i,j) & +f(i-1,j)) *0.25*(g_rv(i-1,k,j+1) +g_rv(i,k,j+1) +g_rv(i-1,k,j) & +g_rv(i,k,j)) -0.5 *(e(i,j)+e(i-1,j)) *0.5 *(cosa(i,j)+cosa(i-1,j)) & *0.25*(g_rw(i-1,k+1,j) +g_rw(i-1,k,j) +g_rw(i,k+1,j) +g_rw(i,k,j)) 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)) & *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 ! boundary loops for perturbation coriolis is needed for open bdy (20110307 XZ) IF( (config_flags%open_xs) .and. (its == ids) ) THEN DO k =kts,ktf g_ru_tend(its,k,j) =g_ru_tend(its,k,j) +(msfux(its,j)/msfuy(its,j)) & *0.5 *(f(its,j)+f(its,j)) *0.25*(g_rv(its,k,j+1) +g_rv(its,k,j+1) & +g_rv(its,k,j) +g_rv(its,k,j)) -0.5 *(e(its,j)+e(its,j)) *0.5 *(cosa(its,j) & +cosa(its,j)) *0.25*(g_rw(its,k+1,j) +g_rw(its,k,j) +g_rw(its,k+1,j) & +g_rw(its,k,j)) 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 g_ru_tend(ite,k,j) =g_ru_tend(ite,k,j) +(msfux(ite,j)/msfuy(ite,j)) & *0.5 *(f(ite-1,j)+f(ite-1,j)) *0.25*(g_rv(ite-1,k,j+1) +g_rv(ite-1,k,j+1) & +g_rv(ite-1,k,j) +g_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*(g_rw(ite-1,k+1,j) +g_rw(ite-1,k,j) & +g_rw(ite-1,k+1,j) +g_rw(ite-1,k,j)) 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 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) DO j =j_start-1,j_end DO k =kts+1,ktf-1 DO i =its,min(ite,ide-1) +1 g_z_at_u =0.25*(g_ph(i,k,j) +g_ph(i,k+1,j) +g_ph(i-1,k,j) +g_ph(i-1,k+1,j))/g 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 g_wkp1 =(0.0 +((0.0 +g_z_at_u +(0.0 -g_z_at_u)*sign(1.0, 0. -(z_at_u - & z_base(k))))*0.5/(z_base(k+1)-z_base(k))) -(0.0 -((0.0 +g_z_at_u +(0.0 - & g_z_at_u)*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 wkp1 =min(1.,max(0.,z_at_u -z_base(k))/(z_base(k+1)-z_base(k))) ! Revised by Ning Pan, 2010-07-24 ! g_wkm1 =(0.0 +((0.0 +g_z_at_u +(0.0 +g_z_at_u)*sign(1.0, 0. -(z_base(k) & ! -z_at_u)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 +g_z_at_u +(0.0 + & ! g_z_at_u)*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 g_wkm1 =(0.0 +((0.0 -g_z_at_u +(0.0 +g_z_at_u)*sign(1.0, 0. -(z_base(k) & -z_at_u)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 -g_z_at_u +(0.0 + & g_z_at_u)*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 wkm1 =min(1.,max(0.,z_base(k) -z_at_u)/(z_base(k)-z_base(k-1))) g_wk =-g_wkp1 -g_wkm1 wk =1. -wkp1 -wkm1 g_Tmpv1 =muu(i,j)*(g_wkm1*u_base(k-1) +g_wk*u_base(k) +g_wkp1*u_base(k+ & 1)) +g_muu(i,j)*(wkm1*u_base(k-1) +wk*u_base(k) +wkp1*u_base(k+1)) Tmpv1 =muu(i,j)*(wkm1*u_base(k-1) +wk*u_base(k) +wkp1*u_base(k+1)) g_ru(i,k,j) =g_ru_in(i,k,j) -g_Tmpv1 ru(i,k,j) =ru_in(i,k,j) -Tmpv1 ENDDO ENDDO ENDDO DO j =j_start-1,j_end DO i =its,min(ite,ide-1) +1 k =kts g_z_at_u =0.25*(g_ph(i,k,j) +g_ph(i,k+1,j) +g_ph(i-1,k,j) +g_ph(i-1,k+1,j))/g 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 g_wkp1 =(0.0 +((0.0 +g_z_at_u +(0.0 -g_z_at_u)*sign(1.0, 0. -(z_at_u - & z_base(k))))*0.5/(z_base(k+1)-z_base(k))) -(0.0 -((0.0 +g_z_at_u +(0.0 - & g_z_at_u)*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 wkp1 =min(1.,max(0.,z_at_u -z_base(k))/(z_base(k+1)-z_base(k))) g_wk =-g_wkp1 wk =1. -wkp1 g_Tmpv1 =muu(i,j)*(g_wk*u_base(k) +g_wkp1*u_base(k+1)) +g_muu(i,j) & *(wk*u_base(k) +wkp1*u_base(k+1)) Tmpv1 =muu(i,j)*(wk*u_base(k) +wkp1*u_base(k+1)) g_ru(i,k,j) =g_ru_in(i,k,j) -g_Tmpv1 ru(i,k,j) =ru_in(i,k,j) -Tmpv1 k =ktf g_z_at_u =0.25*(g_ph(i,k,j) +g_ph(i,k+1,j) +g_ph(i-1,k,j) +g_ph(i-1,k+1,j))/g 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 ! Revised by Ning Pan, 2010-07-24 ! g_wkm1 =(0.0 +((0.0 +g_z_at_u +(0.0 +g_z_at_u)*sign(1.0, 0. -(z_base(k) & ! -z_at_u)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 +g_z_at_u +(0.0 + & ! g_z_at_u)*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 g_wkm1 =(0.0 +((0.0 -g_z_at_u +(0.0 +g_z_at_u)*sign(1.0, 0. -(z_base(k) & -z_at_u)))*0.5/(z_base(k)-z_base(k-1))) -(0.0 -((0.0 -g_z_at_u +(0.0 + & g_z_at_u)*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 wkm1 =min(1.,max(0.,z_base(k) -z_at_u)/(z_base(k)-z_base(k-1))) g_wk =-g_wkm1 wk =1. -wkm1 g_Tmpv1 =muu(i,j)*(g_wkm1*u_base(k-1) +g_wk*u_base(k)) +g_muu(i,j) & *(wkm1*u_base(k-1) +wk*u_base(k)) Tmpv1 =muu(i,j)*(wkm1*u_base(k-1) +wk*u_base(k)) g_ru(i,k,j) =g_ru_in(i,k,j) -g_Tmpv1 ru(i,k,j) =ru_in(i,k,j) -Tmpv1 ENDDO ENDDO ! boundary loops for perturbation coriolis is needed for open bdy (20110301 XZ) IF( (config_flags%open_ys) .and. (jts == jds) ) THEN DO k =kts,ktf DO i =its,min(ide-1,ite) g_rv_tend(i,k,jts) =g_rv_tend(i,k,jts) -(msfvy(i,jts)/msfvx(i,jts)) & *0.5 *(f(i,jts)+f(i,jts)) *0.25*(g_ru(i,k,jts) +g_ru(i+1,k,jts) +g_ru(i,k, & jts) +g_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*(g_rw(i,k+1,jts) +g_rw(i,k,jts) & +g_rw(i,k+1,jts) +g_rw(i,k,jts)) 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 DO i =its,min(ide-1,ite) g_rv_tend(i,k,j) =g_rv_tend(i,k,j) -(msfvy(i,j)/msfvx(i,j)) *0.5 *(f(i,j) & +f(i,j-1)) *0.25*(g_ru(i,k,j) +g_ru(i+1,k,j) +g_ru(i,k,j-1) +g_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*(g_rw(i,k+1,j-1) +g_rw(i,k,j-1) +g_rw(i,k+1,j) +g_rw(i,k,j)) 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 ! boundary loops for perturbation coriolis is needed for open bdy (20110307 XZ) IF( (config_flags%open_ye) .and. (jte == jde) ) THEN DO k =kts,ktf DO i =its,min(ide-1,ite) g_rv_tend(i,k,jte) =g_rv_tend(i,k,jte) -(msfvy(i,jte)/msfvx(i,jte)) & *0.5 *(f(i,jte-1)+f(i,jte-1)) *0.25*(g_ru(i,k,jte-1) +g_ru(i+1,k,jte-1) & +g_ru(i,k,jte-1) +g_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*(g_rw(i, & k+1,jte-1) +g_rw(i,k,jte-1) +g_rw(i,k+1,jte-1) +g_rw(i,k,jte-1)) 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 DO j =jts,min(jte,jde-1) DO k =kts+1,ktf DO i =its,min(ite,ide-1) g_rw_tend(i,k,j) =g_rw_tend(i,k,j) +e(i,j)*(cosa(i,j) *0.5*(fzm(k) & *(g_ru(i,k,j) +g_ru(i+1,k,j)) +fzp(k)*(g_ru(i,k-1,j) +g_ru(i+1,k-1,j))) & -(msftx(i,j)/msfty(i,j)) *sina(i,j) *0.5*(fzm(k)*(g_rv(i,k,j) +g_rv(i,k,j+1)) & +fzp(k)*(g_rv(i,k-1,j) +g_rv(i,k-1,j+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 END SUBROUTINE g_perturbation_coriolis ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of curvature in forward (tangent) mode: ! variations of useful results: ru_tend rw_tend rv_tend ! with respect to varying inputs: u v ru_tend rw_tend ru rv rw ! rv_tend ! RW status of diff variables: u:in v:in ru_tend:in-out rw_tend:in-out ! ru:in rv:in rw:in rv_tend:in-out SUBROUTINE G_CURVATURE(ru, rud, rv, rvd, rw, rwd, u, ud, v, vd, w, & & ru_tend, ru_tendd, rv_tend, rv_tendd, rw_tend, rw_tendd, 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), INTENT(INOUT) :: ru_tendd& & , rv_tendd, rw_tendd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: ru, rv, rw, & & u, v, w REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: rud, rvd, & & rwd, ud, vd 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) :: vxgmd LOGICAL :: specified REAL :: arg1 INTEGER :: min6 INTEGER :: min5 INTEGER :: min4 INTEGER :: min3 INTEGER :: min2 INTEGER :: min1 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 (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 ! 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) THEN i_end = ite vxgmd = 0.0 ELSE vxgmd = 0.0 END IF DO j=j_start,j_end DO k=kts,ktf DO i=i_start,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 - ??? vxgmd(i, k, j) = 0.5*(msfvx(i, j+1)-msfvx(i, j))*rdy*(ud(i, k, j& & )+ud(i+1, k, j)) - 0.5*(msfuy(i+1, j)-msfuy(i, j))*rdx*(vd(i, & & k, j)+vd(i, k, j+1)) 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 END DO END DO ! 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 vxgmd(its-1, k, j) = vxgmd(its, k, j) vxgm(its-1, k, j) = vxgm(its, k, j) END DO END DO 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 vxgmd(ite, k, j) = vxgmd(ite-1, k, j) vxgm(ite, k, j) = vxgm(ite-1, k, j) END DO END DO 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 vxgmd(i, k, jts-1) = vxgmd(i, k, jts) vxgm(i, k, jts-1) = vxgm(i, k, jts) END DO END DO 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 vxgmd(i, k, jte) = vxgmd(i, k, jte-1) vxgm(i, k, jte) = vxgm(i, k, jte-1) END DO END DO 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 DO j=jts,min1 DO k=kts,ktf DO i=i_start,i_end ru_tendd(i, k, j) = ru_tendd(i, k, j) + reradius*(ud(i, k, j)*& & (msfux(i, j)/msfuy(i, j)*0.25*(rv(i-1, k, j+1)+rv(i, k, j+1)& & +rv(i-1, k, j)+rv(i, k, j))*TAN(xlat(i, j)*degrad)-0.25*(rw(& & i-1, k+1, j)+rw(i-1, k, j)+rw(i, k+1, j)+rw(i, k, j)))+u(i, & & k, j)*(msfux(i, j)*0.25*TAN(xlat(i, j)*degrad)*(rvd(i-1, k, & & j+1)+rvd(i, k, j+1)+rvd(i-1, k, j)+rvd(i, k, j))/msfuy(i, j)& & -0.25*(rwd(i-1, k+1, j)+rwd(i-1, k, j)+rwd(i, k+1, j)+rwd(i& & , k, j)))) ru_tend(i, k, j) = ru_tend(i, k, j) + u(i, k, j)*reradius*(& & msfux(i, j)/msfuy(i, j)*0.25*(rv(i-1, k, j+1)+rv(i, k, j+1)+& & rv(i-1, k, j)+rv(i, k, j))*TAN(xlat(i, j)*degrad)-0.25*(rw(i& & -1, k+1, j)+rw(i-1, k, j)+rw(i, k+1, j)+rw(i, k, j))) END DO END DO END DO ELSE IF (jde - 1 .GT. jte) THEN min2 = jte ELSE min2 = jde - 1 END IF ! normal code DO j=jts,min2 DO k=kts,ktf DO i=i_start,i_end ru_tendd(i, k, j) = ru_tendd(i, k, j) + 0.5*0.25*((vxgmd(i, k& & , j)+vxgmd(i-1, k, j))*(rv(i-1, k, j+1)+rv(i, k, j+1)+rv(i-1& & , k, j)+rv(i, k, j))+(vxgm(i, k, j)+vxgm(i-1, k, j))*(rvd(i-& & 1, k, j+1)+rvd(i, k, j+1)+rvd(i-1, k, j)+rvd(i, k, j))) - & & reradius*0.25*(ud(i, k, j)*(rw(i-1, k+1, j)+rw(i-1, k, j)+rw& & (i, k+1, j)+rw(i, k, j))+u(i, k, j)*(rwd(i-1, k+1, j)+rwd(i-& & 1, k, j)+rwd(i, k+1, j)+rwd(i, k, j))) ru_tend(i, k, j) = ru_tend(i, k, j) + 0.5*(vxgm(i, k, j)+vxgm(& & i-1, k, j))*0.25*(rv(i-1, k, j+1)+rv(i, k, j+1)+rv(i-1, k, j& & )+rv(i, k, j)) - u(i, k, j)*reradius*0.25*(rw(i-1, k+1, j)+& & rw(i-1, k, j)+rw(i, k+1, j)+rw(i, k, j)) END DO END DO END DO 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 DO i=its,min3 arg1 = (xlat(i, j)+xlat(i, j-1))*0.5*degrad rv_tendd(i, k, j) = rv_tendd(i, k, j) - msfvy(i, j)*reradius*(& & 0.25**2*TAN(arg1)*((ud(i, k, j)+ud(i+1, k, j)+ud(i, k, j-1)+& & ud(i+1, k, j-1))*(ru(i, k, j)+ru(i+1, k, j)+ru(i, k, j-1)+ru& & (i+1, k, j-1))+(u(i, k, j)+u(i+1, k, j)+u(i, k, j-1)+u(i+1, & & k, j-1))*(rud(i, k, j)+rud(i+1, k, j)+rud(i, k, j-1)+rud(i+1& & , k, j-1)))+0.25*(vd(i, k, j)*(rw(i, k+1, j-1)+rw(i, k, j-1)& & +rw(i, k+1, j)+rw(i, k, j))+v(i, k, j)*(rwd(i, k+1, j-1)+rwd& & (i, k, j-1)+rwd(i, k+1, j)+rwd(i, k, j))))/msfvx(i, j) rv_tend(i, k, j) = rv_tend(i, k, j) - msfvy(i, j)/msfvx(i, j)*& & reradius*(0.25*(u(i, k, j)+u(i+1, k, j)+u(i, k, j-1)+u(i+1, & & k, j-1))*TAN(arg1)*0.25*(ru(i, k, j)+ru(i+1, k, j)+ru(i, k, & & j-1)+ru(i+1, k, j-1))+v(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))) END DO END DO END DO 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 DO i=its,min4 rv_tendd(i, k, j) = rv_tendd(i, k, j) - 0.5*0.25*((vxgmd(i, k& & , j)+vxgmd(i, k, j-1))*(ru(i, k, j)+ru(i+1, k, j)+ru(i, k, j& & -1)+ru(i+1, k, j-1))+(vxgm(i, k, j)+vxgm(i, k, j-1))*(rud(i& & , k, j)+rud(i+1, k, j)+rud(i, k, j-1)+rud(i+1, k, j-1))) - & & msfvy(i, j)*reradius*0.25*(vd(i, k, j)*(rw(i, k+1, j-1)+rw(i& & , k, j-1)+rw(i, k+1, j)+rw(i, k, j))+v(i, k, j)*(rwd(i, k+1& & , j-1)+rwd(i, k, j-1)+rwd(i, k+1, j)+rwd(i, k, j)))/msfvx(i& & , j) rv_tend(i, k, j) = rv_tend(i, k, j) - 0.5*(vxgm(i, k, j)+vxgm(& & i, k, 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)*v(i, k, j)*reradius& & *0.25*(rw(i, k+1, j-1)+rw(i, k, j-1)+rw(i, k+1, j)+rw(i, k, & & j)) END DO END DO END DO 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 DO k=max1,ktf IF (ite .GT. ide - 1) THEN min6 = ide - 1 ELSE min6 = ite END IF DO i=its,min6 rw_tendd(i, k, j) = rw_tendd(i, k, j) + reradius*(0.5**2*((fzm(k& & )*(rud(i, k, j)+rud(i+1, k, j))+fzp(k)*(rud(i, k-1, j)+rud(i+1& & , k-1, j)))*(fzm(k)*(u(i, k, j)+u(i+1, k, j))+fzp(k)*(u(i, k-1& & , j)+u(i+1, k-1, j)))+(fzm(k)*(ru(i, k, j)+ru(i+1, k, j))+fzp(& & k)*(ru(i, k-1, j)+ru(i+1, k-1, j)))*(fzm(k)*(ud(i, k, j)+ud(i+& & 1, k, j))+fzp(k)*(ud(i, k-1, j)+ud(i+1, k-1, j))))+msftx(i, j)& & *0.5**2*((fzm(k)*(rvd(i, k, j)+rvd(i, k, j+1))+fzp(k)*(rvd(i, & & k-1, j)+rvd(i, k-1, j+1)))*(fzm(k)*(v(i, k, j)+v(i, k, j+1))+& & fzp(k)*(v(i, k-1, j)+v(i, k-1, j+1)))+(fzm(k)*(rv(i, k, j)+rv(& & i, k, j+1))+fzp(k)*(rv(i, k-1, j)+rv(i, k-1, j+1)))*(fzm(k)*(& & vd(i, k, j)+vd(i, k, j+1))+fzp(k)*(vd(i, k-1, j)+vd(i, k-1, j+& & 1))))/msfty(i, j)) rw_tend(i, k, j) = rw_tend(i, k, j) + reradius*(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))& & )*0.5*(fzm(k)*(u(i, k, j)+u(i+1, k, j))+fzp(k)*(u(i, k-1, j)+u& & (i+1, k-1, j)))+msftx(i, j)/msfty(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)))*0.5*& & (fzm(k)*(v(i, k, j)+v(i, k, j+1))+fzp(k)*(v(i, k-1, j)+v(i, k-& & 1, j+1)))) END DO END DO END DO END SUBROUTINE G_CURVATURE SUBROUTINE g_zero_tend(tendency,g_tendency,ids,ide,jds,jde,kds,kde,ims,ime,jms, & jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE 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) :: tendency,g_tendency INTEGER :: i,j,k,itf,jtf,ktf DO j =jts,jte DO k =kts,kte DO i =its,ite g_tendency(i,k,j) =0.0 tendency(i,k,j) =0. ENDDO ENDDO ENDDO END SUBROUTINE g_zero_tend ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.6 (r4343) - 10 Feb 2012 10:52 ! ! Differentiation of zero_tend2d in forward (tangent) mode: ! variations of useful results: tendency ! with respect to varying inputs: tendency ! RW status of diff variables: tendency:in-out SUBROUTINE G_ZERO_TEND2D(tendency, tendencyd, 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) :: tendency REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: tendencyd ! Local data INTEGER :: i, j, k, itf, jtf, ktf ! ! ! zero_tend sets the input tendency array to zero. ! ! DO j=jts,jte DO i=its,ite tendencyd(i, j) = 0.0 tendency(i, j) = 0. END DO END DO END SUBROUTINE G_ZERO_TEND2D SUBROUTINE g_zero_pole(field,g_field,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, & kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1 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,g_field INTEGER :: i,k IF(jts == jds) THEN DO k =kts,kte DO i =its-1,ite+1 g_field(i,k,jts) =0.0 field(i,k,jts) =0. ENDDO ENDDO END IF IF(jte == jde) THEN DO k =kts,kte DO i =its-1,ite+1 g_field(i,k,jte) =0.0 field(i,k,jte) =0. ENDDO ENDDO END IF END SUBROUTINE g_zero_pole SUBROUTINE g_pole_point_bc(field,g_field,ids,ide,jds,jde,kds,kde,ims,ime,jms, & jme,kms,kme,its,ite,jts,jte,kts,kte) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1 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,g_field INTEGER :: i,k IF(jts == jds) THEN DO k =kts,kte DO i =its,ite g_field(i,k,jts) =g_field(i,k,jts+1) field(i,k,jts) =field(i,k,jts+1) ENDDO ENDDO END IF IF(jte == jde) THEN DO k =kts,kte DO i =its,ite g_field(i,k,jte) =g_field(i,k,jte-1) field(i,k,jte) =field(i,k,jte-1) ENDDO ENDDO END IF END SUBROUTINE g_pole_point_bc ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of phy_prep in forward (tangent) mode: ! variations of useful results: rthndgdten rublten v_phy rqvndgdten ! rthraten rqccuten rthcuten 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 rthblten u_phy rqrcuten rqiblten ! rqsshten rqvcuten p8w z_at_w rho rvcuten p_hyd ! rushten rundgdten 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:in rqccuten:in-out t:in rthcuten:in-out u:in ! v:in 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:in ph:in rthblten:in-out ! u_phy:in-out rqrcuten:in-out rqiblten:in-out alt:in ! 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:in muv:in rundgdten:in-out mu:in dz8w:in-out ! input ! input ! input ! output ! output ! output ! output ! params !01/2017 decoupling mu in G_PHY_PREP is moved to G_PHY_PREP_part2 SUBROUTINE G_PHY_PREP(config_flags, mu, mud, muu, muud, muv, muvd, u, ud& & , v, vd, p, pd, pb, alt, altd, ph, phd, phb, t, td, moist, moistd& & , n_moist, rho, rhod, th_phy, th_phyd, p_phy, p_phyd, pi_phy, pi_phyd& & , u_phy, u_phyd, v_phy, v_phyd, p8w, p8wd, t_phy, t_phyd, t8w, t8wd, z& & , zd, z_at_w, z_at_wd, dz8w, dz8wd, p_hyd, p_hydd, p_hyd_w, p_hyd_wd, & & 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), INTENT(IN) :: & & moistd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, muu, muv REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mud, muud, muvd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: 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), INTENT(OUT) :: u_phyd, & & v_phyd, pi_phyd, p_phyd, p8wd, t_phyd, th_phyd, t8wd, rhod, zd, dz8wd& & , z_at_wd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: p_hyd, & & p_hyd_w REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: p_hydd, & & p_hyd_wd 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), INTENT(IN) :: pd, ud, vd, & & altd, phd, td 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 :: w1d, w2d, z0d, z1d, z2d REAL :: qtot REAL :: qtotd INTEGER :: n REAL :: pwx1 REAL :: pwx1d REAL :: arg1 REAL :: arg1d !----------------------------------------------------------------------- ! ! ! 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_phyd(i, k, j) = td(i, k, j) th_phy(i, k, j) = t(i, k, j) + t0 p_phyd(i, k, j) = pd(i, k, j) p_phy(i, k, j) = p(i, k, j) + pb(i, k, j) pwx1d = p_phyd(i, k, j)/p1000mb pwx1 = p_phy(i, k, j)/p1000mb IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. rcp .EQ. INT(rcp))) & & THEN pi_phyd(i, k, j) = rcp*pwx1**(rcp-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. rcp .EQ. 1.0) THEN pi_phyd(i, k, j) = pwx1d ELSE pi_phyd(i, k, j) = 0.0 END IF pi_phy(i, k, j) = pwx1**rcp t_phyd(i, k, j) = th_phyd(i, k, j)*pi_phy(i, k, j) + th_phy(i, k& & , j)*pi_phyd(i, k, j) t_phy(i, k, j) = th_phy(i, k, j)*pi_phy(i, k, j) rhod(i, k, j) = moistd(i, k, j, p_qv)/alt(i, k, j) - altd(i, k, & & j)*(1.+moist(i, k, j, p_qv))/alt(i, k, j)**2 rho(i, k, j) = 1./alt(i, k, j)*(1.+moist(i, k, j, p_qv)) u_phyd(i, k, j) = 0.5*(ud(i, k, j)+ud(i+1, k, j)) u_phy(i, k, j) = 0.5*(u(i, k, j)+u(i+1, k, j)) v_phyd(i, k, j) = 0.5*(vd(i, k, j)+vd(i, k, j+1)) v_phy(i, k, j) = 0.5*(v(i, k, j)+v(i, k, j+1)) 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_wd(i, k, j) = phd(i, k, j)/g z_at_w(i, k, j) = (phb(i, k, j)+ph(i, k, j))/g END DO END DO END DO DO j=j_start,j_end DO k=k_start,kte-1 DO i=i_start,i_end dz8wd(i, k, j) = z_at_wd(i, k+1, j) - z_at_wd(i, k, j) dz8w(i, k, j) = z_at_w(i, k+1, j) - z_at_w(i, k, j) END DO END DO END DO DO j=j_start,j_end DO i=i_start,i_end dz8wd(i, kte, j) = 0.0 dz8w(i, kte, j) = 0. 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 zd(i, k, j) = 0.5*(z_at_wd(i, k, j)+z_at_wd(i, k+1, j)) 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 ! interp t and p to full levels DO j=j_start,j_end DO k=2,k_end DO i=i_start,i_end p8wd(i, k, j) = fzm(k)*p_phyd(i, k, j) + fzp(k)*p_phyd(i, k-1, j& & ) p8w(i, k, j) = fzm(k)*p_phy(i, k, j) + fzp(k)*p_phy(i, k-1, j) t8wd(i, k, j) = fzm(k)*t_phyd(i, k, j) + fzp(k)*t_phyd(i, k-1, j& & ) t8w(i, k, j) = fzm(k)*t_phy(i, k, j) + fzp(k)*t_phy(i, k-1, j) END DO END DO END DO ! extrapolate p and t to surface and top. ! we'll use an extrapolation in z for now DO j=j_start,j_end DO i=i_start,i_end ! bottom z0d = z_at_wd(i, 1, j) z0 = z_at_w(i, 1, j) z1d = zd(i, 1, j) z1 = z(i, 1, j) z2d = zd(i, 2, j) z2 = z(i, 2, j) w1d = ((z0d-z2d)*(z1-z2)-(z0-z2)*(z1d-z2d))/(z1-z2)**2 w1 = (z0-z2)/(z1-z2) w2d = -w1d w2 = 1. - w1 p8wd(i, 1, j) = w1d*p_phy(i, 1, j) + w1*p_phyd(i, 1, j) + w2d*& & p_phy(i, 2, j) + w2*p_phyd(i, 2, j) p8w(i, 1, j) = w1*p_phy(i, 1, j) + w2*p_phy(i, 2, j) t8wd(i, 1, j) = w1d*t_phy(i, 1, j) + w1*t_phyd(i, 1, j) + w2d*& & t_phy(i, 2, j) + w2*t_phyd(i, 2, j) t8w(i, 1, j) = w1*t_phy(i, 1, j) + w2*t_phy(i, 2, j) ! top z0d = z_at_wd(i, kte, j) z0 = z_at_w(i, kte, j) z1d = zd(i, k_end, j) z1 = z(i, k_end, j) z2d = zd(i, k_end-1, j) z2 = z(i, k_end-1, j) w1d = ((z0d-z2d)*(z1-z2)-(z0-z2)*(z1d-z2d))/(z1-z2)**2 w1 = (z0-z2)/(z1-z2) w2d = -w1d w2 = 1. - w1 ! p8w(i,kde,j) = w1*p_phy(i,kde-1,j)+w2*p_phy(i,kde-2,j) !!! bug fix extrapolate ln(p) so p is positive definite arg1d = w1d*LOG(p_phy(i, kde-1, j)) + w1*p_phyd(i, kde-1, j)/p_phy& & (i, kde-1, j) + w2d*LOG(p_phy(i, kde-2, j)) + w2*p_phyd(i, kde-2& & , j)/p_phy(i, kde-2, j) arg1 = w1*LOG(p_phy(i, kde-1, j)) + w2*LOG(p_phy(i, kde-2, j)) p8wd(i, kde, j) = arg1d*EXP(arg1) p8w(i, kde, j) = EXP(arg1) t8wd(i, kde, j) = w1d*t_phy(i, kde-1, j) + w1*t_phyd(i, kde-1, j) & & + w2d*t_phy(i, kde-2, j) + w2*t_phyd(i, kde-2, j) t8w(i, kde, j) = w1*t_phy(i, kde-1, j) + w2*t_phy(i, kde-2, j) END DO END DO ! calculate hydrostatic pressure at both full and half levels ! first, full level p: assuming dry over model top DO j=j_start,j_end DO i=i_start,i_end p_hyd_wd(i, kte, j) = 0.0 p_hyd_w(i, kte, j) = p_top END DO END DO DO j=j_start,j_end DO k=kte-1,k_start,-1 DO i=i_start,i_end qtot = 0. qtotd = 0.0 DO n=param_first_scalar,n_moist qtotd = qtotd + moistd(i, k, j, n) qtot = qtot + moist(i, k, j, n) END DO p_hyd_wd(i, k, j) = p_hyd_wd(i, k+1, j) - dnw(k)*(qtotd*mu(i, j)& & +(1.+qtot)*mud(i, j)) p_hyd_w(i, k, j) = p_hyd_w(i, k+1, j) - (1.+qtot)*mu(i, j)*dnw(k& & ) END DO END DO END DO ! p_hyd_w(i,k,j) = p_hyd_w(i,k+1,j)+1./alt(i,k,j)*(1.+moist(i,k,j,P_QV))*g*dz8w(i,k,j) ! now calculate hydrostatic pressure at half levels DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end p_hydd(i, k, j) = 0.5*(p_hyd_wd(i, k, j)+p_hyd_wd(i, k+1, j)) p_hyd(i, k, j) = 0.5*(p_hyd_w(i, k, j)+p_hyd_w(i, k+1, j)) END DO END DO END DO END SUBROUTINE G_PHY_PREP SUBROUTINE G_PHY_PREP_part2(config_flags, mu, mud, muu, muud, muv, muvd, & & rthraten, rthratend, rthblten, rthbltend, & & rublten, rubltend, rvblten, rvbltend, rqvblten, rqvbltend, rqcblten, & & rqcbltend, rqiblten, rqibltend, rucuten, rucutend, rvcuten, rvcutend, & & rthcuten, rthcutend, rqvcuten, rqvcutend, rqccuten, rqccutend, & & rqrcuten, rqrcutend, rqicuten, rqicutend, rqscuten, rqscutend, rushten& & , rushtend, rvshten, rvshtend, rthshten, rthshtend, rqvshten, & & rqvshtend, rqcshten, rqcshtend, rqrshten, rqrshtend, rqishten, & & rqishtend, rqsshten, rqsshtend, rqgshten, rqgshtend, rthften, rthftend& & , rqvften, rqvftend, rundgdten, rundgdtend, rvndgdten, rvndgdtend, & & rthndgdten, rthndgdtend, rphndgdten, rphndgdtend, rqvndgdten, & & rqvndgdtend, 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), INTENT(IN) :: mud, muud, muvd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthraten REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthratend 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), INTENT(INOUT) :: rucutend& & , rvcutend, rthcutend, rqvcutend, rqccutend, rqrcutend, rqicutend, & & rqscutend, rushtend, rvshtend, rthshtend, rqvshtend, rqcshtend, & & rqrshtend, rqishtend, rqsshtend, rqgshtend REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rublten, & & rvblten, rthblten, rqvblten, rqcblten, rqiblten REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rubltend& & , rvbltend, rthbltend, rqvbltend, rqcbltend, rqibltend REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthften, & & rqvften REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthftend& & , rqvftend REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rundgdten& & , rvndgdten, rthndgdten, rphndgdten, rqvndgdten REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: & & rundgdtend, rvndgdtend, rthndgdtend, rphndgdtend, rqvndgdtend 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 !----------------------------------------------------------------------- ! ! ! 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 DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end rthratend(i, k, j) = (rthratend(i, k, j)*mu(i, j)-rthraten(i, & & k, j)*mud(i, j))/mu(i, j)**2 rthraten(i, k, j) = rthraten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (config_flags%cu_physics .GT. 0) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rucutend(i, k, j) = (rucutend(i, k, j)*mu(i, j)-rucuten(i, k, & & j)*mud(i, j))/mu(i, j)**2 rucuten(i, k, j) = rucuten(i, k, j)/mu(i, j) rvcutend(i, k, j) = (rvcutend(i, k, j)*mu(i, j)-rvcuten(i, k, & & j)*mud(i, j))/mu(i, j)**2 rvcuten(i, k, j) = rvcuten(i, k, j)/mu(i, j) rthcutend(i, k, j) = (rthcutend(i, k, j)*mu(i, j)-rthcuten(i, & & k, j)*mud(i, j))/mu(i, j)**2 rthcuten(i, k, j) = rthcuten(i, k, j)/mu(i, j) END DO END DO END DO IF (p_qv .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqvcutend(i, k, j) = (rqvcutend(i, k, j)*mu(i, j)-rqvcuten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqvcuten(i, k, j) = rqvcuten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qc .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqccutend(i, k, j) = (rqccutend(i, k, j)*mu(i, j)-rqccuten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqccuten(i, k, j) = rqccuten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qr .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqrcutend(i, k, j) = (rqrcutend(i, k, j)*mu(i, j)-rqrcuten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqrcuten(i, k, j) = rqrcuten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qi .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqicutend(i, k, j) = (rqicutend(i, k, j)*mu(i, j)-rqicuten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqicuten(i, k, j) = rqicuten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qs .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqscutend(i, k, j) = (rqscutend(i, k, j)*mu(i, j)-rqscuten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqscuten(i, k, j) = rqscuten(i, k, j)/mu(i, j) END DO END DO END DO END IF END IF IF (config_flags%shcu_physics .GT. 0) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rushtend(i, k, j) = (rushtend(i, k, j)*mu(i, j)-rushten(i, k, & & j)*mud(i, j))/mu(i, j)**2 rushten(i, k, j) = rushten(i, k, j)/mu(i, j) rvshtend(i, k, j) = (rvshtend(i, k, j)*mu(i, j)-rvshten(i, k, & & j)*mud(i, j))/mu(i, j)**2 rvshten(i, k, j) = rvshten(i, k, j)/mu(i, j) rthshtend(i, k, j) = (rthshtend(i, k, j)*mu(i, j)-rthshten(i, & & k, j)*mud(i, j))/mu(i, j)**2 rthshten(i, k, j) = rthshten(i, k, j)/mu(i, j) END DO END DO END DO IF (p_qv .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqvshtend(i, k, j) = (rqvshtend(i, k, j)*mu(i, j)-rqvshten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqvshten(i, k, j) = rqvshten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qc .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqcshtend(i, k, j) = (rqcshtend(i, k, j)*mu(i, j)-rqcshten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqcshten(i, k, j) = rqcshten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qr .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqrshtend(i, k, j) = (rqrshtend(i, k, j)*mu(i, j)-rqrshten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqrshten(i, k, j) = rqrshten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qi .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqishtend(i, k, j) = (rqishtend(i, k, j)*mu(i, j)-rqishten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqishten(i, k, j) = rqishten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qs .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqsshtend(i, k, j) = (rqsshtend(i, k, j)*mu(i, j)-rqsshten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqsshten(i, k, j) = rqsshten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qg .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqgshtend(i, k, j) = (rqgshtend(i, k, j)*mu(i, j)-rqgshten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqgshten(i, k, j) = rqgshten(i, k, j)/mu(i, j) END DO END DO END DO END IF END IF IF (config_flags%bl_pbl_physics .GT. 0) THEN DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end rubltend(i, k, j) = (rubltend(i, k, j)*mu(i, j)-rublten(i, k, & & j)*mud(i, j))/mu(i, j)**2 rublten(i, k, j) = rublten(i, k, j)/mu(i, j) rvbltend(i, k, j) = (rvbltend(i, k, j)*mu(i, j)-rvblten(i, k, & & j)*mud(i, j))/mu(i, j)**2 rvblten(i, k, j) = rvblten(i, k, j)/mu(i, j) rthbltend(i, k, j) = (rthbltend(i, k, j)*mu(i, j)-rthblten(i, & & k, j)*mud(i, j))/mu(i, j)**2 rthblten(i, k, j) = rthblten(i, k, j)/mu(i, j) END DO END DO END DO IF (p_qv .GE. param_first_scalar) THEN DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end rqvbltend(i, k, j) = (rqvbltend(i, k, j)*mu(i, j)-rqvblten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqvblten(i, k, j) = rqvblten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qc .GE. param_first_scalar) THEN DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end rqcbltend(i, k, j) = (rqcbltend(i, k, j)*mu(i, j)-rqcblten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqcblten(i, k, j) = rqcblten(i, k, j)/mu(i, j) END DO END DO END DO END IF IF (p_qi .GE. param_first_scalar) THEN DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end rqibltend(i, k, j) = (rqibltend(i, k, j)*mu(i, j)-rqiblten(i& & , k, j)*mud(i, j))/mu(i, j)**2 rqiblten(i, k, j) = rqiblten(i, k, j)/mu(i, j) END DO END DO END DO END IF 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 DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rthftend(i, k, j) = (rthftend(i, k, j)*mu(i, j)-rthften(i, k, & & j)*mud(i, j))/mu(i, j)**2 rthften(i, k, j) = rthften(i, k, j)/mu(i, j) END DO END DO END DO IF (p_qv .GE. param_first_scalar) THEN DO j=j_start,j_end DO i=i_start,i_end DO k=k_start,k_end rqvftend(i, k, j) = (rqvftend(i, k, j)*mu(i, j)-rqvften(i, k& & , j)*mud(i, j))/mu(i, j)**2 rqvften(i, k, j) = rqvften(i, k, j)/mu(i, j) END DO END DO END DO END IF 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 DO j=j_start,j_end DO k=k_start,k_end DO i=i_startu,i_end rundgdtend(i, k, j) = (rundgdtend(i, k, j)*muu(i, j)-rundgdten& & (i, k, j)*muud(i, j))/muu(i, j)**2 rundgdten(i, k, j) = rundgdten(i, k, j)/muu(i, j) END DO END DO END DO DO j=j_startv,j_end DO k=k_start,k_end DO i=i_start,i_end rvndgdtend(i, k, j) = (rvndgdtend(i, k, j)*muv(i, j)-rvndgdten& & (i, k, j)*muvd(i, j))/muv(i, j)**2 rvndgdten(i, k, j) = rvndgdten(i, k, j)/muv(i, j) END DO END DO END DO DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end rthndgdtend(i, k, j) = (rthndgdtend(i, k, j)*mu(i, j)-& & rthndgdten(i, k, j)*mud(i, j))/mu(i, j)**2 rthndgdten(i, k, j) = rthndgdten(i, k, j)/mu(i, j) END DO END DO END DO ! RMUNDGDTEN(I,J) - no coupling IF (config_flags%grid_fdda .EQ. 2) THEN DO j=j_start,j_end DO k=k_start,kte DO i=i_start,i_end rphndgdtend(i, k, j) = (rphndgdtend(i, k, j)*mu(i, j)-& & rphndgdten(i, k, j)*mud(i, j))/mu(i, j)**2 rphndgdten(i, k, j) = rphndgdten(i, k, j)/mu(i, j) 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_start,j_end DO k=k_start,k_end DO i=i_start,i_end rqvndgdtend(i, k, j) = (rqvndgdtend(i, k, j)*mu(i, j)-& & rqvndgdten(i, k, j)*mud(i, j))/mu(i, j)**2 rqvndgdten(i, k, j) = rqvndgdten(i, k, j)/mu(i, j) END DO END DO END DO END IF END IF END IF END SUBROUTINE G_PHY_PREP_part2 ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35 ! ! Differentiation of moist_physics_prep_em in forward (tangent) mode: ! variations of useful results: z th_phy h_diabatic pf p8w ! z_at_w rho pii dz8w ! with respect to varying inputs: p al t_new ph ! RW status of diff variables: p:in al:in z:out th_phy:out h_diabatic:out ! t_new:in pf:out ph:in p8w:out z_at_w:out rho:out ! pii:out dz8w:out SUBROUTINE G_MOIST_PHYSICS_PREP_EM(t_new, t_newd, t_old, t0, rho, rhod, & & al, ald, alb, p, pd, p8w, p8wd, p0, pb, ph, phd, phb, th_phy, th_phyd& & , pii, piid, pf, pfd, z, zd, z_at_w, z_at_wd, dz8w, dz8wd, dt, & & h_diabatic, h_diabaticd, & & qv, qvd, qv_diabatic, qv_diabaticd, & & qc, qcd, qc_diabatic, qc_diabaticd, & & 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), INTENT(IN) :: ald, pd, phd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: qvd, qcd REAL, DIMENSION(kms:kme), INTENT(IN) :: fzm, fzp REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: rho, th_phy& & , pii, pf, z, z_at_w, dz8w, p8w REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(OUT) :: rhod, & & th_phyd, piid, pfd, zd, z_at_wd, dz8wd, p8wd 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_diabaticd, qv_diabaticd, qc_diabaticd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_new, & & t_old REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_newd REAL, INTENT(IN) :: t0, p0 REAL :: z0, z1, z2, w1, w2 REAL :: z0d, z1d, z2d, w1d, w2d INTEGER :: i_start, i_end, j_start, j_end, k_start, k_end INTEGER :: i, j, k REAL :: pwx1 REAL :: pwx1d REAL :: arg1 REAL :: arg1d !-------------------------------------------------------------------- ! ! ! 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 z_at_wd = 0.0 DO j=j_start,j_end DO k=k_start,kte DO i=i_start,i_end z_at_wd(i, k, j) = phd(i, k, j)/g z_at_w(i, k, j) = (ph(i, k, j)+phb(i, k, j))/g END DO END DO END DO dz8wd = 0.0 DO j=j_start,j_end DO k=k_start,kte-1 DO i=i_start,i_end dz8wd(i, k, j) = z_at_wd(i, k+1, j) - z_at_wd(i, k, j) dz8w(i, k, j) = z_at_w(i, k+1, j) - z_at_w(i, k, j) END DO END DO END DO DO j=j_start,j_end DO i=i_start,i_end dz8wd(i, kte, j) = 0.0 dz8w(i, kte, j) = 0. END DO END DO zd = 0.0 th_phyd = 0.0 h_diabaticd = 0.0 pfd = 0.0 rhod = 0.0 piid = 0.0 ! 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 th_phyd(i, k, j) = t_newd(i, k, j) th_phy(i, k, j) = t_new(i, k, j) + t0 h_diabaticd(i, k, j) = th_phyd(i, k, j) h_diabatic(i, k, j) = th_phy(i, k, j) if ( P_QV >= PARAM_FIRST_SCALAR ) then qv_diabaticd(i, k, j) = qvd(i, k, j) qv_diabatic(i, k, j) = qv(i, k, j) else qv_diabaticd(i, k, j) = 0.0 qv_diabatic(i, k, j) = 0.0 end if if ( P_QC >= PARAM_FIRST_SCALAR ) then qc_diabaticd(i, k, j) = qcd(i, k, j) qc_diabatic(i, k, j) = qc(i, k, j) else qc_diabaticd(i, k, j) = 0.0 qc_diabatic(i, k, j) = 0.0 end if rhod(i, k, j) = -(ald(i, k, j)/(al(i, k, j)+alb(i, k, j))**2) rho(i, k, j) = 1./(al(i, k, j)+alb(i, k, j)) pwx1d = pd(i, k, j)/p0 pwx1 = (p(i, k, j)+pb(i, k, j))/p0 IF (pwx1 .GT. 0.0 .OR. (pwx1 .LT. 0.0 .AND. rcp .EQ. INT(rcp))) & & THEN piid(i, k, j) = rcp*pwx1**(rcp-1)*pwx1d ELSE IF (pwx1 .EQ. 0.0 .AND. rcp .EQ. 1.0) THEN piid(i, k, j) = pwx1d ELSE piid(i, k, j) = 0.0 END IF pii(i, k, j) = pwx1**rcp zd(i, k, j) = 0.5*(z_at_wd(i, k, j)+z_at_wd(i, k+1, j)) z(i, k, j) = 0.5*(z_at_w(i, k, j)+z_at_w(i, k+1, j)) pfd(i, k, j) = pd(i, k, j) pf(i, k, j) = p(i, k, j) + pb(i, k, j) END DO END DO END DO p8wd = 0.0 ! interp t and p at w points DO j=j_start,j_end DO k=2,k_end DO i=i_start,i_end p8wd(i, k, j) = fzm(k)*pfd(i, k, j) + fzp(k)*pfd(i, k-1, j) p8w(i, k, j) = fzm(k)*pf(i, k, j) + fzp(k)*pf(i, k-1, j) END DO END DO END DO ! extrapolate p and t to surface and top. ! we'll use an extrapolation in z for now DO j=j_start,j_end DO i=i_start,i_end ! bottom z0d = z_at_wd(i, 1, j) z0 = z_at_w(i, 1, j) z1d = zd(i, 1, j) z1 = z(i, 1, j) z2d = zd(i, 2, j) z2 = z(i, 2, j) w1d = ((z0d-z2d)*(z1-z2)-(z0-z2)*(z1d-z2d))/(z1-z2)**2 w1 = (z0-z2)/(z1-z2) w2d = -w1d w2 = 1. - w1 p8wd(i, 1, j) = w1d*pf(i, 1, j) + w1*pfd(i, 1, j) + w2d*pf(i, 2, j& & ) + w2*pfd(i, 2, j) p8w(i, 1, j) = w1*pf(i, 1, j) + w2*pf(i, 2, j) ! top z0d = z_at_wd(i, kte, j) z0 = z_at_w(i, kte, j) z1d = zd(i, k_end, j) z1 = z(i, k_end, j) z2d = zd(i, k_end-1, j) z2 = z(i, k_end-1, j) w1d = ((z0d-z2d)*(z1-z2)-(z0-z2)*(z1d-z2d))/(z1-z2)**2 w1 = (z0-z2)/(z1-z2) w2d = -w1d w2 = 1. - w1 ! p8w(i,kde,j) = w1*pf(i,kde-1,j)+w2*pf(i,kde-2,j) arg1d = w1d*LOG(pf(i, kde-1, j)) + w1*pfd(i, kde-1, j)/pf(i, kde-1& & , j) + w2d*LOG(pf(i, kde-2, j)) + w2*pfd(i, kde-2, j)/pf(i, kde-& & 2, j) arg1 = w1*LOG(pf(i, kde-1, j)) + w2*LOG(pf(i, kde-2, j)) p8wd(i, kde, j) = arg1d*EXP(arg1) p8w(i, kde, j) = EXP(arg1) END DO END DO END SUBROUTINE G_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 forward (tangent) mode (with options i4 r8): ! variations of useful results: h_diabatic t_new ! with respect to varying inputs: th_phy h_diabatic t_new ! RW status of diff variables: th_phy:in h_diabatic:in-out t_new:in-out SUBROUTINE G_MOIST_PHYSICS_FINISH_EM(t_new, t_newd, t_old, t0, mut, & & th_phy, th_phyd, h_diabatic, h_diabaticd, & & qv, qvd, qv_diabatic, qv_diabaticd, qc, qcd, qc_diabatic, qc_diabaticd, & & 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, qv_diabatic, qc_diabatic REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: t_newd, & & th_phyd, h_diabaticd, qv_diabaticd, qc_diabaticd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: qv, qc REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: qvd, qcd REAL :: mpten, qvten, qcten REAL :: mptend, qvtend, qctend 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 !-------------------------------------------------------------------- ! ! ! 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 qvtend = 0.0 qctend = 0.0 DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end mptend = th_phyd(i, k, j) - h_diabaticd(i, k, j) mpten = th_phy(i, k, j) - h_diabatic(i, k, j) if ( P_QV >= PARAM_FIRST_SCALAR ) then qvtend = qvd(i, k, j) - qv_diabaticd(i, k, j) qvten = qv(i, k, j) - qv_diabatic(i, k, j) end if if ( P_QC >= PARAM_FIRST_SCALAR ) then qctend = qcd(i, k, j) - qc_diabaticd(i, k, j) qcten = qc(i, k, j) - qc_diabatic(i, k, j) end if IF (config_flags%mp_tend_lim*dt .GT. mpten) THEN mpten = mpten ELSE mpten = config_flags%mp_tend_lim*dt mptend = 0.0_8 END IF IF (-(config_flags%mp_tend_lim*dt) .LT. mpten) THEN mpten = mpten ELSE mpten = -(config_flags%mp_tend_lim*dt) mptend = 0.0_8 END IF t_newd(i, k, j) = t_newd(i, k, j) + mptend t_new(i, k, j) = t_new(i, k, j) + mpten h_diabaticd(i, k, j) = mptend/dt h_diabatic(i, k, j) = mpten/dt if ( P_QV >= PARAM_FIRST_SCALAR ) then qv_diabaticd(i, k, j) = qvtend/dt qv_diabatic(i, k, j) = qvten/dt else qv_diabaticd(i, k, j) = 0.0 qv_diabatic(i, k, j) = 0.0 end if if ( P_QC >= PARAM_FIRST_SCALAR ) then qc_diabaticd(i, k, j) = qctend/dt qc_diabatic(i, k, j) = qcten/dt else qc_diabaticd(i, k, j) = 0.0 qc_diabatic(i, k, j) = 0.0 end if END DO END DO END DO ELSE DO j=j_start,j_end DO k=k_start,k_end DO i=i_start,i_end h_diabaticd(i, k, j) = 0.0_8 h_diabatic(i, k, j) = 0. qv_diabaticd(i, k, j) = 0.0 qv_diabatic(i, k, j) = 0.0 qc_diabaticd(i, k, j) = 0.0 qc_diabatic(i, k, j) = 0.0 END DO END DO END DO END IF END SUBROUTINE G_MOIST_PHYSICS_FINISH_EM SUBROUTINE g_init_module_big_step END SUBROUTINE g_init_module_big_step SUBROUTINE g_set_tend(field,g_field,field_adv_tend,g_field_adv_tend,msf, & ! Revised by Ning Pan, 2010-07-19 ! g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1 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,g_field REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field_adv_tend,g_field_adv_tend ! Revised by Ning Pan, 2010-07-19 ! REAL,DIMENSION(ims:ime,jms:jme) :: msf,g_msf REAL,DIMENSION(ims:ime,jms:jme) :: msf,g_msf INTEGER :: i,j,k,itf,jtf,ktf jtf =min(jte,jde-1) ktf =min(kte,kde-1) itf =min(ite,ide-1) DO j =jts,jtf DO k =kts,ktf DO i =its,itf ! Revised by Ning Pan, 2010-07-19 ! g_Tmpv1 =field_adv_tend(i,k,j)*g_msf(i,j) +g_field_adv_tend(i,k,j)*msf(i,j) g_Tmpv1 =g_field_adv_tend(i,k,j)*msf(i,j) Tmpv1 =field_adv_tend(i,k,j)*msf(i,j) g_field(i,k,j) =g_Tmpv1 field(i,k,j) =Tmpv1 ENDDO ENDDO ENDDO END SUBROUTINE g_set_tend SUBROUTINE g_rk_rayleigh_damp(ru_tendf,g_ru_tendf,rv_tendf,g_rv_tendf, & rw_tendf,g_rw_tendf,t_tendf,g_t_tendf,u,g_u,v,g_v,w,g_w,t,g_t, & ! Revised by Ning Pan, 2010-07-23 ! t_init,g_t_init,mut,g_mut,muu,g_muu,muv,g_muv,ph,g_ph,phb,g_phb, & ! u_base,g_u_base,v_base,g_v_base,t_base,g_t_base,z_base,g_z_base,dampcoef, & ! g_dampcoef,zdamp,g_zdamp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its, & t_init,mut,g_mut,muu,g_muu,muv,g_muv,ph,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_ru_tendf,rv_tendf, & g_rv_tendf,rw_tendf,g_rw_tendf,t_tendf,g_t_tendf REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: u,g_u,v,g_v,w,g_w,t,g_t, & ! Revised by Ning Pan, 2010-07-23 ! t_init,g_t_init,ph,g_ph,phb,g_phb t_init,ph,g_ph,phb REAL,DIMENSION(ims:ime,jms:jme) :: mut,g_mut,muu,g_muu,muv,g_muv ! Revised by Ning Pan, 2010-07-23 ! REAL,DIMENSION(kms:kme) :: u_base,g_u_base,v_base,g_v_base,t_base,g_t_base, & ! z_base,g_z_base REAL,DIMENSION(kms:kme) :: u_base,v_base,t_base,z_base ! REAL :: dampcoef,g_dampcoef,zdamp,g_zdamp 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,g_pii,dcoef,g_dcoef,z,g_z,ztop,g_ztop REAL :: pii,dcoef,g_dcoef,z,g_z,ztop,g_ztop ! REAL :: wkp1,g_wkp1,wk,g_wk,wkm1,g_wkm1 ! Remarked by Ning Pan, 2010-07-23 REAL,DIMENSION(kms:kme) :: z00,g_z00,u00,g_u00,v00,g_v00,t00,g_t00 ! g_pii =0.0 ! Remarked by Ning Pan, 2010-07-23 pii =2.0 *Asin(1.0) ktf =min(kte,kde-1) DO j =jts,min(jte,jde-1) DO i =its,min(ite,ide) ! Revised by Ning Pan, 2010-07-23 ! g_ztop =0.5*(g_phb(i,kde,j) +g_phb(i-1,kde,j) +g_ph(i,kde,j) & ! +g_ph(i-1,kde,j))/g g_ztop =0.5*(g_ph(i,kde,j) +g_ph(i-1,kde,j))/g ztop =0.5*(phb(i,kde,j) +phb(i-1,kde,j) +ph(i,kde,j) +ph(i-1,kde,j))/g k1 =ktf g_z =g_ztop z =ztop !This line is fail to be recognized DO WHILE( z >= (ztop-zdamp) ) ! Revised by Ning Pan, 2010-07-23 ! g_z =0.25*(g_phb(i,k1,j) +g_phb(i,k1+1,j) +g_phb(i-1,k1,j) +g_phb(i-1, & ! k1+1,j) +g_ph(i,k1,j) +g_ph(i,k1+1,j) +g_ph(i-1,k1,j) +g_ph(i-1,k1+1,j))/g g_z =0.25*(g_ph(i,k1,j) +g_ph(i,k1+1,j) +g_ph(i-1,k1,j) +g_ph(i-1,k1+1,j))/g 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 g_z00(k1) =g_z 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 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =(u_base(k2) -u_base(k2-1))*(g_z00(k) -g_z_base(k2)) +(g_u_base( & ! k2) -g_u_base(k2-1))*(z00(k) -z_base(k2)) g_Tmpv1 =(u_base(k2) -u_base(k2-1))*g_z00(k) Tmpv1 =(u_base(k2) -u_base(k2-1))*(z00(k) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv2 =(g_Tmpv1*(z_base(k2) -z_base(k2-1)) -(g_z_base(k2) -g_z_base( & ! k2-1))*Tmpv1)/((z_base(k2) -z_base(k2-1))*(z_base(k2) -z_base(k2-1))) g_Tmpv2 =g_Tmpv1/(z_base(k2) -z_base(k2-1)) Tmpv2 =Tmpv1/(z_base(k2) -z_base(k2-1)) ! Revised by Ning Pan, 2010-07-23 ! g_u00(k) =g_u_base(k2) +g_Tmpv2 g_u00(k) =g_Tmpv2 u00(k) =u_base(k2) +Tmpv2 else ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =(u_base(k2+1) -u_base(k2))*(g_z00(k) -g_z_base(k2)) +(g_u_base( & ! k2+1) -g_u_base(k2))*(z00(k) -z_base(k2)) g_Tmpv1 =(u_base(k2+1) -u_base(k2))*g_z00(k) Tmpv1 =(u_base(k2+1) -u_base(k2))*(z00(k) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv2 =(g_Tmpv1*(z_base(k2+1) -z_base(k2)) -(g_z_base(k2+1) & ! -g_z_base(k2))*Tmpv1)/((z_base(k2+1) -z_base(k2))*(z_base(k2+1) -z_base(k2))) g_Tmpv2 =g_Tmpv1/(z_base(k2+1) -z_base(k2)) Tmpv2 =Tmpv1/(z_base(k2+1) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_u00(k) =g_u_base(k2) +g_Tmpv2 g_u00(k) =g_Tmpv2 u00(k) =u_base(k2) +Tmpv2 endif ENDDO DO k =k1,ktf ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =((g_ztop -g_z00(k))*zdamp -g_zdamp*(ztop -z00(k)))/(zdamp*zdamp) g_Tmpv1 =(g_ztop -g_z00(k))/zdamp Tmpv1 =(ztop -z00(k))/zdamp g_dcoef =-(0.0 +g_Tmpv1 -(0.0 -g_Tmpv1)*sign(1.0, 1.0 -(Tmpv1)))*0.5 dcoef =1.0 -min(1.0,Tmpv1) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =0.5*pii*g_dcoef +0.5*g_pii*dcoef g_Tmpv1 =0.5*pii*g_dcoef Tmpv1 =0.5*pii*dcoef g_dcoef =2.0*(g_Tmpv1*cos(Tmpv1))*(sin(Tmpv1)) dcoef =(sin(Tmpv1))**2 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =dcoef*g_dampcoef +g_dcoef*dampcoef g_Tmpv1 =g_dcoef*dampcoef Tmpv1 =dcoef*dampcoef g_Tmpv2 =muu(i,j)*(g_Tmpv1) +g_muu(i,j)*(Tmpv1) Tmpv2 =muu(i,j)*(Tmpv1) g_Tmpv3 =Tmpv2*(g_u(i,k,j) -g_u00(k)) +g_Tmpv2*(u(i,k,j) -u00(k)) Tmpv3 =Tmpv2*(u(i,k,j) -u00(k)) g_ru_tendf(i,k,j) =g_ru_tendf(i,k,j) -g_Tmpv3 ru_tendf(i,k,j) =ru_tendf(i,k,j) -Tmpv3 ENDDO ENDDO ENDDO DO j =jts,min(jte,jde) DO i =its,min(ite,ide-1) ! Revised by Ning Pan, 2010-07-23 ! g_ztop =0.5*(g_phb(i,kde,j) +g_phb(i,kde,j-1) +g_ph(i,kde,j) & ! +g_ph(i,kde,j-1))/g g_ztop =0.5*(g_ph(i,kde,j) +g_ph(i,kde,j-1))/g ztop =0.5*(phb(i,kde,j) +phb(i,kde,j-1) +ph(i,kde,j) +ph(i,kde,j-1))/g k1 =ktf g_z =g_ztop z =ztop !This line is fail to be recognized DO WHILE( z >= (ztop-zdamp) ) ! Revised by Ning Pan, 2010-07-23 ! g_z =0.25*(g_phb(i,k1,j) +g_phb(i,k1+1,j) +g_phb(i,k1,j-1) +g_phb(i, & ! k1+1,j-1) +g_ph(i,k1,j) +g_ph(i,k1+1,j) +g_ph(i,k1,j-1) +g_ph(i,k1+1,j-1))/g g_z =0.25*(g_ph(i,k1,j) +g_ph(i,k1+1,j) +g_ph(i,k1,j-1) +g_ph(i,k1+1,j-1))/g 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 g_z00(k1) =g_z 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 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =(v_base(k2) -v_base(k2-1))*(g_z00(k) -g_z_base(k2)) +(g_v_base( & ! k2) -g_v_base(k2-1))*(z00(k) -z_base(k2)) g_Tmpv1 =(v_base(k2) -v_base(k2-1))*g_z00(k) Tmpv1 =(v_base(k2) -v_base(k2-1))*(z00(k) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv2 =(g_Tmpv1*(z_base(k2) -z_base(k2-1)) -(g_z_base(k2) -g_z_base( & ! k2-1))*Tmpv1)/((z_base(k2) -z_base(k2-1))*(z_base(k2) -z_base(k2-1))) g_Tmpv2 =g_Tmpv1/(z_base(k2) -z_base(k2-1)) Tmpv2 =Tmpv1/(z_base(k2) -z_base(k2-1)) ! Revised by Ning Pan, 2010-07-23 ! g_v00(k) =g_v_base(k2) +g_Tmpv2 g_v00(k) =g_Tmpv2 v00(k) =v_base(k2) +Tmpv2 else ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =(v_base(k2+1) -v_base(k2))*(g_z00(k) -g_z_base(k2)) +(g_v_base( & ! k2+1) -g_v_base(k2))*(z00(k) -z_base(k2)) g_Tmpv1 =(v_base(k2+1) -v_base(k2))*g_z00(k) Tmpv1 =(v_base(k2+1) -v_base(k2))*(z00(k) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv2 =(g_Tmpv1*(z_base(k2+1) -z_base(k2)) -(g_z_base(k2+1) & ! -g_z_base(k2))*Tmpv1)/((z_base(k2+1) -z_base(k2))*(z_base(k2+1) -z_base(k2))) g_Tmpv2 =g_Tmpv1/(z_base(k2+1) -z_base(k2)) Tmpv2 =Tmpv1/(z_base(k2+1) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_v00(k) =g_v_base(k2) +g_Tmpv2 g_v00(k) =g_Tmpv2 v00(k) =v_base(k2) +Tmpv2 endif ENDDO DO k =k1,ktf ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =((g_ztop -g_z00(k))*zdamp -g_zdamp*(ztop -z00(k)))/(zdamp*zdamp) g_Tmpv1 =(g_ztop -g_z00(k))/zdamp Tmpv1 =(ztop -z00(k))/zdamp g_dcoef =-(0.0 +g_Tmpv1 -(0.0 -g_Tmpv1)*sign(1.0, 1.0 -(Tmpv1)))*0.5 dcoef =1.0 -min(1.0,Tmpv1) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =0.5*pii*g_dcoef +0.5*g_pii*dcoef g_Tmpv1 =0.5*pii*g_dcoef Tmpv1 =0.5*pii*dcoef g_dcoef =2.0*(g_Tmpv1*cos(Tmpv1))*(sin(Tmpv1)) dcoef =(sin(Tmpv1))**2 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =dcoef*g_dampcoef +g_dcoef*dampcoef g_Tmpv1 =g_dcoef*dampcoef Tmpv1 =dcoef*dampcoef g_Tmpv2 =muv(i,j)*(g_Tmpv1) +g_muv(i,j)*(Tmpv1) Tmpv2 =muv(i,j)*(Tmpv1) g_Tmpv3 =Tmpv2*(g_v(i,k,j) -g_v00(k)) +g_Tmpv2*(v(i,k,j) -v00(k)) Tmpv3 =Tmpv2*(v(i,k,j) -v00(k)) g_rv_tendf(i,k,j) =g_rv_tendf(i,k,j) -g_Tmpv3 rv_tendf(i,k,j) =rv_tendf(i,k,j) -Tmpv3 ENDDO ENDDO ENDDO DO j =jts,min(jte,jde-1) DO i =its,min(ite,ide-1) ! Revised by Ning Pan, 2010-07-23 ! g_ztop =(g_phb(i,kde,j) +g_ph(i,kde,j))/g g_ztop =g_ph(i,kde,j)/g ztop =(phb(i,kde,j) +ph(i,kde,j))/g DO k =kts,min(kte,kde) ! Revised by Ning Pan, 2010-07-23 ! g_z =(g_phb(i,k,j) +g_ph(i,k,j))/g g_z =g_ph(i,k,j)/g z =(phb(i,k,j) +ph(i,k,j))/g IF( z >= (ztop-zdamp) ) THEN ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =((g_ztop -g_z)*zdamp -g_zdamp*(ztop -z))/(zdamp*zdamp) g_Tmpv1 =(g_ztop -g_z)/zdamp Tmpv1 =(ztop -z)/zdamp g_dcoef =-(0.0 +g_Tmpv1 -(0.0 -g_Tmpv1)*sign(1.0, 1.0 -(Tmpv1)))*0.5 dcoef =1.0 -min(1.0,Tmpv1) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =0.5*pii*g_dcoef +0.5*g_pii*dcoef g_Tmpv1 =0.5*pii*g_dcoef Tmpv1 =0.5*pii*dcoef g_dcoef =2.0*(g_Tmpv1*cos(Tmpv1))*(sin(Tmpv1)) dcoef =(sin(Tmpv1))**2 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =dcoef*g_dampcoef +g_dcoef*dampcoef g_Tmpv1 =g_dcoef*dampcoef Tmpv1 =dcoef*dampcoef g_Tmpv2 =mut(i,j)*(g_Tmpv1) +g_mut(i,j)*(Tmpv1) Tmpv2 =mut(i,j)*(Tmpv1) g_Tmpv3 =Tmpv2*g_w(i,k,j) +g_Tmpv2*w(i,k,j) Tmpv3 =Tmpv2*w(i,k,j) g_rw_tendf(i,k,j) =g_rw_tendf(i,k,j) -g_Tmpv3 rw_tendf(i,k,j) =rw_tendf(i,k,j) -Tmpv3 END IF ENDDO ENDDO ENDDO DO j =jts,min(jte,jde-1) DO i =its,min(ite,ide-1) ! Revised by Ning Pan, 2010-07-23 ! g_ztop =(g_phb(i,kde,j) +g_ph(i,kde,j))/g g_ztop =g_ph(i,kde,j)/g ztop =(phb(i,kde,j) +ph(i,kde,j))/g k1 =ktf g_z =g_ztop z =ztop !This line is fail to be recognized DO WHILE( z >= (ztop-zdamp) ) ! Revised by Ning Pan, 2010-07-23 ! g_z =0.5*(g_phb(i,k1,j) +g_phb(i,k1+1,j) +g_ph(i,k1,j) +g_ph(i,k1+1,j))/g g_z =0.5*(g_ph(i,k1,j) +g_ph(i,k1+1,j))/g z =0.5*(phb(i,k1,j) +phb(i,k1+1,j) +ph(i,k1,j) +ph(i,k1+1,j))/g g_z00(k1) =g_z 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 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =(t_base(k2) -t_base(k2-1))*(g_z00(k) -g_z_base(k2)) +(g_t_base( & ! k2) -g_t_base(k2-1))*(z00(k) -z_base(k2)) g_Tmpv1 =(t_base(k2) -t_base(k2-1))*g_z00(k) Tmpv1 =(t_base(k2) -t_base(k2-1))*(z00(k) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv2 =(g_Tmpv1*(z_base(k2) -z_base(k2-1)) -(g_z_base(k2) -g_z_base( & ! k2-1))*Tmpv1)/((z_base(k2) -z_base(k2-1))*(z_base(k2) -z_base(k2-1))) g_Tmpv2 =g_Tmpv1/(z_base(k2) -z_base(k2-1)) Tmpv2 =Tmpv1/(z_base(k2) -z_base(k2-1)) ! Revised by Ning Pan, 2010-07-23 ! g_t00(k) =g_t_base(k2) +g_Tmpv2 g_t00(k) =g_Tmpv2 t00(k) =t_base(k2) +Tmpv2 else ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =(t_base(k2+1) -t_base(k2))*(g_z00(k) -g_z_base(k2)) +(g_t_base( & ! k2+1) -g_t_base(k2))*(z00(k) -z_base(k2)) g_Tmpv1 =(t_base(k2+1) -t_base(k2))*g_z00(k) Tmpv1 =(t_base(k2+1) -t_base(k2))*(z00(k) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv2 =(g_Tmpv1*(z_base(k2+1) -z_base(k2)) -(g_z_base(k2+1) & ! -g_z_base(k2))*Tmpv1)/((z_base(k2+1) -z_base(k2))*(z_base(k2+1) -z_base(k2))) g_Tmpv2 =g_Tmpv1/(z_base(k2+1) -z_base(k2)) Tmpv2 =Tmpv1/(z_base(k2+1) -z_base(k2)) ! Revised by Ning Pan, 2010-07-23 ! g_t00(k) =g_t_base(k2) +g_Tmpv2 g_t00(k) =g_Tmpv2 t00(k) =t_base(k2) +Tmpv2 endif ENDDO DO k =k1,ktf ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =((g_ztop -g_z00(k))*zdamp -g_zdamp*(ztop -z00(k)))/(zdamp*zdamp) g_Tmpv1 =(g_ztop -g_z00(k))/zdamp Tmpv1 =(ztop -z00(k))/zdamp g_dcoef =-(0.0 +g_Tmpv1 -(0.0 -g_Tmpv1)*sign(1.0, 1.0 -(Tmpv1)))*0.5 dcoef =1.0 -min(1.0,Tmpv1) ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =0.5*pii*g_dcoef +0.5*g_pii*dcoef g_Tmpv1 =0.5*pii*g_dcoef Tmpv1 =0.5*pii*dcoef g_dcoef =2.0*(g_Tmpv1*cos(Tmpv1))*(sin(Tmpv1)) dcoef =(sin(Tmpv1))**2 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv1 =dcoef*g_dampcoef +g_dcoef*dampcoef g_Tmpv1 =g_dcoef*dampcoef Tmpv1 =dcoef*dampcoef g_Tmpv2 =mut(i,j)*(g_Tmpv1) +g_mut(i,j)*(Tmpv1) Tmpv2 =mut(i,j)*(Tmpv1) g_Tmpv3 =Tmpv2*(g_t(i,k,j) -g_t00(k)) +g_Tmpv2*(t(i,k,j) -t00(k)) Tmpv3 =Tmpv2*(t(i,k,j) -t00(k)) g_t_tendf(i,k,j) =g_t_tendf(i,k,j) -g_Tmpv3 t_tendf(i,k,j) =t_tendf(i,k,j) -Tmpv3 ENDDO ENDDO ENDDO END SUBROUTINE g_rk_rayleigh_damp ! Generated by TAPENADE (INRIA, Tropics team) ! Tapenade 3.5 (r3805) - 29 Mar 2011 12:57 ! ! Differentiation of theta_relaxation in forward (tangent) mode: ! variations of useful results: t_tendf ! with respect to varying inputs: t ph t_tendf mut ! RW status of diff variables: t:in ph:in t_tendf:in-out mut:in SUBROUTINE G_THETA_RELAXATION(t_tendf, t_tendfd, t, td, t_init, mut, & & mutd, ph, phd, 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), INTENT(INOUT) :: t_tendfd REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: t, t_init, & & ph, phb REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: td, phd REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mut REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mutd 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 :: rtermd REAL, DIMENSION(kms:kme) :: z00, t00 REAL, DIMENSION(kms:kme) :: z00d, t00d INTEGER :: min2 INTEGER :: min1 ! 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 t00d = 0.0 z00d = 0.0 ELSE min1 = jte t00d = 0.0 z00d = 0.0 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 z00d(k) = 0.5*inv_g*(phd(i, k, j)+phd(i, k+1, j)) 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 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 t00d(k) = (t_base(k2)-t_base(k2-1))*z00d(k)/(z_base(k2)-z_base& & (k2-1)) 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 t00d(k) = (t_base(k2+1)-t_base(k2))*z00d(k)/(z_base(k2+1)-& & z_base(k2)) t00(k) = t_base(k2) + (t_base(k2+1)-t_base(k2))*(z00(k)-z_base& & (k2))/(z_base(k2+1)-z_base(k2)) END IF END DO ! Apply the RE87 R term: DO k=kts,ktf rtermd = -(inv_tau_r*(td(i, k, j)-t00d(k))) rterm = -((t(i, k, j)-t00(k))*inv_tau_r) IF (rterm .GT. rmax) THEN rterm = rmax rtermd = 0.0 ELSE rterm = rterm END IF IF (rterm .LT. rmin) THEN rterm = rmin rtermd = 0.0 ELSE rterm = rterm END IF t_tendfd(i, k, j) = t_tendfd(i, k, j) + mutd(i, j)*rterm + mut(i& & , j)*rtermd t_tendf(i, k, j) = t_tendf(i, k, j) + mut(i, j)*rterm END DO END DO END DO END SUBROUTINE G_THETA_RELAXATION SUBROUTINE g_sixth_order_diffusion(name,field,g_field,tendency,g_tendency, & ! Revised by Ning Pan, 2010-07-23 ! mu,g_mu,dt,g_dt,config_flags,diff_6th_opt,diff_6th_factor,g_diff_6th_factor, & mu,g_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) IMPLICIT NONE REAL :: Tmpv1,g_Tmpv1,Tmpv2,g_Tmpv2,Tmpv3,g_Tmpv3 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,g_tendency REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: field,g_field REAL,DIMENSION(ims:ime,jms:jme) :: mu,g_mu ! Revised by Ning Pan, 2010-07-23 ! REAL :: dt,g_dt ! REAL :: diff_6th_factor,g_diff_6th_factor 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,g_dflux_x_p0,dflux_y_p0,g_dflux_y_p0,dflux_x_p1, & g_dflux_x_p1,dflux_y_p1,g_dflux_y_p1,tendency_x,g_tendency_x,tendency_y, & ! Revised by Ning Pan, 2010-07-23 ! g_tendency_y,mu_avg_p0,g_mu_avg_p0,mu_avg_p1,g_mu_avg_p1,diff_6th_coef, & ! g_diff_6th_coef g_tendency_y,mu_avg_p0,g_mu_avg_p0,mu_avg_p1,g_mu_avg_p1,diff_6th_coef LOGICAL :: specified ! Remarked by Ning Pan, 2010-07-23 ! g_Tmpv1 =(g_diff_6th_factor*0.015625*(2.0*dt) -(2.0*g_dt)*diff_6th_factor* & ! 0.015625)/((2.0*dt)*(2.0*dt)) Tmpv1 =diff_6th_factor*0.015625/(2.0*dt) ! Remarked by Ning Pan, 2010-07-23 ! g_diff_6th_coef =g_Tmpv1 diff_6th_coef =Tmpv1 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 DO j =j_start,j_end DO k =k_start,k_end DO i =i_start,i_end g_dflux_x_p0 =(10.0*(g_field(i,k,j) -g_field(i-1,k,j)) -5.0*(g_field(i+1, & k,j) -g_field(i-2,k,j)) +(g_field(i+2,k,j) -g_field(i-3,k,j))) dflux_x_p0 =(10.0*(field(i,k,j) -field(i-1,k,j)) -5.0*(field(i+1,k,j) -field(i-2,k, & j)) +(field(i+2,k,j) -field(i-3,k,j))) g_dflux_x_p1 =(10.0*(g_field(i+1,k,j) -g_field(i,k,j)) -5.0*(g_field(i+2, & k,j) -g_field(i-1,k,j)) +(g_field(i+3,k,j) -g_field(i-2,k,j))) dflux_x_p1 =(10.0*(field(i+1,k,j) -field(i,k,j)) -5.0*(field(i+2,k,j) -field(i-1,k, & j)) +(field(i+3,k,j) -field(i-2,k,j))) IF( diff_6th_opt .EQ. 2 ) THEN IF( dflux_x_p0 * ( field(i ,k,j)-field(i-1,k,j) ) .LE. 0.0 ) THEN g_dflux_x_p0 =0.0 dflux_x_p0 =0.0 END IF IF( dflux_x_p1 * ( field(i+1,k,j)-field(i ,k,j) ) .LE. 0.0 ) THEN g_dflux_x_p1 =0.0 dflux_x_p1 =0.0 END IF END IF IF( name .EQ. 'u' ) THEN g_mu_avg_p0 =g_mu(i-1,j) mu_avg_p0 =mu(i-1,j) g_mu_avg_p1 =g_mu(i,j) mu_avg_p1 =mu(i,j) ELSE IF( name .EQ. 'v' ) THEN g_mu_avg_p0 =0.25*(g_mu(i-1,j-1) +g_mu(i,j-1) +g_mu(i-1,j) +g_mu(i,j)) mu_avg_p0 =0.25*(mu(i-1,j-1) +mu(i,j-1) +mu(i-1,j) +mu(i,j)) g_mu_avg_p1 =0.25*(g_mu(i,j-1) +g_mu(i+1,j-1) +g_mu(i,j) +g_mu(i+1,j)) mu_avg_p1 =0.25*(mu(i,j-1) +mu(i+1,j-1) +mu(i,j) +mu(i+1,j)) ELSE g_mu_avg_p0 =0.5*(g_mu(i-1,j) +g_mu(i,j)) mu_avg_p0 =0.5*(mu(i-1,j) +mu(i,j)) g_mu_avg_p1 =0.5*(g_mu(i,j) +g_mu(i+1,j)) mu_avg_p1 =0.5*(mu(i,j) +mu(i+1,j)) END IF g_Tmpv1 =mu_avg_p1*g_dflux_x_p1 +g_mu_avg_p1*dflux_x_p1 Tmpv1 =mu_avg_p1*dflux_x_p1 g_Tmpv2 =mu_avg_p0*g_dflux_x_p0 +g_mu_avg_p0*dflux_x_p0 Tmpv2 =mu_avg_p0*dflux_x_p0 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv3 =diff_6th_coef*((g_Tmpv1) -(g_Tmpv2)) +g_diff_6th_coef*((Tmpv1) -(Tmpv2)) g_Tmpv3 =diff_6th_coef*((g_Tmpv1) -(g_Tmpv2)) Tmpv3 =diff_6th_coef*((Tmpv1) -(Tmpv2)) g_tendency_x =g_Tmpv3 tendency_x =Tmpv3 g_dflux_y_p0 =(10.0*(g_field(i,k,j) -g_field(i,k,j-1)) -5.0*(g_field(i,k, & j+1) -g_field(i,k,j-2)) +(g_field(i,k,j+2) -g_field(i,k,j-3))) dflux_y_p0 =(10.0*(field(i,k,j) -field(i,k,j-1)) -5.0*(field(i,k,j+1) -field(i,k,j- & 2)) +(field(i,k,j+2) -field(i,k,j-3))) g_dflux_y_p1 =(10.0*(g_field(i,k,j+1) -g_field(i,k,j)) -5.0*(g_field(i,k, & j+2) -g_field(i,k,j-1)) +(g_field(i,k,j+3) -g_field(i,k,j-2))) dflux_y_p1 =(10.0*(field(i,k,j+1) -field(i,k,j)) -5.0*(field(i,k,j+2) -field(i,k,j- & 1)) +(field(i,k,j+3) -field(i,k,j-2))) IF( diff_6th_opt .EQ. 2 ) THEN IF( dflux_y_p0 * ( field(i,k,j )-field(i,k,j-1) ) .LE. 0.0 ) THEN g_dflux_y_p0 =0.0 dflux_y_p0 =0.0 END IF IF( dflux_y_p1 * ( field(i,k,j+1)-field(i,k,j ) ) .LE. 0.0 ) THEN g_dflux_y_p1 =0.0 dflux_y_p1 =0.0 END IF END IF IF( name .EQ. 'u' ) THEN g_mu_avg_p0 =0.25*(g_mu(i-1,j-1) +g_mu(i,j-1) +g_mu(i-1,j) +g_mu(i,j)) mu_avg_p0 =0.25*(mu(i-1,j-1) +mu(i,j-1) +mu(i-1,j) +mu(i,j)) g_mu_avg_p1 =0.25*(g_mu(i-1,j) +g_mu(i,j) +g_mu(i-1,j+1) +g_mu(i,j+1)) mu_avg_p1 =0.25*(mu(i-1,j) +mu(i,j) +mu(i-1,j+1) +mu(i,j+1)) ELSE IF( name .EQ. 'v' ) THEN g_mu_avg_p0 =g_mu(i,j-1) mu_avg_p0 =mu(i,j-1) g_mu_avg_p1 =g_mu(i,j) mu_avg_p1 =mu(i,j) ELSE g_mu_avg_p0 =0.5*(g_mu(i,j-1) +g_mu(i,j)) mu_avg_p0 =0.5*(mu(i,j-1) +mu(i,j)) g_mu_avg_p1 =0.5*(g_mu(i,j) +g_mu(i,j+1)) mu_avg_p1 =0.5*(mu(i,j) +mu(i,j+1)) END IF g_Tmpv1 =mu_avg_p1*g_dflux_y_p1 +g_mu_avg_p1*dflux_y_p1 Tmpv1 =mu_avg_p1*dflux_y_p1 g_Tmpv2 =mu_avg_p0*g_dflux_y_p0 +g_mu_avg_p0*dflux_y_p0 Tmpv2 =mu_avg_p0*dflux_y_p0 ! Revised by Ning Pan, 2010-07-23 ! g_Tmpv3 =diff_6th_coef*((g_Tmpv1) -(g_Tmpv2)) +g_diff_6th_coef*((Tmpv1) -(Tmpv2)) g_Tmpv3 =diff_6th_coef*((g_Tmpv1) -(g_Tmpv2)) Tmpv3 =diff_6th_coef*((Tmpv1) -(Tmpv2)) g_tendency_y =g_Tmpv3 tendency_y =Tmpv3 g_tendency(i,k,j) =g_tendency(i,k,j) +g_tendency_x +g_tendency_y tendency(i,k,j) =tendency(i,k,j) +tendency_x +tendency_y ENDDO ENDDO ENDDO END SUBROUTINE g_sixth_order_diffusion END MODULE g_module_big_step_utilities_em