<p><b>dwj07@fsu.edu</b> 2012-02-03 12:28:49 -0700 (Fri, 03 Feb 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        General code clean up on monotonic advection.<br>
        Improving Indentation.<br>
<br>
        Removing halo updates for scale factors, as they are not required.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_tendency.F        2012-02-03 18:30:43 UTC (rev 1463)
+++ branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_tendency.F        2012-02-03 19:28:49 UTC (rev 1464)
@@ -291,7 +291,7 @@
 !
 !-----------------------------------------------------------------------
 
-   subroutine ocn_tend_scalar(tend, s, d, grid, dt, parinfo, dminfo)!{{{
+   subroutine ocn_tend_scalar(tend, s, d, grid, dt)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !
    ! Input: s - current model state
@@ -310,8 +310,6 @@
       type (diag_type), intent(in) :: d
       type (mesh_type), intent(in) :: grid
       real (kind=RKIND), intent(in) :: dt
-      type (parallel_info), intent(in) :: parinfo
-      type (dm_info), intent(in) :: dminfo
 
       real (kind=RKIND), dimension(:), pointer :: hRatioZLevelK, hRatioZLevelKm1, zTopZLevel, hMeanTopZLevel
       real (kind=RKIND), dimension(:,:), pointer :: &amp;
@@ -362,7 +360,7 @@
       ! tracer_edge at the boundary will also need to be defined for flux boundaries.
 
       call mpas_timer_start(&quot;adv&quot;, .false., tracerHadvTimer)
-      call mpas_tracer_advection_tend(tracers, uh, wTop, h, dt, hMeanTopZLevel, hRatioZLevelKm1, hRatioZLevelK, grid, tend_h, parinfo, dminfo, tend_tr)
+      call mpas_tracer_advection_tend(tracers, uh, wTop, h, dt, hMeanTopZLevel, hRatioZLevelKm1, hRatioZLevelK, grid, tend_h, tend_tr)
       call mpas_timer_stop(&quot;adv&quot;, tracerHadvTimer)
 !     call mpas_timer_start(&quot;hadv&quot;, .false., tracerHadvTimer)
 !     call ocn_tracer_hadv_tend(grid, u, h_edge, tracers, tend_tr, err)

Modified: branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_time_integration_rk4.F
===================================================================
--- branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_time_integration_rk4.F        2012-02-03 18:30:43 UTC (rev 1463)
+++ branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_time_integration_rk4.F        2012-02-03 19:28:49 UTC (rev 1464)
@@ -179,8 +179,7 @@
                call filter_btr_mode_tend_u(block % tend, provis, block % diag, block % mesh)
            endif
 
-           !call ocn_tend_scalar(block % tend, provis, block % diag, block % mesh, rk_substep_weights(rk_step), block % parinfo, block % domain % dminfo, block % state % time_levs(1) % state % h % array)
-           call ocn_tend_scalar(block % tend, provis, block % diag, block % mesh, dt, block % parinfo, block % domain % dminfo)
+           call ocn_tend_scalar(block % tend, provis, block % diag, block % mesh, dt)
            block =&gt; block % next
         end do
         call mpas_timer_stop(&quot;RK4-tendency computations&quot;)

Modified: branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_time_integration_split.F
===================================================================
--- branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_time_integration_split.F        2012-02-03 18:30:43 UTC (rev 1463)
+++ branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_time_integration_split.F        2012-02-03 19:28:49 UTC (rev 1464)
@@ -777,7 +777,7 @@
             call ocn_tend_h(block % tend, block % state % time_levs(2) % state , block % diag, block % mesh)
           endif
 
-          call ocn_tend_scalar(block % tend, block % state % time_levs(2) % state , block % diag, block % mesh, dt, block % parinfo, block % domain % dminfo)
+          call ocn_tend_scalar(block % tend, block % state % time_levs(2) % state , block % diag, block % mesh, dt)
 
           block =&gt; block % next
         end do

Modified: branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection.F
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection.F        2012-02-03 18:30:43 UTC (rev 1463)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection.F        2012-02-03 19:28:49 UTC (rev 1464)
@@ -171,7 +171,7 @@
    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, parinfo, dminfo, tend)!{{{
+   subroutine mpas_tracer_advection_tend(tracers, uh, w, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, tend)!{{{
 
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
       real (kind=RKIND), dimension(:,:,:), intent(in) :: tracers
@@ -179,8 +179,6 @@
       real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
       real (kind=RKIND), intent(in) :: dt
       type (mesh_type), intent(in) :: grid
-      type (parallel_info), intent(in) :: parinfo
-      type (dm_info), intent(in) :: dminfo
       real (kind=RKIND), dimension(:,:), intent(in) :: tend_h
 !     real (kind=RKIND) :: dt
 
@@ -189,7 +187,7 @@
 
       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, parinfo, dminfo, tend)
+         call mpas_tracer_advection_mono_tend(tracers, uh, w, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, tend)
       else
          call mpas_tracer_advection_std_tend(tracers, uh, w, zDistance, zWeightK, zWeightKm1, grid, tend)
       endif

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-02-03 18:30:43 UTC (rev 1463)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_mono.F        2012-02-03 19:28:49 UTC (rev 1464)
@@ -15,8 +15,7 @@
 
    contains
 
-!  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, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, parinfo, dminfo, tend)!{{{
+   subroutine mpas_tracer_advection_mono_tend(tracers, uh, w, h, dt, zDistance, zWeightK, zWeightKm1, grid, tend_h, tend)!{{{
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    !
    ! Input: s - current model state
@@ -29,14 +28,11 @@
       real (kind=RKIND), intent(in) :: dt
       real (kind=RKIND), dimension(:), intent(in) :: zDistance, zWeightK, zWeightKm1
       type (mesh_type), intent(in) :: grid
-      type (parallel_info), intent(in) :: parinfo
-      type (dm_info), intent(in) :: dminfo
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend
 
       integer :: i, iCell, iEdge, k, iTracer, cell1, cell2
       real (kind=RKIND) :: flux, tracer_weight
 
-!     real (kind=RKIND), dimension(:,:), pointer :: h_old, h_new
       real (kind=RKIND), dimension(:), pointer :: dvEdge, areaCell
       integer, dimension(:,:), pointer :: cellsOnEdge
 
@@ -44,7 +40,7 @@
       integer, dimension(:), pointer :: nAdvCellsForEdge
       real (kind=RKIND), dimension(:,:), pointer :: adv_coefs, adv_coefs_3rd
 
-      real (kind=RKiND), dimension( grid % nVertLevels, grid % nCells ) :: tracer_cur, tracer_next, tendency_temp, h_new
+      real (kind=RKiND), dimension( grid % nVertLevels, grid % nCells ) :: tracer_cur, tendency_temp, h_new
       real (kind=RKIND), dimension( grid % nVertLevels, grid % nCells ) :: s_max, s_min
       real (kind=RKIND), dimension( grid % nVertLevels, grid % nCells ) :: scale_in, scale_out
 
@@ -53,7 +49,6 @@
 
       integer :: nVertLevels, num_tracers, icellmax, kmax
 
-!     real (kind=RKIND), dimension(:), pointer :: rdnw
       real (kind=RKIND) :: coef_3rd_order
 
       real (kind=RKIND) :: tracer_turb_flux, z1,z2,z3,z4,zm,z0,zp
@@ -63,19 +58,14 @@
 
       integer, dimension(:), pointer :: maxLevelCell, maxLevelEdgeTop
 
-      integer, parameter :: hadv_opt = 2
       real (kind=RKIND), parameter :: eps = 1.e-20
-      logical, parameter :: debug_print = .false.
 
       coef_3rd_order = config_coef_3rd_order
 
       dvEdge      =&gt; grid % dvEdge % array
       cellsOnEdge =&gt; grid % cellsOnEdge % array
-!     h_old       =&gt; s_old % rho_zz % array
       areaCell    =&gt; grid % areaCell % array
 
-!     rdnw        =&gt; grid % rdzw % array      
-
       nAdvCellsForEdge =&gt; grid % nAdvCellsForEdge % array
       advCellsForEdge =&gt; grid % advCellsForEdge % array
       adv_coefs =&gt; grid % adv_coefs % array
@@ -87,12 +77,11 @@
 
       num_tracers = size(tracers,dim=1)
 
-      ! do one tracer at a time
+      ! 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
         do iCell = 1, grid%nCells
           do k=1, maxLevelCell(iCell)
             tracer_cur(k,iCell) = tracers(iTracer,k,iCell)
-            tracer_next(k,iCell) = tracers(iTracer,k,iCell)
             tendency_temp(k, iCell) = 0.0
             h_new(k, iCell) = h(k, iCell) + dt * tend_h(k, iCell)
 
@@ -101,229 +90,181 @@
           end do
         end do
 
-!       vert_flux = 0.0
-!       horiz_flux = 0.0
+        vert_flux = 0.0
+        horiz_flux = 0.0
 
-!       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
-
-
         !
-        !  vertical flux divergence, and min and max bounds for flux limiter
+        !  Compute high order vertical flux. Also determine bounds on tracer_cur. 
         !
+        do iCell=1,grid % nCells
+          k = 1
+          vert_flux(k,iCell) = 0.
+          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))
 

-         do iCell=1,grid % nCells
-
-          ! zero flux at top and bottom
-           k = 1
-           vert_flux(k,iCell) = 0.
-           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))
-
-           k = 2
-           vert_flux(k,iCell) = w(k,iCell)*(zWeightK(k)*tracer_cur(k,iCell)+zWeightKm1(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))
+          k = 2
+          vert_flux(k,iCell) = w(k,iCell)*(zWeightK(k)*tracer_cur(k,iCell)+zWeightKm1(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,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 
+          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 = maxLevelCell(iCell)
-           vert_flux(k,iCell) = w(k,iCell)*(zWeightK(k)*tracer_cur(k,iCell)+zWeightKm1(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))
+          k = maxLevelCell(iCell)
+          vert_flux(k,iCell) = w(k,iCell)*(zWeightK(k)*tracer_cur(k,iCell)+zWeightKm1(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.
+          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, 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
-
-         end do
-
-      !
-      !  horizontal flux divergence
-
-         horiz_flux(:,:) = 0.
-         do iEdge=1,grid%nEdges
-
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-
-            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,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
-
-            end if
-
+          ! pull s_min and s_max from the (horizontal) surrounding cells
+          do i=1, grid % nEdgesOnCell % array(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
+        end do
 
-!  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 % nCells
-
-            do k = 2, maxLevelCell(iCell)
-            !dwj: wrong for ocean?
-!             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)
-              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
-
+        !
+        !  high order horizontal flux
+        !
+        horiz_flux(:,:) = 0.
+        do iEdge=1,grid%nEdges
+          cell1 = cellsOnEdge(1,iEdge)
+          cell2 = cellsOnEdge(2,iEdge)
+          do i=1,nAdvCellsForEdge(iEdge)
+            iCell = advCellsForEdge(i,iEdge)
             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)))
-
-              scale_in (k, iCell) = max(0.0, vert_flux(k+1, iCell)) - min(0.0, vert_flux(k, iCell))
-              scale_out(k, iCell) = min(0.0, vert_flux(k+1, iCell)) - max(0.0, vert_flux(k, 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
+        end do
 
+        !
+        !  low order upwind vertical flux (monotonic and diffused)
+        !  Remove low order flux from the high order flux.
+        !  Store left over high order flux in vert_flux array.
+        !  Upwind fluxes are accumulated in tendency_temp
+        !
+        do iCell = 1, grid % nCells
+          do k = 2, maxLevelCell(iCell)
+            !dwj: wrong for ocean?
+!           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)
+            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
 
-!  horizontal flux divergence for upwind update
+          ! scale_in contains the total remaining high order flux into iCell
+          !          it is positive.
+          ! scale_out contains the total remaining high order flux out of iCell
+          !           it is negative
+          do k=1,maxLevelCell(iCell)
+            ! dwj 02/03/12 Ocean and Atmosphere are different in vertical
+!           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)))
 
-         !  upwind flux computation
+            scale_in (k, iCell) = max(0.0, vert_flux(k+1, iCell)) - min(0.0, vert_flux(k, iCell))
+            scale_out(k, iCell) = min(0.0, vert_flux(k+1, iCell)) - max(0.0, vert_flux(k, iCell))
+          end do
+        end do
 
-         do iEdge=1,grid%nEdges
-           cell1 = cellsOnEdge(1,iEdge)
-           cell2 = cellsOnEdge(2,iEdge)
-             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))
-                 tendency_temp(k,cell1) = tendency_temp(k,cell1) - flux_upwind / areaCell(cell1)
-                 tendency_temp(k,cell2) = tendency_temp(k,cell2) + flux_upwind / areaCell(cell2)
-                 horiz_flux(k,iEdge) = horiz_flux(k,iEdge) - flux_upwind
+        !
+        !  low order upwind horizontal flux (monotinc and diffused)
+        !  Remove low order flux from the high order flux
+        !  Store left over high order flux in horiz_flux array
+        !  Upwind fluxes are accumulated in tendency_temp
+        !
+        do iEdge=1,grid%nEdges
+          cell1 = cellsOnEdge(1,iEdge)
+          cell2 = cellsOnEdge(2,iEdge)
+          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))
+            tendency_temp(k,cell1) = tendency_temp(k,cell1) - flux_upwind / areaCell(cell1)
+            tendency_temp(k,cell2) = tendency_temp(k,cell2) + flux_upwind / areaCell(cell2)
+            horiz_flux(k,iEdge) = horiz_flux(k,iEdge) - flux_upwind
 
-                 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
+            ! Accumulate remaining high order fluxes
+            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 do
 
-!  next, the limiter
-          do iCell = 1, grid % nCells
-            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)
-               s_min_update = (tracer_cur(k,iCell)*h(k,iCell) + dt*(tendency_temp(k,iCell)+scale_out(k,iCell)))/h_new(k,iCell)
-               s_max_update = (tracer_cur(k,iCell)*h(k,iCell) + dt*(tendency_temp(k,iCell)+scale_in(k,iCell)))/h_new(k,iCell)
-               s_upwind = (tracer_cur(k,iCell)*h(k,iCell) + dt*tendency_temp(k,iCell))/h_new(k,iCell)
+        !  Build the factors for the FCT
+        do iCell = 1, grid % nCells
+          do k = 1, maxLevelCell(iCell)
+            s_min_update = (tracer_cur(k,iCell)*h(k,iCell) + dt*(tendency_temp(k,iCell)+scale_out(k,iCell)))/h_new(k,iCell)
+            s_max_update = (tracer_cur(k,iCell)*h(k,iCell) + dt*(tendency_temp(k,iCell)+scale_in(k,iCell)))/h_new(k,iCell)
+            s_upwind = (tracer_cur(k,iCell)*h(k,iCell) + dt*tendency_temp(k,iCell))/h_new(k,iCell)
            
-               !dwj Need to fix scale_factor, because s_max and s_min don't mean what we need them to.
-               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) )
+            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) )
 
