<p><b>mpetersen@lanl.gov</b> 2012-02-14 14:41:33 -0700 (Tue, 14 Feb 2012)</p><p>Small ocean_core trunk correction to avoid an out-of-bounds read on referenceBottomDepth(maxLevelEdgeTop).  At a land edge, maxLevelEdgeTop=0.<br>
</p><hr noshade><pre><font color="gray">Modified: trunk/mpas/src/core_ocean/Registry
===================================================================
--- trunk/mpas/src/core_ocean/Registry        2012-02-14 20:29:21 UTC (rev 1507)
+++ trunk/mpas/src/core_ocean/Registry        2012-02-14 21:41:33 UTC (rev 1508)
@@ -171,6 +171,7 @@
 var persistent integer maxLevelVertexTop ( nVertices ) 0 - maxLevelVertexTop mesh - -
 var persistent integer maxLevelVertexBot ( nVertices ) 0 - maxLevelVertexBot mesh - -
 var persistent real referenceBottomDepth ( nVertLevels ) 0 iro referenceBottomDepth mesh - -
+var persistent real referenceBottomDepthTopOfCell ( nVertLevelsP1 ) 0 - referenceBottomDepthTopOfCell mesh - -
 var persistent real hZLevel ( nVertLevels ) 0 iro hZLevel mesh - -
 
 % Boundary conditions: read from input, saved in restart and written to output

Modified: trunk/mpas/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- trunk/mpas/src/core_ocean/mpas_ocn_mpas_core.F        2012-02-14 20:29:21 UTC (rev 1507)
+++ trunk/mpas/src/core_ocean/mpas_ocn_mpas_core.F        2012-02-14 21:41:33 UTC (rev 1508)
@@ -508,7 +508,8 @@
 
       integer :: iTracer, cell, cell1, cell2
       real (kind=RKIND) :: uhSum, hSum, hEdge1
-      real (kind=RKIND), dimension(:), pointer :: referenceBottomDepth
+      real (kind=RKIND), dimension(:), pointer :: &amp;
+         referenceBottomDepth, referenceBottomDepthTopOfCell
       real (kind=RKIND), dimension(:,:), pointer :: h
       integer :: nVertLevels
 
@@ -518,6 +519,7 @@
 
          h          =&gt; block % state % time_levs(1) % state % h % array
          referenceBottomDepth =&gt; block % mesh % referenceBottomDepth % array
+         referenceBottomDepthTopOfCell =&gt; block % mesh % referenceBottomDepthTopOfCell % array
          nVertLevels = block % mesh % nVertLevels
 
          ! mrp 120208 right now hZLevel is in the grid.nc file.
@@ -530,6 +532,12 @@
             referenceBottomDepth(k) = referenceBottomDepth(k-1) + block % mesh % hZLevel % array(k)
          end do
 
+         ! TopOfCell needed where zero depth for the very top may be referenced.
+         referenceBottomDepthTopOfCell(1) = 0.0
+         do k = 1,nVertLevels
+            referenceBottomDepthTopOfCell(k+1) = referenceBottomDepth(k)
+         end do
+
          ! Compute barotropic velocity at first timestep
          ! This is only done upon start-up.
          if (trim(config_time_integration) == 'unsplit_explicit') then

Modified: trunk/mpas/src/core_ocean/mpas_ocn_time_integration_split.F
===================================================================
--- trunk/mpas/src/core_ocean/mpas_ocn_time_integration_split.F        2012-02-14 20:29:21 UTC (rev 1507)
+++ trunk/mpas/src/core_ocean/mpas_ocn_time_integration_split.F        2012-02-14 21:41:33 UTC (rev 1508)
@@ -432,7 +432,7 @@
       
                    sshEdge = 0.5 * (block % state % time_levs(oldBtrSubcycleTime) % state % sshSubcycle % array(cell1) &amp;
                              + block % state % time_levs(oldBtrSubcycleTime) % state % sshSubcycle % array(cell2) )
-                   hSum = sshEdge + block % mesh % referenceBottomDepth % array (block % mesh % maxLevelEdgeTop % array(iEdge))
+                   hSum = sshEdge + block % mesh % referenceBottomDepthTopOfCell % array (block % mesh % maxLevelEdgeTop % array(iEdge)+1)
       
                    flux = ((1.0-config_btr_gam1_uWt1) * block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
                           + config_btr_gam1_uWt1 * block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge)) &amp;
@@ -546,7 +546,7 @@
                                +   config_btr_gam2_SSHWt1 *block % state % time_levs(newBtrSubcycleTime) % state % sshSubcycle % array(cell2)
 
                      sshEdge = 0.5 * (sshCell1 + sshCell2)
-                     hSum = sshEdge + block % mesh % referenceBottomDepth % array (block % mesh % maxLevelEdgeTop % array(iEdge))
+                     hSum = sshEdge + block % mesh % referenceBottomDepthTopOfCell % array (block % mesh % maxLevelEdgeTop % array(iEdge)+1)
       
                      flux = ((1.0-config_btr_gam3_uWt2) * block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
                             + config_btr_gam3_uWt2 * block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge)) &amp;

</font>
</pre>