<p><b>dwj07@fsu.edu</b> 2012-03-08 20:20:50 -0700 (Thu, 08 Mar 2012)</p><p><br>
     -- BRANCH COMMIT --<br>
<br>
    Setting up weights for vertical advection to support other vertical grids.<br>
    Cleaning up interfaces of new shared advection routines.<br>
</p><hr noshade><pre><font color="gray">
Property changes on: branches/ocean_projects/monotonic_advection
___________________________________________________________________
Added: svn:mergeinfo
   + /trunk/mpas:1508

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/Registry        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/Registry        2012-03-09 03:20:50 UTC (rev 1610)
@@ -178,6 +178,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 - -
 var persistent real hMeanTopZLevel ( nVertLevels ) 0 - hMeanTopZLevel mesh - -
 var persistent real hRatioZLevelK ( nVertLevels ) 0 - hRatioZLevelK mesh - -

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_mpas_core.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_mpas_core.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -514,7 +514,8 @@
 
       integer :: iTracer, cell, cell1, cell2
       real (kind=RKIND) :: uhSum, hSum, hEdge1
-      real (kind=RKIND), dimension(:), pointer :: referenceBottomDepth, hMeanTopZLevel, hRatioZLevelK, hRatioZLevelKm1
+      real (kind=RKIND), dimension(:), pointer :: referenceBottomDepth, referenceBottomDepthTopOfCell, hMeanTopZLevel, hRatioZLevelK, hRatioZLevelKm1
+         
       real (kind=RKIND), dimension(:,:), pointer :: h
       integer :: nVertLevels
 
@@ -524,6 +525,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
          hMeanTopZLevel    =&gt; block % mesh % hMeanTopZLevel % array
          hRatioZLevelK    =&gt; block % mesh % hRatioZLevelK % array
@@ -545,6 +547,11 @@
             hRatioZLevelKm1(k) = 0.5*block % mesh % hZLevel % array(k-1)/hMeanTopZLevel(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.

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tendency.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tendency.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -353,13 +353,9 @@
       ! and then change maxLevelEdgeTop to maxLevelEdgeBot in the following section.
       ! tracer_edge at the boundary will also need to be defined for flux boundaries.
 
-      call mpas_timer_start(&quot;adv&quot;, .false., tracerHadvTimer)
       ! Monotonoic Advection, or standard advection
-      call mpas_tracer_advection_tend(tracers, uh, wTop, h, dt, hMeanTopZLevel, hRatioZLevelKm1, hRatioZLevelK, grid, tend_h, tend_tr)
-
-      ! Only standadrd advection
-!     call ocn_tracer_hadv_tend(grid, u, h_edge, tracers, tend_tr, err)
-!     call ocn_tracer_vadv_tend(grid, h, wtop, tracers, tend_tr, err)
+      call mpas_timer_start(&quot;adv&quot;, .false., tracerHadvTimer)
+      call mpas_tracer_advection_tend(tracers, uh, wTop, h, h, dt, grid, tend_h, tend_tr)
       call mpas_timer_stop(&quot;adv&quot;, tracerHadvTimer)
 
       !

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_time_integration_split.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_time_integration_split.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_time_integration_split.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -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 (max(block % mesh % maxLevelEdgeTop % array(iEdge),1))
+                   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;

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -176,26 +176,21 @@
 
    end subroutine mpas_tracer_advection_coefficients!}}}
 
