<p><b>mpetersen@lanl.gov</b> 2010-05-21 11:38:43 -0600 (Fri, 21 May 2010)</p><p>Updated vertical advection to simply use vertical velocity w as the vertical thickness flux.  This version had a successful 50 day run on the x3 grid.<br>
</p><hr noshade><pre><font color="gray">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-21 17:20:37 UTC (rev 298)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_test_cases.F        2010-05-21 17:38:43 UTC (rev 299)
@@ -100,7 +100,10 @@
       block_ptr =&gt; domain % blocklist
       do while (associated(block_ptr))
          h          =&gt; block_ptr % time_levs(1) % state % h % array
+         u          =&gt; block_ptr % time_levs(1) % state % u % array
+         rho        =&gt; block_ptr % time_levs(1) % state % rho % array
          tracers    =&gt; block_ptr % time_levs(1) % state % tracers % array
+         u_src      =&gt; block_ptr % mesh % u_src % array
          xCell      =&gt; block_ptr % mesh % xCell % array
          yCell      =&gt; block_ptr % mesh % yCell % array
 
@@ -132,18 +135,29 @@
                call dmpar_abort(dminfo)
            endif
 
+           ! Set tracers, if not done in grid.nc file
            !tracers = 0.0
-           !do iCell = 1,nCells
-           !  do iLevel = 1,nVertLevels
-           !   ! for 20 layer test
-           !    tracers(index_temperature,iLevel,iCell) = 5.0  ! temperature
-           !    tracers(index_salinity,iLevel,iCell) = 1.4 + iLevel*0.6  ! salinity
-           !    tracers(index_tracer1,iLevel,iCell) = 1.0
-           !    tracers(index_tracer2,iLevel,iCell) = &amp;
-           !      (yCell(iCell)/4000.e3 + xCell(iCell)/2500.e3 )/2.0
-           !  enddo
-           !enddo
+           do iCell = 1,nCells
+             do iLevel = 1,nVertLevels
+              ! for 20 layer test
+              ! tracers(index_temperature,iLevel,iCell) = 5.0  ! temperature
+              ! tracers(index_salinity,iLevel,iCell) = 1.4 + iLevel*0.6  ! salinity
 
+              ! for x3, 25 layer test
+              !tracers(index_temperature,iLevel,iCell) = 10.0  ! temperature
+              !tracers(index_salinity,iLevel,iCell) = 1.4 + iLevel*0.6  ! salinity
+
+              ! 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
+
         endif
 
          ! 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-21 17:20:37 UTC (rev 298)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-21 17:38:43 UTC (rev 299)
@@ -264,7 +264,7 @@
         zMidZLevel 
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
         weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, wTop, &amp;
-        tend_h, tend_u, hFluxTop, circulation, vorticity, ke, pv_edge, &amp;
+        tend_h, tend_u, circulation, vorticity, ke, pv_edge, &amp;
         divergence, MontPot, pZLevel, zMidEdge, zTopEdge
 
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
@@ -315,7 +315,6 @@
 
       tend_h      =&gt; tend % h % array
       tend_u      =&gt; tend % u % array
-      hFluxTop    =&gt; tend % wTop % array
                   
       nCells      = grid % nCells
       nEdges      = grid % nEdges
@@ -355,30 +354,21 @@
       !
       ! height tendency: vertical advection term -d/dz(hw)
       !
-      if (config_vert_grid_type.eq.'isopycnal') then
-        hFluxTop=0.0  ! vertical fluxes are zero
+      if (config_vert_grid_type.eq.'zlevel') then
 
-      elseif (config_vert_grid_type.eq.'zlevel') then
-
         do iCell=1,nCells
-           hFluxTop(1,iCell) = 0.0
-           hFluxTop(nVertLevels+1,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
+           tend_h(1,iCell) =   tend_h(1,iCell) + wTop(2,iCell)
 
-           ! 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
+           ! This next loop is to verify that h for levels below the first
+           ! remain constant.  At a later time this could be replaced
+           ! by just tend_h(2:nVertLevels,:) = 0.0, and then there is 
+           ! no need to compute the horizontal tend_h term for k=2:nVertLevels
+           ! on a zlevel grid, above.
+           do k=2,nVertLevels
               tend_h(k,iCell) =   tend_h(k,iCell) &amp;
-                - (hFluxTop(k,iCell) - hFluxTop(k+1,iCell))/h(k,iCell)
-           end do
+               - (wTop(k,iCell) - wTop(k+1,iCell))
+            end do
 
         end do
       endif ! coordinate type
@@ -504,13 +494,9 @@
       end do
       deallocate(fluxVertTop)
 
-!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(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(hFluxTop(k,1:grid % ncellssolve)),maxval(hFluxTop(k,1:grid % ncellssolve))
+!     k,minval(tend_h(k,1:grid % ncellssolve)),maxval(tend_h(k,1:grid % ncellssolve))
 ! enddo
 
 ! print '(a,i5,f10.5)', &amp;
@@ -545,20 +531,19 @@
       real (kind=RKIND), dimension(:), pointer :: &amp;
         h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
-        u,h,hFluxTop, h_edge, zMid, zTop
+        u,h,wTop, 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:: 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
+      wTop        =&gt; s % wTop % array
       tracers     =&gt; s % tracers % array
       h_edge      =&gt; s % h_edge % array
-      hFluxTop          =&gt; tend % wTop % array
       zMid        =&gt; s % zMid % array
       zTop        =&gt; s % zTop % array
 
@@ -644,7 +629,7 @@
          
          elseif (config_vert_tracer_adv.eq.'upwind') then
            do k=2,nVertLevels
-             if (hFluxTop(k,iCell)&gt;0.0) then
+             if (wTop(k,iCell)&gt;0.0) then
                upwindCell = k
              else
                upwindCell = k-1
@@ -659,8 +644,8 @@
          do k=1,nVertLevels  
             do iTracer=1,num_tracers
                tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
-                  - (   hFluxTop(k  ,iCell)*tracerTop(iTracer,k  ) &amp;
-                      - hFluxTop(k+1,iCell)*tracerTop(iTracer,k+1))/h(k,icell)
+                  - (   wTop(k  ,iCell)*tracerTop(iTracer,k  ) &amp;
+                      - wTop(k+1,iCell)*tracerTop(iTracer,k+1))
             end do
          end do
 

</font>
</pre>