Line data Source code
1 : !-----------------------------------------------------------------------
2 : ! $Id$
3 : !===============================================================================
4 : module stats_clubb_utilities
5 :
6 : implicit none
7 :
8 : private ! Set Default Scope
9 :
10 : public :: stats_init, stats_begin_timestep, stats_end_timestep, &
11 : stats_accumulate, stats_finalize, stats_accumulate_hydromet, &
12 : stats_accumulate_lh_tend
13 :
14 : private :: stats_zero, stats_avg, stats_check_num_samples
15 :
16 : contains
17 :
18 : !-----------------------------------------------------------------------
19 0 : subroutine stats_init( iunit, fname_prefix, fdir, l_stats_in, &
20 : stats_fmt_in, stats_tsamp_in, stats_tout_in, fnamelist, &
21 : hydromet_dim, sclr_dim, edsclr_dim, sclr_tol, &
22 0 : hydromet_list, l_mix_rat_hm, &
23 0 : nzmax, nlon, nlat, gzt, gzm, nnrad_zt, &
24 0 : grad_zt, nnrad_zm, grad_zm, day, month, year, &
25 0 : lon_vals, lat_vals, time_current, delt, l_silhs_out_in, &
26 : clubb_params, &
27 : l_uv_nudge, &
28 : l_tke_aniso, &
29 : l_standard_term_ta, &
30 : stats_metadata, &
31 : stats_zt, stats_zm, stats_sfc, &
32 : stats_lh_zt, stats_lh_sfc, &
33 : stats_rad_zt, stats_rad_zm )
34 : !
35 : ! Description:
36 : ! Initializes the statistics saving functionality of the CLUBB model.
37 : !
38 : ! References:
39 : ! None
40 : !-----------------------------------------------------------------------
41 :
42 : use stats_variables, only: &
43 : stats_metadata_type
44 :
45 : use parameter_indices, only: &
46 : nparams
47 :
48 : use clubb_precision, only: &
49 : time_precision, & ! Constant(s)
50 : core_rknd
51 :
52 : use output_grads, only: &
53 : open_grads ! Procedure
54 :
55 : #ifdef NETCDF
56 : use output_netcdf, only: &
57 : open_netcdf_for_writing, & ! Procedure
58 : first_write
59 : #endif
60 :
61 : use stats_zm_module, only: &
62 : nvarmax_zm, & ! Constant(s)
63 : stats_init_zm ! Procedure(s)
64 :
65 : use stats_zt_module, only: &
66 : nvarmax_zt, & ! Constant(s)
67 : stats_init_zt ! Procedure(s)
68 :
69 : use stats_lh_zt_module, only: &
70 : nvarmax_lh_zt, & ! Constant(s)
71 : stats_init_lh_zt ! Procedure(s)
72 :
73 : use stats_lh_sfc_module, only: &
74 : nvarmax_lh_sfc, & ! Constant(s)
75 : stats_init_lh_sfc ! Procedure(s)
76 :
77 : use stats_rad_zt_module, only: &
78 : nvarmax_rad_zt, & ! Constant(s)
79 : stats_init_rad_zt ! Procedure(s)
80 :
81 : use stats_rad_zm_module, only: &
82 : nvarmax_rad_zm, & ! Constant(s)
83 : stats_init_rad_zm ! Procedure(s)
84 :
85 : use stats_sfc_module, only: &
86 : nvarmax_sfc, & ! Constant(s)
87 : stats_init_sfc ! Procedure(s)
88 :
89 : use constants_clubb, only: &
90 : fstdout, fstderr, var_length ! Constants
91 :
92 : use error_code, only: &
93 : clubb_at_least_debug_level, & ! Procedure
94 : err_code, & ! Error Indicator
95 : clubb_fatal_error ! Constant
96 :
97 : use stats_type, only: stats ! Type
98 :
99 : implicit none
100 :
101 : ! Local Constants
102 : integer, parameter :: &
103 : silhs_num_importance_categories = 8
104 :
105 : ! Input Variables
106 : integer, intent(in) :: iunit ! File unit for fnamelist
107 :
108 : character(len=*), intent(in) :: &
109 : fname_prefix, & ! Start of the stats filenames
110 : fdir ! Directory to output to
111 :
112 : logical, intent(in) :: &
113 : l_stats_in ! Stats on? T/F
114 :
115 : character(len=*), intent(in) :: &
116 : stats_fmt_in ! Format of the stats file output
117 :
118 : real( kind = core_rknd ), intent(in) :: &
119 : stats_tsamp_in, & ! Sampling interval [s]
120 : stats_tout_in ! Output interval [s]
121 :
122 : character(len=*), intent(in) :: &
123 : fnamelist ! Filename holding the &statsnl
124 :
125 : integer, intent(in) :: &
126 : nlon, & ! Number of points in the X direction [-]
127 : nlat, & ! Number of points in the Y direction [-]
128 : nzmax ! Grid points in the vertical [-]
129 :
130 : real( kind = core_rknd ), intent(in), dimension(nzmax) :: &
131 : gzt, gzm ! Thermodynamic and momentum levels [m]
132 :
133 : integer, intent(in) :: &
134 : nnrad_zt, & ! Grid points in the radiation grid [count]
135 : hydromet_dim, &
136 : sclr_dim, &
137 : edsclr_dim
138 :
139 : real( kind = core_rknd ), dimension(sclr_dim), intent(in) :: &
140 : sclr_tol
141 :
142 : character(len=10), dimension(hydromet_dim), intent(in) :: &
143 : hydromet_list
144 :
145 : logical, dimension(hydromet_dim), intent(in) :: &
146 : l_mix_rat_hm ! if true, then the quantity is a hydrometeor mixing ratio
147 :
148 : real( kind = core_rknd ), intent(in), dimension(nnrad_zt) :: grad_zt ! Radiation levels [m]
149 :
150 : integer, intent(in) :: nnrad_zm ! Grid points in the radiation grid [count]
151 :
152 : real( kind = core_rknd ), intent(in), dimension(nnrad_zm) :: grad_zm ! Radiation levels [m]
153 :
154 : integer, intent(in) :: day, month, year ! Time of year
155 :
156 : real( kind = core_rknd ), dimension(nlon), intent(in) :: &
157 : lon_vals ! Longitude values [Degrees E]
158 :
159 : real( kind = core_rknd ), dimension(nlat), intent(in) :: &
160 : lat_vals ! Latitude values [Degrees N]
161 :
162 : real( kind = time_precision ), intent(in) :: &
163 : time_current ! Model time [s]
164 :
165 : real( kind = core_rknd ), intent(in) :: &
166 : delt ! Timestep (dt_main in CLUBB) [s]
167 :
168 : logical, intent(in) :: &
169 : l_silhs_out_in ! Whether to output SILHS files (stats_lh_zt, stats_lh_sfc) [boolean]
170 :
171 : real( kind = core_rknd ), dimension(nparams), intent(in) :: &
172 : clubb_params ! Array of CLUBB's tunable parameters [units vary]
173 :
174 : logical, intent(in) :: &
175 : l_uv_nudge, & ! For wind speed nudging
176 : l_tke_aniso, & ! For anisotropic turbulent kinetic energy, i.e. TKE = 1/2
177 : ! (u'^2 + v'^2 + w'^2)
178 : l_standard_term_ta ! Use the standard discretization for the turbulent advection terms.
179 : ! Setting to .false. means that a_1 and a_3 are pulled outside of the
180 : ! derivative in advance_wp2_wp3_module.F90 and in
181 : ! advance_xp2_xpyp_module.F90.
182 :
183 : type (stats_metadata_type), intent(inout) :: &
184 : stats_metadata
185 :
186 : type (stats), target, intent(inout) :: &
187 : stats_zt, &
188 : stats_zm, &
189 : stats_sfc, &
190 : stats_lh_zt, &
191 : stats_lh_sfc, &
192 : stats_rad_zt, &
193 : stats_rad_zm
194 :
195 : ! Local Variables
196 : logical :: l_error
197 :
198 : character(len=200) :: fname
199 :
200 : integer :: ivar, ntot, read_status
201 :
202 : ! Namelist Variables
203 :
204 : character(len=10) :: stats_fmt ! File storage convention
205 :
206 : character(len=var_length), dimension(nvarmax_zt) :: &
207 : vars_zt ! Variables on the thermodynamic levels
208 :
209 : character(len=var_length), dimension(nvarmax_lh_zt) :: &
210 : vars_lh_zt ! Latin Hypercube variables on the thermodynamic levels
211 :
212 : character(len=var_length), dimension(nvarmax_lh_sfc) :: &
213 : vars_lh_sfc ! Latin Hypercube variables at the surface
214 :
215 : character(len=var_length), dimension(nvarmax_zm) :: &
216 : vars_zm ! Variables on the momentum levels
217 :
218 : character(len=var_length), dimension(nvarmax_rad_zt) :: &
219 : vars_rad_zt ! Variables on the radiation levels
220 :
221 : character(len=var_length), dimension(nvarmax_rad_zm) :: &
222 : vars_rad_zm ! Variables on the radiation levels
223 :
224 : character(len=var_length), dimension(nvarmax_sfc) :: &
225 : vars_sfc ! Variables at the model surface
226 :
227 : namelist /statsnl/ &
228 : vars_zt, &
229 : vars_zm, &
230 : vars_lh_zt, &
231 : vars_lh_sfc, &
232 : vars_rad_zt, &
233 : vars_rad_zm, &
234 : vars_sfc
235 :
236 : ! ---- Begin Code ----
237 :
238 : ! Initialize
239 0 : l_error = .false.
240 :
241 : ! Set stats_variables variables with inputs from calling subroutine
242 0 : stats_metadata%l_stats = l_stats_in
243 :
244 0 : stats_metadata%stats_tsamp = stats_tsamp_in
245 0 : stats_metadata%stats_tout = stats_tout_in
246 0 : stats_fmt = trim( stats_fmt_in )
247 0 : stats_metadata%l_silhs_out = l_silhs_out_in
248 :
249 0 : if ( .not. stats_metadata%l_stats ) then
250 0 : stats_metadata%l_stats_samp = .false.
251 0 : stats_metadata%l_stats_last = .false.
252 0 : return
253 : end if
254 :
255 : ! Initialize namelist variables
256 :
257 0 : vars_zt = ''
258 0 : vars_zm = ''
259 0 : vars_lh_zt = ''
260 0 : vars_lh_sfc = ''
261 0 : vars_rad_zt = ''
262 0 : vars_rad_zm = ''
263 0 : vars_sfc = ''
264 :
265 : ! Reads list of variables that should be output to GrADS/NetCDF (namelist &statsnl)
266 :
267 0 : open(unit=iunit, file=fnamelist)
268 0 : read(unit=iunit, nml=statsnl, iostat=read_status, end=100)
269 0 : if ( read_status /= 0 ) then
270 0 : if ( read_status > 0 ) then
271 0 : write(fstderr,*) "Error reading stats namelist in file ", &
272 0 : trim( fnamelist )
273 : else ! Read status < 0
274 0 : write(fstderr,*) "End of file marker reached while reading stats namelist in file ", &
275 0 : trim( fnamelist )
276 : end if
277 0 : write(fstderr,*) "One cause is having more statistical variables ", &
278 0 : "listed in the namelist for var_zt, var_zm, or ", &
279 0 : "var_sfc than allowed by nvarmax_zt, nvarmax_zm, ", &
280 0 : "or nvarmax_sfc, respectively."
281 0 : write(fstderr,*) "Maximum variables allowed for var_zt = ", nvarmax_zt
282 0 : write(fstderr,*) "Maximum variables allowed for var_zm = ", nvarmax_zm
283 0 : write(fstderr,*) "Maximum variables allowed for var_rad_zt = ", nvarmax_rad_zt
284 0 : write(fstderr,*) "Maximum variables allowed for var_rad_zm = ", nvarmax_rad_zm
285 0 : write(fstderr,*) "Maximum variables allowed for var_sfc = ", nvarmax_sfc
286 0 : write(fstderr,*) "stats_init: Error reading stats namelist."
287 0 : err_code = clubb_fatal_error
288 0 : close(unit=iunit)
289 0 : return
290 : end if ! read_status /= 0
291 :
292 0 : close(unit=iunit)
293 :
294 0 : if ( clubb_at_least_debug_level( 1 ) ) then
295 0 : write(fstdout,*) "--------------------------------------------------"
296 :
297 0 : write(fstdout,*) "Statistics"
298 :
299 0 : write(fstdout,*) "--------------------------------------------------"
300 0 : write(fstdout,*) "vars_zt = "
301 0 : ivar = 1
302 0 : do while ( vars_zt(ivar) /= '' )
303 0 : write(fstdout,*) vars_zt(ivar)
304 0 : ivar = ivar + 1
305 : end do
306 :
307 0 : write(fstdout,*) "vars_zm = "
308 0 : ivar = 1
309 0 : do while ( vars_zm(ivar) /= '' )
310 0 : write(fstdout,*) vars_zm(ivar)
311 0 : ivar = ivar + 1
312 : end do
313 :
314 0 : if ( stats_metadata%l_silhs_out ) then
315 0 : write(fstdout,*) "vars_lh_zt = "
316 0 : ivar = 1
317 0 : do while ( vars_lh_zt(ivar) /= '' )
318 0 : write(fstdout,*) vars_lh_zt(ivar)
319 0 : ivar = ivar + 1
320 : end do
321 :
322 0 : write(fstdout,*) "vars_lh_sfc = "
323 0 : ivar = 1
324 0 : do while ( vars_lh_sfc(ivar) /= '' )
325 0 : write(fstdout,*) vars_lh_sfc(ivar)
326 0 : ivar = ivar + 1
327 : end do
328 : end if ! l_silhs_out
329 :
330 0 : if ( stats_metadata%l_output_rad_files ) then
331 0 : write(fstdout,*) "vars_rad_zt = "
332 0 : ivar = 1
333 0 : do while ( vars_rad_zt(ivar) /= '' )
334 0 : write(fstdout,*) vars_rad_zt(ivar)
335 0 : ivar = ivar + 1
336 : end do
337 :
338 0 : write(fstdout,*) "vars_rad_zm = "
339 0 : ivar = 1
340 0 : do while ( vars_rad_zm(ivar) /= '' )
341 0 : write(fstdout,*) vars_rad_zm(ivar)
342 0 : ivar = ivar + 1
343 : end do
344 : end if ! l_output_rad_files
345 :
346 0 : write(fstdout,*) "vars_sfc = "
347 0 : ivar = 1
348 0 : do while ( vars_sfc(ivar) /= '' )
349 0 : write(fstdout,*) vars_sfc(ivar)
350 0 : ivar = ivar + 1
351 : end do
352 :
353 0 : write(fstdout,*) "--------------------------------------------------"
354 : end if ! clubb_at_least_debug_level 1
355 :
356 : ! Determine file names for GrADS or NetCDF files
357 0 : stats_metadata%fname_zt = trim( fname_prefix )//"_zt"
358 0 : stats_metadata%fname_zm = trim( fname_prefix )//"_zm"
359 0 : stats_metadata%fname_lh_zt = trim( fname_prefix )//"_lh_zt"
360 0 : stats_metadata%fname_lh_sfc = trim( fname_prefix )//"_lh_sfc"
361 0 : stats_metadata%fname_rad_zt = trim( fname_prefix )//"_rad_zt"
362 0 : stats_metadata%fname_rad_zm = trim( fname_prefix )//"_rad_zm"
363 0 : stats_metadata%fname_sfc = trim( fname_prefix )//"_sfc"
364 :
365 : ! Parse the file type for stats output. Currently only GrADS and
366 : ! netCDF > version 3.5 are supported by this code.
367 0 : select case ( trim( stats_fmt ) )
368 : case ( "GrADS", "grads", "gr" )
369 0 : stats_metadata%l_netcdf = .false.
370 0 : stats_metadata%l_grads = .true.
371 :
372 : case ( "NetCDF", "netcdf", "nc" )
373 0 : stats_metadata%l_netcdf = .true.
374 0 : stats_metadata%l_grads = .false.
375 :
376 : case default
377 0 : write(fstderr,*) "In module stats_clubb_utilities subroutine stats_init: "
378 0 : write(fstderr,*) "Invalid stats output format "//trim( stats_fmt )
379 0 : err_code = clubb_fatal_error
380 0 : return
381 :
382 : end select
383 :
384 : ! Check sampling and output frequencies
385 :
386 : ! The model time step length, delt (which is dt_main), should multiply
387 : ! evenly into the statistical sampling time step length, stats_tsamp.
388 0 : if ( abs( stats_metadata%stats_tsamp/delt &
389 : - real( floor( stats_metadata%stats_tsamp/delt ), kind=core_rknd ) ) &
390 : > 1.e-8_core_rknd) then
391 0 : l_error = .true. ! This will cause the run to stop.
392 0 : write(fstderr,*) 'Error: stats_tsamp should be an even multiple of ', &
393 0 : 'delt (which is dt_main). Check the appropriate ', &
394 0 : 'model.in file.'
395 0 : write(fstderr,*) 'stats_tsamp = ', stats_metadata%stats_tsamp
396 0 : write(fstderr,*) 'delt = ', delt
397 : end if
398 :
399 : ! The statistical sampling time step length, stats_tsamp, should multiply
400 : ! evenly into the statistical output time step length, stats_tout.
401 0 : if ( abs( stats_metadata%stats_tout/stats_metadata%stats_tsamp &
402 : - real( floor( stats_metadata%stats_tout &
403 : / stats_metadata%stats_tsamp ), kind=core_rknd) ) &
404 : > 1.e-8_core_rknd) then
405 0 : l_error = .true. ! This will cause the run to stop.
406 0 : write(fstderr,*) 'Error: stats_tout should be an even multiple of ', &
407 0 : 'stats_tsamp. Check the appropriate model.in file.'
408 0 : write(fstderr,*) 'stats_tout = ', stats_metadata%stats_tout
409 0 : write(fstderr,*) 'stats_tsamp = ', stats_metadata%stats_tsamp
410 : end if
411 :
412 : ! Initialize zt (mass points)
413 :
414 0 : ivar = 1
415 0 : do while ( ichar(vars_zt(ivar)(1:1)) /= 0 &
416 : .and. len_trim(vars_zt(ivar)) /= 0 &
417 0 : .and. ivar <= nvarmax_zt )
418 0 : ivar = ivar + 1
419 : end do
420 0 : ntot = ivar - 1
421 :
422 0 : if ( any( vars_zt == "hm_i" ) ) then
423 : ! Correct for number of variables found under "hm_i".
424 : ! Subtract "hm_i" from the number of zt statistical variables.
425 0 : ntot = ntot - 1
426 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
427 : ! to the number of zt statistical variables.
428 0 : ntot = ntot + 2 * hydromet_dim
429 : endif
430 0 : if ( any( vars_zt == "mu_hm_i" ) ) then
431 : ! Correct for number of variables found under "mu_hm_i".
432 : ! Subtract "mu_hm_i" from the number of zt statistical variables.
433 0 : ntot = ntot - 1
434 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
435 : ! to the number of zt statistical variables.
436 0 : ntot = ntot + 2 * hydromet_dim
437 : endif
438 0 : if ( any( vars_zt == "mu_Ncn_i" ) ) then
439 : ! Correct for number of variables found under "mu_Ncn_i".
440 : ! Subtract "mu_Ncn_i" from the number of zt statistical variables.
441 0 : ntot = ntot - 1
442 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
443 : ! statistical variables.
444 0 : ntot = ntot + 2
445 : endif
446 0 : if ( any( vars_zt == "mu_hm_i_n" ) ) then
447 : ! Correct for number of variables found under "mu_hm_i_n".
448 : ! Subtract "mu_hm_i_n" from the number of zt statistical variables.
449 0 : ntot = ntot - 1
450 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
451 : ! to the number of zt statistical variables.
452 0 : ntot = ntot + 2 * hydromet_dim
453 : endif
454 0 : if ( any( vars_zt == "mu_Ncn_i_n" ) ) then
455 : ! Correct for number of variables found under "mu_Ncn_i_n".
456 : ! Subtract "mu_Ncn_i_n" from the number of zt statistical variables.
457 0 : ntot = ntot - 1
458 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
459 : ! statistical variables.
460 0 : ntot = ntot + 2
461 : endif
462 0 : if ( any( vars_zt == "sigma_hm_i" ) ) then
463 : ! Correct for number of variables found under "sigma_hm_i".
464 : ! Subtract "sigma_hm_i" from the number of zt statistical variables.
465 0 : ntot = ntot - 1
466 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
467 : ! to the number of zt statistical variables.
468 0 : ntot = ntot + 2 * hydromet_dim
469 : endif
470 0 : if ( any( vars_zt == "sigma_Ncn_i" ) ) then
471 : ! Correct for number of variables found under "sigma_Ncn_i".
472 : ! Subtract "sigma_Ncn_i" from the number of zt statistical variables.
473 0 : ntot = ntot - 1
474 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
475 : ! statistical variables.
476 0 : ntot = ntot + 2
477 : endif
478 0 : if ( any( vars_zt == "sigma_hm_i_n" ) ) then
479 : ! Correct for number of variables found under "sigma_hm_i_n".
480 : ! Subtract "sigma_hm_i_n" from the number of zt statistical variables.
481 0 : ntot = ntot - 1
482 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
483 : ! to the number of zt statistical variables.
484 0 : ntot = ntot + 2 * hydromet_dim
485 : endif
486 0 : if ( any( vars_zt == "sigma_Ncn_i_n" ) ) then
487 : ! Correct for number of variables found under "sigma_Ncn_i_n".
488 : ! Subtract "sigma_Ncn_i_n" from the number of zt statistical variables.
489 0 : ntot = ntot - 1
490 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
491 : ! statistical variables.
492 0 : ntot = ntot + 2
493 : endif
494 :
495 0 : if ( any( vars_zt == "corr_w_hm_i" ) ) then
496 : ! Correct for number of variables found under "corr_w_hm_i".
497 : ! Subtract "corr_w_hm_i" from the number of zt statistical variables.
498 0 : ntot = ntot - 1
499 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
500 : ! to the number of zt statistical variables.
501 0 : ntot = ntot + 2 * hydromet_dim
502 : endif
503 0 : if ( any( vars_zt == "corr_w_Ncn_i" ) ) then
504 : ! Correct for number of variables found under "corr_w_Ncn_i".
505 : ! Subtract "corr_w_Ncn_i" from the number of zt statistical variables.
506 0 : ntot = ntot - 1
507 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
508 : ! statistical variables.
509 0 : ntot = ntot + 2
510 : endif
511 0 : if ( any( vars_zt == "corr_chi_hm_i" ) ) then
512 : ! Correct for number of variables found under "corr_chi_hm_i".
513 : ! Subtract "corr_chi_hm_i" from the number of zt statistical variables.
514 0 : ntot = ntot - 1
515 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
516 : ! to the number of zt statistical variables.
517 0 : ntot = ntot + 2 * hydromet_dim
518 : endif
519 0 : if ( any( vars_zt == "corr_chi_Ncn_i" ) ) then
520 : ! Correct for number of variables found under "corr_chi_Ncn_i".
521 : ! Subtract "corr_chi_Ncn_i" from the number of zt statistical variables.
522 0 : ntot = ntot - 1
523 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
524 : ! statistical variables.
525 0 : ntot = ntot + 2
526 : endif
527 0 : if ( any( vars_zt == "corr_eta_hm_i" ) ) then
528 : ! Correct for number of variables found under "corr_eta_hm_i".
529 : ! Subtract "corr_eta_hm_i" from the number of zt statistical variables.
530 0 : ntot = ntot - 1
531 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
532 : ! to the number of zt statistical variables.
533 0 : ntot = ntot + 2 * hydromet_dim
534 : endif
535 0 : if ( any( vars_zt == "corr_eta_Ncn_i" ) ) then
536 : ! Correct for number of variables found under "corr_eta_Ncn_i".
537 : ! Subtract "corr_eta_Ncn_i" from the number of zt statistical variables.
538 0 : ntot = ntot - 1
539 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
540 : ! statistical variables.
541 0 : ntot = ntot + 2
542 : endif
543 0 : if ( any( vars_zt == "corr_Ncn_hm_i" ) ) then
544 : ! Correct for number of variables found under "corr_Ncn_hm_i".
545 : ! Subtract "corr_Ncn_hm_i" from the number of zt statistical variables.
546 0 : ntot = ntot - 1
547 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
548 : ! to the number of zt statistical variables.
549 0 : ntot = ntot + 2 * hydromet_dim
550 : endif
551 0 : if ( any( vars_zt == "corr_hmx_hmy_i" ) ) then
552 : ! Correct for number of variables found under "corr_hmx_hmy_i".
553 : ! Subtract "corr_hmx_hmy_i" from the number of zt statistical variables.
554 0 : ntot = ntot - 1
555 : ! Add 2 (1st PDF component and 2nd PDF component) multipled by the
556 : ! number of correlations of two hydrometeors, which is found by:
557 : ! (1/2) * hydromet_dim * ( hydromet_dim - 1 );
558 : ! to the number of zt statistical variables.
559 0 : ntot = ntot + hydromet_dim * ( hydromet_dim - 1 )
560 : endif
561 :
562 0 : if ( any( vars_zt == "corr_w_hm_i_n" ) ) then
563 : ! Correct for number of variables found under "corr_w_hm_i_n".
564 : ! Subtract "corr_w_hm_i_n" from the number of zt statistical variables.
565 0 : ntot = ntot - 1
566 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
567 : ! to the number of zt statistical variables.
568 0 : ntot = ntot + 2 * hydromet_dim
569 : endif
570 0 : if ( any( vars_zt == "corr_w_Ncn_i_n" ) ) then
571 : ! Correct for number of variables found under "corr_w_Ncn_i_n".
572 : ! Subtract "corr_w_Ncn_i_n" from the number of zt statistical variables.
573 0 : ntot = ntot - 1
574 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
575 : ! statistical variables.
576 0 : ntot = ntot + 2
577 : endif
578 0 : if ( any( vars_zt == "corr_chi_hm_i_n" ) ) then
579 : ! Correct for number of variables found under "corr_chi_hm_i_n".
580 : ! Subtract "corr_chi_hm_i_n" from the number of zt statistical variables.
581 0 : ntot = ntot - 1
582 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
583 : ! to the number of zt statistical variables.
584 0 : ntot = ntot + 2 * hydromet_dim
585 : endif
586 0 : if ( any( vars_zt == "corr_chi_Ncn_i_n" ) ) then
587 : ! Correct for number of variables found under "corr_chi_Ncn_i_n".
588 : ! Subtract "corr_chi_Ncn_i_n" from the number of zt statistical variables.
589 0 : ntot = ntot - 1
590 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
591 : ! statistical variables.
592 0 : ntot = ntot + 2
593 : endif
594 0 : if ( any( vars_zt == "corr_eta_hm_i_n" ) ) then
595 : ! Correct for number of variables found under "corr_eta_hm_i_n".
596 : ! Subtract "corr_eta_hm_i_n" from the number of zt statistical variables.
597 0 : ntot = ntot - 1
598 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
599 : ! to the number of zt statistical variables.
600 0 : ntot = ntot + 2 * hydromet_dim
601 : endif
602 0 : if ( any( vars_zt == "corr_eta_Ncn_i_n" ) ) then
603 : ! Correct for number of variables found under "corr_eta_Ncn_i_n".
604 : ! Subtract "corr_eta_Ncn_i_n" from the number of zt statistical variables.
605 0 : ntot = ntot - 1
606 : ! Add 2 (1st PDF component and 2nd PDF component) to the number of zt
607 : ! statistical variables.
608 0 : ntot = ntot + 2
609 : endif
610 0 : if ( any( vars_zt == "corr_Ncn_hm_i_n" ) ) then
611 : ! Correct for number of variables found under "corr_Ncn_hm_i_n".
612 : ! Subtract "corr_Ncn_hm_i_n" from the number of zt statistical variables.
613 0 : ntot = ntot - 1
614 : ! Add 2 (1st PDF component and 2nd PDF component) for each hydrometeor
615 : ! to the number of zt statistical variables.
616 0 : ntot = ntot + 2 * hydromet_dim
617 : endif
618 0 : if ( any( vars_zt == "corr_hmx_hmy_i_n" ) ) then
619 : ! Correct for number of variables found under "corr_hmx_hmy_i_n".
620 : ! Subtract "corr_hmx_hmy_i_n" from the number of zt statistical variables.
621 0 : ntot = ntot - 1
622 : ! Add 2 (1st PDF component and 2nd PDF component) multipled by the
623 : ! number of normal space correlations of two hydrometeors, which is
624 : ! found by: (1/2) * hydromet_dim * ( hydromet_dim - 1 );
625 : ! to the number of zt statistical variables.
626 0 : ntot = ntot + hydromet_dim * ( hydromet_dim - 1 )
627 : endif
628 :
629 0 : if ( any( vars_zt == "hmp2_zt" ) ) then
630 : ! Correct for number of variables found under "hmp2_zt".
631 : ! Subtract "hmp2_zt" from the number of zt statistical variables.
632 0 : ntot = ntot - 1
633 : ! Add 1 for each hydrometeor to the number of zt statistical variables.
634 0 : ntot = ntot + hydromet_dim
635 : endif
636 :
637 0 : if ( any( vars_zt == "wp2hmp" ) ) then
638 : ! Correct for number of variables found under "wp2hmp".
639 : ! Subtract "wp2hmp" from the number of zt statistical variables.
640 0 : ntot = ntot - 1
641 : ! Add 1 for each hydrometeor to the number of zt statistical variables.
642 0 : ntot = ntot + hydromet_dim
643 : endif
644 :
645 0 : if ( any( vars_zt == "sclrm" ) ) then
646 : ! Correct for number of variables found under "sclrm".
647 : ! Subtract "sclrm" from the number of zt statistical variables.
648 0 : ntot = ntot - 1
649 : ! Add 1 for each scalar to the number of zt statistical variables.
650 0 : ntot = ntot + sclr_dim
651 : endif
652 :
653 0 : if ( any( vars_zt == "sclrm_f" ) ) then
654 : ! Correct for number of variables found under "sclrm_f".
655 : ! Subtract "sclrm_f" from the number of zt statistical variables.
656 0 : ntot = ntot - 1
657 : ! Add 1 for each scalar to the number of zt statistical variables.
658 0 : ntot = ntot + sclr_dim
659 : endif
660 :
661 0 : if ( any( vars_zt == "edsclrm" ) ) then
662 : ! Correct for number of variables found under "edsclrm".
663 : ! Subtract "edsclrm" from the number of zt statistical variables.
664 0 : ntot = ntot - 1
665 : ! Add 1 for each scalar to the number of zt statistical variables.
666 0 : ntot = ntot + edsclr_dim
667 : endif
668 :
669 0 : if ( any( vars_zt == "edsclrm_f" ) ) then
670 : ! Correct for number of variables found under "edsclrm_f".
671 : ! Subtract "edsclrm_f" from the number of zt statistical variables.
672 0 : ntot = ntot - 1
673 : ! Add 1 for each scalar to the number of zt statistical variables.
674 0 : ntot = ntot + edsclr_dim
675 : endif
676 :
677 0 : if ( ntot >= nvarmax_zt ) then
678 0 : write(fstderr,*) "There are more statistical variables listed in ", &
679 0 : "vars_zt than allowed for by nvarmax_zt."
680 0 : write(fstderr,*) "Check the number of variables listed for vars_zt ", &
681 0 : "in the stats namelist, or change nvarmax_zt."
682 0 : write(fstderr,*) "nvarmax_zt = ", nvarmax_zt
683 0 : write(fstderr,*) "number of variables in vars_zt = ", ntot
684 0 : write(fstderr,*) "stats_init: number of zt statistical variables exceeds limit"
685 0 : err_code = clubb_fatal_error
686 0 : return
687 : end if
688 :
689 0 : stats_zt%num_output_fields = ntot
690 0 : stats_zt%kk = nzmax
691 0 : stats_zt%ii = nlon
692 0 : stats_zt%jj = nlat
693 :
694 0 : allocate( stats_zt%z( stats_zt%kk ) )
695 0 : stats_zt%z = gzt
696 :
697 0 : allocate( stats_zt%accum_field_values( stats_zt%ii, stats_zt%jj, &
698 0 : stats_zt%kk, stats_zt%num_output_fields ) )
699 0 : allocate( stats_zt%accum_num_samples( stats_zt%ii, stats_zt%jj, &
700 0 : stats_zt%kk, stats_zt%num_output_fields ) )
701 0 : allocate( stats_zt%l_in_update( stats_zt%ii, stats_zt%jj, stats_zt%kk, &
702 0 : stats_zt%num_output_fields ) )
703 : call stats_zero( stats_zt%ii, stats_zt%jj, stats_zt%kk, stats_zt%num_output_fields, & ! In
704 0 : stats_zt%accum_field_values, stats_zt%accum_num_samples, stats_zt%l_in_update ) ! Out
705 :
706 0 : allocate( stats_zt%file%grid_avg_var( stats_zt%num_output_fields ) )
707 0 : allocate( stats_zt%file%z( stats_zt%kk ) )
708 :
709 0 : fname = trim( stats_metadata%fname_zt )
710 :
711 : ! Default initialization for array indices for zt
712 :
713 : call stats_init_zt( hydromet_dim, sclr_dim, edsclr_dim, & ! intent(in)
714 : hydromet_list, l_mix_rat_hm, & ! intent(in)
715 : vars_zt, & ! intent(in)
716 : l_error, & ! intent(inout)
717 0 : stats_metadata, stats_zt ) ! intent(inout)
718 :
719 0 : if ( stats_metadata%l_grads ) then
720 :
721 : ! Open GrADS file
722 : call open_grads( iunit, fdir, fname, & ! intent(in)
723 : 1, stats_zt%kk, nlat, nlon, stats_zt%z, & ! intent(in)
724 : day, month, year, lat_vals, lon_vals, & ! intent(in)
725 : time_current+real(stats_metadata%stats_tout,kind=time_precision), & !intent(in)
726 : stats_metadata, stats_zt%num_output_fields, & ! intent(in)
727 0 : stats_zt%file ) ! intent(inout)
728 :
729 : else ! Open NetCDF file
730 : #ifdef NETCDF
731 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, 1, stats_zt%kk, stats_zt%z, & ! In
732 : day, month, year, lat_vals, lon_vals, & ! In
733 : time_current, stats_metadata%stats_tout, stats_zt%num_output_fields, & ! In
734 : stats_zt%file ) ! InOut
735 :
736 : ! Finalize the variable definitions
737 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
738 : l_uv_nudge, & ! intent(in)
739 : l_tke_aniso, & ! intent(in)
740 : l_standard_term_ta, & ! intent(in)
741 : stats_zt%file ) ! intent(inout)
742 :
743 : if ( err_code == clubb_fatal_error ) then
744 : write(fstderr,*) "Fatal error setting up stats_zt"
745 : return
746 : end if
747 : #else
748 0 : error stop "This CLUBB program was not compiled with netCDF support."
749 : #endif
750 :
751 : end if
752 :
753 :
754 : ! Setup output file for stats_lh_zt (Latin Hypercube stats)
755 :
756 0 : if ( stats_metadata%l_silhs_out ) then
757 :
758 : ivar = 1
759 0 : do while ( ichar(vars_lh_zt(ivar)(1:1)) /= 0 &
760 : .and. len_trim(vars_lh_zt(ivar)) /= 0 &
761 0 : .and. ivar <= nvarmax_lh_zt )
762 0 : ivar = ivar + 1
763 : end do
764 0 : ntot = ivar - 1
765 0 : if ( any( vars_lh_zt == "silhs_variance_category" ) ) then
766 : ! Correct for number of variables found under "silhs_variance_category".
767 : ! Subtract "silhs_variance_category" from the number of lh_zt statistical
768 : ! variables.
769 0 : ntot = ntot - 1
770 : ! Add 1 for each SILHS category to the number of lh_zt statistical variables
771 0 : ntot = ntot + silhs_num_importance_categories
772 : end if
773 :
774 0 : if ( any( vars_lh_zt == "lh_samp_frac_category" ) ) then
775 : ! Correct for number of variables found under "lh_samp_frac_category".
776 : ! Subtract "lh_samp_frac_category" from the number of lh_zt statistical
777 : ! variables.
778 0 : ntot = ntot - 1
779 : ! Add 1 for each SILHS category to the number of lh_zt statistical variables
780 0 : ntot = ntot + silhs_num_importance_categories
781 : end if
782 :
783 0 : if ( ntot == nvarmax_lh_zt ) then
784 0 : write(fstderr,*) "There are more statistical variables listed in ", &
785 0 : "vars_lh_zt than allowed for by nvarmax_lh_zt."
786 0 : write(fstderr,*) "Check the number of variables listed for vars_lh_zt ", &
787 0 : "in the stats namelist, or change nvarmax_lh_zt."
788 0 : write(fstderr,*) "nvarmax_lh_zt = ", nvarmax_lh_zt
789 0 : write(fstderr,*) "number of variables in vars_lh_zt = ", ntot
790 0 : write(fstderr,*) "stats_init: number of lh_zt statistical variables exceeds limit"
791 0 : err_code = clubb_fatal_error
792 0 : return
793 : end if
794 :
795 0 : stats_lh_zt%num_output_fields = ntot
796 0 : stats_lh_zt%kk = nzmax
797 0 : stats_lh_zt%ii = nlon
798 0 : stats_lh_zt%jj = nlat
799 :
800 0 : allocate( stats_lh_zt%z( stats_lh_zt%kk ) )
801 0 : stats_lh_zt%z = gzt
802 :
803 0 : allocate( stats_lh_zt%accum_field_values( stats_lh_zt%ii, stats_lh_zt%jj, &
804 0 : stats_lh_zt%kk, stats_lh_zt%num_output_fields ) )
805 0 : allocate( stats_lh_zt%accum_num_samples( stats_lh_zt%ii, stats_lh_zt%jj, &
806 0 : stats_lh_zt%kk, stats_lh_zt%num_output_fields ) )
807 0 : allocate( stats_lh_zt%l_in_update( stats_lh_zt%ii, stats_lh_zt%jj, stats_lh_zt%kk, &
808 0 : stats_lh_zt%num_output_fields ) )
809 : call stats_zero( stats_lh_zt%ii, stats_lh_zt%jj, stats_lh_zt%kk, & ! intent(in)
810 : stats_lh_zt%num_output_fields, & ! intent(in)
811 : stats_lh_zt%accum_field_values, stats_lh_zt%accum_num_samples, & ! intent(out)
812 0 : stats_lh_zt%l_in_update ) ! intent(out)
813 :
814 0 : allocate( stats_lh_zt%file%grid_avg_var( stats_lh_zt%num_output_fields ) )
815 0 : allocate( stats_lh_zt%file%z( stats_lh_zt%kk ) )
816 :
817 : call stats_init_lh_zt( vars_lh_zt, & ! intent(in)
818 : l_error, & ! intent(inout)
819 0 : stats_metadata, stats_lh_zt ) ! intent(inout)
820 :
821 :
822 0 : fname = trim( stats_metadata%fname_lh_zt )
823 :
824 0 : if ( stats_metadata%l_grads ) then
825 :
826 : ! Open GrADS file
827 : call open_grads( iunit, fdir, fname, & ! intent(in)
828 : 1, stats_lh_zt%kk, nlat, nlon, stats_lh_zt%z, & ! intent(in)
829 : day, month, year, lat_vals, lon_vals, & ! intent(in)
830 : time_current+real(stats_metadata%stats_tout,kind=time_precision), & !intent(in)
831 : stats_metadata, stats_lh_zt%num_output_fields, & ! intent(in)
832 0 : stats_lh_zt%file ) ! intent(inout)
833 :
834 : else ! Open NetCDF file
835 : #ifdef NETCDF
836 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, 1, stats_lh_zt%kk, & ! In
837 : stats_lh_zt%z, day, month, year, lat_vals, lon_vals, & ! In
838 : time_current, stats_metadata%stats_tout, stats_lh_zt%num_output_fields, & ! In
839 : stats_lh_zt%file ) ! InOut
840 :
841 : ! Finalize the variable definitions
842 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
843 : l_uv_nudge, & ! intent(in)
844 : l_tke_aniso, & ! intent(in)
845 : l_standard_term_ta, & ! intent(in)
846 : stats_lh_zt%file ) ! intent(inout)
847 :
848 : if ( err_code == clubb_fatal_error ) then
849 : write(fstderr,*) "Fatal error setting up stats_lh_zt"
850 : return
851 : end if
852 : #else
853 0 : error stop "This CLUBB program was not compiled with netCDF support."
854 : #endif
855 :
856 : end if
857 :
858 0 : ivar = 1
859 0 : do while ( ichar(vars_lh_sfc(ivar)(1:1)) /= 0 &
860 : .and. len_trim(vars_lh_sfc(ivar)) /= 0 &
861 0 : .and. ivar <= nvarmax_lh_sfc )
862 0 : ivar = ivar + 1
863 : end do
864 0 : ntot = ivar - 1
865 0 : if ( ntot == nvarmax_lh_sfc ) then
866 0 : write(fstderr,*) "There are more statistical variables listed in ", &
867 0 : "vars_lh_sfc than allowed for by nvarmax_lh_sfc."
868 0 : write(fstderr,*) "Check the number of variables listed for vars_lh_sfc ", &
869 0 : "in the stats namelist, or change nvarmax_lh_sfc."
870 0 : write(fstderr,*) "nvarmax_lh_sfc = ", nvarmax_lh_sfc
871 0 : write(fstderr,*) "number of variables in vars_lh_sfc = ", ntot
872 0 : write(fstderr,*) "stats_init: number of lh_sfc statistical variables exceeds limit"
873 0 : err_code = clubb_fatal_error
874 0 : return
875 : end if
876 :
877 0 : stats_lh_sfc%num_output_fields = ntot
878 0 : stats_lh_sfc%kk = 1
879 0 : stats_lh_sfc%ii = nlon
880 0 : stats_lh_sfc%jj = nlat
881 :
882 0 : allocate( stats_lh_sfc%z( stats_lh_sfc%kk ) )
883 0 : stats_lh_sfc%z = gzm(1)
884 :
885 0 : allocate( stats_lh_sfc%accum_field_values( stats_lh_sfc%ii, stats_lh_sfc%jj, &
886 0 : stats_lh_sfc%kk, stats_lh_sfc%num_output_fields ) )
887 0 : allocate( stats_lh_sfc%accum_num_samples( stats_lh_sfc%ii, stats_lh_sfc%jj, &
888 0 : stats_lh_sfc%kk, stats_lh_sfc%num_output_fields ) )
889 0 : allocate( stats_lh_sfc%l_in_update( stats_lh_sfc%ii, stats_lh_sfc%jj, &
890 0 : stats_lh_sfc%kk, stats_lh_sfc%num_output_fields ) )
891 :
892 : call stats_zero( stats_lh_sfc%ii, stats_lh_sfc%jj, stats_lh_sfc%kk, & ! intent(in)
893 : stats_lh_sfc%num_output_fields, & ! intent(in)
894 : stats_lh_sfc%accum_field_values, & ! intent(out)
895 0 : stats_lh_sfc%accum_num_samples, stats_lh_sfc%l_in_update ) ! intent(out)
896 :
897 0 : allocate( stats_lh_sfc%file%grid_avg_var( stats_lh_sfc%num_output_fields ) )
898 0 : allocate( stats_lh_sfc%file%z( stats_lh_sfc%kk ) )
899 :
900 : call stats_init_lh_sfc( vars_lh_sfc, & ! intent(in)
901 : l_error, & ! intent(inout)
902 0 : stats_metadata, stats_lh_sfc ) ! intent(inout)
903 :
904 0 : fname = trim( stats_metadata%fname_lh_sfc )
905 :
906 0 : if ( stats_metadata%l_grads ) then
907 :
908 : ! Open GrADS file
909 : call open_grads( iunit, fdir, fname, & ! intent(in)
910 : 1, stats_lh_sfc%kk, nlat, nlon, stats_lh_sfc%z, & ! intent(in)
911 : day, month, year, lat_vals, lon_vals, & ! intent(in)
912 : time_current+real(stats_metadata%stats_tout,kind=time_precision), & !intent(in)
913 : stats_metadata, stats_lh_sfc%num_output_fields, & ! intent(in)
914 0 : stats_lh_sfc%file ) ! intent(inout)
915 :
916 : else ! Open NetCDF file
917 : #ifdef NETCDF
918 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, 1, stats_lh_sfc%kk, & ! In
919 : stats_lh_sfc%z, day, month, year, lat_vals, lon_vals, & ! In
920 : time_current, stats_metadata%stats_tout, stats_lh_sfc%num_output_fields, & ! In
921 : stats_lh_sfc%file ) ! InOut
922 :
923 : ! Finalize the variable definitions
924 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
925 : l_uv_nudge, & ! intent(in)
926 : l_tke_aniso, & ! intent(in)
927 : l_standard_term_ta, & ! intent(in)
928 : stats_lh_sfc%file ) ! intent(inout)
929 :
930 : if ( err_code == clubb_fatal_error ) then
931 : write(fstderr,*) "Fatal error setting up stats_lh_sfc"
932 : return
933 : end if
934 :
935 : if ( err_code == clubb_fatal_error ) return
936 : #else
937 0 : error stop "This CLUBB program was not compiled with netCDF support."
938 : #endif
939 :
940 : end if
941 :
942 : end if ! l_silhs_out
943 :
944 : ! Initialize stats_zm (momentum points)
945 :
946 0 : ivar = 1
947 0 : do while ( ichar(vars_zm(ivar)(1:1)) /= 0 &
948 : .and. len_trim(vars_zm(ivar)) /= 0 &
949 0 : .and. ivar <= nvarmax_zm )
950 0 : ivar = ivar + 1
951 : end do
952 0 : ntot = ivar - 1
953 :
954 0 : if ( any( vars_zm == "hydrometp2" ) ) then
955 : ! Correct for number of variables found under "hydrometp2".
956 : ! Subtract "hydrometp2" from the number of zm statistical variables.
957 0 : ntot = ntot - 1
958 : ! Add 1 for each hydrometeor to the number of zm statistical variables.
959 0 : ntot = ntot + hydromet_dim
960 : endif
961 :
962 0 : if ( any( vars_zm == "wphydrometp" ) ) then
963 : ! Correct for number of variables found under "wphydrometp".
964 : ! Subtract "wphydrometp" from the number of zm statistical variables.
965 0 : ntot = ntot - 1
966 : ! Add 1 for each hydrometeor to the number of zm statistical variables.
967 0 : ntot = ntot + hydromet_dim
968 : endif
969 :
970 0 : if ( any( vars_zm == "rtphmp" ) ) then
971 : ! Correct for number of variables found under "rtphmp".
972 : ! Subtract "rtphmp" from the number of zm statistical variables.
973 0 : ntot = ntot - 1
974 : ! Add 1 for each hydrometeor to the number of zm statistical variables.
975 0 : ntot = ntot + hydromet_dim
976 : endif
977 :
978 0 : if ( any( vars_zm == "thlphmp" ) ) then
979 : ! Correct for number of variables found under "thlphmp".
980 : ! Subtract "thlphmp" from the number of zm statistical variables.
981 0 : ntot = ntot - 1
982 : ! Add 1 for each hydrometeor to the number of zm statistical variables.
983 0 : ntot = ntot + hydromet_dim
984 : endif
985 :
986 0 : if ( any( vars_zm == "hmxphmyp" ) ) then
987 : ! Correct for number of variables found under "hmxphmyp".
988 : ! Subtract "hmxphmyp" from the number of zm statistical variables.
989 0 : ntot = ntot - 1
990 : ! Add the number of overall covariances of two hydrometeors, which is
991 : ! found by: (1/2) * hydromet_dim * ( hydromet_dim - 1 );
992 : ! to the number of zm statistical variables.
993 0 : ntot = ntot + hydromet_dim * ( hydromet_dim - 1 ) / 2
994 : endif
995 :
996 0 : if ( any( vars_zm == "K_hm" ) ) then
997 : ! Correct for number of variables found under "K_hm".
998 : ! Subtract "K_hm" from the number of zm statistical variables.
999 0 : ntot = ntot - 1
1000 : ! Add 1 for each hydrometeor to the number of zm statistical variables.
1001 0 : ntot = ntot + hydromet_dim
1002 : endif
1003 :
1004 0 : if ( any( vars_zm == "sclrprtp" ) ) then
1005 : ! Correct for number of variables found under "sclrprtp".
1006 : ! Subtract "sclrprtp" from the number of zm statistical variables.
1007 0 : ntot = ntot - 1
1008 : ! Add 1 for each scalar to the number of zm statistical variables.
1009 0 : ntot = ntot + sclr_dim
1010 : endif
1011 :
1012 0 : if ( any( vars_zm == "sclrp2" ) ) then
1013 : ! Correct for number of variables found under "sclrp2".
1014 : ! Subtract "sclrp2" from the number of zm statistical variables.
1015 0 : ntot = ntot - 1
1016 : ! Add 1 for each scalar to the number of zm statistical variables.
1017 0 : ntot = ntot + sclr_dim
1018 : endif
1019 :
1020 :
1021 0 : if ( any( vars_zm == "sclrpthvp" ) ) then
1022 : ! Correct for number of variables found under "sclrpthvp".
1023 : ! Subtract "sclrpthvp" from the number of zm statistical variables.
1024 0 : ntot = ntot - 1
1025 : ! Add 1 for each scalar to the number of zm statistical variables.
1026 0 : ntot = ntot + sclr_dim
1027 : endif
1028 :
1029 :
1030 0 : if ( any( vars_zm == "sclrpthlp" ) ) then
1031 : ! Correct for number of variables found under "sclrpthlp".
1032 : ! Subtract "sclrpthlp" from the number of zm statistical variables.
1033 0 : ntot = ntot - 1
1034 : ! Add 1 for each scalar to the number of zm statistical variables.
1035 0 : ntot = ntot + sclr_dim
1036 : endif
1037 :
1038 :
1039 0 : if ( any( vars_zm == "sclrprcp" ) ) then
1040 : ! Correct for number of variables found under "sclrprcp".
1041 : ! Subtract "sclrprcp" from the number of zm statistical variables.
1042 0 : ntot = ntot - 1
1043 : ! Add 1 for each scalar to the number of zm statistical variables.
1044 0 : ntot = ntot + sclr_dim
1045 : endif
1046 :
1047 :
1048 0 : if ( any( vars_zm == "wpsclrp" ) ) then
1049 : ! Correct for number of variables found under "wpsclrp".
1050 : ! Subtract "wpsclrp" from the number of zm statistical variables.
1051 0 : ntot = ntot - 1
1052 : ! Add 1 for each scalar to the number of zm statistical variables.
1053 0 : ntot = ntot + sclr_dim
1054 : endif
1055 :
1056 :
1057 0 : if ( any( vars_zm == "wpsclrp2" ) ) then
1058 : ! Correct for number of variables found under "wpsclrp2".
1059 : ! Subtract "wpsclrp2" from the number of zm statistical variables.
1060 0 : ntot = ntot - 1
1061 : ! Add 1 for each scalar to the number of zm statistical variables.
1062 0 : ntot = ntot + sclr_dim
1063 : endif
1064 :
1065 :
1066 0 : if ( any( vars_zm == "wp2sclrp" ) ) then
1067 : ! Correct for number of variables found under "wp2sclrp".
1068 : ! Subtract "wp2sclrp" from the number of zm statistical variables.
1069 0 : ntot = ntot - 1
1070 : ! Add 1 for each scalar to the number of zm statistical variables.
1071 0 : ntot = ntot + sclr_dim
1072 : endif
1073 :
1074 :
1075 0 : if ( any( vars_zm == "wpsclrprtp" ) ) then
1076 : ! Correct for number of variables found under "wpsclrprtp".
1077 : ! Subtract "wpsclrprtp" from the number of zm statistical variables.
1078 0 : ntot = ntot - 1
1079 : ! Add 1 for each scalar to the number of zm statistical variables.
1080 0 : ntot = ntot + sclr_dim
1081 : endif
1082 :
1083 :
1084 0 : if ( any( vars_zm == "wpsclrpthlp" ) ) then
1085 : ! Correct for number of variables found under "wpsclrpthlp".
1086 : ! Subtract "wpsclrpthlp" from the number of zm statistical variables.
1087 0 : ntot = ntot - 1
1088 : ! Add 1 for each scalar to the number of zm statistical variables.
1089 0 : ntot = ntot + sclr_dim
1090 : endif
1091 :
1092 :
1093 0 : if ( any( vars_zm == "wpedsclrp" ) ) then
1094 : ! Correct for number of variables found under "wpedsclrp".
1095 : ! Subtract "wpedsclrp" from the number of zm statistical variables.
1096 0 : ntot = ntot - 1
1097 : ! Add 1 for each scalar to the number of zm statistical variables.
1098 0 : ntot = ntot + edsclr_dim
1099 : endif
1100 :
1101 :
1102 :
1103 0 : if ( ntot == nvarmax_zm ) then
1104 0 : write(fstderr,*) "There are more statistical variables listed in ", &
1105 0 : "vars_zm than allowed for by nvarmax_zm."
1106 0 : write(fstderr,*) "Check the number of variables listed for vars_zm ", &
1107 0 : "in the stats namelist, or change nvarmax_zm."
1108 0 : write(fstderr,*) "nvarmax_zm = ", nvarmax_zm
1109 0 : write(fstderr,*) "number of variables in vars_zm = ", ntot
1110 0 : write(fstderr,*) "stats_init: number of zm statistical variables exceeds limit"
1111 0 : err_code = clubb_fatal_error
1112 0 : return
1113 : end if
1114 :
1115 0 : stats_zm%num_output_fields = ntot
1116 0 : stats_zm%kk = nzmax
1117 0 : stats_zm%ii = nlon
1118 0 : stats_zm%jj = nlat
1119 :
1120 0 : allocate( stats_zm%z( stats_zm%kk ) )
1121 0 : stats_zm%z = gzm
1122 :
1123 0 : allocate( stats_zm%accum_field_values( stats_zm%ii, stats_zm%jj, &
1124 0 : stats_zm%kk, stats_zm%num_output_fields ) )
1125 0 : allocate( stats_zm%accum_num_samples( stats_zm%ii, stats_zm%jj, &
1126 0 : stats_zm%kk, stats_zm%num_output_fields ) )
1127 0 : allocate( stats_zm%l_in_update( stats_zm%ii, stats_zm%jj, stats_zm%kk, &
1128 0 : stats_zm%num_output_fields ) )
1129 :
1130 : call stats_zero( stats_zm%ii, stats_zm%jj, stats_zm%kk, stats_zm%num_output_fields, & ! In
1131 0 : stats_zm%accum_field_values, stats_zm%accum_num_samples, stats_zm%l_in_update ) ! intent(out)
1132 :
1133 0 : allocate( stats_zm%file%grid_avg_var( stats_zm%num_output_fields ) )
1134 0 : allocate( stats_zm%file%z( stats_zm%kk ) )
1135 :
1136 : call stats_init_zm( hydromet_dim, sclr_dim, edsclr_dim, & ! intent(in)
1137 : hydromet_list, l_mix_rat_hm, & ! intent(in)
1138 : vars_zm, & ! intent(in)
1139 : l_error, & ! intent(inout)
1140 0 : stats_metadata, stats_zm ) ! intent(inout)
1141 :
1142 0 : fname = trim( stats_metadata%fname_zm )
1143 0 : if ( stats_metadata%l_grads ) then
1144 :
1145 : ! Open GrADS files
1146 : call open_grads( iunit, fdir, fname, & ! intent(in)
1147 : 1, stats_zm%kk, nlat, nlon, stats_zm%z, & ! intent(in)
1148 : day, month, year, lat_vals, lon_vals, & ! intent(in)
1149 : time_current+real(stats_metadata%stats_tout,kind=time_precision), & !intent(in)
1150 : stats_metadata, stats_zm%num_output_fields, & ! intent(in)
1151 0 : stats_zm%file ) ! intent(inout)
1152 :
1153 : else ! Open NetCDF file
1154 : #ifdef NETCDF
1155 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, 1, stats_zm%kk, stats_zm%z, & ! In
1156 : day, month, year, lat_vals, lon_vals, & ! In
1157 : time_current, stats_metadata%stats_tout, stats_zm%num_output_fields, & ! In
1158 : stats_zm%file ) ! InOut
1159 :
1160 : ! Finalize the variable definitions
1161 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
1162 : l_uv_nudge, & ! intent(in)
1163 : l_tke_aniso, & ! intent(in)
1164 : l_standard_term_ta, & ! intent(in)
1165 : stats_zm%file ) ! intent(inout)
1166 :
1167 : if ( err_code == clubb_fatal_error ) then
1168 : write(fstderr,*) "Fatal error setting up stats_zm"
1169 : return
1170 : end if
1171 : #else
1172 0 : error stop "This CLUBB program was not compiled with netCDF support."
1173 : #endif
1174 : end if
1175 :
1176 : ! Initialize stats_rad_zt (radiation points)
1177 :
1178 0 : if ( stats_metadata%l_output_rad_files ) then
1179 :
1180 : ivar = 1
1181 0 : do while ( ichar(vars_rad_zt(ivar)(1:1)) /= 0 &
1182 : .and. len_trim(vars_rad_zt(ivar)) /= 0 &
1183 0 : .and. ivar <= nvarmax_rad_zt )
1184 0 : ivar = ivar + 1
1185 : end do
1186 0 : ntot = ivar - 1
1187 0 : if ( ntot == nvarmax_rad_zt ) then
1188 0 : write(fstderr,*) "There are more statistical variables listed in ", &
1189 0 : "vars_rad_zt than allowed for by nvarmax_rad_zt."
1190 0 : write(fstderr,*) "Check the number of variables listed for vars_rad_zt ", &
1191 0 : "in the stats namelist, or change nvarmax_rad_zt."
1192 0 : write(fstderr,*) "nvarmax_rad_zt = ", nvarmax_rad_zt
1193 0 : write(fstderr,*) "number of variables in vars_rad_zt = ", ntot
1194 0 : write(fstderr,*) "stats_init: number of rad_zt statistical variables exceeds limit"
1195 0 : err_code = clubb_fatal_error
1196 0 : return
1197 : end if
1198 :
1199 0 : stats_rad_zt%num_output_fields = ntot
1200 0 : stats_rad_zt%kk = nnrad_zt
1201 0 : stats_rad_zt%ii = nlon
1202 0 : stats_rad_zt%jj = nlat
1203 0 : allocate( stats_rad_zt%z( stats_rad_zt%kk ) )
1204 0 : stats_rad_zt%z = grad_zt
1205 :
1206 0 : allocate( stats_rad_zt%accum_field_values( stats_rad_zt%ii, stats_rad_zt%jj, &
1207 0 : stats_rad_zt%kk, stats_rad_zt%num_output_fields ) )
1208 0 : allocate( stats_rad_zt%accum_num_samples( stats_rad_zt%ii, stats_rad_zt%jj, &
1209 0 : stats_rad_zt%kk, stats_rad_zt%num_output_fields ) )
1210 0 : allocate( stats_rad_zt%l_in_update( stats_rad_zt%ii, stats_rad_zt%jj, &
1211 0 : stats_rad_zt%kk, stats_rad_zt%num_output_fields ) )
1212 :
1213 : call stats_zero( stats_rad_zt%ii, stats_rad_zt%jj, stats_rad_zt%kk, & ! intent(in)
1214 : stats_rad_zt%num_output_fields, & ! intent(in)
1215 : stats_rad_zt%accum_field_values, & ! intent(out)
1216 0 : stats_rad_zt%accum_num_samples, stats_rad_zt%l_in_update )! intent(out)
1217 :
1218 0 : allocate( stats_rad_zt%file%grid_avg_var( stats_rad_zt%num_output_fields ) )
1219 0 : allocate( stats_rad_zt%file%z( stats_rad_zt%kk ) )
1220 :
1221 : call stats_init_rad_zt( vars_rad_zt, & ! intent(in)
1222 : l_error, & ! intent(inout)
1223 0 : stats_metadata, stats_rad_zt ) ! intent(inout)
1224 :
1225 0 : fname = trim( stats_metadata%fname_rad_zt )
1226 0 : if ( stats_metadata%l_grads ) then
1227 :
1228 : ! Open GrADS files
1229 : call open_grads( iunit, fdir, fname, & ! intent(in)
1230 : 1, stats_rad_zt%kk, nlat, nlon, stats_rad_zt%z, & ! intent(in)
1231 : day, month, year, lat_vals, lon_vals, &
1232 : time_current+real(stats_metadata%stats_tout, kind=time_precision), & !intent(in)
1233 : stats_metadata, stats_rad_zt%num_output_fields, & ! intent(in)
1234 0 : stats_rad_zt%file ) ! intent(inout)
1235 :
1236 : else ! Open NetCDF file
1237 : #ifdef NETCDF
1238 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, & ! intent(in)
1239 : 1, stats_rad_zt%kk, stats_rad_zt%z, & ! intent(in)
1240 : day, month, year, lat_vals, lon_vals, & ! intent(in)
1241 : time_current, stats_metadata%stats_tout, & ! intent(in)
1242 : stats_rad_zt%num_output_fields, & ! intent(in)
1243 : stats_rad_zt%file ) ! intent(inout)
1244 :
1245 : ! Finalize the variable definitions
1246 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
1247 : l_uv_nudge, & ! intent(in)
1248 : l_tke_aniso, & ! intent(in)
1249 : l_standard_term_ta, & ! intent(in)
1250 : stats_rad_zt%file ) ! intent(inout)
1251 :
1252 : if ( err_code == clubb_fatal_error ) then
1253 : write(fstderr,*) "Fatal error setting up stats_rad_zt"
1254 : return
1255 : end if
1256 : #else
1257 0 : error stop "This CLUBB program was not compiled with netCDF support."
1258 : #endif
1259 : end if
1260 :
1261 : ! Initialize stats_rad_zm (radiation points)
1262 :
1263 0 : ivar = 1
1264 0 : do while ( ichar(vars_rad_zm(ivar)(1:1)) /= 0 &
1265 : .and. len_trim(vars_rad_zm(ivar)) /= 0 &
1266 0 : .and. ivar <= nvarmax_rad_zm )
1267 0 : ivar = ivar + 1
1268 : end do
1269 0 : ntot = ivar - 1
1270 0 : if ( ntot == nvarmax_rad_zm ) then
1271 0 : write(fstderr,*) "There are more statistical variables listed in ", &
1272 0 : "vars_rad_zm than allowed for by nvarmax_rad_zm."
1273 0 : write(fstderr,*) "Check the number of variables listed for vars_rad_zm ", &
1274 0 : "in the stats namelist, or change nvarmax_rad_zm."
1275 0 : write(fstderr,*) "nvarmax_rad_zm = ", nvarmax_rad_zm
1276 0 : write(fstderr,*) "number of variables in vars_rad_zm = ", ntot
1277 0 : write(fstderr,*) "stats_init: number of rad_zm statistical variables exceeds limit"
1278 0 : err_code = clubb_fatal_error
1279 0 : return
1280 : end if
1281 :
1282 0 : stats_rad_zm%num_output_fields = ntot
1283 0 : stats_rad_zm%kk = nnrad_zm
1284 0 : stats_rad_zm%ii = nlon
1285 0 : stats_rad_zm%jj = nlat
1286 :
1287 0 : allocate( stats_rad_zm%z( stats_rad_zm%kk ) )
1288 0 : stats_rad_zm%z = grad_zm
1289 :
1290 0 : allocate( stats_rad_zm%accum_field_values( stats_rad_zm%ii, stats_rad_zm%jj, &
1291 0 : stats_rad_zm%kk, stats_rad_zm%num_output_fields ) )
1292 0 : allocate( stats_rad_zm%accum_num_samples( stats_rad_zm%ii, stats_rad_zm%jj, &
1293 0 : stats_rad_zm%kk, stats_rad_zm%num_output_fields ) )
1294 0 : allocate( stats_rad_zm%l_in_update( stats_rad_zm%ii, stats_rad_zm%jj, &
1295 0 : stats_rad_zm%kk, stats_rad_zm%num_output_fields ) )
1296 :
1297 : call stats_zero( stats_rad_zm%ii, stats_rad_zm%jj, stats_rad_zm%kk, & ! intent(in)
1298 : stats_rad_zm%num_output_fields, & ! intent(in)
1299 : stats_rad_zm%accum_field_values, & ! intent(out)
1300 0 : stats_rad_zm%accum_num_samples, stats_rad_zm%l_in_update ) ! intent(out)
1301 :
1302 0 : allocate( stats_rad_zm%file%grid_avg_var( stats_rad_zm%num_output_fields ) )
1303 0 : allocate( stats_rad_zm%file%z( stats_rad_zm%kk ) )
1304 :
1305 : call stats_init_rad_zm( vars_rad_zm, & ! intent(in)
1306 : l_error, & ! intent(inout)
1307 0 : stats_metadata, stats_rad_zm ) ! intent(inout)
1308 :
1309 0 : fname = trim( stats_metadata%fname_rad_zm )
1310 0 : if ( stats_metadata%l_grads ) then
1311 :
1312 : ! Open GrADS files
1313 : call open_grads( iunit, fdir, fname, & ! intent(in)
1314 : 1, stats_rad_zm%kk, nlat, nlon, stats_rad_zm%z, & ! intent(in)
1315 : day, month, year, lat_vals, lon_vals, &
1316 : time_current+real(stats_metadata%stats_tout,kind=time_precision), & !intent(in)
1317 : stats_metadata, stats_rad_zm%num_output_fields, & ! intent(in)
1318 0 : stats_rad_zm%file ) ! intent(inout)
1319 :
1320 : else ! Open NetCDF file
1321 : #ifdef NETCDF
1322 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, & ! intent(in)
1323 : 1, stats_rad_zm%kk, stats_rad_zm%z, & ! intent(in)
1324 : day, month, year, lat_vals, lon_vals, & ! intent(in)
1325 : time_current, stats_metadata%stats_tout, & ! intent(in)
1326 : stats_rad_zm%num_output_fields, & ! intent(in)
1327 : stats_rad_zm%file ) ! intent(inout)
1328 :
1329 : ! Finalize the variable definitions
1330 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
1331 : l_uv_nudge, & ! intent(in)
1332 : l_tke_aniso, & ! intent(in)
1333 : l_standard_term_ta, & ! intent(in)
1334 : stats_rad_zm%file ) ! intent(inout)
1335 :
1336 : if ( err_code == clubb_fatal_error ) then
1337 : write(fstderr,*) "Fatal error setting up stats_rad_zm"
1338 : return
1339 : end if
1340 :
1341 : if ( err_code == clubb_fatal_error ) return
1342 : #else
1343 0 : error stop "This CLUBB program was not compiled with netCDF support."
1344 : #endif
1345 : end if
1346 :
1347 : end if ! l_output_rad_files
1348 :
1349 :
1350 : ! Initialize stats_sfc (surface point)
1351 :
1352 0 : ivar = 1
1353 0 : do while ( ichar(vars_sfc(ivar)(1:1)) /= 0 &
1354 : .and. len_trim(vars_sfc(ivar)) /= 0 &
1355 0 : .and. ivar <= nvarmax_sfc )
1356 0 : ivar = ivar + 1
1357 : end do
1358 0 : ntot = ivar - 1
1359 0 : if ( ntot == nvarmax_sfc ) then
1360 0 : write(fstderr,*) "There are more statistical variables listed in ", &
1361 0 : "vars_sfc than allowed for by nvarmax_sfc."
1362 0 : write(fstderr,*) "Check the number of variables listed for vars_sfc ", &
1363 0 : "in the stats namelist, or change nvarmax_sfc."
1364 0 : write(fstderr,*) "nvarmax_sfc = ", nvarmax_sfc
1365 0 : write(fstderr,*) "number of variables in vars_sfc = ", ntot
1366 0 : write(fstderr,*) "stats_init: number of sfc statistical variables exceeds limit"
1367 0 : err_code = clubb_fatal_error
1368 0 : return
1369 :
1370 : end if
1371 :
1372 0 : stats_sfc%num_output_fields = ntot
1373 0 : stats_sfc%kk = 1
1374 0 : stats_sfc%ii = nlon
1375 0 : stats_sfc%jj = nlat
1376 :
1377 0 : allocate( stats_sfc%z( stats_sfc%kk ) )
1378 0 : stats_sfc%z = gzm(1)
1379 :
1380 0 : allocate( stats_sfc%accum_field_values( stats_sfc%ii, stats_sfc%jj, &
1381 0 : stats_sfc%kk, stats_sfc%num_output_fields ) )
1382 0 : allocate( stats_sfc%accum_num_samples( stats_sfc%ii, stats_sfc%jj, &
1383 0 : stats_sfc%kk, stats_sfc%num_output_fields ) )
1384 0 : allocate( stats_sfc%l_in_update( stats_sfc%ii, stats_sfc%jj, &
1385 0 : stats_sfc%kk, stats_sfc%num_output_fields ) )
1386 :
1387 : call stats_zero( stats_sfc%ii, stats_sfc%jj, stats_sfc%kk, stats_sfc%num_output_fields, & ! In
1388 0 : stats_sfc%accum_field_values, stats_sfc%accum_num_samples, stats_sfc%l_in_update ) ! out
1389 :
1390 0 : allocate( stats_sfc%file%grid_avg_var( stats_sfc%num_output_fields ) )
1391 0 : allocate( stats_sfc%file%z( stats_sfc%kk ) )
1392 :
1393 : call stats_init_sfc( vars_sfc, & ! intent(in)
1394 : l_error, & ! intent(inout)
1395 0 : stats_metadata, stats_sfc ) ! intent(inout)
1396 :
1397 0 : fname = trim( stats_metadata%fname_sfc )
1398 :
1399 0 : if ( stats_metadata%l_grads ) then
1400 :
1401 : ! Open GrADS files
1402 : call open_grads( iunit, fdir, fname, & ! intent(in)
1403 : 1, stats_sfc%kk, nlat, nlon, stats_sfc%z, & ! intent(in)
1404 : day, month, year, lat_vals, lon_vals, & ! intent(in)
1405 : time_current+real(stats_metadata%stats_tout,kind=time_precision), & !intent(in)
1406 : stats_metadata, stats_sfc%num_output_fields, & ! intent(in)
1407 0 : stats_sfc%file ) ! intent(inout)
1408 :
1409 : else ! Open NetCDF files
1410 : #ifdef NETCDF
1411 : call open_netcdf_for_writing( nlat, nlon, fdir, fname, 1, stats_sfc%kk, stats_sfc%z, & ! In
1412 : day, month, year, lat_vals, lon_vals, & ! In
1413 : time_current, stats_metadata%stats_tout, stats_sfc%num_output_fields, & ! In
1414 : stats_sfc%file ) ! InOut
1415 :
1416 : ! Finalize the variable definitions
1417 : call first_write( clubb_params, sclr_dim, sclr_tol, & ! intent(in)
1418 : l_uv_nudge, & ! intent(in)
1419 : l_tke_aniso, & ! intent(in)
1420 : l_standard_term_ta, & ! intent(in)
1421 : stats_sfc%file ) ! intent(inout)
1422 :
1423 : if ( err_code == clubb_fatal_error ) then
1424 : write(fstderr,*) "Fatal error setting up stats_sfc"
1425 : return
1426 : end if
1427 : #else
1428 0 : error stop "This CLUBB program was not compiled with netCDF support."
1429 : #endif
1430 : end if
1431 :
1432 : ! Check for errors
1433 :
1434 0 : if ( l_error ) then
1435 0 : write(fstderr,*) 'stats_init: errors found'
1436 0 : err_code = clubb_fatal_error
1437 0 : return
1438 : endif
1439 :
1440 : return
1441 :
1442 : ! If namelist was not found in input file, turn off statistics
1443 :
1444 : 100 continue
1445 0 : write(fstderr,*) 'Error with statsnl, statistics is turned off'
1446 0 : stats_metadata%l_stats = .false.
1447 0 : stats_metadata%l_stats_samp = .false.
1448 0 : stats_metadata%l_stats_last = .false.
1449 :
1450 0 : if ( err_code == clubb_fatal_error ) error stop
1451 :
1452 : return
1453 :
1454 : end subroutine stats_init
1455 :
1456 : !-----------------------------------------------------------------------
1457 0 : subroutine stats_zero( ii, jj, kk, nn, &
1458 0 : x, n, l_in_update )
1459 :
1460 : ! Description:
1461 : ! Initialize stats to zero
1462 : ! References:
1463 : ! None
1464 : !-----------------------------------------------------------------------
1465 : use clubb_precision, only: &
1466 : stat_rknd, & ! Variable(s)
1467 : stat_nknd
1468 :
1469 : implicit none
1470 :
1471 : ! Input Variable(s)
1472 : integer, intent(in) :: ii, jj, kk, nn
1473 :
1474 : ! Output Variable(s)
1475 : real(kind=stat_rknd), dimension(ii,jj,kk,nn), intent(out) :: x
1476 : integer(kind=stat_nknd), dimension(ii,jj,kk,nn), intent(out) :: n
1477 : logical, dimension(ii,jj,kk,nn), intent(out) :: l_in_update
1478 :
1479 : ! Zero out arrays
1480 :
1481 0 : if ( nn > 0 ) then
1482 0 : x(:,:,:,:) = 0.0_stat_rknd
1483 0 : n(:,:,:,:) = 0_stat_nknd
1484 0 : l_in_update(:,:,:,:) = .false.
1485 : end if
1486 :
1487 0 : return
1488 : end subroutine stats_zero
1489 :
1490 : !-----------------------------------------------------------------------
1491 0 : subroutine stats_avg( ii, jj, kk, nn, n, &
1492 0 : x )
1493 :
1494 : ! Description:
1495 : ! Compute the average of stats fields
1496 : ! References:
1497 : ! None
1498 : !-----------------------------------------------------------------------
1499 : use clubb_precision, only: &
1500 : stat_rknd, & ! Variable(s)
1501 : stat_nknd
1502 :
1503 : use stat_file_module, only: &
1504 : clubb_i, clubb_j ! Variable(s)
1505 :
1506 : implicit none
1507 :
1508 : ! External
1509 : intrinsic :: real
1510 :
1511 : ! Input Variable(s)
1512 : integer, intent(in) :: &
1513 : ii, & ! Number of points in X (i.e. latitude) dimension
1514 : jj, & ! Number of points in Y (i.e. longitude) dimension
1515 : kk, & ! Number of levels in vertical (i.e. Z) dimension
1516 : nn ! Number of variables being output to disk (e.g. cloud_frac, rain rate, etc.)
1517 :
1518 : integer(kind=stat_nknd), dimension(ii,jj,kk,nn), intent(in) :: &
1519 : n ! n is the number of samples for each of the nn fields
1520 : ! and each of the kk vertical levels
1521 :
1522 : ! Output Variable(s)
1523 : real(kind=stat_rknd), dimension(ii,jj,kk,nn), intent(inout) :: &
1524 : x ! The variable x contains the cumulative sums of n sample values of each of
1525 : ! the nn output fields (e.g. the sum of the sampled rain rate values)
1526 :
1527 : ! ---- Begin Code ----
1528 :
1529 : ! Compute averages
1530 0 : where ( n(1,1,1:kk,1:nn) > 0 )
1531 0 : x(clubb_i,clubb_j,1:kk,1:nn) = x(clubb_i,clubb_j,1:kk,1:nn) &
1532 : / real( n(clubb_i,clubb_j,1:kk,1:nn), kind=stat_rknd )
1533 : end where
1534 :
1535 0 : return
1536 : end subroutine stats_avg
1537 :
1538 : !-----------------------------------------------------------------------
1539 0 : subroutine stats_begin_timestep( itime, stats_nsamp, stats_nout, &
1540 : stats_metadata )
1541 :
1542 : ! Description:
1543 : ! Given the elapsed time, set flags determining specifics such as
1544 : ! if this time set should be sampled or if this is the first or
1545 : ! last time step.
1546 : !-----------------------------------------------------------------------
1547 :
1548 : use stats_variables, only: &
1549 : stats_metadata_type
1550 :
1551 : implicit none
1552 :
1553 : ! External
1554 : intrinsic :: mod
1555 :
1556 : ! Input Variable(s)
1557 : integer, intent(in) :: &
1558 : itime, & ! Elapsed model time [timestep]
1559 : stats_nsamp, & ! Stats sampling interval [timestep]
1560 : stats_nout ! Stats output interval [timestep]
1561 :
1562 : type (stats_metadata_type), intent(inout) :: &
1563 : stats_metadata
1564 :
1565 0 : if ( .not. stats_metadata%l_stats ) return
1566 :
1567 : ! Only sample time steps that are multiples of "stats_tsamp"
1568 : ! in a case's "model.in" file to shorten length of run
1569 0 : if ( mod( itime, stats_nsamp ) == 0 ) then
1570 0 : stats_metadata%l_stats_samp = .true.
1571 : else
1572 0 : stats_metadata%l_stats_samp = .false.
1573 : end if
1574 :
1575 : ! Indicates the end of the sampling time period. Signals to start writing to the file
1576 0 : if ( mod( itime, stats_nout ) == 0 ) then
1577 0 : stats_metadata%l_stats_last = .true.
1578 : else
1579 0 : stats_metadata%l_stats_last = .false.
1580 : end if
1581 :
1582 : return
1583 :
1584 : end subroutine stats_begin_timestep
1585 :
1586 : !-----------------------------------------------------------------------
1587 0 : subroutine stats_end_timestep( clubb_params, stats_metadata, & ! intent(in)
1588 : stats_zt, stats_zm, stats_sfc, & ! intent(inout)
1589 : stats_lh_zt, stats_lh_sfc, & ! intent(inout)
1590 : stats_rad_zt, stats_rad_zm & ! intent(inout)
1591 : #ifdef NETCDF
1592 : , l_uv_nudge, &
1593 : l_tke_aniso, &
1594 : l_standard_term_ta &
1595 : #endif
1596 : )
1597 :
1598 : ! Description:
1599 : ! Called when the stats timestep has ended. This subroutine
1600 : ! is responsible for calling statistics to be written to the output
1601 : ! format.
1602 : !
1603 : ! References:
1604 : ! None
1605 : !-----------------------------------------------------------------------
1606 :
1607 : use clubb_precision, only: &
1608 : core_rknd ! Variable(s)
1609 :
1610 : use constants_clubb, only: &
1611 : fstderr ! Constant(s)
1612 :
1613 : use stats_variables, only: &
1614 : stats_metadata_type
1615 :
1616 : use output_grads, only: &
1617 : write_grads ! Procedure(s)
1618 :
1619 : use stat_file_module, only: &
1620 : clubb_i, & ! Variable(s)
1621 : clubb_j
1622 :
1623 : use parameter_indices, only: &
1624 : nparams ! Variable(s)
1625 :
1626 : #ifdef NETCDF
1627 : use output_netcdf, only: &
1628 : write_netcdf ! Procedure(s)
1629 : #endif
1630 :
1631 : use error_code, only : &
1632 : err_code, & ! Error Indicator
1633 : clubb_fatal_error ! Constant
1634 :
1635 : use stats_type, only: stats ! Type
1636 :
1637 : implicit none
1638 :
1639 : real( kind = core_rknd ), dimension(nparams), intent(in) :: &
1640 : clubb_params ! Array of CLUBB's tunable parameters [units vary]
1641 :
1642 : type (stats_metadata_type), intent(in) :: &
1643 : stats_metadata
1644 :
1645 : type (stats), target, intent(inout) :: &
1646 : stats_zt, &
1647 : stats_zm, &
1648 : stats_sfc, &
1649 : stats_lh_zt, &
1650 : stats_lh_sfc, &
1651 : stats_rad_zt, &
1652 : stats_rad_zm
1653 :
1654 : ! External
1655 : intrinsic :: floor
1656 :
1657 : #ifdef NETCDF
1658 : ! Input Variables
1659 : logical, intent(in) :: &
1660 : l_uv_nudge, & ! For wind speed nudging.
1661 : l_tke_aniso, & ! For anisotropic turbulent kinetic energy, i.e.
1662 : ! TKE = 1/2 (u'^2 + v'^2 + w'^2)
1663 : l_standard_term_ta ! Use the standard discretization for the turbulent advection terms.
1664 : ! Setting to .false. means that a_1 and a_3 are pulled outside of the
1665 : ! derivative in advance_wp2_wp3_module.F90 and in
1666 : ! advance_xp2_xpyp_module.F90.
1667 : #endif
1668 :
1669 : ! Local Variables
1670 :
1671 : logical :: l_error
1672 :
1673 : ! ---- Begin Code ----
1674 :
1675 : ! Check if it is time to write to file
1676 :
1677 0 : if ( .not. stats_metadata%l_stats_last ) return
1678 :
1679 : ! Initialize
1680 0 : l_error = .false.
1681 :
1682 : call stats_check_num_samples( stats_zt, stats_metadata, & ! intent(in)
1683 0 : l_error ) ! intent(inout)
1684 : call stats_check_num_samples( stats_zm, stats_metadata, & ! intent(in)
1685 0 : l_error ) ! intent(inout)
1686 : call stats_check_num_samples( stats_sfc, stats_metadata, & ! intent(in)
1687 0 : l_error ) ! intent(inout)
1688 0 : if ( stats_metadata%l_silhs_out ) then
1689 : call stats_check_num_samples( stats_lh_zt, stats_metadata, & ! intent(in)
1690 0 : l_error ) ! intent(inout)
1691 : call stats_check_num_samples( stats_lh_sfc, stats_metadata, & ! intent(in)
1692 0 : l_error ) ! intent(inout)
1693 : end if
1694 0 : if ( stats_metadata%l_output_rad_files ) then
1695 : call stats_check_num_samples( stats_rad_zt, stats_metadata, & ! intent(in)
1696 0 : l_error ) ! intent(inout)
1697 : call stats_check_num_samples( stats_rad_zm, stats_metadata, & ! intent(in)
1698 0 : l_error ) ! intent(inout)
1699 : end if
1700 :
1701 : ! Return if errors are found.
1702 0 : if ( l_error ) then
1703 0 : write(fstderr,*) 'Possible statistical sampling error'
1704 0 : write(fstderr,*) 'For details, set debug_level to a value of at ', &
1705 0 : 'least 1 in the appropriate model.in file.'
1706 0 : write(fstderr,*) 'stats_end_timestep: error(s) found'
1707 0 : err_code = clubb_fatal_error
1708 0 : return
1709 : end if ! l_error
1710 :
1711 : ! Compute averages
1712 : call stats_avg( stats_zt%ii, stats_zt%jj, stats_zt%kk, stats_zt%num_output_fields, & ! In
1713 : stats_zt%accum_num_samples, & ! intent(in)
1714 0 : stats_zt%accum_field_values ) ! intent(inout)
1715 : call stats_avg( stats_zm%ii, stats_zm%jj, stats_zm%kk, stats_zm%num_output_fields, & ! In
1716 : stats_zm%accum_num_samples, & ! intent(in)
1717 0 : stats_zm%accum_field_values ) ! intent(inout)
1718 0 : if ( stats_metadata%l_silhs_out ) then
1719 : call stats_avg( stats_lh_zt%ii, stats_lh_zt%jj, stats_lh_zt%kk, & ! intent(in)
1720 : stats_lh_zt%num_output_fields, stats_lh_zt%accum_num_samples, & ! intent(in)
1721 0 : stats_lh_zt%accum_field_values ) ! intent(inout)
1722 : call stats_avg( stats_lh_sfc%ii, stats_lh_sfc%jj, stats_lh_sfc%kk, & ! intent(in)
1723 : stats_lh_sfc%num_output_fields, stats_lh_sfc%accum_num_samples, & ! intent(in)
1724 0 : stats_lh_sfc%accum_field_values ) ! intent(inout)
1725 : end if
1726 0 : if ( stats_metadata%l_output_rad_files ) then
1727 : call stats_avg( stats_rad_zt%ii, stats_rad_zt%jj, stats_rad_zt%kk, & ! intent(in)
1728 : stats_rad_zt%num_output_fields, & ! intent(in)
1729 : stats_rad_zt%accum_num_samples, & ! intent(in)
1730 0 : stats_rad_zt%accum_field_values ) ! intent(inout)
1731 : call stats_avg( stats_rad_zm%ii, stats_rad_zm%jj, stats_rad_zm%kk, & ! intent(in)
1732 : stats_rad_zm%num_output_fields, & ! intent(in)
1733 : stats_rad_zm%accum_num_samples, & ! intent(in)
1734 0 : stats_rad_zm%accum_field_values ) ! intent(inout)
1735 : end if
1736 : call stats_avg( stats_sfc%ii, stats_sfc%jj, stats_sfc%kk, stats_sfc%num_output_fields, & ! In
1737 : stats_sfc%accum_num_samples, & ! intent(in)
1738 0 : stats_sfc%accum_field_values ) ! intent(inout)
1739 :
1740 : ! Only write to the file and zero out the stats fields if we've reach the horizontal
1741 : ! limits of the domain (this is always true in the single-column case because it's 1x1).
1742 0 : if ( clubb_i == stats_zt%ii .and. clubb_j == stats_zt%jj ) then
1743 : ! Write to file
1744 0 : if ( stats_metadata%l_grads ) then
1745 0 : call write_grads( stats_zt%file ) ! intent(inout)
1746 0 : call write_grads( stats_zm%file ) ! intent(inout)
1747 0 : if ( stats_metadata%l_silhs_out ) then
1748 0 : call write_grads( stats_lh_zt%file ) ! intent(inout)
1749 0 : call write_grads( stats_lh_sfc%file ) ! intent(inout)
1750 : end if
1751 0 : if ( stats_metadata%l_output_rad_files ) then
1752 0 : call write_grads( stats_rad_zt%file ) ! intent(inout)
1753 0 : call write_grads( stats_rad_zm%file ) ! intent(inout)
1754 : end if
1755 0 : call write_grads( stats_sfc%file ) ! intent(inout)
1756 : else ! l_netcdf
1757 :
1758 : #ifdef NETCDF
1759 : call write_netcdf( stats_zt%file ) ! intent(inout)
1760 :
1761 : call write_netcdf( stats_zm%file ) ! intent(inout)
1762 :
1763 : if ( stats_metadata%l_silhs_out ) then
1764 :
1765 : call write_netcdf( stats_lh_zt%file ) ! intent(inout)
1766 :
1767 : call write_netcdf( stats_lh_sfc%file ) ! intent(inout)
1768 :
1769 : end if
1770 : if ( stats_metadata%l_output_rad_files ) then
1771 :
1772 : call write_netcdf( stats_rad_zt%file ) ! intent(inout)
1773 :
1774 : call write_netcdf( stats_rad_zm%file ) ! intent(inout)
1775 :
1776 : end if
1777 :
1778 : call write_netcdf( stats_sfc%file ) ! intent(inout)
1779 :
1780 : if ( err_code == clubb_fatal_error ) return
1781 : #else
1782 0 : error stop "This program was not compiled with netCDF support"
1783 : #endif /* NETCDF */
1784 : end if ! l_grads
1785 :
1786 : ! Reset sample fields
1787 : call stats_zero( stats_zt%ii, stats_zt%jj, stats_zt%kk, stats_zt%num_output_fields, & ! In
1788 0 : stats_zt%accum_field_values, stats_zt%accum_num_samples, stats_zt%l_in_update ) ! out
1789 : call stats_zero( stats_zm%ii, stats_zm%jj, stats_zm%kk, stats_zm%num_output_fields, & ! In
1790 0 : stats_zm%accum_field_values, stats_zm%accum_num_samples, stats_zm%l_in_update ) ! Out
1791 0 : if ( stats_metadata%l_silhs_out ) then
1792 : call stats_zero( stats_lh_zt%ii, stats_lh_zt%jj, stats_lh_zt%kk, & ! intent(in)
1793 : stats_lh_zt%num_output_fields, & ! intent(in)
1794 : stats_lh_zt%accum_field_values, & ! intent(out)
1795 0 : stats_lh_zt%accum_num_samples, stats_lh_zt%l_in_update ) ! intent(out)
1796 : call stats_zero( stats_lh_sfc%ii, stats_lh_sfc%jj, stats_lh_sfc%kk, & ! intent(in)
1797 : stats_lh_sfc%num_output_fields, & ! intent(in)
1798 : stats_lh_sfc%accum_field_values, & ! intent(out)
1799 0 : stats_lh_sfc%accum_num_samples, stats_lh_sfc%l_in_update ) ! intent(out)
1800 : end if
1801 0 : if ( stats_metadata%l_output_rad_files ) then
1802 : call stats_zero( stats_rad_zt%ii, stats_rad_zt%jj, stats_rad_zt%kk, & ! intent(in)
1803 : stats_rad_zt%num_output_fields, & ! intent(in)
1804 : stats_rad_zt%accum_field_values, & ! intent(out)
1805 0 : stats_rad_zt%accum_num_samples, stats_rad_zt%l_in_update ) ! intent(out)
1806 : call stats_zero( stats_rad_zt%ii, stats_rad_zt%jj, stats_rad_zm%kk, & ! intent(in)
1807 : stats_rad_zm%num_output_fields, & ! intent(in)
1808 : stats_rad_zm%accum_field_values, & ! intent(out)
1809 0 : stats_rad_zm%accum_num_samples, stats_rad_zm%l_in_update ) ! intent(out)
1810 : end if
1811 : call stats_zero( stats_sfc%ii, stats_sfc%jj, stats_sfc%kk, stats_sfc%num_output_fields, & !IN
1812 : stats_sfc%accum_field_values, & ! intent(out)
1813 0 : stats_sfc%accum_num_samples, stats_sfc%l_in_update ) ! intent(out)
1814 :
1815 : end if ! clubb_i = stats_zt%ii .and. clubb_j == stats_zt%jj
1816 :
1817 :
1818 : return
1819 : end subroutine stats_end_timestep
1820 :
1821 : !----------------------------------------------------------------------
1822 0 : subroutine stats_accumulate( &
1823 : nz, sclr_dim, edsclr_dim, &
1824 0 : invrs_dzm, zt, dzm, dzt, dt, &
1825 0 : um, vm, upwp, vpwp, up2, vp2, &
1826 0 : thlm, rtm, wprtp, wpthlp, &
1827 0 : wp2, wp3, rtp2, rtp3, thlp2, thlp3, rtpthlp, &
1828 0 : wpthvp, wp2thvp, rtpthvp, thlpthvp, &
1829 0 : p_in_Pa, exner, rho, rho_zm, &
1830 0 : rho_ds_zm, rho_ds_zt, thv_ds_zm, thv_ds_zt, &
1831 0 : wm_zt, wm_zm, rcm, wprcp, rc_coef, rc_coef_zm, &
1832 0 : rcm_zm, rtm_zm, thlm_zm, cloud_frac, ice_supersat_frac, &
1833 0 : cloud_frac_zm, ice_supersat_frac_zm, rcm_in_layer, &
1834 0 : cloud_cover, rcm_supersat_adj, sigma_sqd_w, &
1835 0 : thvm, ug, vg, Lscale, wpthlp2, wp2thlp, wprtp2, wp2rtp, &
1836 0 : Lscale_up, Lscale_down, tau_zt, Kh_zt, wp2rcp, &
1837 0 : wprtpthlp, sigma_sqd_w_zt, rsat, wp2_zt, thlp2_zt, &
1838 0 : wpthlp_zt, wprtp_zt, rtp2_zt, rtpthlp_zt, up2_zt, &
1839 0 : vp2_zt, upwp_zt, vpwp_zt, wpup2, wpvp2, &
1840 0 : wp2up2, wp2vp2, wp4, &
1841 0 : tau_zm, Kh_zm, thlprcp, &
1842 0 : rtprcp, rcp2, em, a3_coef, a3_coef_zt, &
1843 0 : wp3_zm, wp3_on_wp2, wp3_on_wp2_zt, Skw_velocity, &
1844 0 : w_up_in_cloud, w_down_in_cloud, cloudy_updraft_frac, &
1845 0 : cloudy_downdraft_frac, pdf_params, pdf_params_zm, &
1846 0 : sclrm, sclrp2, sclrprtp, sclrpthlp, sclrm_forcing, sclrpthvp, &
1847 0 : wpsclrp, sclrprcp, wp2sclrp, wpsclrp2, wpsclrprtp, &
1848 0 : wpsclrpthlp, wpedsclrp, edsclrm, edsclrm_forcing, &
1849 : saturation_formula, &
1850 : stats_metadata, &
1851 : stats_zt, stats_zm, stats_sfc )
1852 :
1853 : ! Description:
1854 : ! Accumulate those stats variables that are preserved in CLUBB from timestep to
1855 : ! timestep, but not those stats that are not, (e.g. budget terms, longwave and
1856 : ! shortwave components, etc.)
1857 : !
1858 : ! References:
1859 : ! None
1860 : !----------------------------------------------------------------------
1861 :
1862 : use constants_clubb, only: &
1863 : cloud_frac_min, & ! Constant
1864 : eps
1865 :
1866 : use pdf_utilities, only: &
1867 : compute_variance_binormal ! Procedure
1868 :
1869 : use stats_variables, only: &
1870 : stats_metadata_type
1871 :
1872 : use grid_class, only: &
1873 : zt2zm ! Procedure(s)
1874 :
1875 : use pdf_parameter_module, only: &
1876 : pdf_parameter ! Type
1877 :
1878 : use T_in_K_module, only: &
1879 : thlm2T_in_K ! Procedure
1880 :
1881 : use constants_clubb, only: &
1882 : rc_tol, fstderr ! Constant(s)
1883 :
1884 : use stats_type_utilities, only: &
1885 : stat_update_var, & ! Procedure(s)
1886 : stat_update_var_pt
1887 :
1888 : use advance_helper_module, only: &
1889 : vertical_avg, & ! Procedure(s)
1890 : vertical_integral
1891 :
1892 : use interpolation, only: &
1893 : lin_interpolate_two_points ! Procedure
1894 :
1895 : use saturation, only: &
1896 : sat_mixrat_ice ! Procedure
1897 :
1898 : use clubb_precision, only: &
1899 : core_rknd ! Variable(s)
1900 :
1901 : use stats_type, only: stats ! Type
1902 :
1903 : implicit none
1904 :
1905 : ! Input Variable(s)
1906 : integer, intent(in) :: &
1907 : nz, &
1908 : sclr_dim, &
1909 : edsclr_dim
1910 :
1911 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1912 : invrs_dzm, & ! The inverse spacing between thermodynamic grid
1913 : ! levels; centered over momentum grid levels.
1914 : zt, & ! Thermo grid
1915 : dzm, & ! Spacing between thermodynamic grid levels; centered over
1916 : ! momentum grid levels
1917 : dzt ! Spcaing between momentum grid levels; centered over
1918 : ! thermodynamic grid levels
1919 :
1920 : real( kind = core_rknd ), intent(in) :: &
1921 : dt ! Model timestep [s]
1922 :
1923 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1924 : um, & ! u wind (thermodynamic levels) [m/s]
1925 : vm, & ! v wind (thermodynamic levels) [m/s]
1926 : upwp, & ! vertical u momentum flux (m levs.) [m^2/s^2]
1927 : vpwp, & ! vertical v momentum flux (m levs.) [m^2/s^2]
1928 : up2, & ! < u'^2 > (momentum levels) [m^2/s^2]
1929 : vp2, & ! < v'^2 > (momentum levels) [m^2/s^2]
1930 : thlm, & ! liquid potential temperature (t levs.) [K]
1931 : rtm, & ! total water mixing ratio (t levs.) [kg/kg]
1932 : wprtp, & ! < w' r_t' > (momentum levels) [m/s kg/kg]
1933 : wpthlp, & ! < w' th_l' > (momentum levels) [m/s K]
1934 : wp2, & ! < w'^2 > (momentum levels) [m^2/s^2]
1935 : wp3, & ! < w'^3 > (thermodynamic levels) [m^3/s^3]
1936 : rtp2, & ! < r_t'^2 > (momentum levels) [(kg/kg)^2]
1937 : rtp3, & ! < r_t'^3 > (thermodynamic levels) [(kg/kg)^3]
1938 : thlp2, & ! < th_l'^2 > (momentum levels) [K^2]
1939 : thlp3, & ! < th_l'^3 > (thermodynamic levels) [K^3]
1940 : rtpthlp, & ! < r_t' th_l' > (momentum levels) [kg/kg K]
1941 : wpthvp, & ! < w' th_v' > (momentum levels) [kg/kg K]
1942 : wp2thvp, & ! < w'^2 th_v' > (thermodynamic levels) [m^2/s^2 K]
1943 : rtpthvp, & ! < r_t' th_v' > (momentum levels) [kg/kg K]
1944 : thlpthvp ! < th_l' th_v' > (momentum levels) [K^2]
1945 :
1946 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1947 : p_in_Pa, & ! Pressure (Pa) on thermodynamic points [Pa]
1948 : exner, & ! Exner function = ( p / p0 ) ** kappa [-]
1949 : rho, & ! Density (thermodynamic levels) [kg/m^3]
1950 : rho_zm, & ! Density on momentum levels [kg/m^3]
1951 : rho_ds_zm, & ! Dry, static density (momentum levels) [kg/m^3]
1952 : rho_ds_zt, & ! Dry, static density (thermo. levs.) [kg/m^3]
1953 : thv_ds_zm, & ! Dry, base-state theta_v (momentum levs.) [K]
1954 : thv_ds_zt, & ! Dry, base-state theta_v (thermo. levs.) [K]
1955 : wm_zt, & ! w on thermodynamic levels [m/s]
1956 : wm_zm ! w on momentum levels [m/s]
1957 :
1958 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1959 : rcm_zm, & ! Cloud water mixing ratio on m levs. [kg/kg]
1960 : rtm_zm, & ! Total water mixing ratio on m levs. [kg/kg]
1961 : thlm_zm, & ! Liquid potential temperature on m levs. [K]
1962 : rcm, & ! Cloud water mixing ratio (t levs.) [kg/kg]
1963 : wprcp, & ! < w' r_c' > (momentum levels) [m/s kg/kg]
1964 : rc_coef, & ! Coefficient of X'r_c' (t-levs.) [K/(kg/kg)]
1965 : rc_coef_zm, & ! Coefficient of X'r_c' on m-levs. [K/(kg/kg)]
1966 : cloud_frac, & ! Cloud fraction (thermodynamic levels) [-]
1967 : ice_supersat_frac, & ! Ice cloud fracion (thermodynamic levels) [-]
1968 : cloud_frac_zm, & ! Cloud fraction on zm levels [-]
1969 : ice_supersat_frac_zm, & ! Ice cloud fraction on zm levels [-]
1970 : rcm_in_layer, & ! Cloud water mixing ratio in cloud layer [kg/kg]
1971 : cloud_cover, & ! Cloud cover [-]
1972 : rcm_supersat_adj ! rcm adjustment due to supersaturation [kg/kg]
1973 :
1974 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1975 : sigma_sqd_w ! PDF width parameter (momentum levels) [-]
1976 :
1977 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1978 : thvm, & ! Virtual potential temperature [K]
1979 : ug, & ! u geostrophic wind [m/s]
1980 : vg, & ! v geostrophic wind [m/s]
1981 : Lscale, & ! Length scale [m]
1982 : wpthlp2, & ! w'thl'^2 [m K^2/s]
1983 : wp2thlp, & ! w'^2 thl' [m^2 K/s^2]
1984 : wprtp2, & ! w'rt'^2 [m/s kg^2/kg^2]
1985 : wp2rtp, & ! w'^2rt' [m^2/s^2 kg/kg]
1986 : Lscale_up, & ! Length scale (upwards component) [m]
1987 : Lscale_down, & ! Length scale (downwards component) [m]
1988 : tau_zt, & ! Eddy diss. time scale; thermo. levs. [s]
1989 : Kh_zt, & ! Eddy diff. coef. on thermo. levels [m^2/s]
1990 : wp2rcp, & ! w'^2 rc' [m^2/s^2 kg/kg]
1991 : wprtpthlp, & ! w'rt'thl' [m/s kg/kg K]
1992 : sigma_sqd_w_zt, & ! PDF width parameter (thermo. levels) [-]
1993 : rsat ! Saturation mixing ratio [kg/kg]
1994 :
1995 : real( kind = core_rknd ), intent(in), dimension(nz) :: &
1996 : wp2_zt, & ! w'^2 on thermo. grid [m^2/s^2]
1997 : thlp2_zt, & ! thl'^2 on thermo. grid [K^2]
1998 : wpthlp_zt, & ! w'thl' on thermo. grid [m K/s]
1999 : wprtp_zt, & ! w'rt' on thermo. grid [m kg/(kg s)]
2000 : rtp2_zt, & ! rt'^2 on therm. grid [(kg/kg)^2]
2001 : rtpthlp_zt, & ! rt'thl' on thermo. grid [kg K/kg]
2002 : up2_zt, & ! u'^2 on thermo. grid [m^2/s^2]
2003 : vp2_zt, & ! v'^2 on thermo. grid [m^2/s^2]
2004 : upwp_zt, & ! u'w' on thermo. grid [m^2/s^2]
2005 : vpwp_zt, & ! v'w' on thermo. grid [m^2/s^2]
2006 : wpup2, & ! w'u'^2 (thermodynamic levels) [m^3/s^3]
2007 : wpvp2, & ! w'v'^2 (thermodynamic levels) [m^3/s^3]
2008 : wp2up2, & ! < w'^2u'^2 > (momentum levels) [m^4/s^4]
2009 : wp2vp2, & ! < w'^2v'^2 > (momentum levels) [m^4/s^4]
2010 : wp4, & ! < w'^4 > (momentum levels) [m^4/s^4]
2011 : tau_zm, & ! Eddy diss. time scale; momentum levs. [s]
2012 : Kh_zm, & ! Eddy diff. coef. on momentum levels [m^2/s]
2013 : thlprcp, & ! thl'rc' [K kg/kg]
2014 : rtprcp, & ! rt'rc' [kg^2/kg^2]
2015 : rcp2, & ! rc'^2 [kg^2/kg^2]
2016 : em, & ! Turbulent Kinetic Energy (TKE) [m^2/s^2]
2017 : a3_coef, & ! The a3 coefficient from CLUBB eqns [-]
2018 : a3_coef_zt, & ! The a3 coef. interp. to the zt grid [-]
2019 : wp3_zm, & ! w'^3 interpolated to momentum levels [m^3/s^3]
2020 : wp3_on_wp2, & ! w'^3 / w'^2 on the zm grid [m/s]
2021 : wp3_on_wp2_zt, & ! w'^3 / w'^2 on the zt grid [m/s]
2022 : Skw_velocity, & ! Skewness velocity [m/s]
2023 : w_up_in_cloud, & ! Mean cloudy updraft speed [m/s]
2024 : w_down_in_cloud, & ! Mean cloudy downdraft speed [m/s]
2025 : cloudy_updraft_frac, & ! Cloudy updraft fraction [-]
2026 : cloudy_downdraft_frac ! Cloudy downdraft fraction [-]
2027 :
2028 : type(pdf_parameter), intent(in) :: &
2029 : pdf_params, & ! PDF parameters (thermodynamic levels) [units vary]
2030 : pdf_params_zm ! PDF parameters on momentum levels [units vary]
2031 :
2032 : real( kind = core_rknd ), intent(in), dimension(nz,sclr_dim) :: &
2033 : sclrm, & ! High-order passive scalar [units vary]
2034 : sclrp2, & ! High-order passive scalar variance [units^2]
2035 : sclrprtp, & ! High-order passive scalar covariance [units kg/kg]
2036 : sclrpthlp, & ! High-order passive scalar covariance [units K]
2037 : sclrm_forcing, & ! Large-scale forcing of scalar [units/s]
2038 : sclrpthvp, & ! High-order passive scalar covariance [units K]
2039 : wpsclrp ! w'sclr' [units m/s]
2040 :
2041 : real( kind = core_rknd ), intent(in), dimension(nz,sclr_dim) :: &
2042 : sclrprcp, & ! sclr'rc' [units vary]
2043 : wp2sclrp, & ! w'^2 sclr' [units vary]
2044 : wpsclrp2, & ! w'sclr'^2 [units vary]
2045 : wpsclrprtp, & ! w'sclr'rt' [units vary]
2046 : wpsclrpthlp ! w'sclr'thl' [units vary]
2047 :
2048 : real( kind = core_rknd ), intent(in), dimension(nz,edsclr_dim) :: &
2049 : wpedsclrp, & ! w'edsclr' [units vary]
2050 : edsclrm, & ! Eddy-diff passive scalar [units vary]
2051 : edsclrm_forcing ! Large-scale forcing of edscalar [units vary]
2052 :
2053 : integer, intent(in) :: &
2054 : saturation_formula
2055 :
2056 : type (stats_metadata_type), intent(in) :: &
2057 : stats_metadata
2058 :
2059 : type (stats), target, intent(inout) :: &
2060 : stats_zt, &
2061 : stats_zm, &
2062 : stats_sfc
2063 :
2064 : ! Local Variables
2065 :
2066 : integer :: isclr, k
2067 : integer :: grid_level = 1 ! grid level for stats where there is only one sensible level (eg timeseries)
2068 :
2069 : real( kind = core_rknd ), dimension(nz) :: &
2070 0 : T_in_K, & ! Absolute temperature [K]
2071 0 : rsati, & ! Saturation w.r.t ice [kg/kg]
2072 0 : shear, & ! Wind shear production term [m^2/s^3]
2073 0 : chi, & ! Mellor's 's' [kg/kg]
2074 0 : chip2, & ! Variance of Mellor's 's' [kg/kg]
2075 0 : rcm_in_cloud ! rcm in cloud [kg/kg]
2076 :
2077 : real( kind = core_rknd ) :: xtmp
2078 :
2079 : ! ---- Begin Code ----
2080 :
2081 : ! Sample fields
2082 :
2083 0 : if ( stats_metadata%l_stats_samp ) then
2084 :
2085 : ! stats_zt variables
2086 :
2087 :
2088 0 : if ( stats_metadata%iT_in_K > 0 .or. stats_metadata%irsati > 0 ) then
2089 0 : T_in_K = thlm2T_in_K( nz, thlm, exner, rcm )
2090 : else
2091 0 : T_in_K = -999._core_rknd
2092 : end if
2093 :
2094 : call stat_update_var( stats_metadata%iT_in_K, T_in_K, & ! intent(in)
2095 0 : stats_zt ) ! intent(inout)
2096 :
2097 : call stat_update_var( stats_metadata%ithlm, thlm, & ! intent(in)
2098 0 : stats_zt ) ! intent(inout)
2099 : call stat_update_var( stats_metadata%ithvm, thvm, & ! intent(in)
2100 0 : stats_zt ) ! intent(inout)
2101 : call stat_update_var( stats_metadata%irtm, rtm, & ! intent(in)
2102 0 : stats_zt ) ! intent(inout)
2103 : call stat_update_var( stats_metadata%ircm, rcm, & ! intent(in)
2104 0 : stats_zt ) ! intent(inout)
2105 : call stat_update_var( stats_metadata%ium, um, & ! intent(in)
2106 0 : stats_zt ) ! intent(inout)
2107 : call stat_update_var( stats_metadata%ivm, vm, & ! intent(in)
2108 0 : stats_zt ) ! intent(inout)
2109 : call stat_update_var( stats_metadata%iwm_zt, wm_zt, & ! intent(in)
2110 0 : stats_zt ) ! intent(inout)
2111 : call stat_update_var( stats_metadata%iwm_zm, wm_zm, & ! intent(in)
2112 0 : stats_zm ) ! intent(inout)
2113 : call stat_update_var( stats_metadata%iug, ug, & ! intent(in)
2114 0 : stats_zt ) ! intent(inout)
2115 : call stat_update_var( stats_metadata%ivg, vg, & ! intent(in)
2116 0 : stats_zt ) ! intent(inout)
2117 : call stat_update_var( stats_metadata%icloud_frac, cloud_frac, & ! intent(in)
2118 0 : stats_zt ) ! intent(inout)
2119 : call stat_update_var( stats_metadata%iice_supersat_frac, ice_supersat_frac, & ! intent(in)
2120 0 : stats_zt) ! intent(inout)
2121 : call stat_update_var( stats_metadata%ircm_in_layer, rcm_in_layer, & ! intent(in)
2122 0 : stats_zt ) ! intent(inout)
2123 : call stat_update_var( stats_metadata%icloud_cover, cloud_cover, & ! intent(in)
2124 0 : stats_zt ) ! intent(inout)
2125 : call stat_update_var( stats_metadata%ircm_supersat_adj, rcm_supersat_adj, & ! intent(in)
2126 0 : stats_zt ) ! intent(inout)
2127 : call stat_update_var( stats_metadata%ip_in_Pa, p_in_Pa, & ! intent(in)
2128 0 : stats_zt ) ! intent(inout)
2129 : call stat_update_var( stats_metadata%iexner, exner, & ! intent(in)
2130 0 : stats_zt ) ! intent(inout)
2131 : call stat_update_var( stats_metadata%irho_ds_zt, rho_ds_zt, & ! intent(in)
2132 0 : stats_zt ) ! intent(inout)
2133 : call stat_update_var( stats_metadata%ithv_ds_zt, thv_ds_zt, & ! intent(in)
2134 0 : stats_zt ) ! intent(inout)
2135 : call stat_update_var( stats_metadata%iLscale, Lscale, & ! intent(in)
2136 0 : stats_zt ) ! intent(inout)
2137 : call stat_update_var( stats_metadata%iwpup2, wpup2, & ! intent(in)
2138 0 : stats_zt ) ! intent(inout)
2139 : call stat_update_var( stats_metadata%iwpvp2, wpvp2, & ! intent(in)
2140 0 : stats_zt ) ! intent(inout)
2141 : call stat_update_var( stats_metadata%iwp3, wp3, & ! intent(in)
2142 0 : stats_zt ) ! intent(inout)
2143 : call stat_update_var( stats_metadata%iwpthlp2, wpthlp2, & ! intent(in)
2144 0 : stats_zt ) ! intent(inout)
2145 : call stat_update_var( stats_metadata%iwp2thlp, wp2thlp, & ! intent(in)
2146 0 : stats_zt ) ! intent(inout)
2147 : call stat_update_var( stats_metadata%iwprtp2, wprtp2, & ! intent(in)
2148 0 : stats_zt ) ! intent(inout)
2149 : call stat_update_var( stats_metadata%iwp2rtp, wp2rtp, & ! intent(in)
2150 0 : stats_zt ) ! intent(inout)
2151 : call stat_update_var( stats_metadata%iLscale_up, Lscale_up, & ! intent(in)
2152 0 : stats_zt ) ! intent(inout)
2153 : call stat_update_var( stats_metadata%iLscale_down, Lscale_down, & ! intent(in)
2154 0 : stats_zt ) ! intent(inout)
2155 : call stat_update_var( stats_metadata%itau_zt, tau_zt, & ! intent(in)
2156 0 : stats_zt ) ! intent(inout)
2157 : call stat_update_var( stats_metadata%iKh_zt, Kh_zt, & ! intent(in)
2158 0 : stats_zt ) ! intent(inout)
2159 : call stat_update_var( stats_metadata%iwp2thvp, wp2thvp, & ! intent(in)
2160 0 : stats_zt ) ! intent(inout)
2161 : call stat_update_var( stats_metadata%iwp2rcp, wp2rcp, & ! intent(in)
2162 0 : stats_zt ) ! intent(inout)
2163 : call stat_update_var( stats_metadata%iw_up_in_cloud, w_up_in_cloud, & ! intent(in)
2164 0 : stats_zt ) ! intent(inout)
2165 : call stat_update_var( stats_metadata%iw_down_in_cloud, w_down_in_cloud, & ! intent(in)
2166 0 : stats_zt ) ! intent(inout)
2167 : call stat_update_var( stats_metadata%icld_updr_frac, cloudy_updraft_frac, & ! intent(in)
2168 0 : stats_zt ) ! intent(inout)
2169 : call stat_update_var( stats_metadata%icld_downdr_frac, cloudy_downdraft_frac, & ! intent(in)
2170 0 : stats_zt ) ! intent(inout)
2171 : call stat_update_var( stats_metadata%iwprtpthlp, wprtpthlp, & ! intent(in)
2172 0 : stats_zt ) ! intent(inout)
2173 : call stat_update_var( stats_metadata%irc_coef, rc_coef, & ! intent(in)
2174 0 : stats_zt ) ! intent(inout)
2175 : call stat_update_var( stats_metadata%isigma_sqd_w_zt, sigma_sqd_w_zt, & ! intent(in)
2176 0 : stats_zt ) ! intent(inout)
2177 : call stat_update_var( stats_metadata%irho, rho, & ! intent(in)
2178 0 : stats_zt ) ! intent(inout)
2179 : call stat_update_var( stats_metadata%irsat, rsat, & ! intent(in)
2180 0 : stats_zt ) ! intent(inout)
2181 0 : if ( stats_metadata%irsati > 0 ) then
2182 0 : do k = 1, nz
2183 0 : rsati(k) = sat_mixrat_ice( p_in_Pa(k), T_in_K(k), saturation_formula )
2184 : end do
2185 : call stat_update_var( stats_metadata%irsati, rsati, & ! intent(in)
2186 0 : stats_zt ) ! intent(inout)
2187 : end if
2188 :
2189 0 : call stat_update_var( stats_metadata%imixt_frac, pdf_params%mixt_frac(1,:), & ! intent(in)
2190 0 : stats_zt ) ! intent(inout)
2191 0 : call stat_update_var( stats_metadata%iw_1, pdf_params%w_1(1,:), & ! intent(in)
2192 0 : stats_zt ) ! intent(inout)
2193 0 : call stat_update_var( stats_metadata%iw_2, pdf_params%w_2(1,:), & ! intent(in)
2194 0 : stats_zt ) ! intent(inout)
2195 0 : call stat_update_var( stats_metadata%ivarnce_w_1, pdf_params%varnce_w_1(1,:), & ! intent(in)
2196 0 : stats_zt ) ! intent(inout)
2197 0 : call stat_update_var( stats_metadata%ivarnce_w_2, pdf_params%varnce_w_2(1,:), & ! intent(in)
2198 0 : stats_zt ) ! intent(inout)
2199 0 : call stat_update_var( stats_metadata%ithl_1, pdf_params%thl_1(1,:), & ! intent(in)
2200 0 : stats_zt ) ! intent(inout)
2201 0 : call stat_update_var( stats_metadata%ithl_2, pdf_params%thl_2(1,:), & ! intent(in)
2202 0 : stats_zt ) ! intent(inout)
2203 0 : call stat_update_var( stats_metadata%ivarnce_thl_1, pdf_params%varnce_thl_1(1,:), & ! intent(in)
2204 0 : stats_zt ) ! intent(inout)
2205 0 : call stat_update_var( stats_metadata%ivarnce_thl_2, pdf_params%varnce_thl_2(1,:), & ! intent(in)
2206 0 : stats_zt ) ! intent(inout)
2207 0 : call stat_update_var( stats_metadata%irt_1, pdf_params%rt_1(1,:), & ! intent(in)
2208 0 : stats_zt ) ! intent(inout)
2209 0 : call stat_update_var( stats_metadata%irt_2, pdf_params%rt_2(1,:), & ! intent(in)
2210 0 : stats_zt ) ! intent(inout)
2211 0 : call stat_update_var( stats_metadata%ivarnce_rt_1, pdf_params%varnce_rt_1(1,:), & ! intent(in)
2212 0 : stats_zt ) ! intent(inout)
2213 0 : call stat_update_var( stats_metadata%ivarnce_rt_2, pdf_params%varnce_rt_2(1,:), & ! intent(in)
2214 0 : stats_zt ) ! intent(inout )
2215 0 : call stat_update_var( stats_metadata%irc_1, pdf_params%rc_1(1,:), & ! intent(in)
2216 0 : stats_zt ) ! intent(inout)
2217 0 : call stat_update_var( stats_metadata%irc_2, pdf_params%rc_2(1,:), & ! intent(in)
2218 0 : stats_zt ) ! intent(inout)
2219 0 : call stat_update_var( stats_metadata%irsatl_1, pdf_params%rsatl_1(1,:), & ! intent(in)
2220 0 : stats_zt ) ! intent(inout)
2221 0 : call stat_update_var( stats_metadata%irsatl_2, pdf_params%rsatl_2(1,:), & ! intent(in)
2222 0 : stats_zt ) ! intent(inout)
2223 0 : call stat_update_var( stats_metadata%icloud_frac_1, pdf_params%cloud_frac_1(1,:), & ! intent(in)
2224 0 : stats_zt ) ! intent(inout)
2225 0 : call stat_update_var( stats_metadata%icloud_frac_2, pdf_params%cloud_frac_2(1,:), & ! intent(in)
2226 0 : stats_zt ) ! intent(inout)
2227 0 : call stat_update_var( stats_metadata%ichi_1, pdf_params%chi_1(1,:), & ! intent(in)
2228 0 : stats_zt ) ! intent(inout)
2229 0 : call stat_update_var( stats_metadata%ichi_2, pdf_params%chi_2(1,:), & ! intent(in)
2230 0 : stats_zt ) ! intent(inout)
2231 0 : call stat_update_var( stats_metadata%istdev_chi_1, pdf_params%stdev_chi_1(1,:), & ! intent(in)
2232 0 : stats_zt ) ! intent(inout)
2233 0 : call stat_update_var( stats_metadata%istdev_chi_2, pdf_params%stdev_chi_2(1,:), & ! intent(in)
2234 0 : stats_zt ) ! intent(inout)
2235 0 : call stat_update_var( stats_metadata%istdev_eta_1, pdf_params%stdev_eta_1(1,:), & ! intent(in)
2236 0 : stats_zt ) ! intent(inout)
2237 0 : call stat_update_var( stats_metadata%istdev_eta_2, pdf_params%stdev_eta_2(1,:), & ! intent(in)
2238 0 : stats_zt ) ! intent(inout)
2239 0 : call stat_update_var( stats_metadata%icovar_chi_eta_1, pdf_params%covar_chi_eta_1(1,:), & ! intent(in)
2240 0 : stats_zt ) ! intent(inout)
2241 0 : call stat_update_var( stats_metadata%icovar_chi_eta_2, pdf_params%covar_chi_eta_2(1,:), & ! intent(in)
2242 0 : stats_zt ) ! intent(inout)
2243 0 : call stat_update_var( stats_metadata%icorr_w_chi_1, pdf_params%corr_w_chi_1(1,:), & ! intent(in)
2244 0 : stats_zt ) ! intent(inout)
2245 0 : call stat_update_var( stats_metadata%icorr_w_chi_2, pdf_params%corr_w_chi_2(1,:), & ! intent(in)
2246 0 : stats_zt ) ! intent(inout)
2247 0 : call stat_update_var( stats_metadata%icorr_w_eta_1, pdf_params%corr_w_eta_1(1,:), & ! intent(in)
2248 0 : stats_zt ) ! intent(inout)
2249 0 : call stat_update_var( stats_metadata%icorr_w_eta_2, pdf_params%corr_w_eta_2(1,:), & ! intent(in)
2250 0 : stats_zt ) ! intent(inout)
2251 0 : call stat_update_var( stats_metadata%icorr_chi_eta_1, pdf_params%corr_chi_eta_1(1,:), & ! intent(in)
2252 0 : stats_zt ) ! intent(inout)
2253 0 : call stat_update_var( stats_metadata%icorr_chi_eta_2, pdf_params%corr_chi_eta_2(1,:), & ! intent(in)
2254 0 : stats_zt ) ! intent(inout)
2255 0 : call stat_update_var( stats_metadata%icorr_w_rt_1, pdf_params%corr_w_rt_1(1,:), & ! intent(in)
2256 0 : stats_zt ) ! intent(inout)
2257 0 : call stat_update_var( stats_metadata%icorr_w_rt_2, pdf_params%corr_w_rt_2(1,:), & ! intent(in)
2258 0 : stats_zt ) ! intent(inout)
2259 0 : call stat_update_var( stats_metadata%icorr_w_thl_1, pdf_params%corr_w_thl_1(1,:), & ! intent(in)
2260 0 : stats_zt ) ! intent(inout)
2261 0 : call stat_update_var( stats_metadata%icorr_w_thl_2, pdf_params%corr_w_thl_2(1,:), & ! intent(in)
2262 0 : stats_zt ) ! intent(inout)
2263 0 : call stat_update_var( stats_metadata%icorr_rt_thl_1, pdf_params%corr_rt_thl_1(1,:), & ! intent(in)
2264 0 : stats_zt ) ! intent(inout)
2265 0 : call stat_update_var( stats_metadata%icorr_rt_thl_2, pdf_params%corr_rt_thl_2(1,:), & ! intent(in)
2266 0 : stats_zt ) ! intent(inout)
2267 0 : call stat_update_var( stats_metadata%icrt_1, pdf_params%crt_1(1,:), & ! intent(in)
2268 0 : stats_zt ) ! intent(inout)
2269 0 : call stat_update_var( stats_metadata%icrt_2, pdf_params%crt_2(1,:), & ! intent(in)
2270 0 : stats_zt ) ! intent(inout)
2271 0 : call stat_update_var( stats_metadata%icthl_1, pdf_params%cthl_1(1,:), & ! intent(in)
2272 0 : stats_zt ) ! intent(inout)
2273 0 : call stat_update_var( stats_metadata%icthl_2, pdf_params%cthl_2(1,:), & ! intent(in)
2274 0 : stats_zt ) ! intent(inout)
2275 : call stat_update_var( stats_metadata%iwp2_zt, wp2_zt, & ! intent(in)
2276 0 : stats_zt ) ! intent(inout)
2277 : call stat_update_var( stats_metadata%ithlp2_zt, thlp2_zt, & ! intent(in)
2278 0 : stats_zt ) ! intent(inout)
2279 : call stat_update_var( stats_metadata%ithlp3, thlp3, & ! intent(in)
2280 0 : stats_zt ) ! intent(inout)
2281 : call stat_update_var( stats_metadata%iwpthlp_zt, wpthlp_zt, & ! intent(in)
2282 0 : stats_zt ) ! intent(inout)
2283 : call stat_update_var( stats_metadata%iwprtp_zt, wprtp_zt, & ! intent(in)
2284 0 : stats_zt ) ! intent(inout)
2285 : call stat_update_var( stats_metadata%irtp2_zt, rtp2_zt, & ! intent(in)
2286 0 : stats_zt ) ! intent(inout)
2287 : call stat_update_var( stats_metadata%irtp3, rtp3, & ! intent(in)
2288 0 : stats_zt ) ! intent(inout)
2289 : call stat_update_var( stats_metadata%irtpthlp_zt, rtpthlp_zt, & ! intent(in)
2290 0 : stats_zt ) ! intent(inout)
2291 : call stat_update_var( stats_metadata%iup2_zt, up2_zt, & ! intent(in)
2292 0 : stats_zt ) ! intent(inout)
2293 : call stat_update_var( stats_metadata%ivp2_zt, vp2_zt, & ! intent(in)
2294 0 : stats_zt ) ! intent(inout)
2295 : call stat_update_var( stats_metadata%iupwp_zt, upwp_zt, & ! intent(in)
2296 0 : stats_zt ) ! intent(inout)
2297 : call stat_update_var( stats_metadata%ivpwp_zt, vpwp_zt, & ! intent(in)
2298 0 : stats_zt ) ! intent(inout)
2299 : call stat_update_var( stats_metadata%ia3_coef_zt, a3_coef_zt, & ! intent(in)
2300 0 : stats_zt ) ! intent(inout)
2301 : call stat_update_var( stats_metadata%iwp3_on_wp2_zt, wp3_on_wp2_zt, & ! intent(in)
2302 0 : stats_zt ) ! intent(inout)
2303 :
2304 0 : if ( stats_metadata%ichi > 0 ) then
2305 : ! Determine 's' from Mellor (1977) (extended liquid water)
2306 0 : chi(:) = pdf_params%mixt_frac(1,:) * pdf_params%chi_1(1,:) &
2307 0 : + (1.0_core_rknd-pdf_params%mixt_frac(1,:)) * pdf_params%chi_2(1,:)
2308 : call stat_update_var( stats_metadata%ichi, chi, & ! intent(in)
2309 0 : stats_zt ) ! intent(inout)
2310 : end if
2311 :
2312 : ! Calculate variance of chi
2313 0 : if ( stats_metadata%ichip2 > 0 ) then
2314 0 : chip2 = compute_variance_binormal( chi, pdf_params%chi_1(1,:), pdf_params%chi_2(1,:), &
2315 0 : pdf_params%stdev_chi_1(1,:), pdf_params%stdev_chi_2(1,:), &
2316 0 : pdf_params%mixt_frac(1,:) )
2317 : call stat_update_var( stats_metadata%ichip2, chip2, & ! intent(in)
2318 0 : stats_zt ) ! intent(inout)
2319 : end if
2320 :
2321 0 : if ( sclr_dim > 0 ) then
2322 0 : do isclr=1, sclr_dim
2323 0 : call stat_update_var( stats_metadata%isclrm(isclr), sclrm(:,isclr), & ! intent(in)
2324 0 : stats_zt ) ! intent(inout)
2325 0 : call stat_update_var( stats_metadata%isclrm_f(isclr), sclrm_forcing(:,isclr), & ! intent(in)
2326 0 : stats_zt ) ! intent(inout)
2327 : end do
2328 : end if
2329 :
2330 0 : if ( edsclr_dim > 0 ) then
2331 0 : do isclr = 1, edsclr_dim
2332 0 : call stat_update_var( stats_metadata%iedsclrm(isclr), edsclrm(:,isclr), & ! intent(in)
2333 0 : stats_zt ) ! intent(inout)
2334 0 : call stat_update_var( stats_metadata%iedsclrm_f(isclr), edsclrm_forcing(:,isclr), & ! intent(in)
2335 0 : stats_zt ) ! intent(inout)
2336 : end do
2337 : end if
2338 :
2339 : ! Calculate rcm in cloud
2340 0 : if ( stats_metadata%ircm_in_cloud > 0 ) then
2341 0 : where ( cloud_frac(:) > cloud_frac_min )
2342 : rcm_in_cloud(:) = rcm / cloud_frac
2343 : elsewhere
2344 : rcm_in_cloud(:) = rcm
2345 : endwhere
2346 :
2347 : call stat_update_var( stats_metadata%ircm_in_cloud, rcm_in_cloud, & ! intent(in)
2348 0 : stats_zt ) ! intent(inout)
2349 : end if
2350 :
2351 : ! stats_zm variables
2352 :
2353 : call stat_update_var( stats_metadata%iwp2, wp2, & ! intent(in)
2354 0 : stats_zm ) ! intent(inout)
2355 : call stat_update_var( stats_metadata%iwp3_zm, wp3_zm, & ! intent(in)
2356 0 : stats_zm ) ! intent(inout)
2357 : call stat_update_var( stats_metadata%irtp2, rtp2, & ! intent(in)
2358 0 : stats_zm ) ! intent(inout)
2359 : call stat_update_var( stats_metadata%ithlp2, thlp2, & ! intent(in)
2360 0 : stats_zm ) ! intent(inout)
2361 : call stat_update_var( stats_metadata%irtpthlp, rtpthlp, & ! intent(in)
2362 0 : stats_zm ) ! intent(inout)
2363 : call stat_update_var( stats_metadata%iwprtp, wprtp, & ! intent(in)
2364 0 : stats_zm ) ! intent(inout)
2365 : call stat_update_var( stats_metadata%iwpthlp, wpthlp, & ! intent(in)
2366 0 : stats_zm ) ! intent(inout)
2367 : call stat_update_var( stats_metadata%iwp2up2, wp2up2, & ! intent(in)
2368 0 : stats_zm ) ! intent(inout)
2369 : call stat_update_var( stats_metadata%iwp2vp2, wp2vp2, & ! intent(in)
2370 0 : stats_zm ) ! intent(inout)
2371 : call stat_update_var( stats_metadata%iwp4, wp4, & ! intent(in)
2372 0 : stats_zm ) ! intent(inout)
2373 : call stat_update_var( stats_metadata%iwpthvp, wpthvp, & ! intent(in)
2374 0 : stats_zm ) ! intent(inout)
2375 : call stat_update_var( stats_metadata%irtpthvp, rtpthvp, & ! intent(in)
2376 0 : stats_zm ) ! intent(inout)
2377 : call stat_update_var( stats_metadata%ithlpthvp, thlpthvp, & ! intent(in)
2378 0 : stats_zm ) ! intent(inout)
2379 : call stat_update_var( stats_metadata%itau_zm, tau_zm, & ! intent(in)
2380 0 : stats_zm ) ! intent(inout)
2381 : call stat_update_var( stats_metadata%iKh_zm, Kh_zm, & ! intent(in)
2382 0 : stats_zm ) ! intent(inout)
2383 : call stat_update_var( stats_metadata%iwprcp, wprcp, & ! intent(in)
2384 0 : stats_zm ) ! intent(inout)
2385 : call stat_update_var( stats_metadata%irc_coef_zm, rc_coef_zm, & ! intent(in)
2386 0 : stats_zm ) ! intent(inout)
2387 : call stat_update_var( stats_metadata%ithlprcp, thlprcp, & ! intent(in)
2388 0 : stats_zm ) ! intent(inout)
2389 : call stat_update_var( stats_metadata%irtprcp, rtprcp, & ! intent(in)
2390 0 : stats_zm ) ! intent(inout)
2391 : call stat_update_var( stats_metadata%ircp2, rcp2, & ! intent(in)
2392 0 : stats_zm ) ! intent(inout)
2393 : call stat_update_var( stats_metadata%iupwp, upwp, & ! intent(in)
2394 0 : stats_zm ) ! intent(inout)
2395 : call stat_update_var( stats_metadata%ivpwp, vpwp, & ! intent(in)
2396 0 : stats_zm ) ! intent(inout)
2397 : call stat_update_var( stats_metadata%ivp2, vp2, & ! intent(in)
2398 0 : stats_zm ) ! intent(inout)
2399 : call stat_update_var( stats_metadata%iup2, up2, & ! intent(in)
2400 0 : stats_zm ) ! intent(inout)
2401 : call stat_update_var( stats_metadata%irho_zm, rho_zm, & ! intent(in)
2402 0 : stats_zm ) ! intent(inout)
2403 : call stat_update_var( stats_metadata%isigma_sqd_w, sigma_sqd_w, & ! intent(in)
2404 0 : stats_zm ) ! intent(inout)
2405 : call stat_update_var( stats_metadata%irho_ds_zm, rho_ds_zm, & ! intent(in)
2406 0 : stats_zm ) ! intent(inout)
2407 : call stat_update_var( stats_metadata%ithv_ds_zm, thv_ds_zm, & ! intent(in)
2408 0 : stats_zm ) ! intent(inout)
2409 : call stat_update_var( stats_metadata%iem, em, & ! intent(in)
2410 0 : stats_zm ) ! intent(inout)
2411 : call stat_update_var( stats_metadata%iSkw_velocity, Skw_velocity, & ! intent(in)
2412 0 : stats_zm ) ! intent(inout)
2413 : call stat_update_var( stats_metadata%ia3_coef, a3_coef, & ! intent(in)
2414 0 : stats_zm ) ! intent(inout)
2415 : call stat_update_var( stats_metadata%iwp3_on_wp2, wp3_on_wp2, & ! intent(in)
2416 0 : stats_zm ) ! intent(inout)
2417 : call stat_update_var( stats_metadata%iwp3_on_wp2_cfl_num, wp3_on_wp2 * dt / dzm, & ! intent(in)
2418 0 : stats_zm ) ! intent(inout)
2419 :
2420 : call stat_update_var( stats_metadata%icloud_frac_zm, cloud_frac_zm, & ! intent(in)
2421 0 : stats_zm ) ! intent(inout)
2422 : call stat_update_var( stats_metadata%iice_supersat_frac_zm, ice_supersat_frac_zm, & ! intent(in)
2423 0 : stats_zm ) ! intent(inout)
2424 : call stat_update_var( stats_metadata%ircm_zm, rcm_zm, & ! intent(in)
2425 0 : stats_zm ) ! intent(inout)
2426 : call stat_update_var( stats_metadata%irtm_zm, rtm_zm, & ! intent(in)
2427 0 : stats_zm ) ! intent(inout)
2428 : call stat_update_var( stats_metadata%ithlm_zm, thlm_zm, & ! intent(in)
2429 0 : stats_zm ) ! intent(inout)
2430 0 : call stat_update_var( stats_metadata%iw_1_zm, pdf_params_zm%w_1(1,:), & ! intent(in)
2431 0 : stats_zm ) ! intent(inout)
2432 0 : call stat_update_var( stats_metadata%iw_2_zm, pdf_params_zm%w_2(1,:), & ! intent(in)
2433 0 : stats_zm ) ! intent(inout)
2434 0 : call stat_update_var( stats_metadata%ivarnce_w_1_zm, pdf_params_zm%varnce_w_1(1,:), & ! intent(in)
2435 0 : stats_zm ) ! intent(inout)
2436 0 : call stat_update_var( stats_metadata%ivarnce_w_2_zm, pdf_params_zm%varnce_w_2(1,:), & ! intent(in)
2437 0 : stats_zm ) ! intent(inout)
2438 0 : call stat_update_var( stats_metadata%imixt_frac_zm, pdf_params_zm%mixt_frac(1,:), & ! intent(in)
2439 0 : stats_zm ) ! intent(inout)
2440 :
2441 0 : if ( sclr_dim > 0 ) then
2442 0 : do isclr=1, sclr_dim
2443 0 : call stat_update_var( stats_metadata%isclrp2(isclr), sclrp2(:,isclr), & ! intent(in)
2444 0 : stats_zm ) ! intent(inout)
2445 0 : call stat_update_var( stats_metadata%isclrprtp(isclr), sclrprtp(:,isclr), & ! intent(in)
2446 0 : stats_zm ) ! intent(inout)
2447 0 : call stat_update_var( stats_metadata%isclrpthvp(isclr), sclrpthvp(:,isclr), & ! intent(in)
2448 0 : stats_zm ) ! intent(inout)
2449 0 : call stat_update_var( stats_metadata%isclrpthlp(isclr), sclrpthlp(:,isclr), & ! intent(in)
2450 0 : stats_zm ) ! intent(inout)
2451 0 : call stat_update_var( stats_metadata%isclrprcp(isclr), sclrprcp(:,isclr), & ! intent(in)
2452 0 : stats_zm ) ! intent(inout)
2453 0 : call stat_update_var( stats_metadata%iwpsclrp(isclr), wpsclrp(:,isclr), & ! intent(in)
2454 0 : stats_zm ) ! intent(inout)
2455 0 : call stat_update_var( stats_metadata%iwp2sclrp(isclr), wp2sclrp(:,isclr), & ! intent(in)
2456 0 : stats_zm ) ! intent(inout)
2457 0 : call stat_update_var( stats_metadata%iwpsclrp2(isclr), wpsclrp2(:,isclr), & ! intent(in)
2458 0 : stats_zm ) ! intent(inout)
2459 0 : call stat_update_var( stats_metadata%iwpsclrprtp(isclr), wpsclrprtp(:,isclr), & ! intent(in)
2460 0 : stats_zm ) ! intent(inout)
2461 0 : call stat_update_var( stats_metadata%iwpsclrpthlp(isclr), wpsclrpthlp(:,isclr), & ! intent(in)
2462 0 : stats_zm ) ! intent(inout)
2463 : end do
2464 : end if
2465 0 : if ( edsclr_dim > 0 ) then
2466 0 : do isclr = 1, edsclr_dim
2467 0 : call stat_update_var( stats_metadata%iwpedsclrp(isclr), wpedsclrp(:,isclr), & ! intent(in)
2468 0 : stats_zm ) ! intent(inout)
2469 : end do
2470 : end if
2471 :
2472 : ! Calculate shear production
2473 0 : if ( stats_metadata%ishear > 0 ) then
2474 0 : do k = 1, nz-1, 1
2475 0 : shear(k) = - upwp(k) * ( um(k+1) - um(k) ) * invrs_dzm(k) &
2476 0 : - vpwp(k) * ( vm(k+1) - vm(k) ) * invrs_dzm(k)
2477 : enddo
2478 0 : shear(nz) = 0.0_core_rknd
2479 : end if
2480 : call stat_update_var( stats_metadata%ishear, shear, & ! intent(in)
2481 0 : stats_zm ) ! intent(inout)
2482 :
2483 : ! stats_sfc variables
2484 :
2485 : ! Cloud cover
2486 0 : call stat_update_var_pt( stats_metadata%icc, grid_level, maxval( cloud_frac(1:nz) ), & ! intent(in)
2487 0 : stats_sfc ) ! intent(inout)
2488 :
2489 : ! Cloud base
2490 0 : if ( stats_metadata%iz_cloud_base > 0 ) then
2491 :
2492 : k = 1
2493 0 : do while ( rcm(k) < rc_tol .and. k < nz )
2494 0 : k = k + 1
2495 : enddo
2496 :
2497 0 : if ( k > 1 .and. k < nz) then
2498 :
2499 : ! Use linear interpolation to find the exact height of the
2500 : ! rc_tol kg/kg level. Brian.
2501 : call stat_update_var_pt( stats_metadata%iz_cloud_base, grid_level, & ! intent(in)
2502 : lin_interpolate_two_points( rc_tol, rcm(k), & ! intent(in)
2503 0 : rcm(k-1), zt(k), zt(k-1) ), & ! intent(in)
2504 0 : stats_sfc ) ! intent(inout)
2505 :
2506 : else
2507 :
2508 : ! Set the cloud base output to -10m, if it's clear.
2509 : ! Known magic number
2510 : call stat_update_var_pt( stats_metadata%iz_cloud_base, grid_level, -10.0_core_rknd , & ! intent(in)
2511 0 : stats_sfc ) ! intent(inout)
2512 :
2513 : end if ! k > 1 and k < nz
2514 :
2515 : end if ! stats_metadata%iz_cloud_base > 0
2516 :
2517 : ! Liquid Water Path
2518 0 : if ( stats_metadata%ilwp > 0 ) then
2519 :
2520 : xtmp &
2521 : = vertical_integral &
2522 0 : ( (nz - 2 + 1), rho_ds_zt(2:nz), &
2523 0 : rcm(2:nz), dzt(2:nz) )
2524 :
2525 : call stat_update_var_pt( stats_metadata%ilwp, grid_level, xtmp, & ! intent(in)
2526 0 : stats_sfc ) ! intent(inout)
2527 :
2528 : end if
2529 :
2530 : ! Vapor Water Path (Precipitable Water)
2531 0 : if ( stats_metadata%ivwp > 0 ) then
2532 :
2533 : xtmp &
2534 : = vertical_integral &
2535 0 : ( (nz - 2 + 1), rho_ds_zt(2:nz), &
2536 0 : ( rtm(2:nz) - rcm(2:nz) ), dzt(2:nz) )
2537 :
2538 : call stat_update_var_pt( stats_metadata%ivwp, grid_level, xtmp, & ! intent(in)
2539 0 : stats_sfc ) ! intent(inout)
2540 :
2541 : end if
2542 :
2543 :
2544 : ! Vertical average of thermodynamic level variables.
2545 :
2546 : ! Find the vertical average of thermodynamic level variables, averaged from
2547 : ! level 2 (the first thermodynamic level above model surface) through
2548 : ! level nz (the top of the model). Use the vertical averaging function
2549 : ! found in advance_helper_module.F90.
2550 :
2551 : ! Vertical average of thlm.
2552 : call stat_update_var_pt( stats_metadata%ithlm_vert_avg, grid_level, & ! intent(in)
2553 0 : vertical_avg( (nz-2+1), rho_ds_zt(2:nz), & ! intent(in)
2554 : thlm(2:nz), dzt(2:nz) ), & ! intent(in)
2555 0 : stats_sfc ) ! intent(inout)
2556 :
2557 : ! Vertical average of rtm.
2558 : call stat_update_var_pt( stats_metadata%irtm_vert_avg, grid_level, & ! intent(in)
2559 : vertical_avg( (nz-2+1), rho_ds_zt(2:nz), & ! intent(in)
2560 : rtm(2:nz), dzt(2:nz) ), & ! intent(in)
2561 0 : stats_sfc ) ! intent(inout)
2562 :
2563 : ! Vertical average of um.
2564 : call stat_update_var_pt( stats_metadata%ium_vert_avg, grid_level, & ! intent(in)
2565 : vertical_avg( (nz-2+1), rho_ds_zt(2:nz), & ! intent(in)
2566 : um(2:nz), dzt(2:nz) ), & ! intent(in)
2567 0 : stats_sfc ) ! intent(inout)
2568 :
2569 : ! Vertical average of vm.
2570 : call stat_update_var_pt( stats_metadata%ivm_vert_avg, grid_level, & ! intent(in)
2571 : vertical_avg( (nz-2+1), rho_ds_zt(2:nz), & ! intent(in)
2572 : vm(2:nz), dzt(2:nz) ), & ! intent(in)
2573 0 : stats_sfc ) ! intent(inout)
2574 :
2575 : ! Vertical average of momentum level variables.
2576 :
2577 : ! Find the vertical average of momentum level variables, averaged over the
2578 : ! entire vertical profile (level 1 through level nz). Use the vertical
2579 : ! averaging function found in advance_helper_module.F90.
2580 :
2581 : ! Vertical average of wp2.
2582 : call stat_update_var_pt( stats_metadata%iwp2_vert_avg, grid_level, & ! intent(in)
2583 : vertical_avg( (nz-1+1), rho_ds_zm(1:nz), & ! intent(in)
2584 : wp2(1:nz), dzm(1:nz) ), & ! intent(in)
2585 0 : stats_sfc ) ! intent(inout)
2586 :
2587 : ! Vertical average of up2.
2588 : call stat_update_var_pt( stats_metadata%iup2_vert_avg, grid_level, & ! intent(in)
2589 : vertical_avg( (nz-1+1), rho_ds_zm(1:nz), & ! intent(in)
2590 : up2(1:nz), dzm(1:nz) ), & ! intent(in)
2591 0 : stats_sfc ) ! intent(inout)
2592 :
2593 : ! Vertical average of vp2.
2594 : call stat_update_var_pt( stats_metadata%ivp2_vert_avg, grid_level, & ! intent(in)
2595 : vertical_avg( (nz-1+1), rho_ds_zm(1:nz), & ! intent(in)
2596 : vp2(1:nz), dzm(1:nz) ), & ! intent(in)
2597 0 : stats_sfc ) ! intent(inout)
2598 :
2599 : ! Vertical average of rtp2.
2600 : call stat_update_var_pt( stats_metadata%irtp2_vert_avg, grid_level, & ! intent(in)
2601 : vertical_avg( (nz-1+1), rho_ds_zm(1:nz), & ! intent(in)
2602 : rtp2(1:nz), dzm(1:nz) ), & ! intent(in)
2603 0 : stats_sfc ) ! intent(inout)
2604 :
2605 : ! Vertical average of thlp2.
2606 : call stat_update_var_pt( stats_metadata%ithlp2_vert_avg, grid_level, & ! intent(in)
2607 : vertical_avg( (nz-1+1), rho_ds_zm(1:nz), & ! intent(in)
2608 : thlp2(1:nz), dzm(1:nz) ), & ! intent(in)
2609 0 : stats_sfc ) ! intent(inout)
2610 :
2611 :
2612 0 : if (stats_metadata%itot_vartn_normlzd_rtm > 0) then
2613 0 : if (abs(rtm(nz) - rtm(1)) < eps) then
2614 0 : write(fstderr, *) "Warning: tot_vartn_normlzd_rtm tried to divide by zero denominator ", &
2615 0 : "(surface level value was equal to top level value)"
2616 0 : xtmp = -999_core_rknd ! workaround to signify zero denominator
2617 : else
2618 0 : xtmp = sum(abs(rtm(2 : nz) - rtm(1 : nz-1)) / abs(rtm(nz) - rtm(1)))
2619 : end if
2620 :
2621 : call stat_update_var_pt( stats_metadata%itot_vartn_normlzd_rtm, grid_level, xtmp, & ! intent(in)
2622 0 : stats_sfc ) ! intent(inout)
2623 : end if
2624 :
2625 0 : if (stats_metadata%itot_vartn_normlzd_thlm > 0) then
2626 0 : if (abs(thlm(nz) - thlm(1)) < eps) then
2627 0 : write(fstderr, *) "Warning: tot_vartn_normlzd_thlm tried to divide by zero denominator ", &
2628 0 : "(surface level value was equal to top level value)"
2629 0 : xtmp = -999_core_rknd ! workaround to signify zero denominator
2630 : else
2631 0 : xtmp = sum(abs(thlm(2 : nz) - thlm(1 : nz-1)) / abs(thlm(nz) - thlm(1)))
2632 : end if
2633 :
2634 : call stat_update_var_pt( stats_metadata%itot_vartn_normlzd_thlm, grid_level, xtmp, & ! intent(in)
2635 0 : stats_sfc ) ! intent(inout)
2636 : end if
2637 :
2638 0 : if (stats_metadata%itot_vartn_normlzd_wprtp > 0) then
2639 0 : if (abs(wprtp(nz) - wprtp(1)) < eps) then
2640 0 : write(fstderr, *) "Warning: tot_vartn_normlzd_wprtp tried to divide by zero denominator ", &
2641 0 : "(surface level value was equal to top level value)"
2642 0 : xtmp = -999_core_rknd ! workaround to signify zero denominator
2643 : else
2644 0 : xtmp = sum(abs(wprtp(2 : nz) - wprtp(1 : nz-1)) / abs(wprtp(nz) - wprtp(1)))
2645 : end if
2646 :
2647 : call stat_update_var_pt( stats_metadata%itot_vartn_normlzd_wprtp, grid_level, xtmp, & ! intent(in)
2648 0 : stats_sfc ) ! intent(inout)
2649 : end if
2650 : end if ! stats_metadata%l_stats_samp
2651 :
2652 :
2653 0 : return
2654 : end subroutine stats_accumulate
2655 : !------------------------------------------------------------------------------
2656 0 : subroutine stats_accumulate_hydromet( gr, hydromet_dim, hm_metadata, & ! intent(in)
2657 0 : hydromet, rho_ds_zt, & ! intent(in)
2658 : stats_metadata, & ! intent(in)
2659 : stats_zt, stats_sfc ) ! intent(inout)
2660 : ! Description:
2661 : ! Compute stats related the hydrometeors
2662 :
2663 : ! References:
2664 : ! None
2665 : !------------------------------------------------------------------------------
2666 :
2667 : use grid_class, only: &
2668 : grid ! Type
2669 :
2670 : use corr_varnce_module, only: &
2671 : hm_metadata_type
2672 :
2673 : use advance_helper_module, only: &
2674 : vertical_integral ! Procedure(s)
2675 :
2676 : use stats_type_utilities, only: &
2677 : stat_update_var, & ! Procedure(s)
2678 : stat_update_var_pt
2679 :
2680 : use clubb_precision, only: &
2681 : core_rknd ! Variable(s)
2682 :
2683 : use stats_type, only: &
2684 : stats ! Type
2685 :
2686 : use stats_variables, only: &
2687 : stats_metadata_type
2688 :
2689 : implicit none
2690 :
2691 : type (grid), target, intent(in) :: &
2692 : gr
2693 :
2694 : integer, intent(in) :: &
2695 : hydromet_dim
2696 :
2697 : type (hm_metadata_type), intent(in) :: &
2698 : hm_metadata
2699 :
2700 : type (stats_metadata_type), intent(in) :: &
2701 : stats_metadata
2702 :
2703 : type (stats), target, intent(inout) :: &
2704 : stats_zt, &
2705 : stats_sfc
2706 :
2707 : ! Input Variables
2708 : real( kind = core_rknd ), dimension(gr%nz,hydromet_dim), intent(in) :: &
2709 : hydromet ! All hydrometeors except for rcm [units vary]
2710 :
2711 : real( kind = core_rknd ), dimension(gr%nz), intent(in) :: &
2712 : rho_ds_zt ! Dry, static density (thermo. levs.) [kg/m^3]
2713 :
2714 : ! Local Variables
2715 : real(kind=core_rknd) :: xtmp
2716 :
2717 : integer :: grid_level = 1
2718 :
2719 : ! ---- Begin Code ----
2720 :
2721 0 : if ( stats_metadata%l_stats_samp ) then
2722 :
2723 0 : if ( hm_metadata%iirr > 0 ) then
2724 : call stat_update_var( stats_metadata%irrm, hydromet(:,hm_metadata%iirr), & ! intent(in)
2725 0 : stats_zt ) ! intent(inout)
2726 : end if
2727 :
2728 0 : if ( hm_metadata%iirs > 0 ) then
2729 : call stat_update_var( stats_metadata%irsm, hydromet(:,hm_metadata%iirs), & ! intent(in)
2730 0 : stats_zt ) ! intent(inout)
2731 : end if
2732 :
2733 0 : if ( hm_metadata%iiri > 0 ) then
2734 : call stat_update_var( stats_metadata%irim, hydromet(:,hm_metadata%iiri), & ! intent(in)
2735 0 : stats_zt ) ! intent(inout)
2736 : end if
2737 :
2738 0 : if ( hm_metadata%iirg > 0 ) then
2739 : call stat_update_var( stats_metadata%irgm, & ! intent(in)
2740 : hydromet(:,hm_metadata%iirg), & ! intent(in)
2741 0 : stats_zt ) ! intent(inout)
2742 : end if
2743 :
2744 0 : if ( hm_metadata%iiNi > 0 ) then
2745 : call stat_update_var( stats_metadata%iNim, hydromet(:,hm_metadata%iiNi), & ! intent(in)
2746 0 : stats_zt ) ! intent(inout)
2747 : end if
2748 :
2749 0 : if ( hm_metadata%iiNr > 0 ) then
2750 : call stat_update_var( stats_metadata%iNrm, hydromet(:,hm_metadata%iiNr), & ! intent(in)
2751 0 : stats_zt ) ! intent(inout)
2752 : end if
2753 :
2754 0 : if ( hm_metadata%iiNs > 0 ) then
2755 : call stat_update_var( stats_metadata%iNsm, hydromet(:,hm_metadata%iiNs), & ! intent(in)
2756 0 : stats_zt ) ! intent(inout)
2757 : end if
2758 :
2759 0 : if ( hm_metadata%iiNg > 0 ) then
2760 : call stat_update_var( stats_metadata%iNgm, hydromet(:,hm_metadata%iiNg), & ! intent(in)
2761 0 : stats_zt ) ! intent(inout)
2762 : end if
2763 :
2764 : ! Snow Water Path
2765 0 : if ( stats_metadata%iswp > 0 .and. hm_metadata%iirs > 0 ) then
2766 :
2767 : ! Calculate snow water path
2768 : xtmp &
2769 : = vertical_integral &
2770 0 : ( (gr%nz - 2 + 1), rho_ds_zt(2:gr%nz), &
2771 0 : hydromet(2:gr%nz,hm_metadata%iirs), gr%dzt(1,2:gr%nz) )
2772 :
2773 : call stat_update_var_pt( stats_metadata%iswp, grid_level, xtmp, & ! intent(in)
2774 0 : stats_sfc ) ! intent(inout)
2775 :
2776 : end if ! stats_metadata%iswp > 0 .and. iirs > 0
2777 :
2778 : ! Ice Water Path
2779 0 : if ( stats_metadata%iiwp > 0 .and. hm_metadata%iiri > 0 ) then
2780 :
2781 : xtmp &
2782 : = vertical_integral &
2783 0 : ( (gr%nz - 2 + 1), rho_ds_zt(2:gr%nz), &
2784 0 : hydromet(2:gr%nz,hm_metadata%iiri), gr%dzt(1,2:gr%nz) )
2785 :
2786 : call stat_update_var_pt( stats_metadata%iiwp, grid_level, xtmp, & ! intent(in)
2787 0 : stats_sfc ) ! intent(inout)
2788 :
2789 : end if
2790 :
2791 : ! Rain Water Path
2792 0 : if ( stats_metadata%irwp > 0 .and. hm_metadata%iirr > 0 ) then
2793 :
2794 : xtmp &
2795 : = vertical_integral &
2796 0 : ( (gr%nz - 2 + 1), rho_ds_zt(2:gr%nz), &
2797 0 : hydromet(2:gr%nz,hm_metadata%iirr), gr%dzt(1,2:gr%nz) )
2798 :
2799 : call stat_update_var_pt( stats_metadata%irwp, grid_level, xtmp, & ! intent(in)
2800 0 : stats_sfc ) ! intent(inout)
2801 :
2802 : end if ! stats_metadata%irwp > 0 .and. stats_metadata%irrm > 0
2803 : end if ! stats_metadata%l_stats_samp
2804 :
2805 0 : return
2806 : end subroutine stats_accumulate_hydromet
2807 : !------------------------------------------------------------------------------
2808 0 : subroutine stats_accumulate_lh_tend( gr, hydromet_dim, hm_metadata, &
2809 0 : lh_hydromet_mc, lh_Ncm_mc, &
2810 0 : lh_thlm_mc, lh_rvm_mc, lh_rcm_mc, &
2811 0 : lh_AKm, AKm, AKstd, AKstd_cld, &
2812 0 : lh_rcm_avg, AKm_rcm, AKm_rcc, &
2813 : stats_metadata, &
2814 : stats_lh_zt )
2815 :
2816 : ! Description:
2817 : ! Compute stats for the tendency of latin hypercube sample points.
2818 :
2819 : ! References:
2820 : ! None
2821 : !------------------------------------------------------------------------------
2822 :
2823 : use grid_class, only: &
2824 : grid ! Type
2825 :
2826 : use stats_type_utilities, only: &
2827 : stat_update_var ! Procedure(s)
2828 :
2829 : use stats_variables, only: &
2830 : stats_metadata_type
2831 :
2832 : use clubb_precision, only: &
2833 : core_rknd ! Variable(s)
2834 :
2835 : use corr_varnce_module, only: &
2836 : hm_metadata_type
2837 :
2838 : use stats_type, only: &
2839 : stats ! Type
2840 :
2841 : implicit none
2842 :
2843 : !----------------------- Input Variables -----------------------
2844 : type (grid), target, intent(in) :: &
2845 : gr
2846 :
2847 : integer, intent(in) :: &
2848 : hydromet_dim
2849 :
2850 : type (hm_metadata_type), intent(in) :: &
2851 : hm_metadata
2852 :
2853 : real( kind = core_rknd ), dimension(gr%nz,hydromet_dim), intent(in) :: &
2854 : lh_hydromet_mc ! Tendency of hydrometeors except for rvm/rcm [units vary]
2855 :
2856 : real( kind = core_rknd ), dimension(gr%nz), intent(in) :: &
2857 : lh_Ncm_mc, & ! Tendency of cloud droplet concentration [num/kg/s]
2858 : lh_thlm_mc, & ! Tendency of liquid potential temperature [kg/kg/s]
2859 : lh_rcm_mc, & ! Tendency of cloud water [kg/kg/s]
2860 : lh_rvm_mc ! Tendency of vapor [kg/kg/s]
2861 :
2862 : real( kind = core_rknd ), dimension(gr%nz), intent(in) :: &
2863 : lh_AKm, & ! Kessler ac estimate [kg/kg/s]
2864 : AKm, & ! Exact Kessler ac [kg/kg/s]
2865 : AKstd, & ! St dev of exact Kessler ac [kg/kg/s]
2866 : AKstd_cld, & ! Stdev of exact w/in cloud ac [kg/kg/s]
2867 : lh_rcm_avg, & ! Monte Carlo rcm estimate [kg/kg]
2868 : AKm_rcm, & ! Kessler ac based on rcm [kg/kg/s]
2869 : AKm_rcc ! Kessler ac based on rcm/cloud_frac [kg/kg/s]
2870 :
2871 : type (stats_metadata_type), intent(in) :: &
2872 : stats_metadata
2873 :
2874 : !----------------------- InOut Variables -----------------------
2875 : type (stats), target, intent(inout) :: &
2876 : stats_lh_zt
2877 :
2878 : !----------------------- Begin Code -----------------------
2879 :
2880 0 : if ( stats_metadata%l_stats_samp ) then
2881 :
2882 : call stat_update_var( stats_metadata%ilh_thlm_mc, lh_thlm_mc, & ! intent(in)
2883 0 : stats_lh_zt ) ! intent(inout)
2884 : call stat_update_var( stats_metadata%ilh_rcm_mc, lh_rcm_mc, & ! intent(in)
2885 0 : stats_lh_zt ) ! intent(inout)
2886 : call stat_update_var( stats_metadata%ilh_rvm_mc, lh_rvm_mc, & ! intent(in)
2887 0 : stats_lh_zt ) ! intent(inout)
2888 :
2889 : call stat_update_var( stats_metadata%ilh_Ncm_mc, lh_Ncm_mc, & ! intent(in)
2890 0 : stats_lh_zt ) ! intent(inout)
2891 :
2892 0 : if ( hm_metadata%iirr > 0 ) then
2893 : call stat_update_var( stats_metadata%ilh_rrm_mc, lh_hydromet_mc(:,hm_metadata%iirr), & ! intent(in)
2894 0 : stats_lh_zt ) ! intent(inout)
2895 : end if
2896 :
2897 0 : if ( hm_metadata%iirs > 0 ) then
2898 : call stat_update_var( stats_metadata%ilh_rsm_mc, & ! intent(in)
2899 : lh_hydromet_mc(:,hm_metadata%iirs), & ! intent(in)
2900 0 : stats_lh_zt ) ! intent(inout)
2901 : end if
2902 :
2903 0 : if ( hm_metadata%iiri > 0 ) then
2904 : call stat_update_var( stats_metadata%ilh_rim_mc, & ! intent(in)
2905 : lh_hydromet_mc(:,hm_metadata%iiri), & ! intent(in)
2906 0 : stats_lh_zt ) ! intent(inout)
2907 : end if
2908 :
2909 0 : if ( hm_metadata%iirg > 0 ) then
2910 : call stat_update_var( stats_metadata%ilh_rgm_mc, & ! intent(in)
2911 : lh_hydromet_mc(:,hm_metadata%iirg), & ! intent(in)
2912 0 : stats_lh_zt ) ! intent(inout)
2913 : end if
2914 :
2915 0 : if ( hm_metadata%iiNi > 0 ) then
2916 : call stat_update_var( stats_metadata%ilh_Nim_mc, & ! intent(in)
2917 : lh_hydromet_mc(:,hm_metadata%iiNi), & ! intent(in)
2918 0 : stats_lh_zt ) ! intent(inout)
2919 : end if
2920 :
2921 0 : if ( hm_metadata%iiNr > 0 ) then
2922 : call stat_update_var( stats_metadata%ilh_Nrm_mc, & ! intent(in)
2923 : lh_hydromet_mc(:,hm_metadata%iiNr), & ! intent(in)
2924 0 : stats_lh_zt ) ! intent(inout)
2925 : end if
2926 :
2927 0 : if ( hm_metadata%iiNs > 0 ) then
2928 : call stat_update_var( stats_metadata%ilh_Nsm_mc, & ! intent(in)
2929 : lh_hydromet_mc(:,hm_metadata%iiNs), & ! intent(in)
2930 0 : stats_lh_zt ) ! intent(inout)
2931 : end if
2932 :
2933 0 : if ( hm_metadata%iiNg > 0 ) then
2934 : call stat_update_var( stats_metadata%ilh_Ngm_mc, & ! intent(in)
2935 : lh_hydromet_mc(:,hm_metadata%iiNg), & ! intent(in)
2936 0 : stats_lh_zt ) ! intent(inout)
2937 : end if
2938 :
2939 : call stat_update_var( stats_metadata%iAKm, AKm, & ! intent(in)
2940 0 : stats_lh_zt ) ! intent(inout)
2941 :
2942 : call stat_update_var( stats_metadata%ilh_AKm, lh_AKm, & ! intent(in)
2943 0 : stats_lh_zt) ! intent(inout)
2944 :
2945 : call stat_update_var( stats_metadata%ilh_rcm_avg, lh_rcm_avg, & ! intent(in)
2946 0 : stats_lh_zt ) ! intent(inout)
2947 :
2948 : call stat_update_var( stats_metadata%iAKstd, AKstd, & ! intent(in)
2949 0 : stats_lh_zt ) ! intent(inout)
2950 :
2951 : call stat_update_var( stats_metadata%iAKstd_cld, AKstd_cld, & ! intent(in)
2952 0 : stats_lh_zt ) ! intent(inout)
2953 :
2954 : call stat_update_var( stats_metadata%iAKm_rcm, AKm_rcm, & ! intent(in)
2955 0 : stats_lh_zt) ! intent(inout)
2956 :
2957 : call stat_update_var( stats_metadata%iAKm_rcc, AKm_rcc, & ! intent(in)
2958 0 : stats_lh_zt ) ! intent(inout)
2959 :
2960 : end if ! stats_metadata%l_stats_samp
2961 :
2962 0 : return
2963 : end subroutine stats_accumulate_lh_tend
2964 :
2965 : !-----------------------------------------------------------------------
2966 0 : subroutine stats_finalize( stats_metadata, &
2967 : stats_zt, stats_zm, stats_sfc, &
2968 : stats_lh_zt, stats_lh_sfc, &
2969 : stats_rad_zt, stats_rad_zm )
2970 :
2971 : ! Description:
2972 : ! Close NetCDF files and deallocate scratch space and
2973 : ! stats file structures.
2974 : !-----------------------------------------------------------------------
2975 :
2976 : use stats_variables, only: &
2977 : stats_metadata_type
2978 :
2979 : #ifdef NETCDF
2980 : use output_netcdf, only: &
2981 : close_netcdf ! Procedure
2982 : #endif
2983 :
2984 : use stats_type, only: stats ! Type
2985 :
2986 : implicit none
2987 :
2988 : type (stats), target, intent(inout) :: &
2989 : stats_zt, &
2990 : stats_zm, &
2991 : stats_sfc, &
2992 : stats_lh_zt, &
2993 : stats_lh_sfc, &
2994 : stats_rad_zt, &
2995 : stats_rad_zm
2996 :
2997 : type (stats_metadata_type), intent(inout) :: &
2998 : stats_metadata
2999 :
3000 0 : if ( stats_metadata%l_stats .and. stats_metadata%l_netcdf ) then
3001 : #ifdef NETCDF
3002 : call close_netcdf( stats_zt%file ) ! intent(inout)
3003 : call close_netcdf( stats_lh_zt%file ) ! intent(inout)
3004 : call close_netcdf( stats_lh_sfc%file ) ! intent(inout)
3005 : call close_netcdf( stats_zm%file ) ! intent(inout)
3006 : call close_netcdf( stats_rad_zt%file ) ! intent(inout)
3007 : call close_netcdf( stats_rad_zm%file ) ! intent(inout)
3008 : call close_netcdf( stats_sfc%file ) ! intent(inout)
3009 : #else
3010 0 : error stop "This program was not compiled with netCDF support"
3011 : #endif
3012 : end if
3013 :
3014 0 : if ( stats_metadata%l_stats ) then
3015 : ! De-allocate all stats_zt variables
3016 0 : if (allocated(stats_zt%z)) then
3017 0 : deallocate( stats_zt%z )
3018 :
3019 0 : deallocate( stats_zt%accum_field_values )
3020 0 : deallocate( stats_zt%accum_num_samples )
3021 0 : deallocate( stats_zt%l_in_update )
3022 :
3023 0 : deallocate( stats_zt%file%grid_avg_var )
3024 0 : deallocate( stats_zt%file%z )
3025 :
3026 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3027 0 : if ( allocated( stats_zt%file%lat_vals ) ) then
3028 0 : deallocate( stats_zt%file%lat_vals )
3029 : end if
3030 0 : if ( allocated( stats_zt%file%lon_vals ) ) then
3031 0 : deallocate( stats_zt%file%lon_vals )
3032 : end if
3033 :
3034 : end if
3035 :
3036 0 : if ( stats_metadata%l_silhs_out .and. allocated(stats_lh_zt%z) ) then
3037 : ! De-allocate all stats_lh_zt variables
3038 0 : deallocate( stats_lh_zt%z )
3039 :
3040 0 : deallocate( stats_lh_zt%accum_field_values )
3041 0 : deallocate( stats_lh_zt%accum_num_samples )
3042 0 : deallocate( stats_lh_zt%l_in_update )
3043 :
3044 0 : deallocate( stats_lh_zt%file%grid_avg_var )
3045 0 : deallocate( stats_lh_zt%file%z )
3046 :
3047 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3048 0 : if ( allocated(stats_lh_zt%file%lat_vals ) ) then
3049 0 : deallocate( stats_lh_zt%file%lat_vals )
3050 : end if
3051 0 : if ( allocated(stats_lh_zt%file%lon_vals ) ) then
3052 0 : deallocate( stats_lh_zt%file%lon_vals )
3053 : end if
3054 :
3055 : ! De-allocate all stats_lh_sfc variables
3056 0 : deallocate( stats_lh_sfc%z )
3057 :
3058 0 : deallocate( stats_lh_sfc%accum_field_values )
3059 0 : deallocate( stats_lh_sfc%accum_num_samples )
3060 0 : deallocate( stats_lh_sfc%l_in_update )
3061 :
3062 0 : deallocate( stats_lh_sfc%file%grid_avg_var )
3063 0 : deallocate( stats_lh_sfc%file%z )
3064 :
3065 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3066 0 : if ( allocated( stats_lh_sfc%file%lat_vals ) ) then
3067 0 : deallocate( stats_lh_sfc%file%lat_vals )
3068 : end if
3069 0 : if ( allocated( stats_lh_sfc%file%lon_vals ) ) then
3070 0 : deallocate( stats_lh_sfc%file%lon_vals )
3071 : end if
3072 : end if ! l_silhs_out
3073 :
3074 : ! De-allocate all stats_zm variables
3075 0 : if (allocated(stats_zm%z)) then
3076 0 : deallocate( stats_zm%z )
3077 :
3078 0 : deallocate( stats_zm%accum_field_values )
3079 0 : deallocate( stats_zm%accum_num_samples )
3080 0 : deallocate( stats_zm%l_in_update )
3081 :
3082 0 : deallocate( stats_zm%file%grid_avg_var )
3083 0 : deallocate( stats_zm%file%z )
3084 :
3085 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3086 0 : if ( allocated( stats_zm%file%lat_vals ) ) then
3087 0 : deallocate( stats_zm%file%lat_vals )
3088 : end if
3089 0 : if ( allocated( stats_zm%file%lon_vals ) ) then
3090 0 : deallocate( stats_zm%file%lon_vals )
3091 : end if
3092 :
3093 : end if
3094 :
3095 0 : if ( stats_metadata%l_output_rad_files ) then
3096 : ! De-allocate all stats_rad_zt variables
3097 0 : if (allocated(stats_rad_zt%z)) then
3098 0 : deallocate( stats_rad_zt%z )
3099 :
3100 0 : deallocate( stats_rad_zt%accum_field_values )
3101 0 : deallocate( stats_rad_zt%accum_num_samples )
3102 0 : deallocate( stats_rad_zt%l_in_update )
3103 :
3104 0 : deallocate( stats_rad_zt%file%grid_avg_var )
3105 0 : deallocate( stats_rad_zt%file%z )
3106 :
3107 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3108 0 : if ( allocated( stats_rad_zt%file%lat_vals ) ) then
3109 0 : deallocate( stats_rad_zt%file%lat_vals )
3110 : end if
3111 0 : if ( allocated( stats_rad_zt%file%lon_vals ) ) then
3112 0 : deallocate( stats_rad_zt%file%lon_vals )
3113 : end if
3114 :
3115 : ! De-allocate all stats_rad_zm variables
3116 0 : deallocate( stats_rad_zm%z )
3117 :
3118 0 : deallocate( stats_rad_zm%accum_field_values )
3119 0 : deallocate( stats_rad_zm%accum_num_samples )
3120 0 : deallocate( stats_rad_zm%l_in_update )
3121 :
3122 0 : deallocate( stats_rad_zm%file%grid_avg_var )
3123 0 : deallocate( stats_rad_zm%file%z )
3124 :
3125 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3126 0 : if ( allocated( stats_rad_zm%file%lat_vals ) ) then
3127 0 : deallocate( stats_rad_zm%file%lat_vals )
3128 : end if
3129 0 : if ( allocated( stats_rad_zm%file%lon_vals ) ) then
3130 0 : deallocate( stats_rad_zm%file%lon_vals )
3131 : end if
3132 :
3133 : end if
3134 :
3135 : end if ! l_output_rad_files
3136 :
3137 : ! De-allocate all stats_sfc variables
3138 0 : if (allocated(stats_sfc%z)) then
3139 0 : deallocate( stats_sfc%z )
3140 :
3141 0 : deallocate( stats_sfc%accum_field_values )
3142 0 : deallocate( stats_sfc%accum_num_samples )
3143 0 : deallocate( stats_sfc%l_in_update )
3144 :
3145 0 : deallocate( stats_sfc%file%grid_avg_var )
3146 0 : deallocate( stats_sfc%file%z )
3147 : end if
3148 :
3149 : ! Check if pointer is allocated to prevent crash in netcdf (ticket 765)
3150 0 : if ( allocated( stats_sfc%file%lat_vals ) ) then
3151 0 : deallocate( stats_sfc%file%lat_vals )
3152 : end if
3153 0 : if ( allocated( stats_sfc%file%lon_vals ) ) then
3154 0 : deallocate( stats_sfc%file%lon_vals )
3155 : end if
3156 :
3157 : ! De-allocate scalar indices
3158 0 : if (allocated(stats_metadata%isclrm)) then
3159 0 : deallocate( stats_metadata%isclrm )
3160 0 : deallocate( stats_metadata%isclrm_f )
3161 0 : deallocate( stats_metadata%iedsclrm )
3162 0 : deallocate( stats_metadata%iedsclrm_f )
3163 0 : deallocate( stats_metadata%isclrprtp )
3164 0 : deallocate( stats_metadata%isclrp2 )
3165 0 : deallocate( stats_metadata%isclrpthvp )
3166 0 : deallocate( stats_metadata%isclrpthlp )
3167 0 : deallocate( stats_metadata%isclrprcp )
3168 0 : deallocate( stats_metadata%iwpsclrp )
3169 0 : deallocate( stats_metadata%iwp2sclrp )
3170 0 : deallocate( stats_metadata%iwpsclrp2 )
3171 0 : deallocate( stats_metadata%iwpsclrprtp )
3172 0 : deallocate( stats_metadata%iwpsclrpthlp )
3173 0 : deallocate( stats_metadata%iwpedsclrp )
3174 : end if
3175 :
3176 : ! De-allocate hyderometeor statistical variables
3177 0 : if (allocated(stats_metadata%ihm_1)) then
3178 0 : deallocate( stats_metadata%ihm_1 )
3179 0 : deallocate( stats_metadata%ihm_2 )
3180 0 : deallocate( stats_metadata%imu_hm_1 )
3181 0 : deallocate( stats_metadata%imu_hm_2 )
3182 0 : deallocate( stats_metadata%imu_hm_1_n )
3183 0 : deallocate( stats_metadata%imu_hm_2_n )
3184 0 : deallocate( stats_metadata%isigma_hm_1 )
3185 0 : deallocate( stats_metadata%isigma_hm_2 )
3186 0 : deallocate( stats_metadata%isigma_hm_1_n )
3187 0 : deallocate( stats_metadata%isigma_hm_2_n )
3188 0 : deallocate( stats_metadata%icorr_w_hm_1 )
3189 0 : deallocate( stats_metadata%icorr_w_hm_2 )
3190 0 : deallocate( stats_metadata%icorr_chi_hm_1 )
3191 0 : deallocate( stats_metadata%icorr_chi_hm_2 )
3192 0 : deallocate( stats_metadata%icorr_eta_hm_1 )
3193 0 : deallocate( stats_metadata%icorr_eta_hm_2 )
3194 0 : deallocate( stats_metadata%icorr_Ncn_hm_1 )
3195 0 : deallocate( stats_metadata%icorr_Ncn_hm_2 )
3196 0 : deallocate( stats_metadata%icorr_hmx_hmy_1 )
3197 0 : deallocate( stats_metadata%icorr_hmx_hmy_2 )
3198 0 : deallocate( stats_metadata%icorr_w_hm_1_n )
3199 0 : deallocate( stats_metadata%icorr_w_hm_2_n )
3200 0 : deallocate( stats_metadata%icorr_chi_hm_1_n )
3201 0 : deallocate( stats_metadata%icorr_chi_hm_2_n )
3202 0 : deallocate( stats_metadata%icorr_eta_hm_1_n )
3203 0 : deallocate( stats_metadata%icorr_eta_hm_2_n )
3204 0 : deallocate( stats_metadata%icorr_Ncn_hm_1_n )
3205 0 : deallocate( stats_metadata%icorr_Ncn_hm_2_n )
3206 0 : deallocate( stats_metadata%icorr_hmx_hmy_1_n )
3207 0 : deallocate( stats_metadata%icorr_hmx_hmy_2_n )
3208 0 : deallocate( stats_metadata%ihmp2_zt )
3209 0 : deallocate( stats_metadata%iwp2hmp )
3210 0 : deallocate( stats_metadata%ihydrometp2 )
3211 0 : deallocate( stats_metadata%iwphydrometp )
3212 0 : deallocate( stats_metadata%irtphmp )
3213 0 : deallocate( stats_metadata%ithlphmp )
3214 0 : deallocate( stats_metadata%ihmxphmyp )
3215 0 : deallocate( stats_metadata%iK_hm )
3216 : end if
3217 :
3218 0 : if ( allocated( stats_metadata%isilhs_variance_category ) ) then
3219 0 : deallocate( stats_metadata%isilhs_variance_category )
3220 0 : deallocate( stats_metadata%ilh_samp_frac_category )
3221 : end if
3222 :
3223 : end if ! l_stats
3224 :
3225 0 : return
3226 : end subroutine stats_finalize
3227 :
3228 : !===============================================================================
3229 :
3230 : !-----------------------------------------------------------------------
3231 0 : subroutine stats_check_num_samples( stats_grid, stats_metadata, &
3232 : l_error )
3233 :
3234 : ! Description:
3235 : ! Ensures that each variable in a stats grid is sampled the correct
3236 : ! number of times.
3237 : ! References:
3238 : ! None
3239 : !-----------------------------------------------------------------------
3240 :
3241 : use constants_clubb, only: &
3242 : fstderr ! Constant
3243 :
3244 : use stats_type, only: &
3245 : stats ! Type
3246 :
3247 : use stats_variables, only: &
3248 : stats_metadata_type
3249 :
3250 : use error_code, only: &
3251 : clubb_at_least_debug_level ! Procedure
3252 :
3253 : implicit none
3254 :
3255 : ! Input Variables
3256 : type (stats), intent(in) :: &
3257 : stats_grid ! Grid type [grid]
3258 :
3259 : type (stats_metadata_type), intent(in) :: &
3260 : stats_metadata
3261 :
3262 : ! Input/Output Variables
3263 : logical, intent(inout) :: &
3264 : l_error ! Indicates an error [boolean]
3265 :
3266 : ! Local Variables
3267 : integer :: ivar, kvar ! Loop variable [index]
3268 :
3269 : logical :: l_proper_sample
3270 :
3271 : !-----------------------------------------------------------------------
3272 :
3273 : !----- Begin Code -----
3274 :
3275 : ! Look for errors by checking the number of sampling points
3276 : ! for each variable in the statistics grid at each vertical level.
3277 0 : do ivar = 1, stats_grid%num_output_fields
3278 0 : do kvar = 1, stats_grid%kk
3279 :
3280 0 : l_proper_sample = ( stats_grid%accum_num_samples(1,1,kvar,ivar) == 0 .or. &
3281 : stats_grid%accum_num_samples(1,1,kvar,ivar) &
3282 : == floor( stats_metadata%stats_tout &
3283 0 : / stats_metadata%stats_tsamp ) )
3284 :
3285 0 : if ( .not. l_proper_sample ) then
3286 :
3287 0 : l_error = .true. ! This will stop the run
3288 :
3289 0 : if ( clubb_at_least_debug_level( 1 ) ) then
3290 0 : write(fstderr,*) 'Possible sampling error for variable ', &
3291 0 : trim(stats_grid%file%grid_avg_var(ivar)%name), ' in stats_grid ', &
3292 0 : 'at k = ', kvar, &
3293 0 : '; stats_grid%accum_num_samples(',kvar,',',ivar,') = ', &
3294 0 : stats_grid%accum_num_samples(1,1,kvar,ivar)
3295 : end if ! clubb_at_lest_debug_level 1
3296 :
3297 :
3298 : end if ! .not. l_proper_sample
3299 :
3300 : end do ! kvar = 1 .. stats_grid%kk
3301 : end do ! ivar = 1 .. stats_grid%num_output_fields
3302 :
3303 0 : return
3304 : end subroutine stats_check_num_samples
3305 : !-----------------------------------------------------------------------
3306 :
3307 : end module stats_clubb_utilities
|