<p><b>dwj07@fsu.edu</b> 2012-03-13 16:01:16 -0600 (Tue, 13 Mar 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Adding computation of deriv_two.<br>
        Adding masks for advection order, which is required due to land cells under ocean cells.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/Registry        2012-03-13 21:46:10 UTC (rev 1628)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/Registry        2012-03-13 22:01:16 UTC (rev 1629)
@@ -158,6 +158,7 @@
 var persistent real    adv_coefs_3rd ( FIFTEEN nEdges ) 0 - adv_coefs_3rd mesh - -
 var persistent integer advCellsForEdge ( FIFTEEN nEdges ) 0 - advCellsForEdge mesh - -
 var persistent integer nAdvCellsForEdge ( nEdges ) 0 - nAdvCellsForEdge mesh - -
+var persistent integer advectionMasks ( TWO nVertLevels nEdges ) 0 - advectionMasks mesh - -
 
 % !! NOTE: the following arrays are needed to allow the use
 % !! of the module_advection.F w/o alteration

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_advection.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_advection.F        2012-03-13 21:46:10 UTC (rev 1628)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_advection.F        2012-03-13 22:01:16 UTC (rev 1629)
@@ -9,7 +9,7 @@
    contains
 
 
-   subroutine ocn_initialize_advection_rk( grid )!{{{
+   subroutine ocn_initialize_advection_rk( grid, err )!{{{
                                       
 !
 ! compute the cell coefficients for the polynomial fit.
@@ -19,6 +19,7 @@
       implicit none
 
       type (mesh_type), intent(in) :: grid
+      integer, intent(out) :: err
 
       real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
       integer, dimension(:,:), pointer :: advCells
@@ -50,9 +51,7 @@
 
       integer :: cell1, cell2
       integer, parameter :: polynomial_order = 2
-!      logical, parameter :: debug = .true.
       logical, parameter :: debug = .false.
-!      logical, parameter :: least_squares = .false.
       logical, parameter :: least_squares = .true.
       logical :: add_the_cell, do_the_cell
 
@@ -61,8 +60,15 @@
       real (kind=RKIND) :: rcell, cos2t, costsint, sin2t
       real (kind=RKIND), dimension(grid%maxEdges) :: angle_2d
 
-!---
+!---    
+      err = 0
 
+      if(polynomial_order &gt; 2) then
+        write (*,*) 'Polynomial for second derivitave can only be 2'
+        err = 1
+        return
+      end if
+
       pii = 2.*asin(1.0)
 
       advCells =&gt; grid % advCells % array

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-13 21:46:10 UTC (rev 1628)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_mpas_core.F        2012-03-13 22:01:16 UTC (rev 1629)
@@ -138,7 +138,10 @@
 
       block =&gt; domain % blocklist
       do while (associated(block))
-         call mpas_init_block(block, block % mesh, dt)
+         call mpas_init_block(block, block % mesh, dt, err)
+         if(err.eq.1) then
+             call mpas_dmpar_abort(dminfo)
+         endif
          block % state % time_levs(1) % state % xtime % scalar = startTimeStamp 
          block =&gt; block % next
       end do
@@ -217,20 +220,23 @@
 
    end subroutine ocn_simulation_clock_init!}}}
 
-   subroutine mpas_init_block(block, mesh, dt)!{{{
+   subroutine mpas_init_block(block, mesh, dt, err)!{{{
    
       use mpas_grid_types
       use mpas_rbf_interpolation
       use mpas_vector_reconstruction
       use mpas_ocn_tracer_advection
+      use ocn_advection
    
       implicit none
    
       type (block_type), intent(inout) :: block
       type (mesh_type), intent(inout) :: mesh
       real (kind=RKIND), intent(in) :: dt
+      integer, intent(out) :: err
       integer :: i, iEdge, iCell, k
    
+      call ocn_initialize_advection_rk(mesh, err)
       call mpas_ocn_tracer_advection_coefficients(mesh)
       call ocn_time_average_init(block % state % time_levs(1) % state)
    

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tracer_advection.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tracer_advection.F        2012-03-13 21:46:10 UTC (rev 1628)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tracer_advection.F        2012-03-13 22:01:16 UTC (rev 1629)
@@ -54,11 +54,12 @@
 
       real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
       real (kind=RKIND), dimension(:,:), pointer :: adv_coefs, adv_coefs_3rd
-      integer, dimension(:,:), pointer :: cellsOnCell, cellsOnEdge, advCellsForEdge
+      integer, dimension(:,:,:), pointer :: advectionMasks
+      integer, dimension(:,:), pointer :: cellsOnCell, cellsOnEdge, advCellsForEdge, boundaryCell
       integer, dimension(:), pointer :: nEdgesOnCell, nAdvCellsForEdge
 
       integer, dimension(:), pointer :: cell_list, ordered_cell_list
-      integer :: cell1, cell2, iEdge, n, i, j, j_in, iCell
+      integer :: cell1, cell2, iEdge, n, i, j, j_in, iCell, k, nVertLevels
       logical :: addcell
 
       deriv_two =&gt; grid % deriv_two % array
@@ -67,16 +68,34 @@
       cellsOnCell =&gt; grid % cellsOnCell % array
       cellsOnEdge =&gt; grid % cellsOnEdge % array
       advCellsForEdge =&gt; grid % advCellsForEdge % array
+      boundaryCell =&gt; grid % boundaryCell % array
+      avectionMasks =&gt; grid % advectionMasks % array
       nEdgesOnCell =&gt; grid % nEdgesOnCell % array
       nAdvCellsForEdge =&gt; grid % nAdvCellsForEdge % array
 
+      nVertLevels = grid % nVertLevels
+
       allocate(cell_list(grid % maxEdges2 + 2))
       allocate(ordered_cell_list(grid % maxEdges2 + 2))
 
+      avectionMasks = 0
+
       do iEdge = 1, grid % nEdges
         nAdvCellsForEdge(iEdge) = 0
         cell1 = cellsOnEdge(1,iEdge)
         cell2 = cellsOnEdge(2,iEdge)
+        
+
+        do k = 1, nVertLevels
+          if (boundaryCell(k, cell1) == 1 .or. boundaryCell(k, cell2) == 1) then
+            advectionMasks(1, k, iEdge) = 1 ! Need to use low order advection for this edge
+          else
+            advectionMasks(2, k, iEdge) = 1 ! Can use high order advection for this edge
+          end if
+
+          write(*,*) iedge, k, advectionMasks(1,k,iEdge) + advectionMasks(2,k,iEdge)
+        end do
+
         !
         ! do only if this edge flux is needed to update owned cells
         !
@@ -202,6 +221,8 @@
       deallocate(cell_list)
       deallocate(ordered_cell_list)
 
+      write(*,*) 'Min max of sum, ', minval(advectionMasks(1,:,:)+advectionMasks(2,:,:)), maxval(advectionMasks(1,:,:) + advectionMasks(2,:,:))
+
    end subroutine mpas_ocn_tracer_advection_coefficients!}}}
 
 !|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

Modified: branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tracer_advection_mono.F
===================================================================
--- branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tracer_advection_mono.F        2012-03-13 21:46:10 UTC (rev 1628)
+++ branches/ocean_projects/monotonic_advection/src/core_ocean/mpas_ocn_tracer_advection_mono.F        2012-03-13 22:01:16 UTC (rev 1629)
@@ -62,6 +62,7 @@
       integer :: nVertLevels, num_tracers, nCells, nEdges, nCellsSolve
       integer, dimension(:), pointer :: nAdvCellsForEdge, maxLevelCell, maxLevelEdgeTop, nEdgesOnCell
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnCell, advCellsForEdge
+      integer, dimension(:,:,:), pointer :: advectionMasks
 
       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
@@ -89,6 +90,7 @@
       adv_coefs_3rd =&gt; grid % adv_coefs_3rd % array
       maxLevelCell =&gt; grid % maxLevelCell % array
       maxLevelEdgeTop =&gt; grid % maxLevelEdgeTop % array
+      advectionMasks =&gt; grid % advectionMasks % array
 
       nCells = grid % nCells
       nCellsSolve = grid % nCellsSolve
@@ -179,7 +181,11 @@
           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))
+              ! AdvectionMasks defines the mask for low or high order advection (1,:,:) is the low order mask, while (2,:,:) is the high order mask
+              tracer_weight = advectionMasks(1, k, iEdge) * 0.5 * dvEdge(iEdge) &amp;
+                            + advectionMasks(2, k, iEdge) * (adv_coefs(i,iEdge) + coef_3rd_order*sign(1.,uh(k,iEdge))*adv_coefs_3rd(i,iEdge))
+
+              tracer_weight = uh(k,iEdge)*tracer_weight
               high_order_horiz_flux(k,iEdge) = high_order_horiz_flux(k,iEdge) + tracer_weight* tracer_cur(k,iCell)
             end do ! k loop
           end do ! i loop over nAdvCellsForEdge

</font>
</pre>