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 a_module_physics_addtendc
23 USE module_state_description
28 SUBROUTINE a_update_phy_ten(rph_tendf,rt_tendf,a_rt_tendf,ru_tendf,a_ru_tendf, &
29 rv_tendf,a_rv_tendf,moist_tendf,a_moist_tendf, &
30 scalar_tendf,mu_tendf, &
31 RTHRATEN,RTHBLTEN,a_RTHBLTEN,RTHCUTEN,a_RTHCUTEN,RTHSHTEN, &
32 RUBLTEN,a_RUBLTEN,RUCUTEN,RUSHTEN, &
33 RVBLTEN,a_RVBLTEN,RVCUTEN,RVSHTEN, &
34 RQVBLTEN,a_RQVBLTEN,RQCBLTEN,RQIBLTEN, &
35 RQVCUTEN,a_RQVCUTEN,RQCCUTEN,RQRCUTEN,RQICUTEN,RQSCUTEN, &
36 RQVSHTEN,RQCSHTEN,RQRSHTEN,RQISHTEN,RQSSHTEN,RQGSHTEN,&
37 RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN,RPHNDGDTEN, &
38 RQVNDGDTEN,RMUNDGDTEN, &
39 rthfrten,rqvfrten, & !fire
40 n_moist,n_scalar,config_flags,rk_step,adv_moist_cond, &
41 ids, ide, jds, jde, kds, kde, &
42 ims, ime, jms, jme, kms, kme, &
43 its, ite, jts, jte, kts, kte )
44 !-------------------------------------------------------------------
46 !-------------------------------------------------------------------
48 TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
50 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
51 ims, ime, jms, jme, kms, kme, &
52 its, ite, jts, jte, kts, kte, &
53 n_moist,n_scalar,rk_step
55 LOGICAL , INTENT(IN) :: adv_moist_cond
57 REAL , DIMENSION(ims:ime , kms:kme, jms:jme),INTENT(INOUT) :: &
66 REAL , DIMENSION(ims:ime , jms:jme),INTENT(INOUT) :: mu_tendf
68 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
69 INTENT(INOUT) :: moist_tendf, &
72 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar), &
73 INTENT(INOUT) :: scalar_tendf
75 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
106 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: &
114 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN ) :: RMUNDGDTEN
116 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: & ! fire
119 !------------------------------------------------------------------
120 ! set up loop bounds for this grid's boundary conditions
122 if (config_flags%cu_physics .gt. 0) &
123 CALL a_phy_cu_ten(config_flags,rk_step,n_moist,n_scalar, &
124 rt_tendf,a_rt_tendf,ru_tendf,rv_tendf, &
125 RUCUTEN,RVCUTEN,RTHCUTEN,a_RTHCUTEN, &
126 RQVCUTEN,a_RQVCUTEN,RQCCUTEN,RQRCUTEN, &
127 RQICUTEN,RQSCUTEN,moist_tendf,a_moist_tendf,&
128 scalar_tendf,adv_moist_cond, &
129 ids, ide, jds, jde, kds, kde, &
130 ims, ime, jms, jme, kms, kme, &
131 its, ite, jts, jte, kts, kte )
133 if (config_flags%bl_pbl_physics .gt. 0) &
134 CALL a_phy_bl_ten(config_flags,rk_step,n_moist,n_scalar, &
135 rt_tendf,a_rt_tendf,ru_tendf,a_ru_tendf, &
136 rv_tendf,a_rv_tendf,moist_tendf,a_moist_tendf, &
137 scalar_tendf,adv_moist_cond, &
138 RTHBLTEN,a_RTHBLTEN,RUBLTEN,a_RUBLTEN, &
140 RQVBLTEN,a_RQVBLTEN,RQCBLTEN,RQIBLTEN, &
141 ids, ide, jds, jde, kds, kde, &
142 ims, ime, jms, jme, kms, kme, &
143 its, ite, jts, jte, kts, kte )
145 END SUBROUTINE a_update_phy_ten
147 !=================================================================
148 SUBROUTINE a_phy_bl_ten(config_flags,rk_step,n_moist,n_scalar, &
149 rt_tendf,a_rt_tendf,ru_tendf,a_ru_tendf, &
150 rv_tendf,a_rv_tendf,moist_tendf,a_moist_tendf, &
151 scalar_tendf,adv_moist_cond, &
152 RTHBLTEN,a_RTHBLTEN,RUBLTEN,a_RUBLTEN, &
154 RQVBLTEN,a_RQVBLTEN,RQCBLTEN,RQIBLTEN, &
155 ids, ide, jds, jde, kds, kde, &
156 ims, ime, jms, jme, kms, kme, &
157 its, ite, jts, jte, kts, kte )
158 !-----------------------------------------------------------------
160 !-----------------------------------------------------------------
161 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
163 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
164 ims, ime, jms, jme, kms, kme, &
165 its, ite, jts, jte, kts, kte, &
166 n_moist, n_scalar, rk_step
168 LOGICAL , INTENT(IN) :: adv_moist_cond
170 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
171 INTENT(INOUT) :: moist_tendf, &
174 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar), &
175 INTENT(INOUT) :: scalar_tendf
177 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
185 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: &
191 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
200 INTEGER :: i,j,k,IBGN,IEND,JBGN,JEND
202 !-----------------------------------------------------------------
204 SELECT CASE(config_flags%bl_pbl_physics)
206 CASE (SURFDRAGSCHEME)
208 if (P_QV .ge. PARAM_FIRST_SCALAR) &
209 CALL a_add_a2a(moist_tendf(ims,kms,jms,P_QV), &
210 a_moist_tendf(ims,kms,jms,P_QV), &
211 RQVBLTEN, a_RQVBLTEN, &
213 ids,ide, jds, jde, kds, kde, &
214 ims, ime, jms, jme, kms, kme, &
215 its, ite, jts, jte, kts, kte )
217 CALL a_add_a2c_v(rv_tendf,a_rv_tendf, &
218 RVBLTEN,a_RVBLTEN,config_flags, &
219 ids,ide, jds, jde, kds, kde, &
220 ims, ime, jms, jme, kms, kme, &
221 its, ite, jts, jte, kts, kte )
223 CALL a_add_a2c_u(ru_tendf,a_ru_tendf, &
224 RUBLTEN,a_RUBLTEN,config_flags, &
225 ids,ide, jds, jde, kds, kde, &
226 ims, ime, jms, jme, kms, kme, &
227 its, ite, jts, jte, kts, kte )
229 CALL a_add_a2a(rt_tendf,a_rt_tendf, &
230 RTHBLTEN,a_RTHBLTEN,config_flags, &
231 ids,ide, jds, jde, kds, kde, &
232 ims, ime, jms, jme, kms, kme, &
233 its, ite, jts, jte, kts, kte )
237 print*,'a_phy_bl_ten: The pbl scheme does not exist'
241 END SUBROUTINE a_phy_bl_ten
243 SUBROUTINE a_phy_cu_ten(config_flags,rk_step,n_moist,n_scalar, &
244 rt_tendf,a_rt_tendf,ru_tendf,rv_tendf, &
245 RUCUTEN,RVCUTEN,RTHCUTEN,a_RTHCUTEN, &
246 RQVCUTEN,a_RQVCUTEN,RQCCUTEN,RQRCUTEN, &
247 RQICUTEN,RQSCUTEN,moist_tendf,a_moist_tendf,&
248 scalar_tendf,adv_moist_cond, &
249 ids, ide, jds, jde, kds, kde, &
250 ims, ime, jms, jme, kms, kme, &
251 its, ite, jts, jte, kts, kte )
252 !-----------------------------------------------------------------
254 !-----------------------------------------------------------------
255 TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
257 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
258 ims, ime, jms, jme, kms, kme, &
259 its, ite, jts, jte, kts, kte, &
260 n_moist, n_scalar, rk_step
262 LOGICAL , INTENT(IN) :: adv_moist_cond
264 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist), &
265 INTENT(INOUT) :: moist_tendf, a_moist_tendf
267 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar), &
268 INTENT(INOUT) :: scalar_tendf
270 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
280 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: &
284 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
295 SELECT CASE (config_flags%cu_physics)
298 CALL a_add_a2a(rt_tendf, a_rt_tendf, &
299 RTHCUTEN, a_RTHCUTEN, config_flags, &
300 ids,ide, jds, jde, kds, kde, &
301 ims, ime, jms, jme, kms, kme, &
302 its, ite, jts, jte, kts, kte )
304 if (P_QV .ge. PARAM_FIRST_SCALAR) &
305 CALL a_add_a2a(moist_tendf(ims,kms,jms,P_QV), &
306 a_moist_tendf(ims,kms,jms,P_QV), RQVCUTEN, &
309 ids,ide, jds, jde, kds, kde, &
310 ims, ime, jms, jme, kms, kme, &
311 its, ite, jts, jte, kts, kte )
317 END SUBROUTINE a_phy_cu_ten
320 ! Generated by TAPENADE (INRIA, Tropics team)
321 ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
323 ! Differentiation of advance_ppt in reverse (adjoint) mode:
324 ! gradient of useful results: pratesh rqccuten rthcuten rqicuten
325 ! rqscuten rainc pratec cuppt cutop cubot nca rqrcuten
326 ! rqvcuten rainsh htop hbot
327 ! with respect to varying inputs: pratesh rqccuten rthcuten rqicuten
328 ! rqscuten rainc pratec cuppt cutop cubot nca rqrcuten
329 ! rqvcuten rainsh htop hbot
330 ! RW status of diff variables: pratesh:incr rqccuten:in-out rthcuten:in-out
331 ! rqicuten:in-out rqscuten:in-out rainc:in-out pratec:incr
332 ! cuppt:in-out cutop:incr cubot:incr nca:in-out
333 ! rqrcuten:in-out rqvcuten:in-out rainsh:in-out
334 ! htop:in-out hbot:in-out
335 SUBROUTINE A_ADVANCE_PPT(rthcuten, rthcutenb, rqvcuten, rqvcutenb, &
336 & rqccuten, rqccutenb, rqrcuten, rqrcutenb, rqicuten, rqicutenb, &
337 & rqscuten, rqscutenb, rainc, raincb, raincv, rainsh, rainshb, pratec, &
338 & pratecb, pratesh, prateshb, nca, ncab, htop, htopb, hbot, hbotb, cutop&
339 & , cutopb, cubot, cubotb, cuppt, cupptb, dt, config_flags, ids, ide, &
340 & jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, &
344 TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
345 INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
346 & jme, kms, kme, its, ite, jts, jte, kts, kte
347 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: rthcuten&
348 & , rqvcuten, rqccuten, rqrcuten, rqicuten, rqscuten
349 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rthcutenb, rqvcutenb, &
350 & rqccutenb, rqrcutenb, rqicutenb, rqscutenb
351 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: rainc, rainsh, &
352 & raincv, pratec, pratesh, nca, htop, hbot, cutop, cubot, cuppt
353 REAL, DIMENSION(ims:ime, jms:jme) :: raincb, rainshb, pratecb, &
354 & prateshb, ncab, htopb, hbotb, cutopb, cubotb, cupptb
355 REAL, INTENT(IN) :: dt
357 INTEGER :: i, j, k, i_start, i_end, j_start, j_end, k_start, k_end
358 INTEGER :: ncutop, ncubot
361 !-----------------------------------------------------------------
362 IF (config_flags%cu_physics .NE. 0) THEN
363 ! SET START AND END POINTS FOR TILES
365 IF (ite .GT. ide - 1) THEN
371 IF (jte .GT. jde - 1) THEN
377 ! IF( config_flags%nested .or. config_flags%specified ) THEN
378 ! i_start = max( its,ids+1 )
379 ! i_end = min( ite,ide-2 )
380 ! j_start = max( jts,jds+1 )
381 ! j_end = min( jte,jde-2 )
385 IF (kte .GT. kde - 1) THEN
390 SELECT CASE (config_flags%cu_physics)
394 IF (nca(i, j) .GT. 0) THEN
395 IF (NINT(nca(i, j)/dt) .LE. 0) THEN
396 ! set tendency to zero
400 IF (p_qi .GE. param_first_scalar) THEN
401 CALL PUSHCONTROL1B(0)
403 CALL PUSHCONTROL1B(1)
405 IF (p_qs .GE. param_first_scalar) THEN
406 CALL PUSHCONTROL1B(1)
408 CALL PUSHCONTROL1B(0)
411 CALL PUSHCONTROL2B(1)
413 CALL PUSHCONTROL2B(2)
416 CALL PUSHCONTROL2B(0)
420 DO j=j_end,j_start,-1
421 DO i=i_end,i_start,-1
422 CALL POPCONTROL2B(branch)
423 IF (branch .NE. 0) THEN
424 IF (branch .EQ. 1) THEN
425 DO k=k_end,k_start,-1
426 CALL POPCONTROL1B(branch)
427 IF (branch .NE. 0) rqscutenb(i, k, j) = 0.0
428 CALL POPCONTROL1B(branch)
429 IF (branch .EQ. 0) rqicutenb(i, k, j) = 0.0
430 rqrcutenb(i, k, j) = 0.0
431 rqccutenb(i, k, j) = 0.0
432 rqvcutenb(i, k, j) = 0.0
433 rthcutenb(i, k, j) = 0.0
443 IF (nca(i, j) .GT. 0) THEN
444 IF (NINT(nca(i, j)/dt) .LE. 0) THEN
445 CALL PUSHCONTROL2B(1)
447 CALL PUSHCONTROL2B(2)
450 CALL PUSHCONTROL2B(0)
454 DO j=j_end,j_start,-1
455 DO i=i_end,i_start,-1
456 CALL POPCONTROL2B(branch)
457 IF (branch .NE. 0) THEN
458 IF (branch .EQ. 1) THEN
459 DO k=k_end,k_start,-1
460 rqvcutenb(i, k, j) = 0.0
461 rthcutenb(i, k, j) = 0.0
467 CASE (bmjscheme, camzmscheme)
471 ! HTOP, HBOT FOR GFDL RADIATION
472 ncutop = NINT(cutop(i, j))
473 ncubot = NINT(cubot(i, j))
474 IF (ncutop .GT. 1 .AND. ncutop .LT. kde) THEN
475 IF (cutop(i, j) .LT. htop(i, j)) THEN
476 CALL PUSHCONTROL2B(2)
478 CALL PUSHCONTROL2B(1)
481 CALL PUSHCONTROL2B(0)
483 IF (ncubot .GT. 0 .AND. ncubot .LT. kde) THEN
484 IF (cubot(i, j) .GT. hbot(i, j)) THEN
485 CALL PUSHCONTROL2B(1)
487 CALL PUSHCONTROL2B(2)
490 CALL PUSHCONTROL2B(0)
494 DO j=j_end,j_start,-1
495 DO i=i_end,i_start,-1
496 CALL POPCONTROL2B(branch)
497 IF (branch .NE. 0) THEN
498 IF (branch .NE. 1) THEN
499 cubotb(i, j) = cubotb(i, j) + hbotb(i, j)
503 CALL POPCONTROL2B(branch)
504 IF (branch .NE. 0) THEN
505 IF (branch .EQ. 1) THEN
506 cutopb(i, j) = cutopb(i, j) + htopb(i, j)
512 CASE (kfetascheme, MSKFSCHEME)
515 ! HTOP, HBOT FOR GFDL RADIATION
516 ncutop = NINT(cutop(i, j))
517 ncubot = NINT(cubot(i, j))
518 IF (ncutop .GT. 1 .AND. ncutop .LT. kde) THEN
519 IF (cutop(i, j) .LT. htop(i, j)) THEN
520 CALL PUSHCONTROL2B(2)
522 CALL PUSHCONTROL2B(1)
525 CALL PUSHCONTROL2B(0)
527 IF (ncubot .GT. 0 .AND. ncubot .LT. kde) THEN
528 IF (cubot(i, j) .GT. hbot(i, j)) THEN
529 CALL PUSHCONTROL2B(2)
531 CALL PUSHCONTROL2B(1)
534 CALL PUSHCONTROL2B(0)
536 IF (nca(i, j) .GT. 0) THEN
537 IF (NINT(nca(i, j)/dt) .LE. 1) THEN
538 ! set tendency to zero
542 IF (p_qi .GE. param_first_scalar) THEN
543 CALL PUSHCONTROL1B(0)
545 CALL PUSHCONTROL1B(1)
547 IF (p_qs .GE. param_first_scalar) THEN
548 CALL PUSHCONTROL1B(1)
550 CALL PUSHCONTROL1B(0)
553 CALL PUSHCONTROL2B(1)
555 CALL PUSHCONTROL2B(2)
558 CALL PUSHCONTROL2B(0)
562 DO j=j_end,j_start,-1
563 DO i=i_end,i_start,-1
564 CALL POPCONTROL2B(branch)
565 IF (branch .NE. 0) THEN
566 IF (branch .EQ. 1) THEN
567 DO k=k_end,k_start,-1
568 CALL POPCONTROL1B(branch)
569 IF (branch .NE. 0) rqscutenb(i, k, j) = 0.0
570 CALL POPCONTROL1B(branch)
571 IF (branch .EQ. 0) rqicutenb(i, k, j) = 0.0
572 rqrcutenb(i, k, j) = 0.0
573 rqccutenb(i, k, j) = 0.0
574 rqvcutenb(i, k, j) = 0.0
575 rthcutenb(i, k, j) = 0.0
579 CALL POPCONTROL2B(branch)
580 IF (branch .NE. 0) THEN
581 IF (branch .EQ. 1) THEN
582 cubotb(i, j) = cubotb(i, j) + hbotb(i, j)
586 CALL POPCONTROL2B(branch)
587 IF (branch .NE. 0) THEN
588 IF (branch .EQ. 1) THEN
589 cutopb(i, j) = cutopb(i, j) + htopb(i, j)
596 DO j=j_end,j_start,-1
597 DO i=i_end,i_start,-1
598 tempb = dt*cupptb(i, j)/1000.
599 pratecb(i, j) = pratecb(i, j) + dt*raincb(i, j) + tempb
600 prateshb(i, j) = prateshb(i, j) + dt*rainshb(i, j) + tempb
604 END SUBROUTINE A_ADVANCE_PPT
606 ! Generated by TAPENADE (INRIA, Tropics team)
607 ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
609 ! Differentiation of add_a2a in reverse (adjoint) mode:
610 ! gradient of useful results: lvar rvar
611 ! with respect to varying inputs: lvar rvar
612 ! RW status of diff variables: lvar:in-out rvar:incr
613 SUBROUTINE A_ADD_A2A(lvar, lvarb, rvar, rvarb, config_flags, ids, ide, &
614 & jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, &
617 !------------------------------------------------------------
618 TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
619 INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
620 & jme, kms, kme, its, ite, jts, jte, kts, kte
621 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: rvar
622 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rvarb
623 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: lvar
624 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: lvarb
626 INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf
630 IF (ite .GT. ide - 1) THEN
636 IF (jte .GT. jde - 1) THEN
641 IF (kte .GT. kde - 1) THEN
646 IF (config_flags%specified .OR. config_flags%nested) THEN
647 IF (ids + 1 .LT. its) THEN
653 IF (config_flags%specified .OR. config_flags%nested) THEN
654 IF (ide - 2 .GT. ite) THEN
660 IF (config_flags%specified .OR. config_flags%nested) THEN
661 IF (jds + 1 .LT. jts) THEN
667 IF (config_flags%specified .OR. config_flags%nested) THEN
668 IF (jde - 2 .GT. jte) THEN
674 IF (config_flags%periodic_x) i_start = its
675 IF (config_flags%periodic_x) THEN
676 IF (ite .GT. ide - 1) THEN
682 DO j=j_end,j_start,-1
684 DO i=i_end,i_start,-1
685 rvarb(i, k, j) = rvarb(i, k, j) + lvarb(i, k, j)
689 END SUBROUTINE A_ADD_A2A
691 ! Generated by TAPENADE (INRIA, Tropics team)
692 ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
694 ! Differentiation of add_a2c_u in reverse (adjoint) mode:
695 ! gradient of useful results: lvar rvar
696 ! with respect to varying inputs: lvar rvar
697 ! RW status of diff variables: lvar:in-out rvar:incr
698 SUBROUTINE A_ADD_A2C_U(lvar, lvarb, rvar, rvarb, config_flags, ids, ide&
699 & , jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte&
702 !------------------------------------------------------------
703 TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
704 INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
705 & jme, kms, kme, its, ite, jts, jte, kts, kte
706 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: rvar
707 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rvarb
708 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: lvar
709 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: lvarb
711 INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf
714 IF (kte .GT. kde - 1) THEN
722 IF (jte .GT. jde - 1) THEN
727 IF (config_flags%specified .OR. config_flags%nested) THEN
728 IF (ids + 1 .LT. its) THEN
734 IF (config_flags%specified .OR. config_flags%nested) THEN
735 IF (ide - 1 .GT. ite) THEN
741 IF (config_flags%specified .OR. config_flags%nested) THEN
742 IF (jds + 1 .LT. jts) THEN
748 IF (config_flags%specified .OR. config_flags%nested) THEN
749 IF (jde - 2 .GT. jte) THEN
755 IF (config_flags%periodic_x) i_start = its
756 IF (config_flags%periodic_x) i_end = ite
757 DO j=j_end,j_start,-1
759 DO i=i_end,i_start,-1
760 rvarb(i, k, j) = rvarb(i, k, j) + 0.5*lvarb(i, k, j)
761 rvarb(i-1, k, j) = rvarb(i-1, k, j) + 0.5*lvarb(i, k, j)
765 END SUBROUTINE A_ADD_A2C_U
767 ! Generated by TAPENADE (INRIA, Tropics team)
768 ! Tapenade 3.5 (r3785) - 22 Mar 2011 18:35
770 ! Differentiation of add_a2c_v in reverse (adjoint) mode:
771 ! gradient of useful results: lvar rvar
772 ! with respect to varying inputs: lvar rvar
773 ! RW status of diff variables: lvar:in-out rvar:incr
774 SUBROUTINE A_ADD_A2C_V(lvar, lvarb, rvar, rvarb, config_flags, ids, ide&
775 & , jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte&
778 !------------------------------------------------------------
779 TYPE(GRID_CONFIG_REC_TYPE), INTENT(IN) :: config_flags
780 INTEGER, INTENT(IN) :: ids, ide, jds, jde, kds, kde, ims, ime, jms, &
781 & jme, kms, kme, its, ite, jts, jte, kts, kte
782 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: rvar
783 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: rvarb
784 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: lvar
785 REAL, DIMENSION(ims:ime, kms:kme, jms:jme) :: lvarb
787 INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf
791 IF (ite .GT. ide - 1) THEN
798 IF (config_flags%specified .OR. config_flags%nested) THEN
799 IF (ids + 1 .LT. its) THEN
805 IF (config_flags%specified .OR. config_flags%nested) THEN
806 IF (ide - 2 .GT. ite) THEN
812 IF (config_flags%specified .OR. config_flags%nested) THEN
813 IF (jds + 1 .LT. jts) THEN
819 IF (config_flags%specified .OR. config_flags%nested) THEN
820 IF (jde - 1 .GT. jte) THEN
826 IF (config_flags%periodic_x) i_start = its
827 IF (config_flags%periodic_x) THEN
828 IF (ite .GT. ide - 1) THEN
834 DO j=j_end,j_start,-1
836 DO i=i_end,i_start,-1
837 rvarb(i, k, j) = rvarb(i, k, j) + 0.5*lvarb(i, k, j)
838 rvarb(i, k, j-1) = rvarb(i, k, j-1) + 0.5*lvarb(i, k, j)
842 END SUBROUTINE A_ADD_A2C_V
846 END MODULE a_module_physics_addtendc