-               scale_factor = (s_upwind-s_min(k,iCell))/(s_upwind-s_min_update+eps)
-               scale_out(k,iCell) = min( 1.0, max( 0.0, scale_factor) )
+            scale_factor = (s_upwind-s_min(k,iCell))/(s_upwind-s_min_update+eps)
+            scale_out(k,iCell) = min( 1.0, max( 0.0, scale_factor) )
 
-            end do
           end do
+        end do
 
-!
-!  communicate scale factors here
-!
-!     call mpas_dmpar_exch_halo_field2d_real( dminfo,               &amp;
-!                                       scale_in(:,:),        &amp;
-!                                       grid % nVertLevels,   &amp;
-!                                       grid % nCells,        &amp;
-!                                       parinfo % cellsToSend, parinfo % cellsToRecv )
-!     call mpas_dmpar_exch_halo_field2d_real( dminfo,               &amp;
-!                                       scale_out(:,:),       &amp;
-!                                       grid % nVertLevels,   &amp;
-!                                       grid % nCells,        &amp;
-!                                       parinfo % cellsToSend, parinfo % 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, maxLevelEdgeTop(iEdge)
-                     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))
-                     horiz_flux(k,iEdge) = flux
-                  end do
-               end if
-            end do
+        !  rescale the high order horizontal fluxes
+        do iEdge = 1, grid % nEdges
+          cell1 = grid % cellsOnEdge % array(1,iEdge)
+          cell2 = grid % cellsOnEdge % array(2,iEdge)
+          do k = 1, maxLevelEdgeTop(iEdge)
+            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))
+            horiz_flux(k,iEdge) = flux
+          end do
+        end do
 
