<p><b>dwj07@fsu.edu</b> 2011-10-17 12:29:40 -0600 (Mon, 17 Oct 2011)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Newer partially optimized version of tracer advection - horizontal.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv2.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv2.F        2011-10-17 18:18:50 UTC (rev 1095)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv2.F        2011-10-17 18:29:40 UTC (rev 1096)
@@ -111,7 +111,7 @@
       integer, dimension(:), pointer :: maxLevelEdgeTop
       integer, dimension(:,:), pointer :: cellsOnEdge
 
-      real (kind=RKIND) :: flux, tracer_edge
+      real (kind=RKIND) :: flux, tracer_edge, invArea1, invArea2
 
       real (kind=RKIND), dimension(:), pointer :: dvEdge, areaCell
 
@@ -137,12 +137,16 @@
       do iEdge=1,nEdges
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
+
+         invArea1 = 1.0 / areaCell(cell1)
+         invArea2 = 1.0 / areaCell(cell2)
+
          do k=1,maxLevelEdgeTop(iEdge)
             do iTracer=1,num_tracers
                tracer_edge = 0.5 * (tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))
                flux = u(k,iEdge) * dvEdge(iEdge) * h_edge(k,iEdge) * tracer_edge
-               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux/areaCell(cell1)
-               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux/areaCell(cell2)
+               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux * invArea1
+               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux * invArea2
             end do
          end do
       end do

Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv3.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv3.F        2011-10-17 18:18:50 UTC (rev 1095)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv3.F        2011-10-17 18:29:40 UTC (rev 1096)
@@ -108,12 +108,13 @@
       !-----------------------------------------------------------------
 
       integer :: iEdge, nEdges, cell1, cell2, iTracer, num_tracers, i, k
+      integer :: boundaryMask1, boundaryMask2, velMask
 
       integer, dimension(:), pointer :: maxLevelEdgeTop, nEdgesOnCell
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnCell, &amp;
                                           boundaryCell
 
-      real (kind=RKIND) :: flux, tracer_edge, d2fdx2_cell1, d2fdx2_cell2
+      real (kind=RKIND) :: flux, tracer_edge, d2fdx2_cell1, d2fdx2_cell2,invArea1, invArea2
 
       real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell
       real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
@@ -146,50 +147,48 @@
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
 
+         invArea1 = 1.0/areaCell(cell1)
+         invArea2 = 1.0/areaCell(cell2)
+
          do k=1,maxLevelEdgeTop(iEdge)
 
             d2fdx2_cell1 = 0.0
             d2fdx2_cell2 = 0.0
 
+            boundaryMask1 = .not.boundaryCell(k,cell1)
+            boundaryMask2 = .not.boundaryCell(k,cell2)
+
+            velMask = (.not.(u(k,iEdge) &gt; 0)) * 2 - 1
+
             do iTracer=1,num_tracers
 
                !-- if not a boundary cell
-               if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
+               d2fdx2_cell1 = deriv_two(1,1,iEdge) * tracers(iTracer,k,cell1) * boundaryMask1
+               d2fdx2_cell2 = deriv_two(1,2,iEdge) * tracers(iTracer,k,cell2) * boundaryMask2
 
-                  d2fdx2_cell1 = deriv_two(1,1,iEdge) * tracers(iTracer,k,cell1)
-                  d2fdx2_cell2 = deriv_two(1,2,iEdge) * tracers(iTracer,k,cell2)
+               !-- all edges of cell 1
+               do i=1,nEdgesOnCell(cell1)
+                  d2fdx2_cell1 = d2fdx2_cell1 + deriv_two(i+1,1,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell1)) * boundaryMask1
+               end do
 
-                  !-- all edges of cell 1
-                  do i=1,nEdgesOnCell(cell1)
-                     d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-                     deriv_two(i+1,1,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell1))
-                  end do
+               !-- all edges of cell 2
+               do i=1,nEdgesOnCell(cell2)
+                  d2fdx2_cell2 = d2fdx2_cell2 + deriv_two(i+1,2,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell2)) * boundaryMask2
+               end do
 
