225 real,
dimension(:,:,:),
intent(in) :: array
226 integer,
optional,
intent(in) :: isr, ier, jsr, jer
227 real,
dimension(:),
optional,
intent(out) :: sums
228 type(efp_type),
optional,
intent(out) :: efp_sum
229 integer,
optional,
intent(out) :: err
237 integer(kind=8),
dimension(ni) :: ints_sum
238 integer(kind=8),
dimension(ni,size(array,3)) :: ints_sums
239 integer(kind=8) :: prec_error
240 character(len=256) :: mesg
241 integer :: i, j, k, is, ie, js, je, ke, isz, jsz, n
243 if (num_pes() > max_count_prec)
call mom_error(fatal, &
244 "reproducing_sum: Too many processors are being used for the value of "//&
245 "prec. Reduce prec to (2^63-1)/num_PEs.")
247 prec_error = (2_8**62 + (2_8**62 - 1)) / num_pes()
250 is = 1 ; ie =
size(array,1) ; js = 1 ; je =
size(array,2) ; ke =
size(array,3)
251 if (
present(isr))
then 252 if (isr < is)
call mom_error(fatal, &
253 "Value of isr too small in reproducing_sum(_3d).")
256 if (
present(ier))
then 257 if (ier > ie)
call mom_error(fatal, &
258 "Value of ier too large in reproducing_sum(_3d).")
261 if (
present(jsr))
then 262 if (jsr < js)
call mom_error(fatal, &
263 "Value of jsr too small in reproducing_sum(_3d).")
266 if (
present(jer))
then 267 if (jer > je)
call mom_error(fatal, &
268 "Value of jer too large in reproducing_sum(_3d).")
271 jsz = je+1-js; isz = ie+1-is
273 if (
present(sums))
then 274 if (
size(sums) > ke)
call mom_error(fatal,
"Sums is smaller than "//&
275 "the vertical extent of array in reproducing_sum(_3d).")
277 overflow_error = .false. ; nan_error = .false. ; max_mag_term = 0.0
278 if (jsz*isz < max_count_prec)
then 280 do j=js,je ;
do i=is,ie
281 call increment_ints_faster(ints_sums(:,k), array(i,j,k), max_mag_term);
283 call carry_overflow(ints_sums(:,k), prec_error)
285 elseif (isz < max_count_prec)
then 286 do k=1,ke ;
do j=js,je
288 call increment_ints_faster(ints_sums(:,k), array(i,j,k), max_mag_term);
290 call carry_overflow(ints_sums(:,k), prec_error)
293 do k=1,ke ;
do j=js,je ;
do i=is,ie
294 call increment_ints(ints_sums(:,k), &
295 real_to_ints(array(i,j,k), prec_error), prec_error);
296 enddo ;
enddo ;
enddo 298 if (
present(err))
then 300 if (abs(max_mag_term) >= prec_error*pr(1)) err = err+1
301 if (overflow_error) err = err+2
302 if (nan_error) err = err+2
303 if (err > 0)
then ;
do k=1,ke ;
do n=1,ni ; ints_sums(n,k) = 0 ;
enddo ;
enddo ;
endif 305 if (nan_error)
call mom_error(fatal,
"NaN in input field of reproducing_sum(_3d).")
306 if (abs(max_mag_term) >= prec_error*pr(1))
then 307 write(mesg,
'(ES13.5)') max_mag_term
308 call mom_error(fatal,
"Overflow in reproducing_sum(_3d) conversion of "//trim(mesg))
310 if (overflow_error)
call mom_error(fatal,
"Overflow in reproducing_sum(_3d).")
313 call sum_across_pes(ints_sums(:,1:ke), ni*ke)
317 call regularize_ints(ints_sums(:,k))
318 sums(k) = ints_to_real(ints_sums(:,k))
322 if (
present(efp_sum))
then 324 do k=1,ke ;
call increment_ints(efp_sum%v(:), ints_sums(:,k)) ;
enddo 328 do n=1,ni ; ints_sum(n) = 0 ;
enddo 329 do k=1,ke ;
do n=1,ni ; ints_sum(n) = ints_sum(n) + ints_sums(n,k) ;
enddo ;
enddo 330 write(mesg,
'("3D RS: ", ES24.16, 6 Z17.16)') sum, ints_sum(1:ni)
331 call mom_mesg(mesg, 3)
335 overflow_error = .false. ; nan_error = .false. ; max_mag_term = 0.0
336 if (jsz*isz < max_count_prec)
then 338 do j=js,je ;
do i=is,ie
339 call increment_ints_faster(ints_sum, array(i,j,k), max_mag_term);
341 call carry_overflow(ints_sum, prec_error)
343 elseif (isz < max_count_prec)
then 344 do k=1,ke ;
do j=js,je
346 call increment_ints_faster(ints_sum, array(i,j,k), max_mag_term);
348 call carry_overflow(ints_sum, prec_error)
351 do k=1,ke ;
do j=js,je ;
do i=is,ie
352 call increment_ints(ints_sum, real_to_ints(array(i,j,k), prec_error), &
354 enddo ;
enddo ;
enddo 356 if (
present(err))
then 358 if (abs(max_mag_term) >= prec_error*pr(1)) err = err+1
359 if (overflow_error) err = err+2
360 if (nan_error) err = err+2
361 if (err > 0)
then ;
do n=1,ni ; ints_sum(n) = 0 ;
enddo ;
endif 363 if (nan_error)
call mom_error(fatal,
"NaN in input field of reproducing_sum(_3d).")
364 if (abs(max_mag_term) >= prec_error*pr(1))
then 365 write(mesg,
'(ES13.5)') max_mag_term
366 call mom_error(fatal,
"Overflow in reproducing_sum(_3d) conversion of "//trim(mesg))
368 if (overflow_error)
call mom_error(fatal,
"Overflow in reproducing_sum(_3d).")
371 call sum_across_pes(ints_sum, ni)
373 call regularize_ints(ints_sum)
374 sum = ints_to_real(ints_sum)
376 if (
present(efp_sum)) efp_sum%v(:) = ints_sum(:)
379 write(mesg,
'("3d RS: ", ES24.16, 6 Z17.16)') sum, ints_sum(1:ni)
380 call mom_mesg(mesg, 3)