1 !WRF:MEDIATION_LAYER:SOLVER
3 SUBROUTINE solve_em ( grid , config_flags &
4 ! Arguments generated from Registry
5 #include "dummy_new_args.inc"
9 USE module_state_description
10 USE module_domain, ONLY : &
11 domain, get_ijk_from_grid, get_ijk_from_subgrid &
12 ,domain_get_current_time, domain_get_start_time &
13 ,domain_get_sim_start_time, domain_clock_get,is_alarm_tstep
14 USE module_domain_type, ONLY : history_alarm, restart_alarm, auxinput4_alarm &
16 USE module_configure, ONLY : grid_config_rec_type
17 USE module_driver_constants
19 USE module_tiles, ONLY : set_tiles
21 USE module_dm, ONLY : &
22 local_communicator, mytask, ntasks, ntasks_x, ntasks_y &
23 ,local_communicator_periodic, wrf_dm_maxval
24 USE module_comm_dm, ONLY : &
25 halo_em_a_sub,halo_em_b_sub,halo_em_c2_sub,halo_em_chem_e_3_sub &
26 ,halo_em_chem_e_5_sub,halo_em_chem_e_7_sub,halo_em_chem_old_e_5_sub &
27 ,halo_em_chem_old_e_7_sub,halo_em_c_sub,halo_em_d2_3_sub &
28 ,halo_em_d2_5_sub,halo_em_d3_3_sub,halo_em_d3_5_sub,halo_em_d_sub &
29 ,halo_em_e_3_sub,halo_em_e_5_sub,halo_em_hydro_uv_sub &
30 ,halo_em_moist_e_3_sub,halo_em_moist_e_5_sub,halo_em_moist_e_7_sub &
31 ,halo_em_moist_old_e_5_sub,halo_em_moist_old_e_7_sub &
32 ,halo_em_scalar_e_3_sub,halo_em_scalar_e_5_sub,halo_em_scalar_e_7_sub &
33 ,halo_em_scalar_old_e_5_sub,halo_em_scalar_old_e_7_sub,halo_em_tke_3_sub &
34 ,halo_em_tke_5_sub,halo_em_tke_7_sub,halo_em_tke_advect_3_sub &
35 ,halo_em_tke_advect_5_sub,halo_em_tke_old_e_5_sub &
36 ,halo_em_tke_old_e_7_sub,halo_em_tracer_e_3_sub,halo_em_tracer_e_5_sub &
37 ,halo_em_tracer_e_7_sub,halo_em_tracer_old_e_5_sub &
38 ,halo_em_tracer_old_e_7_sub,halo_em_sbm_sub,period_bdy_em_a_sub &
39 ,period_bdy_em_b3_sub,period_bdy_em_b_sub,period_bdy_em_chem2_sub &
40 ,period_bdy_em_chem_old_sub,period_bdy_em_chem_sub,period_bdy_em_d3_sub &
41 ,period_bdy_em_d_sub,period_bdy_em_e_sub,period_bdy_em_moist2_sub &
42 ,period_bdy_em_moist_old_sub,period_bdy_em_moist_sub &
43 ,period_bdy_em_scalar2_sub,period_bdy_em_scalar_old_sub &
44 ,period_bdy_em_scalar_sub,period_bdy_em_tke_old_sub, period_bdy_em_tke_sub &
45 ,period_bdy_em_tracer2_sub,period_bdy_em_tracer_old_sub &
46 ,period_bdy_em_tracer_sub,period_em_da_sub,period_em_hydro_uv_sub &
47 ,period_em_f_sub,period_em_g_sub &
48 ,halo_em_f_1_sub,halo_em_init_4_sub,halo_em_thetam_sub,period_em_thetam_sub &
49 ,halo_em_d_pv_sub,halo_firebrand_spotting_5_sub
52 ! Mediation layer modules
54 USE module_model_constants
55 USE module_small_step_em
57 USE module_big_step_utilities_em
60 USE module_solvedebug_em
61 USE module_physics_addtendc
62 USE module_diffusion_em
64 USE module_microphysics_driver
65 USE module_microphysics_zero_out
66 ! USE module_lightning_driver, ONLY : lightning_driver
67 USE module_fddaobs_driver
68 ! USE module_diagnostics
70 USE module_input_chem_data
71 USE module_input_tracer
72 USE module_chem_utilities
75 USE module_first_rk_step_part1
76 USE module_first_rk_step_part2
77 USE module_after_all_rk_steps
78 USE module_llxy, ONLY : proj_cassini
79 USE module_avgflx_em, ONLY : zero_avgflx, upd_avgflx
80 USE module_cpl, ONLY : coupler_on, cpl_settime, cpl_store_input
83 use twoway_data_module
85 USE module_firebrand_spotting, ONLY : firebrand_spotting_em_driver
91 TYPE(domain) , TARGET :: grid
93 ! Definitions of dummy arguments to this routine (generated from Registry).
94 #include "dummy_new_decl.inc"
96 ! Structure that contains run-time configuration (namelist) data for domain
97 TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags
101 INTEGER :: k_start , k_end, its, ite, jts, jte
102 INTEGER :: ids , ide , jds , jde , kds , kde , &
103 ims , ime , jms , jme , kms , kme , &
104 ips , ipe , jps , jpe , kps , kpe
106 INTEGER :: sids , side , sjds , sjde , skds , skde , &
107 sims , sime , sjms , sjme , skms , skme , &
108 sips , sipe , sjps , sjpe , skps , skpe
111 INTEGER :: imsx, imex, jmsx, jmex, kmsx, kmex, &
112 ipsx, ipex, jpsx, jpex, kpsx, kpex, &
113 imsy, imey, jmsy, jmey, kmsy, kmey, &
114 ipsy, ipey, jpsy, jpey, kpsy, kpey
116 INTEGER :: ij , iteration
117 INTEGER :: im , num_3d_m , ic , num_3d_c , is , num_3d_s
122 LOGICAL :: specified_bdy, channel_bdy
124 REAL :: t_new, time_duration_of_lbcs
126 ! begin WRF-CMAQ twoway coupled model block
127 integer :: twoway_jdate, & ! CMAQ current job date
128 twoway_jtime, & ! CMAQ current job time
129 met_file_tstep ! MCIP like MET file time step
131 integer, save :: cmaq_nstep, & ! total number of CMAQ steps
132 wrf_end_step, & ! WRF ending step #
133 counter = -1, & ! step counter
134 wrf_cmaq_freq, & ! call frequency between WRF and CMAQ
135 wrf_cmaq_option ! WRF-CMAQ coupled model option
137 ! 1 = run WRF only w producing MCIP like GRID and MET files
138 ! 2 = run WRF-CMAQ coupled model w/o producing MCIP like GRID and MET files
139 ! 3 = run WRF-CMAQ coupled model w producing MCIP like GRID and MET files
141 logical :: cmaq_step ! CMAQ step number
143 logical, save :: firstime = .true., & ! logical variable indicating first time
144 feedback_is_ready, & ! logical variable indicating feedback process can proceed
145 feedback_restart, & ! logical variable indicating feedback information is available
146 direct_sw_feedback ! logical variable indicating direct aerosol sw feedback is on or not
147 ! end WRF-CMAQ twoway coupled model block
149 ! Changes in tendency at this timestep
150 real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33) :: h_tendency, &
153 ! Whether advection should produce decoupled horizontal and vertical advective tendency outputs
156 ! Flag for producing diagnostic fields (e.g., radar reflectivity)
158 INTEGER :: ke_diag ! tells reflectivity calculation whether to do full depth or only k=1
159 LOGICAL :: restart_flag ! tells if it is a restart timestep to write restart files.
162 ! Index cross-referencing array for tendency accumulation
163 INTEGER, DIMENSION( num_chem ) :: adv_ct_indices
166 ! storage for tendencies and decoupled state (generated from Registry)
168 #include "i1_decl.inc"
169 ! Previous time level of tracer arrays now defined as i1 variables;
170 ! the state 4d arrays now redefined as 1-time level arrays in Registry.
171 ! Benefit: save memory in nested runs, since only 1 domain is active at a
172 ! time. Potential problem on stack-limited architectures: increases
173 ! amount of data on program stack by making these automatic arrays.
176 INTEGER :: number_of_small_timesteps, rk_step
177 INTEGER :: klevel,ijm,ijp,i,j,k,size1,size2 ! for prints/plots only
178 INTEGER :: idum1, idum2, dynamics_option
180 INTEGER :: rk_order, iwmax, jwmax, kwmax
181 REAL :: dt_rk, dts_rk, dts, dtm, wmax
182 REAL , ALLOCATABLE , DIMENSION(:) :: max_vert_cfl_tmp, max_horiz_cfl_tmp
185 LOGICAL :: f_flux ! flag for computing averaged fluxes in cu_gd
186 REAL :: curr_secs, curr_secs2
187 INTEGER :: num_sound_steps
188 INTEGER :: idex, jdex
192 INTEGER :: ii, jj !kk is above after l,kte
194 INTEGER :: debug_level
196 ! urban related variables
197 INTEGER :: NUM_ROOF_LAYERS, NUM_WALL_LAYERS, NUM_ROAD_LAYERS ! urban
199 TYPE(WRFU_TimeInterval) :: tmpTimeInterval, tmpTimeInterval2
201 LOGICAL :: adapt_step_flag
202 LOGICAL :: fill_w_flag
204 ! variables for flux-averaging code 20091223
205 CHARACTER*256 :: message, message2, message3
207 TYPE(WRFU_Time) :: temp_time, CurrTime, restart_time
208 INTEGER, PARAMETER :: precision = 100
210 TYPE(WRFU_TimeInterval) :: dtInterval, intervaltime,restartinterval
214 SUBROUTINE CMAQ_DRIVER ( MODEL_STDATE, MODEL_STTIME, MODEL_TSTEP, &
215 MODEL_JDATE, MODEL_JTIME, LAST_STEP, &
216 COUPLE_TSTEP, NCOLS_IN, NLAYS_IN)
217 INTEGER, INTENT( IN ) :: MODEL_STDATE, MODEL_STTIME, MODEL_TSTEP
218 INTEGER, INTENT( OUT ) :: MODEL_JDATE, MODEL_JTIME
219 LOGICAL, INTENT( IN ) :: LAST_STEP
220 INTEGER, INTENT( IN ), OPTIONAL :: COUPLE_TSTEP
221 INTEGER, INTENT( IN ), OPTIONAL :: NCOLS_IN, NLAYS_IN
222 END SUBROUTINE CMAQ_DRIVER
226 ! Define benchmarking timers if -DBENCH is compiled
227 #include "bench_solve_em_def.h"
229 !----------------------
230 ! Executable statements
231 !----------------------
235 ! solve_em is the main driver for advancing a grid a single timestep.
236 ! It is a mediation-layer routine -> DM and SM calls are made where
237 ! needed for parallel processing.
239 ! solve_em can integrate the equations using 3 time-integration methods
241 ! - 3rd order Runge-Kutta time integration (recommended)
243 ! - 2nd order Runge-Kutta time integration
245 ! The main sections of solve_em are
247 ! (1) Runge-Kutta (RK) loop
249 ! (2) Non-timesplit physics (i.e., tendencies computed for updating
250 ! model state variables during the first RK sub-step (loop)
252 ! (3) Small (acoustic, sound) timestep loop - within the RK sub-steps
254 ! (4) scalar advance for moist and chem scalar variables (and TKE)
255 ! within the RK sub-steps.
257 ! (5) time-split physics (after the RK step), currently this includes
260 ! A more detailed description of these sections follows.
264 ! Initialize timers if compiled with -DBENCH
265 #include "bench_solve_em_init.h"
269 CALL nl_get_feedback_restart ( .false., feedback_restart )
270 if (feedback_restart) then
271 feedback_is_ready = .true.
273 feedback_is_ready = .false.
277 feedback_is_ready = .false.
280 ! set runge-kutta solver (2nd or 3rd order)
282 dynamics_option = config_flags%rk_ord
284 ! Obtain dimension information stored in the grid data structure.
286 CALL get_ijk_from_grid ( grid , &
287 ids, ide, jds, jde, kds, kde, &
288 ims, ime, jms, jme, kms, kme, &
289 ips, ipe, jps, jpe, kps, kpe, &
290 imsx, imex, jmsx, jmex, kmsx, kmex, &
291 ipsx, ipex, jpsx, jpex, kpsx, kpex, &
292 imsy, imey, jmsy, jmey, kmsy, kmey, &
293 ipsy, ipey, jpsy, jpey, kpsy, kpey )
295 CALL get_ijk_from_subgrid ( grid , &
296 sids, side, sjds, sjde, skds, skde, &
297 sims, sime, sjms, sjme, skms, skme, &
298 sips, sipe, sjps, sjpe, skps, skpe )
304 num_3d_s = num_scalar
306 ! backward integration needs to advect only QV
307 if (grid%dfi_stage .EQ. DFI_BCK) then
309 num_3d_s = PARAM_FIRST_SCALAR - 1
312 f_flux = config_flags%do_avgflx_cugd .EQ. 1
314 ! Compute these starting and stopping locations for each tile and number of tiles.
315 ! See: https://www2.mmm.ucar.edu/wrf/WG2/topics/settiles
316 CALL set_tiles ( ZONE_SOLVE_EM, grid , ids , ide , jds , jde , ips , ipe , jps , jpe )
317 ! CALL set_tiles ( grid , ids , ide , jds , jde , ips , ipe , jps , jpe )
319 ! Max values of CFL for adaptive time step scheme
321 ALLOCATE (max_vert_cfl_tmp(grid%num_tiles))
322 ALLOCATE (max_horiz_cfl_tmp(grid%num_tiles))
325 ! Calculate current time in seconds since beginning of model run.
326 ! Unfortunately, ESMF does not seem to have a way to return
327 ! floating point seconds based on a TimeInterval. So, we will
328 ! calculate it here--but, this is not clean!!
330 tmpTimeInterval = domain_get_current_time ( grid ) - domain_get_sim_start_time ( grid )
331 tmpTimeInterval2 = domain_get_current_time ( grid ) - domain_get_start_time ( grid )
332 curr_secs = real_time(tmpTimeInterval)
333 curr_secs2 = real_time(tmpTimeInterval2)
335 old_dt = grid%dt ! store old time step for flux averaging code at end of RK loop
337 !-----------------------------------------------------------------------------
338 ! Adaptive time step: Added by T. Hutchinson, WSI 3/5/07
339 ! In this call, we do the time-step adaptation and set time-dependent lateral
340 ! boundary condition nudging weights.
342 IF ( (config_flags%use_adaptive_time_step) .and. &
343 ( (.not. grid%nested) .or. &
344 ( (grid%nested) .and. (abs(grid%dtbc) < 0.0001) ) ) )THEN
345 CALL adapt_timestep(grid, config_flags)
346 adapt_step_flag = .TRUE.
348 adapt_step_flag = .FALSE.
350 ! End of adaptive time step modifications
351 !-----------------------------------------------------------------------------
353 ! Set restart flag value history output time
354 !-----------------------------------------------------------------------------
355 restart_flag = .false.
356 if ( Is_alarm_tstep(grid%domain_clock, grid%alarms(restart_alarm)) ) then
357 restart_flag = .true.
360 ! Set diagnostic flag value history output time
361 !-----------------------------------------------------------------------------
363 ke_diag = kms ! default to ke_diag=1 in case of nwp_diagnostics == 1
365 if ( Is_alarm_tstep(grid%domain_clock, grid%alarms(HISTORY_ALARM)) ) then
367 ke_diag = min(k_end,kde-1) ! set depth to full domain for reflectivity field
369 IF (config_flags%nwp_diagnostics == 1) diag_flag = .true.
371 grid%itimestep = grid%itimestep + 1
372 grid%dtbc = grid%dtbc + grid%dt
374 IF( coupler_on ) CALL cpl_store_input( grid, config_flags )
376 IF (config_flags%polar) dclat = 90./REAL(jde-jds) !(0.5 * 180/ny)
382 if ( num_chem >= PARAM_FIRST_SCALAR ) then
383 !-----------------------------------------------------------------------
384 ! see matching halo calls below for stencils
385 !--------------------------------------------------------------
386 CALL wrf_debug ( 200 , ' call HALO_RK_CHEM' )
387 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
388 # include "HALO_EM_CHEM_E_3.inc"
389 IF( config_flags%progn > 0 ) THEN
390 # include "HALO_EM_SCALAR_E_3.inc"
392 IF( config_flags%cu_physics == CAMZMSCHEME ) THEN
393 # include "HALO_EM_SCALAR_E_3.inc"
395 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
396 # include "HALO_EM_CHEM_E_5.inc"
397 IF( config_flags%cu_physics == CAMZMSCHEME ) THEN
398 # include "HALO_EM_SCALAR_E_5.inc"
400 IF( config_flags%progn > 0 ) THEN
401 # include "HALO_EM_SCALAR_E_5.inc"
404 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
405 CALL wrf_error_fatal(TRIM(wrf_err_message))
408 if ( num_tracer >= PARAM_FIRST_SCALAR ) then
409 !-----------------------------------------------------------------------
410 ! see matching halo calls below for stencils
411 !--------------------------------------------------------------
412 CALL wrf_debug ( 200 , ' call HALO_RK_tracer' )
413 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
414 # include "HALO_EM_TRACER_E_3.inc"
415 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
416 # include "HALO_EM_TRACER_E_5.inc"
418 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
419 CALL wrf_error_fatal(TRIM(wrf_err_message))
423 !--------------------------------------------------------------
424 adv_ct_indices( : ) = 1
425 IF ( config_flags%chemdiag == USECHEMDIAG ) THEN
426 ! modify tendency list here
427 ! note that the referencing direction here is opposite of that in chem_driver
428 adv_ct_indices(p_co ) = p_advh_co
429 adv_ct_indices(p_o3 ) = p_advh_o3
430 adv_ct_indices(p_no ) = p_advh_no
431 adv_ct_indices(p_no2 ) = p_advh_no2
432 adv_ct_indices(p_hno3) = p_advh_hno3
433 adv_ct_indices(p_iso ) = p_advh_iso
434 adv_ct_indices(p_ho ) = p_advh_ho
435 adv_ct_indices(p_ho2 ) = p_advh_ho2
439 rk_order = config_flags%rk_ord
441 IF ( grid%time_step_sound == 0 ) THEN
442 ! This function will give 4 for 6*dx and 6 for 10*dx and returns even numbers only
443 spacing = min(grid%dx, grid%dy)
444 IF ( ( config_flags%use_adaptive_time_step ) .AND. ( config_flags%map_proj == PROJ_CASSINI ) ) THEN
445 max_msft=MIN ( MAX(grid%max_msftx, grid%max_msfty) , &
446 1.0/COS(config_flags%fft_filter_lat*degrad) )
447 num_sound_steps = max ( 2 * ( INT (300. * grid%dt / (spacing / max_msft) - 0.01 ) + 1 ), 4 )
448 ELSE IF ( config_flags%use_adaptive_time_step ) THEN
449 max_msft= MAX(grid%max_msftx, grid%max_msfty)
450 num_sound_steps = max ( 2 * ( INT (300. * grid%dt / (spacing / max_msft) - 0.01 ) + 1 ), 4 )
452 num_sound_steps = max ( 2 * ( INT (300. * grid%dt / spacing - 0.01 ) + 1 ), 4 )
454 WRITE(wrf_err_message,*)'grid spacing, dt, time_step_sound=',spacing,grid%dt,num_sound_steps
455 CALL wrf_debug ( 50 , wrf_err_message )
457 num_sound_steps = grid%time_step_sound
460 dts = grid%dt/float(num_sound_steps)
462 IF (config_flags%use_adaptive_time_step) THEN
464 CALL get_wrf_debug_level( debug_level )
465 IF ((config_flags%time_step < 0) .AND. (debug_level.GE.50)) THEN
467 CALL wrf_dm_maxval(grid%max_vert_cfl, idex, jdex)
469 WRITE(wrf_err_message,*)'variable dt, max horiz cfl, max vert cfl: ',&
470 grid%dt, grid%max_horiz_cfl, grid%max_vert_cfl
471 CALL wrf_debug ( 0 , wrf_err_message )
475 grid%max_horiz_cfl = 0
476 grid%max_vert_cfl = 0
479 ! setting bdy tendencies to zero for DFI if constant_bc = true
483 DO ij = 1 , grid%num_tiles
485 ! IF( config_flags%specified .AND. grid%dfi_opt .NE. DFI_NODFI &
486 ! .AND. config_flags%constant_bc .AND. (grid%dfi_stage .EQ. DFI_BCK .OR. grid%dfi_stage .EQ. DFI_FWD) ) THEN
487 IF( config_flags%specified .AND. config_flags%constant_bc ) THEN
489 CALL zero_bdytend (grid%u_btxs,grid%u_btxe,grid%u_btys,grid%u_btye, &
490 grid%v_btxs,grid%v_btxe,grid%v_btys,grid%v_btye, &
491 grid%ph_btxs,grid%ph_btxe,grid%ph_btys,grid%ph_btye, &
492 grid%t_btxs,grid%t_btxe,grid%t_btys,grid%t_btye, &
493 grid%w_btxs,grid%w_btxe,grid%w_btys,grid%w_btye, &
494 grid%mu_btxs,grid%mu_btxe,grid%mu_btys,grid%mu_btye, &
495 moist_btxs,moist_btxe, &
496 moist_btys,moist_btye, &
497 scalar_btxs,scalar_btxe, &
498 scalar_btys,scalar_btye, &
499 grid%spec_bdy_width,num_3d_m,num_3d_s, &
500 ids,ide, jds,jde, kds,kde, &
501 ims,ime, jms,jme, kms,kme, &
502 ips,ipe, jps,jpe, kps,kpe, &
503 grid%i_start(ij), grid%i_end(ij), &
504 grid%j_start(ij), grid%j_end(ij), &
509 ! If the user has requested to optionally select the moist theta (use_theta_m==1)
510 ! switch, the first setting of the "old" value of theta_m uses the "old"
511 ! value of Qv. The moist_old variable does not exist until after the advection
512 ! towards the end of the RK loop. For the first time in the RK loop, we need
513 ! a reasonable value for moist_old.
515 CALL initialize_moist_old ( moist_old(:,:,:,P_Qv), &
516 moist(:,:,:,P_Qv) , &
517 ids,ide, jds,jde, kds,kde, &
518 ims,ime, jms,jme, kms,kme, &
519 grid%i_start(ij), grid%i_end(ij), &
520 grid%j_start(ij), grid%j_end(ij), &
523 !$OMP END PARALLEL DO
525 ! Now that we have initialized the moist_old values with P_Qv for
526 ! computing a moist t_tendf after rk_step part2, fill in the halo
527 ! and period boundaries.
529 #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
530 # include "HALO_EM_MOIST_OLD_E_7.inc"
531 # include "PERIOD_BDY_EM_MOIST_OLD.inc"
535 DO ij = 1 , grid%num_tiles
537 CALL set_physical_bc3d( moist_old(ims,kms,jms,im), 'p', config_flags, &
538 ids, ide, jds, jde, kds, kde, &
539 ims, ime, jms, jme, kms, kme, &
540 ips, ipe, jps, jpe, kps, kpe, &
541 grid%i_start(ij), grid%i_end(ij), &
542 grid%j_start(ij), grid%j_end(ij), &
545 !$OMP END PARALLEL DO
547 !**********************************************************************
549 ! LET US BEGIN.......
553 ! (1) RK integration loop is named the "Runge_Kutta_loop:"
555 ! Predictor-corrector type time integration.
556 ! Advection terms are evaluated at time t for the predictor step,
557 ! and advection is re-evaluated with the latest predicted value for
558 ! each succeeding time corrector step
560 ! 2nd order Runge Kutta (rk_order = 2):
561 ! Step 1 is taken to the midpoint predictor, step 2 is the full step.
563 ! 3rd order Runge Kutta (rk_order = 3):
564 ! Step 1 is taken to from t to dt/3, step 2 is from t to dt/2,
565 ! and step 3 is from t to dt.
567 ! non-timesplit physics are evaluated during first RK step and
568 ! these physics tendencies are stored for use in each RK pass.
571 !**********************************************************************
573 Runge_Kutta_loop: DO rk_step = 1, rk_order
575 ! Set the step size and number of small timesteps for
576 ! each part of the timestep
579 IF ( rk_order == 1 ) THEN
581 write(wrf_err_message,*)' leapfrog removed, error exit for dynamics_option = ',dynamics_option
582 CALL wrf_error_fatal( wrf_err_message )
584 ELSE IF ( rk_order == 2 ) THEN ! 2nd order Runge-Kutta timestep
586 IF ( rk_step == 1) THEN
589 number_of_small_timesteps = num_sound_steps/2
593 number_of_small_timesteps = num_sound_steps
596 ELSE IF ( rk_order == 3 ) THEN ! third order Runge-Kutta
598 IF ( rk_step == 1) THEN
601 number_of_small_timesteps = 1
602 ELSE IF (rk_step == 2) THEN
605 number_of_small_timesteps = num_sound_steps/2
609 number_of_small_timesteps = num_sound_steps
614 write(wrf_err_message,*)' unknown solver, error exit for dynamics_option = ',dynamics_option
615 CALL wrf_error_fatal( wrf_err_message )
619 ! Ensure that polar meridional velocity is zero
620 IF (config_flags%polar) THEN
623 DO ij = 1 , grid%num_tiles
624 CALL zero_pole ( grid%v_1, &
625 ids, ide, jds, jde, kds, kde, &
626 ims, ime, jms, jme, kms, kme, &
627 grid%i_start(ij), grid%i_end(ij), &
628 grid%j_start(ij), grid%j_end(ij), &
630 CALL zero_pole ( grid%v_2, &
631 ids, ide, jds, jde, kds, kde, &
632 ims, ime, jms, jme, kms, kme, &
633 grid%i_start(ij), grid%i_end(ij), &
634 grid%j_start(ij), grid%j_end(ij), &
637 !$OMP END PARALLEL DO
640 ! Time level t is in the *_2 variable in the first part
641 ! of the step, and in the *_1 variable after the predictor.
642 ! the latest predicted values are stored in the *_2 variables.
644 CALL wrf_debug ( 200 , ' call rk_step_prep ' )
646 BENCH_START(step_prep_tim)
650 DO ij = 1 , grid%num_tiles
652 CALL rk_step_prep ( config_flags, rk_step, &
653 grid%u_2, grid%v_2, grid%w_2, grid%t_2, grid%ph_2, grid%mu_2, &
654 grid%c1h, grid%c2h, grid%c1f, grid%c2f, moist, &
655 grid%ru, grid%rv, grid%rw, grid%ww, grid%php, grid%alt, grid%muu, grid%muv, &
656 grid%mub, grid%mut, grid%phb, grid%pb, grid%p, grid%al, grid%alb, &
658 grid%msfux, grid%msfuy, grid%msfvx, grid%msfvx_inv, &
659 grid%msfvy, grid%msftx, grid%msfty, &
660 grid%fnm, grid%fnp, grid%dnw, grid%rdx, grid%rdy, &
662 ids, ide, jds, jde, kds, kde, &
663 ims, ime, jms, jme, kms, kme, &
664 grid%i_start(ij), grid%i_end(ij), &
665 grid%j_start(ij), grid%j_end(ij), &
669 !$OMP END PARALLEL DO
670 BENCH_END(step_prep_tim)
673 !-----------------------------------------------------------------------
674 ! Stencils for patch communications (WCS, 29 June 2001)
675 ! Note: the small size of this halo exchange reflects the
676 ! fact that we are carrying the uncoupled variables
677 ! as state variables in the mass coordinate model, as
678 ! opposed to the coupled variables as in the height
683 ! * + * * + * * * + * *
687 ! 3D variables - note staggering! ru(X), rv(Y), ww(Z), php(Z)
697 ! the following are 2D (xy) variables
702 !--------------------------------------------------------------
703 # include "HALO_EM_A.inc"
706 ! set boundary conditions on variables
707 ! from big_step_prep for use in big_step_proc
710 # include "PERIOD_BDY_EM_A.inc"
713 BENCH_START(set_phys_bc_tim)
715 !$OMP PRIVATE ( ij, ii, jj, kk )
717 DO ij = 1 , grid%num_tiles
719 CALL wrf_debug ( 200 , ' call rk_phys_bc_dry_1' )
721 CALL rk_phys_bc_dry_1( config_flags, grid%ru, grid%rv, grid%rw, grid%ww, &
722 grid%muu, grid%muv, grid%mut, grid%php, grid%alt, grid%p, &
723 ids, ide, jds, jde, kds, kde, &
724 ims, ime, jms, jme, kms, kme, &
725 ips, ipe, jps, jpe, kps, kpe, &
726 grid%i_start(ij), grid%i_end(ij), &
727 grid%j_start(ij), grid%j_end(ij), &
729 CALL set_physical_bc3d( grid%rho, 'p', config_flags, &
730 ids, ide, jds, jde, kds, kde, &
731 ims, ime, jms, jme, kms, kme, &
732 ips, ipe, jps, jpe, kps, kpe, &
733 grid%i_start(ij), grid%i_end(ij), &
734 grid%j_start(ij), grid%j_end(ij), &
736 CALL set_physical_bc3d( grid%al, 'p', config_flags, &
737 ids, ide, jds, jde, kds, kde, &
738 ims, ime, jms, jme, kms, kme, &
739 ips, ipe, jps, jpe, kps, kpe, &
740 grid%i_start(ij), grid%i_end(ij), &
741 grid%j_start(ij), grid%j_end(ij), &
743 CALL set_physical_bc3d( grid%ph_2, 'w', config_flags, &
744 ids, ide, jds, jde, kds, kde, &
745 ims, ime, jms, jme, kms, kme, &
746 ips, ipe, jps, jpe, kps, kpe, &
747 grid%i_start(ij), grid%i_end(ij), &
748 grid%j_start(ij), grid%j_end(ij), &
751 IF (config_flags%polar) THEN
753 !-------------------------------------------------------
754 ! lat-lon grid pole-point (v) specification (extrapolate v, rv to the pole)
755 !-------------------------------------------------------
757 CALL pole_point_bc ( grid%v_1, &
758 ids, ide, jds, jde, kds, kde, &
759 ims, ime, jms, jme, kms, kme, &
760 grid%i_start(ij), grid%i_end(ij), &
761 grid%j_start(ij), grid%j_end(ij), &
764 CALL pole_point_bc ( grid%v_2, &
765 ids, ide, jds, jde, kds, kde, &
766 ims, ime, jms, jme, kms, kme, &
767 grid%i_start(ij), grid%i_end(ij), &
768 grid%j_start(ij), grid%j_end(ij), &
771 !-------------------------------------------------------
772 ! end lat-lon grid pole-point (v) specification
773 !-------------------------------------------------------
777 !$OMP END PARALLEL DO
778 BENCH_END(set_phys_bc_tim)
780 rk_step_is_one : IF (rk_step == 1) THEN ! only need to initialize diffusion tendencies
782 BENCH_START(calc_p_rho_tim)
786 !(2) The non-timesplit physics begins with a call to "phy_prep"
787 ! (which computes some diagnostic variables such as temperature,
788 ! pressure, u and v at p points, etc). This is followed by
789 ! calls to the physics drivers:
800 IF (coupler_on) CALL cpl_settime( curr_secs2 )
802 CALL first_rk_step_part1 ( grid, config_flags &
803 , moist , moist_tend &
805 , tracer, tracer_tend &
806 , scalar , scalar_tend &
809 , ru_tendf, rv_tendf &
810 , rw_tendf, t_tendf &
811 , ph_tendf, mu_tendf &
813 , config_flags%use_adaptive_time_step &
815 , psim , psih , gz1oz0 &
817 , cu_act_flag , hol , th_phy &
818 , pi_phy , p_phy , grid%t_phy &
820 , ids, ide, jds, jde, kds, kde &
821 , ims, ime, jms, jme, kms, kme &
822 , ips, ipe, jps, jpe, kps, kpe &
823 , imsx, imex, jmsx, jmex, kmsx, kmex &
824 , ipsx, ipex, jpsx, jpex, kpsx, kpex &
825 , imsy, imey, jmsy, jmey, kmsy, kmey &
826 , ipsy, ipey, jpsy, jpey, kpsy, kpey &
830 , restart_flag=restart_flag &
831 , feedback_is_ready=feedback_is_ready &
835 IF ( config_flags%bl_pbl_physics == MYNNPBLSCHEME2 .OR. &
836 config_flags%bl_pbl_physics == MYNNPBLSCHEME3 ) THEN
837 # include "HALO_EM_SCALAR_E_5.inc"
841 CALL first_rk_step_part2 ( grid, config_flags &
842 , moist , moist_old , moist_tend &
844 , tracer, tracer_tend &
845 , scalar , scalar_tend &
847 , ru_tendf, rv_tendf &
848 , rw_tendf, t_tendf &
849 , ph_tendf, mu_tendf &
851 , adapt_step_flag , curr_secs &
852 , psim , psih , gz1oz0 &
854 , cu_act_flag , hol , th_phy &
855 , pi_phy , p_phy , grid%t_phy &
857 , nba_mij, num_nba_mij & !JDM
858 , nba_rij, num_nba_rij & !JDM
859 , ids, ide, jds, jde, kds, kde &
860 , ims, ime, jms, jme, kms, kme &
861 , ips, ipe, jps, jpe, kps, kpe &
862 , imsx, imex, jmsx, jmex, kmsx, kmex &
863 , ipsx, ipex, jpsx, jpex, kpsx, kpex &
864 , imsy, imey, jmsy, jmey, kmsy, kmey &
865 , ipsy, ipey, jpsy, jpey, kpsy, kpey &
869 END IF rk_step_is_one
871 BENCH_START(rk_tend_tim)
874 DO ij = 1 , grid%num_tiles
876 CALL wrf_debug ( 200 , ' call rk_tendency' )
877 CALL rk_tendency ( config_flags, rk_step &
878 ,grid%ru_tend, grid%rv_tend, rw_tend, ph_tend, t_tend &
879 ,ru_tendf, rv_tendf, rw_tendf, ph_tendf, t_tendf &
880 ,mu_tend, grid%u_save, grid%v_save, w_save, ph_save &
881 ,grid%t_save, mu_save, grid%rthften &
882 ,grid%ru, grid%rv, grid%rw, grid%ww, wwE, wwI &
883 ,grid%u_2, grid%v_2, grid%w_2, grid%t_2, grid%ph_2 &
884 ,grid%u_1, grid%v_1, grid%w_1, grid%t_1, grid%ph_1 &
885 ,grid%h_diabatic, grid%phb, grid%t_init &
886 ,grid%mu_1, grid%mu_2, grid%mut, grid%muu, grid%muv, grid%mub &
887 ,grid%c1h, grid%c2h, grid%c1f, grid%c2f &
888 ,grid%al, grid%ht, grid%alt, grid%p, grid%pb, grid%php, cqu, cqv, cqw &
889 ,grid%u_base, grid%v_base, grid%t_base, grid%qv_base, grid%z_base &
890 ,grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv &
891 ,grid%msfvy, grid%msftx,grid%msfty, grid%clat, grid%f, grid%e, grid%sina, grid%cosa &
892 ,grid%fnm, grid%fnp, grid%rdn, grid%rdnw &
893 ,grid%dt, grid%rdx, grid%rdy, grid%khdif, grid%kvdif, grid%xkmh, grid%xkhh &
894 ,grid%diff_6th_opt, grid%diff_6th_factor &
895 ,config_flags%momentum_adv_opt &
896 ,grid%dampcoef,grid%zdamp,config_flags%damp_opt,config_flags%rad_nudge &
897 ,grid%cf1, grid%cf2, grid%cf3, grid%cfn, grid%cfn1, num_3d_m &
898 ,config_flags%non_hydrostatic, config_flags%top_lid &
899 ,grid%u_frame, grid%v_frame &
900 ,ids, ide, jds, jde, kds, kde &
901 ,ims, ime, jms, jme, kms, kme &
902 ,grid%i_start(ij), grid%i_end(ij) &
903 ,grid%j_start(ij), grid%j_end(ij) &
905 ,max_vert_cfl_tmp(ij), max_horiz_cfl_tmp(ij) )
907 !$OMP END PARALLEL DO
908 BENCH_END(rk_tend_tim)
910 IF (config_flags%use_adaptive_time_step) THEN
911 DO ij = 1 , grid%num_tiles
912 IF (max_horiz_cfl_tmp(ij) .GT. grid%max_horiz_cfl) THEN
913 grid%max_horiz_cfl = max_horiz_cfl_tmp(ij)
915 IF (max_vert_cfl_tmp(ij) .GT. grid%max_vert_cfl) THEN
916 grid%max_vert_cfl = max_vert_cfl_tmp(ij)
920 IF (grid%max_horiz_cfl .GT. grid%max_cfl_val) THEN
921 grid%max_cfl_val = grid%max_horiz_cfl
923 IF (grid%max_vert_cfl .GT. grid%max_cfl_val) THEN
924 grid%max_cfl_val = grid%max_vert_cfl
928 BENCH_START(relax_bdy_dry_tim)
931 DO ij = 1 , grid%num_tiles
933 IF ( (config_flags%specified .or. config_flags%nested) .and. ( rk_step == 1 ) ) THEN
935 CALL relax_bdy_dry ( config_flags, &
936 grid%u_save, grid%v_save, ph_save, grid%t_save, &
937 w_save, mu_tend, grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
938 grid%ru, grid%rv, grid%ph_2, grid%t_2, &
939 grid%w_2, grid%mu_2, grid%mut, &
940 grid%u_bxs,grid%u_bxe,grid%u_bys,grid%u_bye, &
941 grid%v_bxs,grid%v_bxe,grid%v_bys,grid%v_bye, &
942 grid%ph_bxs,grid%ph_bxe,grid%ph_bys,grid%ph_bye, &
943 grid%t_bxs,grid%t_bxe,grid%t_bys,grid%t_bye, &
944 grid%w_bxs,grid%w_bxe,grid%w_bys,grid%w_bye, &
945 grid%mu_bxs,grid%mu_bxe,grid%mu_bys,grid%mu_bye, &
946 grid%u_btxs,grid%u_btxe,grid%u_btys,grid%u_btye, &
947 grid%v_btxs,grid%v_btxe,grid%v_btys,grid%v_btye, &
948 grid%ph_btxs,grid%ph_btxe,grid%ph_btys,grid%ph_btye, &
949 grid%t_btxs,grid%t_btxe,grid%t_btys,grid%t_btye, &
950 grid%w_btxs,grid%w_btxe,grid%w_btys,grid%w_btye, &
951 grid%mu_btxs,grid%mu_btxe,grid%mu_btys,grid%mu_btye, &
952 config_flags%spec_bdy_width, grid%spec_zone, grid%relax_zone, &
953 grid%dtbc, grid%fcx, grid%gcx, &
954 ids,ide, jds,jde, kds,kde, &
955 ims,ime, jms,jme, kms,kme, &
956 ips,ipe, jps,jpe, kps,kpe, &
957 grid%i_start(ij), grid%i_end(ij), &
958 grid%j_start(ij), grid%j_end(ij), &
963 CALL rk_addtend_dry( grid%ru_tend, grid%rv_tend, rw_tend, ph_tend, t_tend, &
964 ru_tendf, rv_tendf, rw_tendf, ph_tendf, t_tendf, &
965 grid%u_save, grid%v_save, w_save, ph_save, grid%t_save, &
966 mu_tend, mu_tendf, rk_step, &
967 grid%c1h, grid%c2h, &
968 grid%h_diabatic, grid%mut, grid%msftx, &
969 grid%msfty, grid%msfux,grid%msfuy, &
970 grid%msfvx, grid%msfvx_inv, grid%msfvy, &
971 ids,ide, jds,jde, kds,kde, &
972 ims,ime, jms,jme, kms,kme, &
973 ips,ipe, jps,jpe, kps,kpe, &
974 grid%i_start(ij), grid%i_end(ij), &
975 grid%j_start(ij), grid%j_end(ij), &
978 IF( config_flags%specified .or. config_flags%nested ) THEN
979 CALL spec_bdy_dry ( config_flags, &
980 grid%ru_tend, grid%rv_tend, ph_tend, t_tend, &
982 grid%u_bxs,grid%u_bxe,grid%u_bys,grid%u_bye, &
983 grid%v_bxs,grid%v_bxe,grid%v_bys,grid%v_bye, &
984 grid%ph_bxs,grid%ph_bxe,grid%ph_bys,grid%ph_bye, &
985 grid%t_bxs,grid%t_bxe,grid%t_bys,grid%t_bye, &
986 grid%w_bxs,grid%w_bxe,grid%w_bys,grid%w_bye, &
987 grid%mu_bxs,grid%mu_bxe,grid%mu_bys,grid%mu_bye, &
988 grid%u_btxs,grid%u_btxe,grid%u_btys,grid%u_btye, &
989 grid%v_btxs,grid%v_btxe,grid%v_btys,grid%v_btye, &
990 grid%ph_btxs,grid%ph_btxe,grid%ph_btys,grid%ph_btye, &
991 grid%t_btxs,grid%t_btxe,grid%t_btys,grid%t_btye, &
992 grid%w_btxs,grid%w_btxe,grid%w_btys,grid%w_btye, &
993 grid%mu_btxs,grid%mu_btxe,grid%mu_btys,grid%mu_btye, &
994 config_flags%spec_bdy_width, grid%spec_zone, &
995 ids,ide, jds,jde, kds,kde, & ! domain dims
996 ims,ime, jms,jme, kms,kme, & ! memory dims
997 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
998 grid%i_start(ij), grid%i_end(ij), &
999 grid%j_start(ij), grid%j_end(ij), &
1005 !---------------------------------------------------------------------------------------------
1006 ! KRS 9/12/2012: Inserted new IF block calls to spec_bdy_dry_perturb. If peturb_bdy=1, SKEBS
1007 ! pattern passed in for perturbing the specified boundry conditions. If peturb_bdy=2, user
1008 ! must provide pattern. mu_2, mub, msf* also passed in for coupling needed for tendecies.
1009 !---------------------------------------------------------------------------------------------
1010 IF( config_flags%specified .and. config_flags%perturb_bdy==1 ) THEN
1011 CALL spec_bdy_dry_perturb ( config_flags, &
1012 grid%ru_tend, grid%rv_tend, t_tend, &
1013 grid%mu_2, grid%mub, grid%c1h, grid%c2h, &
1014 grid%msfux, grid%msfvx, grid%msft, &
1015 grid%ru_tendf_stoch, grid%rv_tendf_stoch, grid%rt_tendf_stoch, &
1016 config_flags%spec_bdy_width, grid%spec_zone, &
1017 grid%num_stoch_levels, & ! stoch dims
1018 ids,ide, jds,jde, kds,kde, & ! domain dims
1019 ims,ime, jms,jme, kms,kme, & ! memory dims
1020 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1021 grid%i_start(ij), grid%i_end(ij), &
1022 grid%j_start(ij), grid%j_end(ij), &
1027 IF( config_flags%specified .and. config_flags%perturb_bdy==2 ) THEN
1028 CALL spec_bdy_dry_perturb ( config_flags, &
1029 grid%ru_tend, grid%rv_tend, t_tend, &
1030 grid%mu_2, grid%mub, grid%c1h, grid%c2h, &
1031 grid%msfux, grid%msfvx, grid%msft, &
1032 grid%field_u_tend_perturb, grid%field_v_tend_perturb, grid%field_t_tend_perturb, &
1033 config_flags%spec_bdy_width, grid%spec_zone, &
1034 grid%num_stoch_levels, & ! stoch dims
1035 ids,ide, jds,jde, kds,kde, & ! domain dims
1036 ims,ime, jms,jme, kms,kme, & ! memory dims
1037 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1038 grid%i_start(ij), grid%i_end(ij), &
1039 grid%j_start(ij), grid%j_end(ij), &
1045 !$OMP END PARALLEL DO
1046 BENCH_END(relax_bdy_dry_tim)
1050 ! (3) Small (acoustic,sound) steps.
1052 ! Several acoustic steps are taken each RK pass. A small step
1053 ! sequence begins with calculating perturbation variables
1054 ! and coupling them to the column dry-air-mass mu
1055 ! (call to small_step_prep). This is followed by computing
1056 ! coefficients for the vertically implicit part of the
1057 ! small timestep (call to calc_coef_w).
1059 ! The small steps are taken
1060 ! in the named loop "small_steps:". In the small_steps loop, first
1061 ! the horizontal momentum (u and v) are advanced (call to advance_uv),
1062 ! next mu and theta are advanced (call to advance_mu_t) followed by
1063 ! advancing w and the geopotential (call to advance_w). Diagnostic
1064 ! values for pressure and inverse density are updated at the end of
1067 ! The small-step section ends with the change of the perturbation variables
1068 ! back to full variables (call to small_step_finish).
1072 BENCH_START(small_step_prep_tim)
1074 !$OMP PRIVATE ( ij )
1075 DO ij = 1 , grid%num_tiles
1077 ! Calculate coefficients for the vertically implicit acoustic/gravity wave
1078 ! integration. We only need calculate these for the first pass through -
1079 ! the predictor step. They are reused as is for the corrector step.
1080 ! For third-order RK, we need to recompute these after the first
1081 ! predictor because we may have changed the small timestep -> grid%dts.
1083 CALL wrf_debug ( 200 , ' call small_step_prep ' )
1085 CALL small_step_prep( grid%u_1,grid%u_2,grid%v_1,grid%v_2,grid%w_1,grid%w_2, &
1086 grid%t_1,grid%t_2,grid%ph_1,grid%ph_2, &
1087 grid%mub, grid%mu_1, grid%mu_2, &
1088 grid%muu, grid%muus, grid%muv, grid%muvs, &
1089 grid%mut, grid%muts, grid%mudf, &
1090 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1091 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1092 grid%u_save, grid%v_save, w_save, &
1093 grid%t_save, ph_save, mu_save, &
1095 c2a, grid%pb, grid%p, grid%alt, &
1096 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv, &
1097 grid%msfvy, grid%msftx,grid%msfty, &
1098 grid%rdx, grid%rdy, rk_step, &
1099 ids, ide, jds, jde, kds, kde, &
1100 ims, ime, jms, jme, kms, kme, &
1101 grid%i_start(ij), grid%i_end(ij), &
1102 grid%j_start(ij), grid%j_end(ij), &
1105 CALL calc_p_rho( grid%al, grid%p, grid%ph_2, &
1106 grid%alt, grid%t_2, grid%t_save, c2a, pm1, &
1107 grid%mu_2, grid%muts, &
1108 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1109 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1111 grid%rdnw, grid%dnw, grid%smdiv, &
1112 config_flags%non_hydrostatic, 0, &
1113 ids, ide, jds, jde, kds, kde, &
1114 ims, ime, jms, jme, kms, kme, &
1115 grid%i_start(ij), grid%i_end(ij), &
1116 grid%j_start(ij), grid%j_end(ij), &
1119 IF (config_flags%non_hydrostatic) THEN
1120 CALL calc_coef_w( a,alpha,gamma, &
1122 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1123 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1124 cqw, grid%rdn, grid%rdnw, c2a, &
1125 dts_rk, g, grid%epssm, &
1126 config_flags%top_lid, &
1127 ids, ide, jds, jde, kds, kde, &
1128 ims, ime, jms, jme, kms, kme, &
1129 grid%i_start(ij), grid%i_end(ij), &
1130 grid%j_start(ij), grid%j_end(ij), &
1135 !$OMP END PARALLEL DO
1136 BENCH_END(small_step_prep_tim)
1139 !-----------------------------------------------------------------------
1140 ! Stencils for patch communications (WCS, 29 June 2001)
1141 ! Note: the small size of this halo exchange reflects the
1142 ! fact that we are carrying the uncoupled variables
1143 ! as state variables in the mass coordinate model, as
1144 ! opposed to the coupled variables as in the height
1149 ! * + * * + * * * + * *
1153 ! 3D variables - note staggering! ph_2(Z), u_save(X), v_save(Y)
1163 ! the following are 2D (xy) variables
1171 !--------------------------------------------------------------
1172 # include "HALO_EM_B.inc"
1173 # include "PERIOD_BDY_EM_B.inc"
1176 BENCH_START(set_phys_bc2_tim)
1178 !$OMP PRIVATE ( ij )
1180 DO ij = 1 , grid%num_tiles
1182 CALL set_physical_bc3d( grid%ru_tend, 'u', config_flags, &
1183 ids, ide, jds, jde, kds, kde, &
1184 ims, ime, jms, jme, kms, kme, &
1185 ips, ipe, jps, jpe, kps, kpe, &
1186 grid%i_start(ij), grid%i_end(ij), &
1187 grid%j_start(ij), grid%j_end(ij), &
1190 CALL set_physical_bc3d( grid%rv_tend, 'v', config_flags, &
1191 ids, ide, jds, jde, kds, kde, &
1192 ims, ime, jms, jme, kms, kme, &
1193 ips, ipe, jps, jpe, kps, kpe, &
1194 grid%i_start(ij), grid%i_end(ij), &
1195 grid%j_start(ij), grid%j_end(ij), &
1198 CALL set_physical_bc3d( grid%ph_2, 'w', config_flags, &
1199 ids, ide, jds, jde, kds, kde, &
1200 ims, ime, jms, jme, kms, kme, &
1201 ips, ipe, jps, jpe, kps, kpe, &
1202 grid%i_start(ij), grid%i_end(ij), &
1203 grid%j_start(ij), grid%j_end(ij), &
1206 CALL set_physical_bc3d( grid%al, 'p', config_flags, &
1207 ids, ide, jds, jde, kds, kde, &
1208 ims, ime, jms, jme, kms, kme, &
1209 ips, ipe, jps, jpe, kps, kpe, &
1210 grid%i_start(ij), grid%i_end(ij), &
1211 grid%j_start(ij), grid%j_end(ij), &
1214 CALL set_physical_bc3d( grid%p, 'p', config_flags, &
1215 ids, ide, jds, jde, kds, kde, &
1216 ims, ime, jms, jme, kms, kme, &
1217 ips, ipe, jps, jpe, kps, kpe, &
1218 grid%i_start(ij), grid%i_end(ij), &
1219 grid%j_start(ij), grid%j_end(ij), &
1222 CALL set_physical_bc3d( grid%t_1, 'p', config_flags, &
1223 ids, ide, jds, jde, kds, kde, &
1224 ims, ime, jms, jme, kms, kme, &
1225 ips, ipe, jps, jpe, kps, kpe, &
1226 grid%i_start(ij), grid%i_end(ij), &
1227 grid%j_start(ij), grid%j_end(ij), &
1230 CALL set_physical_bc3d( grid%t_save, 't', config_flags, &
1231 ids, ide, jds, jde, kds, kde, &
1232 ims, ime, jms, jme, kms, kme, &
1233 ips, ipe, jps, jpe, kps, kpe, &
1234 grid%i_start(ij), grid%i_end(ij), &
1235 grid%j_start(ij), grid%j_end(ij), &
1238 CALL set_physical_bc2d( grid%mu_1, 't', config_flags, &
1239 ids, ide, jds, jde, &
1240 ims, ime, jms, jme, &
1241 ips, ipe, jps, jpe, &
1242 grid%i_start(ij), grid%i_end(ij), &
1243 grid%j_start(ij), grid%j_end(ij) )
1245 CALL set_physical_bc2d( grid%mu_2, 't', config_flags, &
1246 ids, ide, jds, jde, &
1247 ims, ime, jms, jme, &
1248 ips, ipe, jps, jpe, &
1249 grid%i_start(ij), grid%i_end(ij), &
1250 grid%j_start(ij), grid%j_end(ij) )
1252 CALL set_physical_bc2d( grid%mudf, 't', config_flags, &
1253 ids, ide, jds, jde, &
1254 ims, ime, jms, jme, &
1255 ips, ipe, jps, jpe, &
1256 grid%i_start(ij), grid%i_end(ij), &
1257 grid%j_start(ij), grid%j_end(ij) )
1260 !$OMP END PARALLEL DO
1261 BENCH_END(set_phys_bc2_tim)
1262 small_steps : DO iteration = 1 , number_of_small_timesteps
1264 ! Boundary condition time (or communication time).
1266 # include "PERIOD_BDY_EM_B.inc"
1270 !$OMP PRIVATE ( ij )
1272 DO ij = 1 , grid%num_tiles
1274 BENCH_START(advance_uv_tim)
1275 CALL advance_uv ( grid%u_2, grid%ru_tend, grid%v_2, grid%rv_tend, &
1277 grid%ph_2, grid%php, grid%alt, grid%al, &
1278 grid%mu_2, grid%muu, cqu, grid%muv, cqv, grid%mudf, &
1279 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1280 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1281 grid%msfux, grid%msfuy, grid%msfvx, &
1282 grid%msfvx_inv, grid%msfvy, &
1283 grid%rdx, grid%rdy, dts_rk, &
1284 grid%cf1, grid%cf2, grid%cf3, grid%fnm, grid%fnp, &
1286 grid%rdnw, config_flags,grid%spec_zone, &
1287 config_flags%non_hydrostatic, config_flags%top_lid, &
1288 ids, ide, jds, jde, kds, kde, &
1289 ims, ime, jms, jme, kms, kme, &
1290 grid%i_start(ij), grid%i_end(ij), &
1291 grid%j_start(ij), grid%j_end(ij), &
1293 BENCH_END(advance_uv_tim)
1296 !$OMP END PARALLEL DO
1298 !-----------------------------------------------------------
1299 ! acoustic integration polar filter for smallstep u, v
1300 !-----------------------------------------------------------
1302 IF (config_flags%polar) THEN
1304 CALL pxft ( grid=grid &
1317 ,actual_distance_average = .FALSE. &
1318 ,pos_def = .FALSE. &
1319 ,swap_pole_with_next_j = .FALSE. &
1320 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
1321 ,fft_filter_lat = config_flags%fft_filter_lat &
1323 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
1324 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
1325 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
1326 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
1327 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
1331 !-----------------------------------------------------------
1332 ! end acoustic integration polar filter for smallstep u, v
1333 !-----------------------------------------------------------
1336 !$OMP PRIVATE ( ij )
1337 DO ij = 1 , grid%num_tiles
1339 BENCH_START(spec_bdy_uv_tim)
1340 IF( config_flags%specified .or. config_flags%nested ) THEN
1341 CALL spec_bdyupdate(grid%u_2, grid%ru_tend, dts_rk, &
1342 'u' , config_flags, &
1344 ids,ide, jds,jde, kds,kde, & ! domain dims
1345 ims,ime, jms,jme, kms,kme, & ! memory dims
1346 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1347 grid%i_start(ij), grid%i_end(ij), &
1348 grid%j_start(ij), grid%j_end(ij), &
1351 CALL spec_bdyupdate(grid%v_2, grid%rv_tend, dts_rk, &
1352 'v' , config_flags, &
1354 ids,ide, jds,jde, kds,kde, & ! domain dims
1355 ims,ime, jms,jme, kms,kme, & ! memory dims
1356 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1357 grid%i_start(ij), grid%i_end(ij), &
1358 grid%j_start(ij), grid%j_end(ij), &
1362 BENCH_END(spec_bdy_uv_tim)
1365 !$OMP END PARALLEL DO
1369 ! Stencils for patch communications (WCS, 29 June 2001)
1378 # include "HALO_EM_C.inc"
1382 !$OMP PRIVATE ( ij )
1383 DO ij = 1 , grid%num_tiles
1385 ! advance the mass in the column, theta, and calculate ww
1387 BENCH_START(advance_mu_t_tim)
1388 CALL advance_mu_t( grid%ww, ww1, grid%u_2, grid%u_save, grid%v_2, grid%v_save, &
1389 grid%mu_2, grid%mut, muave, grid%muts, grid%muu, grid%muv, &
1391 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1392 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1393 grid%ru_m, grid%rv_m, grid%ww_m, &
1394 grid%t_2, grid%t_save, t_2save, t_tend, &
1396 grid%rdx, grid%rdy, dts_rk, grid%epssm, &
1397 grid%dnw, grid%fnm, grid%fnp, grid%rdnw, &
1398 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv, &
1399 grid%msfvy, grid%msftx,grid%msfty, &
1400 iteration, config_flags, &
1401 ids, ide, jds, jde, kds, kde, &
1402 ims, ime, jms, jme, kms, kme, &
1403 grid%i_start(ij), grid%i_end(ij), &
1404 grid%j_start(ij), grid%j_end(ij), &
1406 BENCH_END(advance_mu_t_tim)
1408 !$OMP END PARALLEL DO
1410 !-----------------------------------------------------------
1411 ! acoustic integration polar filter for smallstep mu, t
1412 !-----------------------------------------------------------
1414 IF ( (config_flags%polar) ) THEN
1416 CALL pxft ( grid=grid &
1429 ,actual_distance_average = .FALSE. &
1430 ,pos_def = .FALSE. &
1431 ,swap_pole_with_next_j = .FALSE. &
1432 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
1433 ,fft_filter_lat = config_flags%fft_filter_lat &
1435 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
1436 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
1437 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
1438 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
1439 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
1441 grid%muts = grid%mut + grid%mu_2 ! reset muts using filtered mu_2
1445 !-----------------------------------------------------------
1446 ! end acoustic integration polar filter for smallstep mu, t
1447 !-----------------------------------------------------------
1449 BENCH_START(spec_bdy_t_tim)
1452 !$OMP PRIVATE ( ij )
1453 DO ij = 1 , grid%num_tiles
1455 IF( config_flags%specified .or. config_flags%nested ) THEN
1457 CALL spec_bdyupdate(grid%t_2, t_tend, dts_rk, &
1458 't' , config_flags, &
1460 ids,ide, jds,jde, kds,kde, &
1461 ims,ime, jms,jme, kms,kme, &
1462 ips,ipe, jps,jpe, kps,kpe, &
1463 grid%i_start(ij), grid%i_end(ij),&
1464 grid%j_start(ij), grid%j_end(ij),&
1467 CALL spec_bdyupdate(grid%mu_2, mu_tend, dts_rk, &
1468 'm' , config_flags, &
1470 ids,ide, jds,jde, 1 ,1 , &
1471 ims,ime, jms,jme, 1 ,1 , &
1472 ips,ipe, jps,jpe, 1 ,1 , &
1473 grid%i_start(ij), grid%i_end(ij),&
1474 grid%j_start(ij), grid%j_end(ij),&
1477 CALL spec_bdyupdate(grid%muts, mu_tend, dts_rk, &
1478 'm' , config_flags, &
1480 ids,ide, jds,jde, 1 ,1 , & ! domain dims
1481 ims,ime, jms,jme, 1 ,1 , & ! memory dims
1482 ips,ipe, jps,jpe, 1 ,1 , & ! patch dims
1483 grid%i_start(ij), grid%i_end(ij), &
1484 grid%j_start(ij), grid%j_end(ij), &
1487 BENCH_END(spec_bdy_t_tim)
1489 ! small (acoustic) step for the vertical momentum,
1490 ! density and coupled potential temperature.
1493 BENCH_START(advance_w_tim)
1494 IF ( config_flags%non_hydrostatic ) THEN
1495 CALL advance_w( grid%w_2, rw_tend, grid%ww, w_save, &
1496 grid%u_2, grid%v_2, &
1497 grid%mu_2, grid%mut, muave, grid%muts, &
1498 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1499 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1500 t_2save, grid%t_2, grid%t_save, &
1501 grid%ph_2, ph_save, grid%phb, ph_tend, &
1502 grid%ht, c2a, cqw, grid%alt, grid%alb, &
1504 grid%rdx, grid%rdy, dts_rk, t0, grid%epssm, &
1505 grid%dnw, grid%fnm, grid%fnp, grid%rdnw, &
1506 grid%rdn, grid%cf1, grid%cf2, grid%cf3, &
1507 grid%msftx, grid%msfty, &
1508 config_flags, config_flags%top_lid, &
1509 ids,ide, jds,jde, kds,kde, &
1510 ims,ime, jms,jme, kms,kme, &
1511 grid%i_start(ij), grid%i_end(ij), &
1512 grid%j_start(ij), grid%j_end(ij), &
1515 BENCH_END(advance_w_tim)
1518 !$OMP END PARALLEL DO
1520 !-----------------------------------------------------------
1521 ! acoustic integration polar filter for smallstep w, geopotential
1522 !-----------------------------------------------------------
1524 IF ( (config_flags%polar) .AND. (config_flags%non_hydrostatic) ) THEN
1526 CALL pxft ( grid=grid &
1539 ,actual_distance_average = .FALSE. &
1540 ,pos_def = .FALSE. &
1541 ,swap_pole_with_next_j = .FALSE. &
1542 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
1543 ,fft_filter_lat = config_flags%fft_filter_lat &
1545 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
1546 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
1547 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
1548 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
1549 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
1553 !-----------------------------------------------------------
1554 ! end acoustic integration polar filter for smallstep w, geopotential
1555 !-----------------------------------------------------------
1558 !$OMP PRIVATE ( ij )
1559 DO ij = 1 , grid%num_tiles
1561 BENCH_START(sumflux_tim)
1562 CALL sumflux ( grid%u_2, grid%v_2, grid%ww, &
1563 grid%u_save, grid%v_save, ww1, &
1564 grid%muu, grid%muv, &
1565 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1566 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1567 grid%ru_m, grid%rv_m, grid%ww_m, grid%epssm, &
1568 grid%msfux, grid% msfuy, grid%msfvx, &
1569 grid%msfvx_inv, grid%msfvy, &
1570 iteration, number_of_small_timesteps, &
1571 ids, ide, jds, jde, kds, kde, &
1572 ims, ime, jms, jme, kms, kme, &
1573 grid%i_start(ij), grid%i_end(ij), &
1574 grid%j_start(ij), grid%j_end(ij), &
1576 BENCH_END(sumflux_tim)
1578 IF( config_flags%specified .or. config_flags%nested ) THEN
1580 BENCH_START(spec_bdynhyd_tim)
1581 IF (config_flags%non_hydrostatic) THEN
1582 CALL spec_bdyupdate_ph( ph_save, grid%ph_2, ph_tend, &
1583 mu_tend, grid%muts, &
1584 grid%c1f, grid%c2f, dts_rk, &
1585 'h' , config_flags, &
1587 ids,ide, jds,jde, kds,kde, &
1588 ims,ime, jms,jme, kms,kme, &
1589 ips,ipe, jps,jpe, kps,kpe, &
1590 grid%i_start(ij), grid%i_end(ij),&
1591 grid%j_start(ij), grid%j_end(ij),&
1593 IF( config_flags%specified ) THEN
1594 CALL zero_grad_bdy ( grid%w_2, &
1595 'w' , config_flags, &
1597 ids,ide, jds,jde, kds,kde, &
1598 ims,ime, jms,jme, kms,kme, &
1599 ips,ipe, jps,jpe, kps,kpe, &
1600 grid%i_start(ij), grid%i_end(ij), &
1601 grid%j_start(ij), grid%j_end(ij), &
1604 CALL spec_bdyupdate ( grid%w_2, rw_tend, dts_rk, &
1605 'h' , config_flags, &
1607 ids,ide, jds,jde, kds,kde, &
1608 ims,ime, jms,jme, kms,kme, &
1609 ips,ipe, jps,jpe, kps,kpe, &
1610 grid%i_start(ij), grid%i_end(ij),&
1611 grid%j_start(ij), grid%j_end(ij),&
1615 BENCH_END(spec_bdynhyd_tim)
1618 BENCH_START(cald_p_rho_tim)
1619 CALL calc_p_rho( grid%al, grid%p, grid%ph_2, &
1620 grid%alt, grid%t_2, grid%t_save, c2a, pm1, &
1621 grid%mu_2, grid%muts, &
1622 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1623 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1625 grid%rdnw, grid%dnw, grid%smdiv, &
1626 config_flags%non_hydrostatic, iteration, &
1627 ids, ide, jds, jde, kds, kde, &
1628 ims, ime, jms, jme, kms, kme, &
1629 grid%i_start(ij), grid%i_end(ij), &
1630 grid%j_start(ij), grid%j_end(ij), &
1632 BENCH_END(cald_p_rho_tim)
1635 !$OMP END PARALLEL DO
1639 ! Stencils for patch communications (WCS, 29 June 2001)
1649 ! 2D variables (x,y)
1655 # include "HALO_EM_C2.inc"
1656 # include "PERIOD_BDY_EM_B3.inc"
1659 BENCH_START(phys_bc_tim)
1661 !$OMP PRIVATE ( ij )
1662 DO ij = 1 , grid%num_tiles
1664 ! boundary condition set for next small timestep
1666 CALL set_physical_bc3d( grid%ph_2, 'w', config_flags, &
1667 ids, ide, jds, jde, kds, kde, &
1668 ims, ime, jms, jme, kms, kme, &
1669 ips, ipe, jps, jpe, kps, kpe, &
1670 grid%i_start(ij), grid%i_end(ij), &
1671 grid%j_start(ij), grid%j_end(ij), &
1674 CALL set_physical_bc3d( grid%al, 'p', config_flags, &
1675 ids, ide, jds, jde, kds, kde, &
1676 ims, ime, jms, jme, kms, kme, &
1677 ips, ipe, jps, jpe, kps, kpe, &
1678 grid%i_start(ij), grid%i_end(ij), &
1679 grid%j_start(ij), grid%j_end(ij), &
1682 CALL set_physical_bc3d( grid%p, 'p', config_flags, &
1683 ids, ide, jds, jde, kds, kde, &
1684 ims, ime, jms, jme, kms, kme, &
1685 ips, ipe, jps, jpe, kps, kpe, &
1686 grid%i_start(ij), grid%i_end(ij), &
1687 grid%j_start(ij), grid%j_end(ij), &
1690 CALL set_physical_bc2d( grid%muts, 't', config_flags, &
1691 ids, ide, jds, jde, &
1692 ims, ime, jms, jme, &
1693 ips, ipe, jps, jpe, &
1694 grid%i_start(ij), grid%i_end(ij), &
1695 grid%j_start(ij), grid%j_end(ij) )
1697 CALL set_physical_bc2d( grid%mu_2, 't', config_flags, &
1698 ids, ide, jds, jde, &
1699 ims, ime, jms, jme, &
1700 ips, ipe, jps, jpe, &
1701 grid%i_start(ij), grid%i_end(ij), &
1702 grid%j_start(ij), grid%j_end(ij) )
1704 CALL set_physical_bc2d( grid%mudf, 't', config_flags, &
1705 ids, ide, jds, jde, &
1706 ims, ime, jms, jme, &
1707 ips, ipe, jps, jpe, &
1708 grid%i_start(ij), grid%i_end(ij), &
1709 grid%j_start(ij), grid%j_end(ij) )
1712 !$OMP END PARALLEL DO
1713 BENCH_END(phys_bc_tim)
1718 !$OMP PRIVATE ( ij )
1719 DO ij = 1 , grid%num_tiles
1721 CALL wrf_debug ( 200 , ' call rk_small_finish' )
1723 ! change time-perturbation variables back to
1724 ! full perturbation variables.
1725 ! first get updated mu at u and v points
1727 BENCH_START(calc_mu_uv_tim)
1728 CALL calc_mu_uv_1 ( config_flags, &
1729 grid%muts, grid%muus, grid%muvs, &
1730 ids, ide, jds, jde, kds, kde, &
1731 ims, ime, jms, jme, kms, kme, &
1732 grid%i_start(ij), grid%i_end(ij), &
1733 grid%j_start(ij), grid%j_end(ij), &
1735 BENCH_END(calc_mu_uv_tim)
1736 BENCH_START(small_step_finish_tim)
1737 CALL small_step_finish( grid%u_2, grid%u_1, grid%v_2, grid%v_1, grid%w_2, grid%w_1, &
1738 grid%t_2, grid%t_1, grid%ph_2, grid%ph_1, grid%ww, ww1, &
1739 grid%mu_2, grid%mu_1, &
1740 grid%mut, grid%muts, grid%muu, grid%muus, grid%muv, grid%muvs, &
1741 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
1742 grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
1743 grid%u_save, grid%v_save, w_save, &
1744 grid%t_save, ph_save, mu_save, &
1745 grid%msfux,grid%msfuy, grid%msfvx,grid%msfvy, grid%msftx,grid%msfty, &
1747 number_of_small_timesteps,dts_rk, &
1748 rk_step, rk_order, &
1749 ids, ide, jds, jde, kds, kde, &
1750 ims, ime, jms, jme, kms, kme, &
1751 grid%i_start(ij), grid%i_end(ij), &
1752 grid%j_start(ij), grid%j_end(ij), &
1754 ! call to set ru_m, rv_m and ww_m b.c's for PD advection
1756 IF (rk_step == rk_order) THEN
1758 CALL set_physical_bc3d( grid%ru_m, 'u', config_flags, &
1759 ids, ide, jds, jde, kds, kde, &
1760 ims, ime, jms, jme, kms, kme, &
1761 ips, ipe, jps, jpe, kps, kpe, &
1762 grid%i_start(ij), grid%i_end(ij), &
1763 grid%j_start(ij), grid%j_end(ij), &
1766 CALL set_physical_bc3d( grid%rv_m, 'v', config_flags, &
1767 ids, ide, jds, jde, kds, kde, &
1768 ims, ime, jms, jme, kms, kme, &
1769 ips, ipe, jps, jpe, kps, kpe, &
1770 grid%i_start(ij), grid%i_end(ij), &
1771 grid%j_start(ij), grid%j_end(ij), &
1774 CALL set_physical_bc3d( grid%ww_m, 'w', config_flags, &
1775 ids, ide, jds, jde, kds, kde, &
1776 ims, ime, jms, jme, kms, kme, &
1777 ips, ipe, jps, jpe, kps, kpe, &
1778 grid%i_start(ij), grid%i_end(ij), &
1779 grid%j_start(ij), grid%j_end(ij), &
1782 CALL set_physical_bc2d( grid%mut, 't', config_flags, &
1783 ids, ide, jds, jde, &
1784 ims, ime, jms, jme, &
1785 ips, ipe, jps, jpe, &
1786 grid%i_start(ij), grid%i_end(ij), &
1787 grid%j_start(ij), grid%j_end(ij) )
1789 CALL set_physical_bc2d( grid%muts, 't', config_flags, &
1790 ids, ide, jds, jde, &
1791 ims, ime, jms, jme, &
1792 ips, ipe, jps, jpe, &
1793 grid%i_start(ij), grid%i_end(ij), &
1794 grid%j_start(ij), grid%j_end(ij) )
1798 BENCH_END(small_step_finish_tim)
1801 !$OMP END PARALLEL DO
1803 !-----------------------------------------------------------
1804 ! polar filter for full dynamics variables and time-averaged mass fluxes
1805 !-----------------------------------------------------------
1807 IF (config_flags%polar) THEN
1809 CALL pxft ( grid=grid &
1822 ,actual_distance_average = .FALSE. &
1823 ,pos_def = .FALSE. &
1824 ,swap_pole_with_next_j = .FALSE. &
1825 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
1826 ,fft_filter_lat = config_flags%fft_filter_lat &
1828 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
1829 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
1830 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
1831 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
1832 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
1836 !-----------------------------------------------------------
1837 ! end polar filter for full dynamics variables and time-averaged mass fluxes
1838 !-----------------------------------------------------------
1840 !-----------------------------------------------------------------------
1841 ! add in physics tendency first if positive definite advection is used.
1842 ! pd advection applies advective flux limiter on last runge-kutta step
1843 !-----------------------------------------------------------------------
1846 IF ((config_flags%moist_adv_opt /= ORIGINAL .and. config_flags%moist_adv_opt /= WENO_SCALAR) .and. &
1847 (rk_step == rk_order)) THEN
1850 !$OMP PRIVATE ( ij )
1851 DO ij = 1 , grid%num_tiles
1852 CALL wrf_debug ( 200 , ' call rk_update_scalar_pd' )
1853 DO im = PARAM_FIRST_SCALAR, num_3d_m
1854 CALL rk_update_scalar_pd( im, im, &
1855 moist_old(ims,kms,jms,im), &
1856 moist_tend(ims,kms,jms,im), &
1857 grid%c1h, grid%c2h, &
1858 grid%mu_1, grid%mu_1, grid%mub, &
1859 rk_step, dt_rk, grid%spec_zone, &
1861 ids, ide, jds, jde, kds, kde, &
1862 ims, ime, jms, jme, kms, kme, &
1863 grid%i_start(ij), grid%i_end(ij), &
1864 grid%j_start(ij), grid%j_end(ij), &
1868 !$OMP END PARALLEL DO
1870 !---------------------- positive definite bc call
1872 IF (config_flags%moist_adv_opt /= ORIGINAL .and. config_flags%moist_adv_opt /= WENO_SCALAR) THEN
1873 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
1874 # include "HALO_EM_MOIST_OLD_E_5.inc"
1875 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
1876 # include "HALO_EM_MOIST_OLD_E_7.inc"
1878 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
1879 CALL wrf_error_fatal(TRIM(wrf_err_message))
1885 # include "PERIOD_BDY_EM_MOIST_OLD.inc"
1889 !$OMP PRIVATE ( ij )
1890 DO ij = 1 , grid%num_tiles
1891 IF (num_3d_m >= PARAM_FIRST_SCALAR) THEN
1892 DO im = PARAM_FIRST_SCALAR , num_3d_m
1893 CALL set_physical_bc3d( moist_old(ims,kms,jms,im), 'p', config_flags, &
1894 ids, ide, jds, jde, kds, kde, &
1895 ims, ime, jms, jme, kms, kme, &
1896 ips, ipe, jps, jpe, kps, kpe, &
1897 grid%i_start(ij), grid%i_end(ij), &
1898 grid%j_start(ij), grid%j_end(ij), &
1903 !$OMP END PARALLEL DO
1905 END IF ! end if for moist_adv_opt
1909 IF ((config_flags%scalar_adv_opt /= ORIGINAL .and. config_flags%scalar_adv_opt /= WENO_SCALAR) .and. &
1910 (rk_step == rk_order)) THEN
1913 !$OMP PRIVATE ( ij )
1914 DO ij = 1 , grid%num_tiles
1915 CALL wrf_debug ( 200 , ' call rk_update_scalar_pd' )
1916 DO im = PARAM_FIRST_SCALAR, num_3d_s
1917 CALL rk_update_scalar_pd( im, im, &
1918 scalar_old(ims,kms,jms,im), &
1919 scalar_tend(ims,kms,jms,im), &
1920 grid%c1h, grid%c2h, &
1921 grid%mu_1, grid%mu_1, grid%mub, &
1922 rk_step, dt_rk, grid%spec_zone, &
1924 ids, ide, jds, jde, kds, kde, &
1925 ims, ime, jms, jme, kms, kme, &
1926 grid%i_start(ij), grid%i_end(ij), &
1927 grid%j_start(ij), grid%j_end(ij), &
1931 !$OMP END PARALLEL DO
1933 !---------------------- positive definite bc call
1935 IF (config_flags%scalar_adv_opt /= ORIGINAL .and. config_flags%scalar_adv_opt /= WENO_SCALAR) THEN
1937 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
1938 # include "HALO_EM_SCALAR_OLD_E_5.inc"
1939 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
1940 # include "HALO_EM_SCALAR_OLD_E_7.inc"
1942 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
1943 CALL wrf_error_fatal(TRIM(wrf_err_message))
1946 WRITE(wrf_err_message,*)'cannot use pd scheme with RSL - use RSL-LITE'
1947 CALL wrf_error_fatal(TRIM(wrf_err_message))
1953 # include "PERIOD_BDY_EM_SCALAR_OLD.inc"
1956 !$OMP PRIVATE ( ij )
1958 DO ij = 1 , grid%num_tiles
1959 IF (num_3d_s >= PARAM_FIRST_SCALAR) THEN
1960 DO im = PARAM_FIRST_SCALAR , num_3d_s
1961 CALL set_physical_bc3d( scalar_old(ims,kms,jms,im), 'p', config_flags, &
1962 ids, ide, jds, jde, kds, kde, &
1963 ims, ime, jms, jme, kms, kme, &
1964 ips, ipe, jps, jpe, kps, kpe, &
1965 grid%i_start(ij), grid%i_end(ij), &
1966 grid%j_start(ij), grid%j_end(ij), &
1971 !$OMP END PARALLEL DO
1973 END IF ! end if for scalar_adv_opt
1977 IF ((config_flags%chem_adv_opt /= ORIGINAL .and. config_flags%chem_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order)) THEN
1980 !$OMP PRIVATE ( ij )
1981 DO ij = 1 , grid%num_tiles
1982 CALL wrf_debug ( 200 , ' call rk_update_scalar_pd' )
1983 DO im = PARAM_FIRST_SCALAR, num_3d_c
1984 CALL rk_update_scalar_pd( im, im, &
1985 chem_old(ims,kms,jms,im), &
1986 chem_tend(ims,kms,jms,im), &
1987 grid%c1h, grid%c2h, &
1988 grid%mu_1, grid%mu_1, grid%mub, &
1989 rk_step, dt_rk, grid%spec_zone, &
1991 ids, ide, jds, jde, kds, kde, &
1992 ims, ime, jms, jme, kms, kme, &
1993 grid%i_start(ij), grid%i_end(ij), &
1994 grid%j_start(ij), grid%j_end(ij), &
1998 !$OMP END PARALLEL DO
2000 !---------------------- positive definite bc call
2002 IF (config_flags%chem_adv_opt /= ORIGINAL .and. config_flags%chem_adv_opt /= WENO_SCALAR) THEN
2003 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
2004 # include "HALO_EM_CHEM_OLD_E_5.inc"
2005 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
2006 # include "HALO_EM_CHEM_OLD_E_7.inc"
2008 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
2009 CALL wrf_error_fatal(TRIM(wrf_err_message))
2015 # include "PERIOD_BDY_EM_CHEM_OLD.inc"
2019 !$OMP PRIVATE ( ij )
2020 DO ij = 1 , grid%num_tiles
2021 IF (num_3d_c >= PARAM_FIRST_SCALAR) THEN
2022 DO im = PARAM_FIRST_SCALAR , num_3d_c
2023 CALL set_physical_bc3d( chem_old(ims,kms,jms,im), 'p', config_flags, &
2024 ids, ide, jds, jde, kds, kde, &
2025 ims, ime, jms, jme, kms, kme, &
2026 ips, ipe, jps, jpe, kps, kpe, &
2027 grid%i_start(ij), grid%i_end(ij), &
2028 grid%j_start(ij), grid%j_end(ij), &
2033 !$OMP END PARALLEL DO
2035 ENDIF ! end if for chem_adv_opt
2039 IF ((config_flags%tracer_adv_opt /= ORIGINAL .and. config_flags%tracer_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order)) THEN
2042 !$OMP PRIVATE ( ij )
2043 DO ij = 1 , grid%num_tiles
2044 CALL wrf_debug ( 200 , ' call rk_update_scalar_pd' )
2045 DO im = PARAM_FIRST_SCALAR, num_tracer
2046 CALL rk_update_scalar_pd( im, im, &
2047 tracer_old(ims,kms,jms,im), &
2048 tracer_tend(ims,kms,jms,im), &
2049 grid%c1h, grid%c2h, &
2050 grid%mu_1, grid%mu_1, grid%mub, &
2051 rk_step, dt_rk, grid%spec_zone, &
2053 ids, ide, jds, jde, kds, kde, &
2054 ims, ime, jms, jme, kms, kme, &
2055 grid%i_start(ij), grid%i_end(ij), &
2056 grid%j_start(ij), grid%j_end(ij), &
2060 !$OMP END PARALLEL DO
2062 !---------------------- positive definite bc call
2064 IF (config_flags%tracer_adv_opt /= ORIGINAL .and. config_flags%tracer_adv_opt /= WENO_SCALAR) THEN
2065 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
2066 # include "HALO_EM_TRACER_OLD_E_5.inc"
2067 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
2068 # include "HALO_EM_TRACER_OLD_E_7.inc"
2070 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
2071 CALL wrf_error_fatal(TRIM(wrf_err_message))
2077 # include "PERIOD_BDY_EM_TRACER_OLD.inc"
2081 !$OMP PRIVATE ( ij )
2082 DO ij = 1 , grid%num_tiles
2083 IF (num_tracer >= PARAM_FIRST_SCALAR) THEN
2084 DO im = PARAM_FIRST_SCALAR , num_tracer
2085 CALL set_physical_bc3d( tracer_old(ims,kms,jms,im), 'p', config_flags, &
2086 ids, ide, jds, jde, kds, kde, &
2087 ims, ime, jms, jme, kms, kme, &
2088 ips, ipe, jps, jpe, kps, kpe, &
2089 grid%i_start(ij), grid%i_end(ij), &
2090 grid%j_start(ij), grid%j_end(ij), &
2095 !$OMP END PARALLEL DO
2097 ENDIF ! end if for tracer_adv_opt
2101 IF ((config_flags%tke_adv_opt /= ORIGINAL .and. config_flags%tke_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order) &
2102 .and. (config_flags%km_opt .eq. 2) ) THEN
2105 !$OMP PRIVATE ( ij )
2106 DO ij = 1 , grid%num_tiles
2107 CALL wrf_debug ( 200 , ' call rk_update_scalar_pd' )
2108 CALL rk_update_scalar_pd( 1, 1, &
2110 tke_tend(ims,kms,jms), &
2111 grid%c1h, grid%c2h, &
2112 grid%mu_1, grid%mu_1, grid%mub, &
2113 rk_step, dt_rk, grid%spec_zone, &
2115 ids, ide, jds, jde, kds, kde, &
2116 ims, ime, jms, jme, kms, kme, &
2117 grid%i_start(ij), grid%i_end(ij), &
2118 grid%j_start(ij), grid%j_end(ij), &
2121 !$OMP END PARALLEL DO
2123 !---------------------- positive definite bc call
2125 IF (config_flags%tke_adv_opt /= ORIGINAL .and. config_flags%tke_adv_opt /= WENO_SCALAR) THEN
2126 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
2127 # include "HALO_EM_TKE_OLD_E_5.inc"
2128 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
2129 # include "HALO_EM_TKE_OLD_E_7.inc"
2131 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
2132 CALL wrf_error_fatal(TRIM(wrf_err_message))
2138 # include "PERIOD_BDY_EM_TKE_OLD.inc"
2142 !$OMP PRIVATE ( ij )
2143 DO ij = 1 , grid%num_tiles
2144 CALL set_physical_bc3d( grid%tke_1, 'p', config_flags, &
2145 ids, ide, jds, jde, kds, kde, &
2146 ims, ime, jms, jme, kms, kme, &
2147 ips, ipe, jps, jpe, kps, kpe, &
2148 grid%i_start(ij), grid%i_end(ij), &
2149 grid%j_start(ij), grid%j_end(ij), &
2152 !$OMP END PARALLEL DO
2154 !--- end of positive definite physics tendency update
2156 END IF ! end if for tke_adv_opt
2160 ! Stencils for patch communications (WCS, 29 June 2001)
2173 !--------------------------------------------------------------
2175 # include "HALO_EM_D.inc"
2176 ! WCS addition 11/19/08
2177 # include "PERIOD_EM_DA.inc"
2182 ! (4) Still within the RK loop, the scalar variables are advanced.
2184 ! For the moist and chem variables, each one is advanced
2185 ! individually, using named loops "moist_variable_loop:"
2186 ! and "chem_variable_loop:". Each RK substep begins by
2187 ! calculating the advective tendency, and, for the first RK step,
2188 ! 3D mixing (calling rk_scalar_tend) followed by an update
2189 ! of the scalar (calling rk_update_scalar).
2194 moist_scalar_advance: IF (num_3d_m >= PARAM_FIRST_SCALAR ) THEN
2196 moist_variable_loop: DO im = PARAM_FIRST_SCALAR, num_3d_m
2198 ! adv_moist_cond is set in module_physics_init based on mp_physics choice
2199 ! true except for Ferrier scheme
2201 IF (grid%adv_moist_cond .or. im==p_qv ) THEN
2204 !$OMP PRIVATE ( ij, tenddec )
2205 moist_tile_loop_1: DO ij = 1 , grid%num_tiles
2207 CALL wrf_debug ( 200 , ' call rk_scalar_tend' )
2210 BENCH_START(rk_scalar_tend_tim)
2211 CALL rk_scalar_tend ( im, im, config_flags, tenddec, &
2213 grid%ru_m, grid%rv_m, grid%ww_m, wwE, wwI, &
2214 grid%u_1, grid%v_1, &
2215 grid%muts, grid%mub, grid%mu_1, &
2216 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
2218 moist_old(ims,kms,jms,im), &
2219 moist(ims,kms,jms,im), &
2220 moist_tend(ims,kms,jms,im), &
2221 advect_tend,h_tendency,z_tendency,grid%rqvften, &
2222 grid%qv_base, .true., grid%fnm, grid%fnp, &
2223 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv,&
2224 grid%msfvy, grid%msftx,grid%msfty, &
2225 grid%rdx, grid%rdy, grid%rdn, grid%rdnw, grid%khdif, &
2226 grid%kvdif, grid%xkhh, &
2227 grid%diff_6th_opt, grid%diff_6th_factor, &
2228 config_flags%moist_adv_opt, &
2229 grid%phb, grid%ph_2, &
2230 config_flags%moist_mix2_off, &
2231 config_flags%moist_mix6_off, &
2232 ids, ide, jds, jde, kds, kde, &
2233 ims, ime, jms, jme, kms, kme, &
2234 grid%i_start(ij), grid%i_end(ij), &
2235 grid%j_start(ij), grid%j_end(ij), &
2238 IF( rk_step == 1 .AND. config_flags%use_q_diabatic == 1 )THEN
2239 IF( im.eq.p_qv .or. im.eq.p_qc )THEN
2240 CALL q_diabatic_add ( im, im, &
2242 grid%c1h, grid%c2h, &
2245 moist_tend(ims,kms,jms,im), &
2246 ids, ide, jds, jde, kds, kde, &
2247 ims, ime, jms, jme, kms, kme, &
2248 grid%i_start(ij), grid%i_end(ij), &
2249 grid%j_start(ij), grid%j_end(ij), &
2254 BENCH_END(rk_scalar_tend_tim)
2256 BENCH_START(rlx_bdy_scalar_tim)
2257 IF( ( config_flags%specified .or. config_flags%nested ) .and. rk_step == 1 ) THEN
2258 IF ( im .EQ. P_QV .OR. config_flags%nested .OR. &
2259 ( config_flags%specified .AND. config_flags%have_bcs_moist ) ) THEN
2260 CALL relax_bdy_scalar ( moist_tend(ims,kms,jms,im), &
2261 moist(ims,kms,jms,im), grid%mut, &
2262 grid%c1h, grid%c2h, &
2263 moist_bxs(jms,kms,1,im),moist_bxe(jms,kms,1,im), &
2264 moist_bys(ims,kms,1,im),moist_bye(ims,kms,1,im), &
2265 moist_btxs(jms,kms,1,im),moist_btxe(jms,kms,1,im), &
2266 moist_btys(ims,kms,1,im),moist_btye(ims,kms,1,im), &
2267 config_flags%spec_bdy_width, grid%spec_zone, grid%relax_zone, &
2268 grid%dtbc, grid%fcx, grid%gcx, &
2270 ids,ide, jds,jde, kds,kde, & ! domain dims
2271 ims,ime, jms,jme, kms,kme, & ! memory dims
2272 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2273 grid%i_start(ij), grid%i_end(ij), &
2274 grid%j_start(ij), grid%j_end(ij), &
2277 CALL spec_bdy_scalar ( moist_tend(ims,kms,jms,im), &
2278 moist_bxs(jms,kms,1,im),moist_bxe(jms,kms,1,im), &
2279 moist_bys(ims,kms,1,im),moist_bye(ims,kms,1,im), &
2280 moist_btxs(jms,kms,1,im),moist_btxe(jms,kms,1,im), &
2281 moist_btys(ims,kms,1,im),moist_btye(ims,kms,1,im), &
2282 config_flags%spec_bdy_width, grid%spec_zone, &
2284 ids,ide, jds,jde, kds,kde, & ! domain dims
2285 ims,ime, jms,jme, kms,kme, & ! memory dims
2286 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2287 grid%i_start(ij), grid%i_end(ij), &
2288 grid%j_start(ij), grid%j_end(ij), &
2292 BENCH_END(rlx_bdy_scalar_tim)
2294 ENDDO moist_tile_loop_1
2295 !$OMP END PARALLEL DO
2298 !$OMP PRIVATE ( ij, tenddec )
2299 moist_tile_loop_2: DO ij = 1 , grid%num_tiles
2301 CALL wrf_debug ( 200 , ' call rk_update_scalar' )
2304 BENCH_START(update_scal_tim)
2305 CALL rk_update_scalar( scs=im, sce=im, &
2306 scalar_1=moist_old(ims,kms,jms,im), &
2307 scalar_2=moist(ims,kms,jms,im), &
2308 sc_tend=moist_tend(ims,kms,jms,im), &
2309 advect_tend=advect_tend, &
2310 h_tendency=h_tendency, z_tendency=z_tendency, &
2311 msftx=grid%msftx,msfty=grid%msfty, &
2312 c1=grid%c1h, c2=grid%c2h, &
2313 mu_old=grid%mu_1, mu_new=grid%mu_2, mu_base=grid%mub, &
2314 rk_step=rk_step, dt=dt_rk, spec_zone=grid%spec_zone, &
2315 config_flags=config_flags, tenddec=tenddec, &
2316 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
2317 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
2318 its=grid%i_start(ij), ite=grid%i_end(ij), &
2319 jts=grid%j_start(ij), jte=grid%j_end(ij), &
2320 kts=k_start , kte=k_end )
2321 IF( rk_step == rk_order .AND. config_flags%use_q_diabatic == 1 )THEN
2322 IF( im.eq.p_qv .or. im.eq.p_qc )THEN
2323 CALL q_diabatic_subtr( im, im, &
2327 moist(ims,kms,jms,im), &
2328 ids, ide, jds, jde, kds, kde, &
2329 ims, ime, jms, jme, kms, kme, &
2330 grid%i_start(ij), grid%i_end(ij), &
2331 grid%j_start(ij), grid%j_end(ij), &
2335 BENCH_END(update_scal_tim)
2337 BENCH_START(flow_depbdy_tim)
2338 IF( config_flags%specified .AND. ( .NOT. config_flags%have_bcs_moist ) ) THEN
2339 IF(im .ne. P_QV)THEN
2340 CALL flow_dep_bdy ( moist(ims,kms,jms,im), &
2341 grid%ru_m, grid%rv_m, config_flags, &
2343 ids,ide, jds,jde, kds,kde, &
2344 ims,ime, jms,jme, kms,kme, &
2345 ips,ipe, jps,jpe, kps,kpe, &
2346 grid%i_start(ij), grid%i_end(ij), &
2347 grid%j_start(ij), grid%j_end(ij), &
2351 BENCH_END(flow_depbdy_tim)
2353 ENDDO moist_tile_loop_2
2354 !$OMP END PARALLEL DO
2356 ENDIF !-- if (grid%adv_moist_cond .or. im==p_qv ) then
2358 ENDDO moist_variable_loop
2360 ENDIF moist_scalar_advance
2362 BENCH_START(tke_adv_tim)
2363 TKE_advance: IF (config_flags%km_opt .eq. 2.or.config_flags%km_opt.eq.5) then ! XZ
2365 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
2366 # include "HALO_EM_TKE_ADVECT_3.inc"
2367 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
2368 # include "HALO_EM_TKE_ADVECT_5.inc"
2370 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
2371 CALL wrf_error_fatal(TRIM(wrf_err_message))
2375 !$OMP PRIVATE ( ij, tenddec )
2376 tke_tile_loop_1: DO ij = 1 , grid%num_tiles
2378 CALL wrf_debug ( 200 , ' call rk_scalar_tend for tke' )
2380 CALL rk_scalar_tend ( 1, 1, config_flags, tenddec, &
2382 grid%ru_m, grid%rv_m, grid%ww_m, wwE, wwI, &
2383 grid%u_1, grid%v_1, &
2384 grid%muts, grid%mub, grid%mu_1, &
2385 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
2389 tke_tend(ims,kms,jms), &
2390 advect_tend,h_tendency,z_tendency,grid%rqvften, &
2391 grid%qv_base, .false., grid%fnm, grid%fnp, &
2392 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv, &
2393 grid%msfvy, grid%msftx,grid%msfty, &
2394 grid%rdx, grid%rdy, grid%rdn, grid%rdnw, grid%khdif, &
2395 grid%kvdif, grid%xkhh, &
2396 grid%diff_6th_opt, grid%diff_6th_factor, &
2397 config_flags%tke_adv_opt, &
2398 grid%phb, grid%ph_2, &
2399 config_flags%tke_mix2_off, &
2400 config_flags%tke_mix6_off, &
2401 ids, ide, jds, jde, kds, kde, &
2402 ims, ime, jms, jme, kms, kme, &
2403 grid%i_start(ij), grid%i_end(ij), &
2404 grid%j_start(ij), grid%j_end(ij), &
2407 ENDDO tke_tile_loop_1
2408 !$OMP END PARALLEL DO
2411 !$OMP PRIVATE ( ij, tenddec )
2412 tke_tile_loop_2: DO ij = 1 , grid%num_tiles
2414 CALL wrf_debug ( 200 , ' call rk_update_scalar' )
2416 CALL rk_update_scalar( scs=1, sce=1, &
2417 scalar_1=grid%tke_1, &
2418 scalar_2=grid%tke_2, &
2419 sc_tend=tke_tend(ims,kms,jms), &
2420 advect_tend=advect_tend, &
2421 h_tendency=h_tendency, z_tendency=z_tendency, &
2422 msftx=grid%msftx,msfty=grid%msfty, &
2423 c1=grid%c1h, c2=grid%c2h, &
2424 mu_old=grid%mu_1, mu_new=grid%mu_2, mu_base=grid%mub, &
2425 rk_step=rk_step, dt=dt_rk, spec_zone=grid%spec_zone, &
2426 config_flags=config_flags, tenddec=tenddec, &
2427 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
2428 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
2429 its=grid%i_start(ij), ite=grid%i_end(ij), &
2430 jts=grid%j_start(ij), jte=grid%j_end(ij), &
2431 kts=k_start , kte=k_end )
2433 ! bound the tke (greater than 0, less than tke_upper_bound)
2435 CALL bound_tke( grid%tke_2, grid%tke_upper_bound, &
2436 ids, ide, jds, jde, kds, kde, &
2437 ims, ime, jms, jme, kms, kme, &
2438 grid%i_start(ij), grid%i_end(ij), &
2439 grid%j_start(ij), grid%j_end(ij), &
2442 IF( config_flags%specified .or. config_flags%nested ) THEN
2443 CALL flow_dep_bdy ( grid%tke_2, &
2444 grid%ru_m, grid%rv_m, config_flags, &
2446 ids,ide, jds,jde, kds,kde, & ! domain dims
2447 ims,ime, jms,jme, kms,kme, & ! memory dims
2448 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2449 grid%i_start(ij), grid%i_end(ij), &
2450 grid%j_start(ij), grid%j_end(ij), &
2453 ENDDO tke_tile_loop_2
2454 !$OMP END PARALLEL DO
2457 BENCH_END(tke_adv_tim)
2460 ! next the chemical species
2461 BENCH_START(chem_adv_tim)
2462 chem_scalar_advance: IF (num_3d_c >= PARAM_FIRST_SCALAR) THEN
2464 chem_variable_loop: DO ic = PARAM_FIRST_SCALAR, num_3d_c
2467 !$OMP PRIVATE ( ij, tenddec )
2468 chem_tile_loop_1: DO ij = 1 , grid%num_tiles
2470 CALL wrf_debug ( 200 , ' call rk_scalar_tend in chem_tile_loop_1' )
2471 tenddec = (( config_flags%chemdiag == USECHEMDIAG ) .and. &
2472 ( adv_ct_indices(ic) >= PARAM_FIRST_SCALAR ))
2473 CALL rk_scalar_tend ( ic, ic, config_flags, tenddec, &
2475 grid%ru_m, grid%rv_m, grid%ww_m, wwE, wwI, &
2476 grid%u_1, grid%v_1, &
2477 grid%muts, grid%mub, grid%mu_1, &
2478 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
2480 chem_old(ims,kms,jms,ic), &
2481 chem(ims,kms,jms,ic), &
2482 chem_tend(ims,kms,jms,ic), &
2483 advect_tend,h_tendency,z_tendency,grid%rqvften, &
2484 grid%qv_base, .false., grid%fnm, grid%fnp, &
2485 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv, &
2486 grid%msfvy, grid%msftx,grid%msfty, &
2487 grid%rdx, grid%rdy, grid%rdn, grid%rdnw, &
2488 grid%khdif, grid%kvdif, grid%xkhh, &
2489 grid%diff_6th_opt, grid%diff_6th_factor, &
2490 config_flags%chem_adv_opt, &
2491 grid%phb, grid%ph_2, &
2492 config_flags%chem_mix2_off, &
2493 config_flags%chem_mix6_off, &
2494 ids, ide, jds, jde, kds, kde, &
2495 ims, ime, jms, jme, kms, kme, &
2496 grid%i_start(ij), grid%i_end(ij), &
2497 grid%j_start(ij), grid%j_end(ij), &
2500 ! Currently, chemistry species with specified boundaries (i.e. the mother
2501 ! domain) are being over written by flow_dep_bdy_chem. So, relax_bdy and
2502 ! spec_bdy are only called for nests. For boundary conditions from global model or larger domain,
2503 ! chem is uncoupled, and only used for one row/column on inflow (if have_bcs_chem=.true.)
2505 IF( ( config_flags%nested ) .and. rk_step == 1 ) THEN
2506 IF(ic.eq.1)CALL wrf_debug ( 10 , ' have_bcs_chem' )
2507 CALL relax_bdy_scalar ( chem_tend(ims,kms,jms,ic), &
2508 chem(ims,kms,jms,ic), grid%mut, &
2509 grid%c1h, grid%c2h, &
2510 chem_bxs(jms,kms,1,ic),chem_bxe(jms,kms,1,ic), &
2511 chem_bys(ims,kms,1,ic),chem_bye(ims,kms,1,ic), &
2512 chem_btxs(jms,kms,1,ic),chem_btxe(jms,kms,1,ic), &
2513 chem_btys(ims,kms,1,ic),chem_btye(ims,kms,1,ic), &
2514 config_flags%spec_bdy_width, grid%spec_zone, grid%relax_zone, &
2515 grid%dtbc, grid%fcx, grid%gcx, &
2517 ids,ide, jds,jde, kds,kde, &
2518 ims,ime, jms,jme, kms,kme, &
2519 ips,ipe, jps,jpe, kps,kpe, &
2520 grid%i_start(ij), grid%i_end(ij), &
2521 grid%j_start(ij), grid%j_end(ij), &
2523 CALL spec_bdy_scalar ( chem_tend(ims,kms,jms,ic), &
2524 chem_bxs(jms,kms,1,ic),chem_bxe(jms,kms,1,ic), &
2525 chem_bys(ims,kms,1,ic),chem_bye(ims,kms,1,ic), &
2526 chem_btxs(jms,kms,1,ic),chem_btxe(jms,kms,1,ic), &
2527 chem_btys(ims,kms,1,ic),chem_btye(ims,kms,1,ic), &
2528 config_flags%spec_bdy_width, grid%spec_zone, &
2530 ids,ide, jds,jde, kds,kde, &
2531 ims,ime, jms,jme, kms,kme, &
2532 ips,ipe, jps,jpe, kps,kpe, &
2533 grid%i_start(ij), grid%i_end(ij), &
2534 grid%j_start(ij), grid%j_end(ij), &
2538 ENDDO chem_tile_loop_1
2539 !$OMP END PARALLEL DO
2541 if ( config_flags%do_pvozone ) then
2543 # include "HALO_EM_D_PV.inc"
2548 !$OMP PRIVATE ( ij, tenddec )
2550 chem_tile_loop_2: DO ij = 1 , grid%num_tiles
2552 CALL wrf_debug ( 200 , ' call rk_update_scalar' )
2553 tenddec = (( config_flags%chemdiag == USECHEMDIAG ) .and. &
2554 ( adv_ct_indices(ic) >= PARAM_FIRST_SCALAR ))
2555 CALL rk_update_scalar( scs=ic, sce=ic, &
2556 scalar_1=chem_old(ims,kms,jms,ic), &
2557 scalar_2=chem(ims,kms,jms,ic), &
2558 sc_tend=chem_tend(ims,kms,jms,ic), &
2559 advh_t=advh_ct(ims,kms,jms,adv_ct_indices(ic)), &
2560 advz_t=advz_ct(ims,kms,jms,adv_ct_indices(ic)), &
2561 advect_tend=advect_tend, &
2562 h_tendency=h_tendency, z_tendency=z_tendency, &
2563 msftx=grid%msftx,msfty=grid%msfty, &
2564 c1=grid%c1h, c2=grid%c2h, &
2565 mu_old=grid%mu_1, mu_new=grid%mu_2, mu_base=grid%mub, &
2566 rk_step=rk_step, dt=dt_rk, spec_zone=grid%spec_zone, &
2567 config_flags=config_flags, tenddec=tenddec, &
2568 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
2569 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
2570 its=grid%i_start(ij), ite=grid%i_end(ij), &
2571 jts=grid%j_start(ij), jte=grid%j_end(ij), &
2572 kts=k_start , kte=k_end )
2574 IF( config_flags%specified ) THEN
2576 IF( config_flags%perturb_chem_bdy==1 ) THEN
2578 IF(ic.eq.PARAM_FIRST_SCALAR .and. ij.eq.1) &
2579 CALL wrf_debug (10 , ' spec_bdy_chem_perturb' )
2581 CALL spec_bdy_chem_perturb ( config_flags%periodic_x, &
2582 chem_btxs(jms,kms,1,ic), chem_btxe(jms,kms,1,ic), &
2583 chem_btys(ims,kms,1,ic), chem_btye(ims,kms,1,ic), &
2585 config_flags%spec_bdy_width, grid%spec_zone, &
2586 grid%num_stoch_levels, & ! stoch dims
2587 ids,ide, jds,jde, kds,kde, & ! domain dims
2588 ims,ime, jms,jme, kms,kme, & ! memory dims
2589 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2590 grid%i_start(ij), grid%i_end(ij), &
2591 grid%j_start(ij), grid%j_end(ij), &
2595 CALL flow_dep_bdy_chem( chem(ims,kms,jms,ic), &
2596 chem_bxs(jms,kms,1,ic), chem_btxs(jms,kms,1,ic), &
2597 chem_bxe(jms,kms,1,ic), chem_btxe(jms,kms,1,ic), &
2598 chem_bys(ims,kms,1,ic), chem_btys(ims,kms,1,ic), &
2599 chem_bye(ims,kms,1,ic), chem_btye(ims,kms,1,ic), &
2601 config_flags%spec_bdy_width,grid%z, &
2602 grid%have_bcs_chem, &
2603 grid%ru_m, grid%rv_m, config_flags,grid%alt, &
2604 grid%t_1,grid%pb,grid%p,t0,p1000mb,rcp,grid%ph_2,grid%phb,g, &
2605 grid%spec_zone,ic,grid%julday, &
2606 ids,ide, jds,jde, kds,kde, & ! domain dims
2607 ims,ime, jms,jme, kms,kme, & ! memory dims
2608 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2609 grid%i_start(ij), grid%i_end(ij), &
2610 grid%j_start(ij), grid%j_end(ij), &
2612 grid%u_2,grid%v_2,grid%t_2,grid%znu,grid%msft, &
2613 grid%msfu,grid%msfv,grid%f,grid%mub,grid%dx,grid%xlat,grid%pv)
2616 ENDDO chem_tile_loop_2
2617 !$OMP END PARALLEL DO
2619 ENDDO chem_variable_loop
2620 ENDIF chem_scalar_advance
2621 BENCH_END(chem_adv_tim)
2623 ! next the chemical species
2624 BENCH_START(tracer_adv_tim)
2625 tracer_advance: IF (num_tracer >= PARAM_FIRST_SCALAR) THEN
2627 tracer_variable_loop: DO ic = PARAM_FIRST_SCALAR, num_tracer
2630 !$OMP PRIVATE ( ij, tenddec )
2631 tracer_tile_loop_1: DO ij = 1 , grid%num_tiles
2633 CALL wrf_debug ( 15 , ' call rk_scalar_tend in tracer_tile_loop_1' )
2635 CALL rk_scalar_tend ( ic, ic, config_flags, tenddec, &
2637 grid%ru_m, grid%rv_m, grid%ww_m, wwE, wwI, &
2638 grid%u_1, grid%v_1, &
2639 grid%muts, grid%mub, grid%mu_1, &
2640 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
2642 tracer_old(ims,kms,jms,ic), &
2643 tracer(ims,kms,jms,ic), &
2644 tracer_tend(ims,kms,jms,ic), &
2645 advect_tend,h_tendency,z_tendency,grid%rqvften, &
2646 grid%qv_base, .false., grid%fnm, grid%fnp, &
2647 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv, &
2648 grid%msfvy, grid%msftx,grid%msfty, &
2649 grid%rdx, grid%rdy, grid%rdn, grid%rdnw, &
2650 grid%khdif, grid%kvdif, grid%xkhh, &
2651 grid%diff_6th_opt, grid%diff_6th_factor, &
2652 config_flags%tracer_adv_opt, &
2653 grid%phb, grid%ph_2, &
2654 config_flags%tracer_mix2_off, &
2655 config_flags%tracer_mix6_off, &
2656 ids, ide, jds, jde, kds, kde, &
2657 ims, ime, jms, jme, kms, kme, &
2658 grid%i_start(ij), grid%i_end(ij), &
2659 grid%j_start(ij), grid%j_end(ij), &
2662 ! Currently, chemistry species with specified boundaries (i.e. the mother
2663 ! domain) are being over written by flow_dep_bdy_chem. So, relax_bdy and
2664 ! spec_bdy are only called for nests. For boundary conditions from global model or larger domain,
2665 ! chem is uncoupled, and only used for one row/column on inflow (if have_bcs_chem=.true.)
2667 IF( ( config_flags%nested ) .and. rk_step == 1 ) THEN
2668 IF(ic.eq.1)CALL wrf_debug ( 10 , ' have_bcs_tracer' )
2669 CALL relax_bdy_scalar ( tracer_tend(ims,kms,jms,ic), &
2670 tracer(ims,kms,jms,ic), grid%mut, &
2671 grid%c1h, grid%c2h, &
2672 tracer_bxs(jms,kms,1,ic),tracer_bxe(jms,kms,1,ic), &
2673 tracer_bys(ims,kms,1,ic),tracer_bye(ims,kms,1,ic), &
2674 tracer_btxs(jms,kms,1,ic),tracer_btxe(jms,kms,1,ic), &
2675 tracer_btys(ims,kms,1,ic),tracer_btye(ims,kms,1,ic), &
2676 config_flags%spec_bdy_width, grid%spec_zone, grid%relax_zone, &
2677 grid%dtbc, grid%fcx, grid%gcx, &
2679 ids,ide, jds,jde, kds,kde, &
2680 ims,ime, jms,jme, kms,kme, &
2681 ips,ipe, jps,jpe, kps,kpe, &
2682 grid%i_start(ij), grid%i_end(ij), &
2683 grid%j_start(ij), grid%j_end(ij), &
2685 CALL spec_bdy_scalar ( tracer_tend(ims,kms,jms,ic), &
2686 tracer_bxs(jms,kms,1,ic),tracer_bxe(jms,kms,1,ic), &
2687 tracer_bys(ims,kms,1,ic),tracer_bye(ims,kms,1,ic), &
2688 tracer_btxs(jms,kms,1,ic),tracer_btxe(jms,kms,1,ic), &
2689 tracer_btys(ims,kms,1,ic),tracer_btye(ims,kms,1,ic), &
2690 config_flags%spec_bdy_width, grid%spec_zone, &
2692 ids,ide, jds,jde, kds,kde, &
2693 ims,ime, jms,jme, kms,kme, &
2694 ips,ipe, jps,jpe, kps,kpe, &
2695 grid%i_start(ij), grid%i_end(ij), &
2696 grid%j_start(ij), grid%j_end(ij), &
2700 ENDDO tracer_tile_loop_1
2701 !$OMP END PARALLEL DO
2704 !$OMP PRIVATE ( ij, tenddec )
2706 tracer_tile_loop_2: DO ij = 1 , grid%num_tiles
2708 CALL wrf_debug ( 200 , ' call rk_update_scalar' )
2710 CALL rk_update_scalar( scs=ic, sce=ic, &
2711 scalar_1=tracer_old(ims,kms,jms,ic), &
2712 scalar_2=tracer(ims,kms,jms,ic), &
2713 sc_tend=tracer_tend(ims,kms,jms,ic), &
2714 ! advh_t=advh_t(ims,kms,jms,1), &
2715 ! advz_t=advz_t(ims,kms,jms,1), &
2716 advect_tend=advect_tend, &
2717 h_tendency=h_tendency, z_tendency=z_tendency, &
2718 msftx=grid%msftx,msfty=grid%msfty, &
2719 c1=grid%c1h, c2=grid%c2h, &
2720 mu_old=grid%mu_1, mu_new=grid%mu_2, mu_base=grid%mub, &
2721 rk_step=rk_step, dt=dt_rk, spec_zone=grid%spec_zone, &
2722 config_flags=config_flags, tenddec=tenddec, &
2723 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
2724 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
2725 its=grid%i_start(ij), ite=grid%i_end(ij), &
2726 jts=grid%j_start(ij), jte=grid%j_end(ij), &
2727 kts=k_start , kte=k_end )
2729 IF( config_flags%specified ) THEN
2731 CALL flow_dep_bdy_tracer( tracer(ims,kms,jms,ic), &
2732 tracer_bxs(jms,kms,1,ic), tracer_btxs(jms,kms,1,ic), &
2733 tracer_bxe(jms,kms,1,ic), tracer_btxe(jms,kms,1,ic), &
2734 tracer_bys(ims,kms,1,ic), tracer_btys(ims,kms,1,ic), &
2735 tracer_bye(ims,kms,1,ic), tracer_btye(ims,kms,1,ic), &
2737 config_flags%spec_bdy_width,grid%z, &
2738 grid%have_bcs_tracer, &
2739 grid%ru_m, grid%rv_m, config_flags%tracer_opt,grid%alt, &
2740 grid%t_1,grid%pb,grid%p,t0,p1000mb,rcp,grid%ph_2,grid%phb,g, &
2741 grid%spec_zone,ic, &
2742 ids,ide, jds,jde, kds,kde, & ! domain dims
2743 ims,ime, jms,jme, kms,kme, & ! memory dims
2744 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2745 grid%i_start(ij), grid%i_end(ij), &
2746 grid%j_start(ij), grid%j_end(ij), &
2749 CALL flow_dep_bdy ( tracer(ims,kms,jms,ic), &
2750 grid%ru_m, grid%rv_m, config_flags, &
2752 ids,ide, jds,jde, kds,kde, & ! domain dims
2753 ims,ime, jms,jme, kms,kme, & ! memory dims
2754 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2755 grid%i_start(ij), grid%i_end(ij), &
2756 grid%j_start(ij), grid%j_end(ij), &
2760 ENDDO tracer_tile_loop_2
2761 !$OMP END PARALLEL DO
2763 ENDDO tracer_variable_loop
2764 ENDIF tracer_advance
2765 BENCH_END(tracer_adv_tim)
2767 ! next the other scalar species
2768 other_scalar_advance: IF (num_3d_s >= PARAM_FIRST_SCALAR) THEN
2770 scalar_variable_loop: do is = PARAM_FIRST_SCALAR, num_3d_s
2772 !$OMP PRIVATE ( ij, tenddec )
2773 scalar_tile_loop_1: DO ij = 1 , grid%num_tiles
2775 CALL wrf_debug ( 200 , ' call rk_scalar_tend' )
2777 CALL rk_scalar_tend ( is, is, config_flags, tenddec, &
2779 grid%ru_m, grid%rv_m, grid%ww_m, wwE, wwI, &
2780 grid%u_1, grid%v_1, &
2781 grid%muts, grid%mub, grid%mu_1, &
2782 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
2784 scalar_old(ims,kms,jms,is), &
2785 scalar(ims,kms,jms,is), &
2786 scalar_tend(ims,kms,jms,is), &
2787 advect_tend,h_tendency,z_tendency,grid%rqvften, &
2788 grid%qv_base, .false., grid%fnm, grid%fnp, &
2789 grid%msfux,grid%msfuy, grid%msfvx, grid%msfvx_inv, &
2790 grid%msfvy, grid%msftx,grid%msfty, &
2791 grid%rdx, grid%rdy, grid%rdn, grid%rdnw, &
2792 grid%khdif, grid%kvdif, grid%xkhh, &
2793 grid%diff_6th_opt, grid%diff_6th_factor, &
2794 config_flags%scalar_adv_opt, &
2795 grid%phb, grid%ph_2, &
2796 config_flags%scalar_mix2_off, &
2797 config_flags%scalar_mix6_off, &
2798 ids, ide, jds, jde, kds, kde, &
2799 ims, ime, jms, jme, kms, kme, &
2800 grid%i_start(ij), grid%i_end(ij), &
2801 grid%j_start(ij), grid%j_end(ij), &
2804 IF( rk_step == 1 ) THEN
2805 IF ( config_flags%nested .OR. &
2806 ( config_flags%specified .AND. config_flags%have_bcs_scalar ) .OR. &
2807 ( ( is .EQ. P_QNWFA .OR. is .EQ. P_QNIFA .OR. is .EQ. P_QNBCA) .AND. config_flags%aer_init_opt .GT. 0) ) THEN
2809 CALL relax_bdy_scalar ( scalar_tend(ims,kms,jms,is), &
2810 scalar(ims,kms,jms,is), grid%mut, &
2811 grid%c1h, grid%c2h, &
2812 scalar_bxs(jms,kms,1,is),scalar_bxe(jms,kms,1,is), &
2813 scalar_bys(ims,kms,1,is),scalar_bye(ims,kms,1,is), &
2814 scalar_btxs(jms,kms,1,is),scalar_btxe(jms,kms,1,is), &
2815 scalar_btys(ims,kms,1,is),scalar_btye(ims,kms,1,is), &
2816 config_flags%spec_bdy_width, grid%spec_zone, grid%relax_zone, &
2817 grid%dtbc, grid%fcx, grid%gcx, &
2819 ids,ide, jds,jde, kds,kde, &
2820 ims,ime, jms,jme, kms,kme, &
2821 ips,ipe, jps,jpe, kps,kpe, &
2822 grid%i_start(ij), grid%i_end(ij), &
2823 grid%j_start(ij), grid%j_end(ij), &
2826 CALL spec_bdy_scalar ( scalar_tend(ims,kms,jms,is), &
2827 scalar_bxs(jms,kms,1,is),scalar_bxe(jms,kms,1,is), &
2828 scalar_bys(ims,kms,1,is),scalar_bye(ims,kms,1,is), &
2829 scalar_btxs(jms,kms,1,is),scalar_btxe(jms,kms,1,is), &
2830 scalar_btys(ims,kms,1,is),scalar_btye(ims,kms,1,is), &
2831 config_flags%spec_bdy_width, grid%spec_zone, &
2833 ids,ide, jds,jde, kds,kde, &
2834 ims,ime, jms,jme, kms,kme, &
2835 ips,ipe, jps,jpe, kps,kpe, &
2836 grid%i_start(ij), grid%i_end(ij), &
2837 grid%j_start(ij), grid%j_end(ij), &
2841 ENDIF ! b.c test for scalars
2843 ENDDO scalar_tile_loop_1
2844 !$OMP END PARALLEL DO
2847 !$OMP PRIVATE ( ij, tenddec )
2848 scalar_tile_loop_2: DO ij = 1 , grid%num_tiles
2850 CALL wrf_debug ( 200 , ' call rk_update_scalar' )
2852 CALL rk_update_scalar( scs=is, sce=is, &
2853 scalar_1=scalar_old(ims,kms,jms,is), &
2854 scalar_2=scalar(ims,kms,jms,is), &
2855 sc_tend=scalar_tend(ims,kms,jms,is), &
2856 ! advh_t=advh_t(ims,kms,jms,1), &
2857 ! advz_t=advz_t(ims,kms,jms,1), &
2858 advect_tend=advect_tend, &
2859 h_tendency=h_tendency, z_tendency=z_tendency, &
2860 msftx=grid%msftx,msfty=grid%msfty, &
2861 c1=grid%c1h, c2=grid%c2h, &
2862 mu_old=grid%mu_1, mu_new=grid%mu_2, mu_base=grid%mub, &
2863 rk_step=rk_step, dt=dt_rk, spec_zone=grid%spec_zone, &
2864 config_flags=config_flags, tenddec=tenddec, &
2865 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
2866 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
2867 its=grid%i_start(ij), ite=grid%i_end(ij), &
2868 jts=grid%j_start(ij), jte=grid%j_end(ij), &
2869 kts=k_start , kte=k_end )
2871 ! bound the aerosol fields (greater than 0) when using first guess aerosol
2872 ! as fields may be highly heterogeneous compared to climatology
2874 IF ( ( ( is .EQ. P_QNWFA ) .OR. ( is .EQ. P_QNIFA ) .OR. ( is .EQ. P_QNBCA ) ) .AND. &
2875 ( config_flags%aer_init_opt .EQ. 2 ) ) THEN
2876 CALL bound_qna( scalar(ims,kms,jms,is), &
2877 ids, ide, jds, jde, kds, kde, &
2878 ims, ime, jms, jme, kms, kme, &
2879 grid%i_start(ij), grid%i_end(ij), &
2880 grid%j_start(ij), grid%j_end(ij), &
2884 IF ( config_flags%specified ) THEN
2885 IF (is.EQ.P_QDCN.OR.is.EQ.P_QTCN.OR.is.EQ.P_QNIN) THEN ! for ntu3m
2886 CALL flow_dep_bdy_fixed_inflow(scalar(ims,kms,jms,is), &
2887 grid%ru_m,grid%rv_m,config_flags,&
2888 grid%spec_zone,ids,ide,jds,jde, &
2889 kds,kde,ims,ime,jms,jme,kms,kme, &
2890 ips,ipe,jps,jpe,kps,kpe, &
2891 grid%i_start(ij),grid%i_end(ij), &
2892 grid%j_start(ij),grid%j_end(ij), &
2894 ELSEIF (is.EQ.P_QNN) THEN ! for ntu3m
2895 CALL flow_dep_bdy_qnn ( scalar(ims,kms,jms,is), &
2896 grid%ru_m, grid%rv_m, config_flags, &
2898 grid%ccn_conc, & ! RAS
2899 ids,ide, jds,jde, kds,kde, & ! domain dims
2900 ims,ime, jms,jme, kms,kme, & ! memory dims
2901 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2902 grid%i_start(ij), grid%i_end(ij), &
2903 grid%j_start(ij), grid%j_end(ij), &
2905 ELSE IF ( ( ( ( is .EQ. P_QNWFA ) .OR. ( is .EQ. P_QNIFA ) .OR. ( is .EQ. P_QNBCA ) ) .AND. &
2906 ( config_flags%aer_init_opt .EQ. 0 ) ) &
2908 ( ( .NOT. ( ( is .EQ. P_QNWFA ) .OR. ( is .EQ. P_QNIFA ) .OR. ( is .EQ. P_QNBCA ) ) ) .AND. &
2909 ( .NOT. config_flags%have_bcs_scalar ) ) ) THEN
2911 ! A = ( is .EQ. P_QNWFA ) .OR. ( is .EQ. P_QNIFA ) .OR. ( is .EQ. P_QNBCA )
2912 ! B = config_flags%aer_init_opt .GT. 0
2913 ! C = config_glags%have_bcs_scalar
2915 ! Test| A | B | C | ( A AND NOT B ) OR ( NOT A AND NOT C )
2916 ! ----+----+----+---+-----------------------------------------------
2917 ! 1 | T | T | T | F = DO NOT CALL flow_dep_bdy
2918 ! 2 | T | T | F | F = DO NOT CALL flow_dep_bdy
2919 ! 3 | T | F | T | T = CALL flow_dep_bdy
2920 ! 4 | T | F | F | T = CALL flow_dep_bdy
2921 ! 5 | F | T | T | F = DO NOT CALL flow_dep_bdy
2922 ! 6 | F | T | F | T = CALL flow_dep_bdy
2923 ! 7 | F | F | T | F = DO NOT CALL flow_dep_bdy
2924 ! 8 | F | F | F | T = CALL flow_dep_bdy
2925 ! ----+----+----+---+-----------------------------------------------
2927 ! If this is the special friendly fields AND are to use the aero icbc, then NO calls to flow dep: tests 1 and 2
2928 ! If this is the special friendly fields AND do not use the aero icbc, then call flow dep: tests 3 and 4
2929 ! If this is not the special friendly fields AND:
2930 ! If we have bcs for scalars, do not call flow dep: tests 5 and 7
2931 ! If we do not have bcs for scalars, call flow dep: tests 6 and 8
2933 CALL flow_dep_bdy ( scalar(ims,kms,jms,is), &
2934 grid%ru_m, grid%rv_m, config_flags, &
2936 ids,ide, jds,jde, kds,kde, & ! domain dims
2937 ims,ime, jms,jme, kms,kme, & ! memory dims
2938 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
2939 grid%i_start(ij), grid%i_end(ij), &
2940 grid%j_start(ij), grid%j_end(ij), &
2946 ENDDO scalar_tile_loop_2
2947 !$OMP END PARALLEL DO
2949 ENDDO scalar_variable_loop
2951 ENDIF other_scalar_advance
2953 ! update the pressure and density at the new time level
2956 !$OMP PRIVATE ( ij )
2957 DO ij = 1 , grid%num_tiles
2959 BENCH_START(calc_p_rho_tim)
2961 CALL calc_p_rho_phi( moist, num_3d_m, config_flags%hypsometric_opt, &
2962 grid%al, grid%alb, grid%mu_2, grid%muts, &
2963 grid%c1h, grid%c2h, grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
2964 grid%ph_2, grid%phb, grid%p, grid%pb, grid%t_2, &
2965 p0, t0, grid%p_top, grid%znu, grid%znw, grid%dnw, grid%rdnw, &
2966 grid%rdn, config_flags%non_hydrostatic,config_flags%use_theta_m, &
2967 ids, ide, jds, jde, kds, kde, &
2968 ims, ime, jms, jme, kms, kme, &
2969 grid%i_start(ij), grid%i_end(ij), &
2970 grid%j_start(ij), grid%j_end(ij), &
2973 BENCH_END(calc_p_rho_tim)
2976 !$OMP END PARALLEL DO
2978 ! Reset the boundary conditions if there is another corrector step.
2979 ! (rk_step < rk_order), else we'll handle it at the end of everything
2980 ! (after the split physics, before exiting the timestep).
2982 rk_step_1_check: IF ( rk_step < rk_order ) THEN
2984 !-----------------------------------------------------------
2985 ! rk3 substep polar filter for scalars (moist,chem,scalar)
2986 !-----------------------------------------------------------
2988 IF (config_flags%polar) THEN
2989 IF ( num_3d_m >= PARAM_FIRST_SCALAR ) THEN
2990 CALL wrf_debug ( 200 , ' call filter moist ' )
2991 DO im = PARAM_FIRST_SCALAR, num_3d_m
2992 IF ( config_flags%coupled_filtering ) THEN
2993 CALL couple_scalars_for_filter ( FIELD=moist(ims,kms,jms,im) &
2994 ,MU=grid%mu_2 , MUB=grid%mub &
2995 ,C1=grid%c1h , C2=grid%c2h &
2996 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
2997 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
2998 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3000 CALL pxft ( grid=grid &
3013 ,actual_distance_average=config_flags%actual_distance_average&
3014 ,pos_def = config_flags%pos_def &
3015 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
3016 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
3017 ,fft_filter_lat = config_flags%fft_filter_lat &
3019 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3020 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3021 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
3022 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
3023 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
3024 IF ( config_flags%coupled_filtering ) THEN
3025 CALL uncouple_scalars_for_filter ( FIELD=moist(ims,kms,jms,im) &
3026 ,MU=grid%mu_2 , MUB=grid%mub &
3027 ,C1=grid%c1h , C2=grid%c2h &
3028 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3029 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3030 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3035 IF ( num_3d_c >= PARAM_FIRST_SCALAR ) THEN
3036 CALL wrf_debug ( 200 , ' call filter chem ' )
3037 DO im = PARAM_FIRST_SCALAR, num_3d_c
3038 IF ( config_flags%coupled_filtering ) THEN
3039 CALL couple_scalars_for_filter ( FIELD=chem(ims,kms,jms,im) &
3040 ,MU=grid%mu_2 , MUB=grid%mub &
3041 ,C1=grid%c1h , C2=grid%c2h &
3042 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3043 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3044 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3046 CALL pxft ( grid=grid &
3059 ,actual_distance_average=config_flags%actual_distance_average&
3060 ,pos_def = config_flags%pos_def &
3061 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
3062 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
3063 ,fft_filter_lat = config_flags%fft_filter_lat &
3065 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3066 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3067 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
3068 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
3069 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
3070 IF ( config_flags%coupled_filtering ) THEN
3071 CALL uncouple_scalars_for_filter ( FIELD=chem(ims,kms,jms,im) &
3072 ,MU=grid%mu_2 , MUB=grid%mub &
3073 ,C1=grid%c1h , C2=grid%c2h &
3074 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3075 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3076 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3080 IF ( num_tracer >= PARAM_FIRST_SCALAR ) THEN
3081 CALL wrf_debug ( 200 , ' call filter tracer ' )
3082 DO im = PARAM_FIRST_SCALAR, num_tracer
3083 IF ( config_flags%coupled_filtering ) THEN
3084 CALL couple_scalars_for_filter ( FIELD=tracer(ims,kms,jms,im) &
3085 ,MU=grid%mu_2 , MUB=grid%mub &
3086 ,C1=grid%c1h , C2=grid%c2h &
3087 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3088 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3089 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3091 CALL pxft ( grid=grid &
3104 ,actual_distance_average=config_flags%actual_distance_average&
3105 ,pos_def = config_flags%pos_def &
3106 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
3107 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
3108 ,fft_filter_lat = config_flags%fft_filter_lat &
3110 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3111 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3112 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
3113 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
3114 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
3115 IF ( config_flags%coupled_filtering ) THEN
3116 CALL uncouple_scalars_for_filter ( FIELD=tracer(ims,kms,jms,im) &
3117 ,MU=grid%mu_2 , MUB=grid%mub &
3118 ,C1=grid%c1h , C2=grid%c2h &
3119 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3120 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3121 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3126 IF ( num_3d_s >= PARAM_FIRST_SCALAR ) THEN
3127 CALL wrf_debug ( 200 , ' call filter scalar ' )
3128 DO im = PARAM_FIRST_SCALAR, num_3d_s
3129 IF ( config_flags%coupled_filtering ) THEN
3130 CALL couple_scalars_for_filter ( FIELD=scalar(ims,kms,jms,im) &
3131 ,MU=grid%mu_2 , MUB=grid%mub &
3132 ,C1=grid%c1h , C2=grid%c2h &
3133 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3134 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3135 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3137 CALL pxft ( grid=grid &
3150 ,actual_distance_average=config_flags%actual_distance_average&
3151 ,pos_def = config_flags%pos_def &
3152 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
3153 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
3154 ,fft_filter_lat = config_flags%fft_filter_lat &
3156 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3157 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3158 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
3159 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
3160 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
3161 IF ( config_flags%coupled_filtering ) THEN
3162 CALL uncouple_scalars_for_filter ( FIELD=scalar(ims,kms,jms,im) &
3163 ,MU=grid%mu_2 , MUB=grid%mub &
3164 ,C1=grid%c1h , C2=grid%c2h &
3165 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
3166 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
3167 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
3171 END IF ! polar filter test
3173 !-----------------------------------------------------------
3174 ! END rk3 substep polar filter for scalars (moist,chem,scalar)
3175 !-----------------------------------------------------------
3177 !-----------------------------------------------------------
3178 ! Stencils for patch communications (WCS, 29 June 2001)
3180 ! here's where we need a wide comm stencil - these are the
3181 ! uncoupled variables so are used for high order calc in
3182 ! advection and mixong routines.
3186 ! * * * * * * * * * * * *
3187 ! * * * * * * * * * * * * *
3188 ! * + * * * + * * * * * + * * *
3189 ! * * * * * * * * * * * * *
3190 ! * * * * * * * * * * * *
3218 IF ( config_flags%h_mom_adv_order <= 4 .and. config_flags%h_sca_adv_order <= 4 ) THEN
3219 # include "HALO_EM_D2_3.inc"
3220 ELSE IF ( config_flags%h_mom_adv_order <= 6 .and. config_flags%h_sca_adv_order <= 6 ) THEN
3221 # include "HALO_EM_D2_5.inc"
3223 WRITE(wrf_err_message,*)'solve_em: invalid h_mom_adv_order or h_sca_adv_order = ', &
3224 config_flags%h_mom_adv_order, config_flags%h_sca_adv_order
3225 CALL wrf_error_fatal(TRIM(wrf_err_message))
3227 # include "PERIOD_BDY_EM_D.inc"
3228 # include "PERIOD_BDY_EM_MOIST2.inc"
3229 # include "PERIOD_BDY_EM_CHEM2.inc"
3230 # include "PERIOD_BDY_EM_TRACER2.inc"
3231 # include "PERIOD_BDY_EM_SCALAR2.inc"
3232 # include "PERIOD_BDY_EM_TKE.inc"
3235 BENCH_START(bc_end_tim)
3237 !$OMP PRIVATE ( ij )
3238 tile_bc_loop_1: DO ij = 1 , grid%num_tiles
3239 CALL wrf_debug ( 200 , ' call rk_phys_bc_dry_2' )
3241 CALL rk_phys_bc_dry_2( config_flags, &
3242 grid%u_2, grid%v_2, grid%w_2, &
3243 grid%t_2, grid%ph_2, grid%mu_2, &
3244 ids, ide, jds, jde, kds, kde, &
3245 ims, ime, jms, jme, kms, kme, &
3246 ips, ipe, jps, jpe, kps, kpe, &
3247 grid%i_start(ij), grid%i_end(ij), &
3248 grid%j_start(ij), grid%j_end(ij), &
3251 BENCH_START(diag_w_tim)
3252 IF (.not. config_flags%non_hydrostatic) THEN
3253 CALL diagnose_w( ph_tend, grid%ph_2, grid%ph_1, grid%w_2, grid%muts, &
3254 grid%c1f, grid%c2f, dt_rk, &
3255 grid%u_2, grid%v_2, grid%ht, &
3256 grid%cf1, grid%cf2, grid%cf3, grid%rdx, grid%rdy, grid%msftx, grid%msfty, &
3257 ids, ide, jds, jde, kds, kde, &
3258 ims, ime, jms, jme, kms, kme, &
3259 grid%i_start(ij), grid%i_end(ij), &
3260 grid%j_start(ij), grid%j_end(ij), &
3263 BENCH_END(diag_w_tim)
3265 IF (num_3d_m >= PARAM_FIRST_SCALAR) THEN
3267 moisture_loop_bdy_1 : DO im = PARAM_FIRST_SCALAR , num_3d_m
3269 CALL set_physical_bc3d( moist(ims,kms,jms,im), 'p', config_flags, &
3270 ids, ide, jds, jde, kds, kde, &
3271 ims, ime, jms, jme, kms, kme, &
3272 ips, ipe, jps, jpe, kps, kpe, &
3273 grid%i_start(ij), grid%i_end(ij), &
3274 grid%j_start(ij), grid%j_end(ij), &
3276 END DO moisture_loop_bdy_1
3280 IF (num_3d_c >= PARAM_FIRST_SCALAR) THEN
3282 chem_species_bdy_loop_1 : DO ic = PARAM_FIRST_SCALAR , num_3d_c
3284 CALL set_physical_bc3d( chem(ims,kms,jms,ic), 'p', config_flags, &
3285 ids, ide, jds, jde, kds, kde, &
3286 ims, ime, jms, jme, kms, kme, &
3287 ips, ipe, jps, jpe, kps, kpe, &
3288 grid%i_start(ij), grid%i_end(ij), &
3289 grid%j_start(ij), grid%j_end(ij), &
3292 END DO chem_species_bdy_loop_1
3296 IF (num_tracer >= PARAM_FIRST_SCALAR) THEN
3298 tracer_species_bdy_loop_1 : DO ic = PARAM_FIRST_SCALAR , num_tracer
3300 CALL set_physical_bc3d( tracer(ims,kms,jms,ic), 'p', config_flags, &
3301 ids, ide, jds, jde, kds, kde, &
3302 ims, ime, jms, jme, kms, kme, &
3303 ips, ipe, jps, jpe, kps, kpe, &
3304 grid%i_start(ij), grid%i_end(ij), &
3305 grid%j_start(ij), grid%j_end(ij), &
3308 END DO tracer_species_bdy_loop_1
3312 IF (num_3d_s >= PARAM_FIRST_SCALAR) THEN
3314 scalar_species_bdy_loop_1 : DO is = PARAM_FIRST_SCALAR , num_3d_s
3316 CALL set_physical_bc3d( scalar(ims,kms,jms,is), 'p', config_flags, &
3317 ids, ide, jds, jde, kds, kde, &
3318 ims, ime, jms, jme, kms, kme, &
3319 ips, ipe, jps, jpe, kps, kpe, &
3320 grid%i_start(ij), grid%i_end(ij), &
3321 grid%j_start(ij), grid%j_end(ij), &
3324 END DO scalar_species_bdy_loop_1
3328 IF (config_flags%km_opt .eq. 2) THEN
3330 CALL set_physical_bc3d( grid%tke_2 , 'p', config_flags, &
3331 ids, ide, jds, jde, kds, kde, &
3332 ims, ime, jms, jme, kms, kme, &
3333 ips, ipe, jps, jpe, kps, kpe, &
3334 grid%i_start(ij), grid%i_end(ij), &
3335 grid%j_start(ij), grid%j_end(ij), &
3339 END DO tile_bc_loop_1
3340 !$OMP END PARALLEL DO
3341 BENCH_END(bc_end_tim)
3348 ! * + * * + * * * + * *
3352 ! moist, chem, scalar, tke x
3355 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
3356 IF ( (config_flags%tke_adv_opt /= ORIGINAL .and. config_flags%tke_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3357 # include "HALO_EM_TKE_5.inc"
3359 # include "HALO_EM_TKE_3.inc"
3361 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
3362 IF ( (config_flags%tke_adv_opt /= ORIGINAL .and. config_flags%tke_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3363 # include "HALO_EM_TKE_7.inc"
3365 # include "HALO_EM_TKE_5.inc"
3368 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
3369 CALL wrf_error_fatal(TRIM(wrf_err_message))
3372 IF ( num_moist .GE. PARAM_FIRST_SCALAR ) THEN
3373 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
3374 IF ( (config_flags%moist_adv_opt /= ORIGINAL .and. config_flags%moist_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3375 # include "HALO_EM_MOIST_E_5.inc"
3377 # include "HALO_EM_MOIST_E_3.inc"
3379 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
3380 IF ( (config_flags%moist_adv_opt /= ORIGINAL .and. config_flags%moist_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3381 # include "HALO_EM_MOIST_E_7.inc"
3383 # include "HALO_EM_MOIST_E_5.inc"
3386 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
3387 CALL wrf_error_fatal(TRIM(wrf_err_message))
3390 IF ( num_chem >= PARAM_FIRST_SCALAR ) THEN
3391 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
3392 IF ( (config_flags%chem_adv_opt /= ORIGINAL .and. config_flags%chem_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3393 # include "HALO_EM_CHEM_E_5.inc"
3395 # include "HALO_EM_CHEM_E_3.inc"
3397 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
3398 IF ( (config_flags%chem_adv_opt /= ORIGINAL .and. config_flags%chem_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3399 # include "HALO_EM_CHEM_E_7.inc"
3401 # include "HALO_EM_CHEM_E_5.inc"
3404 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
3405 CALL wrf_error_fatal(TRIM(wrf_err_message))
3408 IF ( num_tracer >= PARAM_FIRST_SCALAR ) THEN
3409 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
3410 IF ( (config_flags%tracer_adv_opt /= ORIGINAL .and. config_flags%tracer_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3411 # include "HALO_EM_TRACER_E_5.inc"
3413 # include "HALO_EM_TRACER_E_3.inc"
3415 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
3416 IF ( (config_flags%tracer_adv_opt /= ORIGINAL .and. config_flags%tracer_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3417 # include "HALO_EM_TRACER_E_7.inc"
3419 # include "HALO_EM_TRACER_E_5.inc"
3422 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
3423 CALL wrf_error_fatal(TRIM(wrf_err_message))
3426 IF ( num_scalar >= PARAM_FIRST_SCALAR ) THEN
3427 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
3428 IF ( (config_flags%scalar_adv_opt /= ORIGINAL .and. config_flags%scalar_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3429 # include "HALO_EM_SCALAR_E_5.inc"
3431 # include "HALO_EM_SCALAR_E_3.inc"
3433 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
3434 IF ( (config_flags%scalar_adv_opt /= ORIGINAL .and. config_flags%scalar_adv_opt /= WENO_SCALAR) .and. (rk_step == rk_order-1) ) THEN
3435 # include "HALO_EM_SCALAR_E_7.inc"
3437 # include "HALO_EM_SCALAR_E_5.inc"
3440 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
3441 CALL wrf_error_fatal(TRIM(wrf_err_message))
3446 ENDIF rk_step_1_check
3449 !**********************************************************
3451 ! end of RK predictor-corrector loop
3453 !**********************************************************
3455 END DO Runge_Kutta_loop
3456 ! grid%dmudt=grid%mu_2 - grid%mu_1
3458 #if ( WRFPLUS != 1 )
3459 IF ( config_flags%traj_opt .EQ. UM_TRAJECTORY ) THEN
3461 # include "HALO_EM_F_1.inc"
3462 # include "HALO_EM_D.inc"
3463 # include "HALO_EM_INIT_4.inc"
3464 IF( config_flags%periodic_x ) THEN
3465 # include "PERIOD_EM_DA.inc"
3466 # include "PERIOD_EM_F.inc"
3467 # include "PERIOD_EM_G.inc"
3471 !$OMP PRIVATE ( ij )
3472 DO ij = 1 , grid%num_tiles
3474 call trajectory (grid,config_flags, &
3475 grid%dt,grid%itimestep,grid%ru_m, grid%rv_m, grid%ww_m,&
3476 grid%muts,grid%muus,grid%muvs, &
3477 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
3478 grid%rdx, grid%rdy, grid%rdn, grid%rdnw,grid%rdzw, &
3479 grid%traj_i,grid%traj_j,grid%traj_k, &
3480 grid%traj_long,grid%traj_lat, &
3481 grid%xlong,grid%xlat, &
3482 grid%msftx,grid%msfux,grid%msfvy, &
3483 ids, ide, jds, jde, kds, kde, &
3484 ims, ime, jms, jme, kms, kme, &
3485 grid%i_start(ij), grid%i_end(ij), &
3486 grid%j_start(ij), grid%j_end(ij), &
3489 !$OMP END PARALLEL DO
3492 !-----------------------------------------------------------
3494 IF (config_flags%do_avgflx_em .EQ. 1) THEN
3495 ! Reinitialize time-averaged fluxes if history output was written after the previous time step:
3496 CALL WRFU_ALARMGET(grid%alarms( HISTORY_ALARM ),prevringtime=temp_time)
3497 CALL domain_clock_get ( grid, current_time=CurrTime, &
3498 current_timestr=message2 )
3499 ! use overloaded -, .LT. operator to check whether to initialize avgflx:
3500 ! reinitialize after each history output (detect this here by comparing current time
3501 ! against last history time and time step - this code follows what's done in adapt_timestep_em):
3502 WRITE ( message , FMT = '("solve_em: old_dt =",g15.6,", dt=",g15.6," on domain ",I3)' ) &
3503 & old_dt,grid%dt,grid%id
3504 CALL wrf_debug(200,message)
3505 old_dt=min(old_dt,grid%dt)
3506 num = INT(old_dt * precision)
3508 CALL WRFU_TimeIntervalSet(dtInterval, Sn=num, Sd=den)
3509 IF (CurrTime .lt. temp_time + dtInterval) THEN
3510 WRITE ( message , FMT = '("solve_em: initializing avgflx at time ",A," on domain ",I3)' ) &
3511 & TRIM(message2), grid%id
3512 CALL wrf_message(trim(message))
3513 grid%avgflx_count = 0
3514 !tile-loop for zero_avgflx
3516 !$OMP PRIVATE ( ij )
3518 DO ij = 1 , grid%num_tiles
3519 CALL wrf_debug(200,'In solve_em, before zero_avgflx call')
3520 CALL zero_avgflx(grid%avgflx_rum,grid%avgflx_rvm,grid%avgflx_wwm, &
3521 & ids, ide, jds, jde, kds, kde, &
3522 & ims, ime, jms, jme, kms, kme, &
3523 & grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), &
3524 & k_start , k_end, f_flux, &
3525 & grid%avgflx_cfu1,grid%avgflx_cfd1,grid%avgflx_dfu1, &
3526 & grid%avgflx_efu1,grid%avgflx_dfd1,grid%avgflx_efd1 )
3527 CALL wrf_debug(200,'In solve_em, after zero_avgflx call')
3529 !$OMP END PARALLEL DO
3532 ! Update avgflx quantities
3533 !tile-loop for upd_avgflx
3535 !$OMP PRIVATE ( ij )
3537 DO ij = 1 , grid%num_tiles
3538 CALL wrf_debug(200,'In solve_em, before upd_avgflx call')
3539 CALL upd_avgflx(grid%avgflx_count,grid%avgflx_rum,grid%avgflx_rvm,grid%avgflx_wwm, &
3540 & grid%ru_m, grid%rv_m, grid%ww_m, &
3541 & ids, ide, jds, jde, kds, kde, &
3542 & ims, ime, jms, jme, kms, kme, &
3543 & grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), &
3544 & k_start , k_end, f_flux, &
3545 & grid%cfu1,grid%cfd1,grid%dfu1,grid%efu1,grid%dfd1,grid%efd1, &
3546 & grid%avgflx_cfu1,grid%avgflx_cfd1,grid%avgflx_dfu1, &
3547 & grid%avgflx_efu1,grid%avgflx_dfd1,grid%avgflx_efd1 )
3548 CALL wrf_debug(200,'In solve_em, after upd_avgflx call')
3551 !$OMP END PARALLEL DO
3552 grid%avgflx_count = grid%avgflx_count + 1
3556 !$OMP PRIVATE ( ij )
3557 DO ij = 1 , grid%num_tiles
3559 BENCH_START(advance_ppt_tim)
3560 CALL wrf_debug ( 200 , ' call advance_ppt' )
3561 CALL advance_ppt(grid%rthcuten,grid%rqvcuten,grid%rqccuten,grid%rqrcuten, &
3562 grid%cldfra_cup, & !BSINGH - Added for CuP scheme
3563 grid%rqicuten,grid%rqscuten, &
3564 grid%rainc,grid%raincv,grid%rainsh,grid%pratec,grid%pratesh, &
3565 grid%nca,grid%htop,grid%hbot,grid%cutop,grid%cubot, &
3566 grid%cuppt, grid%dt, config_flags, &
3567 ids,ide, jds,jde, kds,kde, &
3568 ims,ime, jms,jme, kms,kme, &
3569 grid%i_start(ij), grid%i_end(ij), &
3570 grid%j_start(ij), grid%j_end(ij), &
3572 BENCH_END(advance_ppt_tim)
3575 !$OMP END PARALLEL DO
3578 !$OMP PRIVATE ( ij )
3579 DO ij = 1 , grid%num_tiles
3580 CALL wrf_debug ( 200 , ' call phy_prep_part2' )
3581 CALL phy_prep_part2 ( config_flags, &
3582 grid%muts, grid%muus, grid%muvs, &
3583 grid%c1h, grid%c2h, grid%c1f, grid%c2f, &
3585 grid%rthblten, grid%rublten, grid%rvblten, &
3586 grid%rqvblten, grid%rqcblten, grid%rqiblten, &
3587 grid%rucuten, grid%rvcuten, grid%rthcuten, &
3588 grid%rqvcuten, grid%rqccuten, grid%rqrcuten, &
3589 grid%rqicuten, grid%rqscuten, &
3590 grid%rushten, grid%rvshten, grid%rthshten, &
3591 grid%rqvshten, grid%rqcshten, grid%rqrshten, &
3592 grid%rqishten, grid%rqsshten, grid%rqgshten, &
3593 grid%rthften, grid%rqvften, &
3594 grid%RUNDGDTEN, grid%RVNDGDTEN, grid%RTHNDGDTEN, &
3595 grid%RPHNDGDTEN,grid%RQVNDGDTEN, grid%RMUNDGDTEN,&
3596 grid%t_2, th_phy, moist(ims,kms,jms,P_QV), &
3597 ids, ide, jds, jde, kds, kde, &
3598 ims, ime, jms, jme, kms, kme, &
3599 grid%i_start(ij), grid%i_end(ij), &
3600 grid%j_start(ij), grid%j_end(ij), &
3603 !$OMP END PARALLEL DO
3607 ! (5) time-split physics.
3609 ! Microphysics are the only time split physics in the WRF model
3610 ! at this time. Split-physics begins with the calculation of
3611 ! needed diagnostic quantities (pressure, temperature, etc.)
3612 ! followed by a call to the microphysics driver,
3613 ! and finishes with a clean-up, storing off of a diabatic tendency
3614 ! from the moist physics, and a re-calulation of the diagnostic
3615 ! quantities pressure and density.
3619 IF( config_flags%specified .or. config_flags%nested ) THEN
3625 IF (config_flags%mp_physics /= 0) then
3628 !$OMP PRIVATE ( ij, its, ite, jts, jte )
3630 scalar_tile_loop_1a: DO ij = 1 , grid%num_tiles
3632 IF ( config_flags%periodic_x ) THEN
3633 its = max(grid%i_start(ij),ids)
3634 ite = min(grid%i_end(ij),ide-1)
3636 its = max(grid%i_start(ij),ids+sz)
3637 ite = min(grid%i_end(ij),ide-1-sz)
3639 jts = max(grid%j_start(ij),jds+sz)
3640 jte = min(grid%j_end(ij),jde-1-sz)
3642 if (config_flags%madwrf_opt == 2) then
3643 CALL wrf_debug ( 200 , ' call cloud_tracer_nudge' )
3645 CALL cloud_tracer_nudge( dtm, config_flags%madwrf_dt_relax, &
3646 config_flags%madwrf_dt_nudge, &
3648 moist(ims,kms,jms,P_QC), &
3649 moist(ims,kms,jms,P_QI), &
3650 moist(ims,kms,jms,P_QS), &
3651 tracer(ims,kms,jms,P_tr_qc), &
3652 tracer(ims,kms,jms,P_tr_qi), &
3653 tracer(ims,kms,jms,P_tr_qs), &
3654 ids, ide, jds, jde, kds, kde, &
3655 ims, ime, jms, jme, kms, kme, &
3656 its, ite, jts, jte, &
3660 CALL wrf_debug ( 200 , ' call moist_physics_prep' )
3661 BENCH_START(moist_physics_prep_tim)
3662 CALL moist_physics_prep_em( grid%t_2, grid%t_1, t0, grid%rho, &
3663 grid%al, grid%alb, grid%p, p8w, p0, grid%pb, &
3664 grid%ph_2, grid%phb, th_phy, pi_phy , p_phy, &
3665 grid%z, grid%z_at_w, dz8w, &
3666 dtm, grid%h_diabatic, &
3667 moist(ims,kms,jms,P_QV),grid%qv_diabatic, &
3668 moist(ims,kms,jms,P_QC),grid%qc_diabatic, &
3669 config_flags,grid%fnm, grid%fnp, &
3670 ids, ide, jds, jde, kds, kde, &
3671 ims, ime, jms, jme, kms, kme, &
3672 its, ite, jts, jte, &
3675 IF (config_flags%dust_emis.eq.1 .AND. config_flags%mp_physics.eq.thompsonaero) then
3676 CALL wrf_debug ( 200 , ' call bulk_dust_emis' )
3677 CALL bulk_dust_emis (grid%itimestep,dtm,config_flags%num_soil_layers &
3678 ,grid%u_phy,grid%v_phy,grid%rho,grid%alt &
3679 ,grid%u10,grid%v10,p8w,dz8w,grid%smois,grid%erod &
3680 ,grid%ivgtyp,grid%isltyp,grid%vegfra,grid%albbck,grid%xland &
3681 ,grid%dx, g, grid%qnifa2d, ids,ide, jds,jde, kds,kde &
3682 ,ims,ime, jms,jme, kms,kme &
3683 ,its,ite, jts,jte, k_start,k_end )
3686 BENCH_END(moist_physics_prep_tim)
3687 END DO scalar_tile_loop_1a
3688 !$OMP END PARALLEL DO
3690 CALL wrf_debug ( 200 , ' call microphysics_driver' )
3693 specified_bdy = config_flags%specified .OR. config_flags%nested
3694 channel_bdy = config_flags%specified .AND. config_flags%periodic_x
3696 BENCH_START(micro_driver_tim)
3699 ! WRFU_AlarmIsRinging always returned false, so using an alternate method to find out if it is time
3700 ! to dump history/restart files so microphysics can be told to calculate things like radar reflectivity.
3702 ! diagflag = .false.
3703 ! CALL WRFU_ALARMGET(grid%alarms( HISTORY_ALARM ),prevringtime=temp_time,RingInterval=intervaltime)
3704 ! CALL WRFU_ALARMGET(grid%alarms( RESTART_ALARM ),prevringtime=restart_time,RingInterval=restartinterval)
3705 ! CALL domain_clock_get ( grid, current_time=CurrTime )
3706 ! old_dt=min(old_dt,grid%dt)
3707 ! num = INT(old_dt * precision)
3709 ! CALL WRFU_TimeIntervalSet(dtInterval, Sn=num, Sd=den)
3710 ! IF (CurrTime .ge. temp_time + intervaltime - dtInterval .or. &
3711 ! CurrTime .ge. restart_time + restartinterval - dtInterval ) THEN
3714 ! WRITE(wrf_err_message,*)'diag_flag=',diag_flag
3715 ! CALL wrf_debug ( 0 , wrf_err_message )
3717 # include "HALO_EM_SBM.inc"
3721 CALL microphysics_driver( &
3722 & DT=dtm ,DX=grid%dx ,DY=grid%dy &
3723 & ,DZ8W=dz8w ,F_ICE_PHY=grid%f_ice_phy &
3724 & ,ITIMESTEP=grid%itimestep ,LOWLYR=grid%lowlyr &
3725 & ,P8W=p8w ,P=p_phy ,PI_PHY=pi_phy &
3726 & ,RHO=grid%rho ,SPEC_ZONE=grid%spec_zone &
3727 & ,SR=grid%sr ,TH=th_phy &
3728 & ,refl_10cm=grid%refl_10cm & ! hm, 9/22/09 for refl
3729 & ,vmi3d=grid%vmi3d & ! for P3
3730 & ,di3d=grid%di3d & ! for P3
3731 & ,rhopo3d=grid%rhopo3d & ! for P3
3732 & ,phii3d=grid%phii3d & ! for Jensen ISHMAEL
3733 & ,vmi3d_2=grid%vmi3d_2 & ! for P3
3734 & ,di3d_2=grid%di3d_2 & ! for P3
3735 & ,rhopo3d_2=grid%rhopo3d_2 & ! for P3
3736 & ,phii3d_2=grid%phii3d_2 & ! for Jensen ISHMAEL
3737 & ,vmi3d_3=grid%vmi3d_3 & ! for Jensen ISHMAEL
3738 & ,di3d_3=grid%di3d_3 & ! for Jensen ISHMAEL
3739 & ,rhopo3d_3=grid%rhopo3d_3 & ! for Jensen ISHMAEL
3740 & ,phii3d_3=grid%phii3d_3 & ! for Jensen ISHMAEL
3741 & ,itype=grid%itype & ! for Jensen ISHMAEL
3742 & ,itype_2=grid%itype_2 & ! for Jensen ISHMAEL
3743 & ,itype_3=grid%itype_3 & ! for Jensen ISHMAEL
3744 & ,WARM_RAIN=grid%warm_rain &
3746 & ,CLDFRA=grid%cldfra, EXCH_H=grid%exch_h &
3747 & ,NSOURCE=grid%qndropsource &
3749 & ,QLSINK=grid%qlsink,CLDFRA_OLD=grid%cldfra_old &
3750 & ,PRECR=grid%precr, PRECI=grid%preci, PRECS=grid%precs, PRECG=grid%precg &
3751 & ,CHEM_OPT=config_flags%chem_opt, PROGN=config_flags%progn &
3752 !======================
3753 ! Variables required for CAMMGMP Scheme when run with WRF_CHEM
3755 & ,QME3D=grid%qme3d,PRAIN3D=grid%prain3d &
3756 & ,NEVAPR3D=grid%nevapr3d &
3757 & ,RATE1ORD_CW2PR_ST3D=grid%rate1ord_cw2pr_st3d &
3758 & ,DGNUM4D=grid%dgnum4d,DGNUMWET4D=grid%dgnumwet4d &
3759 !======================
3761 & ,XLAND=grid%xland,SNOWH=grid%SNOW & !PMA
3762 & ,SPECIFIED=specified_bdy, CHANNEL_SWITCH=channel_bdy &
3763 & ,F_RAIN_PHY=grid%f_rain_phy &
3764 & ,F_RIMEF_PHY=grid%f_rimef_phy &
3765 & ,MP_PHYSICS=config_flags%mp_physics &
3767 & ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
3768 & ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
3769 & ,IPS=ips,IPE=ipe, JPS=jps,JPE=jpe, KPS=kps,KPE=kpe &
3770 & ,I_START=grid%i_start,I_END=min(grid%i_end, ide-1) &
3771 & ,J_START=grid%j_start,J_END=min(grid%j_end, jde-1) &
3772 & ,KTS=k_start, KTE=min(k_end,kde-1) &
3773 & ,NUM_TILES=grid%num_tiles &
3775 !===================== IRRIGATION =========================
3776 & ,IRRIGATION=grid%irrigation &
3777 & ,SF_SURF_IRR_SCHEME=config_flags%sf_surf_irr_scheme &
3778 & ,IRR_DAILY_AMOUNT=config_flags%irr_daily_amount &
3779 & ,IRR_START_HOUR=config_flags%irr_start_hour &
3780 & ,IRR_NUM_HOURS=config_flags%irr_num_hours &
3781 & ,JULIAN_IN=grid%julian &
3782 & ,IRR_START_JULIANDAY=config_flags%irr_start_julianday &
3783 & ,IRR_END_JULIANDAY=config_flags%irr_end_julianday &
3784 & ,IRR_FREQ=config_flags%irr_freq,IRR_PH=config_flags%irr_ph &
3785 & ,IRR_RAND_FIELD=grid%irr_rand_field &
3786 & ,GMT=grid%gmt,XTIME=grid%xtime &
3787 !======================
3788 ! Variables required for CAMMGMP Scheme
3789 & ,DLF=grid%dlf,DLF2=grid%dlf2,T_PHY=grid%t_phy,P_HYD=grid%p_hyd &
3790 & ,P8W_HYD=grid%p_hyd_w,TKE_PBL=grid%tke_pbl,PBLH=grid%PBLH &
3791 & ,Z_AT_MASS=grid%z,Z_AT_W=grid%z_at_w &
3792 & ,QFX=grid%qfx,RLIQ=grid%rliq &
3793 & ,TURBTYPE3D=grid%turbtype3d,SMAW3D=grid%smaw3d &
3794 & ,WSEDL3D=grid%wsedl3d,CLDFRA_OLD_MP=grid%cldfra_old_mp &
3795 & ,CLDFRA_MP=grid%cldfra_mp,CLDFRA_MP_ALL=grid%cldfra_mp_ALL &
3796 & ,LRADIUS=grid%LRADIUS, IRADIUS=grid%IRADIUS & !BSINGH(01/20/2014): Added for RRTMG<->CAMMGMP
3797 & ,CLDFRAI=grid%cldfrai &
3798 & ,CLDFRAL=grid%cldfral,CLDFRA_CONV=grid%CLDFRA_CONV &
3800 & ,ACCUM_MODE=config_flags%accum_mode &
3801 & ,AITKEN_MODE=config_flags%aitken_mode &
3802 & ,COARSE_MODE=config_flags%coarse_mode &
3803 & ,ICWMRSH3D=grid%icwmrsh,ICWMRDP3D=grid%icwmrdp3d &
3804 & ,SHFRC3D=grid%shfrc3d,CMFMC3D=grid%cmfmc &
3805 & ,CMFMC2_3D=grid%cmfmc2,CONFIG_FLAGS=config_flags &
3806 & ,FNM=grid%fnm,FNP=grid%fnp,RH_OLD_MP=grid%rh_old_mp &
3807 & ,LCD_OLD_MP=grid%lcd_old_mp &
3808 !======================
3810 & , RAINNC=grid%rainnc, RAINNCV=grid%rainncv &
3811 & , SNOWNC=grid%snownc, SNOWNCV=grid%snowncv &
3812 & , GRAUPELNC=grid%graupelnc, GRAUPELNCV=grid%graupelncv & ! for milbrandt2mom
3813 & , HAILNC=grid%hailnc, HAILNCV=grid%hailncv &
3814 & , W=grid%w_2, Z=grid%z, HT=grid%ht &
3815 & , MP_RESTART_STATE=grid%mp_restart_state &
3816 & , TBPVS_STATE=grid%tbpvs_state & ! etampnew
3817 & , TBPVS0_STATE=grid%tbpvs0_state & ! etampnew
3818 & , QV_CURR=moist(ims,kms,jms,P_QV), F_QV=F_QV &
3819 & , QC_CURR=moist(ims,kms,jms,P_QC), F_QC=F_QC &
3820 & , QR_CURR=moist(ims,kms,jms,P_QR), F_QR=F_QR &
3821 & , QI_CURR=moist(ims,kms,jms,P_QI), F_QI=F_QI &
3822 & , QS_CURR=moist(ims,kms,jms,P_QS), F_QS=F_QS &
3823 & , QG_CURR=moist(ims,kms,jms,P_QG), F_QG=F_QG &
3824 & , QH_CURR=moist(ims,kms,jms,P_QH), F_QH=F_QH & ! for milbrandt2mom
3825 & , QIC_CURR=moist(ims,kms,jms,P_QIC), F_QIC=F_QIC &
3826 & , QIP_CURR=moist(ims,kms,jms,P_QIP), F_QIP=F_QIP &
3827 & , QID_CURR=moist(ims,kms,jms,P_QID), F_QID=F_QID &
3828 & , QNDROP_CURR=scalar(ims,kms,jms,P_QNDROP), F_QNDROP=F_QNDROP &
3830 & , RAINPROD=wetscav_frcing(ims,kms,jms,p_rainprod) &
3831 & , EVAPPROD=wetscav_frcing(ims,kms,jms,p_evapprod) &
3832 & , QV_B4MP=grid%qv_b4mp,QC_B4MP=grid%qc_b4mp &
3833 & , QI_B4MP=grid%qi_b4mp, QS_B4MP=grid%qs_b4mp &
3835 & , QT_CURR=scalar(ims,kms,jms,P_QT), F_QT=F_QT &
3836 & , QNN_CURR=scalar(ims,kms,jms,P_QNN), F_QNN=F_QNN &
3837 & , QNI_CURR=scalar(ims,kms,jms,P_QNI), F_QNI=F_QNI &
3838 & , QNC_CURR=scalar(ims,kms,jms,P_QNC), F_QNC=F_QNC &
3839 & , QNR_CURR=scalar(ims,kms,jms,P_QNR), F_QNR=F_QNR &
3840 & , QNS_CURR=scalar(ims,kms,jms,P_QNS), F_QNS=F_QNS &
3841 & , QNG_CURR=scalar(ims,kms,jms,P_QNG), F_QNG=F_QNG &
3842 & , QNWFA_CURR=scalar(ims,kms,jms,P_QNWFA), F_QNWFA=F_QNWFA & ! for Thompson water-friendly aerosol
3843 & , QNIFA_CURR=scalar(ims,kms,jms,P_QNIFA), F_QNIFA=F_QNIFA & ! for Thompson ice-friendly aerosol
3844 & , QNBCA_CURR=scalar(ims,kms,jms,P_QNBCA), F_QNBCA=F_QNBCA & ! for Thompson black carbon aerosol
3845 & , QNH_CURR=scalar(ims,kms,jms,P_QNH), F_QNH=F_QNH & ! for milbrandt2mom and nssl_2mom
3846 & , QNIC_CURR=scalar(ims,kms,jms,P_QNIC), F_QNIC=F_QNIC &
3847 & , QNIP_CURR=scalar(ims,kms,jms,P_QNIP), F_QNIP=F_QNIP &
3848 & , QNID_CURR=scalar(ims,kms,jms,P_QNID), F_QNID=F_QNID &
3849 & , QIR_CURR=scalar(ims,kms,jms,P_QIR), F_QIR=F_QIR & ! for P3
3850 & , QIB_CURR=scalar(ims,kms,jms,P_QIB), F_QIB=F_QIB & ! for P3
3851 & , QVOLI_CURR=scalar(ims,kms,jms,P_QVOLI), F_QVOLI=F_QVOLI & ! for Jensen ISHMAEL
3852 & , QAOLI_CURR=scalar(ims,kms,jms,P_QAOLI), F_QAOLI=F_QAOLI & ! for Jensen ISHMAEL
3853 & , QI2_CURR=moist(ims,kms,jms,P_QI2), F_QI2=F_QI2 & ! for P3
3854 & , QNI2_CURR=scalar(ims,kms,jms,P_QNI2), F_QNI2=F_QNI2 & ! for P3
3855 & , QIR2_CURR=scalar(ims,kms,jms,P_QIR2), F_QIR2=F_QIR2 & ! for P3
3856 & , QIB2_CURR=scalar(ims,kms,jms,P_QIB2), F_QIB2=F_QIB2 & ! for P3
3857 & , QVOLI2_CURR=scalar(ims,kms,jms,P_QVOLI2), F_QVOLI2=F_QVOLI2 & ! for Jensen ISHMAEL
3858 & , QAOLI2_CURR=scalar(ims,kms,jms,P_QAOLI2), F_QAOLI2=F_QAOLI2 & ! for Jensen ISHMAEL
3859 & , QI3_CURR=moist(ims,kms,jms,P_QI3), F_QI3=F_QI3 & ! for Jensen ISHMAEL
3860 & , QNI3_CURR=scalar(ims,kms,jms,P_QNI3), F_QNI3=F_QNI3 & ! for Jensen ISHMAEL
3861 & , QVOLI3_CURR=scalar(ims,kms,jms,P_QVOLI3), F_QVOLI3=F_QVOLI3 & ! for Jensen ISHMAEL
3862 & , QAOLI3_CURR=scalar(ims,kms,jms,P_QAOLI3), F_QAOLI3=F_QAOLI3 & ! for Jensen ISHMAEL
3863 ! & , QZR_CURR=scalar(ims,kms,jms,P_QZR), F_QZR=F_QZR & ! for milbrandt3mom
3864 & , QZI_CURR=scalar(ims,kms,jms,P_QZI), F_QZI=F_QZI & ! for 3-moment P3
3865 ! & , QZS_CURR=scalar(ims,kms,jms,P_QZS), F_QZS=F_QZS & ! "
3866 ! & , QZG_CURR=scalar(ims,kms,jms,P_QZG), F_QZG=F_QZG & ! "
3867 ! & , QZH_CURR=scalar(ims,kms,jms,P_QZH), F_QZH=F_QZH & ! "
3868 & , QVOLG_CURR=scalar(ims,kms,jms,P_QVOLG), F_QVOLG=F_QVOLG & ! for nssl_2mom
3869 & , QVOLH_CURR=scalar(ims,kms,jms,P_QVOLH), F_QVOLH=F_QVOLH & ! for nssl_2mom
3870 & , QDCN_CURR=scalar(ims,kms,jms,P_QDCN), F_QDCN=F_QDCN & ! for ntu3m
3871 & , QTCN_CURR=scalar(ims,kms,jms,P_QTCN), F_QTCN=F_QTCN & ! for ntu3m
3872 & , QCCN_CURR=scalar(ims,kms,jms,P_QCCN), F_QCCN=F_QCCN & ! for ntu3m
3873 & , QRCN_CURR=scalar(ims,kms,jms,P_QRCN), F_QRCN=F_QRCN & ! for ntu3m
3874 & , QNIN_CURR=scalar(ims,kms,jms,P_QNIN), F_QNIN=F_QNIN & ! for ntu3m
3875 & , FI_CURR=scalar(ims,kms,jms,P_FI), F_FI=F_FI & ! for ntu3m
3876 & , FS_CURR=scalar(ims,kms,jms,P_FS), F_FS=F_FS & ! for ntu3m
3877 & , VI_CURR=scalar(ims,kms,jms,P_VI), F_VI=F_VI & ! for ntu3m
3878 & , VS_CURR=scalar(ims,kms,jms,P_VS), F_VS=F_VS & ! for ntu3m
3879 & , VG_CURR=scalar(ims,kms,jms,P_VG), F_VG=F_VG & ! for ntu3m
3880 & , AI_CURR=scalar(ims,kms,jms,P_AI), F_AI=F_AI & ! for ntu3m
3881 & , AS_CURR=scalar(ims,kms,jms,P_AS), F_AS=F_AS & ! for ntu3m
3882 & , AG_CURR=scalar(ims,kms,jms,P_AG), F_AG=F_AG & ! for ntu3m
3883 & , AH_CURR=scalar(ims,kms,jms,P_AH), F_AH=F_AH & ! for ntu3m
3884 & , I3M_CURR=scalar(ims,kms,jms,P_I3M), F_I3M=F_I3m & ! for ntu3m
3885 & , cu_used=config_flags%cu_used &
3886 & , qrcuten=grid%rqrcuten, qscuten=grid%rqscuten &
3887 & , qicuten=grid%rqicuten, qccuten=grid%rqccuten &
3888 & , HAIL=config_flags%gsfcgce_hail & ! for gsfcgce
3889 & , ICE2=config_flags%gsfcgce_2ice & ! for gsfcgce
3890 & , PHYS_TOT=grid%phys_tot & ! for gsfcgce
3891 & , PHYSC=grid%physc & ! for gsfcgce
3892 & , PHYSE=grid%physe & ! for gsfcgce
3893 & , PHYSD=grid%physd & ! for gsfcgce
3894 & , PHYSS=grid%physs & ! for gsfcgce
3895 & , PHYSM=grid%physm & ! for gsfcgce
3896 & , PHYSF=grid%physf & ! for gsfcgce
3898 & , ACPHYS_TOT=grid%acphys_tot & ! for gsfcgce
3899 & , ACPHYSC=grid%acphysc & ! for gsfcgce
3900 & , ACPHYSE=grid%acphyse & ! for gsfcgce
3901 & , ACPHYSD=grid%acphysd & ! for gsfcgce
3902 & , ACPHYSS=grid%acphyss & ! for gsfcgce
3903 & , ACPHYSM=grid%acphysm & ! for gsfcgce
3904 & , ACPHYSF=grid%acphysf & ! for gsfcgce
3906 & , RE_CLOUD_GSFC=grid%re_cloud_gsfc & ! for gsfcgce
3907 & , RE_RAIN_GSFC=grid%re_rain_gsfc & ! for gsfcgce
3908 & , RE_ICE_GSFC=grid%re_ice_gsfc & ! for gsfcgce
3909 & , RE_SNOW_GSFC=grid%re_snow_gsfc & ! for gsfcgce
3910 & , RE_GRAUPEL_GSFC=grid%re_graupel_gsfc & ! for gsfcgce
3911 & , RE_HAIL_GSFC=grid%re_hail_gsfc & ! for gsfcgce
3912 & , PRECR3D=grid%precr3d, PRECI3D=grid%preci3d, PRECS3D=grid%precs3d &
3913 & , PRECG3D=grid%precg3d, PRECH3D=grid%prech3d &
3914 #if ( WRF_CHEM == 1)
3915 & , GSFCGCE_GOCART_COUPLING=config_flags%gsfcgce_gocart_coupling &
3916 & , ICN_DIAG=grid%icn_diag & ! inline gocart
3917 & , NC_DIAG=grid%nc_diag & ! inline gocart
3919 !NUWRF JJS 20110525 ^^^^^
3920 ! & , ccntype=config_flags%milbrandt_ccntype & ! for milbrandt (2mom)
3923 & , RI_CURR=grid%rimi &
3924 & , re_cloud=grid%re_cloud, re_ice=grid%re_ice, re_snow=grid%re_snow & ! G. Thompson
3925 & , has_reqc=grid%has_reqc, has_reqi=grid%has_reqi, has_reqs=grid%has_reqs & ! G. Thompson
3926 & , qnwfa2d=grid%qnwfa2d, qnifa2d=grid%qnifa2d, qnbca2d=grid%qnbca2d & ! G. Thompson
3927 & , qnocbb2d=grid%qnocbb2d, qnbcbb2d=grid%qnbcbb2d & ! for biomass burning emissions
3928 & , diagflag=diag_flag, do_radar_ref=config_flags%do_radar_ref &
3929 & , ke_diag=ke_diag &
3930 & ,u=grid%u_phy,v=grid%v_phy &
3931 & ,scalar=scalar,num_scalar=num_scalar &
3932 & ,TH_OLD=grid%th_old &
3933 & ,QV_OLD=grid%qv_old &
3934 & ,xlat=grid%xlat,xlong=grid%xlong,IVGTYP=grid%ivgtyp &
3935 & , EFFR_CURR=scalar(ims,kms,jms,P_EFFR), F_EFFR=F_EFFR & ! for SBM
3936 & , ICE_EFFR_CURR=scalar(ims,kms,jms,P_ICE_EFFR), F_ICE_EFFR=F_ICE_EFFR & ! for SBM
3937 & , TOT_EFFR_CURR=scalar(ims,kms,jms,P_TOT_EFFR), F_TOT_EFFR=F_TOT_EFFR & ! for SBM
3938 & , QIC_EFFR_CURR=scalar(ims,kms,jms,P_QIC_EFFR), F_QIC_EFFR=F_QIC_EFFR & ! for SBM
3939 & , QIP_EFFR_CURR=scalar(ims,kms,jms,P_QIP_EFFR), F_QIP_EFFR=F_QIP_EFFR & ! for SBM
3940 & , QID_EFFR_CURR=scalar(ims,kms,jms,P_QID_EFFR), F_QID_EFFR=F_QID_EFFR & ! for SBM
3941 & ,kext_ql=grid%kext_ql &
3942 & ,kext_qs=grid%kext_qs &
3943 & ,kext_qg=grid%kext_qg &
3944 & ,kext_qh=grid%kext_qh &
3945 & ,kext_qa=grid%kext_qa &
3946 & ,kext_qic=grid%kext_qic &
3947 & ,kext_qip=grid%kext_qip &
3948 & ,kext_qid=grid%kext_qid &
3949 & ,kext_ft_qic=grid%kext_ft_qic &
3950 & ,kext_ft_qip=grid%kext_ft_qip &
3951 & ,kext_ft_qid=grid%kext_ft_qid &
3952 & ,kext_ft_qs=grid%kext_ft_qs &
3953 & ,kext_ft_qg=grid%kext_ft_qg &
3954 & ,height=grid%height &
3955 & ,tempc=grid%tempc &
3956 & ,ccn_conc=grid%ccn_conc & ! RAS
3957 & ,sbmradar=sbmradar,num_sbmradar=num_sbmradar & ! for SBM
3958 & ,sbm_diagnostics=config_flags%sbm_diagnostics & ! for SBM
3960 & ,aercu_fct=config_flags%aercu_fct &
3961 & ,aercu_opt=config_flags%aercu_opt &
3962 & ,no_src_types_cu=grid%no_src_types_cu &
3963 & ,PBL=grid%bl_pbl_physics,EFCG=grid%EFCG,EFIG=grid%EFIG,EFSG=grid%EFSG &
3964 & ,WACT=grid%WACT,CCN1_GS=grid%CCN1_GS,CCN2_GS=grid%CCN2_GS,CCN3_GS=grid%CCN3_GS &
3965 & ,CCN4_GS=grid%CCN4_GS,CCN5_GS=grid%CCN5_GS,CCN6_GS=grid%CCN6_GS &
3966 & ,CCN7_GS=grid%CCN7_GS,NR_CU=grid%NR_CU,QR_CU=grid%QR_CU,NS_CU=grid%NS_CU &
3967 & ,QS_CU=grid%QS_CU,CU_UAF=grid%CU_UAF,mskf_refl_10cm=grid%mskf_refl_10cm &
3969 & ,multi_perturb=config_flags%multi_perturb &
3970 & ,pert_thom=config_flags%pert_thom &
3971 & ,perts_qvapor=grid%pert3d(:,:,:,P_PQVAPOR) &
3972 & ,perts_qcloud=grid%pert3d(:,:,:,P_PQCLOUD) &
3973 & ,perts_qice=grid%pert3d(:,:,:,P_PQICE) &
3974 & ,perts_qsnow=grid%pert3d(:,:,:,P_PQSNOW) &
3975 & ,perts_ni=grid%pert3d(:,:,:,P_PNI) &
3976 & ,pert_thom_qv=config_flags%pert_thom_qv &
3977 & ,pert_thom_qc=config_flags%pert_thom_qc &
3978 & ,pert_thom_qi=config_flags%pert_thom_qi &
3979 & ,pert_thom_qs=config_flags%pert_thom_qs &
3980 & ,pert_thom_ni=config_flags%pert_thom_ni )
3982 BENCH_END(micro_driver_tim)
3985 BENCH_START(microswap_2)
3986 ! for load balancing; communication to redistribute the points
3987 IF ( config_flags%mp_physics .EQ. ETAMPNEW .OR. &
3988 & config_flags%mp_physics .EQ. FER_MP_HIRES) THEN
3989 #include "SWAP_ETAMP_NEW.inc"
3990 ELSE IF ( config_flags%mp_physics .EQ. WSM3SCHEME ) THEN
3991 #include "SWAP_WSM3.inc"
3993 BENCH_END(microswap_2)
3996 CALL wrf_debug ( 200 , ' call moist_physics_finish' )
3997 BENCH_START(moist_phys_end_tim)
4000 !$OMP PRIVATE ( ij, its, ite, jts, jte, im, ii, jj, kk )
4002 DO ij = 1 , grid%num_tiles
4004 its = max(grid%i_start(ij),ids)
4005 ite = min(grid%i_end(ij),ide-1)
4006 jts = max(grid%j_start(ij),jds)
4007 jte = min(grid%j_end(ij),jde-1)
4009 CALL microphysics_zero_outb ( &
4010 moist , num_moist , config_flags , &
4011 ids, ide, jds, jde, kds, kde, &
4012 ims, ime, jms, jme, kms, kme, &
4013 its, ite, jts, jte, &
4016 CALL microphysics_zero_outb ( &
4017 scalar , num_scalar , config_flags , &
4018 ids, ide, jds, jde, kds, kde, &
4019 ims, ime, jms, jme, kms, kme, &
4020 its, ite, jts, jte, &
4023 CALL microphysics_zero_outb ( &
4024 chem , num_chem , config_flags , &
4025 ids, ide, jds, jde, kds, kde, &
4026 ims, ime, jms, jme, kms, kme, &
4027 its, ite, jts, jte, &
4029 CALL microphysics_zero_outb ( &
4030 tracer , num_tracer , config_flags , &
4031 ids, ide, jds, jde, kds, kde, &
4032 ims, ime, jms, jme, kms, kme, &
4033 its, ite, jts, jte, &
4036 IF ( config_flags%periodic_x ) THEN
4037 its = max(grid%i_start(ij),ids)
4038 ite = min(grid%i_end(ij),ide-1)
4040 its = max(grid%i_start(ij),ids+sz)
4041 ite = min(grid%i_end(ij),ide-1-sz)
4043 jts = max(grid%j_start(ij),jds+sz)
4044 jte = min(grid%j_end(ij),jde-1-sz)
4046 CALL microphysics_zero_outa ( &
4047 moist , num_moist , config_flags , &
4048 ids, ide, jds, jde, kds, kde, &
4049 ims, ime, jms, jme, kms, kme, &
4050 its, ite, jts, jte, &
4053 CALL microphysics_zero_outa ( &
4054 scalar , num_scalar , config_flags , &
4055 ids, ide, jds, jde, kds, kde, &
4056 ims, ime, jms, jme, kms, kme, &
4057 its, ite, jts, jte, &
4060 CALL microphysics_zero_outa ( &
4061 chem , num_chem , config_flags , &
4062 ids, ide, jds, jde, kds, kde, &
4063 ims, ime, jms, jme, kms, kme, &
4064 its, ite, jts, jte, &
4067 CALL microphysics_zero_outa ( &
4068 tracer , num_tracer , config_flags , &
4069 ids, ide, jds, jde, kds, kde, &
4070 ims, ime, jms, jme, kms, kme, &
4071 its, ite, jts, jte, &
4074 CALL moist_physics_finish_em( grid%t_2, grid%t_1, t0, grid%muts, th_phy, &
4075 grid%h_diabatic, dtm, &
4076 moist(ims,kms,jms,P_QV),grid%qv_diabatic, &
4077 moist(ims,kms,jms,P_QC),grid%qc_diabatic, &
4080 #if ( WRF_DFI_RADAR == 1 )
4081 grid%dfi_tten_rad,grid%dfi_stage, &
4083 ids, ide, jds, jde, kds, kde, &
4084 ims, ime, jms, jme, kms, kme, &
4085 its, ite, jts, jte, &
4089 !$OMP END PARALLEL DO
4091 #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
4092 # include "HALO_EM_THETAM.inc"
4093 # include "PERIOD_EM_THETAM.inc"
4097 CALL set_physical_bc3d( grid%h_diabatic, 'p', config_flags, &
4098 ids, ide, jds, jde, kds, kde, &
4099 ims, ime, jms, jme, kms, kme, &
4100 ips, ipe, jps, jpe, kps, kpe, &
4101 its, ite, jts, jte, &
4103 ENDIF ! microphysics test
4105 !-----------------------------------------------------------
4106 ! filter for moist variables post-microphysics and end of timestep
4107 !-----------------------------------------------------------
4109 IF (config_flags%polar) THEN
4110 IF ( num_3d_m >= PARAM_FIRST_SCALAR ) THEN
4111 CALL wrf_debug ( 200 , ' call filter moist' )
4112 DO im = PARAM_FIRST_SCALAR, num_3d_m
4113 IF ( config_flags%coupled_filtering ) THEN
4114 CALL couple_scalars_for_filter ( FIELD=moist(ims,kms,jms,im) &
4115 ,MU=grid%mu_2 , MUB=grid%mub &
4116 ,C1=grid%c1h , C2=grid%c2h &
4117 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4118 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4119 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4122 CALL pxft ( grid=grid &
4135 ,actual_distance_average=config_flags%actual_distance_average&
4136 ,pos_def = config_flags%pos_def &
4137 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
4138 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
4139 ,fft_filter_lat = config_flags%fft_filter_lat &
4141 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4142 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4143 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
4144 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
4145 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
4147 IF ( config_flags%coupled_filtering ) THEN
4148 CALL uncouple_scalars_for_filter ( FIELD=moist(ims,kms,jms,im) &
4149 ,MU=grid%mu_2 , MUB=grid%mub &
4150 ,C1=grid%c1h , C2=grid%c2h &
4151 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4152 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4153 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4159 !-----------------------------------------------------------
4160 ! end filter for moist variables post-microphysics and end of timestep
4161 !-----------------------------------------------------------
4165 !$OMP PRIVATE ( ij, its, ite, jts, jte, im, ii, jj, kk )
4166 scalar_tile_loop_1ba: DO ij = 1 , grid%num_tiles
4168 IF ( config_flags%periodic_x ) THEN
4169 its = max(grid%i_start(ij),ids)
4170 ite = min(grid%i_end(ij),ide-1)
4172 its = max(grid%i_start(ij),ids+sz)
4173 ite = min(grid%i_end(ij),ide-1-sz)
4175 jts = max(grid%j_start(ij),jds+sz)
4176 jte = min(grid%j_end(ij),jde-1-sz)
4178 CALL calc_p_rho_phi( moist, num_3d_m, config_flags%hypsometric_opt, &
4179 grid%al, grid%alb, grid%mu_2, grid%muts, &
4180 grid%c1h, grid%c2h, grid%c3h, grid%c4h, grid%c3f, grid%c4f, &
4181 grid%ph_2, grid%phb, grid%p, grid%pb, grid%t_2, &
4182 p0, t0, grid%p_top, grid%znu, grid%znw, grid%dnw, grid%rdnw, &
4183 grid%rdn, config_flags%non_hydrostatic,config_flags%use_theta_m, &
4184 ids, ide, jds, jde, kds, kde, &
4185 ims, ime, jms, jme, kms, kme, &
4186 its, ite, jts, jte, &
4189 END DO scalar_tile_loop_1ba
4190 !$OMP END PARALLEL DO
4191 BENCH_END(moist_phys_end_tim)
4193 IF (.not. config_flags%non_hydrostatic) THEN
4195 # include "HALO_EM_HYDRO_UV.inc"
4196 # include "PERIOD_EM_HYDRO_UV.inc"
4199 !$OMP PRIVATE ( ij )
4200 DO ij = 1 , grid%num_tiles
4201 CALL diagnose_w( ph_tend, grid%ph_2, grid%ph_1, grid%w_2, grid%muts, &
4202 grid%c1f, grid%c2f, dt_rk, &
4203 grid%u_2, grid%v_2, grid%ht, &
4204 grid%cf1, grid%cf2, grid%cf3, grid%rdx, grid%rdy, grid%msftx, grid%msfty, &
4205 ids, ide, jds, jde, kds, kde, &
4206 ims, ime, jms, jme, kms, kme, &
4207 grid%i_start(ij), grid%i_end(ij), &
4208 grid%j_start(ij), grid%j_end(ij), &
4212 !$OMP END PARALLEL DO
4216 CALL wrf_debug ( 200 , ' call chem polar filter ' )
4218 !-----------------------------------------------------------
4219 ! filter for chem and scalar variables at end of timestep
4220 !-----------------------------------------------------------
4222 IF (config_flags%polar) THEN
4224 IF ( num_3d_c >= PARAM_FIRST_SCALAR ) then
4225 chem_filter_loop: DO im = PARAM_FIRST_SCALAR, num_3d_c
4226 IF ( config_flags%coupled_filtering ) THEN
4227 CALL couple_scalars_for_filter ( FIELD=chem(ims,kms,jms,im) &
4228 ,MU=grid%mu_2 , MUB=grid%mub &
4229 ,C1=grid%c1h , C2=grid%c2h &
4230 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4231 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4232 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4235 CALL pxft ( grid=grid &
4248 ,actual_distance_average=config_flags%actual_distance_average&
4249 ,pos_def = config_flags%pos_def &
4250 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
4251 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
4252 ,fft_filter_lat = config_flags%fft_filter_lat &
4254 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4255 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4256 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
4257 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
4258 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
4260 IF ( config_flags%coupled_filtering ) THEN
4261 CALL uncouple_scalars_for_filter ( FIELD=chem(ims,kms,jms,im) &
4262 ,MU=grid%mu_2 , MUB=grid%mub &
4263 ,C1=grid%c1h , C2=grid%c2h &
4264 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4265 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4266 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4268 ENDDO chem_filter_loop
4270 IF ( num_tracer >= PARAM_FIRST_SCALAR ) then
4271 tracer_filter_loop: DO im = PARAM_FIRST_SCALAR, num_tracer
4272 IF ( config_flags%coupled_filtering ) THEN
4273 CALL couple_scalars_for_filter ( FIELD=tracer(ims,kms,jms,im) &
4274 ,MU=grid%mu_2 , MUB=grid%mub &
4275 ,C1=grid%c1h , C2=grid%c2h &
4276 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4277 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4278 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4281 CALL pxft ( grid=grid &
4294 ,actual_distance_average=config_flags%actual_distance_average&
4295 ,pos_def = config_flags%pos_def &
4296 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
4297 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
4298 ,fft_filter_lat = config_flags%fft_filter_lat &
4300 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4301 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4302 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
4303 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
4304 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
4306 IF ( config_flags%coupled_filtering ) THEN
4307 CALL uncouple_scalars_for_filter ( FIELD=tracer(ims,kms,jms,im) &
4308 ,MU=grid%mu_2 , MUB=grid%mub &
4309 ,C1=grid%c1h , C2=grid%c2h &
4310 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4311 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4312 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4314 ENDDO tracer_filter_loop
4317 IF ( num_3d_s >= PARAM_FIRST_SCALAR ) then
4318 scalar_filter_loop: DO im = PARAM_FIRST_SCALAR, num_3d_s
4319 IF ( config_flags%coupled_filtering ) THEN
4320 CALL couple_scalars_for_filter ( FIELD=scalar(ims,kms,jms,im) &
4321 ,MU=grid%mu_2 , MUB=grid%mub &
4322 ,C1=grid%c1h , C2=grid%c2h &
4323 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4324 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4325 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4328 CALL pxft ( grid=grid &
4341 ,actual_distance_average=config_flags%actual_distance_average&
4342 ,pos_def = config_flags%pos_def &
4343 ,swap_pole_with_next_j = config_flags%swap_pole_with_next_j &
4344 ,moist=moist,chem=chem,tracer=tracer,scalar=scalar &
4345 ,fft_filter_lat = config_flags%fft_filter_lat &
4347 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4348 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4349 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe &
4350 ,imsx=imsx,imex=imex,jmsx=jmsx,jmex=jmex,kmsx=kmsx,kmex=kmex &
4351 ,ipsx=ipsx,ipex=ipex,jpsx=jmsx,jpex=jpex,kpsx=kpsx,kpex=kpex )
4353 IF ( config_flags%coupled_filtering ) THEN
4354 CALL uncouple_scalars_for_filter ( FIELD=scalar(ims,kms,jms,im) &
4355 ,MU=grid%mu_2 , MUB=grid%mub &
4356 ,C1=grid%c1h , C2=grid%c2h &
4357 ,ids=ids,ide=ide,jds=jds,jde=jde,kds=kds,kde=kde &
4358 ,ims=ims,ime=ime,jms=jms,jme=jme,kms=kms,kme=kme &
4359 ,ips=ips,ipe=ipe,jps=jps,jpe=jpe,kps=kps,kpe=kpe )
4361 ENDDO scalar_filter_loop
4365 !-----------------------------------------------------------
4366 ! end filter for chem and scalar variables at end of timestep
4367 !-----------------------------------------------------------
4369 ! We're finished except for boundary condition (and patch) update
4371 ! Boundary condition time (or communication time). At this time, we have
4372 ! implemented periodic and symmetric physical boundary conditions.
4374 ! b.c. routine for data within patch.
4376 ! we need to do both time levels of
4377 ! data because the time filter only works in the physical solution space.
4379 ! First, do patch communications for boundary conditions (periodicity)
4381 !-----------------------------------------------------------
4382 ! Stencils for patch communications (WCS, 29 June 2001)
4384 ! here's where we need a wide comm stencil - these are the
4385 ! uncoupled variables so are used for high order calc in
4386 ! advection and mixong routines.
4390 ! * + * * + * * * + * *
4415 !----------------------------------------------------------
4419 IF ( config_flags%h_mom_adv_order <= 4 .and. config_flags%h_sca_adv_order <= 4 ) THEN
4420 # include "HALO_EM_D3_3.inc"
4421 ELSE IF ( config_flags%h_mom_adv_order <= 6 .and. config_flags%h_sca_adv_order <= 6 ) THEN
4422 # include "HALO_EM_D3_5.inc"
4424 WRITE(wrf_err_message,*)'solve_em: invalid h_mom_adv_order or h_sca_adv_order = ', &
4425 config_flags%h_mom_adv_order, config_flags%h_sca_adv_order
4426 CALL wrf_error_fatal(TRIM(wrf_err_message))
4428 # include "PERIOD_BDY_EM_D3.inc"
4429 # include "PERIOD_BDY_EM_MOIST.inc"
4430 # include "PERIOD_BDY_EM_CHEM.inc"
4431 # include "PERIOD_BDY_EM_TRACER.inc"
4432 # include "PERIOD_BDY_EM_SCALAR.inc"
4435 ! now set physical b.c on a patch
4437 BENCH_START(bc_2d_tim)
4439 !$OMP PRIVATE ( ij )
4440 tile_bc_loop_2: DO ij = 1 , grid%num_tiles
4442 CALL wrf_debug ( 200 , ' call set_phys_bc_dry_2' )
4444 CALL set_phys_bc_dry_2( config_flags, &
4445 grid%u_1, grid%u_2, grid%v_1, grid%v_2, grid%w_1, grid%w_2, &
4446 grid%t_1, grid%t_2, grid%ph_1, grid%ph_2, grid%mu_1, grid%mu_2, &
4447 ids, ide, jds, jde, kds, kde, &
4448 ims, ime, jms, jme, kms, kme, &
4449 ips, ipe, jps, jpe, kps, kpe, &
4450 grid%i_start(ij), grid%i_end(ij), &
4451 grid%j_start(ij), grid%j_end(ij), &
4454 CALL set_physical_bc3d( grid%tke_1, 'p', config_flags, &
4455 ids, ide, jds, jde, kds, kde, &
4456 ims, ime, jms, jme, kms, kme, &
4457 ips, ipe, jps, jpe, kps, kpe, &
4458 grid%i_start(ij), grid%i_end(ij), &
4459 grid%j_start(ij), grid%j_end(ij), &
4462 CALL set_physical_bc3d( grid%tke_2 , 'p', config_flags, &
4463 ids, ide, jds, jde, kds, kde, &
4464 ims, ime, jms, jme, kms, kme, &
4465 ips, ipe, jps, jpe, kps, kpe, &
4466 grid%i_start(ij), grid%i_end(ij), &
4467 grid%j_start(ij), grid%j_end(ij), &
4470 moisture_loop_bdy_2 : DO im = PARAM_FIRST_SCALAR , num_3d_m
4472 CALL set_physical_bc3d( moist(ims,kms,jms,im), 'p', &
4474 ids, ide, jds, jde, kds, kde, &
4475 ims, ime, jms, jme, kms, kme, &
4476 ips, ipe, jps, jpe, kps, kpe, &
4477 grid%i_start(ij), grid%i_end(ij), &
4478 grid%j_start(ij), grid%j_end(ij), &
4481 END DO moisture_loop_bdy_2
4483 chem_species_bdy_loop_2 : DO ic = PARAM_FIRST_SCALAR , num_3d_c
4485 CALL set_physical_bc3d( chem(ims,kms,jms,ic) , 'p', config_flags, &
4486 ids, ide, jds, jde, kds, kde, &
4487 ims, ime, jms, jme, kms, kme, &
4488 ips, ipe, jps, jpe, kps, kpe, &
4489 grid%i_start(ij), grid%i_end(ij), &
4490 grid%j_start(ij), grid%j_end(ij), &
4493 END DO chem_species_bdy_loop_2
4495 tracer_species_bdy_loop_2 : DO ic = PARAM_FIRST_SCALAR , num_tracer
4497 CALL set_physical_bc3d( tracer(ims,kms,jms,ic) , 'p', config_flags, &
4498 ids, ide, jds, jde, kds, kde, &
4499 ims, ime, jms, jme, kms, kme, &
4500 ips, ipe, jps, jpe, kps, kpe, &
4501 grid%i_start(ij), grid%i_end(ij), &
4502 grid%j_start(ij), grid%j_end(ij), &
4505 END DO tracer_species_bdy_loop_2
4507 scalar_species_bdy_loop_2 : DO is = PARAM_FIRST_SCALAR , num_3d_s
4509 CALL set_physical_bc3d( scalar(ims,kms,jms,is) , 'p', config_flags, &
4510 ids, ide, jds, jde, kds, kde, &
4511 ims, ime, jms, jme, kms, kme, &
4512 ips, ipe, jps, jpe, kps, kpe, &
4513 grid%i_start(ij), grid%i_end(ij), &
4514 grid%j_start(ij), grid%j_end(ij), &
4517 END DO scalar_species_bdy_loop_2
4519 END DO tile_bc_loop_2
4520 !$OMP END PARALLEL DO
4521 BENCH_END(bc_2d_tim)
4523 ! this code forces boundary values to specified values to avoid drift
4525 IF( config_flags%specified .or. config_flags%nested ) THEN
4527 !$OMP PRIVATE ( ij )
4528 tile_bc_loop_3: DO ij = 1 , grid%num_tiles
4530 CALL wrf_debug ( 200 , ' call spec_bdy_final' )
4532 CALL spec_bdy_final ( grid%u_2, grid%muus, grid%c1h, grid%c2h, grid%msfuy, &
4533 grid%u_bxs, grid%u_bxe, grid%u_bys, grid%u_bye, &
4534 grid%u_btxs,grid%u_btxe,grid%u_btys,grid%u_btye, &
4535 'u', config_flags, &
4536 config_flags%spec_bdy_width, grid%spec_zone, &
4538 ids,ide, jds,jde, kds,kde, & ! domain dims
4539 ims,ime, jms,jme, kms,kme, & ! memory dims
4540 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4541 grid%i_start(ij), grid%i_end(ij), &
4542 grid%j_start(ij), grid%j_end(ij), &
4545 CALL spec_bdy_final ( grid%v_2, grid%muvs, grid%c1h, grid%c2h, grid%msfvx, &
4546 grid%v_bxs, grid%v_bxe, grid%v_bys, grid%v_bye, &
4547 grid%v_btxs,grid%v_btxe,grid%v_btys,grid%v_btye, &
4548 'v', config_flags, &
4549 config_flags%spec_bdy_width, grid%spec_zone, &
4551 ids,ide, jds,jde, kds,kde, & ! domain dims
4552 ims,ime, jms,jme, kms,kme, & ! memory dims
4553 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4554 grid%i_start(ij), grid%i_end(ij), &
4555 grid%j_start(ij), grid%j_end(ij), &
4558 IF( config_flags%nested) THEN
4559 CALL spec_bdy_final ( grid%w_2, grid%muts, grid%c1f, grid%c2f, grid%msfty, &
4560 grid%w_bxs, grid%w_bxe, grid%w_bys, grid%w_bye, &
4561 grid%w_btxs,grid%w_btxe,grid%w_btys,grid%w_btye, &
4562 'w', config_flags, &
4563 config_flags%spec_bdy_width, grid%spec_zone, &
4565 ids,ide, jds,jde, kds,kde, & ! domain dims
4566 ims,ime, jms,jme, kms,kme, & ! memory dims
4567 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4568 grid%i_start(ij), grid%i_end(ij), &
4569 grid%j_start(ij), grid%j_end(ij), &
4573 CALL spec_bdy_final ( grid%t_2, grid%muts, grid%c1h, grid%c2h, grid%msfty,&
4574 grid%t_bxs, grid%t_bxe, grid%t_bys, grid%t_bye, &
4575 grid%t_btxs,grid%t_btxe,grid%t_btys,grid%t_btye, &
4576 't', config_flags, &
4577 config_flags%spec_bdy_width, grid%spec_zone, &
4579 ids,ide, jds,jde, kds,kde, & ! domain dims
4580 ims,ime, jms,jme, kms,kme, & ! memory dims
4581 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4582 grid%i_start(ij), grid%i_end(ij), &
4583 grid%j_start(ij), grid%j_end(ij), &
4586 CALL spec_bdy_final ( grid%ph_2, grid%muts, grid%c1f, grid%c2f, grid%msfty, &
4587 grid%ph_bxs, grid%ph_bxe, grid%ph_bys, grid%ph_bye, &
4588 grid%ph_btxs,grid%ph_btxe,grid%ph_btys,grid%ph_btye, &
4589 'h', config_flags, &
4590 config_flags%spec_bdy_width, grid%spec_zone, &
4592 ids,ide, jds,jde, kds,kde, & ! domain dims
4593 ims,ime, jms,jme, kms,kme, & ! memory dims
4594 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4595 grid%i_start(ij), grid%i_end(ij), &
4596 grid%j_start(ij), grid%j_end(ij), &
4599 CALL spec_bdy_final ( grid%mu_2, grid%muts, grid%c1h, grid%c2h, grid%msfty, &
4600 grid%mu_bxs, grid%mu_bxe, grid%mu_bys, grid%mu_bye, &
4601 grid%mu_btxs,grid%mu_btxe,grid%mu_btys,grid%mu_btye, &
4602 'm', config_flags, &
4603 config_flags%spec_bdy_width, grid%spec_zone, &
4605 ids,ide, jds,jde, 1, 1, & ! domain dims
4606 ims,ime, jms,jme, 1, 1, & ! memory dims
4607 ips,ipe, jps,jpe, 1, 1, & ! patch dims
4608 grid%i_start(ij), grid%i_end(ij), &
4609 grid%j_start(ij), grid%j_end(ij), &
4612 moisture_loop_bdy_3 : DO im = PARAM_FIRST_SCALAR , num_3d_m
4614 IF ( im .EQ. P_QV .OR. config_flags%nested .OR. &
4615 ( config_flags%specified .AND. config_flags%have_bcs_moist ) ) THEN
4616 CALL spec_bdy_final ( moist(ims,kms,jms,im), grid%muts, &
4617 grid%c1h, grid%c2h, grid%msfty, &
4618 moist_bxs(jms,kms,1,im),moist_bxe(jms,kms,1,im), &
4619 moist_bys(ims,kms,1,im),moist_bye(ims,kms,1,im), &
4620 moist_btxs(jms,kms,1,im),moist_btxe(jms,kms,1,im), &
4621 moist_btys(ims,kms,1,im),moist_btye(ims,kms,1,im), &
4622 't', config_flags, &
4623 config_flags%spec_bdy_width, grid%spec_zone, &
4625 ids,ide, jds,jde, kds,kde, & ! domain dims
4626 ims,ime, jms,jme, kms,kme, & ! memory dims
4627 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4628 grid%i_start(ij), grid%i_end(ij), &
4629 grid%j_start(ij), grid%j_end(ij), &
4633 END DO moisture_loop_bdy_3
4636 IF (num_3d_c >= PARAM_FIRST_SCALAR) THEN
4637 chem_species_bdy_loop_3 : DO ic = PARAM_FIRST_SCALAR , num_3d_c
4639 IF( ( config_flags%nested ) ) THEN
4640 CALL spec_bdy_final ( chem(ims,kms,jms,ic), grid%muts, &
4641 grid%c1h, grid%c2h, grid%msfty, &
4642 chem_bxs(jms,kms,1,ic),chem_bxe(jms,kms,1,ic), &
4643 chem_bys(ims,kms,1,ic),chem_bye(ims,kms,1,ic), &
4644 chem_btxs(jms,kms,1,ic),chem_btxe(jms,kms,1,ic), &
4645 chem_btys(ims,kms,1,ic),chem_btye(ims,kms,1,ic), &
4646 't', config_flags, &
4647 config_flags%spec_bdy_width, grid%spec_zone, &
4649 ids,ide, jds,jde, kds,kde, & ! domain dims
4650 ims,ime, jms,jme, kms,kme, & ! memory dims
4651 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4652 grid%i_start(ij), grid%i_end(ij), &
4653 grid%j_start(ij), grid%j_end(ij), &
4657 END DO chem_species_bdy_loop_3
4661 tracer_species_bdy_loop_3 : DO im = PARAM_FIRST_SCALAR , num_tracer
4663 IF( ( config_flags%nested ) ) THEN
4664 CALL spec_bdy_final ( tracer(ims,kms,jms,im), grid%muts, &
4665 grid%c1h, grid%c2h, grid%msfty, &
4666 tracer_bxs(jms,kms,1,im),tracer_bxe(jms,kms,1,im), &
4667 tracer_bys(ims,kms,1,im),tracer_bye(ims,kms,1,im), &
4668 tracer_btxs(jms,kms,1,im),tracer_btxe(jms,kms,1,im), &
4669 tracer_btys(ims,kms,1,im),tracer_btye(ims,kms,1,im), &
4670 't', config_flags, &
4671 config_flags%spec_bdy_width, grid%spec_zone, &
4673 ids,ide, jds,jde, kds,kde, & ! domain dims
4674 ims,ime, jms,jme, kms,kme, & ! memory dims
4675 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4676 grid%i_start(ij), grid%i_end(ij), &
4677 grid%j_start(ij), grid%j_end(ij), &
4681 END DO tracer_species_bdy_loop_3
4683 scalar_species_bdy_loop_3 : DO is = PARAM_FIRST_SCALAR , num_3d_s
4685 IF( ( config_flags%nested ) ) THEN
4686 CALL spec_bdy_final ( scalar(ims,kms,jms,is), grid%muts, &
4687 grid%c1h, grid%c2h, grid%msfty, &
4688 scalar_bxs(jms,kms,1,is),scalar_bxe(jms,kms,1,is), &
4689 scalar_bys(ims,kms,1,is),scalar_bye(ims,kms,1,is), &
4690 scalar_btxs(jms,kms,1,is),scalar_btxe(jms,kms,1,is), &
4691 scalar_btys(ims,kms,1,is),scalar_btye(ims,kms,1,is), &
4692 't', config_flags, &
4693 config_flags%spec_bdy_width, grid%spec_zone, &
4695 ids,ide, jds,jde, kds,kde, & ! domain dims
4696 ims,ime, jms,jme, kms,kme, & ! memory dims
4697 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
4698 grid%i_start(ij), grid%i_end(ij), &
4699 grid%j_start(ij), grid%j_end(ij), &
4703 END DO scalar_species_bdy_loop_3
4705 END DO tile_bc_loop_3
4706 !$OMP END PARALLEL DO
4710 ! reset surface w for consistency
4713 # include "HALO_EM_C.inc"
4714 # include "PERIOD_BDY_EM_E.inc"
4717 CALL wrf_debug ( 10 , ' call set_w_surface' )
4718 fill_w_flag = .false.
4721 !$OMP PRIVATE ( ij )
4722 DO ij = 1 , grid%num_tiles
4723 CALL set_w_surface( config_flags, grid%znw, fill_w_flag, &
4724 grid%w_2, grid%ht, grid%u_2, grid%v_2, &
4725 grid%cf1, grid%cf2, grid%cf3, grid%rdx, grid%rdy,&
4726 grid%msftx, grid%msfty, &
4727 ids, ide, jds, jde, kds, kde, &
4728 ims, ime, jms, jme, kms, kme, &
4729 grid%i_start(ij), grid%i_end(ij), &
4730 grid%j_start(ij), grid%j_end(ij), &
4732 ! its, ite, jts, jte, k_start, min(k_end,kde-1), &
4735 !$OMP END PARALLEL DO
4737 !-----------------------------------------------------------
4738 ! After all of the RK steps, after the microphysics, after p-rho-phi,
4739 ! after w, after filtering, we have data ready to use.
4740 !-----------------------------------------------------------
4742 CALL after_all_rk_steps ( grid, config_flags, &
4743 moist, chem, tracer, scalar, &
4744 th_phy, pi_phy, p_phy, &
4746 REAL(curr_secs,8), curr_secs2, &
4748 ids, ide, jds, jde, kds, kde, &
4749 ims, ime, jms, jme, kms, kme, &
4750 ips, ipe, jps, jpe, kps, kpe, &
4751 imsx, imex, jmsx, jmex, kmsx, kmex, &
4752 ipsx, ipex, jpsx, jpex, kpsx, kpex, &
4753 imsy, imey, jmsy, jmey, kmsy, kmey, &
4754 ipsy, ipey, jpsy, jpey, kpsy, kpey )
4759 !-----------------------------------------------------------------------
4761 !--------------------------------------------------------------
4762 CALL wrf_debug ( 200 , ' call HALO_RK_E' )
4763 IF ( config_flags%h_mom_adv_order <= 4 .and. config_flags%h_sca_adv_order <= 4 ) THEN
4764 # include "HALO_EM_E_3.inc"
4765 ELSE IF ( config_flags%h_mom_adv_order <= 6 .and. config_flags%h_sca_adv_order <= 6 ) THEN
4766 # include "HALO_EM_E_5.inc"
4768 WRITE(wrf_err_message,*)'solve_em: invalid h_mom_adv_order or h_sca_adv_order = ', &
4769 config_flags%h_mom_adv_order, config_flags%h_sca_adv_order
4770 CALL wrf_error_fatal(TRIM(wrf_err_message))
4775 IF ( num_moist >= PARAM_FIRST_SCALAR ) THEN
4776 !-----------------------------------------------------------------------
4778 !--------------------------------------------------------------
4779 CALL wrf_debug ( 200 , ' call HALO_RK_MOIST' )
4780 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
4781 # include "HALO_EM_MOIST_E_3.inc"
4782 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
4783 # include "HALO_EM_MOIST_E_5.inc"
4785 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
4786 CALL wrf_error_fatal(TRIM(wrf_err_message))
4789 IF ( num_chem >= PARAM_FIRST_SCALAR ) THEN
4790 !-----------------------------------------------------------------------
4792 !--------------------------------------------------------------
4793 CALL wrf_debug ( 200 , ' call HALO_RK_CHEM' )
4794 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
4795 # include "HALO_EM_CHEM_E_3.inc"
4796 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
4797 # include "HALO_EM_CHEM_E_5.inc"
4799 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
4800 CALL wrf_error_fatal(TRIM(wrf_err_message))
4803 IF ( num_tracer >= PARAM_FIRST_SCALAR ) THEN
4804 !-----------------------------------------------------------------------
4806 !--------------------------------------------------------------
4807 CALL wrf_debug ( 200 , ' call HALO_RK_TRACER' )
4808 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
4809 # include "HALO_EM_TRACER_E_3.inc"
4810 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
4811 # include "HALO_EM_TRACER_E_5.inc"
4813 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
4814 CALL wrf_error_fatal(TRIM(wrf_err_message))
4817 IF ( num_scalar >= PARAM_FIRST_SCALAR ) THEN
4818 !-----------------------------------------------------------------------
4820 !--------------------------------------------------------------
4821 CALL wrf_debug ( 200 , ' call HALO_RK_SCALAR' )
4822 IF ( config_flags%h_sca_adv_order <= 4 ) THEN
4823 # include "HALO_EM_SCALAR_E_3.inc"
4824 ELSE IF ( config_flags%h_sca_adv_order <= 6 ) THEN
4825 # include "HALO_EM_SCALAR_E_5.inc"
4827 WRITE(wrf_err_message,*)'solve_em: invalid h_sca_adv_order = ',config_flags%h_sca_adv_order
4828 CALL wrf_error_fatal(TRIM(wrf_err_message))
4834 !-----------------------------------------------------------------------
4835 ! firebrand spotting (passive Lagrangian particle transport,
4836 ! tracks firebrand physics properties)
4837 !-----------------------------------------------------------------------
4839 IF(config_flags%ifire == 2 .AND. &
4840 ! Check if spotting is on
4841 config_flags%fs_firebrand_gen_lim > 0 .AND. &
4842 ! Check if this is the inner most grid
4843 config_flags%max_dom == grid%id) THEN
4846 CALL wrf_debug ( 200 , ' call HALO_FIREBRAND_SPOTTING' )
4847 # include "HALO_FIREBRAND_SPOTTING_5.inc"
4850 CALL wrf_debug ( 3 , 'solve: calling firebrand_spotting_em_driver...' )
4851 CALL firebrand_spotting_em_driver ( &
4852 cf = config_flags, &
4854 fs_p_id = grid%fs_p_id, &
4855 fs_p_dt = grid%fs_p_dt, &
4856 fs_p_x = grid%fs_p_x, &
4857 fs_p_y = grid%fs_p_y, &
4858 fs_p_z = grid%fs_p_z, &
4859 fs_gen_inst = grid%fs_gen_inst, &
4860 fs_p_mass = grid%fs_p_mass, &
4861 fs_p_diam = grid%fs_p_diam, &
4862 fs_p_effd = grid%fs_p_effd, &
4863 fs_p_temp = grid%fs_p_temp, &
4864 fs_p_tvel = grid%fs_p_tvel, &
4865 fs_last_gen_dt= grid%fs_last_gen_dt, &
4866 fs_gen_idmax = grid%fs_gen_idmax, &
4867 fs_fire_ROSdt = grid%fs_fire_ROSdt, &
4868 fs_fire_area = grid%fs_fire_area, &
4869 fs_count_landed_all = grid%fs_count_landed_all, &
4870 fs_count_landed_hist = grid%fs_count_landed_hist, &
4871 fs_landing_mask = grid%fs_landing_mask, &
4872 fs_spotting_lkhd = grid%fs_spotting_lkhd, &
4873 fs_frac_landed = grid%fs_frac_landed, &
4874 fs_fuel_spotting_risk = grid%fs_fuel_spotting_risk, &
4875 fs_count_reset = grid%fs_count_reset)
4878 ! end of firebrand spotting
4879 !-----------------------------------------------------------------------
4881 ! Max values of CFL for adaptive time step scheme
4883 DEALLOCATE(max_vert_cfl_tmp)
4884 DEALLOCATE(max_horiz_cfl_tmp)
4886 CALL wrf_debug ( 200 , ' call end of solve_em' )
4888 ! Are we about to read SST input from the wrflowinput file? That data is saved
4889 ! for use in fractional merging of external/coupled SST and input SST.
4890 IF ( coupler_on ) grid%just_read_auxinput4 = Is_alarm_tstep(grid%domain_clock, grid%alarms(AUXINPUT4_ALARM))
4892 ! Are we about to read the lateral boundary file? This is a domain one action only.
4893 IF ( grid%id .EQ. 1 ) grid%just_read_boundary = Is_alarm_tstep(grid%domain_clock, grid%alarms(BOUNDARY_ALARM))
4895 ! Finish timers if compiled with -DBENCH.
4896 #include "bench_solve_em_end.h"
4900 CALL nl_get_wrf_cmaq_option ( 1, wrf_cmaq_option )
4901 CALL nl_get_wrf_cmaq_freq ( 1, wrf_cmaq_freq )
4902 CALL nl_get_direct_sw_feedback ( .false., direct_sw_feedback )
4903 CALL nl_get_met_file_tstep ( 1, met_file_tstep )
4905 cmaq_wrf_feedback = direct_sw_feedback
4907 if (wrf_cmaq_option .gt. 0) then
4908 cmaq_nstep = ((grid%run_days * 24 + grid%run_hours) * 3600 + grid%run_minutes * 60 + grid%run_seconds) / &
4909 (grid%time_step * WRF_CMAQ_FREQ)
4911 wrf_end_step = cmaq_nstep * WRF_CMAQ_FREQ - 1
4915 if (wrf_cmaq_option .gt. 0) then
4916 COUNTER = COUNTER + 1
4918 if ( .not. cmaq_wrf_feedback .and. firstime) then
4919 grid%prev_rainnc = 0.0
4920 grid%prev_rainc = 0.0
4923 CMAQ_STEP = (mod(COUNTER, WRF_CMAQ_FREQ) .EQ. 0)
4926 CALL aqprep (grid, config_flags, grid%t_phy, p_phy, &
4927 grid%rho, grid%z_at_w, dz8w, p8w, t8w, &
4928 model_config_rec%num_land_cat, 'V4.1.1', &
4929 wrf_cmaq_option, wrf_cmaq_freq, &
4930 ids, ide, jds, jde, kds, kde, &
4931 ims, ime, jms, jme, kms, kme, &
4932 ips, ipe, jps, jpe, kps, kpe, &
4933 moist(:,:,:,p_qv), & ! optional
4934 moist(:,:,:,p_qc), & ! optional
4935 moist(:,:,:,p_qr), & ! optional
4936 moist(:,:,:,p_qi), & ! optional
4937 moist(:,:,:,p_qs), & ! optional
4938 moist(:,:,:,p_qg) & ! optional
4940 grid%prev_rainnc = grid%rainnc
4941 grid%prev_rainc = grid%rainc
4944 if ((counter >= 1) .and. (CMAQ_STEP) .and. (wrf_cmaq_option .gt. 1)) then
4946 CALL CMAQ_DRIVER (cmaq_sdate, cmaq_stime, grid%time_step*WRF_CMAQ_FREQ, &
4947 twoway_jdate, twoway_jtime, .false.)
4949 if (direct_sw_feedback) then
4950 CALL FEEDBACK_READ (grid, twoway_jdate, twoway_jtime)
4951 feedback_is_ready = .true.
4956 ! call aqprep and cmaq one last time before the entire twoway model ends
4957 if (wrf_end_step == counter) then
4958 CALL aqprep (grid, config_flags, grid%t_phy, p_phy, &
4959 grid%rho, grid%z_at_w, dz8w, p8w, t8w, &
4960 model_config_rec%num_land_cat, 'V4.1.1', &
4961 wrf_cmaq_option, wrf_cmaq_freq, &
4962 ids, ide, jds, jde, kds, kde, &
4963 ims, ime, jms, jme, kms, kme, &
4964 ips, ipe, jps, jpe, kps, kpe, &
4965 moist(:,:,:,p_qv), & ! optional
4966 moist(:,:,:,p_qc), & ! optional
4967 moist(:,:,:,p_qr), & ! optional
4968 moist(:,:,:,p_qi), & ! optional
4969 moist(:,:,:,p_qs), & ! optional
4970 moist(:,:,:,p_qg) & ! optional
4973 if (wrf_cmaq_option .gt. 1) then
4975 CALL CMAQ_DRIVER (cmaq_sdate, cmaq_stime, grid%time_step*WRF_CMAQ_FREQ, &
4976 twoway_jdate, twoway_jtime, .true.)
4987 END SUBROUTINE solve_em