<p><b>mpetersen@lanl.gov</b> 2010-04-27 16:18:36 -0600 (Tue, 27 Apr 2010)</p><p>Added vertical viscous term, wind forcing just at surface, bottom drag.<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-04-27 18:41:17 UTC (rev 215)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-04-27 22:18:36 UTC (rev 216)
@@ -85,8 +85,8 @@
 var real    coeffs_reconstruct ( R3 maxEdges nCells ) - coeffs_reconstruct - -
 
 # Arrays for z-level version of mpas-ocean
-var integer kmaxCell ( nCells ) iro kmaxCell - -
-var integer kmaxEdge ( nEdges ) iro kmaxEdge - -
+var integer maxLevelsCell ( nCells ) iro kmaxCell - -
+var integer maxLevelsEdge ( nEdges ) iro kmaxEdge - -
 var real hZLevel ( nVertLevels ) iro hZLevel - -
 var real zmidZLevel ( nVertLevels ) iro zmidZLevel - -
 var real zbotZLevel ( nVertLevels ) iro zbotZLevel - -
@@ -120,6 +120,9 @@
 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    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 - -

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-04-27 18:41:17 UTC (rev 215)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_test_cases.F        2010-04-27 22:18:36 UTC (rev 216)
@@ -111,22 +111,37 @@
            u_src = 0.0
          elseif (config_test_case == 0 ) then
            ! for rectangular basin:
-           do iEdge=1,nEdges
-              u_src(1:nVertLevels, iEdge) = u_src(1, iEdge) / nVertLevels
-           end do
+           !do iEdge=1,nEdges
+           !   u_src(1:nVertLevels, iEdge) = u_src(1, iEdge) / nVertLevels
+           !end do
          endif
 
+         ! set rho directly:
+         !delta_rho=0.0
+         !do iLevel = 1,nVertLevels
+         !  rho(iLevel,1) = delta_rho*(iLevel-1)
+         !enddo
+         !rho(:,1) = rho(:,1) - sum(rho(:,1))/nVertLevels + 1000.0
+         !do iLevel = 1,nVertLevels
+         !  rho(iLevel,:) = rho(iLevel,1)
+         !enddo
+
          tracers = 0.0
          do iCell = 1,nCells
+           ! for three layer test
+           tracers(index_salinity,1,iCell) = 2.0  ! salinity
+           tracers(index_salinity,2,iCell) = 6.0  ! salinity
+           tracers(index_salinity,3,iCell) = 13.0  ! salinity
            do iLevel = 1,nVertLevels
-             !tracers(1,iLevel,iCell) = 2.0
-             !tracers(2,iLevel,iCell) = 1.0
-             !tracers(3,iLevel,iCell) = xCell(iCell)
              !if (xCell(iCell)&lt;500*1e3) tracers(4,iLevel,iCell) = 1.0
 !            tracers(index_temperature,iLevel,iCell) = 5.0  ! temperature
 !             tracers(index_temperature,iLevel,iCell) = 6.0-iLevel ! temperature
-             tracers(index_temperature,iLevel,iCell) = 6.0-iLevel+yCell(iCell)/4000.e3 ! temperature
-             tracers(index_salinity,iLevel,iCell) = 35.0  ! salinity
+!             tracers(index_temperature,iLevel,iCell) = 6.0-iLevel+yCell(iCell)/4000.e3 ! temperature
+!             tracers(index_salinity,iLevel,iCell) = 35.0  ! salinity
+
+             ! for three layer test
+             tracers(index_temperature,iLevel,iCell) = 5.0  ! temperature
+
 !             tracers(index_temperature,iLevel,iCell) = &amp;
 !               10.0* xCell(iCell)/2500.e3 
 !             tracers(index_salinity,iLevel,iCell) = &amp;
@@ -134,18 +149,12 @@
              tracers(index_tracer1,iLevel,iCell) = 1.0
              tracers(index_tracer2,iLevel,iCell) = &amp;
                (yCell(iCell)/4000.e3 + xCell(iCell)/2500.e3 )/2.0
+             rho(iLevel,iCell) = 1000.0*(  1.0 &amp;
+               - 2.5e-4*tracers(index_temperature,iLevel,iCell) &amp;
+               + 7.6e-4*tracers(index_salinity,iLevel,iCell))
            enddo
          enddo
 
-         delta_rho=0.0
-         do iLevel = 1,nVertLevels
-           rho(iLevel,1) = delta_rho*(iLevel-1)
-         enddo
-         rho(:,1) = rho(:,1) - sum(rho(:,1))/nVertLevels + 1000.0
-         do iLevel = 1,nVertLevels
-           rho(iLevel,:) = rho(iLevel,1)
-         enddo
-
 #ifdef EXPAND_LEVELS
          print '(10a)', 'EXPAND_LEVELS compiler flag is on.', &amp;
             ' Copying h and u from k=1 to other levels.'

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-04-27 18:41:17 UTC (rev 215)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-04-27 22:18:36 UTC (rev 216)
@@ -285,17 +285,18 @@
       real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, q, &amp;
         upstream_bias, wHat, areaSumInv, rho0Inv
       real (kind=RKIND), dimension(:), pointer :: &amp;
