Line data Source code
1 : !-----------------------------------------------------------------------
2 : ! $Id$
3 : !===============================================================================
4 : module stats_type_utilities
5 :
6 : ! Description:
7 : ! Contains subroutines for interfacing with type, stats
8 : !-----------------------------------------------------------------------
9 :
10 : use stats_type, only: &
11 : stats ! type
12 :
13 : use clubb_precision, only: &
14 : core_rknd
15 :
16 : implicit none
17 :
18 : private ! Set Default Scope
19 :
20 : public :: stat_assign, &
21 : stat_update_var, &
22 : stat_update_var_pt, &
23 : stat_begin_update, &
24 : stat_begin_update_pt, &
25 : stat_end_update, &
26 : stat_end_update_pt, &
27 : stat_modify, &
28 : stat_modify_pt
29 : contains
30 :
31 : !=============================================================================
32 0 : subroutine stat_assign( var_index, var_name, &
33 : var_description, var_units, &
34 : l_silhs, &
35 : grid_kind )
36 :
37 : ! Description:
38 : ! Assigns pointers for statistics variables in grid. There is an
39 : ! option to make the variable a SILHS variable (updated n_microphys_calls
40 : ! times per timestep rather than just once).
41 :
42 : !
43 : ! References:
44 : ! None
45 : !-----------------------------------------------------------------------
46 :
47 : implicit none
48 :
49 : ! Input Variables
50 :
51 : integer,intent(in) :: var_index ! Variable index [#]
52 : character(len = *), intent(in) :: var_name ! Variable name []
53 : character(len = *), intent(in) :: var_description ! Variable description []
54 : character(len = *), intent(in) :: var_units ! Variable units []
55 :
56 : logical, intent(in) :: l_silhs ! SILHS variable [boolean]
57 :
58 : ! Input/Output Variable
59 :
60 : ! Which grid the variable is located on (e.g., zt, zm, sfc)
61 : type(stats), target, intent(inout) :: grid_kind
62 :
63 0 : grid_kind%file%grid_avg_var(var_index)%ptr => grid_kind%accum_field_values(:,:,:,var_index)
64 0 : grid_kind%file%grid_avg_var(var_index)%name = var_name
65 0 : grid_kind%file%grid_avg_var(var_index)%description = var_description
66 0 : grid_kind%file%grid_avg_var(var_index)%units = var_units
67 :
68 0 : grid_kind%file%grid_avg_var(var_index)%l_silhs = l_silhs
69 :
70 : !Example of the old format
71 : !changed by Joshua Fasching 23 August 2007
72 :
73 : !stats_zt%file%var(stats_metadata%ithlm)%ptr => stats_zt%accum_field_values(:,k)
74 : !stats_zt%file%var(stats_metadata%ithlm)%name = "thlm"
75 : !stats_zt%file%var(stats_metadata%ithlm)%description = "thetal (K)"
76 : !stats_zt%file%var(stats_metadata%ithlm)%units = "K"
77 :
78 0 : return
79 :
80 0 : end subroutine stat_assign
81 :
82 : !=============================================================================
83 0 : subroutine stat_update_var( var_index, value, &
84 : grid_kind )
85 :
86 : ! Description:
87 : ! This updates the value of a statistics variable located at var_index
88 : ! associated with grid type 'grid_kind' (zt, zm, or sfc).
89 : !
90 : ! This subroutine is used when a statistical variable needs to be updated
91 : ! only once during a model timestep.
92 : !
93 : ! In regards to budget terms, this subroutine is used for variables that
94 : ! are either completely implicit (e.g. wprtp_ma) or completely explicit
95 : ! (e.g. wp2_pr3). For completely implicit terms, once the variable has been
96 : ! solved for, the implicit contribution can be finalized. The finalized
97 : ! implicit contribution is sent into stat_update_var_pt. For completely
98 : ! explicit terms, the explicit contribution is sent into stat_update_var_pt
99 : ! once it has been calculated.
100 : !---------------------------------------------------------------------
101 :
102 : use clubb_precision, only: &
103 : stat_rknd ! Constant
104 :
105 : use stat_file_module, only: &
106 : clubb_i, clubb_j ! Variable(s)
107 :
108 : implicit none
109 :
110 : ! Input Variables(s)
111 :
112 : integer, intent(in) :: &
113 : var_index ! The index at which the variable is stored []
114 :
115 : ! Input/Output Variable(s)
116 : type(stats), intent(inout) :: &
117 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc )
118 :
119 : ! Input Variable(s) NOTE: Due to the implicit none above, these must
120 : ! be declared below to allow the use of grid_kind
121 :
122 : real( kind = core_rknd ), dimension(grid_kind%kk), intent(in) :: &
123 : value ! Value of field being added to the statistic [Units Vary]
124 :
125 : integer :: k
126 :
127 0 : if ( var_index > 0 ) then
128 0 : do k = 1, grid_kind%kk
129 0 : grid_kind%accum_field_values(clubb_i,clubb_j,k,var_index) = &
130 0 : grid_kind%accum_field_values(clubb_i,clubb_j,k,var_index) + real( value(k), &
131 0 : kind=stat_rknd )
132 0 : grid_kind%accum_num_samples(clubb_i,clubb_j,k,var_index) = &
133 0 : grid_kind%accum_num_samples(clubb_i,clubb_j,k,var_index) + 1
134 : end do
135 : endif
136 :
137 0 : return
138 : end subroutine stat_update_var
139 :
140 : !=============================================================================
141 0 : subroutine stat_update_var_pt( var_index, grid_level, value, &
142 : grid_kind )
143 :
144 : ! Description:
145 : ! This updates the value of a statistics variable located at var_index
146 : ! associated with grid type 'grid_kind' at a specific grid_level.
147 : !
148 : ! See the description of stat_update_var for more details.
149 : !---------------------------------------------------------------------
150 :
151 : use clubb_precision, only: &
152 : stat_rknd ! Constant
153 :
154 : use stat_file_module, only: &
155 : clubb_i, clubb_j ! Variable(s)
156 :
157 : implicit none
158 :
159 : ! Input Variables(s)
160 :
161 : integer, intent(in) :: &
162 : var_index, & ! The index at which the variable is stored []
163 : grid_level ! The level at which the variable is to be modified []
164 :
165 : real( kind = core_rknd ), intent(in) :: &
166 : value ! Value of field being added to the statistic [Units Vary]
167 :
168 : ! Input/Output Variable(s)
169 : type(stats), intent(inout) :: &
170 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
171 :
172 0 : if ( var_index > 0 ) then
173 :
174 0 : grid_kind%accum_field_values(clubb_i,clubb_j,grid_level,var_index) = &
175 : grid_kind%accum_field_values(clubb_i,clubb_j,grid_level,var_index) + &
176 0 : real( value, kind=stat_rknd )
177 :
178 0 : grid_kind%accum_num_samples(clubb_i,clubb_j,grid_level,var_index) = &
179 0 : grid_kind%accum_num_samples(clubb_i,clubb_j,grid_level,var_index) + 1
180 :
181 : endif
182 :
183 0 : return
184 : end subroutine stat_update_var_pt
185 :
186 : !=============================================================================
187 0 : subroutine stat_begin_update(nz, var_index, value, &
188 : grid_kind )
189 :
190 : ! Description:
191 : ! This begins an update of the value of a statistics variable located at
192 : ! var_index on the (zt, zm, or sfc) grid. It is used in conjunction with
193 : ! subroutine stat_end_update.
194 : !
195 : ! This subroutine is used when a statistical variable needs to be updated
196 : ! more than one time during a model timestep. Commonly, this is used for
197 : ! beginning a budget term calculation.
198 : !
199 : ! In this type of stats calculation, we first subtract the field
200 : ! (e.g. rtm / dt ) from the statistic, then update rtm by a term
201 : ! (e.g. clip rtm), and then re-add the field (e.g. rtm / dt) to the
202 : ! statistic.
203 : !
204 : ! Example:
205 : !
206 : ! call stat_begin_update( stats_metadata%irtm_bt, real(rtm / dt), stats_zt )
207 : !
208 : ! !!! Perform clipping of rtm !!!
209 : !
210 : ! call stat_end_update( stats_metadata%irtm_bt, real(rtm / dt), stats_zt )
211 : !
212 : ! This subroutine is often used with stats budget terms for variables that
213 : ! have both implicit and explicit components (e.g. wp3_ta). The explicit
214 : ! component is sent into stat_begin_update_pt (with the sign reversed
215 : ! because stat_begin_update_pt automatically subtracts the value sent into
216 : ! it). Then, once the variable has been solved for, the implicit
217 : ! statistical contribution can be finalized. The finalized implicit
218 : ! component is sent into stat_end_update_pt.
219 : !---------------------------------------------------------------------
220 :
221 : implicit none
222 :
223 : ! Input Variables(s)
224 : integer, intent(in) :: &
225 : nz
226 :
227 : integer, intent(in) :: &
228 : var_index ! The index at which the variable is stored []
229 :
230 : real( kind = core_rknd ), dimension(nz), intent(in) :: &
231 : value ! Value of field being added to the statistic [Units Vary]
232 :
233 : ! Input/Output Variable(s)
234 : type(stats), intent(inout) :: &
235 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
236 :
237 : integer :: i
238 :
239 0 : do i = 1,nz
240 :
241 : call stat_begin_update_pt &
242 0 : ( var_index, i, value(i), & ! intent(in)
243 0 : grid_kind ) ! intent(inout)
244 :
245 : enddo
246 :
247 0 : return
248 : end subroutine stat_begin_update
249 :
250 : !=============================================================================
251 0 : subroutine stat_begin_update_pt &
252 : ( var_index, grid_level, value, &
253 : grid_kind )
254 :
255 : ! Description:
256 : ! This begins an update of the value of a statistics variable located at
257 : ! var_index associated with the grid type (grid_kind) at a specific
258 : ! grid_level. It is used in conjunction with subroutine stat_end_update_pt.
259 : !
260 : ! Notes:
261 : ! Commonly this is used for beginning a budget. See the description of
262 : ! stat_begin_update for more details.
263 : !
264 : ! References:
265 : ! None
266 : !---------------------------------------------------------------------
267 :
268 : use clubb_precision, only: &
269 : stat_rknd ! Constant
270 :
271 : use stat_file_module, only: &
272 : clubb_i, clubb_j ! Variable(s)
273 :
274 : use constants_clubb, only: &
275 : fstderr ! Constant(s)
276 :
277 : use error_code, only: &
278 : clubb_at_least_debug_level ! Procedure
279 :
280 : implicit none
281 :
282 : ! Input Variables(s)
283 :
284 : integer, intent(in) :: &
285 : var_index, & ! The index at which the variable is stored []
286 : grid_level ! The level at which the variable is to be modified []
287 :
288 : real( kind = core_rknd ), intent(in) :: &
289 : value ! Value of field being added to the statistic [Units Vary]
290 :
291 : ! Input/Output Variable(s)
292 : type(stats), intent(inout) :: &
293 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
294 :
295 : ! ---- Begin Code ----
296 :
297 0 : if ( var_index > 0 ) then ! Are we storing this variable?
298 :
299 : ! Can we begin an update?
300 0 : if ( .not. grid_kind%l_in_update(clubb_i,clubb_j,grid_level,var_index) ) then
301 :
302 0 : grid_kind%accum_field_values(clubb_i,clubb_j,grid_level, var_index) = &
303 : grid_kind%accum_field_values(clubb_i,clubb_j,grid_level, var_index) - &
304 0 : real( value, kind=stat_rknd )
305 :
306 0 : grid_kind%l_in_update(clubb_i,clubb_j,grid_level, var_index) = .true. ! Start Record
307 :
308 0 : else if ( clubb_at_least_debug_level( 1 ) ) then
309 :
310 : write(fstderr,*) "Beginning an update before finishing previous for variable: "// &
311 0 : trim( grid_kind%file%grid_avg_var(var_index)%name )
312 : endif
313 :
314 : endif
315 :
316 0 : return
317 : end subroutine stat_begin_update_pt
318 :
319 : !=============================================================================
320 0 : subroutine stat_end_update(nz, var_index, value, &
321 : grid_kind )
322 :
323 : ! Description:
324 : ! This ends an update of the value of a statistics variable located at
325 : ! var_index on the (zt, zm, or sfc) grid. It is used in conjunction with
326 : ! subroutine stat_begin_update.
327 : !
328 : ! This subroutine is used when a statistical variable needs to be updated
329 : ! more than one time during a model timestep. Commonly, this is used for
330 : ! finishing a budget term calculation.
331 : !
332 : ! In this type of stats calculation, we first subtract the field
333 : ! (e.g. rtm / dt ) from the statistic, then update rtm by a term
334 : ! (e.g. clip rtm), and then re-add the field (e.g. rtm / dt) to the
335 : ! statistic.
336 : !
337 : ! Example:
338 : !
339 : ! call stat_begin_update( stats_metadata%irtm_bt, real(rtm / dt), stats_zt )
340 : !
341 : ! !!! Perform clipping of rtm !!!
342 : !
343 : ! call stat_end_update( stats_metadata%irtm_bt, real(rtm / dt), stats_zt )
344 : !
345 : ! This subroutine is often used with stats budget terms for variables that
346 : ! have both implicit and explicit components (e.g. wp3_ta). The explicit
347 : ! component is sent into stat_begin_update_pt (with the sign reversed
348 : ! because stat_begin_update_pt automatically subtracts the value sent into
349 : ! it). Then, once the variable has been solved for, the implicit
350 : ! statistical contribution can be finalized. The finalized implicit
351 : ! component is sent into stat_end_update_pt.
352 : !---------------------------------------------------------------------
353 :
354 : implicit none
355 :
356 : ! Input Variables(s)
357 : integer, intent(in) :: &
358 : nz
359 :
360 : integer, intent(in) :: &
361 : var_index ! The index at which the variable is stored []
362 :
363 : real( kind = core_rknd ), dimension(nz), intent(in) :: &
364 : value ! Value of field being added to the statistic [Units Vary]
365 :
366 : ! Input/Output Variable(s)
367 : type(stats), intent(inout) :: &
368 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
369 :
370 : integer :: k
371 :
372 : ! ---- Begin Code ----
373 :
374 0 : do k = 1,nz
375 : call stat_end_update_pt &
376 0 : ( var_index, k, value(k), & ! intent(in)
377 0 : grid_kind ) ! intent(inout)
378 : enddo
379 :
380 0 : return
381 : end subroutine stat_end_update
382 :
383 : !=============================================================================
384 0 : subroutine stat_end_update_pt &
385 : ( var_index, grid_level, value, &
386 : grid_kind )
387 :
388 : ! Description:
389 : ! This ends an update of the value of a statistics variable located at
390 : ! var_index associated with the grid type (grid_kind) at a specific
391 : ! grid_level. It is used in conjunction with subroutine
392 : ! stat_begin_update_pt.
393 : !
394 : ! Commonly this is used for finishing a budget. See the description of
395 : ! stat_end_update for more details.
396 : !---------------------------------------------------------------------
397 :
398 : use stat_file_module, only: &
399 : clubb_i, clubb_j ! Variable(s)
400 :
401 : use constants_clubb, only: &
402 : fstderr ! Constant(s)
403 :
404 : use error_code, only: &
405 : clubb_at_least_debug_level ! Procedure
406 :
407 : implicit none
408 :
409 : ! Input Variables(s)
410 :
411 : integer, intent(in) :: &
412 : var_index, & ! The index at which the variable is stored []
413 : grid_level ! The level at which the variable is to be modified []
414 :
415 : real( kind = core_rknd ), intent(in) :: &
416 : value ! Value of field being added to the statistic [Units Vary]
417 :
418 : ! Input/Output Variable(s)
419 : type(stats), intent(inout) :: &
420 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
421 :
422 : ! ---- Begin Code ----
423 :
424 0 : if ( var_index > 0 ) then ! Are we storing this variable?
425 :
426 : ! Can we end an update?
427 0 : if ( grid_kind%l_in_update(clubb_i,clubb_j,grid_level,var_index) ) then
428 :
429 : call stat_update_var_pt &
430 : ( var_index, grid_level, value, & ! intent(in)
431 0 : grid_kind ) ! intent(inout)
432 :
433 0 : grid_kind%l_in_update(clubb_i,clubb_j,grid_level,var_index) = .false. ! End Record
434 :
435 0 : else if ( clubb_at_least_debug_level( 1 ) ) then
436 :
437 0 : write(fstderr,*) "Ending before beginning update. For variable "// &
438 0 : grid_kind%file%grid_avg_var(var_index)%name
439 : endif
440 :
441 : endif
442 :
443 0 : return
444 : end subroutine stat_end_update_pt
445 :
446 : !=============================================================================
447 0 : subroutine stat_modify(nz, var_index, value, &
448 : grid_kind )
449 :
450 : ! Description:
451 : ! This modifies the value of a statistics variable located at var_index on
452 : ! the (zt, zm, or sfc) grid. It does not increment the sampling count.
453 : !
454 : ! This subroutine is normally used when a statistical variable needs to be
455 : ! updated more than twice during a model timestep. Commonly, this is used
456 : ! if a budget term calculation needs an intermediate modification between
457 : ! stat_begin_update and stat_end_update.
458 : !---------------------------------------------------------------------
459 :
460 : implicit none
461 :
462 : ! Input Variables(s)
463 : integer, intent(in) :: &
464 : nz
465 :
466 : integer, intent(in) :: &
467 : var_index ! The index at which the variable is stored []
468 :
469 : real( kind = core_rknd ), dimension(nz), intent(in) :: &
470 : value ! Value of field being added to the statistic [Units Vary]
471 :
472 : ! Input/Output Variable(s)
473 : type(stats), intent(inout) :: &
474 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
475 :
476 : integer :: k
477 :
478 : ! ---- Begin Code ----
479 :
480 0 : do k = 1,nz
481 :
482 0 : call stat_modify_pt( var_index, k, value(k), & ! intent(in)
483 0 : grid_kind ) ! intent(inout)
484 :
485 : enddo
486 :
487 0 : return
488 : end subroutine stat_modify
489 :
490 : !=============================================================================
491 0 : subroutine stat_modify_pt( var_index, grid_level, value, &
492 : grid_kind )
493 :
494 : ! Description:
495 : ! This modifies the value of a statistics variable located at var_index on
496 : ! the grid at a specific point. It does not increment the sampling count.
497 : !
498 : ! Commonly this is used for intermediate updates to a budget. See the
499 : ! description of stat_modify for more details.
500 : !---------------------------------------------------------------------
501 :
502 : use clubb_precision, only: &
503 : stat_rknd ! Constant
504 :
505 : use stat_file_module, only: &
506 : clubb_i, clubb_j ! Variable(s)
507 :
508 : implicit none
509 :
510 : ! Input Variables(s)
511 :
512 : integer, intent(in) :: &
513 : var_index ! The index at which the variable is stored []
514 :
515 :
516 : real( kind = core_rknd ), intent(in) :: &
517 : value ! Value of field being added to the statistic [Units Vary]
518 :
519 : integer, intent(in) :: &
520 : grid_level ! The level at which the variable is to be modified []
521 :
522 : ! Input/Output Variable(s)
523 : type(stats), intent(inout) :: &
524 : grid_kind ! Which grid the variable is located on (zt, zm, rad, or sfc).
525 :
526 : ! ---- Begin Code ----
527 :
528 0 : if ( var_index > 0 ) then
529 :
530 0 : grid_kind%accum_field_values(clubb_i,clubb_j,grid_level,var_index ) &
531 : = grid_kind%accum_field_values(clubb_i,clubb_j,grid_level,var_index ) + &
532 0 : real( value, kind=stat_rknd )
533 :
534 : end if
535 :
536 0 : return
537 : end subroutine stat_modify_pt
538 :
539 : !===============================================================================
540 :
541 : end module stats_type_utilities
|