<p><b>dwj07@fsu.edu</b> 2012-01-04 15:45:33 -0700 (Wed, 04 Jan 2012)</p><p>    -- BRANCH COMMIT --<br>
<br>
        Removing the computation of delsq_circulation from the del4 routine.<br>
<br>
        Changing delsq_u to be a scalar instead of an array to remove the cost of allocation, initialization, and deallocation.<br>
<br>
        Fusing the loops for delsq_u, delsq_vorticity, and delsq_divergence.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_rk4.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_rk4.F        2012-01-04 14:44:58 UTC (rev 1293)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_rk4.F        2012-01-04 22:45:33 UTC (rev 1294)
@@ -24,7 +24,7 @@
    use ocn_tendency
 
    use ocn_equation_of_state
-   use ocn_Vmix
+   use ocn_vmix
 
    implicit none
    private

Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del4.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del4.F        2012-01-04 14:44:58 UTC (rev 1293)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del4.F        2012-01-04 22:45:33 UTC (rev 1294)
@@ -113,9 +113,9 @@
       !
       !-----------------------------------------------------------------
 
-      integer :: iEdge, nEdges, cell1, cell2, vertex1, vertex2, k
+      integer :: iEdge, cell1, cell2, vertex1, vertex2, k
       integer :: iCell, iVertex
-      integer :: nVertices, nVertLevels, nCells
+      integer :: nVertices, nVertLevels, nCells, nEdges, nEdgesSolve
 
       integer, dimension(:), pointer :: maxLevelEdgeTop, maxLevelVertexBot, &amp;
             maxLevelCell
@@ -123,12 +123,12 @@
 
 
       real (kind=RKIND) :: u_diffusion, invAreaCell1, invAreaCell2, invAreaTri1, &amp;
-            invAreaTri2, invDcEdge, invDvEdge, r_tmp
+            invAreaTri2, invDcEdge, invDvEdge, r_tmp, delsq_u
       real (kind=RKIND), dimension(:), pointer :: dcEdge, dvEdge, areaTriangle, &amp;
             meshScalingDel4, areaCell
 
       real (kind=RKIND), dimension(:,:), allocatable :: delsq_divergence, &amp;
-            delsq_u, delsq_circulation, delsq_vorticity
+            delsq_circulation, delsq_vorticity
 
       err = 0
 
@@ -136,6 +136,7 @@
 
       nCells = grid % nCells
       nEdges = grid % nEdges
+      nEdgesSolve = grid % nEdgessolve
       nVertices = grid % nVertices
       nVertLevels = grid % nVertLevels
       maxLevelEdgeTop =&gt; grid % maxLevelEdgeTop % array
@@ -151,34 +152,11 @@
       edgeMask =&gt; grid % edgeMask % array
 
       allocate(delsq_divergence(nVertLevels, nCells+1))
-      allocate(delsq_u(nVertLevels, nEdges+1))
-      allocate(delsq_circulation(nVertLevels, nVertices+1))
       allocate(delsq_vorticity(nVertLevels, nVertices+1))
 
-      delsq_u(:,:) = 0.0
-      delsq_circulation(:,:) = 0.0
       delsq_vorticity(:,:) = 0.0
       delsq_divergence(:,:) = 0.0
 
-      ! Compute </font>
<font color="black">abla^2 u = </font>
<font color="black">abla divergence + k \times </font>
<font color="gray">abla vorticity
-      do iEdge=1,grid % nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
-         vertex1 = verticesOnEdge(1,iEdge)
-         vertex2 = verticesOnEdge(2,iEdge)
-
-         invDcEdge = 1.0 / dcEdge(iEdge)
-         invDvEdge = 1.0 / dvEdge(iEdge)
-
-         do k=1,maxLevelEdgeTop(iEdge)
-
-            delsq_u(k,iEdge) = &amp; 
-                              ( divergence(k,cell2)  - divergence(k,cell1) ) * invDcEdge  &amp;
-               -viscVortCoef *( vorticity(k,vertex2) - vorticity(k,vertex1)) * invDvEdge
-
-         end do
-      end do
-
       do iEdge=1,nEdges
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
@@ -192,27 +170,29 @@
          invAreaCell1 = 1.0 / areaCell(cell1)
          invAreaCell2 = 1.0 / areaCell(cell2)
 
+         invDcEdge = 1.0 / dcEdge(iEdge)
+         invDvEdge = 1.0 / dvEdge(iEdge)
+
          do k=1,maxLevelEdgeTop(iEdge)
-            ! vorticity using </font>
<font color="red">abla^2 u
-            r_tmp = dcEdge(iEdge) * delsq_u(k,iEdge)
+            ! Compute </font>
<font color="black">abla^2 u = </font>
<font color="black">abla divergence + k \times </font>
<font color="red">abla vorticity
+            delsq_u =          ( divergence(k,cell2)  - divergence(k,cell1) ) * invDcEdge  &amp;
+                -viscVortCoef *( vorticity(k,vertex2) - vorticity(k,vertex1)) * invDvEdge 
 
-            delsq_circulation(k,vertex1) = delsq_circulation(k,vertex1) - r_tmp
-            delsq_circulation(k,vertex2) = delsq_circulation(k,vertex2) + r_tmp
-
+            ! vorticity using </font>
<font color="blue">abla^2 u
+            r_tmp = dcEdge(iEdge) * delsq_u
             delsq_vorticity(k,vertex1) = delsq_vorticity(k,vertex1) - r_tmp * invAreaTri1
             delsq_vorticity(k,vertex2) = delsq_vorticity(k,vertex2) + r_tmp * invAreaTri2
 
             ! Divergence using </font>
<font color="red">abla^2 u
-            r_tmp = dvEdge(iEdge) * delsq_u(k,iEdge)
+            r_tmp = dvEdge(iEdge) * delsq_u
             delsq_divergence(k, cell1) = delsq_divergence(k,cell1) + r_tmp * invAreaCell1
             delsq_divergence(k, cell2) = delsq_divergence(k,cell2) - r_tmp * invAreaCell2
-
          end do
       end do
 
       ! Compute - \kappa </font>
<font color="black">abla^4 u 
       ! as  </font>
<font color="black">abla div(</font>
<font color="black">abla^2 u) + k \times </font>
<font color="black">abla ( k \cross curl(</font>
<font color="gray">abla^2 u) )
-      do iEdge=1,grid % nEdgesSolve
+      do iEdge=1,nEdgesSolve
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
          vertex1 = verticesOnEdge(1,iEdge)
@@ -223,10 +203,6 @@
          r_tmp = meshScalingDel4(iEdge) * eddyVisc4
 
          do k=1,maxLevelEdgeTop(iEdge)
-            delsq_u(k,iEdge) = &amp; 
-               ( divergence(k,cell2)  - divergence(k,cell1) ) * invDcEdge  &amp;
-              -( vorticity(k,vertex2) - vorticity(k,vertex1)) * invDvEdge
-
             u_diffusion = (delsq_divergence(k,cell2) - delsq_divergence(k,cell1)) * invDcEdge  &amp;
                 -viscVortCoef * (delsq_vorticity(k,vertex2) - delsq_vorticity(k,vertex1) ) * invDvEdge
 
@@ -235,8 +211,6 @@
       end do
 
       deallocate(delsq_divergence)
-      deallocate(delsq_u)
-      deallocate(delsq_circulation)
       deallocate(delsq_vorticity)
 
    !--------------------------------------------------------------------

</font>
</pre>