<p><b>mpetersen@lanl.gov</b> 2010-05-12 14:15:56 -0600 (Wed, 12 May 2010)</p><p>Compute wBot in diagnostics.  Found bug: Normalization tend_h(k,iCell) / areaCell(iCell) should loop to nCells, not nCellsSolve, because I use that to compute advective terms before a boundary update.  Also updated some variable names.<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-11 21:20:41 UTC (rev 265)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-12 20:15:56 UTC (rev 266)
@@ -132,6 +132,7 @@
 var real    pMidZLevel ( nVertLevels nCells Time ) o pmidZLevel - -
 var real    MontPot ( nVertLevels nCells Time ) o MontPot - -
 var real    w ( nVertLevels nCells Time ) o w - -
+var real    wBot ( nVertLevels nCells Time ) o wBot - -
 
 # 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_time_integration.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-11 21:20:41 UTC (rev 265)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-12 20:15:56 UTC (rev 266)
@@ -284,12 +284,13 @@
 
       integer :: nCells, nEdges, nVertices, nVertLevels
       real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, q, &amp;
-        upstream_bias, wHat, rho0Inv
+        upstream_bias, wBotEdge, rho0Inv
       real (kind=RKIND), dimension(:), pointer :: &amp;
-        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, zSurfaceEdge
-      real (kind=RKIND), dimension(grid % nVertLevels) :: w_dudz
+        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, zSurfaceEdge, &amp;
+        zMidZLevel 
+      real (kind=RKIND), dimension(grid % nVertLevels) :: w_dudzBotEdge
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
-        vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, &amp;
+        vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, wBot, &amp;
         tend_h, tend_u, Fv, circulation, vorticity, ke, pv_edge, &amp;
         divergence, MontPot, pmidZLevel, zMidEdge, zBotEdge
 
@@ -308,6 +309,7 @@
       h           =&gt; s % h % array
       u           =&gt; s % u % array
       v           =&gt; s % v % array
+      wBot        =&gt; s % wBot % array
       Fv          =&gt; tend % w % array
       h_edge      =&gt; s % h_edge % array
       circulation =&gt; s % circulation % array
@@ -339,6 +341,7 @@
       h_s               =&gt; grid % h_s % array
       fVertex           =&gt; grid % fVertex % array
       fEdge             =&gt; grid % fEdge % array
+      zmidZLevel        =&gt; grid % zmidZLevel % array
 
       tend_h      =&gt; tend % h % array
       tend_u      =&gt; tend % u % array
@@ -350,7 +353,6 @@
 
       u_src =&gt; grid % u_src % array
 
-
       !
       ! Compute height tendency for each cell
       ! See Ringler et al. (2010) jcp paper, eqn 19, 21, and fig. 3.
@@ -373,29 +375,17 @@
             end if
       end do 
 
-      ! mrp 100409 computation of h tendency was, only had div.(hu) term
-      !do iCell=1,grid % nCellsSolve
-      !   do k=1,nVertLevels
-      !      tend_h(k,iCell) = tend_h(k,iCell) / areaCell(iCell)
-      !   end do
-      !end do
-      ! mrp 100409 replace with
+      do iCell=1,nCells
+         do k=1,nVertLevels
+            tend_h(k,iCell) = tend_h(k,iCell) / areaCell(iCell)
+         end do
+      end do
 
       if (config_vert_grid_type.eq.'isopycnal') then
         Fv=0.0  ! vertical fluxes are zero
-        do iCell=1,grid % nCellsSolve
-           do k=1,nVertLevels
-              tend_h(k,iCell) = tend_h(k,iCell) / areaCell(iCell)
-           end do
-        end do
 
       elseif (config_vert_grid_type.eq.'zlevel') then
-        ! z-level with vertical advection
-        do iCell=1,grid % nCellsSolve
-           do k=1,nVertLevels
-              ! tend_h is just the -div.(hu) term at this point:
-              tend_h(k,iCell) = tend_h(k,iCell) / areaCell(iCell)
-           end do
+        do iCell=1,nCells
 
            ! change nvertlevels to kmt later
            ! this next line can be set permanently somewhere upon startup.
