!WRF:MEDIATION_LAYER:SOLVER
#define BENCH_START(A)
#define BENCH_END(A)
MODULE module_first_rk_step_part2 1
CONTAINS
SUBROUTINE first_rk_step_part2 ( grid , config_flags & 1,41
, moist , moist_tend &
, chem , chem_tend &
, tracer, tracer_tend &
, scalar , scalar_tend &
, fdda3d, fdda2d &
, ru_tendf, rv_tendf &
, rw_tendf, t_tendf &
, ph_tendf, mu_tendf &
, tke_tend &
, adapt_step_flag , curr_secs &
, psim , psih , wspd , gz1oz0 , br , chklowq &
, cu_act_flag , hol , th_phy &
, pi_phy , p_phy , t_phy , u_phy , v_phy &
, dz8w , p8w , t8w , rho_phy , rho &
, nba_mij, n_nba_mij & !JDM
, nba_rij, n_nba_rij & !JDM
, ids, ide, jds, jde, kds, kde &
, ims, ime, jms, jme, kms, kme &
, ips, ipe, jps, jpe, kps, kpe &
, imsx,imex,jmsx,jmex,kmsx,kmex &
, ipsx,ipex,jpsx,jpex,kpsx,kpex &
, imsy,imey,jmsy,jmey,kmsy,kmey &
, ipsy,ipey,jpsy,jpey,kpsy,kpey &
, k_start , k_end &
)
USE module_state_description
USE module_model_constants
USE module_domain
, ONLY : domain
USE module_configure
, ONLY : grid_config_rec_type, model_config_rec
#ifdef DM_PARALLEL
USE module_dm
, ONLY : local_communicator, mytask, ntasks, ntasks_x, ntasks_y, local_communicator_periodic, &
wrf_dm_maxval, wrf_err_message, local_communicator_x, local_communicator_y
USE module_comm_dm
, ONLY : halo_em_tke_c_sub,halo_em_tke_d_sub,halo_em_tke_e_sub &
,halo_em_phys_pbl_sub,halo_em_phys_shcu_sub &
,halo_em_fdda_sub,halo_em_phys_diffusion_sub,halo_em_tke_3_sub &
,halo_em_tke_5_sub,halo_obs_nudge_sub,period_bdy_em_a1_sub,period_bdy_em_phy_bc_sub &
,period_bdy_em_fdda_bc_sub,period_bdy_em_chem_sub,halo_em_phys_cu_sub,halo_em_helicity_sub
#endif
USE module_driver_constants
USE module_diffusion_em
, ONLY : phy_bc, cal_deform_and_div, compute_diff_metrics, &
vertical_diffusion_2, horizontal_diffusion_2, calculate_km_kh, &
tke_rhs, cal_helicity
USE module_em
, ONLY : calculate_phy_tend
USE module_fddaobs_driver
, ONLY : fddaobs_driver
USE module_bc
, ONLY : set_physical_bc3d, set_physical_bc2d
USE module_physics_addtendc
, ONLY : update_phy_ten
USE module_sfs_driver
!JDM
USE module_stoch
, ONLY : update_stoch_ten, update_stoch , calculate_stoch_ten, &
do_fftback_along_x,do_fftback_along_y,sp2gp_prep
IMPLICIT NONE
TYPE ( domain ), INTENT(INOUT) :: grid
TYPE ( grid_config_rec_type ), INTENT(IN) :: config_flags
INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
imsx,imex,jmsx,jmex,kmsx,kmex, &
ipsx,ipex,jpsx,jpex,kpsx,kpex, &
imsy,imey,jmsy,jmey,kmsy,kmey, &
ipsy,ipey,jpsy,jpey,kpsy,kpey
LOGICAL ,INTENT(IN) :: adapt_step_flag
REAL, INTENT(IN) :: curr_secs
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_moist),INTENT(INOUT) :: moist
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_moist),INTENT(INOUT) :: moist_tend
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_chem),INTENT(INOUT) :: chem
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_chem),INTENT(INOUT) :: chem_tend
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_tracer),INTENT(INOUT) :: tracer
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_tracer),INTENT(INOUT) :: tracer_tend
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_scalar),INTENT(INOUT) :: scalar
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_scalar),INTENT(INOUT) :: scalar_tend
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_fdda3d),INTENT(INOUT) :: fdda3d
REAL ,DIMENSION(ims:ime,1:1,jms:jme,num_fdda2d),INTENT(INOUT) :: fdda2d
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: psim
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: psih
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wspd
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: gz1oz0
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: br
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chklowq
LOGICAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cu_act_flag
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: hol
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: th_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: pi_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: p_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: t_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: u_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: v_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: dz8w
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: p8w
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: t8w
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: rho_phy
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: rho
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: ru_tendf
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: rv_tendf
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: rw_tendf
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: ph_tendf
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: t_tendf
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme), INTENT(INOUT) :: tke_tend
REAL ,DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: mu_tendf
INTEGER , INTENT(IN) :: k_start, k_end
!JDM
INTEGER, INTENT( IN ) :: n_nba_mij, n_nba_rij
REAL ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,n_nba_mij) &
:: nba_mij
REAL ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,n_nba_rij) &
:: nba_rij
! Local
REAL, DIMENSION( ims:ime, jms:jme ) :: ht_loc
REAL :: scale_factor
INTEGER, DIMENSION( ims:ime, jms:jme ) :: shadowmask
INTEGER :: ij
INTEGER num_roof_layers
INTEGER num_wall_layers
INTEGER num_road_layers
INTEGER iswater
INTEGER rk_step
#if ( WRF_DFI_RADAR == 1 )
INTEGER i_start,i_end,j_start,j_end,i,j,k
#endif
! initialize all tendencies to zero in order to update physics
! tendencies first (separate from dry dynamics).
rk_step = 1
IF (grid%stoch_force_global_opt==1) then
IF ( grid%id .EQ. 1 ) THEN
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL UPDATE_STOCH
(grid%SPSTREAMFORCS,grid%SPSTREAMFORCC, &
grid%SPTFORCS,grid%SPTFORCC, &
grid%SPT_AMP,grid%SPSTREAM_AMP, &
grid%itimestep,ij, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), &
grid%j_end(ij), k_start, k_end )
call sp2gp_prep
( &
grid%SPSTREAMFORCS,grid%SPSTREAMFORCC, &
grid%SPTFORCS,grid%SPTFORCC, &
grid%VERTSTRUCC,grid%VERTSTRUCS, &
grid%RU_REAL,grid%RV_REAL,grid%RT_REAL, &
grid%RU_IMAG,grid%RV_IMAG,grid%RT_IMAG, &
grid%DX,grid%DY,grid%stoch_vertstruc_opt, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), &
grid%j_end(ij), k_start, k_end)
ENDDO
!$OMP END PARALLEL DO
! Roll out into latitude bands and perform FFT along latitude bands
#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
#include "XPOSE_STOCH_BACK_U_REAL_z2x.inc"
#include "XPOSE_STOCH_BACK_U_IMAG_z2x.inc"
#include "XPOSE_STOCH_BACK_V_REAL_z2x.inc"
#include "XPOSE_STOCH_BACK_V_IMAG_z2x.inc"
#include "XPOSE_STOCH_BACK_T_REAL_z2x.inc"
#include "XPOSE_STOCH_BACK_T_IMAG_z2x.inc"
call do_fftback_along_x
( &
grid%RU_REAL_xxx,grid%RU_IMAG_xxx,&
grid%RV_REAL_xxx,grid%RV_IMAG_xxx,&
grid%RT_REAL_xxx,grid%RT_IMAG_xxx,&
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
imsx,imex,jmsx,jmex,kmsx,kmex, &
ipsx,ipex,jpsx,jpex,kpsx,kpex, &
imsy,imey,jmsy,jmey,kmsy,kmey, &
ipsy,ipey,jpsy,jpey,kpsy,kpey, &
k_start , k_end &
)
! Reassemble fields from latitude bands into 3D arrays
! reassemble field X_REAL and X_IMAG
#include "XPOSE_STOCH_BACK_U_REAL_x2z.inc"
#include "XPOSE_STOCH_BACK_U_IMAG_x2z.inc"
#include "XPOSE_STOCH_BACK_V_REAL_x2z.inc"
#include "XPOSE_STOCH_BACK_V_IMAG_x2z.inc"
#include "XPOSE_STOCH_BACK_T_REAL_x2z.inc"
#include "XPOSE_STOCH_BACK_T_IMAG_x2z.inc"
! Roll out into longitude bands and perform FFT along longitude bands
#include "XPOSE_STOCH_BACK_U_REAL_z2y.inc"
#include "XPOSE_STOCH_BACK_U_IMAG_z2y.inc"
#include "XPOSE_STOCH_BACK_V_REAL_z2y.inc"
#include "XPOSE_STOCH_BACK_V_IMAG_z2y.inc"
#include "XPOSE_STOCH_BACK_T_REAL_z2y.inc"
#include "XPOSE_STOCH_BACK_T_IMAG_z2y.inc"
call do_fftback_along_y
( &
grid%RU_REAL_yyy,grid%RU_IMAG_yyy,&
grid%RV_REAL_yyy,grid%RV_IMAG_yyy,&
grid%RT_REAL_yyy,grid%RT_IMAG_yyy,&
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
imsx,imex,jmsx,jmex,kmsx,kmex, &
ipsx,ipex,jpsx,jpex,kpsx,kpex, &
imsy,imey,jmsy,jmey,kmsy,kmey, &
ipsy,ipey,jpsy,jpey,kpsy,kpey, &
k_start , k_end &
)
! Reassemble fields from longitude bands into 3D arrays
#include "XPOSE_STOCH_BACK_U_REAL_y2z.inc"
#include "XPOSE_STOCH_BACK_U_IMAG_y2z.inc"
#include "XPOSE_STOCH_BACK_V_REAL_y2z.inc"
#include "XPOSE_STOCH_BACK_V_IMAG_y2z.inc"
#include "XPOSE_STOCH_BACK_T_REAL_y2z.inc"
#include "XPOSE_STOCH_BACK_T_IMAG_y2z.inc"
#else
call do_fftback_along_x
( &
grid%RU_REAL,grid%RU_IMAG,&
grid%RV_REAL,grid%RV_IMAG,&
grid%RT_REAL,grid%RT_IMAG,&
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
k_start , k_end &
)
call do_fftback_along_y
( &
grid%RU_REAL,grid%RU_IMAG,&
grid%RV_REAL,grid%RV_IMAG,&
grid%RT_REAL,grid%RT_IMAG,&
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
k_start , k_end &
)
#endif
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call update_stoch_ten' )
CALL calculate_stoch_ten
(ru_tendf, rv_tendf, t_tendf, &
grid%ru_tendf_stoch, &
grid%rv_tendf_stoch, &
grid%rt_tendf_stoch, &
grid%RU_REAL,grid%RV_REAL,grid%RT_REAL, &
grid%mu_2 , grid%mub, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start, k_end, &
grid%dt)
ENDDO
!$OMP END PARALLEL DO
END IF !grid%id==1
ENDIF !toch_force_global_opt
stoch_force_select: SELECT CASE(config_flags%stoch_force_opt)
CASE (STOCH_BACKSCATTER)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call update_stoch_ten' )
CALL update_stoch_ten
(ru_tendf, rv_tendf, t_tendf,&
grid%ru_tendf_stoch, &
grid%rv_tendf_stoch, &
grid%rt_tendf_stoch, &
grid%mu_2 , grid%mub, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start, k_end, &
grid%dt )
ENDDO
!$OMP END PARALLEL DO
END SELECT stoch_force_select
! calculate_phy_tend
BENCH_START(cal_phy_tend)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call calculate_phy_tend' )
CALL calculate_phy_tend
(config_flags,grid%mut,grid%muu,grid%muv,pi_phy, &
grid%rthraten, &
grid%rublten,grid%rvblten,grid%rthblten, &
grid%rqvblten,grid%rqcblten,grid%rqiblten, &
grid%rucuten,grid%rvcuten,grid%rthcuten, &
grid%rqvcuten,grid%rqccuten,grid%rqrcuten, &
grid%rqicuten,grid%rqscuten, &
grid%rushten,grid%rvshten,grid%rthshten, &
grid%rqvshten,grid%rqcshten,grid%rqrshten, &
grid%rqishten,grid%rqsshten,grid%rqgshten, &
grid%RUNDGDTEN,grid%RVNDGDTEN,grid%RTHNDGDTEN,grid%RQVNDGDTEN, &
grid%RMUNDGDTEN, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
grid%i_start(ij), min(grid%i_end(ij),ide-1), &
grid%j_start(ij), min(grid%j_end(ij),jde-1), &
k_start , min(k_end,kde-1) )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(cal_phy_tend)
! tke diffusion
IF(config_flags%diff_opt .eq. 2 .OR. config_flags%diff_opt .eq. 1) THEN
BENCH_START(comp_diff_metrics_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call compute_diff_metrics ' )
CALL compute_diff_metrics
( config_flags, grid%ph_2, grid%phb, grid%z, grid%rdz, grid%rdzw, &
grid%zx, grid%zy, grid%rdx, grid%rdy, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(comp_diff_metrics_tim)
#ifdef DM_PARALLEL
# include "HALO_EM_TKE_C.inc"
# include "PERIOD_BDY_EM_A1.inc"
#endif
BENCH_START(tke_diff_bc_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call bc for diffusion_metrics ' )
CALL set_physical_bc3d
( grid%rdzw , 'w', config_flags, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
CALL set_physical_bc3d
( grid%rdz , 'w', config_flags, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
CALL set_physical_bc3d
( grid%z , 'w', config_flags, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
CALL set_physical_bc3d
( grid%zx , 'w', config_flags, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
CALL set_physical_bc3d
( grid%zy , 'w', config_flags, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
CALL set_physical_bc2d
( grid%ustm, 't', config_flags, &
ids, ide, jds, jde, &
ims, ime, jms, jme, &
ips, ipe, jps, jpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij) )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(tke_diff_bc_tim)
BENCH_START(deform_div_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call cal_deform_and_div' )
CALL cal_deform_and_div
( config_flags,grid%u_2,grid%v_2,grid%w_2,grid%div, &
grid%defor11,grid%defor22,grid%defor33, &
grid%defor12,grid%defor13,grid%defor23, &
nba_rij, n_nba_rij, & !JDM
grid%u_base, grid%v_base,grid%msfux,grid%msfuy, &
grid%msfvx,grid%msfvy,grid%msftx,grid%msfty, &
grid%rdx, grid%rdy, grid%dn, grid%dnw, grid%rdz, &
grid%rdzw,grid%fnm,grid%fnp,grid%cf1,grid%cf2, &
grid%cf3,grid%zx,grid%zy, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(deform_div_tim)
! Updraft helicity between output times
#ifdef DM_PARALLEL
# include "HALO_EM_HELICITY.inc"
#endif
IF (config_flags%nwp_diagnostics .eq. 1) THEN
BENCH_START(helicity_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call cal_helicity' )
CALL cal_helicity
( config_flags,grid%u_2,grid%v_2,grid%w_2, &
grid%uh, &
grid%up_heli_max, &
grid%ph_2,grid%phb, &
grid%msfux,grid%msfuy, &
grid%msfvx,grid%msfvy, &
grid%ht, &
grid%rdx, grid%rdy, grid%dn, grid%dnw, grid%rdz, grid%rdzw, &
grid%fnm,grid%fnp,grid%cf1,grid%cf2,grid%cf3,grid%zx,grid%zy, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(helicity_tim)
ENDIF
#ifdef DM_PARALLEL
# include "HALO_EM_TKE_D.inc"
#endif
! calculate tke, kmh, and kmv
BENCH_START(calc_tke_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call calculate_km_kh' )
CALL calculate_km_kh
( config_flags,grid%dt,grid%dampcoef,grid%zdamp, &
config_flags%damp_opt, &
grid%xkmh,grid%xkmv,grid%xkhh,grid%xkhv,grid%bn2, &
grid%khdif,grid%kvdif,grid%div, &
grid%defor11,grid%defor22,grid%defor33,grid%defor12, &
grid%defor13,grid%defor23, &
grid%tke_2,p8w,t8w,th_phy, &
t_phy,p_phy,moist,grid%dn,grid%dnw, &
grid%dx,grid%dy,grid%rdz,grid%rdzw, &
config_flags%mix_isotropic,num_moist, &
grid%cf1, grid%cf2, grid%cf3, grid%warm_rain, &
grid%mix_upper_bound, &
grid%msftx, grid%msfty, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(calc_tke_tim)
#ifdef DM_PARALLEL
# include "HALO_EM_TKE_E.inc"
#endif
ENDIF
#ifdef DM_PARALLEL
# include "PERIOD_BDY_EM_PHY_BC.inc"
IF ( config_flags%grid_fdda .eq. 1) THEN
# include "PERIOD_BDY_EM_FDDA_BC.inc"
ENDIF
# include "PERIOD_BDY_EM_CHEM.inc"
#endif
BENCH_START(phy_bc_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call phy_bc' )
CALL phy_bc
(config_flags,grid%div,grid%defor11,grid%defor22,grid%defor33, &
grid%defor12,grid%defor13,grid%defor23, &
grid%xkmh,grid%xkmv,grid%xkhh,grid%xkhv, &
grid%tke_2, &
grid%rublten, grid%rvblten, &
grid%rucuten, grid%rvcuten, &
grid%rushten, grid%rvshten, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(phy_bc_tim)
!JDM
IF ( ( config_flags%sfs_opt .GT. 0 ) .AND. ( config_flags%diff_opt .eq. 2 ) ) THEN
CALL sfs_driver
( grid, config_flags, &
nba_mij, n_nba_mij, &
nba_rij, n_nba_rij )
ENDIF
#ifdef DM_PARALLEL
!-----------------------------------------------------------------------
!
! MPP for some physics tendency, km, kh, deformation, and divergence
!
! * * * * * * *
! * * * * * * * * * * * *
! * * * * * * * * * * * * * *
! * + * * + * + * * + * * * * * + * * *
! * * * * * * * * * * * * * *
! * * * * * * * * * * * *
! * * * * * * *
!
! (for PBL)
! rublten x
! rvblten x
!
! (for Cumulus)
! rucuten x
! rvcuten x
!
! (for Shallow Cumulus)
! rushten x
! rvshten x
!
! (for FDDA)
! rundgdten x
! rvndgdten x
!
! (for TKE3)
! tke_2 x
! (for TKE5)
! tke_2 x
!
! (for diff_opt >= 1)
! defor11 x
! defor22 x
! defor12 x
! defor13 x
! defor23 x
! div x
! xkmv x
! xkmh x
! xkhv x
! xkhh x
! tke x
!
!-----------------------------------------------------------------------
IF ( config_flags%bl_pbl_physics .ge. 1 ) THEN
# include "HALO_EM_PHYS_PBL.inc"
ENDIF
IF ( config_flags%shcu_physics .gt. 1 ) THEN
# include "HALO_EM_PHYS_SHCU.inc"
ENDIF
IF ( config_flags%cu_physics == SASSCHEME .or. &
config_flags%cu_physics == TIEDTKESCHEME .or. &
config_flags%cu_physics == CAMZMSCHEME .or. &
config_flags%cu_physics == NSASSCHEME ) THEN
# include "HALO_EM_PHYS_CU.inc"
ENDIF
IF ( config_flags%grid_fdda .ge. 1) THEN
# include "HALO_EM_FDDA.inc"
ENDIF
IF ( config_flags%diff_opt .ge. 1 ) THEN
# include "HALO_EM_PHYS_DIFFUSION.inc"
ENDIF
IF ( config_flags%h_mom_adv_order <= 4 ) THEN
# include "HALO_EM_TKE_3.inc"
ELSE IF ( config_flags%h_mom_adv_order <= 6 ) THEN
# include "HALO_EM_TKE_5.inc"
ELSE
WRITE(wrf_err_message,*)'solve_em: invalid h_mom_adv_order = ',config_flags%h_mom_adv_order
CALL wrf_error_fatal
(TRIM(wrf_err_message))
ENDIF
#endif
BENCH_START(update_phy_ten_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call update_phy_ten' )
#if ( WRF_DFI_RADAR == 1 )
if (config_flags%cu_physics .gt. 0) then
i_start = grid%i_start(ij)
i_end = min( grid%i_end(ij),ide-1 )
j_start = grid%j_start(ij)
j_end = min( grid%j_end(ij),jde-1 )
if (grid%dfi_stage == DFI_FWD ) &
CALL wrf_debug
( 200 , ' Zero out cu_physics' )
DO j = j_start, j_end
DO k = k_start, min( k_end,kde-1 ) - 1
DO i = i_start, i_end
if (grid%dfi_stage ==DFI_FWD &
.and. grid%dfi_tten_rad(i,k,j) >= 1.0e-7 .and. &
grid%dfi_tten_rad(i,k,j) <= 10.) then
! zero out cu-param temp tendency
grid%rthcuten(i,k,j) = 0.0
endif
ENDDO
ENDDO
ENDDO
ENDIF
#endif
CALL update_phy_ten
(ph_tendf,t_tendf, ru_tendf, rv_tendf,moist_tend ,&
scalar_tend, mu_tendf, &
grid%rthraten,grid%rthblten,grid%rthcuten,grid%rthshten, &
grid%rublten,grid%rucuten,grid%rushten, &
grid%rvblten,grid%rvcuten,grid%rvshten, &
grid%rqvblten,grid%rqcblten,grid%rqiblten, &
grid%rqniblten, & !CAMUWPBL scheme
grid%rqvcuten,grid%rqccuten,grid%rqrcuten, &
grid%rqicuten,grid%rqscuten, &
grid%rqcncuten,grid%rqincuten, & !BSINGH - Added two CU tends
grid%rqvshten,grid%rqcshten,grid%rqrshten, &
grid%rqishten,grid%rqsshten,grid%rqgshten, &
grid%rqcnshten,grid%rqinshten, &!BSINGH - Added two SHCU tends
grid%RUNDGDTEN, &
grid%RVNDGDTEN,grid%RTHNDGDTEN,grid%RPHNDGDTEN, &
grid%RQVNDGDTEN,grid%RMUNDGDTEN, &
grid%rthfrten,grid%rqvfrten, & ! fire
num_moist,num_scalar,config_flags,rk_step, &
grid%adv_moist_cond, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start, k_end )
END DO
!$OMP END PARALLEL DO
BENCH_END(update_phy_ten_tim)
#ifdef PLANET
! do rayleigh (and zonal-average newtonian) damping during
! first iteration of RK loop only
IF ( (config_flags%damp_opt == 101) .OR. &
(config_flags%damp_opt == 103) ) THEN
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL damptop( grid%u_2, grid%v_2, grid%t_2, &
grid%mut, grid%muu, grid%muv, &
pi_phy, &
t_tendf, ru_tendf, rv_tendf, P2SI, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start, k_end )
END DO
!$OMP END PARALLEL DO
END IF
#endif
IF( config_flags%diff_opt .eq. 2 .and. config_flags%km_opt .eq. 2 ) THEN
BENCH_START(tke_rhs_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL tke_rhs
( tke_tend,grid%bn2, &
config_flags,grid%defor11,grid%defor22, &
grid%defor33, &
grid%defor12,grid%defor13,grid%defor23, &
grid%u_2,grid%v_2,grid%w_2,grid%div, &
grid%tke_2,grid%mut, &
th_phy,p_phy,p8w,t8w,grid%z,grid%fnm, &
grid%fnp,grid%cf1,grid%cf2,grid%cf3, &
grid%msftx,grid%msfty,grid%xkmh, &
grid%xkmv,grid%xkhv,grid%rdx,grid%rdy, &
grid%dx,grid%dy,grid%dt,grid%zx,grid%zy, &
grid%rdz,grid%rdzw,grid%dn, &
grid%dnw,config_flags%mix_isotropic, &
grid%hfx, grid%qfx, moist(ims,kms,jms,P_QV), &
grid%ustm, rho, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(tke_rhs_tim)
ENDIF
! calculate vertical diffusion first and then horizontal
! (keep this order)
IF(config_flags%diff_opt .eq. 2) THEN
IF (config_flags%bl_pbl_physics .eq. 0) THEN
BENCH_START(vert_diff_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call vertical_diffusion_2 ' )
CALL vertical_diffusion_2
( ru_tendf, rv_tendf, rw_tendf, &
t_tendf, tke_tend, &
moist_tend, num_moist, &
chem_tend, num_chem, &
scalar_tend, num_scalar, &
tracer_tend, num_tracer, &
grid%u_2, grid%v_2, &
grid%t_2,grid%u_base,grid%v_base,grid%t_base,grid%qv_base, &
grid%mut,grid%tke_2,config_flags, &
grid%defor13,grid%defor23,grid%defor33, &
nba_mij, num_nba_mij, & !JDM
grid%div, moist, chem, scalar,tracer, &
grid%xkmv, grid%xkhv, config_flags%km_opt, &
grid%fnm, grid%fnp, grid%dn, grid%dnw, grid%rdz, grid%rdzw, &
grid%hfx, grid%qfx, grid%ustm, rho, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start, k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(vert_diff_tim)
ENDIF
!
BENCH_START(hor_diff_tim)
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL wrf_debug ( 200 , ' call horizontal_diffusion_2' )
CALL horizontal_diffusion_2
( t_tendf, ru_tendf, rv_tendf, rw_tendf, &
tke_tend, &
moist_tend, num_moist, &
chem_tend, num_chem, &
scalar_tend, num_scalar, &
tracer_tend, num_tracer, &
grid%t_2, th_phy, &
grid%mut, grid%tke_2, config_flags, &
grid%defor11, grid%defor22, grid%defor12, &
grid%defor13, grid%defor23, &
nba_mij, num_nba_mij, & !JDM
grid%div, &
moist, chem, scalar,tracer, &
grid%msfux,grid%msfuy, grid%msfvx,grid%msfvy, grid%msftx, &
grid%msfty, grid%xkmh, grid%xkhh, config_flags%km_opt, &
grid%rdx, grid%rdy, grid%rdz, grid%rdzw, &
grid%fnm, grid%fnp, grid%cf1, grid%cf2, grid%cf3, &
grid%zx, grid%zy, grid%dn, grid%dnw, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
grid%i_start(ij), grid%i_end(ij), &
grid%j_start(ij), grid%j_end(ij), &
k_start , k_end )
ENDDO
!$OMP END PARALLEL DO
BENCH_END(hor_diff_tim)
ENDIF
IF ( grid%obs_nudge_opt .EQ. 1 .AND. grid%xtime <= grid%fdda_end ) THEN
# ifdef DM_PARALLEL
# include "HALO_OBS_NUDGE.inc"
#endif
!***********************************************************************
! This section for obs nudging
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij )
DO ij = 1 , grid%num_tiles
CALL fddaobs_driver
(grid%grid_id, model_config_rec%grid_id, &
model_config_rec%parent_id, config_flags%restart, &
config_flags, &
grid%obs_nudge_opt, &
grid%obs_ipf_errob, &
grid%obs_ipf_nudob, &
grid%fdda_start, &
grid%fdda_end, &
grid%obs_nudge_wind, &
grid%obs_nudge_temp, &
grid%obs_nudge_mois, &
grid%obs_nudge_pstr, &
grid%obs_coef_wind, &
grid%obs_coef_temp, &
grid%obs_coef_mois, &
grid%obs_coef_pstr, &
grid%obs_rinxy, &
grid%obs_rinsig, &
grid%obs_npfi, &
grid%obs_ionf, &
grid%obs_prt_max, &
grid%obs_prt_freq, &
grid%obs_idynin, &
grid%obs_dtramp, &
grid%parent_grid_ratio, &
grid%max_dom, grid%itimestep, &
grid%xtime, &
grid%dt, grid%gmt, grid%julday, grid%fdob, &
grid%max_obs, &
model_config_rec%nobs_ndg_vars, &
model_config_rec%nobs_err_flds, &
grid%fdob%nstat, grid%fdob%varobs, grid%fdob%errf, &
grid%dx, grid%KPBL,grid%HT, &
grid%mut, grid%muu, grid%muv, &
grid%msftx, grid%msfty, grid%msfux, grid%msfuy, grid%msfvx, grid%msfvy, &
p_phy, t_tendf, t0, &
grid%u_2, grid%v_2, grid%t_2, &
moist(ims,kms,jms,P_QV), &
grid%pb, grid%p_top, grid%p, grid%phb, grid%ph_2, &
grid%uratx, grid%vratx, grid%tratx, &
ru_tendf, rv_tendf, &
moist_tend(ims,kms,jms,P_QV), grid%obs_savwt, &
grid%regime, grid%pblh, grid%z_at_w, grid%z, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
grid%i_start(ij), min(grid%i_end(ij),ide-1), &
grid%j_start(ij), min(grid%j_end(ij),jde-1), &
k_start , min(k_end,kde-1) )
ENDDO
!$OMP END PARALLEL DO
ENDIF ! obs_nudge_opt .eq. 1
!
!***********************************************************************
END SUBROUTINE first_rk_step_part2
END MODULE module_first_rk_step_part2