<p><b>mpetersen@lanl.gov</b> 2010-05-14 12:09:25 -0600 (Fri, 14 May 2010)</p><p>Changed vertical edge variables to reference the top rather than bottom of cell.  All are named *Top and are dimensioned nVertLevels+1.  This lets me avoid any special cases for the surface and bottom in my loops.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-14 17:06:19 UTC (rev 274)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-14 18:09:25 UTC (rev 275)
@@ -35,6 +35,7 @@
 dim R3 3
 dim vertexDegree vertexDegree
 dim nVertLevels nVertLevels
+dim nVertLevelsP1 nVertLevels+1
 
 #
 # var  type  name_in_file  ( dims )  iro-  name_in_code super-array array_class
@@ -93,7 +94,7 @@
 var integer maxLevelsEdge ( nEdges ) iro kmaxEdge - -
 var real hZLevel ( nVertLevels ) iro hZLevel - -
 var real zMidZLevel ( nVertLevels ) iro zMidZLevel - -
-var real zBotZLevel ( nVertLevels ) iro zBotZLevel - -
+var real zTopZLevel ( nVertLevelsP1 ) iro zTopZLevel - -
 
 # Boundary conditions: read from input, saved in restart and written to output
 var integer boundaryEdge ( nVertLevels nEdges ) iro boundaryEdge - -
@@ -122,16 +123,14 @@
 var real    uReconstructY ( nVertLevels nCells Time ) o uReconstructY - -
 var real    uReconstructZ ( nVertLevels nCells Time ) o uReconstructZ - -
 var real    zMid ( nVertLevels nCells Time ) o zMid - -
-var real    zBot ( nVertLevels nCells Time ) o zBot - -
-var real    zSurface ( nCells Time ) o zSurface - -
+var real    zTop ( nVertLevelsP1 nCells Time ) o zTop - -
 var real    zMidEdge ( nVertLevels nEdges Time ) o zMidEdge - -
-var real    zBotEdge ( nVertLevels nEdges Time ) o zBotEdge - -
-var real    zSurfaceEdge ( nEdges Time ) o zSurfaceEdge - -
-var real    pMid ( nVertLevels nCells Time ) o pMid - -
-var real    pBot ( nVertLevels nCells Time ) o pBot - -
-var real    pMidZLevel ( nVertLevels nCells Time ) o pmidZLevel - -
+var real    zTopEdge ( nVertLevelsP1 nEdges Time ) o zTopEdge - -
+var real    p ( nVertLevels nCells Time ) o p - -
+var real    pTop ( nVertLevelsP1 nCells Time ) o pTop - -
+var real    pZLevel ( nVertLevels nCells Time ) o pZLevel - -
 var real    MontPot ( nVertLevels nCells Time ) o MontPot - -
-var real    wBot ( nVertLevels nCells Time ) o wBot - -
+var real    wTop ( nVertLevelsP1 nCells Time ) o wTop - -
 
 # Other diagnostic variables: neither read nor written to any files
 var real    vh ( nVertLevels nEdges Time ) - vh - -

Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_global_diagnostics.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_global_diagnostics.F        2010-05-14 17:06:19 UTC (rev 274)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_global_diagnostics.F        2010-05-14 18:09:25 UTC (rev 275)
@@ -36,7 +36,7 @@
       real (kind=RKIND) ::  areaCellGlobal, areaEdgeGlobal, areaTriangleGlobal
       real (kind=RKIND), dimension(:), pointer ::  areaCell, dcEdge, dvEdge, areaTriangle, areaEdge
       real (kind=RKIND), dimension(:,:), pointer :: h, u, v, h_edge, circulation, vorticity, ke, pv_edge, pv_vertex, &amp;
-         pv_cell, gradPVn, gradPVt, zmid, zbot, pmid, pbot, MontPot, w, rho
+         pv_cell, gradPVn, gradPVt, zMid, zTop, p, pTop, MontPot, wTop, rho
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers
       real (kind=RKIND) :: volumeCellGlobal, volumeEdgeGlobal, CFLNumberGlobal
       real (kind=RKIND) ::  localCFL, localSum
@@ -66,7 +66,7 @@
       rho =&gt; state % rho % array
       tracers =&gt; state % tracers % array
       v =&gt; state % v % array
-      w =&gt; state % w % array
+      wTop =&gt; state % wTop % array
       h_edge =&gt; state % h_edge % array
       circulation =&gt; state % circulation % array
       vorticity =&gt; state % vorticity % array
@@ -76,10 +76,10 @@
       pv_cell =&gt; state % pv_cell % array
       gradPVn =&gt; state % gradPVn % array
       gradPVt =&gt; state % gradPVt % array
-      zmid =&gt; state % zmid % array
-      zbot =&gt; state % zbot % array
-      pmid =&gt; state % pmid % array
-      pbot =&gt; state % pbot % array
+      zMid =&gt; state % zMid % array
+      zTop =&gt; state % zTop % array
+      p =&gt; state % p % array
+      pTop =&gt; state % pTop % array
       MontPot =&gt; state % MontPot % array
 
       variableIndex = 0
