Line data Source code
1 : module convect_diagnostics
2 :
3 : !----------------------------------------------- !
4 : ! Purpose: !
5 : ! !
6 : ! CAM convection diagnostics !
7 : ! to be called after convection routines !
8 : ! A. Herrington. Nov. 2021 !
9 : !----------------------------------------------- !
10 :
11 : use shr_kind_mod, only: r8=>shr_kind_r8
12 : use ppgrid, only: pver, pcols, pverp
13 : use cam_history, only: outfld, addfld, horiz_only
14 : use phys_control, only: phys_getopts
15 : use cam_abortutils, only: endrun
16 : implicit none
17 : private
18 : save
19 :
20 : public :: &
21 : convect_diagnostics_register, & ! Register fields in physics buffer
22 : convect_diagnostics_init, & ! Initialize convect diagnostic module
23 : convect_diagnostics_calc ! Return convect diagnostic
24 :
25 : character(len=16) :: shallow_scheme ! Default set in phys_control.F90, use namelist to change
26 :
27 : ! Physics buffer indices
28 : integer :: icwmrsh_idx = 0
29 : integer :: rprdsh_idx = 0
30 : integer :: rprdtot_idx = 0
31 : integer :: cldtop_idx = 0
32 : integer :: cldbot_idx = 0
33 : integer :: nevapr_shcu_idx = 0
34 : integer :: rprddp_idx = 0
35 : integer :: prec_sh_idx = 0
36 : integer :: snow_sh_idx = 0
37 : integer :: cmfmc_sh_idx = 0
38 :
39 : contains
40 :
41 : !=============================================================================== !
42 : ! !
43 : !=============================================================================== !
44 :
45 1496904 : subroutine convect_diagnostics_register
46 :
47 : !-------------------------------------------------- !
48 : ! Purpose : Register fields with the physics buffer !
49 : !-------------------------------------------------- !
50 : use physics_buffer, only: pbuf_add_field, dtype_r8
51 :
52 1536 : call phys_getopts( shallow_scheme_out = shallow_scheme )
53 :
54 1536 : call pbuf_add_field('ICWMRSH', 'physpkg' ,dtype_r8,(/pcols,pver/), icwmrsh_idx )
55 1536 : call pbuf_add_field('RPRDSH', 'physpkg' ,dtype_r8,(/pcols,pver/), rprdsh_idx )
56 1536 : call pbuf_add_field('RPRDTOT', 'physpkg' ,dtype_r8,(/pcols,pver/), rprdtot_idx )
57 1536 : call pbuf_add_field('CLDTOP', 'physpkg' ,dtype_r8,(/pcols,1/), cldtop_idx )
58 1536 : call pbuf_add_field('CLDBOT', 'physpkg' ,dtype_r8,(/pcols,1/), cldbot_idx )
59 1536 : call pbuf_add_field('NEVAPR_SHCU','physpkg' ,dtype_r8,(/pcols,pver/), nevapr_shcu_idx )
60 1536 : call pbuf_add_field('PREC_SH', 'physpkg' ,dtype_r8,(/pcols/), prec_sh_idx )
61 1536 : call pbuf_add_field('SNOW_SH', 'physpkg' ,dtype_r8,(/pcols/), snow_sh_idx )
62 : ! Updraft mass flux by shallow convection [ kg/s/m2 ]
63 1536 : call pbuf_add_field('CMFMC_SH', 'physpkg' ,dtype_r8,(/pcols,pverp/), cmfmc_sh_idx )
64 :
65 : ! for this implementation, only CLUBB_SGS is supported
66 1536 : if (shallow_scheme /= 'CLUBB_SGS') then
67 0 : call endrun("convect_diagnostics_register: Unsupported shallow_scheme")
68 : end if
69 :
70 1536 : end subroutine convect_diagnostics_register
71 :
72 : !=============================================================================== !
73 : ! !
74 : !=============================================================================== !
75 :
76 1536 : subroutine convect_diagnostics_init
77 :
78 : !------------------------------------------------------------------------------- !
79 : ! Purpose : Declare output fields, and initialize variables needed by convection !
80 : !------------------------------------------------------------------------------- !
81 1536 : use physics_buffer, only: pbuf_get_index
82 :
83 3072 : call addfld( 'CMFMC', (/ 'ilev' /), 'A', 'kg/m2/s', 'Moist convection (deep+shallow) mass flux' )
84 1536 : call addfld( 'CLDTOP', horiz_only, 'I', '1', 'Vertical index of cloud top' )
85 1536 : call addfld( 'CLDBOT', horiz_only, 'I', '1', 'Vertical index of cloud base' )
86 1536 : call addfld( 'PCLDTOP', horiz_only, 'A', 'Pa', 'Pressure of cloud top' )
87 1536 : call addfld( 'PCLDBOT', horiz_only, 'A', 'Pa', 'Pressure of cloud base' )
88 :
89 1536 : rprddp_idx = pbuf_get_index('RPRDDP')
90 :
91 1536 : end subroutine convect_diagnostics_init
92 :
93 : !=============================================================================== !
94 : ! !
95 : !=============================================================================== !
96 :
97 1495368 : subroutine convect_diagnostics_calc( ztodt , cmfmc , &
98 : qc , qc2 , rliq , rliq2 , &
99 : state , pbuf)
100 :
101 1536 : use physics_buffer, only: physics_buffer_desc, pbuf_get_field, pbuf_set_field
102 : use physics_types, only: physics_state
103 : implicit none
104 :
105 : ! ---------------------- !
106 : ! Input-Output Arguments !
107 : ! ---------------------- !
108 : type(physics_buffer_desc), pointer :: pbuf(:)
109 : type(physics_state), intent(in) :: state ! Physics state variables
110 : real(r8), intent(in) :: ztodt ! 2 delta-t [ s ]
111 :
112 : real(r8), intent(out) :: rliq2(pcols) ! Vertically-integrated reserved cloud condensate [ m/s ]
113 : real(r8), intent(out) :: qc2(pcols,pver) ! Same as qc but only from shallow convection scheme
114 :
115 : real(r8), intent(inout) :: cmfmc(pcols,pverp) ! Moist deep + shallow convection cloud mass flux [ kg/s/m2 ]
116 : real(r8), intent(inout) :: qc(pcols,pver) ! dq/dt due to export of cloud water into environment by shallow
117 : ! and deep convection [ kg/kg/s ]
118 : real(r8), intent(inout) :: rliq(pcols) ! Vertical integral of qc [ m/s ]
119 :
120 : integer :: i
121 : integer :: lchnk ! Chunk identifier
122 : integer :: ncol ! Number of atmospheric columns
123 :
124 1495368 : real(r8), pointer :: precc(:) ! Shallow convective precipitation (rain+snow) rate at surface [ m/s ]
125 1495368 : real(r8), pointer :: snow(:) ! Shallow convective snow rate at surface [ m/s ]
126 :
127 : real(r8) :: cnt2(pcols) ! Top level of shallow convective activity
128 : real(r8) :: cnb2(pcols) ! Bottom level of convective activity
129 : real(r8) :: pcnt(pcols) ! Top pressure level of shallow + deep convective activity
130 : real(r8) :: pcnb(pcols) ! Bottom pressure level of shallow + deep convective activity
131 :
132 1495368 : real(r8), pointer, dimension(:,:) :: icwmr ! In cloud water + ice mixing ratio
133 1495368 : real(r8), pointer, dimension(:,:) :: rprddp ! dq/dt due to deep convective rainout
134 1495368 : real(r8), pointer, dimension(:,:) :: rprdsh ! dq/dt due to deep and shallow convective rainout
135 1495368 : real(r8), pointer, dimension(:,:) :: evapcsh ! Evaporation of shallow convective precipitation >= 0.
136 1495368 : real(r8), pointer, dimension(:) :: cnt
137 1495368 : real(r8), pointer, dimension(:) :: cnb
138 1495368 : real(r8), pointer, dimension(:,:) :: cmfmc2 ! (pcols,pverp) Updraft mass flux by shallow convection [ kg/s/m2 ]
139 :
140 : ! ----------------------- !
141 : ! Main Computation Begins !
142 : ! ----------------------- !
143 :
144 1495368 : lchnk = state%lchnk
145 1495368 : ncol = state%ncol
146 :
147 1495368 : call pbuf_get_field(pbuf, icwmrsh_idx, icwmr)
148 :
149 1495368 : call pbuf_get_field(pbuf, rprddp_idx, rprddp )
150 :
151 1495368 : call pbuf_get_field(pbuf, rprdsh_idx, rprdsh )
152 :
153 1495368 : call pbuf_get_field(pbuf, nevapr_shcu_idx, evapcsh )
154 :
155 1495368 : call pbuf_get_field(pbuf, cldtop_idx, cnt )
156 :
157 1495368 : call pbuf_get_field(pbuf, cldbot_idx, cnb )
158 :
159 1495368 : call pbuf_get_field(pbuf, prec_sh_idx, precc )
160 :
161 1495368 : call pbuf_get_field(pbuf, snow_sh_idx, snow )
162 :
163 1495368 : call pbuf_get_field(pbuf, cmfmc_sh_idx, cmfmc2)
164 :
165 : ! If no shallow convection scheme zero out relevant vars
166 : ! (should also do the same if there's no deep scheme)
167 1495368 : if (shallow_scheme == 'CLUBB_SGS') then
168 2391093432 : cmfmc2 = 0._r8
169 2365672176 : rprdsh = 0._r8
170 25421256 : precc = 0._r8
171 2365672176 : icwmr = 0._r8
172 1495368 : rliq2 = 0._r8
173 1495368 : qc2 = 0._r8
174 25421256 : cnt2 = real(pver, r8)
175 25421256 : cnb2 = 1._r8
176 2365672176 : evapcsh = 0._r8
177 25421256 : snow = 0._r8
178 : end if
179 :
180 : ! ------------------------------------------------------------------------------ !
181 : ! Merge shallow convection output with prior results from deep convection scheme !
182 : ! ------------------------------------------------------------------------------ !
183 :
184 : ! ----------------------------------------------------------------------- !
185 : ! Combine cumulus updraft mass flux : 'cmfmc2'(shallow) + 'cmfmc'(deep) !
186 : ! ----------------------------------------------------------------------- !
187 :
188 2348597160 : cmfmc(:ncol,:) = cmfmc(:ncol,:) + cmfmc2(:ncol,:)
189 :
190 : ! -------------------------------------------------------------- !
191 : ! 'cnt2' & 'cnb2' are from shallow, 'cnt' & 'cnb' are from deep !
192 : ! 'cnt2' & 'cnb2' are the interface indices of cloud top & base: !
193 : ! cnt2 = float(kpen) !
194 : ! cnb2 = float(krel - 1) !
195 : ! Note that indices decreases with height. !
196 : ! -------------------------------------------------------------- !
197 :
198 24969168 : do i = 1, ncol
199 23473800 : if( cnt2(i) < cnt(i)) cnt(i) = cnt2(i)
200 23473800 : if( cnb2(i) > cnb(i)) cnb(i) = cnb2(i)
201 23473800 : if( cnb(i) == 1._r8 ) cnb(i) = cnt(i)
202 23473800 : pcnt(i) = state%pmid(i,int(cnt(i)))
203 24969168 : pcnb(i) = state%pmid(i,int(cnb(i)))
204 : end do
205 :
206 : ! ----------------------------------------------- !
207 : ! This quantity was previously known as CMFDQR. !
208 : ! Now CMFDQR is the shallow rain production only. !
209 : ! ----------------------------------------------- !
210 :
211 2326618728 : call pbuf_set_field(pbuf, rprdtot_idx, rprdsh(:ncol,:pver) + rprddp(:ncol,:pver), start=(/1,1/), kount=(/ncol,pver/))
212 :
213 : ! ----------------------------------------------------------------------- !
214 : ! Add shallow reserved cloud condensate to deep reserved cloud condensate !
215 : ! qc [ kg/kg/s] , rliq [ m/s ] !
216 : ! ----------------------------------------------------------------------- !
217 :
218 2323627992 : qc(:ncol,:pver) = qc(:ncol,:pver) + qc2(:ncol,:pver)
219 24969168 : rliq(:ncol) = rliq(:ncol) + rliq2(:ncol)
220 :
221 : ! ---------------------------------------------------------------------------- !
222 : ! Output new partition of cloud condensate variables, as well as precipitation !
223 : ! ---------------------------------------------------------------------------- !
224 :
225 1495368 : call outfld( 'CMFMC' , cmfmc , pcols , lchnk )
226 1495368 : call outfld( 'CLDTOP' , cnt , pcols , lchnk )
227 1495368 : call outfld( 'CLDBOT' , cnb , pcols , lchnk )
228 1495368 : call outfld( 'PCLDTOP', pcnt , pcols , lchnk )
229 1495368 : call outfld( 'PCLDBOT', pcnb , pcols , lchnk )
230 :
231 2990736 : end subroutine convect_diagnostics_calc
232 :
233 : end module convect_diagnostics
|