-                  !-- all edges of cell 2
-                  do i=1,nEdgesOnCell(cell2)
-                     d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-                     deriv_two(i+1,2,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell2))
-                  end do
-
-               endif
-
                !-- if u &gt; 0:
-               if (u(k,iEdge) &gt; 0) then
-                  flux = dvEdge(iEdge) * u(k,iEdge) * h_edge(k,iEdge) * (          &amp;
-                       0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))      &amp;
-                       -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                       -(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
+!               if (u(k,iEdge) &gt; 0) then
+!flux = dvEdge(iEdge) * u(k,iEdge) * h_edge(k,iEdge) * (0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2)) - (dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) &amp;
+!/ 12. -(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
                !-- else u &lt;= 0:
-               else
-                  flux = dvEdge(iEdge) *  u(k,iEdge) * h_edge(k,iEdge) * (          &amp;
-                       0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))      &amp;
-                       -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                       +(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
-               end if
+!               else
+flux = dvEdge(iEdge) * u(k,iEdge) * h_edge(k,iEdge) * (0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2)) - (dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) &amp; 
+/ 12. +velMask * (dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
+!               end if
 
                !-- update tendency
-               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux/areaCell(cell1)
-               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux/areaCell(cell2)
+               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux * invArea1
+               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux * invArea2
             enddo
          end do
       end do

Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv4.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv4.F        2011-10-17 18:18:50 UTC (rev 1095)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tracer_hadv4.F        2011-10-17 18:29:40 UTC (rev 1096)
@@ -107,11 +107,13 @@
       !-----------------------------------------------------------------
 
       integer :: iEdge, nEdges, cell1, cell2, iTracer, num_tracers, i, k
+      integer :: boundaryMask1, boundaryMask2
 
       integer, dimension(:), pointer :: maxLevelEdgeTop
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnCell, boundaryCell
 
       real (kind=RKIND) :: flux, tracer_edge, d2fdx2_cell1, d2fdx2_cell2
+      real (kind=RKIND) :: invArea1, invArea2
 
       real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell
       real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
@@ -148,35 +150,38 @@
             d2fdx2_cell1 = 0.0
             d2fdx2_cell2 = 0.0
 
+            boundaryMask1 = .not. boundaryCell(k, cell1)
+            boundaryMask2 = .not. boundaryCell(k, cell2)
+
             do iTracer=1,num_tracers
 
                !-- if not a boundary cell
-               if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
+!              if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
 
-                  d2fdx2_cell1 = deriv_two(1,1,iEdge) * tracers(iTracer,k,cell1)
-                  d2fdx2_cell2 = deriv_two(1,2,iEdge) * tracers(iTracer,k,cell2)
+                  d2fdx2_cell1 = deriv_two(1,1,iEdge) * tracers(iTracer,k,cell1) * boundaryMask1
+                  d2fdx2_cell2 = deriv_two(1,2,iEdge) * tracers(iTracer,k,cell2) * boundaryMask2
 
                   !-- all edges of cell 1
-                  do i=1, grid % nEdgesOnCell % array (cell1)
+                  do i=1, grid % nEdgesOnCell % array (cell1) * boundaryMask1
                      d2fdx2_cell1 = d2fdx2_cell1 + &amp;
                      deriv_two(i+1,1,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell1))
                   end do
 
                   !-- all edges of cell 2
-                  do i=1, grid % nEdgesOnCell % array (cell2)
+                  do i=1, grid % nEdgesOnCell % array (cell2) * boundaryMask2
                       d2fdx2_cell2 = d2fdx2_cell2 + &amp;
                       deriv_two(i+1,2,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell2))
                   end do
 
-               endif
+!              endif
 
                flux = dvEdge(iEdge) *  u(k,iEdge) * h_edge(k,iEdge) * (          &amp;
                     0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))      &amp;
                        -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12. )
 
                !-- update tendency
-               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux/areaCell(cell1)
-               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux/areaCell(cell2)
+               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux * invArea1
+               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux * invArea2
             enddo
          end do
       end do

</font>
</pre>