@@ -152,28 +152,28 @@
         gradPVt(:,1:nEdgesSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
         verticalSumMaxes(variableIndex))
 
-      ! zmid
+      ! zMid
       variableIndex = variableIndex + 1
       call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), &amp;
-        zmid(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
+        zMid(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
         verticalSumMaxes(variableIndex))
 
-      ! zbot
+      ! zTop
       variableIndex = variableIndex + 1
       call computeFieldAreaWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), &amp;
-        zbot(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
+        zTop(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
         verticalSumMaxes(variableIndex))
 
-      ! pmid
+      ! p
       variableIndex = variableIndex + 1
       call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        pmid(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
+        p(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
         verticalSumMaxes(variableIndex))
 
-      ! pbot
+      ! pTop
       variableIndex = variableIndex + 1
       call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        pbot(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
+        pTop(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
         verticalSumMaxes(variableIndex))
 
       ! MontPot
@@ -182,10 +182,10 @@
         MontPot(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
         verticalSumMaxes(variableIndex))
 
-      ! w vertical velocity
+      ! wTop vertical velocity
       variableIndex = variableIndex + 1
-      call computeFieldVolumeWeightedLocalStats(dminfo, nVertLevels, nCellsSolve, areaCell(1:nCellsSolve), h(:,1:nCellsSolve), &amp;
-        w(:,1:nCellsSolve), sums(variableIndex), mins(variableIndex), maxes(variableIndex), verticalSumMins(variableIndex), &amp;
+      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))
 
       nVariables = variableIndex
@@ -294,19 +294,19 @@
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/volumeEdgeGlobal
 
-      ! zmid
+      ! zMid
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/(areaCellGlobal*nVertLevels)
 
-      ! zbot
+      ! zTop
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/(areaCellGlobal*nVertLevels)
 
-      ! pmid
+      ! p
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/volumeCellGlobal
 
-      ! pbot
+      ! pTop
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/volumeCellGlobal
 
@@ -314,7 +314,7 @@
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/volumeCellGlobal
 
-      ! w vertical velocity
+      ! wTop vertical velocity
       variableIndex = variableIndex + 1
       averages(variableIndex) = sums(variableIndex)/volumeCellGlobal
 

Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_test_cases.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_test_cases.F        2010-05-14 17:06:19 UTC (rev 274)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_test_cases.F        2010-05-14 18:09:25 UTC (rev 275)
@@ -28,7 +28,7 @@
       ! mrp 100507: for diagnostic output
       integer :: iTracer
       real (kind=RKIND), dimension(:), pointer :: xCell,yCell, &amp;
-         hZLevel, zmidZLevel, zbotZLevel 
+         hZLevel, zMidZLevel, zTopZLevel 
       real (kind=RKIND), dimension(:,:), pointer :: h, u, u_src, rho
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers
       real (kind=RKIND) :: delta_rho
@@ -110,8 +110,8 @@
          yCell      =&gt; block_ptr % mesh % yCell % array
 
          hZLevel    =&gt; block_ptr % mesh % hZLevel % array
-         zmidZLevel =&gt; block_ptr % mesh % zmidZLevel % array
-         zbotZLevel =&gt; block_ptr % mesh % zbotZLevel % array
+         zMidZLevel =&gt; block_ptr % mesh % zMidZLevel % array
+         zTopZLevel =&gt; block_ptr % mesh % zTopZLevel % array
 
          nCells      = block_ptr % mesh % nCells
          nEdges      = block_ptr % mesh % nEdges
@@ -122,12 +122,11 @@
       if (config_vert_grid_type.eq.'zlevel') then
          ! These should eventually be in an input file.  For now
          ! I just read them in from h(:,1).
-        hZLevel = h(:,1)
-        zmidZLevel(1) = -0.5*hZLevel(1)
-        zbotZLevel(1) = -hZLevel(1)
-        do iLevel = 2,nVertLevels
-           zmidZLevel(iLevel) = zbotZLevel(iLevel-1)-0.5*hZLevel(iLevel)
-           zbotZLevel(iLevel) = zbotZLevel(iLevel-1)-    hZLevel(iLevel)
+         hZLevel = h(:,1)
+         zTopZLevel(1) = 0.0
+         do iLevel = 1,nVertLevels
+           zMidZLevel(iLevel) = zTopZLevel(iLevel)-0.5*hZLevel(iLevel)
+           zTopZLevel(iLevel+1) = zTopZLevel(iLevel)-  hZLevel(iLevel)
          enddo
          if (config_vert_grid_type.eq.'isopycnal') then
            print *, ' Using isopycnal coordinates'
@@ -164,14 +163,14 @@
             '  min u       max u     ',&amp;
             '  min u_src   max u_src ', &amp;
             '  min h       max h     ',&amp;
-            '  hZLevel     zmidZlevel', &amp;
-            '  zbotZlevel'
+            '  hZLevel     zMidZlevel', &amp;
+            '  zTopZlevel'
          do iLevel = 1,nVertLevels
             print '(i5,20es12.4)', ilevel, rho(ilevel,1), &amp;
               minval(u(iLevel,1:nEdges)), maxval(u(iLevel,1:nEdges)), &amp;
               minval(u_src(iLevel,1:nEdges)), maxval(u_src(iLevel,1:nEdges)), &amp;
               minval(h(iLevel,1:nCells)), maxval(h(iLevel,1:nCells)), &amp;
-              hZLevel(iLevel),zmidZlevel(iLevel),zbotZlevel(iLevel)
+              hZLevel(iLevel),zMidZlevel(iLevel),zTopZlevel(iLevel)
          enddo
 
          ! print some diagnostics

Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-14 17:06:19 UTC (rev 274)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-14 18:09:25 UTC (rev 275)
@@ -229,7 +229,7 @@
 
          ! xsad 10-02-09:
          ! commenting this out until we incorporate the necessary lapack routines into mpas
-         !call reconstruct(block % time_levs(2) % state, block % mesh)
+         call reconstruct(block % time_levs(2) % state, block % mesh)
          ! xsad 10-02-09 end
 
          block =&gt; block % next
@@ -258,22 +258,21 @@
 
       integer :: nCells, nEdges, nVertices, nVertLevels
       real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, q, &amp;
-        upstream_bias, wBotEdge, rho0Inv
+        upstream_bias, wTopEdge, rho0Inv
       real (kind=RKIND), dimension(:), pointer :: &amp;
-        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, zSurfaceEdge, &amp;
+        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, &amp;
         zMidZLevel 
-      real (kind=RKIND), dimension(grid % nVertLevels) :: w_dudzBotEdge
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
-        weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, wBot, &amp;
-        tend_h, tend_u, hFluxBot, circulation, vorticity, ke, pv_edge, &amp;
-        divergence, MontPot, pmidZLevel, zMidEdge, zBotEdge
+        weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, wTop, &amp;
+        tend_h, tend_u, hFluxTop, circulation, vorticity, ke, pv_edge, &amp;
+        divergence, MontPot, pZLevel, zMidEdge, zTopEdge
 
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
       integer, dimension(:,:), pointer :: &amp;
         cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, &amp;
         edgesOnEdge, edgesOnVertex
-      real (kind=RKIND) :: u_diffusion, visc, dist
-      real (kind=RKIND), dimension(:), allocatable:: fluxVert
+      real (kind=RKIND) :: u_diffusion, visc
+      real (kind=RKIND), dimension(:), allocatable:: fluxVertTop,w_dudzTopEdge
 
       real (kind=RKIND), dimension(:,:), pointer :: u_src
       real (kind=RKIND), parameter :: rho_ref = 1000.0
@@ -283,7 +282,7 @@
       h           =&gt; s % h % array
       u           =&gt; s % u % array
       v           =&gt; s % v % array
-      wBot        =&gt; s % wBot % array
+      wTop        =&gt; s % wTop % array
       h_edge      =&gt; s % h_edge % array
       circulation =&gt; s % circulation % array
       vorticity   =&gt; s % vorticity % array
@@ -291,9 +290,8 @@
       ke          =&gt; s % ke % array
       pv_edge     =&gt; s % pv_edge % array
       MontPot     =&gt; s % MontPot % array
-      pmidZLevel  =&gt; s % pmidZLevel % array
-      zBotEdge    =&gt; s % zBotEdge % array
-      zSurfaceEdge=&gt; s % zSurfaceEdge % array
+      pZLevel     =&gt; s % pZLevel % array
+      zTopEdge    =&gt; s % zTopEdge % array
       zMidEdge    =&gt; s % zMidEdge % array
 
       weightsOnEdge     =&gt; grid % weightsOnEdge % array
@@ -313,11 +311,11 @@
       h_s               =&gt; grid % h_s % array
       fVertex           =&gt; grid % fVertex % array
       fEdge             =&gt; grid % fEdge % array
-      zmidZLevel        =&gt; grid % zmidZLevel % array
+      zMidZLevel        =&gt; grid % zMidZLevel % array
 
       tend_h      =&gt; tend % h % array
       tend_u      =&gt; tend % u % array
-      hFluxBot    =&gt; tend % wBot % array
+      hFluxTop    =&gt; tend % wTop % array
                   
       nCells      = grid % nCells
       nEdges      = grid % nEdges
@@ -358,65 +356,61 @@
       ! height tendency: vertical advection term -d/dz(hw)
       !
       if (config_vert_grid_type.eq.'isopycnal') then
-        hFluxBot=0.0  ! vertical fluxes are zero
+        hFluxTop=0.0  ! vertical fluxes are zero
 
       elseif (config_vert_grid_type.eq.'zlevel') then
+
         do iCell=1,nCells
+           hFluxTop(1,iCell) = 0.0
+           hFluxTop(nVertLevels+1,iCell) = 0.0
 
-           ! change nvertlevels to kmt later
-           ! this next line can be set permanently somewhere upon startup.
-           hFluxBot(nVertLevels,iCell) = 0.0
-   
+           ! compute hw, the vertical height flux, using
+           ! hw = -integral_zbot^ztop ( div(hu) )
            do k=nVertLevels,2,-1
+              ! I use +tend_h because tend_h is -div.(hu)
+              hFluxTop(k,iCell) = hFluxTop(k+1,iCell) + tend_h(k,iCell)*h(k,iCell)
+           end do
 
-              ! F^v_{k-1/2} = 
-              ! F^v_{k+1/2} - </font>
<font color="red">abla_h \cdot \left( F^h \right) h_k
-              ! note +tend_h because tend_h is -div.(hu)
-              hFluxBot(k-1,iCell) = hFluxBot(k,iCell) + tend_h(k,iCell)*h(k,iCell)
-    
-              ! now tend_h is div.(hu) + d/dz(hw):
-              ! - </font>
<font color="gray">abla_h \cdot F^h_k 
-              ! - \frac{F^v_{k-1/2} - F^v_{k+1/2}}{ h^n_k} 
-              ! note if you substitute line above this is just tend_h=0.
-              ! so this line can be changed to tend_h=0 in the future.
+           ! add -d/dz(hw) to heigh tendency
+           ! note if you substitute this into the line above this is 
+           ! just tend_h=0 except for the top layer.
+           ! So this loop could be changed to just k=1 in the future.
+           do k=1,nVertLevels
               tend_h(k,iCell) =   tend_h(k,iCell) &amp;
-                              - (hFluxBot(k-1,iCell) - hFluxBot(k,iCell))/h(k,iCell)
+                - (hFluxTop(k,iCell) - hFluxTop(k+1,iCell))/h(k,iCell)
            end do
 
-           k=1
-           ! Surface tracer hFluxBot(k,iCell) = 0.0 is not used
-           tend_h(k,iCell) =   tend_h(k,iCell) &amp;
-                             - ( - hFluxBot(k,iCell))/h(k,iCell)
-
         end do
       endif ! coordinate type
 
       !
       ! velocity tendency: vertical advection term -w du/dz
       !
+      allocate(w_dudzTopEdge(nVertLevels+1))
+      w_dudzTopEdge(1) = 0.0
+      w_dudzTopEdge(nVertLevels+1) = 0.0
       tend_u(:,:) = 0.0
       if (config_vert_grid_type.eq.'zlevel') then
        do iEdge=1,grid % nEdgesSolve
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
 
-         do k=1,nVertLevels-1
+         do k=2,nVertLevels
            ! Average w from cell center to edge
-           wBotEdge = 0.5*(wBot(k,cell1)+wBot(k,cell2))
+           wTopEdge = 0.5*(wTop(k,cell1)+wTop(k,cell2))
 
            ! compute dudz at vertical interface with first order derivative.
-           w_dudzBotEdge(k) = wBotEdge * (u(k,iEdge)-u(k+1,iEdge)) &amp;
-                        / (zMidZLevel(k) - zMidZLevel(k+1))
+           w_dudzTopEdge(k) = wTopEdge * (u(k-1,iEdge)-u(k,iEdge)) &amp;
+                        / (zMidZLevel(k-1) - zMidZLevel(k))
          end do
-         w_dudzBotEdge(nVertLevels) = 0.0
 
          ! Average w*du/dz from vertical interface to vertical middle of cell
-         tend_u(1,iEdge) = - 0.5 * w_dudzBotEdge(1)
-         do k=2,nVertLevels
-            tend_u(k,iEdge) = - 0.5 * (w_dudzBotEdge(k-1) + w_dudzBotEdge(k))
+         do k=1,nVertLevels
+            tend_u(k,iEdge) = - 0.5 * (w_dudzTopEdge(k) + w_dudzTopEdge(k+1))
          enddo
        enddo
       endif
+      deallocate(w_dudzTopEdge)
 
       !
       ! velocity tendency: pressure gradient
@@ -437,8 +431,8 @@
           cell2 = cellsOnEdge(2,iEdge)
           do k=1,nVertLevels
              tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
-               - rho0Inv*(  pmidZLevel(k,cell2) &amp;
-                          - pmidZLevel(k,cell1) )/dcEdge(iEdge)
+               - rho0Inv*(  pZLevel(k,cell2) &amp;
+                          - pZLevel(k,cell1) )/dcEdge(iEdge)
           end do
         enddo
       endif
@@ -493,35 +487,30 @@
       !
       ! velocity tendency: vertical mixing d/dz( nu_v du/dz))
       !
-      allocate(fluxVert(0:nVertLevels))
+      allocate(fluxVertTop(1:nVertLevels+1))
+      fluxVertTop(1) = 0.0
+      fluxVertTop(nVertLevels+1) = 0.0
       do iEdge=1,grid % nEdgesSolve
-         fluxVert(0) = 0.0
-         fluxVert(nVertLevels) = 0.0
-         do k=nVertLevels-1,1,-1
-           fluxVert(k) = config_vert_viscosity &amp;
-              * ( u(k,iEdge) - u(k+1,iEdge) ) &amp;
-              / (zMidEdge(k,iEdge) -zMidEdge(k+1,iEdge))
+         do k=2,nVertLevels
+           fluxVertTop(k) = config_vert_viscosity &amp;
+              * ( u(k-1,iEdge) - u(k,iEdge) ) &amp;
+              / (zMidEdge(k-1,iEdge) -zMidEdge(k,iEdge))
          enddo
          do k=1,nVertLevels
-           if(k.eq.1) then
-              dist = zSurfaceEdge(iEdge) - zBotEdge(k,iEdge)
-           else
-              dist = zBotEdge(k-1,iEdge) - zBotEdge(k,iEdge)
-           endif
-
-           tend_u(k,iEdge) = tend_u(k,iEdge) + (fluxVert(k-1) - fluxVert(k))/dist
-
+           tend_u(k,iEdge) = tend_u(k,iEdge) &amp;
+             + (fluxVertTop(k) - fluxVertTop(k+1)) &amp;
+              /(zTopEdge(k,iEdge) - zTopEdge(k+1,iEdge))
          enddo
       end do
-      deallocate(fluxVert)
+      deallocate(fluxVertTop)
 
-!print *, 'ncells,grid % nCellsSolve, size(hFluxBot)',ncells,grid % nCellsSolve, size(hFluxBot,1), size(hFluxBot,2)
+!print *, 'ncells,grid % nCellsSolve, size(hFluxTop)',ncells,grid % nCellsSolve, size(hFluxTop,1), size(hFluxTop,2)
 ! print '(a,i5,f10.5)', &amp;
-!  'k,   min(tend_h(k,2:)),max(tend_h(k,2:)),min(hFluxBot(k,:)),max(hFluxBot(k,:))'
+!  'k,   min(tend_h(k,2:)),max(tend_h(k,2:)),min(hFluxTop(k,:)),max(hFluxTop(k,:))'
 ! do k=1,nVertLevels
 !   print '(i5,10es10.2)', &amp;
 !     k,minval(tend_h(k,1:grid % ncellssolve)),maxval(tend_h(k,1:grid % ncellssolve)), &amp;
-! minval(hFluxBot(k,1:grid % ncellssolve)),maxval(hFluxBot(k,1:grid % ncellssolve))
+! minval(hFluxTop(k,1:grid % ncellssolve)),maxval(hFluxTop(k,1:grid % ncellssolve))
 ! enddo
 
 ! print '(a,i5,f10.5)', &amp;
@@ -554,25 +543,24 @@
       real (kind=RKIND) :: flux, tracer_edge, r
       real (kind=RKIND) :: dist
       real (kind=RKIND), dimension(:), pointer :: &amp;
-        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, zsurface
+        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
-        u,h,hFluxBot, h_edge, zmid, zbot
+        u,h,hFluxTop, h_edge, zMid, zTop
       real (kind=RKIND), dimension(:,:,:), pointer :: &amp;
         tracers, tend_tr
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
       integer, dimension(:,:), pointer :: cellsOnEdge
-      real (kind=RKIND), dimension(:), allocatable:: hFluxBotCol
-      real (kind=RKIND), dimension(:,:), allocatable:: fluxVert, tracerBot
+      real (kind=RKIND), dimension(:), allocatable:: hFluxTopCol
+      real (kind=RKIND), dimension(:,:), allocatable:: fluxVertTop, tracerTop
       real (kind=RKIND), dimension(:,:,:), allocatable::tr_flux, tr_div
 
       u           =&gt; s % u % array
       h           =&gt; s % h % array
       tracers     =&gt; s % tracers % array
       h_edge      =&gt; s % h_edge % array
-      hFluxBot          =&gt; tend % wBot % array
-      zmid        =&gt; s % zmid % array
-      zbot        =&gt; s % zbot % array
-      zsurface    =&gt; s % zsurface % array
+      hFluxTop          =&gt; tend % wTop % array
+      zMid        =&gt; s % zMid % array
+      zTop        =&gt; s % zTop % array
 
       tend_tr     =&gt; tend % tracers % array
                   
@@ -585,7 +573,7 @@
       nVertLevels = grid % nVertLevels
 
       !
-      ! tracer tendency: horizontal advection term -</font>
<font color="gray">abla\cdot ( h \phi u)
+      ! tracer tendency: horizontal advection term -div( h \phi u)
       !
       tend_tr(:,:,:) = 0.0
       if (config_hor_tracer_adv.eq.'centered') then
@@ -641,84 +629,47 @@
       !
       ! tracer tendency: vertical advection term -d/dz( h \phi w)
       !
-      allocate(tracerBot(num_tracers,0:nVertLevels))
-      allocate(hFluxBotCol(0:nVertLevels))
-      tracerBot(:,0)=0.0
-      tracerBot(:,nVertLevels)=0.0
-      hFluxBotCol(0)=0.0
-      hFluxBotCol(nVertLevels)=0.0
+      allocate(tracerTop(num_tracers,nVertLevels+1))
+      tracerTop(:,1)=0.0
+      tracerTop(:,nVertLevels+1)=0.0
       do iCell=1,grid % nCellsSolve 
 
          if (config_vert_tracer_adv.eq.'centered') then
-           do k=1,nVertLevels-1
+           do k=2,nVertLevels
              do iTracer=1,num_tracers
-               tracerBot(iTracer,k) = (   tracers(iTracer,k  ,iCell) &amp;
-                                   + tracers(iTracer,k+1,iCell))/2.0
+               tracerTop(iTracer,k) = ( tracers(iTracer,k-1,iCell) &amp;
+                                       +tracers(iTracer,k  ,iCell))/2.0
              end do
            end do
          
          elseif (config_vert_tracer_adv.eq.'upwind') then
-           do k=1,nVertLevels-1
-             if (hFluxBot(k,iCell)&gt;0.0) then
-               upwindCell = k+1
-             else
+           do k=2,nVertLevels
+             if (hFluxTop(k,iCell)&gt;0.0) then
                upwindCell = k
+             else
+               upwindCell = k-1
              endif
              do iTracer=1,num_tracers
-               tracerBot(iTracer,k) = tracers(iTracer,upwindCell,iCell)
+               tracerTop(iTracer,k) = tracers(iTracer,upwindCell,iCell)
              end do
            end do
 
          endif
 
-         hFluxBotCol(1:nVertLevels)=hFluxBot(1:nVertLevels,iCell)
          do k=1,nVertLevels  
             do iTracer=1,num_tracers
                tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
-                  - (   hFluxBotCol(k-1)*tracerBot(iTracer,k-1) &amp;
-                      - hFluxBotCol(k  )*tracerBot(iTracer,k  ))/h(k,icell)
+                  - (   hFluxTop(k  ,iCell)*tracerTop(iTracer,k  ) &amp;
+                      - hFluxTop(k+1,iCell)*tracerTop(iTracer,k+1))/h(k,icell)
             end do
          end do
 
       enddo ! iCell
-      deallocate(tracerBot,hFluxBotcol)
+      deallocate(tracerTop)
 
       !
-      ! tracer tendency: vertical mixing d/dz( \kappa_v d\phi/dz))
-      !
-      allocate(fluxVert(num_tracers,0:nVertLevels))
-      fluxVert(:,0) = 0.0
-      fluxVert(:,nVertLevels) = 0.0
-      do iCell=1,grid % nCellsSolve 
-         do k=1,nVertLevels-1
-           do iTracer=1,num_tracers
-             fluxVert(iTracer,k) = config_vert_diffusion &amp;
-                * (tracers(iTracer,k,iCell) - tracers(iTracer,k+1,iCell) )&amp;
-                / (zMid(k,iCell) -zMid(k+1,iCell))
-           enddo
-         enddo
-
-         k=1
-           dist = zSurface(iCell) - zBot(k,iCell)
-           do iTracer=1,num_tracers
-             tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
-               + (fluxVert(iTracer,k-1) - fluxVert(iTracer,k))/dist ! orig
-           enddo
-
-         do k=2,nVertLevels
-           dist = zBot(k-1,iCell) - zBot(k,iCell)
-           do iTracer=1,num_tracers
-             tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
-               + (fluxVert(iTracer,k-1) - fluxVert(iTracer,k))/dist
-           enddo
-         enddo
-
-      enddo ! iCell loop
-      deallocate(fluxVert)
-
-      !
       ! tracer tendency: horizontal tracer diffusion 
