<p><b>dwj07@fsu.edu</b> 2011-11-04 12:53:55 -0600 (Fri, 04 Nov 2011)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Loop masking in ocn_diagnostic_solve.<br>
<br>
        Also, added a routine to mpas_ocn_tendency to intialize flags used for loop masking, and ke cell/vertex computations.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F        2011-11-04 18:11:18 UTC (rev 1170)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F        2011-11-04 18:53:55 UTC (rev 1171)
@@ -83,6 +83,9 @@
       call ocn_equation_of_state_init(err_tmp)
       err = err .or. err_tmp
 
+      call ocn_tendency_init(err_tmp)
+      err = err .or. err_tmp
+
       if(err.eq.1) then
           call mpas_dmpar_abort(dminfo)
       endif

Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F        2011-11-04 18:11:18 UTC (rev 1170)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F        2011-11-04 18:53:55 UTC (rev 1171)
@@ -64,7 +64,8 @@
              ocn_tend_scalar, &amp;
              ocn_diagnostic_solve, &amp;
              ocn_wtop, &amp;
-             ocn_fuperp
+             ocn_fuperp, &amp;
+             ocn_tendency_init
 
    !--------------------------------------------------------------------
    !
@@ -72,7 +73,11 @@
    !
    !--------------------------------------------------------------------
 
+   integer :: hadv2nd, hadv3rd, hadv4th
+   integer :: ke_cell_flag, ke_vertex_flag
+   real (kind=RKIND) ::  coef_3rd_order, fCoef
 
+
 !***********************************************************************
 
 contains
@@ -416,7 +421,7 @@
 
 
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j
-      integer :: boundaryMask, velMask, nCells, nEdges, nVertices, nVertLevels, vertexDegree, fCoef, err
+      integer :: boundaryMask, velMask, nCells, nEdges, nVertices, nVertLevels, vertexDegree, err
 
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge, &amp;
         maxLevelCell, maxLevelEdgeTop, maxLevelEdgeBot, &amp;
@@ -426,6 +431,8 @@
 
       real (kind=RKIND) :: d2fdx2_cell1, d2fdx2_cell2, coef_3rd_order, r_tmp, invAreaCell1, invAreaCell2, invAreaTri1, invAreaTri2, invLength, h_vertex
 
+      real (kind=RKIND), dimension(:), allocatable:: pTop
+
       real (kind=RKIND), dimension(:), pointer :: &amp;
         h_s, fVertex, dvEdge, dcEdge, areaCell, areaTriangle, &amp;
         hZLevel
@@ -435,7 +442,6 @@
         pv_edge, pv_vertex, pv_cell, gradPVn, gradPVt, divergence, &amp;
         rho, temperature, salinity, kev, kevc
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers, deriv_two
-      real (kind=RKIND), dimension(:), allocatable:: pTop
       real (kind=RKIND), dimension(:,:), allocatable:: div_u
       character :: c1*6
 
@@ -499,12 +505,12 @@
       ! mrp 110516 efficiency note: For z-level, only do this on level 1.  h_edge for all
       ! lower levels is defined by hZlevel.
 
-      coef_3rd_order = 0.
-      if (config_thickness_adv_order == 3) coef_3rd_order = 1.0
-      if (config_thickness_adv_order == 3 .and. config_monotonic) coef_3rd_order = 0.25
+!     coef_3rd_order = 0.
+!     if (config_thickness_adv_order == 3) coef_3rd_order = 1.0
+!     if (config_thickness_adv_order == 3 .and. config_monotonic) coef_3rd_order = 0.25
 
-      if (config_thickness_adv_order == 2) then
-         do iEdge=1,nEdges
+!     if (config_thickness_adv_order == 2) then
+         do iEdge=1,nEdges*hadv2nd
             cell1 = cellsOnEdge(1,iEdge)
             cell2 = cellsOnEdge(2,iEdge)
             do k=1,maxLevelEdgeTop(iEdge)
@@ -512,9 +518,9 @@
             end do
          end do
 