-!  subroutine mpas_tracer_advection_tend(tracers, uh, w, zDistance, zWeightK, zWeightKm1, grid, dt, dminfo, cellsToSend, cellsToRecv, tend)
-   subroutine mpas_tracer_advection_tend(tracers, uh, w, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, tend)!{{{
+   subroutine mpas_tracer_advection_tend(tracers, uh, w, h, verticalCellSize, dt, grid, tend_h, tend)!{{{
 
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
       real (kind=RKIND), dimension(:,:), intent(in) :: uh, w, h
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
+      real (kind=RKIND), dimension(:,:), intent(in) :: verticalCellSize !&lt; Input: Distance between vertical interfaces of a cell
       real (kind=RKIND), intent(in) :: dt
       type (mesh_type), intent(in) :: grid
       real (kind=RKIND), dimension(:,:), intent(in) :: tend_h
-!     real (kind=RKIND) :: dt
 
-!     type (dm_info), intent(in) :: dminfo
-!     type (exchange_list), pointer :: cellsToSend, cellsToRecv
 
       if(monotonicOn) then
-!        call mpas_tracer_advection_mono_tend( tend, s_old, s_new, diag, grid, dt, dminfo, cellsToSend, cellsToRecv)
-         call mpas_tracer_advection_mono_tend(tracers, uh, w, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, tend)
+         call mpas_tracer_advection_mono_tend(tracers, uh, w, h, verticalCellSize, dt, grid, tend_h, tend)
       else
-         call mpas_tracer_advection_std_tend(tracers, uh, w, zDistance, zWeightK, zWeightKm1, grid, tend)
+         call mpas_tracer_advection_std_tend(tracers, uh, w, verticalCellSize, grid, tend)
       endif
    end subroutine mpas_tracer_advection_tend!}}}
 

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_mono.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_mono.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_mono.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -15,7 +15,7 @@
 
    contains
 
-   subroutine mpas_tracer_advection_mono_tend(tracers, uh, w, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, tend)!{{{
+   subroutine mpas_tracer_advection_mono_tend(tracers, uh, w, h, verticalCellSize, dt, grid, tend_h, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -27,11 +27,9 @@
       real (kind=RKIND), dimension(:,:), intent(in) :: uh !&lt; Input: Thichness weighted velocitiy
       real (kind=RKIND), dimension(:,:), intent(in) :: w !&lt; Input: Vertical velocitiy
       real (kind=RKIND), dimension(:,:), intent(in) :: h !&lt; Input: Thickness
+      real (kind=RKIND), dimension(:,:), intent(in) :: verticalCellSize !&lt; Input: Distance between vertical interfaces of a cell
       real (kind=RKIND), dimension(:,:), intent(in) :: tend_h !&lt; Input: Tendency for thickness field
       real (kind=RKIND), intent(in) :: dt !&lt; Input: Timestep
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance !&lt; Input: Distance between vertical interfaces
-      real (kind=RKIND), dimension(:), intent(in) :: zWeightK !&lt; Input: Weight for tracers to map to edge, weight from K cell
-      real (kind=RKIND), dimension(:), intent(in) :: zWeightKm1 !&lt; Input: Weight for tracers to map to edge, weight from K-1 cell
       type (mesh_type), intent(in) :: grid
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
 
@@ -43,6 +41,7 @@
       real (kind=RKIND) :: coef_3rd_order, flux_upwind, tracer_min_new, tracer_max_new, tracer_upwind_new, scale_factor
       real (kind=RKIND) :: flux, tracer_weight, invDvEdge, invAreaCell1, invAreaCell2
       real (kind=RKIND) :: cur_max, cur_min, new_max, new_min
+      real (kind=RKIND) :: verticalWeightK, verticalWeightKm1
       real (kind=RKIND), dimension(:), pointer :: dvEdge, areaCell
       real (kind=RKIND), dimension(:,:), pointer :: adv_coefs, adv_coefs_3rd
       real (kind=RKIND), dimension(:,:), pointer :: tracer_cur, tracer_new, upwind_tendency, inv_h_new, tracer_max, tracer_min
@@ -95,7 +94,6 @@
         end do
       end do
 
-
       ! Loop over tracers. One tracer is advected at a time. It is copied into a temporary array in order to improve locality
       do iTracer = 1, num_tracers
         ! Initialize variables for use in this iTracer iteration
@@ -104,7 +102,7 @@
             tracer_cur(k,iCell) = tracers(iTracer,k,iCell)
             upwind_tendency(k, iCell) = 0.0
 
-            !dwj 02/21/12 tracer_new is supposed to be the &quot;new&quot; tracer state. This allows bounds checks.
+            !tracer_new is supposed to be the &quot;new&quot; tracer state. This allows bounds checks.
             if (config_check_monotonicity) then
               tracer_new(k,iCell) = 0.0
             end if
@@ -117,12 +115,13 @@
         !  Compute the high order vertical flux. Also determine bounds on tracer_cur. 
         do iCell = 1, nCells
           k = 1
-!         high_order_vert_flux(k,iCell) = 0.
           tracer_max(k,iCell) = max(tracer_cur(k,iCell),tracer_cur(k+1,iCell))
           tracer_min(k,iCell) = min(tracer_cur(k,iCell),tracer_cur(k+1,iCell))
 
           k = 2
-          high_order_vert_flux(k,iCell) = w(k,iCell)*(zWeightK(k)*tracer_cur(k,iCell)+zWeightKm1(k)*tracer_cur(k-1,iCell))
+          verticalWeightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k, iCell) + verticalCellSize(k-1, iCell))
+          verticalWeightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k, iCell) + verticalCellSize(k-1, iCell))
+          high_order_vert_flux(k,iCell) = w(k,iCell)*(verticalWeightK*tracer_cur(k,iCell)+verticalWeightKm1*tracer_cur(k-1,iCell))
           tracer_max(k,iCell) = max(tracer_cur(k-1,iCell),tracer_cur(k,iCell),tracer_cur(k+1,iCell))
           tracer_min(k,iCell) = min(tracer_cur(k-1,iCell),tracer_cur(k,iCell),tracer_cur(k+1,iCell))
              
@@ -135,12 +134,12 @@
           end do 
  
           k = maxLevelCell(iCell)
-          high_order_vert_flux(k,iCell) = w(k,iCell)*(zWeightK(k)*tracer_cur(k,iCell)+zWeightKm1(k)*tracer_cur(k-1,iCell))
+          verticalWeightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k, iCell) + verticalCellSize(k-1, iCell))
+          verticalWeightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k, iCell) + verticalCellSize(k-1, iCell))
+          high_order_vert_flux(k,iCell) = w(k,iCell)*(verticalWeightK*tracer_cur(k,iCell)+verticalWeightKm1*tracer_cur(k-1,iCell))
           tracer_max(k,iCell) = max(tracer_cur(k,iCell),tracer_cur(k-1,iCell))
           tracer_min(k,iCell) = min(tracer_cur(k,iCell),tracer_cur(k-1,iCell))
 