@@ -448,33 +438,34 @@
          vertex2 = verticesOnEdge(2,iEdge)
 
          ! mrp 100422 add -w*dudz term to tendancy
-         ! For isopycnal mode, Fv should be zero.
+         ! For isopycnal mode, wBot should be zero.
          ! change nvertlevels to kmt later
          do k=1,nVertLevels-1
-           ! w =Fv/h.  Also average w from cell center to edge
-           wHat = (  Fv(k,cell1)/h(k+1,cell1) &amp;
-                   + Fv(k,cell2)/h(k+1,cell2))/2.0
+           ! Average w from cell center to edge
+           wBotEdge = 0.5*(wBot(k,cell1)+wBot(k,cell2))
+
            ! compute dudz at vertical interface with first order derivative.
-           w_dudz(k) = wHat * (u(k,iEdge)-u(k+1,iEdge)) &amp;
+! mrp 100511 new:
+!           w_dudzBotEdge(k) = wBotEdge * (u(k,iEdge)-u(k+1,iEdge)) &amp;
+!                        / (zMidZLevel(k) - zMidZLevel(k+1))
+! mrp 100511 old:
+           w_dudzBotEdge(k) = wBotEdge * (u(k,iEdge)-u(k+1,iEdge)) &amp;
                        * 2.0 / (h_edge(k,iEdge) + h_edge(k+1,iEdge))
          end do
-         w_dudz(nVertLevels) = 0.0
+         w_dudzBotEdge(nVertLevels) = 0.0
 
-         ! Average w*du/dz from vertical edges to vertical middle of cell
-!mrp 100510 remove zlevel additions
-!         tend_u(1,iEdge) = - 0.5 * w_dudz(1)
+         ! 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
-!mrp 100510 remove zlevel additions
-!            tend_u(k,iEdge) = - 0.5 * (w_dudz(k-1) + w_dudz(k))
+            tend_u(k,iEdge) = - 0.5 * (w_dudzBotEdge(k-1) + w_dudzBotEdge(k))
          enddo
          ! mrp 100422 end: add -w*dudz term to tendancy
 
          ! mrp 100426: add pressure gradient
          if (config_vert_grid_type.eq.'isopycnal') then
            do k=1,nVertLevels
-!mrp 100510 remove zlevel additions
-!             tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
-!               - (MontPot(k,cell2) - MontPot(k,cell1))/dcEdge(iEdge)
+             tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
+               - (MontPot(k,cell2) - MontPot(k,cell1))/dcEdge(iEdge)
            end do
          elseif (config_vert_grid_type.eq.'zlevel') then
            do k=1,nVertLevels
@@ -501,19 +492,10 @@
                workpv = 0.5 * (pv_edge(k,iEdge) + pv_edge(k,eoe))
                q = q + weightsOnEdge(j,iEdge) * u(k,eoe) * workpv * h_edge(k,eoe) 
             end do
-!mrp 100510 remove zlevel additions
- !           tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
- !                  + q     &amp;
- !                  + u_diffusion &amp;
- !                  - (   ke(k,cell2) - ke(k,cell1) ) / dcEdge(iEdge)
-!mrp 100510 remove zlevel additions replace with
-            tend_u(k,iEdge) =       &amp;
-                    q     &amp;
+            tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
+                   + q     &amp;
                    + u_diffusion &amp;
-                   - (   ke(k,cell2) - ke(k,cell1)  &amp;
-                       + MontPot(k,cell2) - MontPot(k,cell1) &amp;
-                         ) / dcEdge(iEdge)
-!mrp 100510 remove zlevel additions end
+                   - (   ke(k,cell2) - ke(k,cell1) ) / dcEdge(iEdge)
 
          end do
       end do
@@ -548,7 +530,6 @@
               dist = zBotEdge(k-1,iEdge) - zBotEdge(k,iEdge)
            endif
 
-!mrp 100510 remove zlevel additions
            tend_u(k,iEdge) = tend_u(k,iEdge) + (fluxVert(k-1) - fluxVert(k))/dist
 
          enddo
