Monitor and write out statistics for the model's state variables.
240 type(ocean_grid_type),
intent(in) :: G
241 type(verticalGrid_type),
intent(in) :: GV
242 character(len=*),
intent(in) :: mesg
243 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
245 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
247 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
249 real,
pointer,
dimension(:,:,:), &
251 real,
pointer,
dimension(:,:,:), &
253 type(unit_scale_type),
intent(in) :: US
254 logical,
optional,
intent(in) :: allowChange
256 logical,
optional,
intent(in) :: permitDiminishing
260 real,
dimension(G%isc:G%iec, G%jsc:G%jec) :: &
269 type(stats) :: T, S, delT, delS
273 type(stats),
save :: oldT, oldS
274 logical,
save :: firstCall = .true.
277 character(len=80) :: lMsg
278 integer :: is, ie, js, je, nz, i, j, k
280 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
281 do_ts =
associated(temp) .and.
associated(salt)
289 do j=js,je ;
do i=is,ie
290 tmp_a(i,j) = tmp_a(i,j) + us%L_to_m**2*g%areaT(i,j)
292 t%minimum = 1.e34 ; t%maximum = -1.e34 ; t%average = 0.
293 s%minimum = 1.e34 ; s%maximum = -1.e34 ; s%average = 0.
294 h_minimum = 1.e34*gv%m_to_H
295 do k=1,nz ;
do j=js,je ;
do i=is,ie
296 if (g%mask2dT(i,j)>0.)
then 297 dv = us%L_to_m**2*g%areaT(i,j)*gv%H_to_m*h(i,j,k)
298 tmp_v(i,j) = tmp_v(i,j) + dv
299 if (do_ts .and. h(i,j,k)>0.)
then 300 t%minimum = min( t%minimum, temp(i,j,k) ) ; t%maximum = max( t%maximum, temp(i,j,k) )
301 t%average = t%average + dv*temp(i,j,k)
302 s%minimum = min( s%minimum, salt(i,j,k) ) ; s%maximum = max( s%maximum, salt(i,j,k) )
303 s%average = s%average + dv*salt(i,j,k)
305 if (h_minimum > h(i,j,k)) h_minimum = h(i,j,k)
307 enddo ;
enddo ;
enddo 308 area = reproducing_sum( tmp_a ) ; vol = reproducing_sum( tmp_v )
310 call min_across_pes( t%minimum ) ;
call max_across_pes( t%maximum )
311 call min_across_pes( s%minimum ) ;
call max_across_pes( s%maximum )
312 t%average = reproducing_sum( tmp_t ) ; s%average = reproducing_sum( tmp_s )
313 t%average = t%average / vol ; s%average = s%average / vol
315 if (is_root_pe())
then 316 if (.not.firstcall)
then 318 delt%minimum = t%minimum - oldt%minimum ; delt%maximum = t%maximum - oldt%maximum
319 delt%average = t%average - oldt%average
320 dels%minimum = s%minimum - olds%minimum ; dels%maximum = s%maximum - olds%maximum
321 dels%average = s%average - olds%average
322 write(lmsg(1:80),
'(2(a,es12.4))')
'Mean thickness =', vol/area,
' frac. delta=',dv/vol
323 call mom_mesg(lmsg//trim(mesg))
325 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%maximum
326 call mom_mesg(lmsg//trim(mesg))
327 write(lmsg(1:80),
'(a,3es12.4)')
'delT min/mean/max =',delt%minimum,delt%average,delt%maximum
328 call mom_mesg(lmsg//trim(mesg))
329 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =',s%minimum,s%average,s%maximum
330 call mom_mesg(lmsg//trim(mesg))
331 write(lmsg(1:80),
'(a,3es12.4)')
'delS min/mean/max =',dels%minimum,dels%average,dels%maximum
332 call mom_mesg(lmsg//trim(mesg))
335 write(lmsg(1:80),
'(a,es12.4)')
'Mean thickness =', vol/area
336 call mom_mesg(lmsg//trim(mesg))
338 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =', t%minimum, t%average, t%maximum
339 call mom_mesg(lmsg//trim(mesg))
340 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =', s%minimum, s%average, s%maximum
341 call mom_mesg(lmsg//trim(mesg))
345 firstcall = .false. ; oldvol = vol
346 oldt%minimum = t%minimum ; oldt%maximum = t%maximum ; oldt%average = t%average
347 olds%minimum = s%minimum ; olds%maximum = s%maximum ; olds%average = s%average
349 if (do_ts .and. t%minimum<-5.0)
then 350 do j=js,je ;
do i=is,ie
351 if (minval(temp(i,j,:)) == t%minimum)
then 352 write(0,
'(a,2f12.5)')
'x,y=', g%geoLonT(i,j), g%geoLatT(i,j)
353 write(0,
'(a3,3a12)')
'k',
'h',
'Temp',
'Salt' 355 write(0,
'(i3,3es12.4)') k, h(i,j,k), temp(i,j,k), salt(i,j,k)
357 stop
'Extremum detected' 362 if (h_minimum<0.0)
then 363 do j=js,je ;
do i=is,ie
364 if (minval(h(i,j,:)) == h_minimum)
then 365 write(0,
'(a,2f12.5)')
'x,y=',g%geoLonT(i,j),g%geoLatT(i,j)
366 write(0,
'(a3,3a12)')
'k',
'h',
'Temp',
'Salt' 368 write(0,
'(i3,3es12.4)') k, h(i,j,k), temp(i,j,k), salt(i,j,k)
370 stop
'Negative thickness detected'