<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
+!
+!> \brief MPAS ocean global diagnostics module
+!> \author Doug Jacobsen
+!> \date 14 October 2011
+!> \version SVN:$Id:$
+!> \details This module contains the routines needed to compute global
+!> 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 !< Input: domain information
+ integer, intent(in) :: timeLev !< Input: time level for computing diagnostics
+ integer, intent(in) :: timeIndex !< Input: time step index
+ real (kind=RKIND), intent(in) :: dt !< 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 => domain % dminfo
+ block => 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 => grid % areaCell % array
- dcEdge => grid % dcEdge % array
- dvEdge => grid % dvEdge % array
- areaTriangle => grid % areaTriangle % array
- allocate(areaEdge(1:nEdgesSolve))
- areaEdge = dcEdge(1:nEdgesSolve)*dvEdge(1:nEdgesSolve)
+ do while (associated(block))
+ state => block % state % time_levs(timeLev) % state
+ grid => block % mesh
+ num_tracers = state % num_tracers
- h => state % h % array
- u => state % u % array
- rho => state % rho % array
- tracers => state % tracers % array
- v => state % v % array
- wTop => state % wTop % array
- h_edge => state % h_edge % array
- circulation => state % circulation % array
- vorticity => state % vorticity % array
- ke => state % ke % array
- pv_edge => state % pv_edge % array
- pv_vertex => state % pv_vertex % array
- pv_cell => state % pv_cell % array
- gradPVn => state % gradPVn % array
- gradPVt => state % gradPVt % array
- MontPot => state % MontPot % array
- pressure => 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), &
- sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
+ areaCell => grid % areaCell % array
+ dcEdge => grid % dcEdge % array
+ dvEdge => grid % dvEdge % array
+ areaTriangle => 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), &
- u(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
+ h => state % h % array
+ u => state % u % array
+ rho => state % rho % array
+ tracers => state % tracers % array
+ v => state % v % array
+ wTop => state % wTop % array
+ h_edge => state % h_edge % array
+ circulation => state % circulation % array
+ vorticity => state % vorticity % array
+ ke => state % ke % array
+ pv_edge => state % pv_edge % array
+ pv_vertex => state % pv_vertex % array
+ pv_cell => state % pv_cell % array
+ gradPVn => state % gradPVn % array
+ gradPVt => state % gradPVt % array
+ MontPot => state % MontPot % array
+ pressure => 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), &
+ 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), &
+ u(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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 compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
+ v(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+
+ ! h_edge
+ variableIndex = variableIndex + 1
+ call compte_field_area_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
+ 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), &
+ 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), &
+ vorticity(:,1:nVerticesSolve), 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)
- ! v
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
- v(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
+ ! ke
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
+ ke(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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_edge
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
+ pv_edge(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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_vertex
+ variableIndex = variableIndex + 1
+ call compte_field_area_weighted_local_stats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &
+ pv_vertex(:,1:nVerticesSolve), 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)
+
+ ! pv_cell
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
+ pv_cell(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
- ! h_edge
- variableIndex = variableIndex + 1
- call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
- sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
- ! circulation
- variableIndex = variableIndex + 1
- call computeFieldLocalStats(dminfo, nVertLevels, nVerticesSolve, circulation(:,1:nVerticesSolve), &
- sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
- ! vorticity
- variableIndex = variableIndex + 1
- call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &
- vorticity(:,1:nVerticesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), &
- verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
- ! ke
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
- ke(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! pv_edge
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
- pv_edge(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! pv_vertex
- variableIndex = variableIndex + 1
- call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nVerticesSolve, areaTriangle(1:nVerticesSolve), &
- pv_vertex(:,1:nVerticesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), &
- verticalSumMins(variableIndex), verticalSumMaxes(variableIndex))
-
- ! pv_cell
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
- pv_cell(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! gradPVn
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
- gradPVn(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! gradPVt
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
- gradPVt(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! pressure
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
- pressure(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! MontPot
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
- MontPot(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
-
- ! wTop vertical velocity
- variableIndex = variableIndex + 1
- call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels+1, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
- wTop(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- 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), &
- tracerTemp, sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &
- verticalSumMaxes(variableIndex))
- enddo
- deallocate(tracerTemp)
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
+ gradPVn(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+
+ ! gradPVt
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nEdgesSolve, areaEdge(1:nEdgesSolve), h_edge(:,1:nEdgesSolve), &
+ gradPVt(:,1:nEdgesSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+
+ ! pressure
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
+ pressure(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+
+ ! MontPot
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
+ MontPot(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+
+ ! wTop vertical velocity
+ variableIndex = variableIndex + 1
+ call compute_field_volume_weighted_local_stats(dminfo, nVertLevels+1, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &
+ wTop(:,1:nCellsSolve), sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+
+ ! 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), &
+ tracerTemp, sums_tmp(variableIndex), mins_tmp(variableIndex), maxes_tmp(variableIndex), verticalSumMins_tmp(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)
+ 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 => 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 => domain % blocklist
- state % volumeCellGlobal % scalar = volumeCellGlobal
- state % volumeEdgeGlobal % scalar = volumeEdgeGlobal
- state % CFLNumberGlobal % scalar = CFLNumberGlobal
+ do while (associated(block))
+ state => 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 => 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, &
+ subroutine compute_field_local_stats(dminfo, nVertLevels, nElements, field, localSum, localMin, localMax, localVertSumMin, &!{{{
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, &
+ subroutine compte_field_area_weighted_local_stats(dminfo, nVertLevels, nElements, areas, field, localSum, localMin, &!{{{
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, &
+ subroutine compute_field_thickness_weighted_local_stats(dminfo, nVertLevels, nElements, h, field, &!{{{
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, &
+ subroutine compute_field_volume_weighted_local_stats(dminfo, nVertLevels, nElements, areas, h, field, &!{{{
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 > 0) then
- if (mod(itimestep, config_stats_interval) == 0) then
- block_ptr => domain % blocklist
- if (associated(block_ptr % next)) then
- write(0,*) 'Error: computeGlobalDiagnostics assumes ',&
- 'that there is only one block per processor.'
- end if
-
+ if (mod(itimestep, config_stats_interval) == 0) then
call timer_start("global diagnostics")
- call computeGlobalDiagnostics(domain % dminfo, &
- block_ptr % state % time_levs(2) % state, block_ptr % mesh, &
- itimestep, dt)
+ call ocn_global_diagnositcs(domain, 2, itimestep, dt)
call timer_stop("global diagnostics")
- 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>