-!         high_order_vert_flux(maxLevelCell(iCell)+1,iCell) = 0.
-
           ! pull tracer_min and tracer_max from the (horizontal) surrounding cells
           do i = 1, nEdgesOnCell(iCell)
             do k=1, maxLevelCell(cellsOnCell(i, iCell))
@@ -167,7 +166,7 @@
         !  Upwind fluxes are accumulated in upwind_tendency
         do iCell = 1, nCells
           do k = 2, maxLevelCell(iCell)
-            !dwj: wrong for ocean?
+            ! dwj 02/03/12 Ocean and Atmosphere are different in vertical
 !           flux_upwind = max(0.,w(k,iCell))*tracer_cur(k-1,iCell) + min(0.,w(k,iCell))*tracer_cur(k,iCell)
             flux_upwind = min(0.,w(k,iCell))*tracer_cur(k-1,iCell) + max(0.,w(k,iCell))*tracer_cur(k,iCell)
             upwind_tendency(k-1,iCell) = upwind_tendency(k-1,iCell) + flux_upwind
@@ -268,9 +267,11 @@
             tend(iTracer, k, cell1) = tend(iTracer, k, cell1) - high_order_horiz_flux(k, iEdge) * invAreaCell1
             tend(iTracer, k, cell2) = tend(iTracer, k, cell2) + high_order_horiz_flux(k, iEdge) * invAreaCell2
 
-            !dwj 02/21/12 tracer_new holds a tendency for now.
-            tracer_new(k, cell1) = tracer_new(k, cell1) - high_order_horiz_flux(k, iEdge) * invAreaCell1
-            tracer_new(k, cell2) = tracer_new(k, cell2) + high_order_horiz_flux(k, iEdge) * invAreaCell2
+            if (config_check_monotonicity) then
+              !tracer_new holds a tendency for now.
+              tracer_new(k, cell1) = tracer_new(k, cell1) - high_order_horiz_flux(k, iEdge) * invAreaCell1
+              tracer_new(k, cell2) = tracer_new(k, cell2) + high_order_horiz_flux(k, iEdge) * invAreaCell2
+            end if
           end do ! k loop
         end do ! iEdge loop
 
@@ -280,23 +281,23 @@
             tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + (high_order_vert_flux(k+1, iCell) - high_order_vert_flux(k, iCell)) + upwind_tendency(k,iCell)
 
             if (config_check_monotonicity) then