-      !   </font>
<font color="black">abla\cdot (\kappa_h </font>
<font color="blue">abla\phi )
+      !   div(\kappa_h </font>
<font color="black">abla\phi )
       !
       ! first compute \kappa_h </font>
<font color="gray">abla\phi at horizontal edges.
       allocate(tr_flux(num_tracers,nVertLevels,nEdges))
@@ -760,7 +711,7 @@
          end if
       end do
 
-      ! add </font>
<font color="black">abla\cdot (\kappa_h </font>
<font color="blue">abla\phi ) to tracer tendency
+      ! add div(\kappa_h </font>
<font color="gray">abla\phi ) to tracer tendency
       do iCell = 1,nCells
         r = 1.0 / areaCell(iCell)
         do k = 1,nVertLevels
@@ -772,6 +723,33 @@
       enddo
       deallocate(tr_flux, tr_div)
 
+      !
+      ! tracer tendency: vertical mixing d/dz( \kappa_v d\phi/dz))
+      !
+      allocate(fluxVertTop(num_tracers,nVertLevels+1))
+      fluxVertTop(:,1) = 0.0
+      fluxVertTop(:,nVertLevels+1) = 0.0
+      do iCell=1,grid % nCellsSolve 
+         do k=2,nVertLevels
+           do iTracer=1,num_tracers
+             fluxVertTop(iTracer,k) = config_vert_diffusion &amp;
+                * (tracers(iTracer,k-1,iCell) - tracers(iTracer,k,iCell) )&amp;
+                / (zMid(k-1,iCell) -zMid(k,iCell))
+           enddo
+         enddo
+
+         do k=1,nVertLevels
+           dist = zTop(k,iCell) - zTop(k+1,iCell)
+           do iTracer=1,num_tracers
+             tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
+               + (fluxVertTop(iTracer,k) - fluxVertTop(iTracer,k+1))/dist
+           enddo
+         enddo
+
+      enddo ! iCell loop
+      deallocate(fluxVertTop)
+
+
           ! print some diagnostics - for debugging
 !         print *, 'after vertical mixing',&amp;
 ! 'iTracer,k, minval(tend_tr(itracer,k,:)), maxval(tend_tr(itracer,k,:))'
