32 implicit none ;
private 34 #include <MOM_memory.h> 46 real,
dimension(SZI_(G), SZJ_(G)),
intent(in) :: var
47 real,
dimension(SZI_(G), SZJ_(G)) :: tmpForSumming
48 real :: global_area_mean
50 integer :: i, j, is, ie, js, je
51 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
53 tmpforsumming(:,:) = 0.
54 do j=js,je ;
do i=is, ie
55 tmpforsumming(i,j) = ( var(i,j) * (g%areaT(i,j) * g%mask2dT(i,j)) )
63 real,
dimension(SZI_(G), SZJ_(G)),
intent(in) :: var
64 real,
dimension(SZI_(G), SZJ_(G)) :: tmpForSumming
65 real :: global_area_integral
67 integer :: i, j, is, ie, js, je
68 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
70 tmpforsumming(:,:) = 0.
71 do j=js,je ;
do i=is, ie
72 tmpforsumming(i,j) = ( var(i,j) * (g%areaT(i,j) * g%mask2dT(i,j)) )
81 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: var
82 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: h
83 real,
dimension(SZK_(GV)) :: global_layer_mean
85 real,
dimension(SZI_(G), SZJ_(G), SZK_(GV)) :: tmpForSumming, weight
86 real,
dimension(SZK_(GV)) :: scalarij, weightij
87 real,
dimension(SZK_(GV)) :: global_temp_scalar, global_weight_scalar
88 integer :: i, j, k, is, ie, js, je, nz
89 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
91 tmpforsumming(:,:,:) = 0. ; weight(:,:,:) = 0.
93 do k=1,nz ;
do j=js,je ;
do i=is,ie
94 weight(i,j,k) = h(i,j,k) * (g%areaT(i,j) * g%mask2dT(i,j))
95 tmpforsumming(i,j,k) = var(i,j,k) * weight(i,j,k)
102 global_layer_mean(k) = scalarij(k) / weightij(k)
110 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: var
111 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: h
112 real :: global_volume_mean
115 real,
dimension(SZI_(G), SZJ_(G)) :: tmpForSumming, sum_weight
116 integer :: i, j, k, is, ie, js, je, nz
117 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
119 tmpforsumming(:,:) = 0. ; sum_weight(:,:) = 0.
121 do k=1,nz ;
do j=js,je ;
do i=is,ie
122 weight_here = h(i,j,k) * (g%areaT(i,j) * g%mask2dT(i,j))
123 tmpforsumming(i,j) = tmpforsumming(i,j) + var(i,j,k) * weight_here
124 sum_weight(i,j) = sum_weight(i,j) + weight_here
125 enddo ;
enddo ;
enddo 134 real,
dimension(SZI_(G),SZJ_(G)),
intent(in) :: array
135 real,
dimension(SZJ_(G)),
intent(out) :: i_mean
136 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(in) :: mask
146 type(
efp_type),
allocatable,
dimension(:) :: asum, mask_sum
148 integer :: is, ie, js, je, idg_off, jdg_off
151 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
152 idg_off = g%idg_offset ; jdg_off = g%jdg_offset
156 allocate(asum(g%jsg:g%jeg))
157 if (
present(mask))
then 158 allocate(mask_sum(g%jsg:g%jeg))
161 asum(j) = real_to_efp(0.0) ; mask_sum(j) = real_to_efp(0.0)
164 do i=is,ie ;
do j=js,je
165 asum(j+jdg_off) = asum(j+jdg_off) + real_to_efp(array(i,j)*mask(i,j))
166 mask_sum(j+jdg_off) = mask_sum(j+jdg_off) + real_to_efp(mask(i,j))
170 "global_i_mean overflow error occurred before sums across PEs.")
172 call efp_list_sum_across_pes(asum(g%jsg:g%jeg), g%jeg-g%jsg+1)
173 call efp_list_sum_across_pes(mask_sum(g%jsg:g%jeg), g%jeg-g%jsg+1)
176 "global_i_mean overflow error occurred during sums across PEs.")
179 mask_sum_r = efp_to_real(mask_sum(j+jdg_off))
180 if (mask_sum_r == 0.0 )
then ; i_mean(j) = 0.0 ;
else 181 i_mean(j) = efp_to_real(asum(j+jdg_off)) / mask_sum_r
187 do j=g%jsg,g%jeg ; asum(j) = real_to_efp(0.0) ;
enddo 189 do i=is,ie ;
do j=js,je
190 asum(j+jdg_off) = asum(j+jdg_off) + real_to_efp(array(i,j))
194 "global_i_mean overflow error occurred before sum across PEs.")
196 call efp_list_sum_across_pes(asum(g%jsg:g%jeg), g%jeg-g%jsg+1)
199 "global_i_mean overflow error occurred during sum across PEs.")
202 i_mean(j) = efp_to_real(asum(j+jdg_off)) /
real(g%ieg-g%isg+1)
212 real,
dimension(SZI_(G),SZJ_(G)),
intent(in) :: array
213 real,
dimension(SZI_(G)),
intent(out) :: j_mean
214 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(in) :: mask
224 type(
efp_type),
allocatable,
dimension(:) :: asum, mask_sum
226 integer :: is, ie, js, je, idg_off, jdg_off
229 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
230 idg_off = g%idg_offset ; jdg_off = g%jdg_offset
234 allocate(asum(g%isg:g%ieg))
235 if (
present(mask))
then 236 allocate (mask_sum(g%isg:g%ieg))
239 asum(i) = real_to_efp(0.0) ; mask_sum(i) = real_to_efp(0.0)
242 do i=is,ie ;
do j=js,je
243 asum(i+idg_off) = asum(i+idg_off) + real_to_efp(array(i,j)*mask(i,j))
244 mask_sum(i+idg_off) = mask_sum(i+idg_off) + real_to_efp(mask(i,j))
248 "global_j_mean overflow error occurred before sums across PEs.")
250 call efp_list_sum_across_pes(asum(g%isg:g%ieg), g%ieg-g%isg+1)
251 call efp_list_sum_across_pes(mask_sum(g%isg:g%ieg), g%ieg-g%isg+1)
254 "global_j_mean overflow error occurred during sums across PEs.")
257 mask_sum_r = efp_to_real(mask_sum(i+idg_off))
258 if (mask_sum_r == 0.0 )
then ; j_mean(i) = 0.0 ;
else 259 j_mean(i) = efp_to_real(asum(i+idg_off)) / mask_sum_r
265 do i=g%isg,g%ieg ; asum(i) = real_to_efp(0.0) ;
enddo 267 do i=is,ie ;
do j=js,je
268 asum(i+idg_off) = asum(i+idg_off) + real_to_efp(array(i,j))
272 "global_j_mean overflow error occurred before sum across PEs.")
274 call efp_list_sum_across_pes(asum(g%isg:g%ieg), g%ieg-g%isg+1)
277 "global_j_mean overflow error occurred during sum across PEs.")
280 j_mean(i) = efp_to_real(asum(i+idg_off)) /
real(g%jeg-g%jsg+1)
291 real,
dimension(SZI_(G),SZJ_(G)),
intent(inout) :: array
292 real,
optional,
intent(out) :: scaling
294 real,
dimension(SZI_(G), SZJ_(G)) :: posVals, negVals, areaXposVals, areaXnegVals
296 real :: areaIntPosVals, areaIntNegVals, posScale, negScale
298 areaxposvals(:,:) = 0.
299 areaxnegvals(:,:) = 0.
301 do j=g%jsc,g%jec ;
do i=g%isc,g%iec
302 posvals(i,j) = max(0., array(i,j))
303 areaxposvals(i,j) = g%areaT(i,j) * posvals(i,j)
304 negvals(i,j) = min(0., array(i,j))
305 areaxnegvals(i,j) = g%areaT(i,j) * negvals(i,j)
311 posscale = 0.0 ; negscale = 0.0
312 if ((areaintposvals>0.).and.(areaintnegvals<0.))
then 313 if (areaintposvals>-areaintnegvals)
then 314 posscale = - areaintnegvals / areaintposvals
315 do j=g%jsc,g%jec ;
do i=g%isc,g%iec
316 array(i,j) = (posscale * posvals(i,j)) + negvals(i,j)
318 elseif (areaintposvals<-areaintnegvals)
then 319 negscale = - areaintposvals / areaintnegvals
320 do j=g%jsc,g%jec ;
do i=g%isc,g%iec
321 array(i,j) = posvals(i,j) + (negscale * negvals(i,j))
325 if (
present(scaling)) scaling = posscale - negscale
subroutine, public efp_list_sum_across_pes(EFPs, nval, errors)
subroutine, public reset_efp_overflow_error()
type(efp_type) function, public real_to_efp(val, overflow)
Ocean grid type. See mom_grid for details.
Provides the ocean grid type.
logical function, public query_efp_overflow_error()
real function, public global_area_integral(var, G)
real function, dimension(gv %ke), public global_layer_mean(var, h, G, GV)
subroutine, public global_i_mean(array, i_mean, G, mask)
logical function, public is_root_pe()
real function, public global_volume_mean(var, h, G, GV)
subroutine, public adjust_area_mean_to_zero(array, G, scaling)
Adjust 2d array such that area mean is zero without moving the zero contour.
subroutine, public global_j_mean(array, j_mean, G, mask)
real function, public efp_to_real(EFP1)
real function, public global_area_mean(var, G)
subroutine, public mom_error(level, message, all_print)