-              !dwj 02/21/12 tracer_new holds a tendency for now.
+              !tracer_new holds a tendency for now. Only for a check on monotonicity
               tracer_new(k, iCell) = tracer_new(k, iCell) + (high_order_vert_flux(k+1, iCell) - high_order_vert_flux(k, iCell)) + upwind_tendency(k,iCell)
 
-              !dwj 02/21/12 now, updated tracer_new to be the new state of the tracer.
+              !tracer_new is now the new state of the tracer. Only for a check on monotonicity
               tracer_new(k, iCell) = (tracer_cur(k, iCell)*h(k, iCell) + dt * tracer_new(k, iCell)) * inv_h_new(k, iCell)
             end if
           end do ! k loop
         end do ! iCell loop
 
         if (config_check_monotonicity) then
-          !dwj 02/21/12 build min and max of cur and new tracer states to check bounds
+          !build min and max bounds on old and new tracer for check on monotonicity.
           cur_min = minval(tracer_cur(:,1:nCellsSolve))
           cur_max = maxval(tracer_cur(:,1:nCellsSolve))
           new_min = minval(tracer_new(:,1:nCellsSolve))
           new_max = maxval(tracer_new(:,1:nCellsSolve))
 
-          !dwj 02/21/12 do bounds check
+          !check monotonicity
           if(new_min &lt; cur_min-eps) then
               write(*,*) 'Minimum out of bounds on tracer ', iTracer, cur_min, new_min
           end if

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -18,7 +18,7 @@
 
    contains
 
-   subroutine mpas_tracer_advection_std_tend(tracers, uh, w, zDistance, zWeightK, zWeightKm1, grid, tend)!{{{
+   subroutine mpas_tracer_advection_std_tend(tracers, uh, w, verticalCellSize, grid, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -30,14 +30,14 @@
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
       real (kind=RKIND), dimension(:,:), intent(in) :: uh, w
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
+      real (kind=RKIND), dimension(:,:), intent(in) :: verticalCellSize !&lt; Input: Distance between vertical interfaces of a cell
       type (mesh_type), intent(in) :: grid
 
       call mpas_timer_start(&quot;tracer-hadv&quot;, .false.)
       call mpas_tracer_advection_std_hadv_tend(tracers, uh, grid, tend)
       call mpas_timer_stop(&quot;tracer-hadv&quot;)
       call mpas_timer_start(&quot;tracer-vadv&quot;, .false.)
-      call mpas_tracer_advection_std_vadv_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend)
+      call mpas_tracer_advection_std_vadv_tend(tracers, w, verticalCellSize, grid, tend)
       call mpas_timer_stop(&quot;tracer-vadv&quot;)
 
    end subroutine mpas_tracer_advection_std_tend!}}}

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -20,21 +20,20 @@
 
    contains
 
-   subroutine mpas_tracer_advection_std_vadv_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend)!{{{
+   subroutine mpas_tracer_advection_std_vadv_tend(tracers, w, verticalCellSize, grid, tend)!{{{
 
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
-      real (kind=RKIND), dimension(:,:), intent(in) :: w
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
+      real (kind=RKIND), dimension(:,:), intent(in) :: w, verticalCellSize
       type (mesh_type), intent(in) :: grid
       real (kind=RKIND) :: dt
 
       if(order2) then
-        call mpas_tracer_advection_std_vadv2_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend) 
+        call mpas_tracer_advection_std_vadv2_tend(tracers, w, verticalCellSize, grid, tend) 
       else if(order3) then
-        call mpas_tracer_advection_std_vadv3_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend) 
+        call mpas_tracer_advection_std_vadv3_tend(tracers, w, verticalCellSize, grid, tend) 
       else if(order4) then
-        call mpas_tracer_advection_std_vadv4_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend) 
+        call mpas_tracer_advection_std_vadv4_tend(tracers, w, verticalCellSize, grid, tend) 
       endif
 
    end subroutine mpas_tracer_advection_std_vadv_tend!}}}

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv2.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv2.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv2.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -15,7 +15,7 @@
 
    contains
 
