24 subroutine test_graupel_sedimentation(dt, semi_sedi)
29 real(wp),
intent(in) :: dt
30 logical,
intent(in) :: semi_sedi
31 integer,
parameter :: nz = 59
32 integer,
parameter :: ids = 1, ide = 1, ims = 1, ime = 1, its = 1, ite = 1
33 integer,
parameter :: jds = 1, jde = 1, jms = 1, jme = 1, jts = 1, jte = 1
34 integer,
parameter :: kds = 1, kde = nz, kms = 1, kme = nz, kts = 1, kte = nz
35 real(wp),
dimension(its:ite, kts:kte, jts:jte) :: qv, t, th, pii, p, w, dz, &
36 qc, qr, qi, qs, qg, ni, nr, ng, qb
37 real(wp),
dimension(nz) :: klevs_in, qv_in, qc_in, qr_in, qi_in, qs_in, &
38 qg_in, ni_in, nr_in, nc_in, nwfa_in, nifa_in, theta_in, ng_in, volg_in, &
39 pressure_in, w_in, dz_in
40 real(wp) :: precip_sum
41 character(len=20) :: dt_string, tt_string
42 character(len=20) :: semi_sedi_string
45 integer :: io1, io2, io3, io4, k, total_timesteps
46 integer,
parameter :: integration_time = 1200
48 write(dt_string,
'(I7)') int(dt)
51 write(semi_sedi_string,
'(A)')
'_semi_sedi'
53 write(semi_sedi_string,
'(A)')
''
58 open (io1, file=
'../test/data/mpas_59lev_test.txt', status=
'old')
61 read(io1,*) klevs_in(k), qv_in(k), qc_in(k), qr_in(k), qi_in(k), qs_in(k), &
62 qg_in(k), ni_in(k), nr_in(k), nc_in(k), nwfa_in(k), nifa_in(k), &
63 theta_in(k), ng_in(k), volg_in(k), pressure_in(k), w_in(k), dz_in(k)
68 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
69 p(1,:,1) = pressure_in
80 qb(1,:,1) = volg_in * 1000.
83 tempo_cfgs%turn_off_micro_flag = .true.
84 tempo_cfgs%graupel_med_vol_diam_flag = .true.
85 tempo_cfgs%semi_sedi_flag = semi_sedi
87 total_timesteps = int(integration_time/dt)
89 open(newunit=io2, file=
"graupel_precip_dt_"//trim(adjustl(dt_string))//
""//trim(semi_sedi_string)//
".txt", &
90 status=
"new", action=
"write")
92 do itimestep = 1, total_timesteps
93 call tempo_run(tempo_cfgs=tempo_cfgs, itimestep=itimestep, dt=dt, &
94 ids=ids, ide=ide, ims=ims, ime=ime, its=its, ite=ite, &
95 jds=jds, jde=jde, jms=jms, jme=jme, jts=jts, jte=jte, &
96 kds=kds, kde=kde, kms=kms, kme=kme, kts=kts, kte=kte, &
97 t=t, p=p, w=w, dz=dz, qv=qv, th=th, pii=pii, &
98 qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, ng=ng, qb=qb, &
99 tempo_diags=tempo_driver_diags)
100 precip_sum = precip_sum + tempo_driver_diags%graupel_liquid_equiv_precip(1,1)
101 write(io2,
'(I7, 1E12.4)') int(itimestep*dt), precip_sum
103 if (dt == 1. .and. .not. semi_sedi .and. itimestep == 1)
then
104 open(newunit=io3, file=
"graupel_sedi_init.txt", status=
"new", action=
"write")
105 write(io3,
'(5A)')
'k ',
'mass ',
'number ',
'density ' ,
'mvd'
107 if (qb(1,k,1) > 0._wp)
then
108 write(io3,
'(I5, 4E12.4)') k, qg(1,k,1), ng(1,k,1), 1000.*qg(1,k,1)/qb(1,k,1), tempo_driver_diags%graupel_med_vol_diam(1,k,1)
110 write(io3,
'(I5, 4E12.4)') k, qg(1,k,1), ng(1,k,1), 0._wp, tempo_driver_diags%graupel_med_vol_diam(1,k,1)
116 write(tt_string,
'(I7)') integration_time
117 open(newunit=io4, file=
"graupel_sedi_dt_"//trim(adjustl(dt_string))//
""//trim(semi_sedi_string)//&
118 "_runtime"//trim(adjustl(tt_string))//
".txt", status=
"new", action=
"write")
119 write(io4,
'(5A)')
'k ',
'mass ',
'number ',
'density ' ,
'mvd'
121 if (qb(1,k,1) > 0._wp)
then
122 write(io4,
'(I5, 4E12.4)') k, qg(1,k,1), ng(1,k,1), 1000.*qg(1,k,1)/qb(1,k,1), &
123 tempo_driver_diags%graupel_med_vol_diam(1,k,1)
125 write(io4,
'(I5, 4E12.4)') k, qg(1,k,1), ng(1,k,1), 0._wp, &
126 tempo_driver_diags%graupel_med_vol_diam(1,k,1)
132 subroutine test_snow_sedimentation(dt)
136 real(wp),
intent(in) :: dt
137 integer,
parameter :: nz = 59
138 integer,
parameter :: ids = 1, ide = 1, ims = 1, ime = 1, its = 1, ite = 1
139 integer,
parameter :: jds = 1, jde = 1, jms = 1, jme = 1, jts = 1, jte = 1
140 integer,
parameter :: kds = 1, kde = nz, kms = 1, kme = nz, kts = 1, kte = nz
141 real(wp),
dimension(its:ite, kts:kte, jts:jte) :: qv, t, th, pii, p, w, dz, &
142 qc, qr, qi, qs, qg, ni, nr, ng, qb
143 real(wp),
dimension(nz) :: klevs_in, qv_in, qc_in, qr_in, qi_in, qs_in, &
144 qg_in, ni_in, nr_in, nc_in, nwfa_in, nifa_in, theta_in, ng_in, volg_in, &
145 pressure_in, w_in, dz_in
146 real(wp) :: precip_sum
147 character(len=20) :: dt_string, tt_string
150 integer :: io1, io2, io3, io4, k, total_timesteps
151 integer,
parameter :: integration_time = 1200
153 write(dt_string,
'(I7)') int(dt)
157 open (io1, file=
'../test/data/mpas_59lev_test.txt', status=
'old')
160 read(io1,*) klevs_in(k), qv_in(k), qc_in(k), qr_in(k), qi_in(k), qs_in(k), &
161 qg_in(k), ni_in(k), nr_in(k), nc_in(k), nwfa_in(k), nifa_in(k), &
162 theta_in(k), ng_in(k), volg_in(k), pressure_in(k), w_in(k), dz_in(k)
167 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
168 p(1,:,1) = pressure_in
182 tempo_cfgs%turn_off_micro_flag= .true.
184 total_timesteps = int(integration_time/dt)
186 open(newunit=io2, file=
"snow_precip_dt_"//trim(adjustl(dt_string))//
".txt", &
187 status=
"new", action=
"write")
189 do itimestep = 1, total_timesteps
190 call tempo_run(tempo_cfgs=tempo_cfgs, itimestep=itimestep, dt=dt, &
191 ids=ids, ide=ide, ims=ims, ime=ime, its=its, ite=ite, &
192 jds=jds, jde=jde, jms=jms, jme=jme, jts=jts, jte=jte, &
193 kds=kds, kde=kde, kms=kms, kme=kme, kts=kts, kte=kte, &
194 t=t, p=p, w=w, dz=dz, qv=qv, th=th, pii=pii, &
195 qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, ng=ng, qb=qb, &
196 tempo_diags=tempo_driver_diags)
197 precip_sum = precip_sum + tempo_driver_diags%snow_liquid_equiv_precip(1,1)
198 write(io2,
'(I7, 1E12.4)') int(itimestep*dt), precip_sum
200 if (dt == 1. .and. itimestep == 1)
then
201 open(newunit=io3, file=
"snow_sedi_init.txt", status=
"new", action=
"write")
203 write(io3,
'(I5, 4E12.4)') k, qs(1,k,1)
208 write(tt_string,
'(I7)') integration_time
209 open(newunit=io4, file=
"snow_sedi_dt_"//trim(adjustl(dt_string))// &
210 "_runtime"//trim(adjustl(tt_string))//
".txt", status=
"new", action=
"write")
212 write(io4,
'(I5, 4E12.4)') k, qs(1,k,1)
217 subroutine test_cloud_number_aerosolaware(dt)
221 real(wp),
intent(in) :: dt
222 integer,
parameter :: nz = 59
223 integer,
parameter :: ids = 1, ide = 1, ims = 1, ime = 1, its = 1, ite = 1
224 integer,
parameter :: jds = 1, jde = 1, jms = 1, jme = 1, jts = 1, jte = 1
225 integer,
parameter :: kds = 1, kde = nz, kms = 1, kme = nz, kts = 1, kte = nz
226 real(wp),
dimension(its:ite, kts:kte, jts:jte) :: qv, t, th, pii, p, w, dz, &
227 qc, qr, qi, qs, qg, ni, nr, ng, qb, nc
228 real(wp),
dimension(nz) :: klevs_in, qv_in, qc_in, qr_in, qi_in, qs_in, &
229 qg_in, ni_in, nr_in, nc_in, nwfa_in, nifa_in, theta_in, ng_in, volg_in, &
230 pressure_in, w_in, dz_in
231 real(wp) :: precip_sum
232 character(len=20) :: dt_string, tt_string
235 integer :: io1, io2, io3, io4, k, total_timesteps
236 integer,
parameter :: integration_time = 1200
238 write(dt_string,
'(I7)') int(dt)
242 open (io1, file=
'../test/data/mpas_59lev_test.txt', status=
'old')
245 read(io1,*) klevs_in(k), qv_in(k), qc_in(k), qr_in(k), qi_in(k), qs_in(k), &
246 qg_in(k), ni_in(k), nr_in(k), nc_in(k), nwfa_in(k), nifa_in(k), &
247 theta_in(k), ng_in(k), volg_in(k), pressure_in(k), w_in(k), dz_in(k)
252 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
253 p(1,:,1) = pressure_in
268 tempo_cfgs%turn_off_micro_flag= .true.
270 total_timesteps = int(integration_time/dt)
272 do itimestep = 1, total_timesteps
273 call tempo_run(tempo_cfgs=tempo_cfgs, itimestep=itimestep, dt=dt, &
274 ids=ids, ide=ide, ims=ims, ime=ime, its=its, ite=ite, &
275 jds=jds, jde=jde, jms=jms, jme=jme, jts=jts, jte=jte, &
276 kds=kds, kde=kde, kms=kms, kme=kme, kts=kts, kte=kte, &
277 t=t, p=p, w=w, dz=dz, qv=qv, th=th, pii=pii, &
278 qc=qc, nc=nc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
279 tempo_diags=tempo_driver_diags)
281 if (itimestep == 1)
then
282 open(newunit=io3, file=
"cloud_number_init.txt", status=
"new", action=
"write")
284 write(io3,
'(I5, 4E12.4)') k, qc(1,k,1), nc(1,k,1)
289 write(tt_string,
'(I7)') integration_time
290 open(newunit=io4, file=
"cloud_number_dt_"//trim(adjustl(dt_string))// &
291 "_runtime"//trim(adjustl(tt_string))//
".txt", status=
"new", action=
"write")
293 write(io4,
'(I5, 4E12.4)') k, qc(1,k,1), nc(1,k,1)
298 subroutine test_cloud_number_non_aerosolaware(dt)
302 real(wp),
intent(in) :: dt
303 integer,
parameter :: nz = 59
304 integer,
parameter :: ids = 1, ide = 1, ims = 1, ime = 1, its = 1, ite = 1
305 integer,
parameter :: jds = 1, jde = 1, jms = 1, jme = 1, jts = 1, jte = 1
306 integer,
parameter :: kds = 1, kde = nz, kms = 1, kme = nz, kts = 1, kte = nz
307 real(wp),
dimension(its:ite, kts:kte, jts:jte) :: qv, t, th, pii, p, w, dz, &
308 qc, qr, qi, qs, qg, ni, nr, ng, qb, nc
309 real(wp),
dimension(nz) :: klevs_in, qv_in, qc_in, qr_in, qi_in, qs_in, &
310 qg_in, ni_in, nr_in, nc_in, nwfa_in, nifa_in, theta_in, ng_in, volg_in, &
311 pressure_in, w_in, dz_in
312 real(wp) :: precip_sum
313 character(len=20) :: dt_string, tt_string
316 integer :: io1, io2, io3, io4, k, total_timesteps
317 integer,
parameter :: integration_time = 1200
319 write(dt_string,
'(I7)') int(dt)
323 open (io1, file=
'../test/data/mpas_59lev_test.txt', status=
'old')
326 read(io1,*) klevs_in(k), qv_in(k), qc_in(k), qr_in(k), qi_in(k), qs_in(k), &
327 qg_in(k), ni_in(k), nr_in(k), nc_in(k), nwfa_in(k), nifa_in(k), &
328 theta_in(k), ng_in(k), volg_in(k), pressure_in(k), w_in(k), dz_in(k)
333 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
334 p(1,:,1) = pressure_in
349 tempo_cfgs%turn_off_micro_flag= .true.
350 tempo_cfgs%cloud_number_mixing_ratio_flag= .true.
351 tempo_cfgs%ml_for_nc_flag = .false.
353 total_timesteps = int(integration_time/dt)
355 do itimestep = 1, total_timesteps
356 call tempo_run(tempo_cfgs=tempo_cfgs, itimestep=itimestep, dt=dt, &
357 ids=ids, ide=ide, ims=ims, ime=ime, its=its, ite=ite, &
358 jds=jds, jde=jde, jms=jms, jme=jme, jts=jts, jte=jte, &
359 kds=kds, kde=kde, kms=kms, kme=kme, kts=kts, kte=kte, &
360 t=t, p=p, w=w, dz=dz, qv=qv, th=th, pii=pii, &
361 qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
362 tempo_diags=tempo_driver_diags)
364 if (itimestep == 1)
then
365 open(newunit=io3, file=
"cloud_number_constant_init.txt", status=
"new", action=
"write")
367 write(io3,
'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
372 write(tt_string,
'(I7)') integration_time
373 open(newunit=io4, file=
"cloud_number_constant_dt_"//trim(adjustl(dt_string))// &
374 "_runtime"//trim(adjustl(tt_string))//
".txt", status=
"new", action=
"write")
376 write(io4,
'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
381 subroutine test_cloud_number_ml(dt)
385 real(wp),
intent(in) :: dt
386 integer,
parameter :: nz = 59
387 integer,
parameter :: ids = 1, ide = 1, ims = 1, ime = 1, its = 1, ite = 1
388 integer,
parameter :: jds = 1, jde = 1, jms = 1, jme = 1, jts = 1, jte = 1
389 integer,
parameter :: kds = 1, kde = nz, kms = 1, kme = nz, kts = 1, kte = nz
390 real(wp),
dimension(its:ite, kts:kte, jts:jte) :: qv, t, th, pii, p, w, dz, &
391 qc, qr, qi, qs, qg, ni, nr, ng, qb, nc
392 real(wp),
dimension(nz) :: klevs_in, qv_in, qc_in, qr_in, qi_in, qs_in, &
393 qg_in, ni_in, nr_in, nc_in, nwfa_in, nifa_in, theta_in, ng_in, volg_in, &
394 pressure_in, w_in, dz_in
395 real(wp) :: precip_sum
396 character(len=20) :: dt_string, tt_string
399 integer :: io1, io2, io3, io4, k, total_timesteps
400 integer,
parameter :: integration_time = 1200
402 write(dt_string,
'(I7)') int(dt)
406 open (io1, file=
'../test/data/mpas_59lev_test.txt', status=
'old')
409 read(io1,*) klevs_in(k), qv_in(k), qc_in(k), qr_in(k), qi_in(k), qs_in(k), &
410 qg_in(k), ni_in(k), nr_in(k), nc_in(k), nwfa_in(k), nifa_in(k), &
411 theta_in(k), ng_in(k), volg_in(k), pressure_in(k), w_in(k), dz_in(k)
416 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
417 p(1,:,1) = pressure_in
432 tempo_cfgs%turn_off_micro_flag = .true.
433 tempo_cfgs%cloud_number_mixing_ratio_flag = .true.
434 tempo_cfgs%ml_for_nc_flag = .true.
436 total_timesteps = int(integration_time/dt)
438 do itimestep = 1, total_timesteps
439 call tempo_run(tempo_cfgs=tempo_cfgs, itimestep=itimestep, dt=dt, &
440 ids=ids, ide=ide, ims=ims, ime=ime, its=its, ite=ite, &
441 jds=jds, jde=jde, jms=jms, jme=jme, jts=jts, jte=jte, &
442 kds=kds, kde=kde, kms=kms, kme=kme, kts=kts, kte=kte, &
443 t=t, p=p, w=w, dz=dz, qv=qv, th=th, pii=pii, &
444 qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
445 tempo_diags=tempo_driver_diags)
447 if (itimestep == 1)
then
448 open(newunit=io3, file=
"cloud_number_ml_init.txt", status=
"new", action=
"write")
450 write(io3,
'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
455 write(tt_string,
'(I7)') integration_time
456 open(newunit=io4, file=
"cloud_number_ml_dt_"//trim(adjustl(dt_string))// &
457 "_runtime"//trim(adjustl(tt_string))//
".txt", status=
"new", action=
"write")
459 write(io4,
'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
464 subroutine test_ml_cloud_effective_radius(dt)
468 real(wp),
intent(in) :: dt
469 integer,
parameter :: nz = 59
470 integer,
parameter :: ids = 1, ide = 1, ims = 1, ime = 1, its = 1, ite = 1
471 integer,
parameter :: jds = 1, jde = 1, jms = 1, jme = 1, jts = 1, jte = 1
472 integer,
parameter :: kds = 1, kde = nz, kms = 1, kme = nz, kts = 1, kte = nz
473 real(wp),
dimension(its:ite, kts:kte, jts:jte) :: qv, t, th, pii, p, w, dz, &
474 qc, qr, qi, qs, qg, ni, nr, ng, qb, nc, qc_bl, qcfrac_bl
475 real(wp),
dimension(nz) :: klevs_in, qv_in, qc_in, qr_in, qi_in, qs_in, &
476 qg_in, ni_in, nr_in, nc_in, nwfa_in, nifa_in, theta_in, ng_in, volg_in, &
477 pressure_in, w_in, dz_in
478 real(wp) :: precip_sum
479 character(len=20) :: dt_string, tt_string
482 integer :: io1, io2, io3, io4, k, total_timesteps
483 integer,
parameter :: integration_time = 1200
485 write(dt_string,
'(I7)') int(dt)
489 open (io1, file=
'../test/data/mpas_59lev_test.txt', status=
'old')
492 read(io1,*) klevs_in(k), qv_in(k), qc_in(k), qr_in(k), qi_in(k), qs_in(k), &
493 qg_in(k), ni_in(k), nr_in(k), nc_in(k), nwfa_in(k), nifa_in(k), &
494 theta_in(k), ng_in(k), volg_in(k), pressure_in(k), w_in(k), dz_in(k)
499 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
500 p(1,:,1) = pressure_in
512 qcfrac_bl(1,:,1) = 0._wp
515 qc_bl(1,k,1) = qc_in(k+15)*0.2_wp
517 if(qc_bl(1,k,1) > 0._wp)
then
518 qcfrac_bl(1,k,1) = 0.35_wp
526 tempo_cfgs%turn_off_micro_flag = .true.
527 tempo_cfgs%ml_for_bl_nc_flag = .true.
528 tempo_cfgs%cloud_number_mixing_ratio_flag = .true.
530 total_timesteps = int(integration_time/dt)
532 do itimestep = 1, total_timesteps
533 call tempo_run(tempo_cfgs=tempo_cfgs, itimestep=itimestep, dt=dt, &
534 ids=ids, ide=ide, ims=ims, ime=ime, its=its, ite=ite, &
535 jds=jds, jde=jde, jms=jms, jme=jme, jts=jts, jte=jte, &
536 kds=kds, kde=kde, kms=kms, kme=kme, kts=kts, kte=kte, &
537 t=t, p=p, w=w, dz=dz, qv=qv, th=th, pii=pii, &
538 qc_bl=qc_bl, qcfrac_bl=qcfrac_bl, &
539 qc=qc, nc=nc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
540 tempo_diags=tempo_driver_diags)
542 if (itimestep == 1)
then
543 open(newunit=io3, file=
"cloud_re_init.txt", status=
"new", action=
"write")
545 write(io3,
'(I5, 5E12.4)') k, qc(1,k,1), qc_bl(1,k,1), qcfrac_bl(1,k,1), &
546 tempo_driver_diags%cloud_number_mixing_ratio(1,k,1), tempo_driver_diags%re_cloud(1,k,1)*1.e6_wp
551 write(tt_string,
'(I7)') integration_time
552 open(newunit=io4, file=
"cloud_re_dt_"//trim(adjustl(dt_string))// &
553 "_runtime"//trim(adjustl(tt_string))//
".txt", status=
"new", action=
"write")
555 write(io4,
'(I5, 5E12.4)') k, qc(1,k,1), qc_bl(1,k,1), qcfrac_bl(1,k,1), &
556 tempo_driver_diags%cloud_number_mixing_ratio(1,k,1), tempo_driver_diags%re_cloud(1,k,1)*1.e6_wp