@@ -803,19 +781,19 @@
 
 
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j, cov
-      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, delta_p, pbot_temp
+      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, delta_p, pTop_temp
 
       integer :: nCells, nEdges, nVertices, nVertLevels
 
 
       real (kind=RKIND), dimension(:), pointer :: &amp;
         h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, &amp;
-        zSurface, hZLevel, zSurfaceEdge
+        hZLevel
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
-        weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, w, wBot, &amp;
+        weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, w, wTop, &amp;
         circulation, vorticity, ke, &amp;
         pv_edge, pv_vertex, pv_cell, gradPVn, gradPVt, divergence, &amp;
-        zmid, zbot, zmidEdge, zbotEdge, pmid, pbot, MontPot, rho, temperature, salinity, pmidZLevel
+        zMid, zTop, zMidEdge, zTopEdge, p, pTop, MontPot, rho, temperature, salinity, pZLevel
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers
       real (kind=RKIND), dimension(:,:), allocatable:: div_u
       character :: c1*6
@@ -828,7 +806,7 @@
       h           =&gt; s % h % array
       u           =&gt; s % u % array
       v           =&gt; s % v % array
-      wBot        =&gt; s % wBot % array
+      wTop        =&gt; s % wTop % array
       h_edge      =&gt; s % h_edge % array
       circulation =&gt; s % circulation % array
       vorticity   =&gt; s % vorticity % array
