<p><b>dwj07@fsu.edu</b> 2011-10-11 13:45:50 -0600 (Tue, 11 Oct 2011)</p><p><br>
  -- BRANCH COMMIT --<br>
<br>
  Lots of loop fusion in ocn_diagnostic_solve.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F        2011-10-11 17:36:58 UTC (rev 1058)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F        2011-10-11 19:45:50 UTC (rev 1059)
@@ -572,7 +572,7 @@
 
 
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j, cov
-      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, rho0Inv
+      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, rho0Inv, invAreaTri1, invAreaTri2, invAreaCell1, invAreaCell2
 
       integer :: nCells, nEdges, nVertices, nVertLevels, vertexDegree, fCoef, err
 
@@ -770,66 +770,45 @@
       tracers(s % index_temperature,:,nCells+1) = -1e34
       tracers(s % index_salinity,:,nCells+1) = -1e34
 
-      !
-      ! Compute circulation and relative vorticity at each vertex
-      !
       circulation(:,:) = 0.0
+      vorticity(:,:) = 0.0
+      divergence(:,:) = 0.0
+      ke(:,:) = 0.0
+      v(:,:) = 0.0
       do iEdge=1,nEdges
          vertex1 = verticesOnEdge(1,iEdge)
          vertex2 = verticesOnEdge(2,iEdge)
-         do k=1,maxLevelEdgeBot(iEdge)
-            circulation(k,vertex1) = circulation(k,vertex1) - dcEdge(iEdge) * u(k,iEdge)
-            circulation(k,vertex2) = circulation(k,vertex2) + dcEdge(iEdge) * u(k,iEdge)
-         end do
-      end do
-      do iVertex=1,nVertices
-         do k=1,maxLevelVertexBot(iVertex)
-            vorticity(k,iVertex) = circulation(k,iVertex) / areaTriangle(iVertex)
-         end do
-      end do
 
-      !
-      ! Compute the divergence at each cell center
-      !
-      divergence(:,:) = 0.0
-      do iEdge=1,nEdges
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
-         do k=1,maxLevelEdgeBot(iEdge)
-             divergence(k,cell1) = divergence(k,cell1) + u(k,iEdge)*dvEdge(iEdge)
-             divergence(k,cell2) = divergence(k,cell2) - u(k,iEdge)*dvEdge(iEdge)
-         enddo
-      end do
-      do iCell = 1,nCells
-         r = 1.0 / areaCell(iCell)
-         do k = 1,maxLevelCell(iCell)
-            divergence(k,iCell) = divergence(k,iCell) * r
-         enddo
-      enddo
 
-      !
-      ! Compute kinetic energy in each cell
-      !
-      ke(:,:) = 0.0
-      do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+         invAreaTri1 = 1.0 / areaTriangle(vertex1)
+         invAreaTri2 = 1.0 / areaTriangle(vertex2)
+
+         invAreaCell1 = 1.0 / areaCell(cell1)
+         invAreaCell2 = 1.0 / areaCell(cell2)
          do k=1,maxLevelEdgeBot(iEdge)
-              ke(k,cell1) = ke(k,cell1) + 0.25 * dcEdge(iEdge) * dvEdge(iEdge) * u(k,iEdge)**2.0
-              ke(k,cell2) = ke(k,cell2) + 0.25 * dcEdge(iEdge) * dvEdge(iEdge) * u(k,iEdge)**2.0
-         enddo
-      end do
-      do iCell = 1,nCells
-         do k = 1,maxLevelCell(iCell)
-            ke(k,iCell) = ke(k,iCell) / areaCell(iCell)
-         enddo
-      enddo
 