@@ -903,11 +884,12 @@
         h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, &amp;
         zSurface, hZLevel, zSurfaceEdge
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
-        vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, w, &amp;
-        tend_h, tend_u, circulation, vorticity, ke, &amp;
+        vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, w, wBot, &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
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers
+      real (kind=RKIND), dimension(:,:), allocatable:: div_u
       character :: c1*6
 
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, edgesOnEdge, edgesOnVertex, boundaryEdge
@@ -919,10 +901,9 @@
       u           =&gt; s % u % array
       v           =&gt; s % v % array
       w           =&gt; s % w % array
+      wBot        =&gt; s % wBot % array
       vh          =&gt; s % vh % array
       h_edge      =&gt; s % h_edge % array
-      tend_h      =&gt; s % h % array
-      tend_u      =&gt; s % u % array
       circulation =&gt; s % circulation % array
       vorticity   =&gt; s % vorticity % array
       divergence  =&gt; s % divergence % array
@@ -1064,18 +1045,6 @@
       end do
 
       !
-      ! Compute vertical velocity in each cell
-      ! w(k,iCell) is w_{k-1/2}, the velocity through the interface above cell k
-      ! Upon entry, w(k,iCell) is F^v_{k-1/2}, the vertical thickness flux, 
-      ! computed in compute_tend.
-      !
-! print '(a,i5,f10.5)', &amp;
-!  'k,   min(w(k,2:)),max(w(k,2:))'
-! do k=1,nVertLevels
-!   print '(i5,10es10.2)', &amp;
-!     k,minval(w(k,1:grid % ncellssolve)),maxval(w(k,1:grid % ncellssolve))
-! enddo
-      !
       ! Compute v (tangential) velocities
       !
       v(:,:) = 0.0
@@ -1269,8 +1238,6 @@
       enddo
 
 
-      !mrp 100426:
-      !
       ! For z-level model.
       ! Compute pressure at middle of each level.  
       ! pmidZLevel and pmid should only differ at k=1, where pmid is 
@@ -1290,8 +1257,62 @@
          end do
 
       end do
-      !mrp 100426 end
 
+      ! compute vertical velocity
+      if (config_vert_grid_type.eq.'isopycnal') then
+        ! set vertical velocity to zero in isopycnal case
+        wBot=0.0  
+
+      elseif (config_vert_grid_type.eq.'zlevel') then
+
+      !
+      ! Compute div(u) for each cell
+      ! See Ringler et al. (2010) jcp paper, eqn 19, 21, and fig. 3.
+      !
+      allocate(div_u(nVertLevels,nCells))
+      div_u(:,:) = 0.0
+      do iEdge=1,nEdges
+            cell1 = cellsOnEdge(1,iEdge)
+            cell2 = cellsOnEdge(2,iEdge)
+            if (cell1 &lt;= nCells) then
+               do k=1,nVertLevels
+! should be this
+                  flux = u(k,iEdge) * dvEdge(iEdge) 
+! testing with this
+!                  flux = u(k,iEdge) * dvEdge(iEdge) * h_edge(k,iEdge)
+                  div_u(k,cell1) = div_u(k,cell1) + flux
+               end do 
+            end if
+            if (cell2 &lt;= nCells) then
+               do k=1,nVertLevels
+! should be this
+                  flux = u(k,iEdge) * dvEdge(iEdge) 
+! testing with this
+!                  flux = u(k,iEdge) * dvEdge(iEdge) * h_edge(k,iEdge)
+                  div_u(k,cell2) = div_u(k,cell2) - flux
+               end do 
+            end if
+      end do 
+
+      do iCell=1,nCells
+         do k=1,nVertLevels
+            div_u(k,iCell) = div_u(k,iCell) / areaCell(iCell)
+         end do
+
+           ! change nvertlevels to kmt later
+           ! 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)
+           end do
+
+        end do
+
+      endif
+      deallocate(div_u)
+
+
    end subroutine compute_solve_diagnostics
 
 

</font>
</pre>