-       ! rescale the vertical flux

-            do iCell=1,grid % nCellsSolve
-               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))
-                  flux = max(0.,flux) * min(scale_out(k  ,iCell), scale_in(k-1,iCell)) &amp;
-                       + min(0.,flux) * min(scale_out(k-1,iCell), scale_in(k  ,iCell))
-                  vert_flux(k,iCell) = flux
-               end do
-            end do
-!
-!  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,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
+        ! rescale the high order vertical flux
+        do iCell=1,grid % nCellsSolve
+          do k = 2, maxLevelCell(iCell)
+            flux =  vert_flux(k,iCell)
+            ! dwj 02/03/12 Ocean and Atmosphere are different in vertical.
+!           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))
+            flux = max(0.,flux) * min(scale_out(k  ,iCell), scale_in(k-1,iCell)) &amp;
+                 + min(0.,flux) * min(scale_out(k-1,iCell), scale_in(k  ,iCell))
+            vert_flux(k,iCell) = flux
+          end do
+        end do
 
-          do iCell=1,grid % nCellsSolve
-             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)) + tendency_temp(k,iCell)
-!              tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + tendency_temp(k,iCell)
-             end do
+        ! Accumulate the scaled high order horizontal tendencies
+        do iEdge=1,grid%nEdges
+          cell1 = cellsOnEdge(1,iEdge)
+          cell2 = cellsOnEdge(2,iEdge)
+          do k=1,maxLevelEdgeTop(iEdge)
+            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 do
 
-!         do iCell = 1, grid%nCells
+        ! Accumulate the scaled high order vertical tendencies, and the upwind tendencies
+        do iCell=1,grid % nCellsSolve
+          do k=1,maxLevelCell(iCell)
+            tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + (vert_flux(k+1, iCell) - vert_flux(k, iCell)) + tendency_temp(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
 
       end do !  loop over tracers
-
    end subroutine mpas_tracer_advection_mono_tend!}}}
 
 end module mpas_tracer_advection_mono

</font>
</pre>