CCPP SciDoc v7.0.0  v7.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
tests.F90
1module tests
2 !! TEMPO tests
4 use module_mp_tempo_driver, only : tempo_init, tempo_run, ty_tempo_driver_diags
5 implicit none
6 private
7
8 public :: test_tempo_init, test_graupel_sedimentation, test_snow_sedimentation, &
9 test_cloud_number_aerosolaware, test_cloud_number_non_aerosolaware, &
10 test_cloud_number_ml, test_ml_cloud_effective_radius
11
12 type(ty_tempo_cfgs) :: tempo_cfgs
13 contains
14
15 subroutine test_tempo_init()
16 !! test tempo initialization procedure
17 !! use ml_for_bl_nc_flag = .true. to initialize ml data
18 !! which is used for a few tests
19 !! test specific flags are then set in each test
20 call tempo_init(ml_for_bl_nc_flag = .true., tempo_cfgs=tempo_cfgs)
21 end subroutine test_tempo_init
22
23
24 subroutine test_graupel_sedimentation(dt, semi_sedi)
25 !! test graupel sedimentation
26 use module_mp_tempo_params, only : wp, sp, dp
27
28 integer :: itimestep
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
43 type(ty_tempo_driver_diags) :: tempo_driver_diags
44 type(ty_tempo_cfgs) :: tempo_cfgs
45 integer :: io1, io2, io3, io4, k, total_timesteps
46 integer, parameter :: integration_time = 1200
47
48 write(dt_string, '(I7)') int(dt)
49
50 if (semi_sedi) then
51 write(semi_sedi_string, '(A)') '_semi_sedi'
52 else
53 write(semi_sedi_string, '(A)') ''
54 endif
55
56 ! read input file
57 io1 = 11
58 open (io1, file='../test/data/mpas_59lev_test.txt', status='old')
59 read(io1,*) ! header
60 do k = 1, nz
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)
64 end do
65 close(io1)
66
67 qv(1,:,1) = qv_in
68 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
69 p(1,:,1) = pressure_in
70 dz(1,:,1) = dz_in
71 w = 0._wp
72 qc = 0._wp
73 qr = 0._wp
74 nr = 0._wp
75 qi = 0._wp
76 qs = 0._wp
77 ni = 0._wp
78 qg(1,:,1) = qg_in
79 ng(1,:,1) = ng_in
80 qb(1,:,1) = volg_in * 1000. ! convert meters^3 -> liters
81
82 ! set configs
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
86
87 total_timesteps = int(integration_time/dt)
88 precip_sum = 0._wp
89 open(newunit=io2, file="graupel_precip_dt_"//trim(adjustl(dt_string))//""//trim(semi_sedi_string)//".txt", &
90 status="new", action="write")
91
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
102
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'
106 do k = 1, nz
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)
109 else
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)
111 endif
112 enddo
113 endif
114 enddo
115
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'
120 do k = 1, nz
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)
124 else
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)
127 endif
128 enddo
129 end subroutine test_graupel_sedimentation
130
131
132 subroutine test_snow_sedimentation(dt)
133 use module_mp_tempo_params, only : wp, sp, dp
134
135 integer :: itimestep
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
148 type(ty_tempo_driver_diags) :: tempo_driver_diags
149 type(ty_tempo_cfgs) :: tempo_cfgs
150 integer :: io1, io2, io3, io4, k, total_timesteps
151 integer, parameter :: integration_time = 1200
152
153 write(dt_string, '(I7)') int(dt)
154
155 ! read input file
156 io1 = 11
157 open (io1, file='../test/data/mpas_59lev_test.txt', status='old')
158 read(io1,*) ! header
159 do k = 1, nz
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)
163 end do
164 close(io1)
165
166 qv(1,:,1) = qv_in
167 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
168 p(1,:,1) = pressure_in
169 dz(1,:,1) = dz_in
170 w = 0._wp
171 qc = 0._wp
172 qr = 0._wp
173 nr = 0._wp
174 qi = 0._wp
175 qs(1,:,1) = qs_in
176 ni = 0._wp
177 qg = 0._wp
178 ng = 0._wp
179 qb = 0._wp
180
181 ! set configs
182 tempo_cfgs%turn_off_micro_flag= .true.
183
184 total_timesteps = int(integration_time/dt)
185 precip_sum = 0._wp
186 open(newunit=io2, file="snow_precip_dt_"//trim(adjustl(dt_string))//".txt", &
187 status="new", action="write")
188
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
199
200 if (dt == 1. .and. itimestep == 1) then
201 open(newunit=io3, file="snow_sedi_init.txt", status="new", action="write")
202 do k = 1, nz
203 write(io3,'(I5, 4E12.4)') k, qs(1,k,1)
204 enddo
205 endif
206 enddo
207
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")
211 do k = 1, nz
212 write(io4,'(I5, 4E12.4)') k, qs(1,k,1)
213 enddo
214 end subroutine test_snow_sedimentation
215
216
217 subroutine test_cloud_number_aerosolaware(dt)
218 use module_mp_tempo_params, only : wp, sp, dp
219
220 integer :: itimestep
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
233 type(ty_tempo_driver_diags) :: tempo_driver_diags
234 type(ty_tempo_cfgs) :: tempo_cfgs
235 integer :: io1, io2, io3, io4, k, total_timesteps
236 integer, parameter :: integration_time = 1200
237
238 write(dt_string, '(I7)') int(dt)
239
240 ! read input file
241 io1 = 11
242 open (io1, file='../test/data/mpas_59lev_test.txt', status='old')
243 read(io1,*) ! header
244 do k = 1, nz
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)
248 end do
249 close(io1)
250
251 qv(1,:,1) = qv_in
252 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
253 p(1,:,1) = pressure_in
254 dz(1,:,1) = dz_in
255 w(1,:,1) = w_in
256 qc(1,:,1) = qc_in
257 nc(1,:,1) = nc_in
258 qr(1,:,1) = qr_in
259 nr(1,:,1) = nr_in
260 qi(1,:,1) = qi_in
261 qs(1,:,1) = qs_in
262 ni(1,:,1) = ni_in
263 qg = 0._wp
264 ng = 0._wp
265 qb = 0._wp
266
267 ! set configs
268 tempo_cfgs%turn_off_micro_flag= .true.
269
270 total_timesteps = int(integration_time/dt)
271
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)
280
281 if (itimestep == 1) then
282 open(newunit=io3, file="cloud_number_init.txt", status="new", action="write")
283 do k = 1, nz
284 write(io3,'(I5, 4E12.4)') k, qc(1,k,1), nc(1,k,1)
285 enddo
286 endif
287 enddo
288
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")
292 do k = 1, nz
293 write(io4,'(I5, 4E12.4)') k, qc(1,k,1), nc(1,k,1)
294 enddo
295 end subroutine test_cloud_number_aerosolaware
296
297
298 subroutine test_cloud_number_non_aerosolaware(dt)
299 use module_mp_tempo_params, only : wp, sp, dp
300
301 integer :: itimestep
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
314 type(ty_tempo_driver_diags) :: tempo_driver_diags
315 type(ty_tempo_cfgs) :: tempo_cfgs
316 integer :: io1, io2, io3, io4, k, total_timesteps
317 integer, parameter :: integration_time = 1200
318
319 write(dt_string, '(I7)') int(dt)
320
321 ! read input file
322 io1 = 11
323 open (io1, file='../test/data/mpas_59lev_test.txt', status='old')
324 read(io1,*) ! header
325 do k = 1, nz
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)
329 end do
330 close(io1)
331
332 qv(1,:,1) = qv_in
333 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
334 p(1,:,1) = pressure_in
335 dz(1,:,1) = dz_in
336 w(1,:,1) = w_in
337 qc(1,:,1) = qc_in
338 nc(1,:,1) = 0._wp
339 qr(1,:,1) = qr_in
340 nr(1,:,1) = nr_in
341 qi(1,:,1) = qi_in
342 qs(1,:,1) = qs_in
343 ni(1,:,1) = ni_in
344 qg = 0._wp
345 ng = 0._wp
346 qb = 0._wp
347
348 ! set configs
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.
352
353 total_timesteps = int(integration_time/dt)
354
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)
363
364 if (itimestep == 1) then
365 open(newunit=io3, file="cloud_number_constant_init.txt", status="new", action="write")
366 do k = 1, nz
367 write(io3,'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
368 enddo
369 endif
370 enddo
371
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")
375 do k = 1, nz
376 write(io4,'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
377 enddo
378 end subroutine test_cloud_number_non_aerosolaware
379
380
381 subroutine test_cloud_number_ml(dt)
382 use module_mp_tempo_params, only : wp, sp, dp
383
384 integer :: itimestep
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
397 type(ty_tempo_driver_diags) :: tempo_driver_diags
398 type(ty_tempo_cfgs) :: tempo_cfgs
399 integer :: io1, io2, io3, io4, k, total_timesteps
400 integer, parameter :: integration_time = 1200
401
402 write(dt_string, '(I7)') int(dt)
403
404 ! read input file
405 io1 = 11
406 open (io1, file='../test/data/mpas_59lev_test.txt', status='old')
407 read(io1,*) ! header
408 do k = 1, nz
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)
412 end do
413 close(io1)
414
415 qv(1,:,1) = qv_in
416 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
417 p(1,:,1) = pressure_in
418 dz(1,:,1) = dz_in
419 w(1,:,1) = w_in
420 qc(1,:,1) = qc_in
421 nc(1,:,1) = 0._wp
422 qr(1,:,1) = qr_in
423 nr(1,:,1) = nr_in
424 qi(1,:,1) = qi_in
425 qs(1,:,1) = qs_in
426 ni(1,:,1) = ni_in
427 qg = 0._wp
428 ng = 0._wp
429 qb = 0._wp
430
431 ! set configs
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.
435
436 total_timesteps = int(integration_time/dt)
437
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)
446
447 if (itimestep == 1) then
448 open(newunit=io3, file="cloud_number_ml_init.txt", status="new", action="write")
449 do k = 1, nz
450 write(io3,'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
451 enddo
452 endif
453 enddo
454
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")
458 do k = 1, nz
459 write(io4,'(I5, 4E12.4)') k, qc(1,k,1), tempo_driver_diags%cloud_number_mixing_ratio(1,k,1)
460 enddo
461 end subroutine test_cloud_number_ml
462
463
464 subroutine test_ml_cloud_effective_radius(dt)
465 use module_mp_tempo_params, only : wp, sp, dp
466
467 integer :: itimestep
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
480 type(ty_tempo_driver_diags) :: tempo_driver_diags
481 type(ty_tempo_cfgs) :: tempo_cfgs
482 integer :: io1, io2, io3, io4, k, total_timesteps
483 integer, parameter :: integration_time = 1200
484
485 write(dt_string, '(I7)') int(dt)
486
487 ! read input file
488 io1 = 11
489 open (io1, file='../test/data/mpas_59lev_test.txt', status='old')
490 read(io1,*) ! header
491 do k = 1, nz
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)
495 end do
496 close(io1)
497
498 qv(1,:,1) = qv_in
499 t(1,:,1) = theta_in * (pressure_in/100000.)**0.286
500 p(1,:,1) = pressure_in
501 dz(1,:,1) = dz_in
502 w(1,:,1) = w_in
503 qc(1,:,1) = qc_in
504 nc(1,:,1) = nc_in
505 qr(1,:,1) = qr_in
506 nr(1,:,1) = nr_in
507 qi(1,:,1) = qi_in
508 qs(1,:,1) = qs_in
509 ni(1,:,1) = ni_in
510
511 qc_bl(1,:,1) = 0._wp
512 qcfrac_bl(1,:,1) = 0._wp
513 do k = 1, nz
514 if (k < 20) then
515 qc_bl(1,k,1) = qc_in(k+15)*0.2_wp
516 endif
517 if(qc_bl(1,k,1) > 0._wp) then
518 qcfrac_bl(1,k,1) = 0.35_wp
519 endif
520 enddo
521 qg = 0._wp
522 ng = 0._wp
523 qb = 0._wp
524
525 ! set configs
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.
529
530 total_timesteps = int(integration_time/dt)
531
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)
541
542 if (itimestep == 1) then
543 open(newunit=io3, file="cloud_re_init.txt", status="new", action="write")
544 do k = 1, nz
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
547 enddo
548 endif
549 enddo
550
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")
554 do k = 1, nz
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
557 enddo
558 end subroutine test_ml_cloud_effective_radius
559
560end module tests
Definition tests.F90:1