<p><b>dwj07@fsu.edu</b> 2011-10-14 09:44:37 -0600 (Fri, 14 Oct 2011)</p><p><br>
 -- BRANCH COMMIT --<br>
<br>
 Changing global diagnostics to loop over blocks.<br>
 ocn_global_diagnostics is the new routine name, <br>
 and it should be able to handle multiple blocks per processor now.<br>
<br>
 Diagnostics for one block per processor have not changed.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_global_diagnostics.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_global_diagnostics.F        2011-10-14 15:20:08 UTC (rev 1075)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_global_diagnostics.F        2011-10-14 15:44:37 UTC (rev 1076)
@@ -1,3 +1,18 @@
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+!
+!  ocn_global_diagnostics
+!
+!&gt; \brief MPAS ocean global diagnostics module
+!&gt; \author Doug Jacobsen
+!&gt; \date   14 October 2011
+!&gt; \version SVN:$Id:$
+!&gt; \details This module contains the routines needed to compute global
+!&gt;          diagnostics in the ocean.
+!
+!-----------------------------------------------------------------------
+
+
+
 module global_diagnostics
 
    use grid_types
@@ -11,27 +26,20 @@
 
    contains
 
-   subroutine computeGlobalDiagnostics(dminfo, state, grid, timeIndex, dt)
+   subroutine ocn_global_diagnositcs(domain, timeLev, timeIndex, dt)!{{{
 
-      ! Note: this routine assumes that there is only one block per processor. No looping
-      ! is preformed over blocks.
-      ! dminfo is the domain info needed for global communication
-      ! state contains the state variables needed to compute global diagnostics
-      ! grid conains the meta data about the grid
-      ! timeIndex is the current time step counter
-      ! dt is the duration of each time step
+      implicit none
 
-      ! Sums of variables at vertices are not weighted by thickness (since h is not known at
-      !    vertices as it is at cell centers and at edges).
+      type (domain_type), intent(in) :: domain !&lt; Input: domain information
+      integer, intent(in) :: timeLev !&lt; Input: time level for computing diagnostics
+      integer, intent(in) :: timeIndex !&lt; Input: time step index
+      real (kind=RKIND), intent(in) :: dt !&lt; Input: time step
 
-      implicit none
+      type (dm_info), pointer :: dminfo
+      type (block_type), pointer :: block
+      type (state_type), pointer :: state
+      type (mesh_type), pointer :: grid
 
-      type (dm_info), intent(in) :: dminfo
-      type (state_type), intent(inout) :: state
-      type (mesh_type), intent(in) :: grid
-      integer, intent(in) :: timeIndex
-      real (kind=RKIND), intent(in) :: dt
-
       integer :: nVertLevels, nCellsSolve, nEdgesSolve, nVerticesSolve, nCellsGlobal, nEdgesGlobal, nVerticesGlobal, iTracer
 
       real (kind=RKIND) ::  areaCellGlobal, areaEdgeGlobal, areaTriangleGlobal
@@ -48,175 +56,272 @@
       integer, parameter :: kMaxVariables = 1024 ! this must be a little more than double the number of variables to be reduced
 
       real (kind=RKIND), dimension(kMaxVariables) :: sums, mins, maxes, averages, verticalSumMins, verticalSumMaxes, reductions
+      real (kind=RKIND), dimension(kMaxVariables) :: sums_tmp, mins_tmp, maxes_tmp, averages_tmp, verticalSumMins_tmp, verticalSumMaxes_tmp
 
       integer :: fileID
 
-      num_tracers = state % num_tracers
+      dminfo =&gt; domain % dminfo
+      block =&gt; domain % blocklist
 
-      nVertLevels = grid % nVertLevels
-      nCellsSolve = grid % nCellsSolve
-      nEdgesSolve = grid % nEdgesSolve
-      nVerticesSolve = grid % nVerticesSolve
+      sums = 0.0
+      mins = 0.0
+      maxes = 0.0
+      averages = 0.0
+      verticalSumMins = 0.0
+      verticalSumMaxes = 0.0
 
-      areaCell =&gt; grid % areaCell % array
-      dcEdge =&gt; grid % dcEdge % array
-      dvEdge =&gt; grid % dvEdge % array
-      areaTriangle =&gt; grid % areaTriangle % array
-      allocate(areaEdge(1:nEdgesSolve))
-      areaEdge = dcEdge(1:nEdgesSolve)*dvEdge(1:nEdgesSolve)
+      do while (associated(block))
+        state =&gt; block % state % time_levs(timeLev) % state
+        grid =&gt; block % mesh
+        num_tracers = state % num_tracers
 
-      h =&gt; state % h % array
-      u =&gt; state % u % array
-      rho =&gt; state % rho % array
-      tracers =&gt; state % tracers % array
-      v =&gt; state % v % array
-      wTop =&gt; state % wTop % array
-      h_edge =&gt; state % h_edge % array
-      circulation =&gt; state % circulation % array
-      vorticity =&gt; state % vorticity % array
-      ke =&gt; state % ke % array
-      pv_edge =&gt; state % pv_edge % array
-      pv_vertex =&gt; state % pv_vertex % array
-      pv_cell =&gt; state % pv_cell % array
-      gradPVn =&gt; state % gradPVn % array
-      gradPVt =&gt; state % gradPVt % array
-      MontPot =&gt; state % MontPot % array
-      pressure =&gt; state % pressure % array
+        nVertLevels = grid % nVertLevels
+        nCellsSolve = grid % nCellsSolve
+        nEdgesSolve = grid % nEdgesSolve
+        nVerticesSolve = grid % nVerticesSolve
 
-      variableIndex = 0
-      ! h
-      variableIndex = variableIndex + 1
-      call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
+        areaCell =&gt; grid % areaCell % array
+        dcEdge =&gt; grid % dcEdge % array
+        dvEdge =&gt; grid % dvEdge % array
+        areaTriangle =&gt; grid % areaTriangle % array
+        allocate(areaEdge(1:nEdgesSolve))
+        areaEdge = dcEdge(1:nEdgesSolve)*dvEdge(1:nEdgesSolve)
 
-      ! u
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
-        u(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
+        h =&gt; state % h % array
+        u =&gt; state % u % array
+        rho =&gt; state % rho % array
+        tracers =&gt; state % tracers % array
+        v =&gt; state % v % array
+        wTop =&gt; state % wTop % array
+        h_edge =&gt; state % h_edge % array
+        circulation =&gt; state % circulation % array
+        vorticity =&gt; state % vorticity % array
+        ke =&gt; state % ke % array
+        pv_edge =&gt; state % pv_edge % array
+        pv_vertex =&gt; state % pv_vertex % array
+        pv_cell =&gt; state % pv_cell % array
+        gradPVn =&gt; state % gradPVn % array
+        gradPVt =&gt; state % gradPVt % array
+        MontPot =&gt; state % MontPot % array
+        pressure =&gt; state % pressure % array
+  
+        variableIndex = 0
+        ! h
+        variableIndex = variableIndex + 1
+        call compte_field_area_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+          sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! u
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
+          u(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! v
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
+          v(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! h_edge
+        variableIndex = variableIndex + 1
+        call compte_field_area_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
+          sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! circulation
+        variableIndex = variableIndex + 1
+        call compute_field_local_stats(dminfo, nVertLevels, nVerticesSolve, circulation(:,1:nVerticesSolve), &amp;
+          sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! vorticity
+        variableIndex = variableIndex + 1
+        call compte_field_area_weighted_local_stats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &amp;
+          vorticity(:,1:nVerticesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), &amp;
+          verticalSumMins(variableIndex), verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
 
-      ! v
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
-        v(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
+        ! ke
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+          ke(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! pv_edge
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
+          pv_edge(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! pv_vertex
+        variableIndex = variableIndex + 1
+        call compte_field_area_weighted_local_stats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &amp;
+          pv_vertex(:,1:nVerticesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), &amp;
+          verticalSumMins(variableIndex), verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! pv_cell
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+          pv_cell(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
 
-      ! h_edge
-      variableIndex = variableIndex + 1
-      call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
-        sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
-      ! circulation
-      variableIndex = variableIndex + 1
-      call computeFieldLocalStats(dminfo, nVertLevels, nVerticesSolve, circulation(:,1:nVerticesSolve), &amp;
-        sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
-      ! vorticity
-      variableIndex = variableIndex + 1
-      call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &amp;
-        vorticity(:,1:nVerticesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), &amp;
-        verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
-      ! ke
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        ke(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! pv_edge
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
-        pv_edge(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! pv_vertex
-      variableIndex = variableIndex + 1
-      call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &amp;
-        pv_vertex(:,1:nVerticesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), &amp;
-        verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
-      ! pv_cell
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        pv_cell(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! gradPVn
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
-        gradPVn(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! gradPVt
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
-        gradPVt(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! pressure
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        pressure(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! MontPot
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        MontPot(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! wTop vertical velocity
-      variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels+1, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        wTop(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-        verticalSumMaxes(variableIndex))
-
-      ! Tracers
-      allocate(tracerTemp(nVertLevels,nCellsSolve))
-      do iTracer=1,num_tracers
+        ! gradPVn
         variableIndex = variableIndex + 1
-        tracerTemp = Tracers(iTracer,:,1:nCellsSolve)
-        call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-          tracerTemp, sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
-          verticalSumMaxes(variableIndex))
-      enddo
-      deallocate(tracerTemp)
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
+          gradPVn(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! gradPVt
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &amp;
+          gradPVt(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! pressure
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+          pressure(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! MontPot
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+          MontPot(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! wTop vertical velocity
+        variableIndex = variableIndex + 1
+        call compute_field_volume_weighted_local_stats(dminfo, nVertLevels+1, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+          wTop(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+          verticalSumMaxes_tmp(variableIndex))
+        sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+        mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+        maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+        verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+        verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+  
+        ! Tracers
+        allocate(tracerTemp(nVertLevels,nCellsSolve))
+        do iTracer=1,num_tracers
+          variableIndex = variableIndex + 1
+          tracerTemp = Tracers(iTracer,:,1:nCellsSolve)
+          call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
+            tracerTemp, sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(variableIndex), &amp;
+            verticalSumMaxes_tmp(variableIndex))
+          sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex)
+          mins(variableIndex) = mins(variableIndex) + mins_tmp(variableIndex)
+          maxes(variableIndex) = maxes(variableIndex) + maxes_tmp(variableIndex)
+          verticalSumMins(variableIndex) = verticalSumMins(variableIndex) + verticalSumMins_tmp(variableIndex)
+          verticalSumMaxes(variableIndex) = verticalSumMaxes(variableIndex) + verticalSumMaxes_tmp(variableIndex)
+        enddo
+        deallocate(tracerTemp)
+  
+        nVariables = variableIndex
+        nSums = nVariables
+        nMins = nVariables
+        nMaxes = nVariables
+  
+        nSums = nSums + 1
+        sums(nSums) = sums(nSums) + sum(areaCell(1:nCellsSolve))
+  
+        nSums = nSums + 1
+        sums(nSums) = sums(nSums) + sum(dcEdge(1:nEdgesSolve)*dvEdge(1:nEdgesSolve))
+  
+        nSums = nSums + 1
+        sums(nSums) = sums(nSums) + sum(areaTriangle(1:nVerticesSolve))
+  
+        nSums = nSums + 1
+        sums(nSums) = sums(nSums) + nCellsSolve
+  
+        nSums = nSums + 1
+        sums(nSums) = sums(nSums) + nEdgesSolve
+  
+        nSums = nSums + 1
+        sums(nSums) = sums(nSums) + nVerticesSolve
+  
+        localCFL = 0.0
+        do elementIndex = 1,nEdgesSolve
+           localCFL = max(localCFL, maxval(dt*u(:,elementIndex)/dcEdge(elementIndex)))
+        end do
+        nMaxes = nMaxes + 1
+        maxes(nMaxes) = localCFL
+  
+        mins(nMins+1:nMins+nVariables) = mins(nMins+1:nMins+nVariables) + verticalSumMins_tmp(1:nVariables)
+        nMins = nMins + nVariables
+        maxes(nMaxes+1:nMaxes+nVariables) = mins(nMaxes+1:nMaxes+nVariables) +verticalSumMaxes_tmp(1:nVariables)
+        nMaxes = nMaxes + nVariables
 
-      nVariables = variableIndex
-      nSums = nVariables
-      nMins = nVariables
-      nMaxes = nVariables
-
-      nSums = nSums + 1
-      sums(nSums) = sum(areaCell(1:nCellsSolve))
-
-      nSums = nSums + 1
-      sums(nSums) = sum(dcEdge(1:nEdgesSolve)*dvEdge(1:nEdgesSolve))
-
-      nSums = nSums + 1
-      sums(nSums) = sum(areaTriangle(1:nVerticesSolve))
-
-      nSums = nSums + 1
-      sums(nSums) = nCellsSolve
-
-      nSums = nSums + 1
-      sums(nSums) = nEdgesSolve
-
-      nSums = nSums + 1
-      sums(nSums) = nVerticesSolve
-
-      localCFL = 0.0
-      do elementIndex = 1,nEdgesSolve
-         localCFL = max(localCFL, maxval(dt*u(:,elementIndex)/dcEdge(elementIndex)))
+        block =&gt; block % next
       end do
-      nMaxes = nMaxes + 1
-      maxes(nMaxes) = localCFL
-
-      mins(nMins+1:nMins+nVariables) = verticalSumMins(1:nVariables)
-      nMins = nMins + nVariables
-      maxes(nMaxes+1:nMaxes+nVariables) = verticalSumMaxes(1:nVariables)
-      nMaxes = nMaxes + nVariables
-
+  
       ! global reduction of the 5 arrays (packed into 3 to minimize global communication)
       call dmpar_sum_real_array(dminfo, nSums, sums(1:nSums), reductions(1:nSums))
       sums(1:nVariables) = reductions(1:nVariables)
@@ -308,7 +413,7 @@
 
       ! write out the data to files
       if (dminfo % my_proc_id == IO_NODE) then
-         fileID = getFreeUnit()
+         fileID = get_free_unit()
          open(fileID,file='stats_min.txt',ACCESS='append')
             write (fileID,'(100es24.14)') mins(1:nVariables)
          close (fileID)
@@ -334,36 +439,44 @@
          close (fileID)
       end if
 
-      state % areaCellGlobal % scalar = areaCellGlobal
-      state % areaEdgeGlobal % scalar = areaEdgeGlobal
-      state % areaTriangleGlobal % scalar = areaTriangleGlobal
+      block =&gt; domain % blocklist
 
-      state % volumeCellGlobal % scalar = volumeCellGlobal
-      state % volumeEdgeGlobal % scalar = volumeEdgeGlobal
-      state % CFLNumberGlobal % scalar = CFLNumberGlobal
+      do while (associated(block))
+        state =&gt; block % state % time_levs(timeLev) % state
+
+        state % areaCellGlobal % scalar = areaCellGlobal
+        state % areaEdgeGlobal % scalar = areaEdgeGlobal
+        state % areaTriangleGlobal % scalar = areaTriangleGlobal
+
+        state % volumeCellGlobal % scalar = volumeCellGlobal
+        state % volumeEdgeGlobal % scalar = volumeEdgeGlobal
+        state % CFLNumberGlobal % scalar = CFLNumberGlobal
+
+        block =&gt; block % next
+      end do
       deallocate(areaEdge)
 
-   end subroutine computeGlobalDiagnostics
+   end subroutine ocn_global_diagnositcs!}}}
 
-   integer function getFreeUnit()
+   integer function get_free_unit()!{{{
       implicit none
 
       integer :: index
       logical :: isOpened
 
-      getFreeUnit = 0
+      get_free_unit = 0
       do index = 1,99
          if((index /= 5) .and. (index /= 6)) then
             inquire(unit = index, opened = isOpened)
             if( .not. isOpened) then
-               getFreeUnit = index
+               get_free_unit = index
                return
             end if
          end if
       end do
-   end function getFreeUnit
+   end function get_free_unit!}}}
 
-   subroutine computeFieldLocalStats(dminfo, nVertLevels, nElements, field, localSum, localMin, localMax, localVertSumMin, &amp;
+   subroutine compute_field_local_stats(dminfo, nVertLevels, nElements, field, localSum, localMin, localMax, localVertSumMin, &amp;!{{{
       localVertSumMax)
 
       implicit none
@@ -380,9 +493,9 @@
       localVertSumMin = minval(sum(field,1))
       localVertSumMax = maxval(sum(field,1))
 
-   end subroutine computeFieldLocalStats
+   end subroutine compute_field_local_stats!}}}
 
-   subroutine computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nElements, areas, field, localSum, localMin, &amp;
+   subroutine compte_field_area_weighted_local_stats(dminfo, nVertLevels, nElements, areas, field, localSum, localMin, &amp;!{{{
       localMax, localVertSumMin, localVertSumMax)
 
       implicit none
@@ -406,9 +519,9 @@
       localVertSumMin = minval(sum(field,1))
       localVertSumMax = maxval(sum(field,1))
 
-   end subroutine computeFieldAreaWeightedLocalStats
+   end subroutine compte_field_area_weighted_local_stats!}}}
 
-   subroutine computeFieldThicknessWeightedLocalStats(dminfo, nVertLevels, nElements, h, field, &amp;
+   subroutine compute_field_thickness_weighted_local_stats(dminfo, nVertLevels, nElements, h, field, &amp;!{{{
       localSum, localMin, localMax, localVertSumMin, localVertSumMax)
 
       implicit none
@@ -430,9 +543,9 @@
       localVertSumMin = minval(sum(h*field,1))
       localVertSumMax = maxval(sum(h*field,1))
 
-   end subroutine computeFieldThicknessWeightedLocalStats
+   end subroutine compute_field_thickness_weighted_local_stats!}}}
 
-   subroutine computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nElements, areas, h, field, &amp;
+   subroutine compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nElements, areas, h, field, &amp;!{{{
       localSum, localMin, localMax, localVertSumMin, localVertSumMax)
 
       implicit none
@@ -459,11 +572,10 @@
       localVertSumMin = minval(sum(h*field,1))
       localVertSumMax = maxval(sum(h*field,1))
 
-   end subroutine computeFieldVolumeWeightedLocalStats
+   end subroutine compute_field_volume_weighted_local_stats!}}}
 
+   subroutine compute_global_sum(dminfo, nVertLevels, nElements, field, globalSum)!{{{
 
-   subroutine computeGlobalSum(dminfo, nVertLevels, nElements, field, globalSum)
-
       implicit none
 
       type (dm_info), intent(in) :: dminfo
@@ -476,9 +588,9 @@
       localSum = sum(field)
       call dmpar_sum_real(dminfo, localSum, globalSum)
 
-   end subroutine computeGlobalSum
+   end subroutine compute_global_sum!}}}
 
-   subroutine computeAreaWeightedGlobalSum(dminfo, nVertLevels, nElements, areas, field, globalSum)
+   subroutine compute_area_weighted_global_sum(dminfo, nVertLevels, nElements, areas, field, globalSum)!{{{
 
       implicit none
 
@@ -498,9 +610,9 @@
    
       call dmpar_sum_real(dminfo, localSum, globalSum)
        
-   end subroutine computeAreaWeightedGlobalSum
+   end subroutine compute_area_weighted_global_sum!}}}
 
-   subroutine computeVolumeWeightedGlobalSum(dminfo, nVertLevels, nElements, areas, h, field, globalSum)
+   subroutine compute_volume_weighted_global_sum(dminfo, nVertLevels, nElements, areas, h, field, globalSum)!{{{
 
       implicit none
 
@@ -515,11 +627,11 @@
 
       hTimesField = h*field
 
-      call computeAreaWeightedGlobalSum(dminfo, nVertLevels, nElements, areas, hTimesField, globalSum)
+      call compute_area_weighted_global_sum(dminfo, nVertLevels, nElements, areas, hTimesField, globalSum)
 
-   end subroutine computeVolumeWeightedGlobalSum
+   end subroutine compute_volume_weighted_global_sum!}}}
 
-   subroutine computeGlobalMin(dminfo, nVertLevels, nElements, field, globalMin)
+   subroutine compute_global_min(dminfo, nVertLevels, nElements, field, globalMin)!{{{
 
       implicit none
 
@@ -533,9 +645,9 @@
       localMin = minval(field)
       call dmpar_min_real(dminfo, localMin, globalMin)
 
-   end subroutine computeGlobalMin
+   end subroutine compute_global_min!}}}
 
-   subroutine computeGlobalMax(dminfo, nVertLevels, nElements, field, globalMax)
+   subroutine compute_global_max(dminfo, nVertLevels, nElements, field, globalMax)!{{{
 
       implicit none
 
@@ -549,9 +661,9 @@
       localMax = maxval(field)
       call dmpar_max_real(dminfo, localMax, globalMax)
 
-   end subroutine computeGlobalMax
+   end subroutine compute_global_max!}}}
 
-   subroutine computeGlobalVertSumHorizMin(dminfo, nVertLevels, nElements, field, globalMin)
+   subroutine compute_global_vert_sum_horiz_min(dminfo, nVertLevels, nElements, field, globalMin)!{{{
 
       implicit none
 
@@ -565,9 +677,9 @@
       localMin = minval(sum(field,1))
       call dmpar_min_real(dminfo, localMin, globalMin)
 
-   end subroutine computeGlobalVertSumHorizMin
+   end subroutine compute_global_vert_sum_horiz_min!}}}
 
-   subroutine computeGlobalVertSumHorizMax(dminfo, nVertLevels, nElements, field, globalMax)
+   subroutine compute_global_vert_sum_horiz_max(dminfo, nVertLevels, nElements, field, globalMax)!{{{
 
       implicit none
 
@@ -581,9 +693,9 @@
       localMax = maxval(sum(field,1))
       call dmpar_max_real(dminfo, localMax, globalMax)
 
-   end subroutine computeGlobalVertSumHorizMax
+   end subroutine compute_global_vert_sum_horiz_max!}}}
 
-   subroutine computeGlobalVertThicknessWeightedSumHorizMin(dminfo, nVertLevels, nElements, h, field, globalMin)
+   subroutine compute_global_vert_thickness_weighted_sum_horiz_min(dminfo, nVertLevels, nElements, h, field, globalMin)!{{{
 
       implicit none
 
@@ -597,9 +709,9 @@
       localMin = minval(sum(h*field,1))
       call dmpar_min_real(dminfo, localMin, globalMin)
 
-   end subroutine computeGlobalVertThicknessWeightedSumHorizMin
+   end subroutine compute_global_vert_thickness_weighted_sum_horiz_min!}}}
 
-   subroutine computeGlobalVertThicknessWeightedSumHorizMax(dminfo, nVertLevels, nElements, h, field, globalMax)
+   subroutine compute_global_vert_thickness_weighted_sum_horiz_max(dminfo, nVertLevels, nElements, h, field, globalMax)!{{{
 
       implicit none
 
@@ -613,6 +725,6 @@
       localMax = maxval(sum(h*field,1))
       call dmpar_max_real(dminfo, localMax, globalMax)
 
-   end subroutine computeGlobalVertThicknessWeightedSumHorizMax
+   end subroutine compute_global_vert_thickness_weighted_sum_horiz_max!}}}
 
 end module global_diagnostics

Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F        2011-10-14 15:20:08 UTC (rev 1075)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F        2011-10-14 15:44:37 UTC (rev 1076)
@@ -410,19 +410,11 @@
       call ocn_timestep(domain, dt, timeStamp)
 
       if (config_stats_interval &gt; 0) then
-          if (mod(itimestep, config_stats_interval) == 0) then
-              block_ptr =&gt; domain % blocklist
-              if (associated(block_ptr % next)) then
-                  write(0,*) 'Error: computeGlobalDiagnostics assumes ',&amp;
-                     'that there is only one block per processor.'
-              end if
-
+        if (mod(itimestep, config_stats_interval) == 0) then
           call timer_start(&quot;global diagnostics&quot;)
-          call computeGlobalDiagnostics(domain % dminfo, &amp;
-             block_ptr % state % time_levs(2) % state, block_ptr % mesh, &amp;
-             itimestep, dt)
+          call ocn_global_diagnositcs(domain, 2, itimestep, dt)
           call timer_stop(&quot;global diagnostics&quot;)
-          end if
+        end if
       end if
 
       !TODO: replace the above code block with this if we desire to convert config_stats_interval to use alarms

</font>
</pre>