27 use mom_domains, only : sum_across_pes, min_across_pes, max_across_pes
33 implicit none ;
private 43 #include <MOM_memory.h> 47 real :: minimum = 1.e34, maximum = -1.e34, average = 0.
59 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
61 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
63 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
65 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
67 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
70 integer,
optional,
intent(in) :: haloshift
71 logical,
optional,
intent(in) :: symmetric
81 integer :: is, ie, js, je, nz, hs
83 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
88 hs=1;
if (
present(haloshift)) hs=haloshift
89 sym=.false.;
if (
present(symmetric)) sym=symmetric
90 call uvchksum(mesg//
" [uv]", u, v, g%HI, haloshift=hs, symmetric=sym)
91 call hchksum(h, mesg//
" h", g%HI, haloshift=hs, scale=gv%H_to_m)
92 call uvchksum(mesg//
" [uv]h", uh, vh, g%HI, haloshift=hs, &
93 symmetric=sym, scale=gv%H_to_m)
99 character(len=*),
intent(in) :: mesg
102 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
104 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
106 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
108 integer,
optional,
intent(in) :: haloshift
109 logical,
optional,
intent(in) :: symmetric
119 integer :: is, ie, js, je, nz, hs
121 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
126 hs=1;
if (
present(haloshift)) hs=haloshift
127 sym=.false.;
if (
present(symmetric)) sym=symmetric
128 call uvchksum(mesg//
" u", u, v, g%HI,haloshift=hs, symmetric=sym)
129 call hchksum(h, mesg//
" h",g%HI, haloshift=hs, scale=gv%H_to_m)
135 character(len=*),
intent(in) :: mesg
139 integer,
optional,
intent(in) :: haloshift
146 integer :: is, ie, js, je, nz, hs
147 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
148 hs=1;
if (
present(haloshift)) hs=haloshift
150 if (
associated(tv%T))
call hchksum(tv%T, mesg//
" T",g%HI,haloshift=hs)
151 if (
associated(tv%S))
call hchksum(tv%S, mesg//
" S",g%HI,haloshift=hs)
152 if (
associated(tv%frazil))
call hchksum(tv%frazil, mesg//
" frazil",g%HI,haloshift=hs)
153 if (
associated(tv%salt_deficit))
call hchksum(tv%salt_deficit, mesg//
" salt deficit",g%HI,haloshift=hs)
159 subroutine mom_accel_chksum(mesg, CAu, CAv, PFu, PFv, diffu, diffv, G, GV, pbce, &
160 u_accel_bt, v_accel_bt, symmetric)
161 character(len=*),
intent(in) :: mesg
164 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
167 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
170 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
173 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
176 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
179 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
182 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
183 optional,
intent(in) :: pbce
186 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
187 optional,
intent(in) :: u_accel_bt
189 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
190 optional,
intent(in) :: v_accel_bt
192 logical,
optional,
intent(in) :: symmetric
217 integer :: is, ie, js, je, nz
220 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
221 sym=.false.;
if (
present(symmetric)) sym=symmetric
226 call uvchksum(mesg//
" CA[uv]", cau, cav, g%HI, haloshift=0, symmetric=sym)
227 call uvchksum(mesg//
" PF[uv]", pfu, pfv, g%HI, haloshift=0, symmetric=sym)
228 call uvchksum(mesg//
" diffu", diffu, diffv, g%HI,haloshift=0, symmetric=sym)
230 call hchksum(pbce, mesg//
" pbce",g%HI,haloshift=0, scale=gv%m_to_H)
231 if (
present(u_accel_bt) .and.
present(v_accel_bt)) &
232 call uvchksum(mesg//
" [uv]_accel_bt", u_accel_bt, v_accel_bt, g%HI,haloshift=0, symmetric=sym)
237 subroutine mom_state_stats(mesg, u, v, h, Temp, Salt, G, allowChange, permitDiminishing)
239 character(len=*),
intent(in) :: mesg
240 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
242 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
244 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
246 real,
pointer,
dimension(:,:,:), &
248 real,
pointer,
dimension(:,:,:), &
251 logical,
optional,
intent(in) :: allowChange
254 intent(in) :: permitDiminishing
266 integer :: is, ie, js, je, nz, i, j, k
267 real :: Vol, dV, Area, h_minimum
268 type(
stats) :: T, S, delT, delS
269 type(
stats),
save :: oldT, oldS
270 logical,
save :: firstCall = .true.
273 character(len=80) :: lMsg
274 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
276 do_ts =
associated(temp) .and.
associated(salt)
280 do j = js, je ;
do i = is, ie
281 area = area + g%areaT(i,j)
283 t%minimum = 1.e34 ; t%maximum = -1.e34 ; t%average = 0.
284 s%minimum = 1.e34 ; s%maximum = -1.e34 ; s%average = 0.
286 do k = 1, nz ;
do j = js, je ;
do i = is, ie
287 if (g%mask2dT(i,j)>0.)
then 288 dv = g%areaT(i,j)*h(i,j,k) ; vol = vol + dv
289 if (do_ts .and. h(i,j,k)>0.)
then 290 t%minimum = min( t%minimum, temp(i,j,k) ) ; t%maximum = max( t%maximum, temp(i,j,k) )
291 t%average = t%average + dv*temp(i,j,k)
292 s%minimum = min( s%minimum, salt(i,j,k) ) ; s%maximum = max( s%maximum, salt(i,j,k) )
293 s%average = s%average + dv*salt(i,j,k)
295 if (h_minimum > h(i,j,k)) h_minimum = h(i,j,k)
297 enddo ;
enddo ;
enddo 298 call sum_across_pes( area ) ;
call sum_across_pes( vol )
300 call min_across_pes( t%minimum ) ;
call max_across_pes( t%maximum ) ;
call sum_across_pes( t%average )
301 call min_across_pes( s%minimum ) ;
call max_across_pes( s%maximum ) ;
call sum_across_pes( s%average )
302 t%average = t%average / vol ; s%average = s%average / vol
305 if (.not.firstcall)
then 307 delt%minimum = t%minimum - oldt%minimum ; delt%maximum = t%maximum - oldt%maximum
308 delt%average = t%average - oldt%average
309 dels%minimum = s%minimum - olds%minimum ; dels%maximum = s%maximum - olds%maximum
310 dels%average = s%average - olds%average
311 write(lmsg(1:80),
'(2(a,es12.4))')
'Mean thickness =',vol/area,
' frac. delta=',dv/vol
314 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%maximum
316 write(lmsg(1:80),
'(a,3es12.4)')
'delT min/mean/max =',delt%minimum,delt%average,delt%maximum
318 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =',s%minimum,s%average,s%maximum
320 write(lmsg(1:80),
'(a,3es12.4)')
'delS min/mean/max =',dels%minimum,dels%average,dels%maximum
324 write(lmsg(1:80),
'(a,es12.4)')
'Mean thickness =',vol/area
327 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%maximum
329 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =',s%minimum,s%average,s%maximum
334 firstcall = .false. ; oldvol = vol
335 oldt%minimum = t%minimum ; oldt%maximum = t%maximum ; oldt%average = t%average
336 olds%minimum = s%minimum ; olds%maximum = s%maximum ; olds%average = s%average
338 if (do_ts .and. t%minimum<-5.0)
then 339 do j = js, je ;
do i = is, ie
340 if (minval(temp(i,j,:)) == t%minimum)
then 341 write(0,
'(a,2f12.5)')
'x,y=',g%geoLonT(i,j),g%geoLatT(i,j)
342 write(0,
'(a3,3a12)')
'k',
'h',
'Temp',
'Salt' 344 write(0,
'(i3,3es12.4)') k,h(i,j,k),temp(i,j,k),salt(i,j,k)
346 stop
'Extremum detected' 351 if (h_minimum<0.0)
then 352 do j = js, je ;
do i = is, ie
353 if (minval(h(i,j,:)) == h_minimum)
then 354 write(0,
'(a,2f12.5)')
'x,y=',g%geoLonT(i,j),g%geoLatT(i,j)
355 write(0,
'(a3,3a12)')
'k',
'h',
'Temp',
'Salt' 357 write(0,
'(i3,3es12.4)') k,h(i,j,k),temp(i,j,k),salt(i,j,k)
359 stop
'Negative thickness detected' subroutine, public mom_thermo_chksum(mesg, tv, G, haloshift)
Ocean grid type. See mom_grid for details.
Provides the ocean grid type.
subroutine, public mom_accel_chksum(mesg, CAu, CAv, PFu, PFv, diffu, diffv, G, GV, pbce, u_accel_bt, v_accel_bt, symmetric)
subroutine, public mom_state_stats(mesg, u, v, h, Temp, Salt, G, allowChange, permitDiminishing)
logical function, public is_root_pe()
subroutine, public mom_mesg(message, verb, all_print)
subroutine mom_state_chksum_3arg(mesg, u, v, h, G, GV, haloshift, symmetric)
The thermo_var_ptrs structure contains pointers to an assortment of thermodynamic fields that may be ...
subroutine mom_state_chksum_5arg(mesg, u, v, h, uh, vh, G, GV, haloshift, symmetric)