@@ -841,16 +819,14 @@
       gradPVt     =&gt; s % gradPVt % array
       rho         =&gt; s % rho % array
       tracers     =&gt; s % tracers % array
-      zmid        =&gt; s % zmid % array
-      zbot        =&gt; s % zbot % array
-      zmidEdge    =&gt; s % zmidEdge % array
-      zbotEdge    =&gt; s % zbotEdge % array
-      pmid        =&gt; s % pmid % array
-      pmidZLevel  =&gt; s % pmidZLevel % array
-      pbot        =&gt; s % pbot % array
+      zMid        =&gt; s % zMid % array
+      zTop        =&gt; s % zTop % array
+      zMidEdge    =&gt; s % zMidEdge % array
+      zTopEdge    =&gt; s % zTopEdge % array
+      p           =&gt; s % p % array
+      pZLevel     =&gt; s % pZLevel % array
+      pTop        =&gt; s % pTop % array
       MontPot     =&gt; s % MontPot % array
-      zSurface    =&gt; s % zSurface % array
-      zSurfaceEdge=&gt; s % zSurfaceEdge % array
 
       weightsOnEdge     =&gt; grid % weightsOnEdge % array
       kiteAreasOnVertex =&gt; grid % kiteAreasOnVertex % array
@@ -1107,27 +1083,25 @@
          ! h_s is ocean topography: elevation above lowest point, 
          ! and is positive. z coordinates are pos upward, and z=0
          ! is at lowest ocean point.