-        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle
+        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, zSurfaceEdge
       real (kind=RKIND), dimension(grid % nVertLevels) :: w_dudz
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
         vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, &amp;
         tend_h, tend_u, Fv, circulation, vorticity, ke, pv_edge, &amp;
-        divergence, MontPot, pmidZLevel
+        divergence, MontPot, pmidZLevel, zMidEdge, zbotEdge
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
       integer, dimension(:,:), pointer :: &amp;
         cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, &amp;
         edgesOnEdge, edgesOnVertex
-      real (kind=RKIND) :: u_diffusion, visc
+      real (kind=RKIND) :: u_diffusion, visc, dist
+      real (kind=RKIND), dimension(:), allocatable:: fluxVert
 
 !ocean
       real (kind=RKIND), dimension(:,:), pointer :: u_src
@@ -318,6 +319,9 @@
       !mrp 100112:
       MontPot     =&gt; s % MontPot % array
       pmidZLevel  =&gt; s % pmidZLevel % array
+      zmidEdge    =&gt; s % zmidEdge % array
+      zbotEdge    =&gt; s % zbotEdge % array
+      zSurfaceEdge=&gt; s % zSurfaceEdge % array
       !mrp 100112 end
 
       weightsOnEdge     =&gt; grid % weightsOnEdge % array
@@ -441,6 +445,7 @@
       !
       tend_u(:,:) = 0.0
       rho0Inv = 1.0/config_rho0
+      allocate(fluxVert(0:nVertLevels))
       do iEdge=1,grid % nEdgesSolve
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
@@ -504,12 +509,36 @@
                    + u_diffusion &amp;
                    - (   ke(k,cell2) - ke(k,cell1) ) / dcEdge(iEdge)
 
-!ocean
-           tend_u(k,iEdge) =  tend_u(k,iEdge) + u_src(k,iEdge)/rho_ref/h_edge(k,iEdge)
-!ocean
+         end do
 
-         end do
+         ! forcing in top layer only
+         tend_u(1,iEdge) =  tend_u(1,iEdge) + u_src(1,iEdge)/rho_ref/h_edge(1,iEdge)
+
+         ! bottom drag - change from nVertLevels to KMT later.
+         ! du/dt = u/tau where tau=100 days.
+         tend_u(nVertLevels,iEdge) = tend_u(nVertLevels,iEdge)  &amp;
+           - u(nVertLevels,iEdge)/(100.0*86400.0)
+
+         ! vertical mixing
+         fluxVert(0) = 0.0
+         fluxVert(nVertLevels) = 0.0
+         do k=nVertLevels-1,1,-1
+           fluxVert(k) = ( u(k,iEdge) - u(k+1,iEdge) ) &amp;
+              / (zMidEdge(k,iEdge) -zMidEdge(k+1,iEdge))
+         enddo
+         ! note vertical viscosity is hardwired as 2.5e-4 here.
+         fluxVert = 2.5e-4 * fluxVert
+         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
+         enddo
+
       end do
+      deallocate(fluxVert)
 #endif
 
 #ifdef NCAR_FORMULATION
@@ -682,12 +711,12 @@
       integer :: nCells, nEdges, nVertices, nVertLevels
       real (kind=RKIND), dimension(:), pointer :: &amp;
         h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, &amp;
-        zSurface, hZLevel
+        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;
         pv_edge, pv_vertex, pv_cell, gradPVn, gradPVt, divergence, &amp;
-        zmid, zbot, pmid, pbot, MontPot, rho, temperature, salinity, pmidZLevel
+        zmid, zbot, zmidEdge, zbotEdge, pmid, pbot, MontPot, rho, temperature, salinity, pmidZLevel
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers
       character :: c1*6
 
@@ -718,11 +747,14 @@
       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
       MontPot     =&gt; s % MontPot % array
       zSurface    =&gt; s % zSurface % array
+      zSurfaceEdge=&gt; s % zSurfaceEdge % array
       !mrp 100112 end
 
       weightsOnEdge     =&gt; grid % weightsOnEdge % array
@@ -1046,7 +1078,19 @@
       end do
       !mrp 100112 end
 
+      do iEdge=1,nEdges
+       cell1 = cellsOnEdge(1,iEdge)
+       cell2 = cellsOnEdge(2,iEdge)
+       if(cell1.gt.0.and.cell2.gt.0) 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
+        endif
+      enddo
 
+
       !mrp 100426:
       !
       ! For z-level model.

</font>
</pre>