← Back to Documentation Home
CCPP SciDoc v8.0.0  v8.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
mp_nssl.F90
1
3
4
6
8module mp_nssl
9
10 use machine, only : kind_phys
12
13 implicit none
14
15 public :: mp_nssl_init, mp_nssl_run
16
17 private
18 logical :: is_initialized = .false.
19 logical :: missing_vars_global = .false.
20 real :: nssl_qccn
21
22 contains
23
30 subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, &
31 fn_nml, input_nml_file, mpirank, mpiroot, &
32 mpicomm, qc, qr, qi, qs, qh, &
33 ccw, crw, cci, csw, chw, vh, &
34 con_g, con_rd, con_cp, con_rv, &
35 con_t0c, con_cliq, con_csol, con_eps, &
36 imp_physics, imp_physics_nssl, &
37 nssl_cccn, nssl_alphah, nssl_alphahl, &
38 nssl_alphar, nssl_ehw0, nssl_ehlw0, &
39 nssl_ccn_on, nssl_hail_on, nssl_invertccn, nssl_3moment )
40
41
43 use mpi_f08
44
45 implicit none
46
47 integer, intent(in) :: ncol
48 integer, intent(in) :: nlev
49 character(len=*), intent( out) :: errmsg
50 integer, intent( out) :: errflg
51 integer, intent(in) :: threads
52 logical, intent(in) :: restart
53 character(len=*), intent(in) :: fn_nml
54 character(len=*), intent(in) :: input_nml_file(:)
55 real(kind_phys), intent(in) :: con_g, con_rd, con_cp, con_rv, &
56 con_t0c, con_cliq, con_csol, con_eps
57
58 integer, intent(in) :: mpirank
59 integer, intent(in) :: mpiroot
60 type(mpi_comm), intent(in) :: mpicomm
61 integer, intent(in) :: imp_physics
62 integer, intent(in) :: imp_physics_nssl
63 real(kind_phys), intent(in) :: nssl_cccn, nssl_alphah, nssl_alphahl
64 real(kind_phys), intent(in) :: nssl_alphar, nssl_ehw0, nssl_ehlw0
65 logical, intent(in) :: nssl_ccn_on, nssl_hail_on, nssl_invertccn, nssl_3moment
66
67 real(kind_phys), intent(inout) :: qc (:,:) !(1:ncol,1:nlev)
68 real(kind_phys), intent(inout) :: qr (:,:) !(1:ncol,1:nlev)
69 real(kind_phys), intent(inout) :: qi (:,:) !(1:ncol,1:nlev)
70 real(kind_phys), intent(inout) :: qs (:,:) !(1:ncol,1:nlev)
71 real(kind_phys), intent(inout) :: qh (:,:) !(1:ncol,1:nlev) graupel
72 real(kind_phys), intent(inout) :: ccw(:,:) !(1:ncol,1:nlev)
73 real(kind_phys), intent(inout) :: crw(:,:) !(1:ncol,1:nlev)
74 real(kind_phys), intent(inout) :: cci(:,:) !(1:ncol,1:nlev)
75 real(kind_phys), intent(inout) :: csw(:,:) !(1:ncol,1:nlev)
76 real(kind_phys), intent(inout) :: chw(:,:) !(1:ncol,1:nlev) graupel number
77 real(kind_phys), intent(inout) :: vh (:,:) !(1:ncol,1:nlev) graupel volume
78
79 ! Local variables: dimensions used in nssl_init
80 integer :: ims,ime, jms,jme, kms,kme, nx, nz, i,k
81 real(kind_phys) :: nssl_params(20)
82 integer :: ihailv,ipc
83 real(kind_phys), parameter :: qmin = 1.e-12
84 integer :: ierr
85 logical :: missing_vars = .false.
86
87 ! Initialize the CCPP error handling variables
88 errflg = 0
89 errmsg = ''
90
91! write(0,*) 'nssl_init: nlev,ncol,rank = ',nlev,ncol,mpirank
92
93 if ( is_initialized ) return
94
95 IF ( .not. is_initialized ) THEN ! only do this on first call
96 if (mpirank==mpiroot) then
97 write(0,*) ' ----------------------------------------------------------------------------------------------------------------'
98 write(0,*) ' --- CCPP NSSL MP scheme init ---'
99 write(0,*) ' ----------------------------------------------------------------------------------------------------------------'
100 write(6,*) ' ----------------------------------------------------------------------------------------------------------------'
101 write(6,*) ' --- CCPP NSSL MP scheme init ---'
102 write(6,*) ' ----------------------------------------------------------------------------------------------------------------'
103 end if
104
105! update this when ccn_flag is active?
106 if ( imp_physics /= imp_physics_nssl ) then
107 write(errmsg,'(*(a))') "Logic error: namelist choice of microphysics is different from NSSL"
108 errflg = 1
109 return
110 end if
111
112 ! set some physical constants in NSSL microphysics to be consistent with parent model
114 con_g, con_rd, con_cp, con_rv, con_t0c, con_cliq, con_csol, con_eps )
115
116
117 ! Set internal dimensions
118 ims = 1
119 ime = ncol
120 nx = ncol
121 jms = 1
122 jme = 1
123 kms = 1
124 kme = nlev
125 nz = nlev
126
127
128 nssl_params(:) = 0.0
129 ! nssl_params(1) = nssl_cccn ! use direct interface instead
130 ! nssl_params(2) = nssl_alphah ! use direct interface instead
131 ! nssl_params(3) = nssl_alphahl ! use direct interface instead
132 nssl_params(4) = 4.e5 ! nssl_cnoh -- not used for 2-moment
133 nssl_params(5) = 4.e4 ! nssl_cnohl-- not used for 2-moment
134 nssl_params(6) = 4.e5 ! nssl_cnor-- not used for 2-moment
135 nssl_params(7) = 4.e6 ! nssl_cnos-- not used for 2-moment
136 nssl_params(8) = 500. ! nssl_rho_qh
137 nssl_params(9) = 800. ! nssl_rho_qhl
138 nssl_params(10) = 100. ! nssl_rho_qs
139
140 nssl_qccn = nssl_cccn/1.225
141 ! if (mpirank==mpiroot) then
142 ! write(*,*) 'nssl_init: nssl_qccn = ',nssl_qccn
143 ! endif
144
145 IF ( nssl_hail_on ) THEN
146 ihailv = 1
147 ELSE
148 ihailv = -1
149 ENDIF
150
151 IF ( nssl_3moment ) THEN
152 ipc = 8
153 ELSE
154 ipc = 5
155 ENDIF
156
157! write(0,*) 'call nssl_2mom_init'
158 CALL nssl_2mom_init(ims,ime, jms,jme, kms,kme,nssl_params,ipctmp=ipc,mixphase=0, &
159 namelist_filename=fn_nml,internal_nml=input_nml_file, &
160 ihvol=ihailv,nssl_ehw0=nssl_ehw0, &
161 nssl_ehlw0=nssl_ehlw0,errmsg=errmsg, &
162 nssl_alphar=nssl_alphar, &
163 nssl_alphah=nssl_alphah, &
164 nssl_alphahl=nssl_alphahl, &
165 nssl_cccn=nssl_cccn, &
166 nssl_ccn_on=nssl_ccn_on, &
167 errflg=errflg,myrank=mpirank,mpiroot=mpiroot)
168
169 ! For restart runs, the init is done here
170 if (restart) then
171
172 ! For restart, check if the IC is from a different scheme that does not have all the needed variables
173 missing_vars = .false.
174 IF ( any( qc > qmin .and. ccw == 0.0 ) ) missing_vars = .true.
175 IF ( .not. missing_vars .and. any( qi > qmin .and. cci == 0.0 ) ) missing_vars = .true.
176 IF ( .not. missing_vars .and. any( qs > qmin .and. csw == 0.0 ) ) missing_vars = .true.
177 IF ( .not. missing_vars .and. any( qr > qmin .and. crw == 0.0 ) ) missing_vars = .true.
178 IF ( .not. missing_vars .and. any( qh > qmin .and. (chw == 0.0 .or. vh == 0.0) ) ) missing_vars = .true.
179
180 call mpi_allreduce(missing_vars, missing_vars_global, 1, mpi_logical, mpi_lor, mpicomm, ierr)
181
182 is_initialized = .true.
183 return
184 end if
185
186! Other initialization operation here....
187
188 is_initialized = .true.
189
190 ENDIF ! .not. is_initialized
191
192 return
193
194 end subroutine mp_nssl_init
196
203 subroutine mp_nssl_run(ncol, nlev, con_g, con_rd, mpirank, &
204 spechum, cccn, cccna, qc, qr, qi, qs, qh, qhl, &
205 ccw, crw, cci, csw, chw, chl, vh, vhl, &
206 zrw, zhw, zhl, &
207 tgrs, prslk, prsl, phii, omega, dtp, &
208 prcp, rain, graupel, ice, snow, sr, &
209 refl_10cm, do_radar_ref, first_time_step, restart, &
210 re_cloud, re_ice, re_snow, re_rain, &
211 nleffr, nieffr, nseffr, nreffr, &
212 imp_physics, convert_dry_rho, &
213 imp_physics_nssl, nssl_ccn_on, &
214 nssl_hail_on, nssl_invertccn, nssl_3moment, &
215 ntccn, ntccna, ten_t, ten_qv, ten_qc, ten_qr, ten_qi, &
216 ten_qs, ten_qh, ten_qhl, ten_cccn, ten_ccw, ten_crw, &
217 ten_cci, ten_csw, ten_chw, ten_chl, ten_vh, ten_vhl, &
218 ten_zrw, ten_zhw, ten_zhl, errflg, errmsg)
219
220 use module_mp_nssl_2mom, only: calcnfromq, na
221
222 implicit none
223 integer, intent(in) :: ncol, nlev
224 real(kind_phys), intent(in ) :: con_g
225 real(kind_phys), intent(in ) :: con_rd
226 integer, intent(in) :: mpirank
227 ! Hydrometeors
228 logical, intent(in ) :: convert_dry_rho
229 real(kind_phys), intent(in ) :: spechum(:,:) !(1:ncol,1:nlev)
230 real(kind_phys), intent(in ), optional :: cccn(:,:) !(1:ncol,1:nlev)
231 real(kind_phys), intent(in ), optional :: cccna(:,:) !(1:ncol,1:nlev)
232 real(kind_phys), intent(in ) :: qc (:,:) !(1:ncol,1:nlev)
233 real(kind_phys), intent(in ) :: qr (:,:) !(1:ncol,1:nlev)
234 real(kind_phys), intent(in ) :: qi (:,:) !(1:ncol,1:nlev)
235 real(kind_phys), intent(in ) :: qs (:,:) !(1:ncol,1:nlev)
236 real(kind_phys), intent(in ) :: qh (:,:) !(1:ncol,1:nlev) graupel
237 real(kind_phys), intent(in ), optional :: qhl(:,:) !(1:ncol,1:nlev) hail
238 real(kind_phys), intent(in ) :: ccw(:,:) !(1:ncol,1:nlev)
239 real(kind_phys), intent(in ) :: crw(:,:) !(1:ncol,1:nlev)
240 real(kind_phys), intent(in ) :: cci(:,:) !(1:ncol,1:nlev)
241 real(kind_phys), intent(in ) :: csw(:,:) !(1:ncol,1:nlev)
242 real(kind_phys), intent(in ) :: chw(:,:) !(1:ncol,1:nlev) graupel number
243 real(kind_phys), intent(in ), optional :: chl(:,:) !(1:ncol,1:nlev) hail number
244 real(kind_phys), intent(in ) :: vh (:,:) !(1:ncol,1:nlev) graupel volume
245 real(kind_phys), intent(in ), optional :: vhl(:,:) !(1:ncol,1:nlev) hail volume
246 real(kind_phys), intent(in ), optional :: zrw(:,:) !(1:ncol,1:nlev) rain reflectivity
247 real(kind_phys), intent(in ), optional :: zhw(:,:) !(1:ncol,1:nlev) graupel reflectivity
248 real(kind_phys), intent(in ), optional :: zhl(:,:) !(1:ncol,1:nlev) hail reflectivity
249 ! State variables and timestep information
250 real(kind_phys), intent(in ) :: tgrs (:,:) !(1:ncol,1:nlev)
251 real(kind_phys), intent(in ) :: prsl (:,:) !(1:ncol,1:nlev)
252 real(kind_phys), intent(in ) :: prslk(:,:) !(1:ncol,1:nlev)
253 real(kind_phys), intent(in ) :: phii (:,:) !(1:ncol,1:nlev+1)
254 real(kind_phys), intent(in ) :: omega(:,:) !(1:ncol,1:nlev)
255 real(kind_phys), intent(in ) :: dtp
256 ! Precip/rain/snow/graupel fall amounts and fraction of frozen precip
257 real(kind_phys), intent( out) :: prcp (:) !(1:ncol)
258 real(kind_phys), intent( out) :: rain (:) !(1:ncol)
259 real(kind_phys), intent( out) :: graupel(:) !(1:ncol)
260 real(kind_phys), intent( out) :: ice (:) !(1:ncol)
261 real(kind_phys), intent( out) :: snow (:) !(1:ncol)
262 real(kind_phys), intent( out) :: sr (:) !(1:ncol)
263 ! Radar reflectivity
264 real(kind_phys), intent(inout) :: refl_10cm(:,:) !(1:ncol,1:nlev)
265 logical, intent(in ) :: do_radar_ref, first_time_step
266 logical, intent(in) :: restart
267 ! Cloud effective radii
268 real(kind_phys), intent(inout), optional :: re_cloud(:,:) ! (1:ncol,1:nlev)
269 real(kind_phys), intent(inout), optional :: re_ice(:,:) ! (1:ncol,1:nlev)
270 real(kind_phys), intent(inout), optional :: re_snow(:,:) ! (1:ncol,1:nlev)
271 real(kind_phys), intent(inout), optional :: re_rain(:,:) ! (1:ncol,1:nlev)
272 integer, intent(in) :: nleffr, nieffr, nseffr, nreffr
273 integer, intent(in) :: imp_physics
274 integer, intent(in) :: imp_physics_nssl
275 logical, intent(in) :: nssl_ccn_on, nssl_hail_on, nssl_invertccn, nssl_3moment
276 integer, intent(in) :: ntccn, ntccna
277
278 real(kind_phys), intent( out) :: ten_t(:,:)
279 real(kind_phys), intent( out) :: ten_qv(:,:)
280 real(kind_phys), intent( out) :: ten_qc(:,:)
281 real(kind_phys), intent( out) :: ten_qr(:,:)
282 real(kind_phys), intent( out) :: ten_qi(:,:)
283 real(kind_phys), intent( out) :: ten_qs(:,:)
284 real(kind_phys), intent( out) :: ten_qh(:,:)
285 real(kind_phys), intent( out), optional :: ten_qhl(:,:)
286 real(kind_phys), intent( out), optional :: ten_cccn(:,:)
287 real(kind_phys), intent( out) :: ten_ccw(:,:)
288 real(kind_phys), intent( out) :: ten_crw(:,:)
289 real(kind_phys), intent( out) :: ten_cci(:,:)
290 real(kind_phys), intent( out) :: ten_csw(:,:)
291 real(kind_phys), intent( out) :: ten_chw(:,:)
292 real(kind_phys), intent( out), optional :: ten_chl(:,:)
293 real(kind_phys), intent( out) :: ten_vh(:,:)
294 real(kind_phys), intent( out), optional :: ten_vhl(:,:)
295 real(kind_phys), intent( out), optional :: ten_zrw(:,:)
296 real(kind_phys), intent( out), optional :: ten_zhw(:,:)
297 real(kind_phys), intent( out), optional :: ten_zhl(:,:)
298
299 integer, intent(out) :: errflg
300 character(len=*), intent(out) :: errmsg
301
302
303 ! Local variables
304
305 real(kind_phys) :: new_t(1:ncol,1:nlev)
306 ! Air density
307 real(kind_phys) :: rho(1:ncol,1:nlev)
308 ! Hydrometeors
309 real(kind_phys) :: qv_mp(1:ncol,1:nlev)
310 real(kind_phys) :: qc_mp(1:ncol,1:nlev)
311 real(kind_phys) :: qr_mp(1:ncol,1:nlev)
312 real(kind_phys) :: qi_mp(1:ncol,1:nlev)
313 real(kind_phys) :: qs_mp(1:ncol,1:nlev)
314 real(kind_phys) :: qh_mp(1:ncol,1:nlev)
315 real(kind_phys) :: qhl_mp(1:ncol,1:nlev)
316 real(kind_phys) :: nc_mp(1:ncol,1:nlev)
317 real(kind_phys) :: nr_mp(1:ncol,1:nlev)
318 real(kind_phys) :: ni_mp(1:ncol,1:nlev)
319 real(kind_phys) :: ns_mp(1:ncol,1:nlev)
320 real(kind_phys) :: nh_mp(1:ncol,1:nlev)
321 real(kind_phys) :: nhl_mp(1:ncol,1:nlev)
322 real(kind_phys) :: cn_mp(1:ncol,1:nlev)
323 real(kind_phys) :: cna_mp(1:ncol,1:nlev)
324 real(kind_phys) :: cccn_mp(1:ncol,1:nlev)
325 real(kind_phys) :: cccna_mp(1:ncol,1:nlev)
326 real(kind_phys) :: vh_mp(1:ncol,1:nlev)
327 ! create temporaries for hail in case it does not exist
328 !real(kind_phys) :: chl_mp(1:ncol,1:nlev) !< kg-1 (number mixing ratio)
329 real(kind_phys) :: vhl_mp(1:ncol,1:nlev)
330 real(kind_phys) :: zrw_mp(1:ncol,1:nlev)
331 real(kind_phys) :: zhw_mp(1:ncol,1:nlev)
332 real(kind_phys) :: zhl_mp(1:ncol,1:nlev)
333 ! Vertical velocity and level width
334 real(kind_phys) :: w(1:ncol,1:nlev)
335 real(kind_phys) :: dz(1:ncol,1:nlev)
336
337 ! Rain/snow/graupel fall amounts
338 real(kind_phys) :: rain_mp(1:ncol) ! mm, dummy, not used
339 real(kind_phys) :: graupel_mp(1:ncol) ! mm, dummy, not used
340 real(kind_phys) :: ice_mp(1:ncol) ! mm, dummy, not used
341 real(kind_phys) :: snow_mp(1:ncol) ! mm, dummy, not used
342 real(kind_phys) :: delta_rain_mp(1:ncol) ! mm
343 real(kind_phys) :: delta_graupel_mp(1:ncol) ! mm
344 real(kind_phys) :: delta_ice_mp(1:ncol) ! mm
345 real(kind_phys) :: delta_snow_mp(1:ncol) ! mm
346
347 real(kind_phys) :: xrain_mp(1:ncol) ! mm, dummy, not used
348 real(kind_phys) :: xgraupel_mp(1:ncol) ! mm, dummy, not used
349 real(kind_phys) :: xice_mp(1:ncol) ! mm, dummy, not used
350 real(kind_phys) :: xsnow_mp(1:ncol) ! mm, dummy, not used
351 real(kind_phys) :: xdelta_rain_mp(1:ncol) ! mm
352 real(kind_phys) :: xdelta_graupel_mp(1:ncol) ! mm
353 real(kind_phys) :: xdelta_ice_mp(1:ncol) ! mm
354 real(kind_phys) :: xdelta_snow_mp(1:ncol) ! mm
355
356 ! Radar reflectivity
357 logical :: diagflag ! must be true if do_radar_ref is true, not used otherwise
358 integer :: do_radar_ref_mp ! integer instead of logical do_radar_ref
359 ! Effective cloud radii
360 logical :: do_effective_radii
361 real(kind_phys) :: re_cloud_mp(1:ncol,1:nlev) ! m
362 real(kind_phys) :: re_ice_mp(1:ncol,1:nlev) ! m
363 real(kind_phys) :: re_snow_mp(1:ncol,1:nlev) ! m
364 real(kind_phys) :: re_rain_mp(1:ncol,1:nlev) ! m
365 integer :: has_reqc
366 integer :: has_reqi
367 integer :: has_reqs
368 integer :: has_reqr
369 ! Dimensions used in driver
370 integer :: ids,ide, jds,jde, kds,kde, &
371 ims,ime, jms,jme, kms,kme, &
372 its,ite, jts,jte, kts,kte, i,j,k
373 integer :: itimestep ! timestep counter
374 integer :: ntmul, n
375 real(kind_phys), parameter :: dtpmax = 60. ! allow up to dt=75 (1.25*60)
376 real(kind_phys) :: dtptmp
377 integer, parameter :: ndebug = 0
378 logical :: invertccn
379 real(kind_phys) :: cwmas
380
381 real(kind_phys), allocatable :: an(:,:,:,:) ! temporary scalar array
382
383 errflg = 0
384 errmsg = ''
385
386 ten_t = 0.0
387 ten_qv = 0.0
388 ten_qc = 0.0
389 ten_qr = 0.0
390 ten_qi = 0.0
391 ten_qs = 0.0
392 ten_qh = 0.0
393 if (nssl_hail_on) then
394 ten_qhl = 0.0
395 ten_chl = 0.0
396 ten_vhl = 0.0
397 end if
398 if (nssl_ccn_on) ten_cccn = 0.0
399 ten_ccw = 0.0
400 ten_crw = 0.0
401 ten_cci = 0.0
402 ten_csw = 0.0
403 ten_chw = 0.0
404 ten_vh = 0.0
405 if ( nssl_3moment ) then
406 ten_zrw = 0.0
407 ten_zhw = 0.0
408 if (nssl_hail_on) then
409 ten_zhl = 0.0
410 end if
411 end if
412
413 new_t = tgrs
414
415! write(0,*) 'nssl_run: nlev,ncol,rank = ',nlev,ncol,mpirank
416
417 IF ( ndebug >= 1 ) write(0,*) 'In physics nssl_run'
418
419
420 ! Check initialization state
421 if (.not.is_initialized) then
422 write(errmsg, fmt='((a))') 'mp_nssl_run called before mp_nssl_init'
423 errflg = 1
424 return
425 end if
426
427 invertccn = nssl_invertccn
428
430 ! NOTE: Implied loops!
431 qv_mp = spechum/(1.0_kind_phys-spechum)
432 IF ( convert_dry_rho ) THEN
433 qc_mp = qc/(1.0_kind_phys-spechum)
434 qr_mp = qr/(1.0_kind_phys-spechum)
435 qi_mp = qi/(1.0_kind_phys-spechum)
436 qs_mp = qs/(1.0_kind_phys-spechum)
437 qh_mp = qh/(1.0_kind_phys-spechum)
438
439 IF ( nssl_ccn_on ) cccn_mp = cccn/(1.0_kind_phys-spechum)
440! cccna_mp = cccna/(1.0_kind_phys-spechum)
441 nc_mp = ccw/(1.0_kind_phys-spechum)
442 nr_mp = crw/(1.0_kind_phys-spechum)
443 ni_mp = cci/(1.0_kind_phys-spechum)
444 ns_mp = csw/(1.0_kind_phys-spechum)
445 nh_mp = chw/(1.0_kind_phys-spechum)
446 vh_mp = vh/(1.0_kind_phys-spechum)
447 IF ( nssl_3moment ) THEN
448 zrw_mp = zrw/(1.0_kind_phys-spechum)
449 zhw_mp = zhw/(1.0_kind_phys-spechum)
450 ENDIF
451 IF ( nssl_hail_on ) THEN
452 qhl_mp = qhl/(1.0_kind_phys-spechum)
453 nhl_mp = chl/(1.0_kind_phys-spechum)
454 vhl_mp = vhl/(1.0_kind_phys-spechum)
455 IF ( nssl_3moment ) THEN
456 zhl_mp = zhl/(1.0_kind_phys-spechum)
457 ENDIF
458 ENDIF
459 ELSE
460! qv_mp = spechum ! /(1.0_kind_phys-spechum)
461 qc_mp = qc ! /(1.0_kind_phys-spechum)
462 qr_mp = qr ! /(1.0_kind_phys-spechum)
463 qi_mp = qi ! /(1.0_kind_phys-spechum)
464 qs_mp = qs ! /(1.0_kind_phys-spechum)
465 qh_mp = qh ! /(1.0_kind_phys-spechum)
466 IF ( nssl_ccn_on ) cccn_mp = cccn
467! cccna_mp = cccna
468 nc_mp = ccw
469 nr_mp = crw
470 ni_mp = cci
471 ns_mp = csw
472 nh_mp = chw
473 vh_mp = vh
474 IF ( nssl_3moment ) THEN
475 zrw_mp = zrw
476 zhw_mp = zhw
477 ENDIF
478 IF ( nssl_hail_on ) THEN
479 qhl_mp = qhl ! /(1.0_kind_phys-spechum)
480 nhl_mp = chl
481 vhl_mp = vhl
482 IF ( nssl_3moment ) THEN
483 zhl_mp = zhl
484 ENDIF
485 ENDIF
486
487 ENDIF
488
489 IF ( nssl_hail_on ) THEN
490! nhl_mp = chl
491! vhl_mp = vhl
492 ELSE
493 qhl_mp = 0
494 nhl_mp = 0
495 vhl_mp = 0
496 ENDIF
497
498 IF ( .false. ) THEN
499 write(6,*) 'nsslrun: qc,max ccw = ',mpirank,maxval(qc_mp),maxval(nc_mp),sum(nc_mp)
500 IF ( mpirank == 1 ) THEN
501 DO k=1,nlev
502 DO i=1,ncol
503 IF ( qc_mp(i,k) > 1.e-6 .and. nc_mp(i,k) <= 1.e-9 ) THEN
504 write(6,*) 'i,k,qc,nc,ccn = ',i,k,qc_mp(i,k),nc_mp(i,k),cccn_mp(i,k)
505 ENDIF
506 ENDDO
507 ENDDO
508 ENDIF
509 ENDIF
510
511 ! IF ( first_time_step ) THEN
512 ! write(0,*) 'mp_nssl_run: qi,qs,qh maxval: ',maxval(qi),maxval(qs),maxval(qh)
513 ! write(0,*) 'mp_nssl_run: ni,ns,nh maxval: ',maxval(ni_mp),maxval(ns_mp),maxval(nh_mp)
514 ! ENDIF
515
516
518 rho = prsl/(con_rd*tgrs)
519
521 w = -omega/(rho*con_g)
522
524 dz = (phii(:,2:nlev+1) - phii(:,1:nlev)) / con_g
525
526 ! Accumulated values inside scheme, not used;
527 ! only use delta and add to inout variables (different units)
528 rain_mp = 0
529 graupel_mp = 0
530 ice_mp = 0
531 snow_mp = 0
532 delta_rain_mp = 0
533 delta_graupel_mp = 0
534 delta_ice_mp = 0
535 delta_snow_mp = 0
536 xrain_mp = 0
537 xgraupel_mp = 0
538 xice_mp = 0
539 xsnow_mp = 0
540 xdelta_rain_mp = 0
541 xdelta_graupel_mp = 0
542 xdelta_ice_mp = 0
543 xdelta_snow_mp = 0
544 IF ( ndebug > 1 ) THEN
545 write(*,*) 'Max q before micro'
546 write(*,*) 'qc = ',1000.*maxval(qc_mp)
547 write(*,*) 'qr = ',1000.*maxval(qr_mp)
548 write(*,*) 'qi = ',1000.*maxval(qi_mp)
549 write(*,*) 'qs = ',1000.*maxval(qs_mp)
550 write(*,*) 'qh = ',1000.*maxval(qh_mp)
551 IF ( nssl_hail_on ) write(*,*) 'qhl = ',1000.*maxval(qhl_mp)
552 write(*,*) 'ccw = ',1.e-6*maxval(ccw*rho)
553 ENDIF
554
555 ! Flags for calculating radar reflectivity; diagflag is redundant
556 if (do_radar_ref) then
557 diagflag = .true.
558 do_radar_ref_mp = 1
559 else
560 diagflag = .false.
561 do_radar_ref_mp = 0
562 end if
563
564 do_effective_radii = .false.
565 IF ( nleffr > 0 .and. nieffr > 0 .and. nseffr > 0 .and. nreffr > 0 ) THEN
566 ! if (present(re_cloud) .and. present(re_ice) .and. present(re_snow)) then
567 do_effective_radii = .true.
568 has_reqc = 1
569 has_reqi = 1
570 has_reqs = 1
571 has_reqr = 1
572 else if (nleffr < 1 .and. nieffr < 1 .and. nseffr < 1 .and. nreffr < 1 ) then
573 do_effective_radii = .false.
574 has_reqc = 0
575 has_reqi = 0
576 has_reqs = 0
577 has_reqr = 0
578 else
579 write(errmsg,fmt='(*(a))') 'Logic error in mp_nssl_run:', &
580 ' hydrometeor radius calculation logic problem'
581 errflg = 1
582 return
583 end if
584 ! Initialize to zero, intent(out) variables
585 re_cloud_mp = 0
586 re_ice_mp = 0
587 re_snow_mp = 0
588 re_rain_mp = 0
589
590 ! Set internal dimensions
591 ids = 1
592 ims = 1
593 its = 1
594 ide = ncol
595 ime = ncol
596 ite = ncol
597 jds = 1
598 jms = 1
599 jts = 1
600 jde = 1
601 jme = 1
602 jte = 1
603 kds = 1
604 kms = 1
605 kts = 1
606 kde = nlev
607 kme = nlev
608 kte = nlev
609
610
611 IF ( ndebug >= 1 ) write(0,*) 'call nssl_2mom_driver'
612
613 IF ( dtp > 1.25001*dtpmax ) THEN
614 ntmul = max(2, nint( dtp/dtpmax ) )
615 dtptmp = dtp/ntmul
616 ELSE
617 dtptmp = dtp
618 ntmul = 1
619 ENDIF
620
621 IF ( first_time_step .and. ( .not. restart .or. missing_vars_global ) ) THEN
622 itimestep = 0 ! gets incremented to 1 in call loop
623 IF ( nssl_ccn_on ) THEN
624 IF ( invertccn ) THEN
625 cccn_mp = 0
626 !cccn = nssl_qccn
627 ELSE
628 cccn_mp = nssl_qccn
629 ENDIF
630 ENDIF
631 ELSE
632 itimestep = 2
633 ENDIF
634
635 IF ( .false. ) THEN ! disable for now, as logic in the NSSL driver does this, but may switch back to here
636 ! incoming droplet field may have some inconsistent number concentrations (e.g., from PBL)
637 ! so check for that, otherwise mass may be zapped into vapor
638 allocate( an(ncol,1,nlev,na) )
639 an(:,:,:,:) = 0.0 ! needed for workspace in routine
640
641 cwmas = 1000.*0.523599*(2.*9.e-6)**3
642
643 call calcnfromq(nx=ncol,ny=1,nz=nlev,an=an,na=na,nor=0,norz=0,dn=rho, &
644 & qcw=qc_mp,qci=qi_mp, &
645 & ccw=nc_mp,cci=ni_mp, &
646 & cccn=cccn_mp,qv=qv_mp, invertccn_flag=nssl_invertccn, cwmasin=cwmas )
647
648 IF ( .false. ) THEN
649 write(6,*) 'nsslrun2: qc,max ccw = ',mpirank,maxval(qc_mp),maxval(nc_mp),sum(nc_mp)
650 IF ( mpirank == 1 ) THEN
651 DO k=1,nlev
652 DO i=1,ncol
653 IF ( qc_mp(i,k) > 1.e-6 .and. nc_mp(i,k) <= 1.e-9 ) THEN
654 write(6,*) 'i2,k,qc,nc,ccn = ',i,k,qc_mp(i,k),nc_mp(i,k),cccn_mp(i,k)
655 ENDIF
656 ENDDO
657 ENDDO
658 ENDIF
659 ENDIF
660
661
662 deallocate( an )
663 ENDIF
664
665 IF ( nssl_ccn_on ) THEN
666 IF ( invertccn ) THEN
667 ! cn_mp = Max(0.0, nssl_qccn - Max(0.0,cccn_mp))
668 ! Flip CCN concentrations from 'activated' to 'unactivated' (allows BC condition to be zero)
669 cn_mp = nssl_qccn - cccn_mp
670 cn_mp = max(0.0_kind_phys, cn_mp)
671
672 ELSE
673 cn_mp = cccn_mp
674 ENDIF
675 IF ( ntccna > 0 ) THEN
676 ! not in use yet
677! cna_mp = cccna
678 ELSE
679 cna_mp = 0
680 ENDIF
681 ENDIF
682
683 IF ( .true. ) THEN
684 DO n = 1,ntmul
685
686 itimestep = itimestep + 1
687
688
689
690 IF ( nssl_ccn_on ) THEN
691
692 CALL nssl_2mom_driver( &
693 itimestep=itimestep, &
694 ! TH=th, &
695 tt=new_t, &
696 qv=qv_mp, &
697 qc=qc_mp, &
698 qr=qr_mp, &
699 qi=qi_mp, &
700 qs=qs_mp, &
701 qh=qh_mp, &
702 qhl=qhl_mp, &
703 ccw=nc_mp, &
704 crw=nr_mp, &
705 cci=ni_mp, &
706 csw=ns_mp, &
707 chw=nh_mp, &
708 chl=nhl_mp, &
709 vhw=vh_mp, &
710 vhl=vhl_mp, &
711 cn=cn_mp, &
712 zrw=zrw_mp, &
713 zhw=zhw_mp, &
714 zhl=zhl_mp, &
715! cna=cna_mp, f_cna=( ntccna > 0 ), & ! for future use
716 cna=cna_mp, f_cna=.false. , &
717 pii=prslk, &
718 p=prsl, &
719 w=w, &
720 dz=dz, &
721 dtp=dtptmp, &
722 dn=rho, &
723 rainnc=xrain_mp, rainncv=xdelta_rain_mp, &
724 snownc=xsnow_mp, snowncv=xdelta_snow_mp, &
725 grplnc=xgraupel_mp, &
726 grplncv=xdelta_graupel_mp, &
727 sr=sr, &
728 dbz = refl_10cm, &
729 diagflag = diagflag, &
730 errmsg=errmsg,errflg=errflg, &
731 re_cloud=re_cloud_mp, &
732 re_ice=re_ice_mp, &
733 re_snow=re_snow_mp, &
734 re_rain=re_rain_mp, &
735 has_reqc=has_reqc, &
736 has_reqi=has_reqi, &
737 has_reqs=has_reqs, &
738 has_reqr=has_reqr, &
739 ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
740 ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
741 its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte &
742 )
743
744 ELSE
745
746 CALL nssl_2mom_driver( &
747 itimestep=itimestep, &
748 ! TH=th, &
749 tt=new_t, &
750 qv=qv_mp, &
751 qc=qc_mp, &
752 qr=qr_mp, &
753 qi=qi_mp, &
754 qs=qs_mp, &
755 qh=qh_mp, &
756 qhl=qhl_mp, &
757 ccw=nc_mp, &
758 crw=nr_mp, &
759 cci=ni_mp, &
760 csw=ns_mp, &
761 chw=nh_mp, &
762 chl=nhl_mp, &
763 vhw=vh_mp, &
764 vhl=vhl_mp, &
765! cn=cn_mp, &
766 zrw=zrw_mp, &
767 zhw=zhw_mp, &
768 zhl=zhl_mp, &
769! cna=cna_mp, f_cna=( ntccna > 0 ), & ! for future use
770! cna=cna_mp, f_cna=.false. , &
771 pii=prslk, &
772 p=prsl, &
773 w=w, &
774 dz=dz, &
775 dtp=dtptmp, &
776 dn=rho, &
777 rainnc=xrain_mp, rainncv=xdelta_rain_mp, &
778 snownc=xsnow_mp, snowncv=xdelta_snow_mp, &
779 grplnc=xgraupel_mp, &
780 grplncv=xdelta_graupel_mp, &
781 sr=sr, &
782 dbz = refl_10cm, &
783 diagflag = diagflag, &
784 errmsg=errmsg,errflg=errflg, &
785 re_cloud=re_cloud_mp, &
786 re_ice=re_ice_mp, &
787 re_snow=re_snow_mp, &
788 re_rain=re_rain_mp, &
789 has_reqc=has_reqc, &
790 has_reqi=has_reqi, &
791 has_reqs=has_reqs, &
792 has_reqr=has_reqr, &
793 ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
794 ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
795 its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte &
796 )
797
798 ENDIF
799
800 DO i = 1,ncol
801 delta_rain_mp(i) = delta_rain_mp(i) + xdelta_rain_mp(i) ! this is liquid equivalent of all precip
802 delta_graupel_mp(i) = delta_graupel_mp(i) + xdelta_graupel_mp(i) ! this is liquid equivalent of graupel
803 delta_ice_mp(i) = delta_ice_mp(i) + xdelta_ice_mp(i)
804 delta_snow_mp(i) = delta_snow_mp(i) + xdelta_snow_mp(i)
805 ENDDO
806
807 ENDDO
808
809 ENDIF
810
811
812 IF ( nssl_ccn_on ) THEN
813 IF ( invertccn ) THEN
814 cccn_mp = max(0.0_kind_phys, nssl_qccn - cn_mp )
815! cccn_mp = nssl_qccn - cn_mp
816 ELSE
817 cccn_mp = cn_mp
818 ENDIF
819! cccna = cna_mp ! cna not in use yet for ccpp
820 ENDIF
821
822! test code
823! IF ( ntccna > 1 .and. do_effective_radii ) THEN
824! cccna = re_ice_mp*1.0E6_kind_phys
825! ENDIF
826
827 IF ( ndebug > 1 ) write(0,*) 'done nssl_2mom_driver'
828
829 if (errflg/=0) return
830
831 IF ( ndebug > 1 ) THEN
832 write(*,*) 'Max q after micro'
833 write(*,*) 'qc = ',1000.*maxval(qc_mp)
834 write(*,*) 'qr = ',1000.*maxval(qr_mp)
835 write(*,*) 'qi = ',1000.*maxval(qi_mp)
836 write(*,*) 'qs = ',1000.*maxval(qs_mp)
837 write(*,*) 'qh = ',1000.*maxval(qh_mp)
838 IF ( nssl_hail_on ) THEN
839 write(*,*) 'qhl = ',1000.*maxval(qhl_mp)
840 ENDIF
841 write(*,*) 'ccw = ',1.e-6*maxval(ccw*rho)
842 IF ( 1000.*maxval(qc_mp) > 0.5 .or. 1000.*maxval(qi_mp) > 0.09 .or. 1000.*maxval(qs_mp) > 0.1 ) THEN
843 IF ( nssl_ccn_on ) THEN
844 write(*,*) 'qc, ccn, ccw, tt, qi+qs by height'
845 DO k = 1,nlev
846 write(*,*) qc_mp(1,k)*1000., cccn(1,k)*rho(1,k)*1.e-6, ccw(1,k)*rho(1,k)*1.e-6, new_t(1,k), (qs_mp(1,k)+qi_mp(1,k))*1000. ! cccn(1,k)*1.e-6
847 ENDDO
848 ELSE
849 write(*,*) 'qc, ccn, ccw, tt, qi+qs by height'
850 DO k = 1,nlev
851 write(*,*) qc_mp(1,k)*1000., cccn(1,k)*rho(1,k)*1.e-6, 0.0, new_t(1,k), (qs_mp(1,k)+qi_mp(1,k))*1000. ! cccn(1,k)*1.e-6
852 ENDDO
853 ENDIF
854 ENDIF
855 ENDIF
856
857
858 ten_t = (new_t - tgrs)/dtp
860 ten_qv = (qv_mp/(1.0_kind_phys+qv_mp) - spechum)/dtp
861 IF ( convert_dry_rho ) THEN
862 ten_qc = (qc_mp/(1.0_kind_phys+qv_mp) - qc)/dtp
863 ten_qr = (qr_mp/(1.0_kind_phys+qv_mp) - qr)/dtp
864 ten_qi = (qi_mp/(1.0_kind_phys+qv_mp) - qi)/dtp
865 ten_qs = (qs_mp/(1.0_kind_phys+qv_mp) - qs)/dtp
866 ten_qh = (qh_mp/(1.0_kind_phys+qv_mp) - qh)/dtp
867 IF ( nssl_ccn_on ) ten_cccn = (cccn_mp/(1.0_kind_phys+qv_mp) - cccn)/dtp
868! cccna = cccna_mp/(1.0_kind_phys+qv_mp)
869 ten_ccw = (nc_mp/(1.0_kind_phys+qv_mp) - ccw)/dtp
870 ten_crw = (nr_mp/(1.0_kind_phys+qv_mp) - crw)/dtp
871 ten_cci = (ni_mp/(1.0_kind_phys+qv_mp) - cci)/dtp
872 ten_csw = (ns_mp/(1.0_kind_phys+qv_mp) - csw)/dtp
873 ten_chw = (nh_mp/(1.0_kind_phys+qv_mp) - chw)/dtp
874 ten_vh = (vh_mp/(1.0_kind_phys+qv_mp) - vh)/dtp
875 IF ( nssl_3moment ) THEN
876 ten_zrw = (zrw_mp/(1.0_kind_phys+qv_mp) - zrw)/dtp
877 ten_zhw = (zhw_mp/(1.0_kind_phys+qv_mp) - zhw)/dtp
878 ENDIF
879 IF ( nssl_hail_on ) THEN
880 ten_qhl = (qhl_mp/(1.0_kind_phys+qv_mp) - qhl)/dtp
881 ten_chl = (nhl_mp/(1.0_kind_phys+qv_mp) - chl)/dtp
882 ten_vhl = (vhl_mp/(1.0_kind_phys+qv_mp) - vhl)/dtp
883 IF ( nssl_3moment ) THEN
884 ten_zhl = (zhl_mp/(1.0_kind_phys+qv_mp) - zhl)/dtp
885 ENDIF
886 ENDIF
887 ELSE
888! spechum = qv_mp ! /(1.0_kind_phys+qv_mp)
889 ten_qc = (qc_mp - qc)/dtp ! /(1.0_kind_phys+qv_mp)
890 ten_qr = (qr_mp - qr)/dtp! /(1.0_kind_phys+qv_mp)
891 ten_qi = (qi_mp - qi)/dtp! /(1.0_kind_phys+qv_mp)
892 ten_qs = (qs_mp - qs)/dtp ! /(1.0_kind_phys+qv_mp)
893 ten_qh = (qh_mp - qh)/dtp ! /(1.0_kind_phys+qv_mp)
894 IF ( nssl_ccn_on ) ten_cccn = (cccn_mp - cccn)/dtp
895! cccna = cccna_mp
896 ten_ccw = (nc_mp - ccw)/dtp
897 ten_crw = (nr_mp - crw)/dtp
898 ten_cci = (ni_mp - cci)/dtp
899 ten_csw = (ns_mp - csw)/dtp
900 ten_chw = (nh_mp - chw)/dtp
901 ten_vh = (vh_mp - vh)/dtp
902 IF ( nssl_3moment ) THEN
903 ten_zrw = (zrw_mp - zrw)/dtp
904 ten_zhw = (zhw_mp - zhw)/dtp
905 ENDIF
906 IF ( nssl_hail_on ) THEN
907 ten_qhl = (qhl_mp - qhl)/dtp ! /(1.0_kind_phys+qv_mp)
908 ten_chl = (nhl_mp - chl)/dtp
909 ten_vhl = (vhl_mp - vhl)/dtp
910 IF ( nssl_3moment ) THEN
911 ten_zhl = (zhl_mp - zhl)/dtp
912 ENDIF
913 ENDIF
914
915 ENDIF
916
917! write(0,*) 'mp_nssl: done q'
918
920 ! "rain" in NSSL MP refers to precipitation (total of liquid rainfall+snow+graupel+ice)
921
922 prcp = max(0.0, delta_rain_mp/1000.0_kind_phys)
923 graupel = max(0.0, delta_graupel_mp/1000.0_kind_phys)
924 ice = max(0.0, delta_ice_mp/1000.0_kind_phys)
925 snow = max(0.0, delta_snow_mp/1000.0_kind_phys)
926 rain = max(0.0, (delta_rain_mp - (delta_graupel_mp + delta_ice_mp + delta_snow_mp))/1000.0_kind_phys)
927
928! write(0,*) 'mp_nssl: done precip'
929
930 if (do_effective_radii) then
931 ! Convert m to micron
932 re_cloud = re_cloud_mp*1.0e6_kind_phys
933 re_ice = re_ice_mp*1.0e6_kind_phys
934 re_snow = re_snow_mp*1.0e6_kind_phys
935 re_rain = re_rain_mp*1.0e6_kind_phys
936 end if
937
938 IF ( ndebug >= 1 ) write(0,*) 'mp_nssl: end'
939
940 end subroutine mp_nssl_run
942
943end module mp_nssl
subroutine, public calcnfromq(nx, ny, nz, an, na, nor, norz, dn, qcw, qci, qsw, qrw, qhw, qhl, ccw, cci, csw, crw, chw, chl, cccn, cccna, vhw, vhl, qv, spechum, invertccn_flag, cwmasin)
Subroutine to calculate number concentrations from initial state that has only mixing ratio.
subroutine, public nssl_2mom_init(ims, ime, jms, jme, kms, kme, nssl_params, ipctmp, mixphase, ihvol, idoniconlytmp, namelist_filename, internal_nml, nssl_graupelfallfac, nssl_hailfallfac, nssl_ehw0, nssl_ehlw0, nssl_icdx, nssl_icdxhl, nssl_icefallfac, nssl_snowfallfac, nssl_cccn, nssl_ufccn, nssl_alphah, nssl_alphahl, nssl_alphar, nssl_density_on, nssl_hail_on, nssl_ccn_on, nssl_icecrystals_on, ccn_is_ccna, nssl_ccn_opt, errmsg, errflg, infileunit, myrank, mpiroot)
NSSL MP setup routine (sets local options and array indices)
subroutine, public nssl_2mom_init_const(con_g, con_rd, con_cp, con_rv, con_t0c, con_cliq, con_csol, con_eps)
NSSL MP subroutine to initialize physical constants provided by host model.
subroutine, public nssl_2mom_driver(qv, qc, qr, qi, qs, qh, qhl, ccw, crw, cci, csw, chw, chl, cn, vhw, vhl, cna, cni, f_cn, f_cna, f_cina, f_qc, f_qr, f_qi, f_qs, f_qh, f_qhl, cn_nu, cn_co, cinp, f_cnnu, f_cnco, f_cinp, cna_co, cna_nu, f_cnaco, f_cnanu, cnuf, f_cnuf, cn_ac, f_cnac, zrw, zhw, zhl, f_zrw, f_zhw, f_zhl, f_vhw, f_vhl, qsw, qhw, qhlw, tt, th, pii, p, w, dn, dz, dtp, itimestep, is_theta_or_temp, ntmul, ntcnt, lastloop, rainnc, rainncv, dx, dy, axtra, snownc, snowncv, grplnc, grplncv, sr, hailnc, hailncv, hail_maxk1, hail_max2d, nwp_diagnostics, tkediss, re_cloud, re_ice, re_snow, re_rain, re_graup, re_hail, has_reqc, has_reqi, has_reqs, has_reqr, has_reqg, has_reqh, rainncw2, rainnci2, dbz, vzf, compdbz, rscghis_2d, rscghis_2dp, rscghis_2dn, scr, scw, sci, scs, sch, schl, sctot, elec_physics, induc, elecz, scion, sciona, f_scion, f_sciona, noninduc, noninducp, noninducn, ssat3d, ssati, nssl_ssat_output, pcc2, pre2, depsubr, mnucf2, melr2, ctr2, rim1_2, rim2_2, rim3_2, nctr2, nnuccd2, nnucf2, effc2, effr2, effi2, effs2, effg2, fc2, fr2, fi2, fs2, fg2, fnc2, fnr2, fni2, fns2, fng2, ipelectmp, isedonly_in, diagflag, ke_diag, errmsg, errflg, nssl_progn, wetscav_on, rainprod, evapprod, cu_used, qrcuten, qscuten, qicuten, qccuten, ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
Driver subroutine that copies state data to local 2D arrays for microphysics calls.
subroutine, public mp_nssl_run(ncol, nlev, con_g, con_rd, mpirank, spechum, cccn, cccna, qc, qr, qi, qs, qh, qhl, ccw, crw, cci, csw, chw, chl, vh, vhl, zrw, zhw, zhl, tgrs, prslk, prsl, phii, omega, dtp, prcp, rain, graupel, ice, snow, sr, refl_10cm, do_radar_ref, first_time_step, restart, re_cloud, re_ice, re_snow, re_rain, nleffr, nieffr, nseffr, nreffr, imp_physics, convert_dry_rho, imp_physics_nssl, nssl_ccn_on, nssl_hail_on, nssl_invertccn, nssl_3moment, ntccn, ntccna, ten_t, ten_qv, ten_qc, ten_qr, ten_qi, ten_qs, ten_qh, ten_qhl, ten_cccn, ten_ccw, ten_crw, ten_cci, ten_csw, ten_chw, ten_chl, ten_vh, ten_vhl, ten_zrw, ten_zhw, ten_zhl, errflg, errmsg)
Definition mp_nssl.F90:219
subroutine, public mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, fn_nml, input_nml_file, mpirank, mpiroot, mpicomm, qc, qr, qi, qs, qh, ccw, crw, cci, csw, chw, vh, con_g, con_rd, con_cp, con_rv, con_t0c, con_cliq, con_csol, con_eps, imp_physics, imp_physics_nssl, nssl_cccn, nssl_alphah, nssl_alphahl, nssl_alphar, nssl_ehw0, nssl_ehlw0, nssl_ccn_on, nssl_hail_on, nssl_invertccn, nssl_3moment)
This subroutine is a wrapper around the nssl_2mom_init().
Definition mp_nssl.F90:40
This module contains 1/2/3-moment bulk microphysics scheme based on a combination of Straka and Manse...
This module contains the front end to NSSL microphysics scheme.
Definition mp_nssl.F90:8