238 type(ocean_grid_type),
intent(in) :: g
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
304 if (is_root_pe())
then 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
312 call mom_mesg(lmsg//trim(mesg))
314 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%maximum
315 call mom_mesg(lmsg//trim(mesg))
316 write(lmsg(1:80),
'(a,3es12.4)')
'delT min/mean/max =',delt%minimum,delt%average,delt%maximum
317 call mom_mesg(lmsg//trim(mesg))
318 write(lmsg(1:80),
'(a,3es12.4)')
'Salt min/mean/max =',s%minimum,s%average,s%maximum
319 call mom_mesg(lmsg//trim(mesg))
320 write(lmsg(1:80),
'(a,3es12.4)')
'delS min/mean/max =',dels%minimum,dels%average,dels%maximum
321 call mom_mesg(lmsg//trim(mesg))
324 write(lmsg(1:80),
'(a,es12.4)')
'Mean thickness =',vol/area
325 call mom_mesg(lmsg//trim(mesg))
327 write(lmsg(1:80),
'(a,3es12.4)')
'Temp min/mean/max =',t%minimum,t%average,t%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))
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'