-         zBot(nVertLevels,iCell) = h_s(iCell) 
-         zMid(nVertLevels,iCell) = zBot(nVertLevels,iCell) + 0.5*h(nVertLevels,iCell)
-         do k=nVertLevels-1,1,-1
-            zBot(k,iCell) = zBot(k+1,iCell) + h(k+1,iCell)
-            zMid(k,iCell) = zBot(k,iCell) + 0.5*h(k,iCell)
+         zTop(nVertLevels+1,iCell) = h_s(iCell) 
+         do k=nVertLevels,1,-1
+            zMid(k,iCell) = zTop(k+1,iCell) + 0.5*h(k,iCell)
+            zTop(k,iCell) = zTop(k+1,iCell) +     h(k,iCell)
          end do
-         ! rather than using zBot(0,iCell), I am adding another 2D variable.
-         zSurface(iCell) = zBot(1,iCell) + h(1,iCell)
 
          ! assume atmospheric pressure at the surface is zero for now.
-         pmid(1,iCell) = 0.5*rho(1,iCell)*gravity* h(1,iCell) 
-         pbot(1,iCell) =     rho(1,iCell)*gravity* h(1,iCell) 
-         MontPot(1,iCell) = gravity * zSurface(iCell) 
-         do k=2,nVertLevels
+         pTop(1,iCell) = 0.0
+         do k=1,nVertLevels
             delta_p = rho(k,iCell)*gravity* h(k,iCell)