-      else if (config_thickness_adv_order == 3) then
+!     else if (config_thickness_adv_order == 3) then
 
-         do iEdge=1,nEdges
+         do iEdge=1,nEdges*hadv3rd
             cell1 = cellsOnEdge(1,iEdge)
             cell2 = cellsOnEdge(2,iEdge)
 
@@ -548,9 +554,9 @@
             end do   ! do k
          end do         ! do iEdge
 
-      else  if (config_thickness_adv_order == 4) then
+!     else  if (config_thickness_adv_order == 4) then
 
-         do iEdge=1,nEdges
+         do iEdge=1,nEdges*hadv4th
             cell1 = cellsOnEdge(1,iEdge)
             cell2 = cellsOnEdge(2,iEdge)
 
@@ -583,7 +589,7 @@
             end do   ! do k
          end do         ! do iEdge
 
-      endif   ! if(config_thickness_adv_order == 2)
+!     endif   ! if(config_thickness_adv_order == 2)
 
       !
       ! set the velocity and height at dummy address
@@ -649,22 +655,24 @@
       ! Compute kinetic energy in each vertex
       !
       kev(:,:) = 0.0; kevc(:,:) = 0.0
-      do iEdge=1,nEdges
+      do iEdge=1,nEdges*ke_vertex_flag
          do k=1,nVertLevels
-            kev(k,verticesOnEdge(1,iEdge)) = kev(k,verticesOnEdge(1,iEdge)) + dcEdge(iEdge) * dvEdge(iEdge) * u(k,iEdge)**2
-            kev(k,verticesOnEdge(2,iEdge)) = kev(k,verticesOnEdge(2,iEdge)) + dcEdge(iEdge) * dvEdge(iEdge) * u(k,iEdge)**2
+            r_tmp = dcEdge(iEdge) * dvEdge(iEdge) * u(k, iEdge)**2
+            kev(k,verticesOnEdge(1,iEdge)) = kev(k,verticesOnEdge(1,iEdge)) + r_tmp
+            kev(k,verticesOnEdge(2,iEdge)) = kev(k,verticesOnEdge(2,iEdge)) + r_tmp
          end do
       end do
-      do iVertex = 1,nVertices
+      do iVertex = 1,nVertices*ke_vertex_flag
          do k=1,nVertLevels
-           kev(k,iVertex) = kev(k,iVertex) / areaTriangle(iVertex) / 4.0
+           kev(k,iVertex) = kev(k,iVertex) / areaTriangle(iVertex) * 0.25
          enddo
       enddo
-      do iVertex = 1, nVertices
+      do iVertex = 1, nVertices*ke_vertex_flag
        do i=1,grid % vertexDegree
          iCell = cellsOnVertex(i,iVertex)
+         invAreaCell1 = 1.0 / areaCell(iCell)
          do k=1,nVertLevels
-           kevc(k,iCell) = kevc(k,iCell) + kiteAreasOnVertex(i, iVertex) * kev(k, iVertex) / areaCell(iCell)
+           kevc(k,iCell) = kevc(k,iCell) + kiteAreasOnVertex(i, iVertex) * kev(k, iVertex) * invAreaCell1
          enddo
        enddo
       enddo
@@ -672,20 +680,17 @@
       !
       ! Compute kinetic energy in each cell by blending ke and kevc
       !
-      if(config_include_KE_vertex) then
-      do iCell=1,nCells
+      do iCell=1,nCells*ke_vertex_flag
          do k=1,nVertLevels
             ke(k,iCell) = 5.0/8.0*ke(k,iCell) + 3.0/8.0*kevc(k,iCell)
          end do
       end do
-      endif
 
       !
       ! Compute ke on cell edges at velocity locations for quadratic bottom drag. 
       !
       ! mrp 101025 efficiency note: we could get rid of ke_edge completely by 
       ! using sqrt(u(k,iEdge)**2 + v(k,iEdge)**2) in its place elsewhere.