-   subroutine mpas_tracer_advection_std_vadv2_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend)!{{{
+   subroutine mpas_tracer_advection_std_vadv2_tend(tracers, w, verticalCellSize, grid, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -26,8 +26,7 @@
 
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
-      real (kind=RKIND), dimension(:,:), intent(in) :: w
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
+      real (kind=RKIND), dimension(:,:), intent(in) :: w, verticalCellSize
       type (mesh_type), intent(in) :: grid
 
       integer :: i, iCell, iEdge, k, iTracer, cell1, cell2
@@ -35,8 +34,8 @@
       real (kind=RKIND) :: tracer_weight_cell1, tracer_weight_cell2
 
 
-!     real (kind=RKIND), dimension( s_old % num_tracers, grid % nVertLevels + 1 ) :: vert_flux
       real (kind=RKIND), dimension(:,:), allocatable :: vert_flux
+      real (kind=RKIND) :: weightK, weightKm1
       integer :: nVertLevels, num_tracers
       integer, dimension(:), pointer :: maxLevelCell
 
@@ -59,7 +58,9 @@
       do iCell=1,grid % nCellsSolve
         do k = 2, maxLevelCell(iCell)
            do iTracer=1,num_tracers
-             vert_flux(iTracer,k) = w(k,iCell)*(zWeightK(k)*tracers(iTracer,k,iCell)+zWeightKm1(k)*tracers(iTracer,k-1,iCell))
+             weightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+             weightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+             vert_flux(iTracer,k) = w(k,iCell)*(weightK*tracers(iTracer,k,iCell)+weightKm1*tracers(iTracer,k-1,iCell))
            end do
         end do
 
@@ -68,8 +69,6 @@
         do k=1,maxLevelCell(iCell)
            do iTracer=1,num_tracers
              tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + ( vert_flux(iTracer, k+1) - vert_flux(iTracer, k))
-!            tracers(iTracer,k,iCell) = (   tracers(iTracer,k,iCell)*h_old(k,iCell) &amp;
-!                  + dt*( tracer_tend(iTracer,k,iCell) -rdnw(k)*(vert_flux(iTracer,k+1)-vert_flux(iTracer,k)) ) )/h_new(k,iCell)
            end do
         end do
       end do

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv3.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv3.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv3.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -17,7 +17,7 @@
 
    contains
 
-   subroutine mpas_tracer_advection_std_vadv3_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend)!{{{
+   subroutine mpas_tracer_advection_std_vadv3_tend(tracers, w, verticalCellSize, grid, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -28,15 +28,14 @@
 
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
-      real (kind=RKIND), dimension(:,:), intent(in) :: w
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
+      real (kind=RKIND), dimension(:,:), intent(in) :: w, verticalCellSize
       type (mesh_type), intent(in) :: grid
       real (kind=RKIND) :: dt
 
       integer :: i, iCell, iEdge, k, iTracer, cell1, cell2
 
-!     real (kind=RKIND), dimension( s_old % num_tracers, grid % nVertLevels + 1 ) :: vert_flux
       real (kind=RKIND), dimension(:,:), allocatable :: vert_flux
+      real (kind=RKIND) :: weightK, weightKm1
       integer :: nVertLevels, num_tracers
       integer, dimension(:), pointer :: maxLevelCell
 
@@ -51,13 +50,14 @@
       allocate(vert_flux(num_tracers, nVertLevels+1))
 
       vert_flux(:,1) = 0.
-!     vert_flux(:,grid % nVertLevels+1) = 0.
 
       do iCell=1,grid % nCellsSolve
 
         k = 2
         do iTracer=1,num_tracers
-          vert_flux(iTracer,k) = w(k,iCell)*(zWeightK(k)*tracers(iTracer,k,iCell)+zWeightKm1(k)*tracers(iTracer,k-1,iCell))
+          weightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          weightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          vert_flux(iTracer,k) = w(k,iCell)*(weightK*tracers(iTracer,k,iCell)+weightKm1*tracers(iTracer,k-1,iCell))
         enddo
         
         do k=3,maxLevelCell(iCell)-1
@@ -71,7 +71,9 @@
         k = maxLevelCell(iCell)
 
         do iTracer=1,num_tracers
-          vert_flux(iTracer,k) = w(k,iCell)*(zWeightK(k)*tracers(iTracer,k,iCell)+zWeightKm1(k)*tracers(iTracer,k-1,iCell))
+          weightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          weightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          vert_flux(iTracer,k) = w(k,iCell)*(weightK*tracers(iTracer,k,iCell)+weightKm1*tracers(iTracer,k-1,iCell))
         enddo
 
         vert_Flux(:, maxLevelCell(iCell)+1) = 0.0
@@ -79,9 +81,6 @@
         do k=1,maxLevelCell(iCell)
            do iTracer=1,num_tracers
              tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + (vert_flux(iTracer, k+1) - vert_flux(iTracer, k))
-
-!            tracers(iTracer,k,iCell) = (   tracers(iTracer,k,iCell)*h_old(k,iCell) &amp;
-!                  + dt*( tracer_tend(iTracer,k,iCell) -rdnw(k)*(vert_flux(iTracer,k+1)-vert_flux(iTracer,k)) ) )/h_new(k,iCell)
            end do
         end do
       end do

Modified: branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv4.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv4.F        2012-03-08 23:21:56 UTC (rev 1609)
+++ branches/ocean_projects/monotonic_advection/src/operators/mpas_tracer_advection_std_vadv4.F        2012-03-09 03:20:50 UTC (rev 1610)
@@ -15,7 +15,7 @@
 
    contains
 
-   subroutine mpas_tracer_advection_std_vadv4_tend(tracers, w, zDistance, zWeightK, zWeightKm1, grid, tend)!{{{
+   subroutine mpas_tracer_advection_std_vadv4_tend(tracers, w, verticalCellSize, grid, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -26,15 +26,14 @@
 
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
-      real (kind=RKIND), dimension(:,:), intent(in) :: w
-      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
+      real (kind=RKIND), dimension(:,:), intent(in) :: w, verticalCellSize
       type (mesh_type), intent(in) :: grid
       real (kind=RKIND) :: dt
 
       integer :: i, iCell, iEdge, k, iTracer, cell1, cell2
 
-!     real (kind=RKIND), dimension( s_old % num_tracers, grid % nVertLevels + 1 ) :: vert_flux
       real (kind=RKIND), dimension(:,:), allocatable :: vert_flux
+      real (kind=RKIND) :: weightK, weightKm1
       integer :: nVertLevels, num_tracers
       integer, dimension(:), pointer :: maxLevelCell
 
@@ -55,7 +54,9 @@
 
         k = 2
         do iTracer=1,num_tracers
-          vert_flux(iTracer,k) = w(k,iCell)*(zWeightK(k)*tracers(iTracer,k,iCell)+zWeightKm1(k)*tracers(iTracer,k-1,iCell))
+          weightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          weightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          vert_flux(iTracer,k) = w(k,iCell)*(weightK*tracers(iTracer,k,iCell)+weightKm1*tracers(iTracer,k-1,iCell))
         enddo
         do k=3,nVertLevels-1
           do iTracer=1,num_tracers
@@ -66,7 +67,9 @@
 
         k = maxLevelCell(iCell)
         do iTracer=1,num_tracers
-          vert_flux(iTracer,k) = w(k,iCell)*(zWeightK(k)*tracers(iTracer,k,iCell)+zWeightKm1(k)*tracers(iTracer,k-1,iCell))
+          weightK = verticalCellSize(k-1, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          weightKm1 = verticalCellSize(k, iCell) / (verticalCellSize(k-1, iCell) + verticalCellSize(k, iCell))
+          vert_flux(iTracer,k) = w(k,iCell)*(weightK*tracers(iTracer,k,iCell)+weightKm1*tracers(iTracer,k-1,iCell))
         enddo
 
         vert_flux(:,maxLevelCell(iCell)+1) = 0.0
@@ -74,8 +77,6 @@
         do k=1,maxLevelCell(iCell)
            do iTracer=1,num_tracers
              tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + (vert_flux(iTracer, k+1) - vert_flux(iTracer, k))
-!            tracers(iTracer,k,iCell) = (   tracers(iTracer,k,iCell)*h_old(k,iCell) &amp;
-!                  + dt*( tracer_tend(iTracer,k,iCell) -rdnw(k)*(vert_flux(iTracer,k+1)-vert_flux(iTracer,k)) ) )/h_new(k,iCell)
            end do
         end do
 

</font>
</pre>