-            pmid(k,iCell) = pbot(k-1,iCell) + 0.5*delta_p
-            pbot(k,iCell) = pbot(k-1,iCell) + delta_p
+            p(k  ,iCell) = pTop(k,iCell) + 0.5*delta_p
+            pTop(k+1,iCell) = pTop(k,iCell) + delta_p
+         end do
 
+         MontPot(1,iCell) = gravity * zTop(1,iCell) 
+         do k=2,nVertLevels
             ! from delta M = p delta / rho
             MontPot(k,iCell) = MontPot(k-1,iCell) &amp;
-               + pbot(k-1,iCell)*(1.0/rho(k,iCell) - 1.0/rho(k-1,iCell)) 
+               + pTop(k,iCell)*(1.0/rho(k,iCell) - 1.0/rho(k-1,iCell)) 
          end do
 
       end do
@@ -1136,31 +1110,32 @@
        cell1 = cellsOnEdge(1,iEdge)
        cell2 = cellsOnEdge(2,iEdge)
        if(cell1&lt;=nCells .and. cell2&lt;=nCells) then
-        do k=1,nVertLevels
-          zBotEdge(k,iEdge) = (zBot(k,cell1)+zBot(k,cell2))/2.0
-          zMidEdge(k,iEdge) = (zMid(k,cell1)+zMid(k,cell2))/2.0
-        enddo
-        zSurfaceEdge(iEdge) = (zSurface(cell1) + zSurface(cell2))/2.0
+         do k=1,nVertLevels
+           zTopEdge(k,iEdge) = (zTop(k,cell1)+zTop(k,cell2))/2.0
+           zMidEdge(k,iEdge) = (zMid(k,cell1)+zMid(k,cell2))/2.0
+         enddo
+         zTopEdge(nVertLevels+1,iEdge) = ( zTop(nVertLevels+1,cell1) &amp;
+                                         + zTop(nVertLevels+1,cell2))/2.0
         endif
       enddo
 
 
       ! For z-level model.
       ! Compute pressure at middle of each level.  