-      !
-      ! Compute v (tangential) velocities
-      !
-      v(:,:) = 0.0
-      do iEdge = 1,nEdges
+            ! Compute circulation and relative vorticity at each vertex
+            r = dcEdge(iEdge) * u(k,iEdge)
+            circulation(k,vertex1) = circulation(k,vertex1) - r
+            circulation(k,vertex2) = circulation(k,vertex2) + r
+
+            vorticity(k,vertex1) = vorticity(k,vertex1) - r * invAreaTri1
+            vorticity(k,vertex2) = vorticity(k,vertex2) + r * invAreaTri2
+
+            ! Compute the divergence at each cell center
+            r = dvEdge(iEdge) * u(k,iEdge)
+            divergence(k,cell1) = divergence(k,cell1) + r * invAreaCell1
+            divergence(k,cell2) = divergence(k,cell2) - r * invAreaCell2
+
+            ! Compute kinetic energy in each cell
+            r = r * u(k, iEdge) * dcEdge(iEdge)
+            ke(k,cell1) = ke(k,cell1) + 0.25 * r * invAreaCell1
+            ke(k,cell2) = ke(k,cell2) + 0.25 * r * invAreaCell2
+         end do
+
+         ! Compute v (tangential) velocities
          do i=1,nEdgesOnEdge(iEdge)
             eoe = edgesOnEdge(i,iEdge)
             ! mrp 101115 note: in order to include flux boundary conditions,
@@ -838,6 +817,7 @@
                v(k,iEdge) = v(k,iEdge) + weightsOnEdge(i,iEdge) * u(k, eoe)
             end do
          end do
+
       end do
 
       !
@@ -882,12 +862,11 @@
          end do
       end do
 
-      !
-      ! Compute pv at cell centers
-      !    ( this computes pv_cell for all real cells and distance-1 ghost cells )
-      !
       pv_cell(:,:) = 0.0
+      pv_edge(:,:) = 0.0
       do iVertex = 1,nVertices
+         ! Compute pv at cell centers
+         !    ( this computes pv_cell for all real cells and distance-1 ghost cells )
          do i=1,vertexDegree
             iCell = cellsOnVertex(i,iVertex)
             do k = 1,maxLevelCell(iCell)
@@ -896,21 +875,16 @@
                     / areaCell(iCell)
             enddo
          enddo
-      enddo
 
-      !
-      ! Compute pv at the edges
-      !   ( this computes pv_edge at all edges bounding real cells )
-      !
-      pv_edge(:,:) = 0.0
-      do iVertex = 1,nVertices
+         ! Compute pv at the edges
+         !   ( this computes pv_edge at all edges bounding real cells )
          do i=1,vertexDegree
             iEdge = edgesOnVertex(i,iVertex)
             do k=1,maxLevelEdgeBot(iEdge)
                pv_edge(k,iEdge) =  pv_edge(k,iEdge) + 0.5 * pv_vertex(k,iVertex)
             enddo
         end do
-      end do
+      enddo
 
       !
       ! Compute gradient of PV in normal direction
@@ -923,25 +897,18 @@
                                 - pv_cell(k,cellsOnEdge(1,iEdge))) &amp;
                                / dcEdge(iEdge)
          enddo
-      enddo
 
       !
       ! Compute gradient of PV in the tangent direction
       !   ( this computes gradPVt at all edges bounding real cells and distance-1 ghost cells )
       !
-      do iEdge = 1,nEdges
          do k = 1,maxLevelEdgeBot(iEdge)
            gradPVt(k,iEdge) = (  pv_vertex(k,verticesOnEdge(2,iEdge)) &amp;
                                - pv_vertex(k,verticesOnEdge(1,iEdge))) &amp;
                                  /dvEdge(iEdge)
-         enddo
-      enddo
-
       !
       ! Modify PV edge with upstream bias.
       !
-      do iEdge = 1,nEdges
-         do k = 1,maxLevelEdgeBot(iEdge)
            pv_edge(k,iEdge) = pv_edge(k,iEdge) &amp;
              - 0.5 * dt* (  u(k,iEdge) * gradPVn(k,iEdge) &amp;
                           + v(k,iEdge) * gradPVt(k,iEdge) )

</font>
</pre>