22#define DEBUG_REDUCT .false.
26subroutine do_time_none_ (data_out, data_in, mask, is_masked, bounds_in, bounds_out, missing_value)
27 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
28 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
29 logical,
intent(in) :: mask(:,:,:,:)
30 logical,
intent(in) :: is_masked
31 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
33 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
35 real(FMS_TRM_KIND_),
intent(in) :: missing_value
37 integer :: is_in, ie_in, js_in, je_in, ks_in, ke_in
39 integer :: is_out, ie_out, js_out, je_out, ks_out, ke_out
42 is_out = bounds_out%get_imin()
43 ie_out = bounds_out%get_imax()
44 js_out = bounds_out%get_jmin()
45 je_out = bounds_out%get_jmax()
46 ks_out = bounds_out%get_kmin()
47 ke_out = bounds_out%get_kmax()
49 is_in = bounds_in%get_imin()
50 ie_in = bounds_in%get_imax()
51 js_in = bounds_in%get_jmin()
52 je_in = bounds_in%get_jmax()
53 ks_in = bounds_in%get_kmin()
54 ke_in = bounds_in%get_kmax()
57 where (mask(is_in:ie_in, js_in:je_in, ks_in:ke_in, :))
58 data_out(is_out:ie_out, js_out:je_out, ks_out:ke_out, :, 1) = &
59 data_in(is_in:ie_in, js_in:je_in, ks_in:ke_in, :)
61 data_out(is_out:ie_out, js_out:je_out, ks_out:ke_out, :, 1) = missing_value
64 data_out(is_out:ie_out, js_out:je_out, ks_out:ke_out, :, 1) = &
65 data_in(is_in:ie_in, js_in:je_in, ks_in:ke_in, :)
68end subroutine do_time_none_
71subroutine do_time_min_ (data_out, data_in, mask, is_masked, bounds_in, bounds_out, missing_value)
72 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
73 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
74 logical,
intent(in) :: mask(:,:,:,:)
75 logical,
intent(in) :: is_masked
76 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
78 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
80 real(FMS_TRM_KIND_),
intent(in) :: missing_value
82 integer :: is_in, ie_in, js_in, je_in, ks_in, ke_in
84 integer :: is_out, ie_out, js_out, je_out, ks_out, ke_out
89 is_out = bounds_out%get_imin()
90 ie_out = bounds_out%get_imax()
91 js_out = bounds_out%get_jmin()
92 je_out = bounds_out%get_jmax()
93 ks_out = bounds_out%get_kmin()
94 ke_out = bounds_out%get_kmax()
96 is_in = bounds_in%get_imin()
97 ie_in = bounds_in%get_imax()
98 js_in = bounds_in%get_jmin()
99 je_in = bounds_in%get_jmax()
100 ks_in = bounds_in%get_kmin()
101 ke_in = bounds_in%get_kmax()
106 do l = 0,
size(data_out, 4) - 1
107 do k = 0, ke_out - ks_out
108 do j = 0, je_out - js_out
109 do i = 0, ie_out - is_out
110 if (mask(is_in + i, js_in + j, ks_in + k, l + 1))
then
111 if (data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) .gt. &
112 data_in(is_in + i, js_in + j, ks_in + k, l + 1) )
then
113 data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) = &
114 data_in(is_in +i, js_in + j, ks_in + k, l + 1)
117 data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) = missing_value
124 do l = 0,
size(data_out, 4) - 1
125 do k = 0, ke_out - ks_out
126 do j = 0, je_out - js_out
127 do i = 0, ie_out - is_out
128 if (data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) .gt. &
129 data_in(is_in + i, js_in + j, ks_in + k, l + 1) )
then
130 data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) = &
131 data_in(is_in +i, js_in + j, ks_in + k, l + 1)
139end subroutine do_time_min_
142subroutine do_time_max_ (data_out, data_in, mask, is_masked, bounds_in, bounds_out, missing_value)
143 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
144 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
145 logical,
intent(in) :: mask(:,:,:,:)
146 logical,
intent(in) :: is_masked
147 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
149 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
151 real(FMS_TRM_KIND_),
intent(in) :: missing_value
153 integer :: is_in, ie_in, js_in, je_in, ks_in, ke_in
155 integer :: is_out, ie_out, js_out, je_out, ks_out, ke_out
158 integer :: i, j, k, l
160 is_out = bounds_out%get_imin()
161 ie_out = bounds_out%get_imax()
162 js_out = bounds_out%get_jmin()
163 je_out = bounds_out%get_jmax()
164 ks_out = bounds_out%get_kmin()
165 ke_out = bounds_out%get_kmax()
167 is_in = bounds_in%get_imin()
168 ie_in = bounds_in%get_imax()
169 js_in = bounds_in%get_jmin()
170 je_in = bounds_in%get_jmax()
171 ks_in = bounds_in%get_kmin()
172 ke_in = bounds_in%get_kmax()
177 do l = 0,
size(data_out, 4) - 1
178 do k = 0, ke_out - ks_out
179 do j = 0, je_out - js_out
180 do i = 0, ie_out - is_out
181 if (mask(is_in + i, js_in + j, ks_in + k, l + 1))
then
182 if (data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) .lt. &
183 data_in(is_in + i, js_in + j, ks_in + k, l + 1) )
then
184 data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) = &
185 data_in(is_in +i, js_in + j, ks_in + k, l + 1)
188 data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) = missing_value
195 do l = 0,
size(data_out, 4) - 1
196 do k = 0, ke_out - ks_out
197 do j = 0, je_out - js_out
198 do i = 0, ie_out - is_out
199 if (data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) .lt. &
200 data_in(is_in + i, js_in + j, ks_in + k, l + 1) )
then
201 data_out(is_out + i, js_out + j, ks_out + k, l + 1, 1) = &
202 data_in(is_in +i, js_in + j, ks_in + k, l + 1)
209end subroutine do_time_max_
217subroutine do_time_sum_update_(data_out, weight_sum, data_in, mask, is_masked, mask_variant, bounds_in, bounds_out, &
218 missing_value, diurnal_section, weight, pow)
219 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
220 real(r8_kind),
intent(inout) :: weight_sum(:,:,:,:)
221 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
222 logical,
intent(in) :: mask(:,:,:,:)
223 logical,
intent(in) :: is_masked
224 logical,
intent(in) :: mask_variant
225 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
227 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
229 real(FMS_TRM_KIND_),
intent(in) :: missing_value
230 integer,
intent(in) :: diurnal_section
233 real(r8_kind),
optional,
intent(in) :: weight
235 integer ,
optional,
intent(in) :: pow
238 real(FMS_TRM_KIND_) :: weight_scale
239 integer,
parameter :: kindl = fms_trm_kind_
243 if(
present(weight))
then
244 weight_scale = real(weight, kind=kindl)
246 weight_scale = 1.0_kindl
249 if(diurnal_section .lt. 0)
then
252 diurnal = diurnal_section
256 if (mask_variant)
then
258 call sum_mask_variant(data_out, data_in, weight_sum, bounds_in, bounds_out, mask, diurnal, weight_scale, pow)
260 call sum_mask(data_out, data_in, weight_sum, bounds_in, bounds_out, mask, diurnal, &
261 missing_value, weight_scale, pow)
264 call sum_no_mask(data_out, data_in, weight_sum, bounds_in, bounds_out, diurnal, weight_scale, pow)
266end subroutine do_time_sum_update_
268subroutine sum_mask_(data_out, data_in, weight_sum, bounds_in, bounds_out, mask, diurnal, missing_value, &
270 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
271 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
272 real(r8_kind),
intent(inout) :: weight_sum(:,:,:,:)
273 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
275 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
277 logical,
intent(in) :: mask(:,:,:,:)
278 integer,
intent(in) :: diurnal
280 real(FMS_TRM_KIND_),
intent(in) :: missing_value
281 real(FMS_TRM_KIND_),
intent(in) :: weight_scale
282 integer ,
optional,
intent(in) :: pow
285 integer :: is_in, ie_in, js_in, je_in, ks_in, ke_in
287 integer :: is_out, ie_out, js_out, je_out, ks_out, ke_out
290 integer :: i, j, k, l
292 is_out = bounds_out%get_imin()
293 ie_out = bounds_out%get_imax()
294 js_out = bounds_out%get_jmin()
295 je_out = bounds_out%get_jmax()
296 ks_out = bounds_out%get_kmin()
297 ke_out = bounds_out%get_kmax()
299 is_in = bounds_in%get_imin()
300 ie_in = bounds_in%get_imax()
301 js_in = bounds_in%get_jmin()
302 je_in = bounds_in%get_jmax()
303 ks_in = bounds_in%get_kmin()
304 ke_in = bounds_in%get_kmax()
306 weight_sum = weight_sum + weight_scale
307 if (
present(pow))
then
308 do k = 0, ke_out - ks_out
309 do j = 0, je_out - js_out
310 do i = 0, ie_out - is_out
311 where (mask(is_in + i, js_in + j, ks_in + k, :))
312 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = &
313 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) &
314 + (data_in(is_in +i, js_in + j, ks_in + k, :) * weight_scale) ** pow
316 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = missing_value
322 do k = 0, ke_out - ks_out
323 do j = 0, je_out - js_out
324 do i = 0, ie_out - is_out
325 where (mask(is_in + i, js_in + j, ks_in + k, :))
326 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = &
327 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) &
328 + (data_in(is_in +i, js_in + j, ks_in + k, :) * weight_scale)
330 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = missing_value
336end subroutine sum_mask_
338subroutine sum_mask_variant_(data_out, data_in, weight_sum, bounds_in, bounds_out, mask, diurnal, weight_scale, pow)
339 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
340 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
341 real(r8_kind),
intent(inout) :: weight_sum(:,:,:,:)
342 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
344 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
346 logical,
intent(in) :: mask(:,:,:,:)
347 integer,
intent(in) :: diurnal
349 real(FMS_TRM_KIND_),
intent(in) :: weight_scale
350 integer ,
optional,
intent(in) :: pow
353 integer :: is_in, ie_in, js_in, je_in, ks_in, ke_in
355 integer :: is_out, ie_out, js_out, je_out, ks_out, ke_out
358 integer :: i, j, k, l
360 is_out = bounds_out%get_imin()
361 ie_out = bounds_out%get_imax()
362 js_out = bounds_out%get_jmin()
363 je_out = bounds_out%get_jmax()
364 ks_out = bounds_out%get_kmin()
365 ke_out = bounds_out%get_kmax()
367 is_in = bounds_in%get_imin()
368 ie_in = bounds_in%get_imax()
369 js_in = bounds_in%get_jmin()
370 je_in = bounds_in%get_jmax()
371 ks_in = bounds_in%get_kmin()
372 ke_in = bounds_in%get_kmax()
374 if (
present(pow))
then
375 do k = 0, ke_out - ks_out
376 do j = 0, je_out - js_out
377 do i = 0, ie_out - is_out
378 where (mask(is_in + i, js_in + j, ks_in + k, :))
379 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = &
380 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) &
381 + (data_in(is_in +i, js_in + j, ks_in + k, :) * weight_scale) ** pow
384 weight_sum(is_out + i, js_out + j, ks_out + k, :) = &
385 weight_sum(is_out + i, js_out + j, ks_out + k, :) + weight_scale
391 do k = 0, ke_out - ks_out
392 do j = 0, je_out - js_out
393 do i = 0, ie_out - is_out
394 where (mask(is_in + i, js_in + j, ks_in + k, :))
395 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = &
396 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) &
397 + (data_in(is_in +i, js_in + j, ks_in + k, :) * weight_scale)
400 weight_sum(is_out + i, js_out + j, ks_out + k, :) = &
401 weight_sum(is_out + i, js_out + j, ks_out + k, :) + weight_scale
407end subroutine sum_mask_variant_
409subroutine sum_no_mask_(data_out, data_in, weight_sum, bounds_in, bounds_out, diurnal, weight_scale, pow)
410 real(FMS_TRM_KIND_),
intent(inout) :: data_out(:,:,:,:,:)
411 real(FMS_TRM_KIND_),
intent(in) :: data_in(:,:,:,:)
412 real(r8_kind),
intent(inout) :: weight_sum(:,:,:,:)
413 type(fmsDiagIbounds_type),
intent(in) :: bounds_in
415 type(fmsDiagIbounds_type),
intent(in) :: bounds_out
417 integer,
intent(in) :: diurnal
419 real(FMS_TRM_KIND_),
intent(in) :: weight_scale
420 integer ,
optional,
intent(in) :: pow
423 integer :: is_in, ie_in, js_in, je_in, ks_in, ke_in
425 integer :: is_out, ie_out, js_out, je_out, ks_out, ke_out
427 integer :: i, j, k, l
429 is_out = bounds_out%get_imin()
430 ie_out = bounds_out%get_imax()
431 js_out = bounds_out%get_jmin()
432 je_out = bounds_out%get_jmax()
433 ks_out = bounds_out%get_kmin()
434 ke_out = bounds_out%get_kmax()
436 is_in = bounds_in%get_imin()
437 ie_in = bounds_in%get_imax()
438 js_in = bounds_in%get_jmin()
439 je_in = bounds_in%get_jmax()
440 ks_in = bounds_in%get_kmin()
441 ke_in = bounds_in%get_kmax()
443 weight_sum = weight_sum + weight_scale
445 if (
present(pow))
then
446 do k = 0, ke_out - ks_out
447 do j = 0, je_out - js_out
448 do i = 0, ie_out - is_out
449 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = &
450 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) &
451 + (data_in(is_in +i, js_in + j, ks_in + k, :) * weight_scale) ** pow
456 do k = 0, ke_out - ks_out
457 do j = 0, je_out - js_out
458 do i = 0, ie_out - is_out
459 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) = &
460 data_out(is_out + i, js_out + j, ks_out + k, :, diurnal) &
461 + (data_in(is_in +i, js_in + j, ks_in + k, :) * weight_scale)
466end subroutine sum_no_mask_
471subroutine sum_update_done_(out_buffer_data, weight_sum, reduction_method, missing_val, has_mask, mask_variant, &
473 real(FMS_TRM_KIND_),
intent(inout) :: out_buffer_data(:,:,:,:,:)
475 real(r8_kind),
intent(in) :: weight_sum(:,:,:,:)
477 integer,
intent(in) :: reduction_method
479 real(FMS_TRM_KIND_),
intent(in) :: missing_val
480 logical,
intent(in) :: has_mask
481 logical,
intent(in) :: mask_variant
482 integer,
optional,
intent(in) :: n_diurnal_samples
483 integer,
allocatable :: wsum(:,:,:,:)
488 integer :: i, j, k, l
490 allocate(wsum(
size(weight_sum,1),
size(weight_sum,3),
size(weight_sum,3),
size(weight_sum,4)))
494 if(reduction_method .eq. time_diurnal)
then
495 if(.not.
present(n_diurnal_samples))
call mpp_error(fatal, &
496 "SUM_UPDATE_DONE_ :: reduction method is diurnal but no sample size was given")
497 wsum = weight_sum / n_diurnal_samples
503 if (.not. mask_variant)
then
505 where(out_buffer_data(:,:,:,:,:) .ne. missing_val)
506 out_buffer_data(:,:,:,:,:) = out_buffer_data(:,:,:,:,:) &
511 do l = 1,
size(out_buffer_data, 4)
512 do k = 1,
size(out_buffer_data, 3)
513 do j = 1,
size(out_buffer_data, 2)
514 do i = 1,
size(out_buffer_data, 1)
515 if (wsum(i, j, k, l) .gt. 0)
then
516 out_buffer_data(i,j,k,l,:) = out_buffer_data(i,j,k,l,:)/ wsum(i,j,k,l)
519 out_buffer_data(i,j,k,l,:) = missing_val
528 out_buffer_data(:,:,:,:,:) = out_buffer_data(:,:,:,:,:) &
532 if(reduction_method .eq. time_rms .and. has_mask)
then
533 where(out_buffer_data(:,:,:,:,1) .ne. missing_val)
534 out_buffer_data(:,:,:,:,1) = sqrt(out_buffer_data(:,:,:,:,1))
536 else if(reduction_method .eq. time_rms)
then
537 out_buffer_data(:,:,:,:,1) = sqrt(out_buffer_data(:,:,:,:,1))