<p><b>dwj07@fsu.edu</b> 2012-01-23 11:21:38 -0700 (Mon, 23 Jan 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        &quot;Working&quot; version of monotonic transport.<br>
<br>
        Needs to be verified, but it compiles and runs.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/advection_routines/src/operators/Makefile
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/Makefile        2012-01-23 18:10:00 UTC (rev 1409)
+++ branches/ocean_projects/advection_routines/src/operators/Makefile        2012-01-23 18:21:38 UTC (rev 1410)
@@ -4,6 +4,7 @@
            mpas_vector_reconstruction.o \
            mpas_spline_interpolation.o \
            mpas_tracer_advection.o \
+           mpas_tracer_advection_mono.o \
            mpas_tracer_advection_std.o \
            mpas_tracer_advection_std_hadv.o \
            mpas_tracer_advection_std_vadv.o \
@@ -23,8 +24,10 @@
 
 mpas_spline_interpolation:
 
-mpas_tracer_advection.o: mpas_tracer_advection_std.o
+mpas_tracer_advection.o: mpas_tracer_advection_std.o mpas_tracer_advection_mono.o
 
+mpas_tracer_advection_mono.o: mpas_tracer_advection_helpers.o
+
 mpas_tracer_advection_std.o: mpas_tracer_advection_std_hadv.o mpas_tracer_advection_std_vadv.o 
 
 mpas_tracer_advection_std_hadv.o: mpas_tracer_advection_helpers.o

Modified: branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection.F
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection.F        2012-01-23 18:10:00 UTC (rev 1409)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection.F        2012-01-23 18:21:38 UTC (rev 1410)
@@ -5,7 +5,7 @@
    use mpas_configure
 
    use mpas_tracer_advection_std
-!  use mpas_tracer_advection_mono
+   use mpas_tracer_advection_mono
      
    implicit none
    private
@@ -185,8 +185,9 @@
 
 !     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, zDistance, zWeightUp, zWeightDown, grid, tend)
 !     else
-         call mpas_tracer_advection_std_tend(tracers, uh, w, zDistance, zWeightUp, zWeightDown, grid, tend)
+!        call mpas_tracer_advection_std_tend(tracers, uh, w, zDistance, zWeightUp, zWeightDown, grid, tend)
 !     endif
    end subroutine mpas_tracer_advection_tend!}}}
 

Modified: branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_mono.F
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_mono.F        2012-01-23 18:10:00 UTC (rev 1409)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_mono.F        2012-01-23 18:21:38 UTC (rev 1410)
@@ -4,13 +4,18 @@
    use mpas_configure
    use mpas_dmpar
 
+   use mpas_tracer_advection_helpers
+
    implicit none
    private
    save 
 
+   public :: mpas_tracer_advection_mono_tend
+
    contains
 