-      ke_edge = 0.0  !mrp remove 0 for efficiency
       do iEdge=1,nEdges
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
@@ -698,25 +703,14 @@
       ! Compute height at vertices, pv at vertices, and average pv to edge locations
       !  ( this computes pv_vertex at all vertices bounding real cells and distance-1 ghost cells )
       !
-      if (trim(config_time_integration) == 'RK4') then
-         ! for RK4, PV is really PV = (eta+f)/h
-         fCoef = 1
-      elseif (trim(config_time_integration) == 'split_explicit' &amp;
-          .or.trim(config_time_integration) == 'unsplit_explicit') then
-         ! for split explicit, PV is eta/h because f is added separately to the momentum forcing.
-! mrp temp, new should be:
-         fCoef = 0
-! old, for testing:
-!         fCoef = 1
-      end if
-
       do iVertex = 1,nVertices
+         invAreaTri1 = 1.0 / areaTriangle(iVertex)
          do k=1,maxLevelVertexBot(iVertex)
             h_vertex = 0.0
             do i=1,vertexDegree
                h_vertex = h_vertex + h(k,cellsOnVertex(i,iVertex)) * kiteAreasOnVertex(i,iVertex)
             end do
-            h_vertex = h_vertex / areaTriangle(iVertex)
+            h_vertex = h_vertex * invAreaTri1
 
             pv_vertex(k,iVertex) = (fCoef*fVertex(iVertex) + vorticity(k,iVertex)) / h_vertex
          end do
@@ -745,8 +739,8 @@
          enddo
       enddo
 
-      gradPVn(:,:) = 0.0
-      gradPVt(:,:) = 0.0
+!     gradPVn(:,:) = 0.0
+!     gradPVt(:,:) = 0.0
       do iEdge = 1,nEdges
          cell1 = cellsOnEdge(1, iEdge)
          cell2 = cellsOnEdge(2, iEdge)
@@ -1036,7 +1030,71 @@
    end subroutine ocn_fuperp!}}}
 
 !***********************************************************************
+!
+!  routine ocn_tendency_init
+!
+!&gt; \brief   Initializes flags used within tendency routines.
+!&gt; \author  Doug Jacobsen
+!&gt; \date    4 November 2011
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine initializes flags related to quantities computed within
+!&gt;  other tendency routines.
+!
+!-----------------------------------------------------------------------
 
+    subroutine ocn_tendency_init(err)!{{{
+        integer, intent(out) :: err
+
+        err = 0
+
+        coef_3rd_order = 0.
+
+        if (config_thickness_adv_order == 2) then
+            hadv2nd = 1
+            hadv3rd = 0
+            hadv4th = 0
+        else if (config_thickness_adv_order == 3) then
+            hadv2nd = 0
+            hadv3rd = 1
+            hadv4th = 0
+
+            if(config_monotonic) then
+                coef_3rd_order = 0.25
+            else
+                coef_3rd_order = 1.0
+            endif
+        else if (config_thickness_adv_order == 4) then
+            hadv2nd = 0
+            hadv3rd = 0
+            hadv4th = 1
+        end if
+
+
+        if(config_include_KE_vertex) then
+            ke_vertex_flag = 1
+            ke_cell_flag = 0
+        else
+            ke_vertex_flag = 0
+            ke_cell_flag = 1
+        endif
+
+        if (trim(config_time_integration) == 'RK4') then
+            ! for RK4, PV is really PV = (eta+f)/h
+            fCoef = 1
+        elseif (trim(config_time_integration) == 'split_explicit' &amp;
+          .or.trim(config_time_integration) == 'unsplit_explicit') then
+            ! for split explicit, PV is eta/h because f is added separately to the momentum forcing.
+            ! mrp temp, new should be:
+            fCoef = 0
+            ! old, for testing:
+            !         fCoef = 1
+        end if
+
+    end subroutine ocn_tendency_init!}}}
+
+!***********************************************************************
+
 end module ocn_tendency
 
 !|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

</font>
</pre>