1 !WRF:MODEL_LAYER: PHYSICS
3 ! note: this module really belongs in the dyn_em directory since it is
4 ! specific only to the EM core. Leaving here for now, with an
5 ! #if ( EM_CORE == 1 ) directive. JM 20031201
8 ! This MODULE holds the routines which are used to perform updates of the
9 ! model C-grid tendencies with physics A-grid tendencies
10 ! The module consolidates code that was (up to v1.2) duplicated in
11 ! module_em and module_rk and in
12 ! module_big_step_utilities.F and module_big_step_utilities_em.F
14 ! This MODULE CONTAINS the following routines:
15 ! update_phy_ten, phy_ra_ten, phy_bl_ten, phy_cu_ten, advance_ppt,
16 ! add_a2a, add_a2c_u, and add_a2c_v
19 MODULE module_physics_addtendc
23 USE module_state_description
28 SUBROUTINE update_phy_ten(rt_tendf,ru_tendf,rv_tendf,moist_tendf, &
29 scalar_tendf,mu_tendf, &
30 RTHRATEN,RTHBLTEN,RTHCUTEN,RUBLTEN,RVBLTEN, &
31 RQVBLTEN,RQCBLTEN,RQIBLTEN, &
32 RQVCUTEN,RQCCUTEN,RQRCUTEN,RQICUTEN,RQSCUTEN,&
33 RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN,RQVNDGDTEN, &
35 rthfrten,rqvfrten, & ! fire
36 n_moist,n_scalar,config_flags,rk_step,adv_moist_cond, &
37 ids, ide, jds, jde, kds, kde, &
38 ims, ime, jms, jme, kms, kme, &
39 its, ite, jts, jte, kts, kte )
40 !-------------------------------------------------------------------
42 !-------------------------------------------------------------------
44 TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
46 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
47 ims, ime, jms, jme, kms, kme, &
48 its, ite, jts, jte, kts, kte, &
49 n_moist,n_scalar,rk_step
51 LOGICAL , INTENT(IN) :: adv_moist_cond
53 REAL , DIMENSION(ims:ime , kms:kme, jms:jme),INTENT(INOUT) :: &
58 REAL , DIMENSION(ims:ime , jms:jme),INTENT(INOUT) :: mu_tendf
60 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
61 INTENT(INOUT) :: moist_tendf
63 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar), &
64 INTENT(INOUT) :: scalar_tendf
66 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
85 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN ) :: RMUNDGDTEN
87 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: & ! fire
90 !------------------------------------------------------------------
92 ! set up loop bounds for this grid's boundary conditions
94 if (config_flags%ra_lw_physics .gt. 0 .or. &
95 config_flags%ra_sw_physics .gt. 0) &
96 CALL phy_ra_ten(config_flags,rt_tendf,RTHRATEN, &
97 ids, ide, jds, jde, kds, kde, &
98 ims, ime, jms, jme, kms, kme, &
99 its, ite, jts, jte, kts, kte )
101 if (config_flags%bl_pbl_physics .gt. 0) &
102 CALL phy_bl_ten(config_flags,rk_step,n_moist,n_scalar, &
103 rt_tendf,ru_tendf,rv_tendf,moist_tendf, &
104 scalar_tendf,adv_moist_cond, &
105 RTHBLTEN,RUBLTEN,RVBLTEN, &
106 RQVBLTEN,RQCBLTEN,RQIBLTEN, &
107 ids, ide, jds, jde, kds, kde, &
108 ims, ime, jms, jme, kms, kme, &
109 its, ite, jts, jte, kts, kte )
111 if (config_flags%cu_physics .gt. 0) &
112 CALL phy_cu_ten(config_flags,rk_step,n_moist,rt_tendf, &
113 RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN, &
114 RQICUTEN,RQSCUTEN,moist_tendf, &
115 ids, ide, jds, jde, kds, kde, &
116 ims, ime, jms, jme, kms, kme, &
117 its, ite, jts, jte, kts, kte )
119 if (config_flags%grid_fdda .gt. 0) &
120 CALL phy_fg_ten(config_flags,rk_step,n_moist, &
121 rt_tendf,ru_tendf,rv_tendf, &
122 mu_tendf, moist_tendf, &
123 RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN, &
124 RQVNDGDTEN,RMUNDGDTEN, &
125 ids, ide, jds, jde, kds, kde, &
126 ims, ime, jms, jme, kms, kme, &
127 its, ite, jts, jte, kts, kte )
129 if (config_flags%ifire .gt. 0) & ! fire
130 CALL phy_fr_ten(config_flags,rk_step,n_moist, &
131 rt_tendf,ru_tendf,rv_tendf, &
132 mu_tendf, moist_tendf, &
134 ids, ide, jds, jde, kds, kde, &
135 ims, ime, jms, jme, kms, kme, &
136 its, ite, jts, jte, kts, kte )
138 END SUBROUTINE update_phy_ten
140 !=================================================================
141 SUBROUTINE phy_ra_ten(config_flags,rt_tendf,RTHRATEN, &
142 ids, ide, jds, jde, kds, kde, &
143 ims, ime, jms, jme, kms, kme, &
144 its, ite, jts, jte, kts, kte )
145 !-----------------------------------------------------------------
147 !-----------------------------------------------------------------
148 TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
150 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
151 ims, ime, jms, jme, kms, kme, &
152 its, ite, jts, jte, kts, kte
154 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
157 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
164 CALL add_a2a(rt_tendf,RTHRATEN,config_flags, &
165 ids,ide, jds, jde, kds, kde, &
166 ims, ime, jms, jme, kms, kme, &
167 its, ite, jts, jte, kts, kte )
169 END SUBROUTINE phy_ra_ten
171 !=================================================================
172 SUBROUTINE phy_bl_ten(config_flags,rk_step,n_moist,n_scalar, &
173 rt_tendf,ru_tendf,rv_tendf,moist_tendf, &
174 scalar_tendf,adv_moist_cond, &
175 RTHBLTEN,RUBLTEN,RVBLTEN, &
176 RQVBLTEN,RQCBLTEN,RQIBLTEN, &
177 ids, ide, jds, jde, kds, kde, &
178 ims, ime, jms, jme, kms, kme, &
179 its, ite, jts, jte, kts, kte )
180 !-----------------------------------------------------------------
182 !-----------------------------------------------------------------
183 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
185 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
186 ims, ime, jms, jme, kms, kme, &
187 its, ite, jts, jte, kts, kte, &
188 n_moist, n_scalar, rk_step
190 LOGICAL , INTENT(IN) :: adv_moist_cond
192 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
193 INTENT(INOUT) :: moist_tendf
195 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar), &
196 INTENT(INOUT) :: scalar_tendf
198 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
206 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
212 INTEGER :: i,j,k,IBGN,IEND,JBGN,JEND
214 !-----------------------------------------------------------------
216 SELECT CASE(config_flags%bl_pbl_physics)
220 CALL add_a2a(rt_tendf,RTHBLTEN,config_flags, &
221 ids,ide, jds, jde, kds, kde, &
222 ims, ime, jms, jme, kms, kme, &
223 its, ite, jts, jte, kts, kte )
225 CALL add_a2c_u(ru_tendf,RUBLTEN,config_flags, &
226 ids,ide, jds, jde, kds, kde, &
227 ims, ime, jms, jme, kms, kme, &
228 its, ite, jts, jte, kts, kte )
230 CALL add_a2c_v(rv_tendf,RVBLTEN,config_flags, &
231 ids,ide, jds, jde, kds, kde, &
232 ims, ime, jms, jme, kms, kme, &
233 its, ite, jts, jte, kts, kte )
235 if (P_QV .ge. PARAM_FIRST_SCALAR) &
236 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVBLTEN, &
238 ids,ide, jds, jde, kds, kde, &
239 ims, ime, jms, jme, kms, kme, &
240 its, ite, jts, jte, kts, kte )
242 if (P_QC .ge. PARAM_FIRST_SCALAR) &
243 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCBLTEN, &
245 ids,ide, jds, jde, kds, kde, &
246 ims, ime, jms, jme, kms, kme, &
247 its, ite, jts, jte, kts, kte )
249 if (P_QI .ge. PARAM_FIRST_SCALAR) &
250 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQIBLTEN, &
252 ids,ide, jds, jde, kds, kde, &
253 ims, ime, jms, jme, kms, kme, &
254 its, ite, jts, jte, kts, kte )
256 IF(.not. adv_moist_cond)THEN
258 if (P_QT .ge. PARAM_FIRST_SCALAR) &
259 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQCBLTEN, &
261 ids,ide, jds, jde, kds, kde, &
262 ims, ime, jms, jme, kms, kme, &
263 its, ite, jts, jte, kts, kte )
265 if (P_QT .ge. PARAM_FIRST_SCALAR) &
266 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQIBLTEN, &
268 ids,ide, jds, jde, kds, kde, &
269 ims, ime, jms, jme, kms, kme, &
270 its, ite, jts, jte, kts, kte )
275 CALL add_a2a(rt_tendf,RTHBLTEN,config_flags, &
276 ids,ide, jds, jde, kds, kde, &
277 ims, ime, jms, jme, kms, kme, &
278 its, ite, jts, jte, kts, kte )
280 CALL add_a2c_u(ru_tendf,RUBLTEN,config_flags, &
281 ids,ide, jds, jde, kds, kde, &
282 ims, ime, jms, jme, kms, kme, &
283 its, ite, jts, jte, kts, kte )
285 CALL add_a2c_v(rv_tendf,RVBLTEN,config_flags, &
286 ids,ide, jds, jde, kds, kde, &
287 ims, ime, jms, jme, kms, kme, &
288 its, ite, jts, jte, kts, kte )
290 if (P_QV .ge. PARAM_FIRST_SCALAR) &
291 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVBLTEN, &
293 ids,ide, jds, jde, kds, kde, &
294 ims, ime, jms, jme, kms, kme, &
295 its, ite, jts, jte, kts, kte )
297 if (P_QC .ge. PARAM_FIRST_SCALAR) &
298 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCBLTEN, &
300 ids,ide, jds, jde, kds, kde, &
301 ims, ime, jms, jme, kms, kme, &
302 its, ite, jts, jte, kts, kte )
304 if (P_QI .ge. PARAM_FIRST_SCALAR) &
305 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQIBLTEN, &
307 ids,ide, jds, jde, kds, kde, &
308 ims, ime, jms, jme, kms, kme, &
309 its, ite, jts, jte, kts, kte )
311 IF(.not. adv_moist_cond)THEN
313 if (P_QT .ge. PARAM_FIRST_SCALAR) &
314 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQCBLTEN, &
316 ids,ide, jds, jde, kds, kde, &
317 ims, ime, jms, jme, kms, kme, &
318 its, ite, jts, jte, kts, kte )
320 if (P_QT .ge. PARAM_FIRST_SCALAR) &
321 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQIBLTEN, &
323 ids,ide, jds, jde, kds, kde, &
324 ims, ime, jms, jme, kms, kme, &
325 its, ite, jts, jte, kts, kte )
330 CALL add_a2a(rt_tendf,RTHBLTEN,config_flags, &
331 ids,ide, jds, jde, kds, kde, &
332 ims, ime, jms, jme, kms, kme, &
333 its, ite, jts, jte, kts, kte )
335 CALL add_a2c_u(ru_tendf,RUBLTEN,config_flags, &
336 ids,ide, jds, jde, kds, kde, &
337 ims, ime, jms, jme, kms, kme, &
338 its, ite, jts, jte, kts, kte )
340 CALL add_a2c_v(rv_tendf,RVBLTEN,config_flags, &
341 ids,ide, jds, jde, kds, kde, &
342 ims, ime, jms, jme, kms, kme, &
343 its, ite, jts, jte, kts, kte )
345 if (P_QV .ge. PARAM_FIRST_SCALAR) &
346 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVBLTEN, &
348 ids,ide, jds, jde, kds, kde, &
349 ims, ime, jms, jme, kms, kme, &
350 its, ite, jts, jte, kts, kte )
352 if (P_QC .ge. PARAM_FIRST_SCALAR) &
353 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCBLTEN, &
355 ids,ide, jds, jde, kds, kde, &
356 ims, ime, jms, jme, kms, kme, &
357 its, ite, jts, jte, kts, kte )
359 if (P_QI .ge. PARAM_FIRST_SCALAR) &
360 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQIBLTEN, &
362 ids,ide, jds, jde, kds, kde, &
363 ims, ime, jms, jme, kms, kme, &
364 its, ite, jts, jte, kts, kte )
366 IF(.not. adv_moist_cond)THEN
368 if (P_QT .ge. PARAM_FIRST_SCALAR)THEN
369 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQCBLTEN, &
371 ids,ide, jds, jde, kds, kde, &
372 ims, ime, jms, jme, kms, kme, &
373 its, ite, jts, jte, kts, kte )
375 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQIBLTEN, &
377 ids,ide, jds, jde, kds, kde, &
378 ims, ime, jms, jme, kms, kme, &
379 its, ite, jts, jte, kts, kte )
386 CALL add_a2a(rt_tendf,RTHBLTEN,config_flags, &
387 ids,ide, jds, jde, kds, kde, &
388 ims, ime, jms, jme, kms, kme, &
389 its, ite, jts, jte, kts, kte )
391 CALL add_a2c_u(ru_tendf,RUBLTEN,config_flags, &
392 ids,ide, jds, jde, kds, kde, &
393 ims, ime, jms, jme, kms, kme, &
394 its, ite, jts, jte, kts, kte )
396 CALL add_a2c_v(rv_tendf,RVBLTEN,config_flags, &
397 ids,ide, jds, jde, kds, kde, &
398 ims, ime, jms, jme, kms, kme, &
399 its, ite, jts, jte, kts, kte )
401 if (P_QV .ge. PARAM_FIRST_SCALAR) &
402 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVBLTEN, &
404 ids,ide, jds, jde, kds, kde, &
405 ims, ime, jms, jme, kms, kme, &
406 its, ite, jts, jte, kts, kte )
408 IF(.not. adv_moist_cond)THEN
410 if (P_QT .ge. PARAM_FIRST_SCALAR) &
411 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQCBLTEN, &
413 ids,ide, jds, jde, kds, kde, &
414 ims, ime, jms, jme, kms, kme, &
415 its, ite, jts, jte, kts, kte )
419 if (P_QC .ge. PARAM_FIRST_SCALAR) &
420 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCBLTEN, &
422 ids,ide, jds, jde, kds, kde, &
423 ims, ime, jms, jme, kms, kme, &
424 its, ite, jts, jte, kts, kte )
430 CALL add_a2a(rt_tendf,RTHBLTEN,config_flags, &
431 ids,ide, jds, jde, kds, kde, &
432 ims, ime, jms, jme, kms, kme, &
433 its, ite, jts, jte, kts, kte )
435 CALL add_a2c_u(ru_tendf,RUBLTEN,config_flags, &
436 ids,ide, jds, jde, kds, kde, &
437 ims, ime, jms, jme, kms, kme, &
438 its, ite, jts, jte, kts, kte )
440 CALL add_a2c_v(rv_tendf,RVBLTEN,config_flags, &
441 ids,ide, jds, jde, kds, kde, &
442 ims, ime, jms, jme, kms, kme, &
443 its, ite, jts, jte, kts, kte )
445 if (P_QV .ge. PARAM_FIRST_SCALAR) &
446 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVBLTEN, &
448 ids,ide, jds, jde, kds, kde, &
449 ims, ime, jms, jme, kms, kme, &
450 its, ite, jts, jte, kts, kte )
452 if (P_QC .ge. PARAM_FIRST_SCALAR) &
453 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCBLTEN, &
455 ids,ide, jds, jde, kds, kde, &
456 ims, ime, jms, jme, kms, kme, &
457 its, ite, jts, jte, kts, kte )
459 if (P_QI .ge. PARAM_FIRST_SCALAR) &
460 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQIBLTEN, &
462 ids,ide, jds, jde, kds, kde, &
463 ims, ime, jms, jme, kms, kme, &
464 its, ite, jts, jte, kts, kte )
466 IF(.not. adv_moist_cond)THEN
468 if (P_QT .ge. PARAM_FIRST_SCALAR) &
469 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQCBLTEN, &
471 ids,ide, jds, jde, kds, kde, &
472 ims, ime, jms, jme, kms, kme, &
473 its, ite, jts, jte, kts, kte )
475 if (P_QT .ge. PARAM_FIRST_SCALAR) &
476 CALL add_a2a(scalar_tendf(ims,kms,jms,P_QT),RQIBLTEN, &
478 ids,ide, jds, jde, kds, kde, &
479 ims, ime, jms, jme, kms, kme, &
480 its, ite, jts, jte, kts, kte )
485 print*,'phy_bl_ten: The pbl scheme does not exist'
489 END SUBROUTINE phy_bl_ten
491 !=================================================================
492 SUBROUTINE phy_cu_ten(config_flags,rk_step,n_moist,rt_tendf, &
493 RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN, &
494 RQICUTEN,RQSCUTEN,moist_tendf, &
495 ids, ide, jds, jde, kds, kde, &
496 ims, ime, jms, jme, kms, kme, &
497 its, ite, jts, jte, kts, kte )
498 !-----------------------------------------------------------------
500 !-----------------------------------------------------------------
501 TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
503 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
504 ims, ime, jms, jme, kms, kme, &
505 its, ite, jts, jte, kts, kte, &
508 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
509 INTENT(INOUT) :: moist_tendf
511 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
519 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
526 SELECT CASE (config_flags%cu_physics)
529 CALL add_a2a(rt_tendf,RTHCUTEN,config_flags, &
530 ids,ide, jds, jde, kds, kde, &
531 ims, ime, jms, jme, kms, kme, &
532 its, ite, jts, jte, kts, kte )
534 if (P_QV .ge. PARAM_FIRST_SCALAR) &
535 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVCUTEN, &
537 ids,ide, jds, jde, kds, kde, &
538 ims, ime, jms, jme, kms, kme, &
539 its, ite, jts, jte, kts, kte )
541 if (P_QC .ge. PARAM_FIRST_SCALAR) &
542 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCCUTEN, &
544 ids,ide, jds, jde, kds, kde, &
545 ims, ime, jms, jme, kms, kme, &
546 its, ite, jts, jte, kts, kte )
548 if (P_QR .ge. PARAM_FIRST_SCALAR) &
549 CALL add_a2a(moist_tendf(ims,kms,jms,P_QR),RQRCUTEN, &
551 ids,ide, jds, jde, kds, kde, &
552 ims, ime, jms, jme, kms, kme, &
553 its, ite, jts, jte, kts, kte )
555 if (P_QI .ge. PARAM_FIRST_SCALAR) &
556 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQICUTEN, &
558 ids,ide, jds, jde, kds, kde, &
559 ims, ime, jms, jme, kms, kme, &
560 its, ite, jts, jte, kts, kte )
562 if (P_QS .ge. PARAM_FIRST_SCALAR) &
563 CALL add_a2a(moist_tendf(ims,kms,jms,P_QS),RQSCUTEN, &
565 ids,ide, jds, jde, kds, kde, &
566 ims, ime, jms, jme, kms, kme, &
567 its, ite, jts, jte, kts, kte )
570 CALL add_a2a(rt_tendf,RTHCUTEN, &
572 ids,ide, jds, jde, kds, kde, &
573 ims, ime, jms, jme, kms, kme, &
574 its, ite, jts, jte, kts, kte )
576 if (P_QV .ge. PARAM_FIRST_SCALAR) &
577 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVCUTEN, &
579 ids,ide, jds, jde, kds, kde, &
580 ims, ime, jms, jme, kms, kme, &
581 its, ite, jts, jte, kts, kte )
584 CALL add_a2a(rt_tendf,RTHCUTEN,config_flags, &
585 ids,ide, jds, jde, kds, kde, &
586 ims, ime, jms, jme, kms, kme, &
587 its, ite, jts, jte, kts, kte )
589 if (P_QV .ge. PARAM_FIRST_SCALAR) &
590 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVCUTEN, &
592 ids,ide, jds, jde, kds, kde, &
593 ims, ime, jms, jme, kms, kme, &
594 its, ite, jts, jte, kts, kte )
596 if (P_QC .ge. PARAM_FIRST_SCALAR) &
597 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCCUTEN, &
599 ids,ide, jds, jde, kds, kde, &
600 ims, ime, jms, jme, kms, kme, &
601 its, ite, jts, jte, kts, kte )
603 if (P_QR .ge. PARAM_FIRST_SCALAR) &
604 CALL add_a2a(moist_tendf(ims,kms,jms,P_QR),RQRCUTEN, &
606 ids,ide, jds, jde, kds, kde, &
607 ims, ime, jms, jme, kms, kme, &
608 its, ite, jts, jte, kts, kte )
610 if (P_QI .ge. PARAM_FIRST_SCALAR) &
611 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQICUTEN, &
613 ids,ide, jds, jde, kds, kde, &
614 ims, ime, jms, jme, kms, kme, &
615 its, ite, jts, jte, kts, kte )
617 if (P_QS .ge. PARAM_FIRST_SCALAR) &
618 CALL add_a2a(moist_tendf(ims,kms,jms,P_QS),RQSCUTEN, &
620 ids,ide, jds, jde, kds, kde, &
621 ims, ime, jms, jme, kms, kme, &
622 its, ite, jts, jte, kts, kte )
624 CASE (GDSCHEME, G3SCHEME)
625 CALL add_a2a(rt_tendf,RTHCUTEN,config_flags, &
626 ids,ide, jds, jde, kds, kde, &
627 ims, ime, jms, jme, kms, kme, &
628 its, ite, jts, jte, kts, kte )
630 if (P_QV .ge. PARAM_FIRST_SCALAR) &
631 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVCUTEN, &
633 ids,ide, jds, jde, kds, kde, &
634 ims, ime, jms, jme, kms, kme, &
635 its, ite, jts, jte, kts, kte )
637 if (P_QC .ge. PARAM_FIRST_SCALAR) &
638 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCCUTEN, &
640 ids,ide, jds, jde, kds, kde, &
641 ims, ime, jms, jme, kms, kme, &
642 its, ite, jts, jte, kts, kte )
644 if (P_QI .ge. PARAM_FIRST_SCALAR) &
645 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQICUTEN, &
647 ids,ide, jds, jde, kds, kde, &
648 ims, ime, jms, jme, kms, kme, &
649 its, ite, jts, jte, kts, kte )
652 CALL add_a2a(rt_tendf,RTHCUTEN,config_flags, &
653 ids,ide, jds, jde, kds, kde, &
654 ims, ime, jms, jme, kms, kme, &
655 its, ite, jts, jte, kts, kte )
657 if (P_QV .ge. PARAM_FIRST_SCALAR) &
658 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVCUTEN, &
660 ids,ide, jds, jde, kds, kde, &
661 ims, ime, jms, jme, kms, kme, &
662 its, ite, jts, jte, kts, kte )
664 if (P_QC .ge. PARAM_FIRST_SCALAR) &
665 CALL add_a2a(moist_tendf(ims,kms,jms,P_QC),RQCCUTEN, &
667 ids,ide, jds, jde, kds, kde, &
668 ims, ime, jms, jme, kms, kme, &
669 its, ite, jts, jte, kts, kte )
671 if (P_QI .ge. PARAM_FIRST_SCALAR) &
672 CALL add_a2a(moist_tendf(ims,kms,jms,P_QI),RQICUTEN, &
674 ids,ide, jds, jde, kds, kde, &
675 ims, ime, jms, jme, kms, kme, &
676 its, ite, jts, jte, kts, kte )
682 END SUBROUTINE phy_cu_ten
684 !=================================================================
685 SUBROUTINE phy_fg_ten(config_flags,rk_step,n_moist, &
686 rt_tendf,ru_tendf,rv_tendf, &
687 mu_tendf, moist_tendf, &
688 RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN, &
689 RQVNDGDTEN,RMUNDGDTEN, &
690 ids, ide, jds, jde, kds, kde, &
691 ims, ime, jms, jme, kms, kme, &
692 its, ite, jts, jte, kts, kte )
693 !-----------------------------------------------------------------
695 !-----------------------------------------------------------------
696 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
698 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
699 ims, ime, jms, jme, kms, kme, &
700 its, ite, jts, jte, kts, kte, &
703 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
704 INTENT(INOUT) :: moist_tendf
706 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
712 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN ) :: RMUNDGDTEN
714 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
719 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT):: mu_tendf
723 INTEGER :: i,j,k,IBGN,IEND,JBGN,JEND
725 !-----------------------------------------------------------------
727 SELECT CASE(config_flags%grid_fdda)
731 CALL add_a2a(rt_tendf,RTHNDGDTEN,config_flags, &
732 ids,ide, jds, jde, kds, kde, &
733 ims, ime, jms, jme, kms, kme, &
734 its, ite, jts, jte, kts, kte )
736 ! note fdda u and v tendencies are staggered
737 CALL add_c2c_u(ru_tendf,RUNDGDTEN,config_flags, &
738 ids,ide, jds, jde, kds, kde, &
739 ims, ime, jms, jme, kms, kme, &
740 its, ite, jts, jte, kts, kte )
742 CALL add_c2c_v(rv_tendf,RVNDGDTEN,config_flags, &
743 ids,ide, jds, jde, kds, kde, &
744 ims, ime, jms, jme, kms, kme, &
745 its, ite, jts, jte, kts, kte )
747 CALL add_a2a(mu_tendf,RMUNDGDTEN,config_flags, &
748 ids,ide, jds, jde, kds, kds, &
749 ims, ime, jms, jme, kms, kms, &
750 its, ite, jts, jte, kts, kts )
752 if (P_QV .ge. PARAM_FIRST_SCALAR) &
753 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),RQVNDGDTEN, &
755 ids,ide, jds, jde, kds, kde, &
756 ims, ime, jms, jme, kms, kme, &
757 its, ite, jts, jte, kts, kte )
764 END SUBROUTINE phy_fg_ten
766 !=================================================================
767 SUBROUTINE phy_fr_ten(config_flags,rk_step,n_moist, &
768 rt_tendf,ru_tendf,rv_tendf, &
769 mu_tendf, moist_tendf, &
771 ids, ide, jds, jde, kds, kde, &
772 ims, ime, jms, jme, kms, kme, &
773 its, ite, jts, jte, kts, kte )
774 !-----------------------------------------------------------------
775 USE module_state_description, ONLY : &
777 !-----------------------------------------------------------------
779 !-----------------------------------------------------------------
780 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
782 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
783 ims, ime, jms, jme, kms, kme, &
784 its, ite, jts, jte, kts, kte, &
787 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
788 INTENT(INOUT) :: moist_tendf
790 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
794 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
799 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT):: mu_tendf
803 INTEGER :: i,j,k,IBGN,IEND,JBGN,JEND
805 !-----------------------------------------------------------------
807 SELECT CASE(config_flags%ifire)
809 CASE (FIRE_CAWFE,FIRE_SFIRE,FIRE_SFIRED)
810 ! Jan Mandel added FIRE_SFIRE Nov 17 2007
811 ! Jan Mandel added FIRE_SFIRED Nov 17 2007
813 CALL add_a2a(rt_tendf,rthfrten, &
815 ids,ide, jds, jde, kds, kde, &
816 ims, ime, jms, jme, kms, kme, &
817 its, ite, jts, jte, kts, kte )
819 CALL add_a2a(moist_tendf(ims,kms,jms,P_QV),rqvfrten, &
821 ids,ide, jds, jde, kds, kde, &
822 ims, ime, jms, jme, kms, kme, &
823 its, ite, jts, jte, kts, kte )
829 END SUBROUTINE phy_fr_ten
831 !----------------------------------------------------------------------
832 SUBROUTINE advance_ppt(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN, &
833 RQICUTEN,RQSCUTEN,RAINC,RAINCV,PRATEC,NCA, &
834 HTOP,HBOT,CUTOP,CUBOT, &
835 CUPPT, DT, config_flags, &
836 ids,ide, jds,jde, kds,kde, &
837 ims,ime, jms,jme, kms,kme, &
838 its,ite, jts,jte, kts,kte )
839 !----------------------------------------------------------------------
840 USE module_state_description
843 !----------------------------------------------------------------------
845 !----------------------------------------------------------------------
846 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
848 INTEGER, INTENT(IN ) :: &
849 ids,ide, jds,jde, kds,kde, &
850 ims,ime, jms,jme, kms,kme, &
851 its,ite, jts,jte, kts,kte
854 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
855 INTENT(INOUT) :: RTHCUTEN, &
862 REAL, DIMENSION( ims:ime , jms:jme ), &
863 INTENT(INOUT) :: RAINC, &
872 REAL, INTENT(IN) :: DT
876 INTEGER :: i,j,k,i_start,i_end,j_start,j_end,k_start,k_end
877 INTEGER :: NCUTOP, NCUBOT
879 !-----------------------------------------------------------------
881 IF (config_flags%cu_physics .eq. 0) return
883 ! SET START AND END POINTS FOR TILES
886 i_end = min( ite,ide-1 )
888 j_end = min( jte,jde-1 )
890 ! IF( config_flags%nested .or. config_flags%specified ) THEN
891 ! i_start = max( its,ids+1 )
892 ! i_end = min( ite,ide-2 )
893 ! j_start = max( jts,jds+1 )
894 ! j_end = min( jte,jde-2 )
898 k_end = min( kte, kde-1 )
900 ! Update total cumulus scheme precipitation
906 RAINC(I,J)=RAINC(I,J)+PRATEC(I,J)*DT
907 CUPPT(I,J)=CUPPT(I,J)+PRATEC(I,J)*DT/1000.
911 SELECT CASE (config_flags%cu_physics)
918 IF ( NCA(I,J) .GT. 0 ) THEN
920 IF ( NINT(NCA(I,J) / DT) .le. 0 ) THEN
922 ! set tendency to zero
930 if (P_QI .ge. PARAM_FIRST_SCALAR) RQICUTEN(i,k,j)=0.
931 if (P_QS .ge. PARAM_FIRST_SCALAR) RQSCUTEN(i,k,j)=0.
935 NCA(I,J)=NCA(I,J)-DT ! Decrease NCA
947 ! HTOP, HBOT FOR GFDL RADIATION
948 NCUTOP=NINT(CUTOP(I,J))
949 NCUBOT=NINT(CUBOT(I,J))
950 IF(NCUTOP>1.AND.NCUTOP<KDE)THEN
951 HTOP(I,J)=MAX(CUTOP(I,J),HTOP(I,J))
953 IF(NCUBOT>0.AND.NCUBOT<KDE)THEN
954 HBOT(I,J)=MIN(CUBOT(I,J),HBOT(I,J))
965 ! HTOP, HBOT FOR GFDL RADIATION
966 NCUTOP=NINT(CUTOP(I,J))
967 NCUBOT=NINT(CUBOT(I,J))
968 IF(NCUTOP>1.AND.NCUTOP<KDE)THEN
969 HTOP(I,J)=MAX(CUTOP(I,J),HTOP(I,J))
971 IF(NCUBOT>0.AND.NCUBOT<KDE)THEN
972 HBOT(I,J)=MIN(CUBOT(I,J),HBOT(I,J))
975 IF ( NCA(I,J) .GT. 0 ) THEN
978 IF ( NINT(NCA(I,J) / DT) .LE. 1 ) THEN
980 ! set tendency to zero
988 if (P_QI .ge. PARAM_FIRST_SCALAR) RQICUTEN(i,k,j)=0.
989 if (P_QS .ge. PARAM_FIRST_SCALAR) RQSCUTEN(i,k,j)=0.
993 NCA(I,J)=NCA(I,J)-DT ! Decrease NCA
994 ! NCA(I,J)=NCA(I,J)-1. ! Decrease NCA
1005 END SUBROUTINE advance_ppt
1007 SUBROUTINE add_a2a(lvar,rvar,config_flags, &
1008 ids,ide, jds, jde, kds, kde, &
1009 ims, ime, jms, jme, kms, kme, &
1010 its, ite, jts, jte, kts, kte )
1011 !------------------------------------------------------------
1013 !------------------------------------------------------------
1014 TYPE(grid_config_rec_type), INTENT(IN) :: config_flags
1016 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1017 ims, ime, jms, jme, kms, kme, &
1018 its, ite, jts, jte, kts, kte
1020 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(IN ) ::&
1022 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(INOUT) ::&
1026 INTEGER :: i,j,k,i_start,i_end,j_start,j_end,ktf
1029 i_end = MIN(ite,ide-1)
1031 j_end = MIN(jte,jde-1)
1032 ktf = min(kte,kde-1)
1034 IF ( config_flags%specified .or. &
1035 config_flags%nested) i_start = MAX(ids+1,its)
1036 IF ( config_flags%specified .or. &
1037 config_flags%nested) i_end = MIN(ide-2,ite)
1038 IF ( config_flags%specified .or. &
1039 config_flags%nested) j_start = MAX(jds+1,jts)
1040 IF ( config_flags%specified .or. &
1041 config_flags%nested) j_end = MIN(jde-2,jte)
1042 IF ( config_flags%periodic_x ) i_start = its
1043 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
1045 DO j = j_start,j_end
1047 DO i = i_start,i_end
1048 lvar(i,k,j) = lvar(i,k,j) + rvar(i,k,j)
1053 END SUBROUTINE add_a2a
1055 !------------------------------------------------------------
1056 SUBROUTINE add_a2c_u(lvar,rvar,config_flags, &
1057 ids,ide, jds, jde, kds, kde, &
1058 ims, ime, jms, jme, kms, kme, &
1059 its, ite, jts, jte, kts, kte )
1060 !------------------------------------------------------------
1061 !------------------------------------------------------------
1063 !------------------------------------------------------------
1065 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
1067 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1068 ims, ime, jms, jme, kms, kme, &
1069 its, ite, jts, jte, kts, kte
1071 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(IN ) ::&
1073 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(INOUT) ::&
1078 INTEGER :: i,j,k,i_start,i_end,j_start,j_end,ktf
1085 j_end = MIN(jte,jde-1)
1087 IF ( config_flags%specified .or. &
1088 config_flags%nested) i_start = MAX(ids+1,its)
1089 IF ( config_flags%specified .or. &
1090 config_flags%nested) i_end = MIN(ide-1,ite)
1091 IF ( config_flags%specified .or. &
1092 config_flags%nested) j_start = MAX(jds+1,jts)
1093 IF ( config_flags%specified .or. &
1094 config_flags%nested) j_end = MIN(jde-2,jte)
1095 IF ( config_flags%periodic_x ) i_start = its
1096 IF ( config_flags%periodic_x ) i_end = ite
1098 DO j = j_start,j_end
1100 DO i = i_start,i_end
1101 lvar(i,k,j) = lvar(i,k,j) + &
1102 0.5*(rvar(i,k,j)+rvar(i-1,k,j))
1107 END SUBROUTINE add_a2c_u
1109 !------------------------------------------------------------
1110 SUBROUTINE add_a2c_v(lvar,rvar,config_flags, &
1111 ids,ide, jds, jde, kds, kde, &
1112 ims, ime, jms, jme, kms, kme, &
1113 its, ite, jts, jte, kts, kte )
1114 !------------------------------------------------------------
1115 !------------------------------------------------------------
1117 !------------------------------------------------------------
1119 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
1121 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1122 ims, ime, jms, jme, kms, kme, &
1123 its, ite, jts, jte, kts, kte
1125 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(IN ) ::&
1127 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(INOUT) ::&
1132 INTEGER :: i,j,k,i_start,i_end,j_start,j_end,ktf
1137 i_end = MIN(ite,ide-1)
1141 IF ( config_flags%specified .or. &
1142 config_flags%nested) i_start = MAX(ids+1,its)
1143 IF ( config_flags%specified .or. &
1144 config_flags%nested) i_end = MIN(ide-2,ite)
1145 IF ( config_flags%specified .or. &
1146 config_flags%nested) j_start = MAX(jds+1,jts)
1147 IF ( config_flags%specified .or. &
1148 config_flags%nested) j_end = MIN(jde-1,jte)
1149 IF ( config_flags%periodic_x ) i_start = its
1150 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
1152 DO j = j_start,j_end
1154 DO i = i_start,i_end
1155 lvar(i,k,j) = lvar(i,k,j) + &
1156 0.5*(rvar(i,k,j)+rvar(i,k,j-1))
1161 END SUBROUTINE add_a2c_v
1163 !------------------------------------------------------------
1164 SUBROUTINE add_c2c_u(lvar,rvar,config_flags, &
1165 ids,ide, jds, jde, kds, kde, &
1166 ims, ime, jms, jme, kms, kme, &
1167 its, ite, jts, jte, kts, kte )
1168 !------------------------------------------------------------
1169 !------------------------------------------------------------
1171 !------------------------------------------------------------
1173 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
1175 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1176 ims, ime, jms, jme, kms, kme, &
1177 its, ite, jts, jte, kts, kte
1179 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(IN ) ::&
1181 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(INOUT) ::&
1186 INTEGER :: i,j,k,i_start,i_end,j_start,j_end,ktf
1193 j_end = MIN(jte,jde-1)
1196 IF ( config_flags%specified .or. &
1197 config_flags%nested) i_start = MAX(ids+1,its)
1198 IF ( config_flags%specified .or. &
1199 config_flags%nested) i_end = MIN(ide-1,ite)
1200 IF ( config_flags%specified .or. &
1201 config_flags%nested) j_start = MAX(jds+1,jts)
1202 IF ( config_flags%specified .or. &
1203 config_flags%nested) j_end = MIN(jde-2,jte)
1205 ! write(*,'(a,6i4)') 'call c2cu, i_start, i_end, j_start, j_end=', i_start, i_end, j_start, j_end
1207 DO j = j_start,j_end
1209 DO i = i_start,i_end
1210 lvar(i,k,j) = lvar(i,k,j) + rvar(i,k,j)
1215 END SUBROUTINE add_c2c_u
1217 SUBROUTINE add_c2c_v(lvar,rvar,config_flags, &
1218 ids,ide, jds, jde, kds, kde, &
1219 ims, ime, jms, jme, kms, kme, &
1220 its, ite, jts, jte, kts, kte )
1221 !------------------------------------------------------------
1222 !------------------------------------------------------------
1224 !------------------------------------------------------------
1226 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
1228 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1229 ims, ime, jms, jme, kms, kme, &
1230 its, ite, jts, jte, kts, kte
1232 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(IN ) ::&
1234 REAL, DIMENSION(ims:ime,kms:kme,jms:jme),INTENT(INOUT) ::&
1239 INTEGER :: i,j,k,i_start,i_end,j_start,j_end,ktf
1244 i_end = MIN(ite,ide-1)
1248 IF ( config_flags%specified .or. &
1249 config_flags%nested) i_start = MAX(ids+1,its)
1250 IF ( config_flags%specified .or. &
1251 config_flags%nested) i_end = MIN(ide-2,ite)
1252 IF ( config_flags%specified .or. &
1253 config_flags%nested) j_start = MAX(jds+1,jts)
1254 IF ( config_flags%specified .or. &
1255 config_flags%nested) j_end = MIN(jde-1,jte)
1257 ! write(*,'(a,6i4)') 'call c2cv, i_start, i_end, j_start, j_end=', i_start, i_end, j_start, j_end
1259 DO j = j_start,j_end
1261 DO i = i_start,i_end
1262 lvar(i,k,j) = lvar(i,k,j) + rvar(i,k,j)
1267 END SUBROUTINE add_c2c_v
1271 END MODULE module_physics_addtendc