-   subroutine mpas_tracer_advection_mono_tend( tend, s_old, s_new, diag, grid, dt, dminfo, cellsToSend, cellsToRecv)!{{{
+!  subroutine mpas_tracer_advection_mono_tend( tend, s_old, s_new, diag, grid, dt, dminfo, cellsToSend, cellsToRecv)
+   subroutine mpas_tracer_advection_mono_tend(tracers, uh, w, zDistance, zWeightUp, zWeightDown, grid, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -18,178 +23,136 @@
    !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 
-      type (tend_type), intent(in) :: tend
-      type (state_type), intent(in) :: s_old
-      type (state_type), intent(inout) :: s_new
-      type (diag_type), intent(in) :: diag
+      real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
+      real (kind=RKIND), dimension(:,:), intent(in) :: uh, w
+      real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightUp, zWeightDown
       type (mesh_type), intent(in) :: grid
-      real (kind=RKIND) :: dt
+      real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
 
-      type (dm_info), intent(in) :: dminfo
-      type (exchange_list), pointer :: cellsToSend, cellsToRecv
+      integer :: i, iCell, iEdge, k, iTracer, cell1, cell2
+      real (kind=RKIND) :: flux, tracer_weight
 
-
-      integer :: i, iCell, iEdge, k, iScalar, cell1, cell2
-      real (kind=RKIND) :: flux, scalar_edge, d2fdx2_cell1, d2fdx2_cell2, scalar_weight
-      real (kind=RKIND) :: scalar_weight_cell1, scalar_weight_cell2
-
-      real (kind=RKIND), dimension(:,:,:), pointer :: scalar_old_in, scalar_new_in, scalar_tend
-      real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
-      real (kind=RKIND), dimension(:,:), pointer :: uhAvg, h_old, h_new, wwAvg, rho_edge, rho_zz, zgrid, kdiff
-      real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell, qv_init
+      real (kind=RKIND), dimension(:,:,:), pointer :: tracer_cur_in, tracer_next_in
+!     real (kind=RKIND), dimension(:,:), pointer :: h_old, h_new
+      real (kind=RKIND), dimension(:), pointer :: dvEdge, areaCell
       integer, dimension(:,:), pointer :: cellsOnEdge
 
       integer, dimension(:,:), pointer :: advCellsForEdge
       integer, dimension(:), pointer :: nAdvCellsForEdge
       real (kind=RKIND), dimension(:,:), pointer :: adv_coefs, adv_coefs_3rd
 
-      real (kind=RKIND), dimension( grid % nVertLevels, grid % nCells ) :: scalar_old, scalar_new
+      real (kind=RKiND), dimension( grid % nVertLevels, grid % nCells ) :: tracer_cur, tracer_next, tendency_temp
       real (kind=RKIND), dimension( grid % nVertLevels, grid % nCells ) :: s_max, s_min, s_update
       real (kind=RKIND), dimension( grid % nVertLevels, grid % nCells ) :: scale_in, scale_out
 
-      real (kind=RKIND), dimension( grid % nVertLevels, grid % nEdges ) :: flux_arr
-      real (kind=RKIND), dimension( grid % nVertLevels + 1, grid % nCells ) :: wdtn
+      real (kind=RKIND), dimension( grid % nVertLevels, grid % nEdges ) :: horiz_flux
+      real (kind=RKIND), dimension( grid % nVertLevels + 1, grid % nCells ) :: vert_flux
 
-      integer :: nVertLevels, isc, num_scalars, icellmax, kmax
+      integer :: nVertLevels, num_tracers, icellmax, kmax
 
-      real (kind=RKIND), dimension(:), pointer :: fnm, fnp, rdnw, meshScalingDel2, meshScalingDel4
+!     real (kind=RKIND), dimension(:), pointer :: rdnw
       real (kind=RKIND) :: coef_3rd_order
 
-      real (kind=RKIND) :: h_theta_eddy_visc2, v_theta_eddy_visc2, scalar_turb_flux, z1,z2,z3,z4,zm,z0,zp
+      real (kind=RKIND) :: tracer_turb_flux, z1,z2,z3,z4,zm,z0,zp
 
-      real (kind=RKIND) :: flux3, flux4, flux_upwind
-      real (kind=RKIND) :: q_im2, q_im1, q_i, q_ip1, ua, coef3, scmin,scmax
+      real (kind=RKIND) :: flux_upwind
       real (kind=RKIND) :: s_min_update, s_max_update, s_upwind, scale_factor
 
+      integer, dimension(:), pointer :: maxLevelCell, maxLevelEdgeTop
+
       integer, parameter :: hadv_opt = 2
       real (kind=RKIND), parameter :: eps=1.e-20
       logical, parameter :: debug_print = .false.
 
-      flux4(q_im2, q_im1, q_i, q_ip1, ua) =                     &amp;
-          ua*( 7.*(q_i + q_im1) - (q_ip1 + q_im2) )/12.0
-
-      flux3(q_im2, q_im1, q_i, q_ip1, ua, coef3) =              &amp;
-                flux4(q_im2, q_im1, q_i, q_ip1, ua) +           &amp;
-                coef3*abs(ua)*((q_ip1 - q_im2)-3.*(q_i-q_im1))/12.0
-
       coef_3rd_order = config_coef_3rd_order
 
-      scalar_old_in  =&gt; s_old % scalars % array
-      scalar_new_in  =&gt; s_new % scalars % array
-      kdiff       =&gt; diag % kdiff % array
-      deriv_two   =&gt; grid % deriv_two % array
-      uhAvg       =&gt; diag % ruAvg % array
       dvEdge      =&gt; grid % dvEdge % array
-      dcEdge      =&gt; grid % dcEdge % array
       cellsOnEdge =&gt; grid % cellsOnEdge % array
-      scalar_tend =&gt; tend % scalars % array
-      h_old       =&gt; s_old % rho_zz % array
-      h_new       =&gt; s_new % rho_zz % array
-      wwAvg       =&gt; diag % wwAvg % array
+!     h_old       =&gt; s_old % rho_zz % array
       areaCell    =&gt; grid % areaCell % array
 
-      fnm         =&gt; grid % fzm % array
-      fnp         =&gt; grid % fzp % array
-      rdnw        =&gt; grid % rdzw % array
-      meshScalingDel2 =&gt; grid % meshScalingDel2 % array
-      meshScalingDel4 =&gt; grid % meshScalingDel4 % array
+!     rdnw        =&gt; grid % rdzw % array
 
       nAdvCellsForEdge =&gt; grid % nAdvCellsForEdge % array
       advCellsForEdge =&gt; grid % advCellsForEdge % array
       adv_coefs =&gt; grid % adv_coefs % array
       adv_coefs_3rd =&gt; grid % adv_coefs_3rd % array
+      maxLevelCell =&gt; grid % maxLevelCell % array
+      maxLevelEdgeTop =&gt; grid % maxLevelEdgeTop % array
 
       nVertLevels = grid % nVertLevels
 
-      h_theta_eddy_visc2 = config_h_theta_eddy_visc2
-      v_theta_eddy_visc2 = config_v_theta_eddy_visc2
-      rho_edge     =&gt; diag % rho_edge % array
-      rho_zz       =&gt; s_new % rho_zz % array
-      qv_init      =&gt; grid % qv_init % array
-      zgrid        =&gt; grid % zgrid % array
+      num_tracers = size(tracers,dim=1)
 
-#ifndef DO_PHYSICS
-      scalar_tend = 0.  !  testing purposes - we have no sources or sinks
-#endif
 
       !
-      ! Runge Kutta integration, so we compute fluxes from scalar_new values, update starts from scalar_old
+      ! Runge Kutta integration, so we compute fluxes from tracer_next values, update starts from tracer_cur
       !
 
-      ! do one scalar at a time
+      ! do one tracer at a time
 
-      num_scalars = 1
+      do iTracer = 1, num_tracers
+        write(0,*) ' mono transport for tracer ',iTracer
 
-      do iScalar = 1, s_old % num_scalars
-        write(0,*) ' mono transport for scalar ',iScalar
-
         do iCell = 1, grid%nCells
-        do k=1, grid%nVertLevels
-          scalar_old(k,iCell) = scalar_old_in(iScalar,k,iCell)
-          scalar_new(k,iCell) = scalar_new_in(iScalar,k,iCell)
+          do k=1, grid%nVertLevels
+            tracer_cur(k,iCell) = tracers(iTracer,k,iCell)
+            tracer_next(k,iCell) = tracers(iTracer,k,iCell)
+            tendency_temp(k, iCell) = 0.0
+          end do
         end do
-        end do
 
-        scmin = scalar_old(1,1)
-        scmax = scalar_old(1,1)
-        do iCell = 1, grid%nCells
-        do k=1, grid%nVertLevels
-          scmin = min(scmin,scalar_old(k,iCell))
-          scmax = max(scmax,scalar_old(k,iCell))
-        enddo
-        enddo
-        write(0,*) ' scmin, scmin old in ',scmin,scmax
+!       scmin = tracer_cur(1,1)
+!       scmax = tracer_cur(1,1)
+!       do iCell = 1, grid%nCells
+!         do k=1, grid%nVertLevels
+!           scmin = min(scmin,tracer_cur(k,iCell))
+!           scmax = max(scmax,tracer_cur(k,iCell))
+!         enddo
+!       enddo
+!       write(0,*) ' scmin, scmin old in ',scmin,scmax
 
-        scmin = scalar_new(1,1)
-        scmax = scalar_new(1,1)
-        do iCell = 1, grid%nCells
-        do k=1, grid%nVertLevels
-          scmin = min(scmin,scalar_new(k,iCell))
-          scmax = max(scmax,scalar_new(k,iCell))
-        enddo
-        enddo
-        write(0,*) ' scmin, scmin new in ',scmin,scmax
 
+        !
+        !  vertical flux divergence, and min and max bounds for flux limiter
+        !
 
-      !
-      !  vertical flux divergence, and min and max bounds for flux limiter
-      !
-
  
          do iCell=1,grid % nCellsSolve
 
           ! zero flux at top and bottom
-           wdtn(1,iCell) = 0.
-           wdtn(grid % nVertLevels+1,iCell) = 0.
+           vert_flux(1,iCell) = 0.
 
            k = 1
-           s_max(k,iCell) = max(scalar_old(1,iCell),scalar_old(2,iCell))
-           s_min(k,iCell) = min(scalar_old(1,iCell),scalar_old(2,iCell))
+           s_max(k,iCell) = max(tracer_cur(1,iCell),tracer_cur(2,iCell))
+           s_min(k,iCell) = min(tracer_cur(1,iCell),tracer_cur(2,iCell))
 
            k = 2
-           wdtn(k,iCell) = wwAvg(k,iCell)*(fnm(k)*scalar_new(k,iCell)+fnp(k)*scalar_new(k-1,iCell))
-           s_max(k,iCell) = max(scalar_old(k-1,iCell),scalar_old(k,iCell),scalar_old(k+1,iCell))
-           s_min(k,iCell) = min(scalar_old(k-1,iCell),scalar_old(k,iCell),scalar_old(k+1,iCell))
+           vert_flux(k,iCell) = w(k,iCell)*(zWeightUp(k)*tracer_cur(k,iCell)+zWeightDown(k)*tracer_cur(k-1,iCell))
+           s_max(k,iCell) = max(tracer_cur(k-1,iCell),tracer_cur(k,iCell),tracer_cur(k+1,iCell))
+           s_min(k,iCell) = min(tracer_cur(k-1,iCell),tracer_cur(k,iCell),tracer_cur(k+1,iCell))
              
-           do k=3,nVertLevels-1
-              wdtn(k,iCell) = flux3( scalar_new(k-2,iCell),scalar_new(k-1,iCell),  &amp;
-                                     scalar_new(k  ,iCell),scalar_new(k+1,iCell),  &amp;
-                                     wwAvg(k,iCell), coef_3rd_order )
-              s_max(k,iCell) = max(scalar_old(k-1,iCell),scalar_old(k,iCell),scalar_old(k+1,iCell))
-              s_min(k,iCell) = min(scalar_old(k-1,iCell),scalar_old(k,iCell),scalar_old(k+1,iCell))
+           do k=3,maxLevelCell(iCell)-1
+              vert_flux(k,iCell) = flux3( tracer_cur(k-2,iCell),tracer_cur(k-1,iCell),  &amp;
+                                     tracer_cur(k  ,iCell),tracer_cur(k+1,iCell),  &amp;
+                                     w(k,iCell), coef_3rd_order )
+              s_max(k,iCell) = max(tracer_cur(k-1,iCell),tracer_cur(k,iCell),tracer_cur(k+1,iCell))
+              s_min(k,iCell) = min(tracer_cur(k-1,iCell),tracer_cur(k,iCell),tracer_cur(k+1,iCell))
            end do
  
-           k = nVertLevels
-           wdtn(k,iCell) = wwAvg(k,iCell)*(fnm(k)*scalar_new(k,iCell)+fnp(k)*scalar_new(k-1,iCell))
-           s_max(k,iCell) = max(scalar_old(k,iCell),scalar_old(k-1,iCell))
-           s_min(k,iCell) = min(scalar_old(k,iCell),scalar_old(k-1,iCell))
+           k = maxLevelCell(iCell)
+           vert_flux(k,iCell) = w(k,iCell)*(zWeightUp(k)*tracer_cur(k,iCell)+zWeightDown(k)*tracer_cur(k-1,iCell))
+           s_max(k,iCell) = max(tracer_cur(k,iCell),tracer_cur(k-1,iCell))
+           s_min(k,iCell) = min(tracer_cur(k,iCell),tracer_cur(k-1,iCell))
 
+           vert_flux(maxLevelCell(iCell)+1,iCell) = 0.
+
       ! pull s_min and s_max from the (horizontal) surrounding cells
 
            do i=1, grid % nEdgesOnCell % array(iCell)
-             do k=1, grid % nVertLevels
-               s_max(k,iCell) = max(s_max(k,iCell),scalar_old(k, grid % CellsOnCell % array(i,iCell)))
-               s_min(k,iCell) = min(s_min(k,iCell),scalar_old(k, grid % CellsOnCell % array(i,iCell)))
+             do k=1, maxLevelCell( grid % cellsOnCell % array(i, iCell))
+               s_max(k,iCell) = max(s_max(k,iCell),tracer_cur(k, grid % CellsOnCell % array(i,iCell)))
+               s_min(k,iCell) = min(s_min(k,iCell),tracer_cur(k, grid % CellsOnCell % array(i,iCell)))
              end do
            end do
 
@@ -198,19 +161,19 @@
       !
       !  horizontal flux divergence
 
-         flux_arr(:,:) = 0.
+         horiz_flux(:,:) = 0.
          do iEdge=1,grid%nEdges
 
             cell1 = cellsOnEdge(1,iEdge)
             cell2 = cellsOnEdge(2,iEdge)
 
-            if (cell1 &lt;= grid%nCellsSolve .or. cell2 &lt;= grid%nCellsSolve) then  ! only for owned cells
+            if (cell1 &lt;= grid%nCells .or. cell2 &lt;= grid%nCells) then  ! only for owned cells
   
                do i=1,nAdvCellsForEdge(iEdge)
                  iCell = advCellsForEdge(i,iEdge)
-                 do k=1,grid % nVertLevels
-                   scalar_weight = uhAvg(k,iEdge)*(adv_coefs(i,iEdge) + coef_3rd_order*sign(1.,uhAvg(k,iEdge))*adv_coefs_3rd(i,iEdge))
-                   flux_arr(k,iEdge) = flux_arr(k,iEdge) + scalar_weight* scalar_new(k,iCell)
+                 do k=1,maxLevelCell(iCell)
+                   tracer_weight = uh(k,iEdge)*(adv_coefs(i,iEdge) + coef_3rd_order*sign(1.,uh(k,iEdge))*adv_coefs_3rd(i,iEdge))
+                   horiz_flux(k,iEdge) = horiz_flux(k,iEdge) + tracer_weight* tracer_cur(k,iCell)
                  end do
                end do
 
@@ -218,27 +181,23 @@
 
           end do
 
-!  vertical flux divergence for upwind update, we will put upwind update into scalar_new, and put factor of dt in fluxes
+!  vertical flux divergence for upwind update, we will put upwind update into tracer_next, and put factor of dt in fluxes
 
           do iCell = 1, grid % nCellsSolve
 
-            k = 1
-            scalar_new(k,iCell) = scalar_old(k,iCell)*h_old(k,iCell)
-
-            do k = 2, nVertLevels
-              scalar_new(k,iCell) = scalar_old(k,iCell)*h_old(k,iCell)
-              flux_upwind = dt*(max(0.,wwAvg(k,iCell))*scalar_old(k-1,iCell) + min(0.,wwAvg(k,iCell))*scalar_old(k,iCell))
-              scalar_new(k-1,iCell) = scalar_new(k-1,iCell) - flux_upwind*rdnw(k-1)
-              scalar_new(k  ,iCell) = scalar_new(k  ,iCell) + flux_upwind*rdnw(k)
-              wdtn(k,iCell) = dt*wdtn(k,iCell) - flux_upwind
+            do k = 2, maxLevelCell(iCell)
+              flux_upwind = max(0.,w(k,iCell))*tracer_cur(k-1,iCell) + min(0.,w(k,iCell))*tracer_cur(k,iCell)
+              tendency_temp(k-1,iCell) = tendency_temp(k-1,iCell) - flux_upwind
+              tendency_temp(k  ,iCell) = tendency_temp(k  ,iCell) + flux_upwind
+              vert_flux(k,iCell) = vert_flux(k,iCell) - flux_upwind
             end do
 
 ! scale_in(:,:) and scale_out(:,:) are used here to store the incoming and outgoing perturbation flux 
 ! contributions to the update:  first the vertical flux component, then the horizontal
 
-            do k=1,nVertLevels
-              scale_in (k,iCell) = - rdnw(k)*(min(0.,wdtn(k+1,iCell))-max(0.,wdtn(k,iCell)))
-              scale_out(k,iCell) = - rdnw(k)*(max(0.,wdtn(k+1,iCell))-min(0.,wdtn(k,iCell)))
+            do k=1,maxLevelCell(iCell)
+              scale_in (k,iCell) = -(min(0.,vert_flux(k+1,iCell))-max(0.,vert_flux(k,iCell)))
+              scale_out(k,iCell) = -(max(0.,vert_flux(k+1,iCell))-min(0.,vert_flux(k,iCell)))
             end do
 
           end do
@@ -250,18 +209,17 @@
          do iEdge=1,grid%nEdges
            cell1 = cellsOnEdge(1,iEdge)
            cell2 = cellsOnEdge(2,iEdge)
-             if (cell1 &lt;= grid%nCellsSolve .or. cell2 &lt;= grid%nCellsSolve) then  ! only for owned cells
-               do k=1,grid % nVertLevels
-                 flux_upwind = grid % dvEdge % array(iEdge) * dt *   &amp;
-                        (max(0.,uhAvg(k,iEdge))*scalar_old(k,cell1) + min(0.,uhAvg(k,iEdge))*scalar_old(k,cell2))
-                 flux_arr(k,iEdge) = dt*flux_arr(k,iEdge) - flux_upwind
-                 scalar_new(k,cell1) = scalar_new(k,cell1) - flux_upwind / areaCell(cell1)
-                 scalar_new(k,cell2) = scalar_new(k,cell2) + flux_upwind / areaCell(cell2)
+             if (cell1 &lt;= grid%nCells .or. cell2 &lt;= grid%nCells) then  ! only for owned cells
+               do k=1,maxLevelEdgeTop(iEdge)
+                 flux_upwind = dvEdge(iEdge) * (max(0.,uh(k,iEdge))*tracer_cur(k,cell1) + min(0.,uh(k,iEdge))*tracer_cur(k,cell2))
+                 horiz_flux(k,iEdge) = horiz_flux(k,iEdge) - flux_upwind
+                 tendency_temp(k,cell1) = tendency_temp(k,cell1) - flux_upwind / areaCell(cell1)
+                 tendency_temp(k,cell2) = tendency_temp(k,cell2) + flux_upwind / areaCell(cell2)
 
-                 scale_out(k,cell1) = scale_out(k,cell1) - max(0.,flux_arr(k,iEdge)) / areaCell(cell1)
-                 scale_in (k,cell1) = scale_in (k,cell1) - min(0.,flux_arr(k,iEdge)) / areaCell(cell1)
-                 scale_out(k,cell2) = scale_out(k,cell2) + min(0.,flux_arr(k,iEdge)) / areaCell(cell2)
-                 scale_in (k,cell2) = scale_in (k,cell2) + max(0.,flux_arr(k,iEdge)) / areaCell(cell2)
+                 scale_out(k,cell1) = scale_out(k,cell1) - max(0.,horiz_flux(k,iEdge)) / areaCell(cell1)
+                 scale_in (k,cell1) = scale_in (k,cell1) - min(0.,horiz_flux(k,iEdge)) / areaCell(cell1)
+                 scale_out(k,cell2) = scale_out(k,cell2) + min(0.,horiz_flux(k,iEdge)) / areaCell(cell2)
+                 scale_in (k,cell2) = scale_in (k,cell2) + max(0.,horiz_flux(k,iEdge)) / areaCell(cell2)
 
                end do
              end if
@@ -270,10 +228,10 @@
 !  next, the limiter
 
           do iCell = 1, grid % nCellsSolve
-            do k = 1, nVertLevels
-               s_min_update = (scalar_new(k,iCell)+scale_out(k,iCell))/h_new(k,iCell)
-               s_max_update = (scalar_new(k,iCell)+scale_in (k,iCell))/h_new(k,iCell)
-               s_upwind = scalar_new(k,iCell)/h_new(k,iCell)
+            do k = 1, maxLevelCell(iCell)
+               s_min_update = tendency_temp(k,iCell)+scale_out(k,iCell)
+               s_max_update = tendency_temp(k,iCell)+scale_in (k,iCell)
+               s_upwind = tendency_temp(k,iCell)
            
                scale_factor = (s_max(k,iCell)-s_upwind)/(s_max_update-s_upwind+eps)
                scale_in(k,iCell) = min( 1.0, max( 0.0, scale_factor) )
@@ -286,28 +244,28 @@
 !
 !  communicate scale factors here
 !
-      call dmpar_exch_halo_field2dReal( dminfo,               &amp;
-                                        scale_in(:,:),        &amp;
-                                        grid % nVertLevels,   &amp;
-                                        grid % nCells,        &amp;
-                                        cellsToSend, cellsToRecv )
-      call dmpar_exch_halo_field2dReal( dminfo,               &amp;
-                                        scale_out(:,:),       &amp;
-                                        grid % nVertLevels,   &amp;
-                                        grid % nCells,        &amp;
-                                        cellsToSend, cellsToRecv )
+!     call dmpar_exch_halo_field2dReal( dminfo,               &amp;
+!                                       scale_in(:,:),        &amp;
+!                                       grid % nVertLevels,   &amp;
+!                                       grid % nCells,        &amp;
+!                                       cellsToSend, cellsToRecv )
+!     call dmpar_exch_halo_field2dReal( dminfo,               &amp;
+!                                       scale_out(:,:),       &amp;
+!                                       grid % nVertLevels,   &amp;
+!                                       grid % nCells,        &amp;
+!                                       cellsToSend, cellsToRecv )
 !
 !  rescale the fluxes
 !
             do iEdge = 1, grid % nEdges
                cell1 = grid % cellsOnEdge % array(1,iEdge)
                cell2 = grid % cellsOnEdge % array(2,iEdge)
-               if (cell1 &lt;= grid%nCellsSolve .or. cell2 &lt;= grid%nCellsSolve) then
-                  do k = 1, nVertLevels
-                     flux = flux_arr(k,iEdge)
+               if (cell1 &lt;= grid%nCells .or. cell2 &lt;= grid%nCells) then
+                  do k = 1, maxLevelCell(iCell)
+                     flux = horiz_flux(k,iEdge)
                      flux = max(0.,flux) * min(scale_out(k,cell1), scale_in(k,cell2)) &amp;
                           + min(0.,flux) * min(scale_in(k,cell1), scale_out(k,cell2))
-                     flux_arr(k,iEdge) = flux
+                     horiz_flux(k,iEdge) = flux
                   end do
                end if
             end do
@@ -315,62 +273,65 @@
        ! rescale the vertical flux
  
             do iCell=1,grid % nCells
-               do k = 2, nVertLevels
-                  flux =  wdtn(k,iCell)
+               do k = 2, maxLevelCell(iCell)
+                  flux =  vert_flux(k,iCell)
                   flux = max(0.,flux) * min(scale_out(k-1,iCell), scale_in(k  ,iCell)) &amp;
                        + min(0.,flux) * min(scale_out(k  ,iCell), scale_in(k-1,iCell))
-                  wdtn(k,iCell) = flux
+                  vert_flux(k,iCell) = flux
                end do
             end do
 !
-!  do the scalar update now that we have the fluxes
+!  do the tracer update now that we have the fluxes
 !
          do iEdge=1,grid%nEdges
             cell1 = cellsOnEdge(1,iEdge)
             cell2 = cellsOnEdge(2,iEdge)
-            if (cell1 &lt;= grid%nCellsSolve .or. cell2 &lt;= grid%nCellsSolve) then  ! only for owned cells
-               do k=1,grid % nVertLevels
-                  scalar_new(k,cell1) = scalar_new(k,cell1) - flux_arr(k,iEdge)/areaCell(cell1)
-                  scalar_new(k,cell2) = scalar_new(k,cell2) + flux_arr(k,iEdge)/areaCell(cell2)
+            if (cell1 &lt;= grid%nCells .or. cell2 &lt;= grid%nCells) then  ! only for owned cells
+               do k=1,maxLevelEdgeTop(iEdge)
+!                 tracer_next(k,cell1) = tracer_next(k,cell1) - horiz_flux(k,iEdge)/areaCell(cell1)
+!                 tracer_next(k,cell2) = tracer_next(k,cell2) + horiz_flux(k,iEdge)/areaCell(cell2)
+                  tend(iTracer, k, cell1) = tend(iTracer, k, cell1) - horiz_flux(k, iEdge)/areaCell(cell1)
+                  tend(iTracer, k, cell2) = tend(iTracer, k, cell2) - horiz_flux(k, iEdge)/areaCell(cell2)
                end do
             end if
          end do
 
           do iCell=1,grid % nCellsSolve
-             do k=1,grid % nVertLevels
-               scalar_new(k,iCell) = (   scalar_new(k,iCell)  &amp;
-                   + (-rdnw(k)*(wdtn(k+1,iCell)-wdtn(k,iCell)) ) )/h_new(k,iCell)
+             do k=1,maxLevelCell(iCell)
+!              tracer_next(k,iCell) = (   tracer_next(k,iCell)  &amp;
+!                  + (-rdnw(k)*(vert_flux(k+1,iCell)-vert_flux(k,iCell)) ) )/h_new(k,iCell)
+               tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + (vert_flux(k+1, iCell) - vert_flux(k, iCell))
              end do
           end do
 
-        if(debug_print) then
+!       if(debug_print) then
 
-        scmin = scalar_new(1,1)
-        scmax = scalar_new(1,1)
-        do iCell = 1, grid%nCellsSolve
-        do k=1, grid%nVertLevels
-          scmax = max(scmax,scalar_new(k,iCell))
-          scmin = min(scmin,scalar_new(k,iCell))
-          if(s_max(k,iCell) &lt; scalar_new(k,iCell)) then
-            write(32,*) ' over - k,iCell,s_min,s_max,scalar_new ',k,iCell,s_min(k,iCell),s_max(k,iCell),scalar_new(k,iCell)
-          end if
-          if(s_min(k,iCell) &gt; scalar_new(k,iCell)) then
-            write(32,*) ' under - k,iCell,s_min,s_max,scalar_new ',k,iCell,s_min(k,iCell),s_max(k,iCell),scalar_new(k,iCell)
-          end if
-        enddo
-        enddo
-        write(0,*) ' scmin, scmax new out ',scmin,scmax
-        write(0,*) ' icell_min, k_min ',icellmax, kmax
+!       scmin = tracer_next(1,1)
+!       scmax = tracer_next(1,1)
+!       do iCell = 1, grid%nCellsSolve
+!       do k=1, grid%nVertLevels
+!         scmax = max(scmax,tracer_next(k,iCell))
+!         scmin = min(scmin,tracer_next(k,iCell))
+!         if(s_max(k,iCell) &lt; tracer_next(k,iCell)) then
+!           write(32,*) ' over - k,iCell,s_min,s_max,tracer_next ',k,iCell,s_min(k,iCell),s_max(k,iCell),tracer_next(k,iCell)
+!         end if
+!         if(s_min(k,iCell) &gt; tracer_next(k,iCell)) then
+!           write(32,*) ' under - k,iCell,s_min,s_max,tracer_next ',k,iCell,s_min(k,iCell),s_max(k,iCell),tracer_next(k,iCell)
+!         end if
+!       enddo
+!       enddo
+!       write(0,*) ' scmin, scmax new out ',scmin,scmax
+!       write(0,*) ' icell_min, k_min ',icellmax, kmax
 
-        end if
+!       end if
 
-          do iCell = 1, grid%nCells
-          do k=1, grid%nVertLevels
-            scalar_new_in(iScalar,k,iCell) = max(0.,scalar_new(k,iCell))
-          end do
-          end do
+!         do iCell = 1, grid%nCells
+!         do k=1, grid%maxLevelCell(iCell)
+!           tracer_next_in(iTracer,k,iCell) = max(0.,tracer_next(k,iCell))
+!         end do
+!         end do
 
-      end do !  loop over scalars
+      end do !  loop over tracers
 
    end subroutine mpas_tracer_advection_mono_tend!}}}
 

</font>
</pre>