-      ! pmidZLevel and pmid should only differ at k=1, where pmid is 
-      ! pressure at middle of layer including SSH, and pmidZLevel is
+      ! pZLevel and p should only differ at k=1, where p is 
+      ! pressure at middle of layer including SSH, and pZLevel is
       ! pressure at a depth of hZLevel(1)/2.
       !
       do iCell=1,nCells
          ! compute pressure for z-level coordinates
          ! assume atmospheric pressure at the surface is zero for now.
-         pmidZLevel(1,iCell) = rho(1,iCell)*gravity &amp;
+         pZLevel(1,iCell) = rho(1,iCell)*gravity &amp;
             * (h(1,iCell)-0.5*hZLevel(1)) 
-         pbot_temp =  rho(1,iCell)*gravity*h(1,iCell) 
+         pTop_temp =  rho(1,iCell)*gravity*h(1,iCell) 
          do k=2,nVertLevels
             delta_p = rho(k,iCell)*gravity*hZLevel(k)
-            pmidZLevel(k,iCell) = pmidZLevel(k-1,iCell) + 0.5*delta_p
-            pbot_temp = pbot_temp + delta_p
+            pZLevel(k,iCell) = pZLevel(k-1,iCell) + 0.5*delta_p
+            pTop_temp = pTop_temp + delta_p
          end do
 
       end do
@@ -1168,7 +1143,7 @@
       ! compute vertical velocity
       if (config_vert_grid_type.eq.'isopycnal') then
         ! set vertical velocity to zero in isopycnal case
-        wBot=0.0  
+        wTop=0.0  
 
       elseif (config_vert_grid_type.eq.'zlevel') then
 
@@ -1200,12 +1175,11 @@
               div_u(k,iCell) = div_u(k,iCell) / areaCell(iCell)
            end do
 
-           ! change nvertlevels to kmt later
+           ! Vertical velocity at bottom is zero.
            ! this next line can be set permanently somewhere upon startup.
-           wBot(nVertLevels,iCell) = 0.0
-   
-           do k=nVertLevels,2,-1
-              wBot(k-1,iCell) = wBot(k,iCell) - div_u(k,iCell)*h(k,iCell)
+           wTop(nVertLevels+1,iCell) = 0.0
+           do k=nVertLevels,1,-1
+              wTop(k,iCell) = wTop(k+1,iCell) - div_u(k,iCell)*h(k,iCell)
            end do
 
         end do

Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/mpas_interface.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/mpas_interface.F        2010-05-14 17:06:19 UTC (rev 274)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/mpas_interface.F        2010-05-14 18:09:25 UTC (rev 275)
@@ -27,7 +27,7 @@
 
    ! xsad 10-02-09:
    ! commenting this out until we incorporate the necessary lapack routines into mpas
-   ! call init_reconstruct(mesh)
+   call init_reconstruct(mesh)
    ! xsad 10-02-09 end
 
 ! mrp 100316 In order for this to work, we need to pass domain % dminfo as an 

</font>
</pre>