!WRF+/AD:MODEL_LAYER:DYNAMICS
!
MODULE a_module_em
USE module_model_constants
USE a_module_advect_em, only: a_advect_u, a_advect_v, a_advect_w, a_advect_scalar, a_advect_scalar_pd, a_advect_scalar_mono, &
a_advect_weno_u, a_advect_weno_v, a_advect_weno_w, a_advect_scalar_weno, a_advect_scalar_wenopd
USE module_big_step_utilities_em, only: calculate_full, calc_mu_uv
USE a_module_big_step_utilities_em, only: grid_config_rec_type, a_calculate_full, a_couple_momentum, a_calc_mu_uv, a_calc_ww_cp, a_calc_cq, a_calc_alt, a_calc_php, a_set_tend, a_rhs_ph, &
a_horizontal_pressure_gradient, a_pg_buoy_w, a_w_damp, a_perturbation_coriolis, a_coriolis, a_curvature, a_horizontal_diffusion, a_horizontal_diffusion_3dmp, a_vertical_diffusion_u, &
a_vertical_diffusion_v, a_vertical_diffusion, a_vertical_diffusion_3dmp, a_sixth_order_diffusion, a_rk_rayleigh_damp, a_theta_relaxation, a_vertical_diffusion_mp, a_zero_tend, a_zero_tend2d
USE module_state_description, only: param_first_scalar, p_qr, p_qv, p_qc, p_qg, p_qi, p_qs, tiedtkescheme, ntiedtkescheme, heldsuarez, positivedef, &
gdscheme, g3scheme, kfetascheme, mskfscheme, monotonic, wenopd_scalar, weno_scalar, weno_mom
!USE module_damping_em, only: held_suarez_damp
CONTAINS
!------------------------------------------------------------------------
SUBROUTINE a_rk_step_prep(config_flags,rk_step,u,a_u,v,a_v,w,a_w,t,a_t,ph, &
a_ph,mu,a_mu,moist,a_moist,ru,a_ru,rv,a_rv,rw,a_rw,ww,a_ww,php,a_php, &
alt,a_alt,muu,a_muu,muv,a_muv,mub,mut,a_mut,phb,pb,p,a_p,al,a_al,alb,cqu, &
a_cqu,cqv,a_cqv,cqw,a_cqw,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,fnm, &
fnp,dnw,rdx,rdy,n_moist,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
INTEGER :: n_moist,rk_step
REAL :: rdx,rdy
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: u,a_u,v,a_v,w,a_w,t,a_t,ph,a_ph, &
phb,pb,al,a_al,alb
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru,a_ru,rv,a_rv,rw,a_rw,ww,a_ww, &
php,a_php,cqu,a_cqu,cqv,a_cqv,cqw,a_cqw,alt,a_alt
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: p,a_p
REAL,DIMENSION(ims:ime,kms:kme,jms:jme,n_moist) :: moist,a_moist
REAL,DIMENSION(ims:ime,jms:jme) :: msftx,msfty,msfux,msfuy,msfvx,msfvx_inv,msfvy,mu, &
a_mu,mub
REAL,DIMENSION(ims:ime,jms:jme) :: muu,a_muu,muv,a_muv,mut,a_mut
REAL,DIMENSION(kms:kme) :: fnm,fnp,dnw
integer :: k
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!!LPB[0]
! CALL calculate_full( mut, mub, mu, &
! ids, ide, jds, jde, 1, 2, &
! ims, ime, jms, jme, 1, 1, &
! its, ite, jts, jte, 1, 1 )
! CALL calc_mu_uv ( config_flags, &
! mu, mub, muu, muv, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL couple_momentum( muu, ru, u, msfuy, &
! muv, rv, v, msfvx, msfvx_inv, &
! mut, rw, w, msfty, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL calc_ww_cp ( u, v, mu, mub, 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 )
! CALL calc_cq ( moist, cqu, cqv, cqw, n_moist, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL calc_alt ( alt, al, alb, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL calc_php ( php, ph, phb, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[0]
CALL calculate_full(mut,mub,mu,ids,ide,jds,jde,1,2,ims,ime,jms,jme,1,1,its,ite, &
jts,jte,1,1)
CALL calc_mu_uv(config_flags,mu,mub,muu,muv,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
jme,kms,kme,its,ite,jts,jte,kts,kte)
! Remarked by Ning Pan, 2010-07-13
! CALL couple_momentum(muu,ru,u,msfuy,muv,rv,v,msfvx,msfvx_inv,mut,rw,w,msfty,ids, &
! ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! CALL calc_ww_cp(u,v,mu,mub,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)
! CALL calc_cq(moist,cqu,cqv,cqw,n_moist,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
! kms,kme,its,ite,jts,jte,kts,kte)
! CALL calc_alt(alt,al,alb,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
! jts,jte,kts,kte)
! CALL calc_php(php,ph,phb,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
! jts,jte,kts,kte)
CALL a_calc_php(php,a_php,ph,a_ph,phb,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_calc_alt(alt,a_alt,al,a_al,alb,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_calc_cq(moist,a_moist,cqu,a_cqu,cqv,a_cqv,cqw,a_cqw,n_moist,ids, &
ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_calc_ww_cp(u,a_u,v,a_v,mu,a_mu,mub,ww,a_ww,rdx,rdy,msftx,msfty, &
msfux,msfuy,msfvx,msfvx_inv,msfvy,dnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
! Revised by Ning Pan, 2010-07-13
! CALL a_couple_momentum(muu,a_muu,ru,a_ru,u,a_u,msfuy,muv,a_muv,rv, &
! a_rv,v,a_v,msfvx,msfvx_inv,mut,a_mut,rw,a_rw,w,a_w,msfty,ids,ide,jds,jde, &
! kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_couple_momentum(muu,a_muu,a_ru,u,a_u,msfuy,muv,a_muv, &
a_rv,v,a_v,msfvx,msfvx_inv,mut,a_mut,a_rw,w,a_w,msfty,ids,ide,jds,jde, &
kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! Revised by Ning Pan, 2010-07-13
! CALL a_calc_mu_uv(config_flags,mu,a_mu,mub,muu,a_muu,muv,a_muv,ids,ide, &
! jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_calc_mu_uv(config_flags,a_mu,a_muu,a_muv,ids,ide, &
jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! Revised by Ning Pan, 2010-07-13
! CALL a_calculate_full(mut,a_mut,mub,mu,a_mu,ids,ide,jds,jde,1,2,ims,ime,jms, &
! jme,1,1,its,ite,jts,jte,1,1)
CALL a_calculate_full(a_mut,a_mu,ids,ide,jds,jde,1,2,ims,ime,jms, &
jme,1,1,its,ite,jts,jte,1,1)
END SUBROUTINE a_rk_step_prep
!-------------------------------------------------------------------------------
SUBROUTINE a_rk_tendency(config_flags,rk_step,ru_tend,a_ru_tend,rv_tend, &
a_rv_tend,rw_tend,a_rw_tend,ph_tend,a_ph_tend,t_tend,a_t_tend,ru_tendf, &
a_ru_tendf,rv_tendf,a_rv_tendf,rw_tendf,a_rw_tendf,ph_tendf,a_ph_tendf, &
t_tendf,a_t_tendf,mu_tend,a_mu_tend,u_save,a_u_save,v_save,a_v_save,w_save, &
a_w_save,ph_save,a_ph_save,t_save,a_t_save,mu_save,a_mu_save,RTHFTEN, &
a_RTHFTEN,ru,a_ru,rv,a_rv,rw,a_rw,ww,a_ww,u,a_u,v,a_v,w,a_w,t,a_t, &
ph,a_ph,u_old,a_u_old,v_old,a_v_old,w_old,a_w_old,t_old,a_t_old,ph_old, &
! Revised by Ning Pan, 2010-07-30
! a_ph_old,h_diabatic,a_h_diabatic,phb,t_init,a_t_init,mu,a_mu,mut,a_mut,muu, &
a_ph_old,h_diabatic,a_h_diabatic,phb,t_init,mu,a_mu,mut,a_mut,muu, &
a_muu,muv,a_muv,mub,al,a_al,alt,a_alt,p,a_p,pb,php,a_php,cqu,a_cqu,cqv, &
a_cqv,cqw,a_cqw,u_base,v_base,t_base,qv_base,z_base,msfux,msfuy,msfvx,msfvx_inv, &
! Revised by Ning Pan, 2010-07-30
! msfvy,msftx,msfty,xlat,a_xlat,f,e,sina,cosa,fnm,fnp,rdn,rdnw,dt,rdx,rdy,khdif, &
! kvdif,xkmhd,a_xkmhd,xkhh,a_xkhh,diff_6th_opt,diff_6th_factor,a_diff_6th_factor, &
! dampcoef,a_dampcoef,zdamp,a_zdamp,damp_opt,cf1,cf2,cf3,cfn,cfn1,n_moist, &
! non_hydrostatic,top_lid,u_frame,a_u_frame,v_frame,a_v_frame,ids,ide,jds,jde,kds, &
! kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte,max_vert_cfl,a_max_vert_cfl, &
! max_horiz_cfl,a_max_horiz_cfl)
msfvy,msftx,msfty,xlat,f,e,sina,cosa,fnm,fnp,rdn,rdnw,dt,rdx,rdy,khdif, &
kvdif,xkmhd,a_xkmhd,xkhh,a_xkhh,diff_6th_opt,diff_6th_factor, &
adv_opt,dampcoef,zdamp,damp_opt,rad_nudge,cf1,cf2,cf3,cfn,cfn1,n_moist, &
non_hydrostatic,top_lid,u_frame,v_frame,ids,ide,jds,jde,kds, &
kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte,max_vert_cfl, &
max_horiz_cfl)
! PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
LOGICAL :: non_hydrostatic,top_lid
INTEGER :: n_moist,rk_step
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru,a_ru,rv,a_rv,rw,a_rw,ww,a_ww,u, &
a_u,v,a_v,w,a_w,t,a_t,ph,a_ph,u_old,a_u_old,v_old,a_v_old,w_old, &
a_w_old,t_old,a_t_old,ph_old,a_ph_old,phb,al,a_al,alt,a_alt,p,a_p,pb,php, &
! Revised by Ning Pan, 2010-07-30
! a_php,cqu,a_cqu,cqv,a_cqv,t_init,a_t_init,xkmhd,a_xkmhd,xkhh,a_xkhh, &
a_php,cqu,a_cqu,cqv,a_cqv,t_init,xkmhd,a_xkmhd,xkhh,a_xkhh, &
h_diabatic,a_h_diabatic
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru_tend,a_ru_tend,rv_tend,a_rv_tend, &
rw_tend,a_rw_tend,t_tend,a_t_tend,ph_tend,a_ph_tend,RTHFTEN,a_RTHFTEN,u_save, &
a_u_save,v_save,a_v_save,w_save,a_w_save,ph_save,a_ph_save,t_save,a_t_save
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru_tendf,a_ru_tendf,rv_tendf, &
a_rv_tendf,rw_tendf,a_rw_tendf,t_tendf,a_t_tendf,ph_tendf,a_ph_tendf,cqw,a_cqw
REAL,DIMENSION(ims:ime,jms:jme) :: mu_tend,a_mu_tend,mu_save,a_mu_save
REAL,DIMENSION(ims:ime,jms:jme) :: msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty, &
! Revised by Ning Pan, 2010-07-30
! xlat,a_xlat,f,e,sina,cosa,mu,a_mu,mut,a_mut,mub,muu,a_muu,muv,a_muv
xlat,f,e,sina,cosa,mu,a_mu,mut,a_mut,mub,muu,a_muu,muv,a_muv
REAL,DIMENSION(kms:kme) :: fnm,fnp,rdn,rdnw,u_base,v_base,t_base,qv_base,z_base
! Revised by Ning Pan, 2010-07-30
! REAL :: rdx,rdy,dt,u_frame,a_u_frame,v_frame,a_v_frame,khdif,kvdif
REAL :: rdx,rdy,dt,u_frame,v_frame,khdif,kvdif
INTEGER :: diff_6th_opt
! Revised by Ning Pan, 2010-07-30
! REAL :: diff_6th_factor,a_diff_6th_factor
REAL :: diff_6th_factor
INTEGER :: adv_opt
INTEGER :: damp_opt,rad_nudge
! Revised by Ning Pan, 2010-07-30
! REAL :: zdamp,a_zdamp,dampcoef,a_dampcoef
! REAL :: max_horiz_cfl,a_max_horiz_cfl
! REAL :: max_vert_cfl,a_max_vert_cfl
REAL :: zdamp,dampcoef
REAL :: max_horiz_cfl
REAL :: max_vert_cfl
! Revised by Ning Pan, 2010-07-30
! REAL :: kdift,a_kdift,khdq,a_khdq,kvdq,a_kvdq,cfn,cfn1,cf1,cf2,cf3
REAL :: kdift,khdq,kvdq,cfn,cfn1,cf1,cf2,cf3
INTEGER :: i,j,k
INTEGER :: time_step
! Remarked by Ning Pan, 2010-07-30
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb0_u
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb0_v
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb1_w
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb1_rw_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb2_t
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb2_t_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb2_ru
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb2_rv
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb4_ph_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb4_ru_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb4_rv_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb5_rw_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb5_cqw
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb6_rw_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb7_ru_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb7_rv_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb7_rw_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb8_ru_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb8_rv_tend
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: Keep_Lpb8_rw_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb9_ru_tend
! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb9_rv_tend
!! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb11_ru_tendf
!! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb11_rv_tendf
!! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb11_rw_tendf
!! REAL,DIMENSION(1,ims:ime,kms:kme,jms:jme) :: Keep_Lpb11_t_tendf
! INTEGER :: IX1,IX2,IX3
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv400
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv401
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv402
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv403
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv404
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv405
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv406
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv407
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv408
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv409
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv4010
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv4011
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv4012
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv4013
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv4014
! REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv4015
! REAL :: Const_Diff_A0,Const_A0
! This line is fail to be recognized
CALL nl_get_time_step ( 1, time_step )
! Remarked by Ning Pan, 2010-07-30 : Part II is not needed
!! PART! II: CALCULATIONS OF B. S. TRAJECTORY
!! LPB[0]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb0_u(IX1,IX2,IX3) =u(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb0_v(IX1,IX2,IX3) =v(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL zero_tend ( ru_tend, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( rv_tend, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( rw_tend, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( t_tend, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( ph_tend, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( u_save, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( v_save, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( w_save, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( ph_save, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( t_save, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL zero_tend ( mu_tend, &
! ids, ide, jds, jde, 1, 1, &
! ims, ime, jms, jme, 1, 1, &
! its, ite, jts, jte, 1, 1 )
! CALL zero_tend ( mu_save, &
! ids, ide, jds, jde, 1, 1, &
! ims, ime, jms, jme, 1, 1, &
! its, ite, jts, jte, 1, 1 )
! CALL advect_u ( u, u , ru_tend, ru, rv, ww, &
! mut, time_step, config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, &
! fnm, fnp, rdx, rdy, rdnw, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL advect_v ( v, v , rv_tend, ru, rv, ww, &
! mut, time_step, config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, &
! fnm, fnp, rdx, rdy, rdnw, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
!LPB[1]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb1_w(IX1,IX2,IX3) =w(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb1_rw_tend(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! IF (non_hydrostatic) &
! CALL advect_w ( w, w, rw_tend, ru, rv, ww, &
! mut, time_step, config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, &
! fnm, fnp, rdx, rdy, rdn, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
!LPB[2]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb2_t(IX1,IX2,IX3) =t(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb2_t_tend(IX1,IX2,IX3) =t_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb2_ru(IX1,IX2,IX3) =ru(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb2_rv(IX1,IX2,IX3) =rv(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL advect_scalar ( t, t, t_tend, ru, rv, ww, &
! mut, time_step, config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, fnm, fnp, &
! rdx, rdy, rdnw, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
!LPB[3]
! IF ( config_flags%cu_physics == GDSCHEME .OR. &
! config_flags%cu_physics == G3SCHEME ) THEN
! CALL set_tend( RTHFTEN, t_tend, msfty, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! END IF
!LPB[4]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb4_ph_tend(IX1,IX2,IX3) =ph_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb4_ru_tend(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb4_rv_tend(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL rhs_ph( ph_tend, u, v, ww, ph, ph, phb, w, &
! mut, muu, 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 )
! CALL horizontal_pressure_gradient( ru_tend,rv_tend, &
! ph,alt,p,pb,al,php,cqu,cqv, &
! muu,muv,mu,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 )
!LPB[5]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb5_rw_tend(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb5_cqw(IX1,IX2,IX3) =cqw(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! IF (non_hydrostatic) THEN
! CALL pg_buoy_w( rw_tend, p, cqw, 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 )
! ENDIF
!LPB[6]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb6_rw_tend(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL w_damp ( rw_tend, max_vert_cfl, &
! max_horiz_cfl, &
! u, v, ww, w, 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 )
!LPB[7]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb7_ru_tend(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb7_rv_tend(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb7_rw_tend(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! IF(config_flags%pert_coriolis) THEN
! CALL perturbation_coriolis ( ru, rv, rw, &
! ru_tend, rv_tend, rw_tend, &
! config_flags, &
! u_base, v_base, z_base, &
! muu, muv, phb, ph, &
! msftx, msfty, msfux, msfuy, &
! msfvx, msfvy, &
! f, e, sina, cosa, fnm, fnp, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ELSE
! CALL coriolis ( ru, rv, rw, &
! ru_tend, rv_tend, rw_tend, &
! config_flags, &
! msftx, msfty, msfux, msfuy, &
! msfvx, msfvy, &
! f, e, sina, cosa, fnm, fnp, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! END IF
!LPB[8]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb8_ru_tend(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb8_rv_tend(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb8_rw_tend(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL curvature ( ru, rv, rw, u, v, w, &
! ru_tend, rv_tend, rw_tend, &
! config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, &
! xlat, fnm, fnp, rdx, rdy, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
!LPB[9]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb9_ru_tend(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Keep_Lpb9_rv_tend(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! IF (config_flags%ra_lw_physics == HELDSUAREZ) THEN
! CALL held_suarez_damp ( ru_tend, rv_tend, &
! ru,rv,p,pb, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! END IF
!LPB[10]
!!LPB[11]
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb11_ru_tendf(IX1,IX2,IX3) =ru_tendf(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb11_rv_tendf(IX1,IX2,IX3) =rv_tendf(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb11_rw_tendf(IX1,IX2,IX3) =rw_tendf(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb11_t_tendf(IX1,IX2,IX3) =t_tendf(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!
! forward_step: IF( rk_step == 1 ) THEN
! diff_opt1 : IF (config_flags%diff_opt .eq. 1) THEN
! CALL horizontal_diffusion ('u', u, ru_tendf, mut, config_flags, &
! msfux, msfuy, msfvx, msfvx_inv, &
! msfvy,msftx, msfty, &
! khdif, xkmhd, rdx, rdy, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL horizontal_diffusion ('v', v, rv_tendf, mut, config_flags, &
! msfux, msfuy, msfvx, msfvx_inv, &
! msfvy,msftx, msfty, &
! khdif, xkmhd, rdx, rdy, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL horizontal_diffusion ('w', w, rw_tendf, mut, config_flags, &
! msfux, msfuy, msfvx, msfvx_inv, &
! msfvy,msftx, msfty, &
! khdif, xkmhd, rdx, rdy, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! khdq = 3.*khdif
! CALL horizontal_diffusion_3dmp ( 'm', t, t_tendf, mut, &
! config_flags, t_init, &
! msfux, msfuy, msfvx, msfvx_inv, &
! msfvy, msftx, msfty, &
! khdq , xkhh, rdx, rdy, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! pbl_test : IF (config_flags%bl_pbl_physics .eq. 0) THEN
! CALL vertical_diffusion_u ( u, ru_tendf, config_flags, &
! u_base, &
! alt, muu, rdn, rdnw, kvdif, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! CALL vertical_diffusion_v ( v, rv_tendf, config_flags, &
! v_base, &
! alt, muv, rdn, rdnw, kvdif, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! IF (non_hydrostatic) &
! CALL vertical_diffusion ( 'w', w, rw_tendf, config_flags, &
! alt, mut, rdn, rdnw, kvdif, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! kvdq = 3.*kvdif
! CALL vertical_diffusion_3dmp ( t, t_tendf, config_flags, t_init, &
! alt, mut, rdn, rdnw, kvdq , &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ENDIF pbl_test
! END IF diff_opt1
! IF ( diff_6th_opt .NE. 0 ) THEN
! CALL sixth_order_diffusion( 'u', u, ru_tendf, mut, 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 )
! CALL sixth_order_diffusion( 'v', v, rv_tendf, mut, 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 )
! IF (non_hydrostatic) &
! CALL sixth_order_diffusion( 'w', w, rw_tendf, mut, 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 )
! CALL sixth_order_diffusion( 'm', t, t_tendf, mut, 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 )
! ENDIF
! IF( damp_opt .eq. 2 ) &
! CALL rk_rayleigh_damp( ru_tendf, rv_tendf, &
! rw_tendf, t_tendf, &
! u, v, w, t, t_init, &
! mut, muu, muv, 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 )
! END IF
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
! Remarked by Ning Pan, 2010-07-30
! a_kdift =0.0
! a_khdq =0.0
! a_kvdq =0.0
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[11]
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tendf(IX1,IX2,IX3) =Keep_Lpb11_ru_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tendf(IX1,IX2,IX3) =Keep_Lpb11_rv_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tendf(IX1,IX2,IX3) =Keep_Lpb11_rw_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! t_tendf(IX1,IX2,IX3) =Keep_Lpb11_t_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! Remarked by Ning Pan, 2010-07-30
! IF( rk_step == 1 ) THEN
! IF(config_flags%diff_opt .eq. 1) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv400(IX1,IX2,IX3) =ru_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL horizontal_diffusion('u',u,ru_tendf,mut,config_flags,msfux,msfuy,msfvx, &
! msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
! jme,kms,kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv401(IX1,IX2,IX3) =rv_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL horizontal_diffusion('v',v,rv_tendf,mut,config_flags,msfux,msfuy,msfvx, &
! msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
! jme,kms,kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv402(IX1,IX2,IX3) =rw_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL horizontal_diffusion('w',w,rw_tendf,mut,config_flags,msfux,msfuy,msfvx, &
! msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
! jme,kms,kme,its,ite,jts,jte,kts,kte)
! khdq =3.*khdif
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv403(IX1,IX2,IX3) =t_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL horizontal_diffusion_3dmp('m',t,t_tendf,mut,config_flags,t_init,msfux,msfuy, &
! msfvx,msfvx_inv,msfvy,msftx,msfty,khdq,xkhh,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime, &
! jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! IF(config_flags%bl_pbl_physics .eq. 0) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv404(IX1,IX2,IX3) =ru_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL vertical_diffusion_u(u,ru_tendf,config_flags,u_base,alt,muu,rdn,rdnw,kvdif, &
! ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv405(IX1,IX2,IX3) =rv_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL vertical_diffusion_v(v,rv_tendf,config_flags,v_base,alt,muv,rdn,rdnw,kvdif, &
! ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! IF(non_hydrostatic) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv406(IX1,IX2,IX3) =rw_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL vertical_diffusion('w',w,rw_tendf,config_flags,alt,mut,rdn,rdnw,kvdif,ids, &
! ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! END IF
! kvdq =3.*kvdif
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv407(IX1,IX2,IX3) =t_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL vertical_diffusion_3dmp(t,t_tendf,config_flags,t_init,alt,mut,rdn,rdnw,kvdq, &
! ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! ENDIF
! END IF
! IF( diff_6th_opt .NE. 0 ) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv408(IX1,IX2,IX3) =ru_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL sixth_order_diffusion('u',u,ru_tendf,mut,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)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv409(IX1,IX2,IX3) =rv_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL sixth_order_diffusion('v',v,rv_tendf,mut,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)
! IF(non_hydrostatic) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv4010(IX1,IX2,IX3) =rw_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL sixth_order_diffusion('w',w,rw_tendf,mut,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)
! END IF
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv4011(IX1,IX2,IX3) =t_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL sixth_order_diffusion('m',t,t_tendf,mut,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)
! ENDIF
! IF( damp_opt .eq. 2 ) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv4012(IX1,IX2,IX3) =ru_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv4013(IX1,IX2,IX3) =rv_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv4014(IX1,IX2,IX3) =rw_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv4015(IX1,IX2,IX3) =t_tendf(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL rk_rayleigh_damp(ru_tendf,rv_tendf,rw_tendf,t_tendf,u,v,w,t,t_init,mut,muu, &
! muv,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)
! END IF
! END IF
!! temp NING
IF( rk_step == 1 ) THEN
IF( rad_nudge .eq. 1 ) &
CALL a_theta_relaxation( t_tendf, a_t_tendf, t, a_t, t_init, &
mut, a_mut, ph, a_ph, phb, &
t_base, z_base, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
IF( damp_opt .eq. 2 ) THEN
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! t_tendf(IX1,IX2,IX3) =Tmpv4015(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tendf(IX1,IX2,IX3) =Tmpv4014(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tendf(IX1,IX2,IX3) =Tmpv4013(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tendf(IX1,IX2,IX3) =Tmpv4012(IX1,IX2,IX3)
! END DO
! END DO
! END DO
CALL a_rk_rayleigh_damp(ru_tendf,a_ru_tendf,rv_tendf,a_rv_tendf,rw_tendf, &
! Revised by Ning Pan, 2010-07-23
! a_rw_tendf,t_tendf,a_t_tendf,u,a_u,v,a_v,w,a_w,t,a_t,t_init,a_t_init, &
a_rw_tendf,t_tendf,a_t_tendf,u,a_u,v,a_v,w,a_w,t,a_t,t_init, &
mut,a_mut,muu,a_muu,muv,a_muv,ph,a_ph,phb,u_base,v_base,t_base,z_base, &
! Revised by Ning Pan, 2010-07-30
! dampcoef,a_dampcoef,zdamp,a_zdamp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
dampcoef,zdamp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
END IF
IF( diff_6th_opt .NE. 0 ) THEN
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! t_tendf(IX1,IX2,IX3) =Tmpv4011(IX1,IX2,IX3)
! END DO
! END DO
! END DO
CALL a_sixth_order_diffusion('m',t,a_t,t_tendf,a_t_tendf,mut,a_mut,dt, &
! Revised by Ning Pan, 2010-07-30
! config_flags,diff_6th_opt,diff_6th_factor,a_diff_6th_factor,ids,ide,jds,jde,kds, &
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)
IF(non_hydrostatic) THEN
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tendf(IX1,IX2,IX3) =Tmpv4010(IX1,IX2,IX3)
! END DO
! END DO
! END DO
CALL a_sixth_order_diffusion('w',w,a_w,rw_tendf,a_rw_tendf,mut,a_mut,dt, &
! Revised by Ning Pan, 2010-07-30
! config_flags,diff_6th_opt,diff_6th_factor,a_diff_6th_factor,ids,ide,jds,jde,kds, &
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)
END IF
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tendf(IX1,IX2,IX3) =Tmpv409(IX1,IX2,IX3)
! END DO
! END DO
! END DO
CALL a_sixth_order_diffusion('v',v,a_v,rv_tendf,a_rv_tendf,mut,a_mut,dt, &
! Revised by Ning Pan, 2010-07-30
! config_flags,diff_6th_opt,diff_6th_factor,a_diff_6th_factor,ids,ide,jds,jde,kds, &
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)
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tendf(IX1,IX2,IX3) =Tmpv408(IX1,IX2,IX3)
! END DO
! END DO
! END DO
CALL a_sixth_order_diffusion('u',u,a_u,ru_tendf,a_ru_tendf,mut,a_mut,dt, &
! Revised by Ning Pan, 2010-07-30
! config_flags,diff_6th_opt,diff_6th_factor,a_diff_6th_factor,ids,ide,jds,jde,kds, &
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)
ENDIF
IF(config_flags%diff_opt .eq. 1) THEN
! Revised by Ning Pan, 2010-07-30 : reverse the adjoint computation order
! revise actual arguments
! remark useless recalculation
IF(config_flags%bl_pbl_physics .eq. 0) THEN
kvdq = 3.*kvdif
CALL a_vertical_diffusion_3dmp(t,a_t,t_tendf,a_t_tendf,config_flags,t_init, &
alt,a_alt,mut,a_mut,rdn,rdnw,kvdq,ids,ide,jds,jde,kds,kde, &
ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
IF(non_hydrostatic) THEN
CALL a_vertical_diffusion('w',w,a_w,rw_tendf,a_rw_tendf,config_flags,alt, &
a_alt,mut,a_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
its,ite,jts,jte,kts,kte)
END IF
CALL a_vertical_diffusion_v(v,a_v,rv_tendf,a_rv_tendf,config_flags,v_base, &
alt,a_alt,muv,a_muv,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
CALL a_vertical_diffusion_u(u,a_u,ru_tendf,a_ru_tendf,config_flags,u_base, &
alt,a_alt,muu,a_muu,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
ENDIF
khdq = 3.*khdif
CALL a_horizontal_diffusion_3dmp('m',t,a_t,t_tendf,a_t_tendf,mut,a_mut, &
config_flags,t_init,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdq, &
xkhh,a_xkhh,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its, &
ite,jts,jte,kts,kte)
CALL a_horizontal_diffusion('w',w,a_w,rw_tendf,a_rw_tendf,mut,a_mut, &
config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,a_xkmhd,rdx, &
rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_horizontal_diffusion('v',v,a_v,rv_tendf,a_rv_tendf,mut,a_mut, &
config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,a_xkmhd,rdx, &
rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
CALL a_horizontal_diffusion('u',u,a_u,ru_tendf,a_ru_tendf,mut,a_mut, &
config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,a_xkmhd,rdx, &
rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tendf(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_horizontal_diffusion('u',u,a_u,ru_tendf,a_ru_tendf,mut,a_mut, &
! config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,a_xkmhd,rdx, &
! rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tendf(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_horizontal_diffusion('v',v,a_v,rv_tendf,a_rv_tendf,mut,a_mut, &
! config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,a_xkmhd,rdx, &
! rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tendf(IX1,IX2,IX3) =Tmpv402(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_horizontal_diffusion('w',w,a_w,rw_tendf,a_rw_tendf,mut,a_mut, &
! config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdif,xkmhd,a_xkmhd,rdx, &
! rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! a_khdq =0.0
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! t_tendf(IX1,IX2,IX3) =Tmpv403(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_horizontal_diffusion_3dmp('m',t,a_t,t_tendf,a_t_tendf,mut,a_mut, &
! config_flags,t_init,a_t_init,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdq, &
! a_khdq,xkhh,a_xkhh,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its, &
! ite,jts,jte,kts,kte)
! IF(config_flags%bl_pbl_physics .eq. 0) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tendf(IX1,IX2,IX3) =Tmpv404(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_vertical_diffusion_u(u,a_u,ru_tendf,a_ru_tendf,config_flags,u_base, &
! alt,a_alt,muu,a_muu,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
! kme,its,ite,jts,jte,kts,kte)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tendf(IX1,IX2,IX3) =Tmpv405(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_vertical_diffusion_v(v,a_v,rv_tendf,a_rv_tendf,config_flags,v_base, &
! alt,a_alt,muv,a_muv,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
! kme,its,ite,jts,jte,kts,kte)
! IF(non_hydrostatic) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tendf(IX1,IX2,IX3) =Tmpv406(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_vertical_diffusion('w',w,a_w,rw_tendf,a_rw_tendf,config_flags,alt, &
! a_alt,mut,a_mut,rdn,rdnw,kvdif,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
! its,ite,jts,jte,kts,kte)
! END IF
! a_kvdq =0.0
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! t_tendf(IX1,IX2,IX3) =Tmpv407(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL a_vertical_diffusion_3dmp(t,a_t,t_tendf,a_t_tendf,config_flags,t_init, &
! a_t_init,alt,a_alt,mut,a_mut,rdn,rdnw,kvdq,a_kvdq,ids,ide,jds,jde,kds,kde, &
! ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! ENDIF
END IF
END IF
!LPB[10]
!LPB[9]
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tend(IX1,IX2,IX3) =Keep_Lpb9_ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tend(IX1,IX2,IX3) =Keep_Lpb9_rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! IF(config_flags%ra_lw_physics == HELDSUAREZ) THEN
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv400(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv401(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL held_suarez_damp(ru_tend,rv_tend,ru,rv,p,pb,ids,ide,jds,jde,kds,kde,ims,ime, &
! jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! END IF
IF(config_flags%ra_lw_physics == HELDSUAREZ) THEN
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tend(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
! END DO
! END DO
! END DO
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Reamarked by Ning Pan, 2010-07-30 : JUST FOR DEBUGGING DYNAMICS OF WRF+ !!!
!!! REMARK SHOULD BE REMOVED WHEN CONSTRUCTING PHYSICS OF WRF+ !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! CALL a_held_suarez_damp(ru_tend,a_ru_tend,rv_tend,a_rv_tend,ru,a_ru,rv, &
! a_rv,p,a_p,pb,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
END IF
!LPB[8]
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tend(IX1,IX2,IX3) =Keep_Lpb8_ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tend(IX1,IX2,IX3) =Keep_Lpb8_rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tend(IX1,IX2,IX3) =Keep_Lpb8_rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv400(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv401(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv402(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL curvature(ru,rv,rw,u,v,w,ru_tend,rv_tend,rw_tend,config_flags,msfux,msfuy, &
! msfvx,msfvy,msftx,msfty,xlat,fnm,fnp,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
! kms,kme,its,ite,jts,jte,kts,kte)
! Remarked by Ning Pan, 2010-07-30
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tend(IX1,IX2,IX3) =Tmpv402(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru_tend(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
! END DO
! END DO
! END DO
CALL a_curvature(ru,a_ru,rv,a_rv,rw,a_rw,u,a_u,v,a_v,w,ru_tend, &
a_ru_tend,rv_tend,a_rv_tend,rw_tend,a_rw_tend,config_flags,msfux,msfuy,msfvx, &
! Revised by Ning Pan, 2010-07-30
! msfvy,msftx,msfty,xlat,a_xlat,fnm,fnp,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
msfvy,msftx,msfty,xlat,fnm,fnp,rdx,rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
jme,kms,kme,its,ite,jts,jte,kts,kte)
!LPB[7]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru_tend(IX1,IX2,IX3) =Keep_Lpb7_ru_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv_tend(IX1,IX2,IX3) =Keep_Lpb7_rv_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Keep_Lpb7_rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! IF(config_flags%pert_coriolis) THEN
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv401(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv402(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL perturbation_coriolis(ru,rv,rw,ru_tend,rv_tend,rw_tend,config_flags,u_base, &
!! v_base,z_base,muu,muv,phb,ph,msftx,msfty,msfux,msfuy,msfvx,msfvy,f,e,sina,cosa,fnm, &
!! fnp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!! ELSE
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv403(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv404(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv405(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL coriolis(ru,rv,rw,ru_tend,rv_tend,rw_tend,config_flags,msftx,msfty,msfux, &
!! msfuy,msfvx,msfvy,f,e,sina,cosa,fnm,fnp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
!! kme,its,ite,jts,jte,kts,kte)
!! END IF
IF(config_flags%pert_coriolis) THEN
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Tmpv402(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru_tend(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
CALL a_perturbation_coriolis(ru,a_ru,rv,a_rv,rw,a_rw,ru_tend,a_ru_tend, &
rv_tend,a_rv_tend,rw_tend,a_rw_tend,config_flags,u_base,v_base,z_base,muu, &
a_muu,muv,a_muv,phb,ph,a_ph,msftx,msfty,msfux,msfuy,msfvx,msfvy,f,e,sina,cosa, &
fnm,fnp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ELSE
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Tmpv405(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv_tend(IX1,IX2,IX3) =Tmpv404(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru_tend(IX1,IX2,IX3) =Tmpv403(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
CALL a_coriolis(ru,a_ru,rv,a_rv,rw,a_rw,ru_tend,a_ru_tend,rv_tend, &
a_rv_tend,rw_tend,a_rw_tend,config_flags,msftx,msfty,msfux,msfuy,msfvx,msfvy,f,e, &
sina,cosa,fnm,fnp,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
END IF
!LPB[6]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Keep_Lpb6_rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL w_damp(rw_tend,max_vert_cfl,max_horiz_cfl,u,v,ww,w,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)
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
! Revised by Ning Pan, 2010-07-30
! CALL a_w_damp(rw_tend,a_rw_tend,max_vert_cfl,a_max_vert_cfl,max_horiz_cfl, &
! a_max_horiz_cfl,u,a_u,v,a_v,ww,a_ww,w,a_w,mut,a_mut,rdnw,rdx,rdy,msfux, &
CALL a_w_damp(rw_tend,a_rw_tend,max_vert_cfl,max_horiz_cfl, &
u,a_u,v,a_v,ww,a_ww,w,a_w,mut,a_mut,rdnw,rdx,rdy,msfux, &
msfuy,msfvx,msfvy,dt,config_flags,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
its,ite,jts,jte,kts,kte)
!LPB[5]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Keep_Lpb5_rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! cqw(IX1,IX2,IX3) =Keep_Lpb5_cqw(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! IF(non_hydrostatic) THEN
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv401(IX1,IX2,IX3) =cqw(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL pg_buoy_w(rw_tend,p,cqw,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)
!! ENDIF
IF(non_hydrostatic) THEN
! Remarked by Ning Pan, 2010-07-30
! Const_A0=g
! Const_Diff_A0=0.0
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! cqw(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rw_tend(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
! END DO
! END DO
CALL a_pg_buoy_w(rw_tend,a_rw_tend,p,a_p,cqw,a_cqw,mu,a_mu,mub,rdnw,rdn, &
g,msftx,msfty,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! END DO ! Remarked by Ning Pan, 2010-07-30
ENDIF
!LPB[4]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ph_tend(IX1,IX2,IX3) =Keep_Lpb4_ph_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru_tend(IX1,IX2,IX3) =Keep_Lpb4_ru_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv_tend(IX1,IX2,IX3) =Keep_Lpb4_rv_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =ph_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL rhs_ph(ph_tend,u,v,ww,ph,ph,phb,w,mut,muu,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)
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv401(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv402(IX1,IX2,IX3) =rv_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL horizontal_pressure_gradient(ru_tend,rv_tend,ph,alt,p,pb,al,php,cqu,cqv,muu, &
!! muv,mu,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)
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv_tend(IX1,IX2,IX3) =Tmpv402(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
CALL a_horizontal_pressure_gradient(ru_tend,a_ru_tend,rv_tend,a_rv_tend,ph, &
a_ph,alt,a_alt,p,a_p,pb,al,a_al,php,a_php,cqu,a_cqu,cqv,a_cqv,muu, &
a_muu,muv,a_muv,mu,a_mu,fnm,fnp,rdnw,cf1,cf2,cf3,cfn,cfn1,rdx,rdy,msfux,msfuy,msfvx, &
! Revised by Ning Pan, 2010-07-30
! msfvy,msftx,msfty,config_flags,,,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its, &
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)
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ph_tend(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
CALL a_rhs_ph(ph_tend,a_ph_tend,u,a_u,v,a_v,ww,a_ww,ph,a_ph,ph,a_ph, &
phb,w,a_w,mut,a_mut,muu,a_muu,muv,a_muv,fnm,fnp,rdnw,cfn,cfn1,rdx,rdy,msfux, &
! Remarked by Ning Pan, 2010-07-30
! msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,,config_flags,ids,ide,jds,jde,kds,kde,ims, &
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)
!LPB[3]
!! IF( config_flags%cu_physics == GDSCHEME .OR. config_flags%cu_physics == G3SCHEME ) THEN
!! CALL set_tend(RTHFTEN,t_tend,msfty,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
!! kme,its,ite,jts,jte,kts,kte)
!! END IF
IF( config_flags%cu_physics == GDSCHEME .OR. &
config_flags%cu_physics == G3SCHEME .OR. &
config_flags%cu_physics == NTIEDTKESCHEME ) THEN
CALL a_set_tend(RTHFTEN,a_RTHFTEN,t_tend,a_t_tend,msfty,ids,ide,jds,jde,kds, &
kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
END IF
!LPB[2]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! t(IX1,IX2,IX3) =Keep_Lpb2_t(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! t_tend(IX1,IX2,IX3) =Keep_Lpb2_t_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru(IX1,IX2,IX3) =Keep_Lpb2_ru(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv(IX1,IX2,IX3) =Keep_Lpb2_rv(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =t(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv401(IX1,IX2,IX3) =t_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv402(IX1,IX2,IX3) =ru(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv403(IX1,IX2,IX3) =rv(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL advect_scalar(t,t,t_tend,ru,rv,ww,mut,time_step,config_flags,msfux,msfuy, &
!! msfvx,msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
!! kms,kme,its,ite,jts,jte,kts,kte)
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rv(IX1,IX2,IX3) =Tmpv403(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru(IX1,IX2,IX3) =Tmpv402(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! t_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! t(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!hcl 11/2016 ERM: Use WENO for theta flux on 3rd RK step if using WENO_SCALAR or WENOPD_SCALAR
! to be consistent with other scalar fluxes
IF( ( config_flags%scalar_adv_opt == WENO_SCALAR &
.or. config_flags%scalar_adv_opt == WENOPD_SCALAR &
.or. config_flags%moist_adv_opt == WENO_SCALAR &
.or. config_flags%moist_adv_opt == WENOPD_SCALAR &
) .and. (rk_step == 3) ) THEN
CALL a_advect_scalar_weno(t,a_t,t,a_t,t_tend,a_t_tend,ru,a_ru,rv,a_rv,ww, &
a_ww,mut,time_step,config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm, &
fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ELSE
CALL a_advect_scalar(t,a_t,t,a_t,t_tend,a_t_tend,ru,a_ru,rv,a_rv,ww, &
a_ww,mut,time_step,config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm, &
fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ENDIF
!LPB[1]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! w(IX1,IX2,IX3) =Keep_Lpb1_w(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Keep_Lpb1_rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! IF(non_hydrostatic) THEN
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =w(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv401(IX1,IX2,IX3) =rw_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL advect_w(w,w,rw_tend,ru,rv,ww,mut,time_step,config_flags,msfux,msfuy,msfvx, &
!! msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdn,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
!! kme,its,ite,jts,jte,kts,kte)
!! END IF
IF(non_hydrostatic) THEN
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! rw_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! w(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
IF( (rk_step == 3) .and. ( adv_opt == WENO_MOM ) ) THEN
CALL a_advect_weno_w ( w, a_w, w, a_w, rw_tend, a_rw_tend, &
ru, a_ru, rv, a_rv, ww, a_ww, &
mut, time_step, config_flags, &
msfux, msfuy, msfvx, msfvy, &
msftx, msfty, &
fnm, fnp, rdx, rdy, rdn, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ELSE
CALL a_advect_w(w,a_w,w,a_w,rw_tend,a_rw_tend,ru,a_ru,rv,a_rv,ww, &
a_ww,mut,time_step,config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm, &
fnp,rdx,rdy,rdn,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
END IF
END IF
!LPB[0]
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! u(IX1,IX2,IX3) =Keep_Lpb0_u(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! v(IX1,IX2,IX3) =Keep_Lpb0_v(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL zero_tend(ru_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
!! jts,jte,kts,kte)
!! CALL zero_tend(rv_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
!! jts,jte,kts,kte)
!! CALL zero_tend(rw_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
!! jts,jte,kts,kte)
!! CALL zero_tend(t_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
!! jte,kts,kte)
!! CALL zero_tend(ph_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
!! jts,jte,kts,kte)
!! CALL zero_tend(u_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
!! jte,kts,kte)
!! CALL zero_tend(v_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
!! jte,kts,kte)
!! CALL zero_tend(w_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
!! jte,kts,kte)
!! CALL zero_tend(ph_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite, &
!! jts,jte,kts,kte)
!! CALL zero_tend(t_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts, &
!! jte,kts,kte)
!! CALL zero_tend(mu_tend,ids,ide,jds,jde,1,1,ims,ime,jms,jme,1,1,its,ite,jts,jte,1,1)
!! CALL zero_tend(mu_save,ids,ide,jds,jde,1,1,ims,ime,jms,jme,1,1,its,ite,jts,jte,1,1)
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv400(IX1,IX2,IX3) =u(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv401(IX1,IX2,IX3) =ru_tend(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL advect_u(u,u,ru_tend,ru,rv,ww,mut,time_step,config_flags,msfux,msfuy,msfvx, &
!! msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
!! kme,its,ite,jts,jte,kts,kte)
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! Tmpv402(IX1,IX2,IX3) =v(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! CALL advect_v(v,v,rv_tend,ru,rv,ww,mut,time_step,config_flags,msfux,msfuy,msfvx, &
!! msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
!! kme,its,ite,jts,jte,kts,kte)
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! v(IX1,IX2,IX3) =Tmpv402(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
IF( (rk_step == 3) .and. ( adv_opt == WENO_MOM ) ) THEN
CALL a_advect_weno_v ( v, a_v, v, a_v, rv_tend, a_rv_tend, &
ru, a_ru, rv, a_rv, ww, a_ww, &
mut, a_mut, time_step, config_flags, &
msfux, msfuy, msfvx, msfvy, &
msftx, msfty, &
fnm, fnp, rdx, rdy, rdnw, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ELSE
CALL a_advect_v(v,a_v,v,a_v,rv_tend,a_rv_tend,ru,a_ru,rv,a_rv,ww, &
a_ww,mut,a_mut,time_step,config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm, &
fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ENDIF
!! Remarked by Ning Pan, 2010-07-30
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! ru_tend(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
!! u(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
IF( (rk_step == 3) .and. ( adv_opt == WENO_MOM ) ) THEN
CALL a_advect_weno_u ( u, a_u, u, a_u, ru_tend, a_ru_tend, &
ru, a_ru, rv, a_rv, ww, a_ww, &
mut, a_mut, time_step, config_flags, &
msfux, msfuy, msfvx, msfvy, &
msftx, msfty, &
fnm, fnp, rdx, rdy, rdnw, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ELSE
CALL a_advect_u(u,a_u,u,a_u,ru_tend,a_ru_tend,ru,a_ru,rv,a_rv,ww, &
a_ww,mut,a_mut,time_step,config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm, &
fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ENDIF
! Added by Ning Pan, 2010-07-30
CALL a_zero_tend2d(a_mu_save,ids,ide,jds,jde,1,1,ims,ime,jms,jme,1,1, &
its,ite,jts,jte,1,1)
CALL a_zero_tend2d(a_mu_tend,ids,ide,jds,jde,1,1,ims,ime,jms,jme,1,1, &
its,ite,jts,jte,1,1)
CALL a_zero_tend(a_t_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_ph_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_w_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_v_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_u_save,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_ph_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_t_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_rw_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_rv_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_ru_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
END SUBROUTINE a_rk_tendency
!-------------------------------------------------------------------------------
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of rk_addtend_dry in reverse (adjoint) mode:
! gradient of useful results: ph_tendf rw_tendf u_save ph_save
! w_save mu_tend rv_tendf ru_tend rw_tend h_diabatic
! ru_tendf t_tend mu_tendf t_save v_save rv_tend
! t_tendf mut ph_tend
! with respect to varying inputs: ph_tendf rw_tendf u_save ph_save
! w_save mu_tend rv_tendf ru_tend rw_tend h_diabatic
! ru_tendf t_tend mu_tendf t_save v_save rv_tend
! t_tendf mut ph_tend
! RW status of diff variables: ph_tendf:in-out rw_tendf:in-out
! u_save:incr ph_save:incr w_save:incr mu_tend:in-out
! rv_tendf:in-out ru_tend:in-out rw_tend:in-out
! h_diabatic:incr ru_tendf:in-out t_tend:in-out
! mu_tendf:incr t_save:incr v_save:incr rv_tend:in-out
! t_tendf:in-out mut:incr ph_tend:in-out
SUBROUTINE A_RK_ADDTEND_DRY(ru_tend, ru_tendb, rv_tend, rv_tendb, &
& rw_tend, rw_tendb, ph_tend, ph_tendb, t_tend, t_tendb, ru_tendf, &
& ru_tendfb, rv_tendf, rv_tendfb, rw_tendf, rw_tendfb, ph_tendf, &
& ph_tendfb, t_tendf, t_tendfb, u_save, u_saveb, v_save, v_saveb, w_save&
& , w_saveb, ph_save, ph_saveb, t_save, t_saveb, mu_tend, mu_tendb, &
& mu_tendf, mu_tendfb, rk_step, h_diabatic, h_diabaticb, mut, mutb, &
& msftx, msfty, msfux, msfuy, msfvx, msfvx_inv, msfvy, ids, ide, jds, &
& jde, kds, kde, ims, ime, jms, jme, kms, kme, ips, ipe, jps, jpe, kps, &
& kpe, 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, ips, ipe, jps, jpe, kps, kpe, its, ite, jts, jte, kts, &
& kte
INTEGER, INTENT(IN) :: rk_step
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: ru_tend, &
& rv_tend, rw_tend, ph_tend, t_tend, ru_tendf, rv_tendf, rw_tendf, &
& ph_tendf, t_tendf
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: ru_tendb, rv_tendb, &
& rw_tendb, ph_tendb, t_tendb, ru_tendfb, rv_tendfb, rw_tendfb, &
& ph_tendfb, t_tendfb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: mu_tend, mu_tendf
REAL, DIMENSION(ims:ime, jms:jme) :: mu_tendb, mu_tendfb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: u_save, &
& v_save, w_save, ph_save, t_save, h_diabatic
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: u_saveb, v_saveb, &
& w_saveb, ph_saveb, t_saveb, h_diabaticb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mut, msftx, msfty, &
& msfux, msfuy, msfvx, msfvx_inv, msfvy
REAL, DIMENSION(ims:ime, jms:jme) :: mutb
! Local
INTEGER :: i, j, k
INTEGER :: branch
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: min8
INTEGER :: min7
INTEGER :: min6
INTEGER :: min5
INTEGER :: min4
INTEGER :: min3
INTEGER :: min2
INTEGER :: min1
IF (jte .GT. jde - 1) THEN
min1 = jde - 1
ELSE
min1 = jte
END IF
!
!
! rk_addtend_dry constructs the full large-timestep tendency terms for
! momentum (u,v,w), theta and geopotential equations. This is accomplished
! by combining the physics tendencies (in *tendf; these are computed
! the first RK substep, held fixed thereafter) with the RK tendencies
! (in *tend, these include advection, pressure gradient, etc;
! these change each rk substep). Output is in *tend.
!
!
! Finally, add the forward-step tendency to the rk_tendency
! u/v/w/save contain bc tendency that needs to be multiplied by msf
! (u by msfuy, v by msfvx)
! before adding it to physics tendency (*tendf)
! For momentum we need the final tendency to include an inverse msf
! physics/bc tendency needs to be divided, advection tendency already has it
! For scalars we need the final tendency to include an inverse msf (msfty)
! advection tendency is OK, physics/bc tendency needs to be divided by msf
DO j=jts,min1
DO k=kts,kte-1
DO i=its,ite
! multiply by my to uncouple u
IF (rk_step .EQ. 1) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
END DO
END DO
END DO
DO j=jts,jte
DO k=kts,kte-1
IF (ite .GT. ide - 1) THEN
min2 = ide - 1
ELSE
min2 = ite
END IF
DO i=its,min2
! multiply by mx to uncouple v
IF (rk_step .EQ. 1) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
END DO
CALL PUSHINTEGER4(i - 1)
END DO
END DO
IF (jte .GT. jde - 1) THEN
min3 = jde - 1
ELSE
min3 = jte
END IF
DO j=jts,min3
DO k=kts,kte
IF (ite .GT. ide - 1) THEN
min4 = ide - 1
ELSE
min4 = ite
END IF
DO i=its,min4
! multiply by my to uncouple w
IF (rk_step .EQ. 1) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
! divide by my to couple w
IF (rk_step .EQ. 1) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
END DO
CALL PUSHINTEGER4(i - 1)
END DO
END DO
IF (jte .GT. jde - 1) THEN
min5 = jde - 1
ELSE
min5 = jte
END IF
DO j=jts,min5
DO k=kts,kte-1
IF (ite .GT. ide - 1) THEN
min6 = ide - 1
ELSE
min6 = ite
END IF
DO i=its,min6
IF (rk_step .EQ. 1) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
END DO
CALL PUSHINTEGER4(i - 1)
END DO
END DO
IF (jte .GT. jde - 1) THEN
min7 = jde - 1
ELSE
min7 = jte
END IF
! divide by my to couple heating
DO j=jts,min7
IF (ite .GT. ide - 1) THEN
min8 = ide - 1
ELSE
min8 = ite
END IF
i = min8 + 1
CALL PUSHINTEGER4(i - 1)
END DO
DO j=min7,jts,-1
CALL POPINTEGER4(ad_to2)
DO i=ad_to2,its,-1
mu_tendfb(i, j) = mu_tendfb(i, j) + mu_tendb(i, j)
END DO
END DO
DO j=min5,jts,-1
DO k=kte-1,kts,-1
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,its,-1
t_tendfb(i, k, j) = t_tendfb(i, k, j) + t_tendb(i, k, j)/msfty(i&
& , j)
h_diabaticb(i, k, j) = h_diabaticb(i, k, j) + mut(i, j)*t_tendb(&
& i, k, j)/msfty(i, j)
mutb(i, j) = mutb(i, j) + h_diabatic(i, k, j)*t_tendb(i, k, j)/&
& msfty(i, j)
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) t_saveb(i, k, j) = t_saveb(i, k, j) + &
& t_tendfb(i, k, j)
END DO
END DO
END DO
DO j=min3,jts,-1
DO k=kte,kts,-1
CALL POPINTEGER4(ad_to0)
DO i=ad_to0,its,-1
ph_tendfb(i, k, j) = ph_tendfb(i, k, j) + ph_tendb(i, k, j)/&
& msfty(i, j)
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) ph_saveb(i, k, j) = ph_saveb(i, k, j) + &
& ph_tendfb(i, k, j)
rw_tendfb(i, k, j) = rw_tendfb(i, k, j) + rw_tendb(i, k, j)/&
& msfty(i, j)
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) w_saveb(i, k, j) = w_saveb(i, k, j) + msfty(i&
& , j)*rw_tendfb(i, k, j)
END DO
END DO
END DO
DO j=jte,jts,-1
DO k=kte-1,kts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
rv_tendfb(i, k, j) = rv_tendfb(i, k, j) + msfvx_inv(i, j)*&
& rv_tendb(i, k, j)
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) v_saveb(i, k, j) = v_saveb(i, k, j) + msfvx(i&
& , j)*rv_tendfb(i, k, j)
END DO
END DO
END DO
DO j=min1,jts,-1
DO k=kte-1,kts,-1
DO i=ite,its,-1
ru_tendfb(i, k, j) = ru_tendfb(i, k, j) + ru_tendb(i, k, j)/&
& msfuy(i, j)
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) u_saveb(i, k, j) = u_saveb(i, k, j) + msfuy(i&
& , j)*ru_tendfb(i, k, j)
END DO
END DO
END DO
END SUBROUTINE A_RK_ADDTEND_DRY
!-------------------------------------------------------------------------------
! Revised by Ning Pan, 2010-08-02
! SUBROUTINE a_rk_scalar_tend(scs,sce,config_flags,rk_step,dt,a_dt,ru,a_ru,rv, &
SUBROUTINE a_rk_scalar_tend(scs,sce,config_flags,tenddec,rk_step,dt,ru,a_ru,rv, &
a_rv,ww,a_ww,mut,a_mut,mub,mu_old,a_mu_old,alt,a_alt,scalar_old, &
a_scalar_old,scalar,a_scalar,scalar_tends,a_scalar_tends,advect_tend, &
a_advect_tend,h_tendency,a_h_tendency,z_tendency,a_z_tendency, &
RQVFTEN,a_RQVFTEN,base,moist_step,fnm,fnp,msfux,msfuy,msfvx, &
msfvx_inv,msfvy,msftx,msfty,rdx,rdy,rdn,rdnw,khdif,kvdif,xkmhd,a_xkmhd, &
! Revised by Ning Pan, 2010-08-02
! diff_6th_opt,diff_6th_factor,a_diff_6th_factor,adv_opt,ids,ide,jds,jde,kds,kde,ims, &
diff_6th_opt,diff_6th_factor,adv_opt,ids,ide,jds,jde,kds,kde,ims, &
ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
LOGICAL :: tenddec
INTEGER :: rk_step,scs,sce
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
LOGICAL :: moist_step
REAL,DIMENSION(ims:ime,kms:kme,jms:jme,scs:sce) :: scalar,a_scalar,scalar_old, &
a_scalar_old
REAL,DIMENSION(ims:ime,kms:kme,jms:jme,scs:sce) :: scalar_tends,a_scalar_tends
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: advect_tend,a_advect_tend
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: h_tendency, z_tendency
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: a_h_tendency, a_z_tendency
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: RQVFTEN,a_RQVFTEN
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: ru,a_ru,rv,a_rv,ww,a_ww,xkmhd, &
a_xkmhd,alt,a_alt
REAL,DIMENSION(kms:kme) :: fnm,fnp,rdn,rdnw,base
REAL,DIMENSION(ims:ime,jms:jme) :: msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,mub, &
mut,a_mut,mu_old,a_mu_old
REAL :: rdx,rdy,khdif,kvdif
INTEGER :: diff_6th_opt
! Revised by Ning Pan, 2010-08-02
! REAL :: diff_6th_factor,a_diff_6th_factor
! REAL :: dt,a_dt
REAL :: diff_6th_factor
REAL :: dt
INTEGER :: adv_opt
INTEGER :: im,i,j,k
INTEGER :: time_step
REAL :: khdq,kvdq,tendency,a_tendency
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme,scs:sce,ims:ime,kms:kme,jms:jme,scs:sce) &
! :: Keep_Lpb1_scalar
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme,scs:sce,ims:ime,kms:kme,jms:jme,scs:sce) &
! :: Keep_Lpb1_scalar_old
! REAL,DIMENSION(scs:sce,ims:ime,kms:kme,jms:jme) :: Keep_Lpb1_ru
! REAL,DIMENSION(scs:sce,ims:ime,kms:kme,jms:jme) :: Keep_Lpb1_rv
! REAL,DIMENSION(ims:ime,kms:kme,jms:jme,scs:sce,ims:ime,kms:kme,jms:jme,scs:sce) &
! :: Keep_Lpb1_scalar_tends
INTEGER :: IX1,IX2,IX3,IX4
REAL :: Tmpv_1,Tmpv_2,Tmpv_3,Tmpv_4,Tmpv_5,Tmpv_6,Tmpv_7,Tmpv_8,Tmpv_9,Tmpv_10, &
Tmpv_11,Tmpv_12
REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv400
REAL,DIMENSION(jms:jme,kms:kme,ims:ime) :: Tmpv401
!This line is fail to be recognized
! CALL nl_get_time_step ( 1, time_step ) ! Remarked by Ning Pan, 2010-08-02
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
khdq = khdif/prandtl
kvdq = kvdif/prandtl
!!LPB[1]
! scalar_loop : DO im = scs, sce
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb1_ru(im,IX1,IX2,IX3) =ru(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb1_rv(im,IX1,IX2,IX3) =rv(IX1,IX2,IX3)
!! END DO
!! END DO
!! END DO
!! DO IX4=scs,sce
!! DO IX3=jms,jme
!! DO IX2=kms,kme
!! DO IX1=ims,ime
! ! Keep_Lpb1_scalar_tends(ims,kms,jms,im,IX1,IX2,IX3,IX4) =scalar_tends(ims,kms,jms,im)(IX1,IX2,IX3,IX4)
!! END DO
!! END DO
!! END DO
!! END DO
! CALL zero_tend ( advect_tend(ims,kms,jms), &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! IF( (rk_step == 3) .and. (adv_opt == POSITIVEDEF) ) THEN
! CALL advect_scalar_pd ( scalar(ims,kms,jms,im), &
! scalar_old(ims,kms,jms,im), &
! advect_tend(ims,kms,jms), &
! ru, rv, ww, mut, mub, mu_old, &
! time_step, config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, fnm, fnp, &
! rdx, rdy, rdnw,dt, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ELSE IF( (rk_step == 3) .and. (adv_opt == MONOTONIC) ) THEN
! CALL advect_scalar_mono ( scalar(ims,kms,jms,im), &
! scalar_old(ims,kms,jms,im), &
! advect_tend(ims,kms,jms), &
! ru, rv, ww, mut, mub, mu_old, &
! config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, fnm, fnp, &
! rdx, rdy, rdnw,dt, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ELSE
! CALL advect_scalar ( scalar(ims,kms,jms,im), &
! scalar(ims,kms,jms,im), &
! advect_tend(ims,kms,jms), &
! ru, rv, ww, mut, time_step, &
! config_flags, &
! msfux, msfuy, msfvx, msfvy, &
! msftx, msfty, fnm, fnp, &
! rdx, rdy, rdnw, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! END IF
! IF((config_flags%cu_physics == GDSCHEME .OR. config_flags%cu_physics == G3SCHEME &
!) .and. moist_step .and. ( im == P_QV) ) THEN
! CALL set_tend( RQVFTEN, advect_tend, msfty, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ENDIF
! rk_step_1: IF( rk_step == 1 ) THEN
! diff_opt1 : IF (config_flags%diff_opt .eq. 1) THEN
! CALL horizontal_diffusion ( 'm', scalar(ims,kms,jms,im), &
! scalar_tends(ims,kms,jms,im), mut, &
! config_flags, &
! msfux, msfuy, msfvx, msfvx_inv, &
! msfvy, msftx, msfty, &
! khdq , xkmhd, rdx, rdy, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! pbl_test : IF (config_flags%bl_pbl_physics .eq. 0) THEN
! IF( (moist_step) .and. ( im == P_QV)) THEN
! CALL vertical_diffusion_mp ( scalar(ims,kms,jms,im), &
! scalar_tends(ims,kms,jms,im), &
! config_flags, base, &
! alt, mut, rdn, rdnw, kvdq , &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ELSE
! CALL vertical_diffusion ( 'm', scalar(ims,kms,jms,im), &
! scalar_tends(ims,kms,jms,im), &
! config_flags, &
! alt, mut, rdn, rdnw, kvdq, &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! END IF
! ENDIF pbl_test
! ENDIF diff_opt1
! IF ( diff_6th_opt .NE. 0 ) &
! CALL sixth_order_diffusion( 'm', scalar(ims,kms,jms,im), &
! scalar_tends(ims,kms,jms,im), &
! mut, 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 )
! ENDIF rk_step_1
! END DO scalar_loop
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
! a_tendency =0.0 ! Remarked by Ning Pan, 2010-08-02
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[1]
DO im =sce, scs, -1
CALL nl_get_time_step ( 1, time_step ) ! Added by Ning Pan, 2010-08-02
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru(IX1,IX2,IX3) =Keep_Lpb1_ru(im,IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv(IX1,IX2,IX3) =Keep_Lpb1_rv(im,IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX4=scs,sce
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! scalar_tends(ims,kms,jms,im)(IX1,IX2,IX3,IX4) =Keep_Lpb1_scalar_tends(ims,kms,jms,im,IX1,IX2,IX3,IX4)
! END DO
! END DO
! END DO
! END DO
! Remarked by Ning Pan, 2010-08-02 : useless recomputation
! CALL zero_tend(advect_tend(ims,kms,jms),ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
! kms,kme,its,ite,jts,jte,kts,kte)
! IF( (rk_step == 3) .and. (adv_opt == POSITIVEDEF) ) THEN
! Tmpv_1 =scalar(ims,kms,jms,im)
! Tmpv_2 =scalar_old(ims,kms,jms,im)
! Tmpv_3 =advect_tend(ims,kms,jms)
! CALL advect_scalar_pd(scalar(ims,kms,jms,im),scalar_old(ims,kms,jms,im) &
! ,advect_tend(ims,kms,jms),ru,rv,ww,mut,mub,mu_old,time_step,config_flags,msfux,msfuy, &
! msfvx,msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,dt,ids,ide,jds,jde,kds,kde,ims,ime,jms, &
! jme,kms,kme,its,ite,jts,jte,kts,kte)
! ELSE IF( (rk_step == 3) .and. (adv_opt == MONOTONIC) ) THEN
! Tmpv_4 =scalar(ims,kms,jms,im)
! Tmpv_5 =scalar_old(ims,kms,jms,im)
! Tmpv_6 =advect_tend(ims,kms,jms)
! CALL advect_scalar_mono(scalar(ims,kms,jms,im),scalar_old(ims,kms,jms,im) &
! ,advect_tend(ims,kms,jms),ru,rv,ww,mut,mub,mu_old,config_flags,msfux,msfuy,msfvx, &
! msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,dt,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
! kms,kme,its,ite,jts,jte,kts,kte)
! ELSE
! Tmpv_7 =scalar(ims,kms,jms,im)
! Tmpv_8 =advect_tend(ims,kms,jms)
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv400(IX1,IX2,IX3) =ru(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! Tmpv401(IX1,IX2,IX3) =rv(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! CALL advect_scalar(scalar(ims,kms,jms,im),scalar(ims,kms,jms,im),advect_tend(ims, &
! kms,jms),ru,rv,ww,mut,time_step,config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm, &
! fnp,rdx,rdy,rdnw,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! END IF
! IF((config_flags%cu_physics == GDSCHEME .OR. config_flags%cu_physics == G3SCHEME) .and. moist_step .and. ( im == P_QV) ) THEN
! CALL set_tend(RQVFTEN,advect_tend,msfty,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
! kms,kme,its,ite,jts,jte,kts,kte)
! ENDIF
! IF( rk_step == 1 ) THEN
! IF(config_flags%diff_opt .eq. 1) THEN
! Tmpv_9 =scalar_tends(ims,kms,jms,im)
! CALL horizontal_diffusion('m',scalar(ims,kms,jms,im),scalar_tends(ims,kms,jms,im) &
! ,mut,config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdq,xkmhd,rdx,rdy, &
! ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
! IF(config_flags%bl_pbl_physics .eq. 0) THEN
! IF( (moist_step) .and. ( im == P_QV)) THEN
! Tmpv_10 =scalar_tends(ims,kms,jms,im)
! CALL vertical_diffusion_mp(scalar(ims,kms,jms,im),scalar_tends(ims,kms,jms,im) &
! ,config_flags,base,alt,mut,rdn,rdnw,kvdq,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms, &
! kme,its,ite,jts,jte,kts,kte)
! ELSE
! Tmpv_11 =scalar_tends(ims,kms,jms,im)
! CALL vertical_diffusion('m',scalar(ims,kms,jms,im),scalar_tends(ims,kms,jms,im) &
! ,config_flags,alt,mut,rdn,rdnw,kvdq,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
! its,ite,jts,jte,kts,kte)
! END IF
! ENDIF
! ENDIF
! IF( diff_6th_opt .NE. 0 ) THEN
! Tmpv_12 =scalar_tends(ims,kms,jms,im)
! CALL sixth_order_diffusion('m',scalar(ims,kms,jms,im),scalar_tends(ims,kms,jms,im) &
! ,mut,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)
! END IF
! ENDIF
IF( rk_step == 1 ) THEN
IF( diff_6th_opt .NE. 0 ) THEN
! scalar_tends(ims,kms,jms,im) =Tmpv_12 ! Remarked by Ning Pan, 2010-08-02
CALL a_sixth_order_diffusion('m',scalar(ims,kms,jms,im),a_scalar(ims,kms,jms, &
im),scalar_tends(ims,kms,jms,im),a_scalar_tends(ims,kms,jms,im),mut,a_mut,dt, &
! Revised by Ning Pan, 2010-08-02
! a_dt,config_flags,diff_6th_opt,diff_6th_factor,a_diff_6th_factor,ids,ide,jds,jde, &
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)
END IF
IF(config_flags%diff_opt .eq. 1) THEN
IF(config_flags%bl_pbl_physics .eq. 0) THEN
! Added by Ning Pan, 2010-08-02
IF( (moist_step) .and. ( im == P_QV)) THEN
CALL a_vertical_diffusion_mp(scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im) &
,scalar_tends(ims,kms,jms,im),a_scalar_tends(ims,kms,jms,im),config_flags,base,alt, &
a_alt,mut,a_mut,rdn,rdnw,kvdq,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
its,ite,jts,jte,kts,kte)
ELSE
! scalar_tends(ims,kms,jms,im) =Tmpv_11 ! Remarked by Ning Pan, 2010-08-02
CALL a_vertical_diffusion('m',scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im) &
,scalar_tends(ims,kms,jms,im),a_scalar_tends(ims,kms,jms,im),config_flags,alt, &
a_alt,mut,a_mut,rdn,rdnw,kvdq,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
its,ite,jts,jte,kts,kte)
! Remarked by Ning Pan, 2010-08-02
! IF( (moist_step) .and. ( im == P_QV)) THEN
! scalar_tends(ims,kms,jms,im) =Tmpv_10
! CALL a_vertical_diffusion_mp(scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im) &
! ,scalar_tends(ims,kms,jms,im),a_scalar_tends(ims,kms,jms,im),config_flags,base,alt, &
! a_alt,mut,a_mut,rdn,rdnw,kvdq,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme, &
! its,ite,jts,jte,kts,kte)
END IF
ENDIF
! scalar_tends(ims,kms,jms,im) =Tmpv_9 ! Remarked by Ning Pan, 2010-08-02
CALL a_horizontal_diffusion('m',scalar(ims,kms,jms,im),a_scalar(ims,kms,jms, &
im),scalar_tends(ims,kms,jms,im),a_scalar_tends(ims,kms,jms,im),mut,a_mut, &
config_flags,msfux,msfuy,msfvx,msfvx_inv,msfvy,msftx,msfty,khdq,xkmhd,a_xkmhd,rdx, &
rdy,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ENDIF
ENDIF
IF((config_flags%cu_physics == GDSCHEME .OR. config_flags%cu_physics == G3SCHEME .OR. &
config_flags%cu_physics == KFETASCHEME .OR. & ! new trigger in KF
config_flags%cu_physics == MSKFSCHEME .OR. &
config_flags%cu_physics == TIEDTKESCHEME .OR. & ! Tiedtke
config_flags%cu_physics == NTIEDTKESCHEME) & ! new Tiedtke
.and. moist_step .and. ( im == P_QV) ) THEN
CALL a_set_tend(RQVFTEN,a_RQVFTEN,advect_tend,a_advect_tend,msfty,ids,ide, &
jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ENDIF
IF( (rk_step == 3) .and. (adv_opt == POSITIVEDEF) ) THEN
! advect_tend(ims,kms,jms) =Tmpv_3 ! Remarked by Ning Pan, 2010-08-02
! scalar_old(ims,kms,jms,im) =Tmpv_2 ! Remarked by Ning Pan, 2010-08-02
! scalar(ims,kms,jms,im) =Tmpv_1 ! Remarked by Ning Pan, 2010-08-02
CALL a_advect_scalar_pd(scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im) &
,scalar_old(ims,kms,jms,im),a_scalar_old(ims,kms,jms,im),advect_tend(ims,kms,jms) &
,a_advect_tend(ims,kms,jms),h_tendency(ims,kms,jms),a_h_tendency(ims,kms,jms),z_tendency(ims,kms,jms),a_z_tendency(ims,kms,jms) &
,ru,a_ru,rv,a_rv,ww,a_ww,mut,a_mut,mub,mu_old, &
a_mu_old,time_step,config_flags,tenddec,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm,fnp,rdx, &
! Revised by Ning Pan, 2010-08-02
! rdy,rdnw,dt,a_dt,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
rdy,rdnw,dt,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
ELSE IF( (rk_step == 3) .and. (adv_opt == MONOTONIC) ) THEN
! advect_tend(ims,kms,jms) =Tmpv_6 ! Remarked by Ning Pan, 2010-08-02
! scalar_old(ims,kms,jms,im) =Tmpv_5 ! Remarked by Ning Pan, 2010-08-02
! scalar(ims,kms,jms,im) =Tmpv_4 ! Remarked by Ning Pan, 2010-08-02
CALL a_advect_scalar_mono(scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im) &
,scalar_old(ims,kms,jms,im),a_scalar_old(ims,kms,jms,im),advect_tend(ims,kms,jms) &
,a_advect_tend(ims,kms,jms),h_tendency(ims,kms,jms),a_h_tendency(ims,kms,jms),z_tendency(ims,kms,jms),a_z_tendency(ims,kms,jms) &
,ru,a_ru,rv,a_rv,ww,a_ww,mut,a_mut,mub,mu_old, &
a_mu_old,config_flags,tenddec,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,dt, &
! Revised by Ning Pan, 2010-08-02
! a_dt,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)
ELSE IF( (rk_step == 3) .and. (adv_opt == WENO_SCALAR) ) THEN
CALL a_advect_scalar_weno ( scalar(ims,kms,jms,im), &
a_scalar(ims,kms,jms,im), &
scalar(ims,kms,jms,im), &
a_scalar(ims,kms,jms,im), &
advect_tend(ims,kms,jms), &
a_advect_tend(ims,kms,jms), &
ru, a_ru, rv, a_rv, ww, a_ww, &
mut, time_step, &
config_flags, &
msfux, msfuy, msfvx, msfvy, &
msftx, msfty, fnm, fnp, &
rdx, rdy, rdnw, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ELSEIF( (rk_step == 3) .and. (adv_opt == WENOPD_SCALAR) ) THEN
CALL a_advect_scalar_wenopd ( scalar(ims,kms,jms,im), &
a_scalar(ims,kms,jms,im), &
scalar_old(ims,kms,jms,im), &
a_scalar_old(ims,kms,jms,im), &
advect_tend(ims,kms,jms), &
a_advect_tend(ims,kms,jms), &
ru, a_ru, rv, a_rv, ww, a_ww, &
mut, a_mut, mub, mu_old, a_mu_old, &
time_step, config_flags, &
msfux, msfuy, msfvx, msfvy, &
msftx, msfty, fnm, fnp, &
rdx, rdy, rdnw,dt, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ELSE
! Remarked by Ning Pan, 2010-08-02
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! rv(IX1,IX2,IX3) =Tmpv401(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! DO IX3=jms,jme
! DO IX2=kms,kme
! DO IX1=ims,ime
! ru(IX1,IX2,IX3) =Tmpv400(IX1,IX2,IX3)
! END DO
! END DO
! END DO
! advect_tend(ims,kms,jms) =Tmpv_8
! scalar(ims,kms,jms,im) =Tmpv_7
CALL a_advect_scalar(scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im) &
,scalar(ims,kms,jms,im),a_scalar(ims,kms,jms,im),advect_tend(ims,kms,jms) &
,a_advect_tend(ims,kms,jms),ru,a_ru,rv,a_rv,ww,a_ww,mut,time_step, &
config_flags,msfux,msfuy,msfvx,msfvy,msftx,msfty,fnm,fnp,rdx,rdy,rdnw,ids,ide,jds, &
jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
END IF
! Added by Ning Pan, 2010-08-02
CALL a_zero_tend(a_advect_tend,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_h_tendency,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
CALL a_zero_tend(a_z_tendency,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme, &
kms,kme,its,ite,jts,jte,kts,kte)
ENDDO
!LPB[0]
! khdq =khdif/prandtl
! kvdq =kvdif/prandtl
END SUBROUTINE a_rk_scalar_tend
!-------------------------------------------------------------------------------
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.10 (r5498) - 20 Jan 2015 09:48
!
! Differentiation of q_diabatic_add in reverse (adjoint) mode:
! gradient of useful results: qc_diabatic qv_diabatic scalar_tends
! mu
! with respect to varying inputs: qc_diabatic qv_diabatic scalar_tends
! mu
! RW status of diff variables: qc_diabatic:incr qv_diabatic:incr
! scalar_tends:in-out mu:incr
SUBROUTINE a_Q_DIABATIC_ADD(scs, sce, dt, mu, mub, qv_diabatic, &
& qv_diabaticb, qc_diabatic, qc_diabaticb, scalar_tends, scalar_tendsb, &
& 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) :: scs, sce
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
REAL, DIMENSION(ims:ime, jms:jme) :: mub
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: qv_diabatic&
& , qc_diabatic
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: qv_diabaticb, &
& qc_diabaticb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, scs:sce), INTENT(INOUT) :: &
& scalar_tends
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, scs:sce), INTENT(INOUT) :: &
& scalar_tendsb
REAL, INTENT(IN) :: dt
! Local data
INTEGER :: im, i, j, k
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: branch
INTEGER :: min4
INTEGER :: min3
INTEGER :: min2
INTEGER :: min1
scalar_loop:DO im=scs,sce
IF (im .EQ. p_qv) THEN
IF (jte .GT. jde - 1) THEN
min1 = jde - 1
ELSE
min1 = jte
END IF
DO j=jts,min1
DO k=kts,kte-1
IF (ite .GT. ide - 1) THEN
min2 = ide - 1
ELSE
min2 = ite
END IF
i = min2 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (im .EQ. p_qc) THEN
IF (jte .GT. jde - 1) THEN
min3 = jde - 1
ELSE
min3 = jte
END IF
DO j=jts,min3
DO k=kts,kte-1
IF (ite .GT. ide - 1) THEN
min4 = ide - 1
ELSE
min4 = ite
END IF
i = min4 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL1B(1)
ELSE
CALL PUSHCONTROL1B(0)
END IF
END DO scalar_loop
DO im=sce,scs,-1
CALL POPCONTROL1B(branch)
IF (branch .NE. 0) THEN
CALL POPINTEGER4(ad_to2)
DO j=ad_to2,jts,-1
DO k=kte-1,kts,-1
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,its,-1
qc_diabaticb(i,k,j) = qc_diabaticb(i,k,j) + &
mu(i,j)*scalar_tendsb(i,k,j,im)
mub(i,j) = mub(i,j) + &
qc_diabatic(i,k,j)*scalar_tendsb(i,k,j,im)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
CALL POPINTEGER4(ad_to0)
DO j=ad_to0,jts,-1
DO k=kte-1,kts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
qv_diabaticb(i,k,j) = qv_diabaticb(i,k,j) + &
mu(i,j)*scalar_tendsb(i,k,j,im)
mub(i,j) = mub(i,j) + &
qv_diabatic(i,k,j)*scalar_tendsb(i,k,j,im)
END DO
END DO
END DO
END IF
END DO
END SUBROUTINE a_Q_DIABATIC_ADD
!-------------------------------------------------------------------------------
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.10 (r5498) - 20 Jan 2015 09:48
!
! Differentiation of q_diabatic_subtr in reverse (adjoint) mode:
! gradient of useful results: qc_diabatic qv_diabatic scalar
! with respect to varying inputs: qc_diabatic qv_diabatic scalar
! RW status of diff variables: qc_diabatic:incr qv_diabatic:incr
! scalar:in-out
SUBROUTINE a_Q_DIABATIC_SUBTR(scs, sce, dt, qv_diabatic, qv_diabaticb, &
& qc_diabatic, qc_diabaticb, scalar, scalarb, 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) :: scs, sce
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) :: qv_diabatic&
& , qc_diabatic
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: qv_diabaticb, &
& qc_diabaticb
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, scs:sce), INTENT(INOUT) :: &
& scalar
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, scs:sce), INTENT(INOUT) :: &
& scalarb
REAL, INTENT(IN) :: dt
! Local data
INTEGER :: im, i, j, k
INTEGER :: ad_to
INTEGER :: ad_to0
INTEGER :: ad_to1
INTEGER :: ad_to2
INTEGER :: branch
INTEGER :: min4
INTEGER :: min3
INTEGER :: min2
INTEGER :: min1
scalar_loop:DO im=scs,sce
IF (im .EQ. p_qv) THEN
IF (jte .GT. jde - 1) THEN
min1 = jde - 1
ELSE
min1 = jte
END IF
DO j=jts,min1
DO k=kts,kte-1
IF (ite .GT. ide - 1) THEN
min2 = ide - 1
ELSE
min2 = ite
END IF
i = min2 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (im .EQ. p_qc) THEN
IF (jte .GT. jde - 1) THEN
min3 = jde - 1
ELSE
min3 = jte
END IF
DO j=jts,min3
DO k=kts,kte-1
IF (ite .GT. ide - 1) THEN
min4 = ide - 1
ELSE
min4 = ite
END IF
i = min4 + 1
CALL PUSHINTEGER4(i - 1)
END DO
END DO
CALL PUSHINTEGER4(j - 1)
CALL PUSHCONTROL1B(1)
ELSE
CALL PUSHCONTROL1B(0)
END IF
END DO scalar_loop
DO im=sce,scs,-1
CALL POPCONTROL1B(branch)
IF (branch .NE. 0) THEN
CALL POPINTEGER4(ad_to2)
DO j=ad_to2,jts,-1
DO k=kte-1,kts,-1
CALL POPINTEGER4(ad_to1)
DO i=ad_to1,its,-1
qc_diabaticb(i,k,j) = qc_diabaticb(i,k,j) - &
dt*scalarb(i,k,j,im)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
CALL POPINTEGER4(ad_to0)
DO j=ad_to0,jts,-1
DO k=kte-1,kts,-1
CALL POPINTEGER4(ad_to)
DO i=ad_to,its,-1
qv_diabaticb(i,k,j) = qv_diabaticb(i,k,j) - &
dt*scalarb(i,k,j,im)
END DO
END DO
END DO
END IF
END DO
END SUBROUTINE a_Q_DIABATIC_SUBTR
!-------------------------------------------------------------------------------
SUBROUTINE a_rk_update_scalar ( scs, sce, &
scalar_1, a_scalar_1, scalar_2, a_scalar_2, sc_tend, a_sc_tend, &
advh_t, a_advh_t, advz_t, a_advz_t, &
advect_tend, a_advect_tend, &
h_tendency, a_h_tendency, z_tendency, a_z_tendency, &
msftx, msfty, &
mu_old, a_mu_old, mu_new, a_mu_new, mu_base, &
rk_step, dt, spec_zone, &
config_flags, &
tenddec, &
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 :: tenddec
INTEGER, INTENT(IN) :: scs, sce, rk_step, spec_zone
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte
REAL, INTENT(IN) :: dt
REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
INTENT(INOUT) :: a_scalar_1, &
a_scalar_2
REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
INTENT(IN) :: scalar_1, &
scalar_2
REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
INTENT(INOUT) :: a_sc_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
INTENT(IN) :: sc_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT) :: a_advect_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), &
INTENT(IN) :: advect_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), OPTIONAL :: advh_t, advz_t ! accumulating for output
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), OPTIONAL :: a_advh_t, a_advz_t ! accumulating for output
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ) :: h_tendency, z_tendency ! from rk_scalar_tend
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ) :: a_h_tendency, a_z_tendency ! from rk_scalar_tend
REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: a_mu_old, &
a_mu_new
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN ) :: mu_old, &
mu_new, &
mu_base, &
msftx, &
msfty
INTEGER :: i,j,k,im
REAL :: sc_middle, msfsq
REAL, DIMENSION(its:ite) :: a_muold, a_r_munew
REAL, DIMENSION(its:ite) :: muold, r_munew
REAL, DIMENSION(its:ite, kts:kte, jts:jte ) :: a_tendency
REAL, DIMENSION(its:ite, kts:kte, jts:jte ) :: tendency
REAL, DIMENSION(ims:ime, kms:kme, jms:jme, scs:sce) :: scalar_old
INTEGER :: i_start,i_end,j_start,j_end,k_start,k_end
INTEGER :: i_start_spc,i_end_spc,j_start_spc,j_end_spc,k_start_spc,k_end_spc
! !
! Basic states: mu_old, mu_new, advect_tend, sc_tend, scalar_2(rk_step=1), scalar_1(rk_step/=1)
!
!
! Initilize local adjoint variables
a_muold = 0.0
a_r_munew = 0.0
a_tendency = 0.0
!
! set loop limits.
i_start = its
i_end = min(ite,ide-1)
j_start = jts
j_end = min(jte,jde-1)
k_start = kts
k_end = kte-1
i_start_spc = i_start
i_end_spc = i_end
j_start_spc = j_start
j_end_spc = j_end
k_start_spc = k_start
k_end_spc = k_end
IF( config_flags%nested .or. config_flags%specified ) THEN
IF( .NOT. config_flags%periodic_x)i_start = max( its,ids+spec_zone )
IF( .NOT. config_flags%periodic_x)i_end = min( ite,ide-spec_zone-1 )
j_start = max( jts,jds+spec_zone )
j_end = min( jte,jde-spec_zone-1 )
k_start = kts
k_end = min( kte, kde-1 )
ENDIF
IF ( rk_step == 1 ) THEN
DO im = sce,scs,-1
! Recalculate tendency
DO j = jts, min(jte,jde-1)
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
tendency(i,k,j) = 0.
ENDDO
ENDDO
ENDDO
DO j = j_start,j_end
DO k = k_start,k_end
DO i = i_start,i_end
! scalar was coupled with my
tendency(i,k,j) = advect_tend(i,k,j) * msfty(i,j)
ENDDO
ENDDO
ENDDO
DO j = j_start_spc,j_end_spc
DO k = k_start_spc,k_end_spc
DO i = i_start_spc,i_end_spc
tendency(i,k,j) = tendency(i,k,j) + sc_tend(i,k,j,im)
ENDDO
ENDDO
ENDDO
DO j = jts, min(jte,jde-1)
! Recalculate muold and r_munew
DO i = its, min(ite,ide-1)
muold(i) = mu_old(i,j) + mu_base(i,j)
r_munew(i) = 1./(mu_new(i,j) + mu_base(i,j))
ENDDO
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
! Recalculate scalar_1 (i.e. scalar_old)
scalar_old(i,k,j,im) = scalar_2(i,k,j,im)
a_scalar_1(i,k,j,im) = a_scalar_1(i,k,j,im) + muold(i)*r_munew(i) * a_scalar_2(i,k,j,im)
a_muold(i) = a_muold(i) + scalar_old(i,k,j,im)*r_munew(i) * a_scalar_2(i,k,j,im)
a_tendency(i,k,j) = a_tendency(i,k,j) + dt*r_munew(i) * a_scalar_2(i,k,j,im)
a_r_munew(i) = a_r_munew(i) + (muold(i)*scalar_old(i,k,j,im)+dt*tendency(i,k,j)) * a_scalar_2(i,k,j,im)
a_scalar_2(i,k,j,im) = 0.0
a_scalar_2(i,k,j,im) = a_scalar_2(i,k,j,im) + a_scalar_1(i,k,j,im)
a_scalar_1(i,k,j,im) = 0.0
ENDDO !i
ENDDO !k
DO i = its, min(ite,ide-1)
a_mu_new(i,j) = a_mu_new(i,j) - a_r_munew(i) / ((mu_new(i,j)+mu_base(i,j))*(mu_new(i,j)+mu_base(i,j)))
a_r_munew(i) = 0.0
a_mu_old(i,j) = a_mu_old(i,j) + a_muold(i)
a_muold(i) = 0.0
ENDDO
ENDDO !j
DO j = j_start_spc,j_end_spc
DO k = k_start_spc,k_end_spc
DO i = i_start_spc,i_end_spc
a_sc_tend(i,k,j,im) = a_sc_tend(i,k,j,im) + a_tendency(i,k,j)
ENDDO
ENDDO
ENDDO
DO j = j_start,j_end
DO k = k_start,k_end
DO i = i_start,i_end
! scalar was coupled with my
a_advect_tend(i,k,j) = a_advect_tend(i,k,j) + msfty(i,j) * a_tendency(i,k,j)
a_tendency(i,k,j) = 0.0
ENDDO
ENDDO
ENDDO
DO j = jts, min(jte,jde-1)
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
a_tendency(i,k,j) = 0.
ENDDO
ENDDO
ENDDO
ENDDO !im
ELSE
DO im = sce, scs, -1
! Recalculate tendency
DO j = jts, min(jte,jde-1)
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
tendency(i,k,j) = 0.
ENDDO
ENDDO
ENDDO
DO j = j_start,j_end
DO k = k_start,k_end
DO i = i_start,i_end
! scalar was coupled with my
tendency(i,k,j) = advect_tend(i,k,j) * msfty(i,j)
ENDDO
ENDDO
ENDDO
DO j = j_start_spc,j_end_spc
DO k = k_start_spc,k_end_spc
DO i = i_start_spc,i_end_spc
tendency(i,k,j) = tendency(i,k,j) + sc_tend(i,k,j,im)
ENDDO
ENDDO
ENDDO
DO j = jts, min(jte,jde-1)
! Recalculate muold and r_munew
DO i = its, min(ite,ide-1)
muold(i) = mu_old(i,j) + mu_base(i,j)
r_munew(i) = 1./(mu_new(i,j) + mu_base(i,j))
ENDDO
! This is separated from the k/i-loop above for better performance
IF ( PRESENT(advh_t) .AND. PRESENT(advz_t) .AND. PRESENT(a_advh_t) .AND. PRESENT(a_advz_t) ) THEN
IF (tenddec.and.rk_step.eq.config_flags%rk_ord) THEN
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
a_h_tendency(i,k,j) = a_h_tendency(i,k,j) + dt*msfty(i,j)*r_munew(i)*a_advh_t(i,k,j)
a_r_munew(i) = a_r_munew(i) + (dt*h_tendency(i,k,j)* msfty(i,j))*a_advh_t(i,k,j)
a_z_tendency(i,k,j) = a_z_tendency(i,k,j) + dt*msfty(i,j)*r_munew(i)*a_advz_t(i,k,j)
a_r_munew(i) = a_r_munew(i) + (dt*z_tendency(i,k,j)* msfty(i,j))*a_advz_t(i,k,j)
ENDDO
ENDDO
END IF
END IF
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
a_scalar_1(i,k,j,im) = a_scalar_1(i,k,j,im) + muold(i)*r_munew(i) * a_scalar_2(i,k,j,im)
a_muold(i) = a_muold(i) + scalar_1(i,k,j,im)*r_munew(i) * a_scalar_2(i,k,j,im)
a_tendency(i,k,j) = a_tendency(i,k,j) + dt*r_munew(i) * a_scalar_2(i,k,j,im)
a_r_munew(i) = a_r_munew(i) + (muold(i)*scalar_1(i,k,j,im)+dt*tendency(i,k,j)) * a_scalar_2(i,k,j,im)
a_scalar_2(i,k,j,im) = 0.0
ENDDO
ENDDO
DO i = its, min(ite,ide-1)
a_mu_new(i,j) = a_mu_new(i,j) - a_r_munew(i) / ((mu_new(i,j)+mu_base(i,j))*(mu_new(i,j)+mu_base(i,j)))
a_r_munew(i) = 0.0
a_mu_old(i,j) = a_mu_old(i,j) + a_muold(i)
a_muold(i) = 0.0
ENDDO
ENDDO !j
DO j = j_start_spc,j_end_spc
DO k = k_start_spc,k_end_spc
DO i = i_start_spc,i_end_spc
a_sc_tend(i,k,j,im) = a_sc_tend(i,k,j,im) + a_tendency(i,k,j)
ENDDO
ENDDO
ENDDO
DO j = j_start,j_end
DO k = k_start,k_end
DO i = i_start,i_end
! scalar was coupled with my
a_advect_tend(i,k,j) = a_advect_tend(i,k,j) + msfty(i,j) * a_tendency(i,k,j)
a_tendency(i,k,j) = 0.0
ENDDO
ENDDO
ENDDO
DO j = jts, min(jte,jde-1)
DO k = kts, min(kte,kde-1)
DO i = its, min(ite,ide-1)
a_tendency(i,k,j) = 0.
ENDDO
ENDDO
ENDDO
ENDDO !im
END IF
END SUBROUTINE a_rk_update_scalar
!-------------------------------------------------------------------------------
SUBROUTINE a_rk_update_scalar_pd(scs,sce,scalar,a_scalar,sc_tend,a_sc_tend, &
mu_old,a_mu_old,mu_new,a_mu_new,mu_base,rk_step,dt,spec_zone, &
config_flags,ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
TYPE(grid_config_rec_type) :: config_flags
INTEGER :: scs,sce,rk_step,spec_zone
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL :: dt
REAL,DIMENSION(ims:ime,kms:kme,jms:jme,scs:sce) :: scalar,a_scalar,sc_tend,a_sc_tend
REAL,DIMENSION(ims:ime,jms:jme) :: mu_old,a_mu_old,mu_new,a_mu_new,mu_base
INTEGER :: i,j,k,im
REAL :: sc_middle,sfsq
REAL,DIMENSION(its:ite) :: muold,a_muold,r_munew,a_r_munew
REAL,DIMENSION(its:ite,kts:kte,jts:jte) :: tendency,a_tendency
INTEGER :: i_start,i_end,j_start,j_end,k_start,k_end
INTEGER :: i_start_spc,i_end_spc,j_start_spc,j_end_spc,k_start_spc,k_end_spc
REAL :: a_Tmpv1,Tmpv001,a_Tmpv2,Tmpv002,a_Tmpv3
REAL,ALLOCATABLE,DIMENSION(:,:) :: Tmpv300
REAL,DIMENSION(its:min(ite, ide-1),jts:min(jte, jde-1)) :: Tmpv301
REAL,DIMENSION(its:min(ite, ide-1),kts:min(kte, kde-1),jts:min(jte, jde-1)) :: Tmpv400
!PART II: CALCULATIONS OF B. S. TRAJECTORY
!LPB[0]
i_start = its
i_end = min(ite,ide-1)
j_start = jts
j_end = min(jte,jde-1)
k_start = kts
k_end = kte-1
i_start_spc = i_start
i_end_spc = i_end
j_start_spc = j_start
j_end_spc = j_end
k_start_spc = k_start
k_end_spc = k_end
!LPB[1]
IF( config_flags%nested .or. config_flags%specified ) THEN
IF( .NOT. config_flags%periodic_x)i_start = max( its,ids+spec_zone )
IF( .NOT. config_flags%periodic_x)i_end = min( ite,ide-spec_zone-1 )
j_start = max( jts,jds+spec_zone )
j_end = min( jte,jde-spec_zone-1 )
k_start = kts
k_end = min( kte, kde-1 )
ENDIF
!PART III: INITIALIZATION OF LOCAL ADJOINT PERTURBATIONS
a_muold =0.
a_r_munew =0.
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[2]
DO im =sce, scs, -1
tendency(its:min(ite,ide-1),kts:min(kte,kde-1),jts:min(jte,jde-1)) =0.
tendency(i_start_spc:i_end_spc,k_start_spc:k_end_spc,j_start_spc:j_end_spc) =tendency&
(i_start_spc:i_end_spc,k_start_spc:k_end_spc,j_start_spc:j_end_spc) +sc_tend&
(i_start_spc:i_end_spc,k_start_spc:k_end_spc,j_start_spc:j_end_spc,im)
sc_tend(i_start_spc:i_end_spc,k_start_spc:k_end_spc,j_start_spc:j_end_spc,im) =0.
ALLOCATE (Tmpv300(its:min(ite, ide-1),jts:min(jte, jde-1)))
DO j =jts, min(jte, jde-1)
DO i =its, min(ite, ide-1)
Tmpv300(i,j) =mu_old(i,j) +mu_base(i,j)
ENDDO
DO k =kts, min(kte, kde-1)
DO i =its, min(ite, ide-1)
Tmpv400(i,k,j) =Tmpv300(i,j)*scalar(i,k,j,im)+dt*tendency(i,k,j)
ENDDO
ENDDO
ENDDO
DO j =min(jte, jde-1), jts, -1
DO k =kts, min(kte, kde-1)
DO i =its, min(ite, ide-1)
a_r_munew(i) =a_r_munew(i) +Tmpv400(i,k,j)*a_scalar(i,k,j,im)
a_Tmpv1 = a_scalar(i,k,j,im)/(mu_new(i,j)+mu_base(i,j))
a_tendency(i,k,j) =dt*a_Tmpv1
a_muold(i) =a_muold(i) +scalar(i,k,j,im)*a_Tmpv1
a_scalar(i,k,j,im) =Tmpv300(i,j)*a_Tmpv1
ENDDO
ENDDO
DO i =its, min(ite, ide-1)
a_mu_new(i,j) =a_mu_new(i,j)-a_r_munew(i)/(mu_new(i,j)+mu_base(i,j))/(mu_new(i,j)+mu_base(i,j))
ENDDO
a_r_munew(its:min(ite,ide-1)) =0.0
a_mu_old(its:min(ite,ide-1),j) =a_mu_old(its:min(ite,ide-1),j) +a_muold(its:min(ite,ide-1))
a_muold(its:min(ite,ide-1)) =0.0
ENDDO
a_sc_tend(i_start_spc:i_end_spc,k_start_spc:k_end_spc,j_start_spc:j_end_spc,im) =a_tendency(&
i_start_spc:i_end_spc,k_start_spc:k_end_spc,j_start_spc:j_end_spc)
ENDDO
DEALLOCATE (Tmpv300)
END SUBROUTINE a_rk_update_scalar_pd
!------------------------------------------------------------
! Generated by TAPENADE (INRIA, Tropics team)
! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
!
! Differentiation of calculate_phy_tend in reverse (adjoint) mode:
! gradient of useful results: rthndgdten rublten rqvndgdten
! rthraten rqccuten rthcuten rqicuten rvndgdten
! rqscuten rqrshten rqvshten rucuten rvshten rqvblten
! rvblten rqcshten rthshten rqgshten rqishten rqcblten
! rthblten rqrcuten rqiblten rqsshten rqvcuten rvcuten
! rushten muu muv rundgdten mu
! with respect to varying inputs: rthndgdten rublten rqvndgdten
! rthraten rqccuten rthcuten rqicuten rvndgdten
! rqscuten rqrshten rqvshten rucuten rvshten rqvblten
! rvblten rqcshten rthshten rqgshten rqishten rqcblten
! rthblten rqrcuten rqiblten rqsshten rqvcuten rvcuten
! rushten muu muv rundgdten mu
! RW status of diff variables: rthndgdten:in-out rublten:in-out
! rqvndgdten:in-out rthraten:in-out rqccuten:in-out
! rthcuten:in-out rqicuten:in-out rvndgdten:in-out
! rqscuten:in-out rqrshten:in-out rqvshten:in-out
! rucuten:in-out rvshten:in-out rqvblten:in-out
! rvblten:in-out rqcshten:in-out rthshten:in-out
! rqgshten:in-out rqishten:in-out rqcblten:in-out
! rthblten:in-out rqrcuten:in-out rqiblten:in-out
! rqsshten:in-out rqvcuten:in-out rvcuten:in-out
! rushten:in-out muu:incr muv:incr rundgdten:in-out
! mu:incr
SUBROUTINE A_CALCULATE_PHY_TEND(config_flags, mu, mub, muu, muub, muv, &
& muvb, pi3d, rthraten, rthratenb, rublten, rubltenb, rvblten, rvbltenb&
& , rthblten, rthbltenb, rqvblten, rqvbltenb, rqcblten, rqcbltenb, &
& rqiblten, rqibltenb, rucuten, rucutenb, rvcuten, rvcutenb, rthcuten, &
& rthcutenb, rqvcuten, rqvcutenb, rqccuten, rqccutenb, rqrcuten, &
& rqrcutenb, rqicuten, rqicutenb, rqscuten, rqscutenb, rushten, rushtenb&
& , rvshten, rvshtenb, rthshten, rthshtenb, rqvshten, rqvshtenb, &
& rqcshten, rqcshtenb, rqrshten, rqrshtenb, rqishten, rqishtenb, &
& rqsshten, rqsshtenb, rqgshten, rqgshtenb, rundgdten, rundgdtenb, &
& rvndgdten, rvndgdtenb, rthndgdten, rthndgdtenb, rqvndgdten, &
& rqvndgdtenb, rmundgdten, ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte)
IMPLICIT NONE
TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
& jme, kms, kme, its, ite, jts, jte, kts, kte
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: pi3d
REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: mu, muu, muv
REAL, DIMENSION(ims:ime, jms:jme) :: mub, muub, muvb
! radiation
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthraten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rthratenb
! cumulus
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rucuten, &
& rvcuten, rthcuten, rqvcuten, rqccuten, rqrcuten, rqicuten, rqscuten, &
& rushten, rvshten, rthshten, rqvshten, rqcshten, rqrshten, rqishten, &
& rqsshten, rqgshten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rucutenb, rvcutenb, &
& rthcutenb, rqvcutenb, rqccutenb, rqrcutenb, rqicutenb, rqscutenb, &
& rushtenb, rvshtenb, rthshtenb, rqvshtenb, rqcshtenb, rqrshtenb, &
& rqishtenb, rqsshtenb, rqgshtenb
! pbl
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rublten, &
& rvblten, rthblten, rqvblten, rqcblten, rqiblten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rubltenb, rvbltenb, &
& rthbltenb, rqvbltenb, rqcbltenb, rqibltenb
! fdda
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rundgdten&
& , rvndgdten, rthndgdten, rqvndgdten
REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rundgdtenb, rvndgdtenb, &
& rthndgdtenb, rqvndgdtenb
REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: rmundgdten
INTEGER :: i, k, j
INTEGER :: itf, ktf, jtf, itsu, jtsv
INTEGER :: branch
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
IF (its .LT. ids + 1) THEN
itsu = ids + 1
ELSE
itsu = its
END IF
IF (jts .LT. jds + 1) THEN
jtsv = jds + 1
ELSE
jtsv = jts
END IF
! radiation
IF (config_flags%ra_lw_physics .GT. 0 .OR. config_flags%ra_sw_physics &
& .GT. 0) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
! cumulus
IF (config_flags%cu_physics .GT. 0) THEN
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qr .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qi .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qs .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
! shallow cumulus
IF (config_flags%shcu_physics .GT. 0) THEN
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qr .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qi .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qs .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qg .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
! pbl
IF (config_flags%bl_pbl_physics .GT. 0) THEN
IF (p_qv .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qc .GE. param_first_scalar) THEN
CALL PUSHCONTROL1B(0)
ELSE
CALL PUSHCONTROL1B(1)
END IF
IF (p_qi .GE. param_first_scalar) THEN
CALL PUSHCONTROL2B(0)
ELSE
CALL PUSHCONTROL2B(1)
END IF
ELSE
CALL PUSHCONTROL2B(2)
END IF
! fdda
! note fdda u and v tendencies are staggered, also only interior points have muu/muv,
! so only couple those
IF (config_flags%grid_fdda .GT. 0) THEN
! RMUNDGDTEN(I,J) - no coupling
! if( i == itf/2 .AND. j == jtf/2 .AND. k == ktf/2 ) &
! write(*,'(a,3i6,e15.5)') 'th after=',i,k,j, RTHNDGDTEN(I,K,J)
IF (p_qv .GE. param_first_scalar) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rqvndgdten(i, k, j)*rqvndgdtenb(i, k&
& , j)
rqvndgdtenb(i, k, j) = mu(i, j)*rqvndgdtenb(i, k, j)
END DO
END DO
END DO
END IF
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rthndgdten(i, k, j)*rthndgdtenb(i, k, &
& j)
rthndgdtenb(i, k, j) = mu(i, j)*rthndgdtenb(i, k, j)
END DO
END DO
END DO
DO j=jtf,jtsv,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
muvb(i, j) = muvb(i, j) + rvndgdten(i, k, j)*rvndgdtenb(i, k, &
& j)
rvndgdtenb(i, k, j) = muv(i, j)*rvndgdtenb(i, k, j)
END DO
END DO
END DO
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,itsu,-1
muub(i, j) = muub(i, j) + rundgdten(i, k, j)*rundgdtenb(i, k, &
& j)
rundgdtenb(i, k, j) = muu(i, j)*rundgdtenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rqiblten(i, k, j)*rqibltenb(i, k, j)
rqibltenb(i, k, j) = mu(i, j)*rqibltenb(i, k, j)
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 100
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rqcblten(i, k, j)*rqcbltenb(i, k, j)
rqcbltenb(i, k, j) = mu(i, j)*rqcbltenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rqvblten(i, k, j)*rqvbltenb(i, k, j)
rqvbltenb(i, k, j) = mu(i, j)*rqvbltenb(i, k, j)
END DO
END DO
END DO
END IF
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rvblten(i, k, j)*rvbltenb(i, k, j) + &
& rublten(i, k, j)*rubltenb(i, k, j) + rthblten(i, k, j)*&
& rthbltenb(i, k, j)
rthbltenb(i, k, j) = mu(i, j)*rthbltenb(i, k, j)
rvbltenb(i, k, j) = mu(i, j)*rvbltenb(i, k, j)
rubltenb(i, k, j) = mu(i, j)*rubltenb(i, k, j)
END DO
END DO
END DO
100 CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqgshten(i, k, j)*rqgshtenb(i, k, j)
rqgshtenb(i, k, j) = mu(i, j)*rqgshtenb(i, k, j)
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 110
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqsshten(i, k, j)*rqsshtenb(i, k, j)
rqsshtenb(i, k, j) = mu(i, j)*rqsshtenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqishten(i, k, j)*rqishtenb(i, k, j)
rqishtenb(i, k, j) = mu(i, j)*rqishtenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqrshten(i, k, j)*rqrshtenb(i, k, j)
rqrshtenb(i, k, j) = mu(i, j)*rqrshtenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqcshten(i, k, j)*rqcshtenb(i, k, j)
rqcshtenb(i, k, j) = mu(i, j)*rqcshtenb(i, k, j)
END DO
END DO
END DO
END IF
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rthshten(i, k, j)*rthshtenb(i, k, j) + &
& rushten(i, k, j)*rushtenb(i, k, j) + rvshten(i, k, j)*rvshtenb&
& (i, k, j) + rqvshten(i, k, j)*rqvshtenb(i, k, j)
rqvshtenb(i, k, j) = mu(i, j)*rqvshtenb(i, k, j)
rthshtenb(i, k, j) = mu(i, j)*rthshtenb(i, k, j)
rvshtenb(i, k, j) = mu(i, j)*rvshtenb(i, k, j)
rushtenb(i, k, j) = mu(i, j)*rushtenb(i, k, j)
END DO
END DO
END DO
110 CALL POPCONTROL2B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqscuten(i, k, j)*rqscutenb(i, k, j)
rqscutenb(i, k, j) = mu(i, j)*rqscutenb(i, k, j)
END DO
END DO
END DO
ELSE IF (branch .NE. 1) THEN
GOTO 120
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqicuten(i, k, j)*rqicutenb(i, k, j)
rqicutenb(i, k, j) = mu(i, j)*rqicutenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqrcuten(i, k, j)*rqrcutenb(i, k, j)
rqrcutenb(i, k, j) = mu(i, j)*rqrcutenb(i, k, j)
END DO
END DO
END DO
END IF
CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rqccuten(i, k, j)*rqccutenb(i, k, j)
rqccutenb(i, k, j) = mu(i, j)*rqccutenb(i, k, j)
END DO
END DO
END DO
END IF
DO j=jtf,jts,-1
DO i=itf,its,-1
DO k=ktf,kts,-1
mub(i, j) = mub(i, j) + rthcuten(i, k, j)*rthcutenb(i, k, j) + &
& rucuten(i, k, j)*rucutenb(i, k, j) + rvcuten(i, k, j)*rvcutenb&
& (i, k, j) + rqvcuten(i, k, j)*rqvcutenb(i, k, j)
rqvcutenb(i, k, j) = mu(i, j)*rqvcutenb(i, k, j)
rthcutenb(i, k, j) = mu(i, j)*rthcutenb(i, k, j)
rvcutenb(i, k, j) = mu(i, j)*rvcutenb(i, k, j)
rucutenb(i, k, j) = mu(i, j)*rucutenb(i, k, j)
END DO
END DO
END DO
120 CALL POPCONTROL1B(branch)
IF (branch .EQ. 0) THEN
DO j=jtf,jts,-1
DO k=ktf,kts,-1
DO i=itf,its,-1
mub(i, j) = mub(i, j) + rthraten(i, k, j)*rthratenb(i, k, j)
rthratenb(i, k, j) = mu(i, j)*rthratenb(i, k, j)
END DO
END DO
END DO
END IF
END SUBROUTINE A_CALCULATE_PHY_TEND
!-----------------------------------------------------------
SUBROUTINE a_init_zero_tendency(a_ru_tendf, &
a_rv_tendf, &
a_rw_tendf, &
a_ph_tendf, &
a_t_tendf, &
a_tke_tendf, &
a_mu_tendf, &
a_moist_tendf, &
! NPan - 05/26/10 {
! Uncomment the corresponding args when chem or tracer is needed.
! a_chem_tendf, &
a_scalar_tendf, &
a_tracer_tendf, &
! NPan }
n_tracer, &
n_moist,n_chem,n_scalar,rk_step, &
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
INTEGER , INTENT(IN ) :: n_moist,n_chem,n_scalar,n_tracer,rk_step
REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(INOUT) :: &
a_ru_tendf, &
a_rv_tendf, &
a_rw_tendf, &
a_ph_tendf, &
a_t_tendf, &
a_tke_tendf
REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(INOUT) :: a_mu_tendf
REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist),INTENT(INOUT)::&
a_moist_tendf
! NPan - 05/26/10 {
! Uncomment the corresponding definations when chem is needed.
! REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_chem ),INTENT(INOUT)::&
! a_chem_tendf
REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_tracer ),INTENT(INOUT)::&
a_tracer_tendf
REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar ),INTENT(INOUT)::&
a_scalar_tendf
! NPan }
! LOCAL VARS
INTEGER :: im, ic, is
!
!
! init_zero_tendency
! sets tendency arrays to zero for all prognostic variables.
!
!
CALL a_zero_tend ( a_ru_tendf, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
CALL a_zero_tend ( a_rv_tendf, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
CALL a_zero_tend ( a_rw_tendf, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
CALL a_zero_tend ( a_ph_tendf, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
CALL a_zero_tend ( a_t_tendf, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
CALL a_zero_tend ( a_tke_tendf, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
CALL a_zero_tend2d ( a_mu_tendf, &
ids, ide, jds, jde, kds, kds, &
ims, ime, jms, jme, kms, kms, &
its, ite, jts, jte, kts, kts )
! DO im=PARAM_FIRST_SCALAR,n_moist
DO im=1,n_moist ! make sure first one is zero too
CALL a_zero_tend ( a_moist_tendf(ims,kms,jms,im), &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ENDDO
! NPan - 05/26/10 {
! Uncomment the corresponding statements when chem is needed.
!! DO ic=PARAM_FIRST_SCALAR,n_chem
! DO ic=1,n_chem !! make sure first one is zero too
! CALL a_zero_tend ( a_chem_tendf(ims,kms,jms,ic), &
! ids, ide, jds, jde, kds, kde, &
! ims, ime, jms, jme, kms, kme, &
! its, ite, jts, jte, kts, kte )
! ENDDO
! DO ic=PARAM_FIRST_SCALAR,n_tracer
DO ic=1,n_tracer !! make sure first one is zero too
CALL a_zero_tend ( a_tracer_tendf(ims,kms,jms,ic), &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ENDDO
! DO ic=PARAM_FIRST_SCALAR,n_scalar
DO ic=1,n_scalar ! make sure first one is zero too
CALL a_zero_tend ( a_scalar_tendf(ims,kms,jms,ic), &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
ENDDO
! NPan }
END SUBROUTINE a_init_zero_tendency
!-----------------------------------------------------------------------
! Revised by Ning Pan, 2010-08-03
! SUBROUTINE a_bound_tke(tke,a_tke,tke_upper_bound,a_tke_upper_bound,ids,ide,jds, &
SUBROUTINE a_bound_tke(tke,a_tke,tke_upper_bound,ids,ide,jds, &
jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte)
!PART I: DECLARATION OF VARIABLES
IMPLICIT NONE
INTEGER :: K0_ADJ,K1_ADJ,K2_ADJ,K3_ADJ
INTEGER :: ids,ide,jds,jde,kds,kde,ims,ime,jms,jme,kms,kme,its,ite,jts,jte,kts,kte
REAL,DIMENSION(ims:ime,kms:kme,jms:jme) :: tke,a_tke
! Revised by Ning Pan, 2010-08-03
! REAL :: tke_upper_bound,a_tke_upper_bound
REAL :: tke_upper_bound
INTEGER :: i,k,j
REAL :: a_Tmpv1,Tmpv001
!PART IV: REVERSE/BACKWARD ACCUMULATIONS
!LPB[0]
DO j =min(jte, jde-1), jts, -1
! DO k =kts, kte-1
! DO i =its, min(ite, ide-1)
! Tmpv001 =min(tke_upper_bound, max(tke(i,k,j), 0.))
! tke(i,k,j) =Tmpv001
! ENDDO
! ENDDO
DO k =kte-1, kts, -1
DO i =min(ite, ide-1), its, -1
a_Tmpv1 =a_tke(i,k,j)
a_tke(i,k,j) =0.0
! Remarked by Ning Pan, 2010-08-03
! a_tke_upper_bound =a_tke_upper_bound +(1.0 -sign(1.0, tke_upper_bound -max( &
! tke(i,k,j), 0.)))*0.5*1.0*a_Tmpv1
a_tke(i,k,j) =a_tke(i,k,j) +(1.0 +sign(1.0, tke_upper_bound -max(tke(i,k,j) &
, 0.)))*0.5*(1.0 +(1.0)*sign(1.0, tke(i,k,j) -0.))*0.5*a_Tmpv1
ENDDO
ENDDO
ENDDO
END SUBROUTINE a_bound_tke
END MODULE a_module_em