Monitor and write out statistics for the model's state variables.
221 type(ocean_grid_type),
intent(in) :: G
222 character(len=*),
intent(in) :: mesg
223 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
225 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
227 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
229 real,
pointer,
dimension(:,:,:), &
231 real,
pointer,
dimension(:,:,:), &
233 logical,
optional,
intent(in) :: allowChange
235 logical,
optional,
intent(in) :: permitDiminishing
238 integer :: is, ie, js, je, nz, i, j, k
239 real :: Vol, dV, Area, h_minimum
240 type(stats) :: T, S, delT, delS
241 type(stats),
save :: oldT, oldS
242 logical,
save :: firstCall = .true.
245 character(len=80) :: lMsg
246 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
248 do_ts =
associated(temp) .and.
associated(salt)
252 do j = js, je ;
do i = is, ie
253 area = area + g%areaT(i,j)
255 t%minimum = 1.e34 ; t%maximum = -1.e34 ; t%average = 0.
256 s%minimum = 1.e34 ; s%maximum = -1.e34 ; s%average = 0.
258 do k = 1, nz ;
do j = js, je ;
do i = is, ie
259 if (g%mask2dT(i,j)>0.)
then
260 dv = g%areaT(i,j)*h(i,j,k) ; vol = vol + dv
261 if (do_ts .and. h(i,j,k)>0.)
then
262 t%minimum = min( t%minimum, temp(i,j,k) ) ; t%maximum = max( t%maximum, temp(i,j,k) )
263 t%average = t%average + dv*temp(i,j,k)
264 s%minimum = min( s%minimum, salt(i,j,k) ) ; s%maximum = max( s%maximum, salt(i,j,k) )
265 s%average = s%average + dv*salt(i,j,k)
267 if (h_minimum > h(i,j,k)) h_minimum = h(i,j,k)
269 enddo ;
enddo ;
enddo
270 call sum_across_pes( area ) ;
call sum_across_pes( vol )
272 call min_across_pes( t%minimum ) ;
call max_across_pes( t%maximum ) ;
call sum_across_pes( t%average )
273 call min_across_pes( s%minimum ) ;
call max_across_pes( s%maximum ) ;
call sum_across_pes( s%average )
274 t%average = t%average / vol ; s%average = s%average / vol
276 if (is_root_pe())
then
277 if (.not.firstcall)
then
279 delt%minimum = t%minimum - oldt%minimum ; delt%maximum = t%maximum - oldt%maximum
280 delt%average = t%average - oldt%average
281 dels%minimum = s%minimum - olds%minimum ; dels%maximum = s%maximum - olds%maximum
282 dels%average = s%average - olds%average
283 write(lmsg(1:80),
'(2(a,es12.4))')
'Mean thickness =',vol/area,
' frac. delta=',dv/vol
284 call mom_mesg(lmsg//trim(mesg))
286 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%maximum
287 call mom_mesg(lmsg//trim(mesg))
288 write(lmsg(1:80),
'(a,3es12.4)')
'delT min/mean/max =',delt%minimum,delt%average,delt%maximum
289 call mom_mesg(lmsg//trim(mesg))
290 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =',s%minimum,s%average,s%maximum
291 call mom_mesg(lmsg//trim(mesg))
292 write(lmsg(1:80),
'(a,3es12.4)')
'delS min/mean/max =',dels%minimum,dels%average,dels%maximum
293 call mom_mesg(lmsg//trim(mesg))
296 write(lmsg(1:80),
'(a,es12.4)')
'Mean thickness =',vol/area
297 call mom_mesg(lmsg//trim(mesg))
299 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%maximum
300 call mom_mesg(lmsg//trim(mesg))
301 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =',s%minimum,s%average,s%maximum
302 call mom_mesg(lmsg//trim(mesg))
306 firstcall = .false. ; oldvol = vol
307 oldt%minimum = t%minimum ; oldt%maximum = t%maximum ; oldt%average = t%average
308 olds%minimum = s%minimum ; olds%maximum = s%maximum ; olds%average = s%average
310 if (do_ts .and. t%minimum<-5.0)
then
311 do j = js, je ;
do i = is, ie
312 if (minval(temp(i,j,:)) == t%minimum)
then
313 write(0,
'(a,2f12.5)')
'x,y=',g%geoLonT(i,j),g%geoLatT(i,j)
314 write(0,
'(a3,3a12)')
'k',
'h',
'Temp',
'Salt'
316 write(0,
'(i3,3es12.4)') k,h(i,j,k),temp(i,j,k),salt(i,j,k)
318 stop
'Extremum detected'
323 if (h_minimum<0.0)
then
324 do j = js, je ;
do i = is, ie
325 if (minval(h(i,j,:)) == h_minimum)
then
326 write(0,
'(a,2f12.5)')
'x,y=',g%geoLonT(i,j),g%geoLatT(i,j)
327 write(0,
'(a3,3a12)')
'k',
'h',
'Temp',
'Salt'
329 write(0,
'(i3,3es12.4)') k,h(i,j,k),temp(i,j,k),salt(i,j,k)
331 stop
'Negative thickness detected'