<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, &
maxLevelCell
@@ -123,12 +123,12 @@
real (kind=RKIND) :: u_diffusion, invAreaCell1, invAreaCell2, invAreaTri1, &
- invAreaTri2, invDcEdge, invDvEdge, r_tmp
+ invAreaTri2, invDcEdge, invDvEdge, r_tmp, delsq_u
real (kind=RKIND), dimension(:), pointer :: dcEdge, dvEdge, areaTriangle, &
meshScalingDel4, areaCell
real (kind=RKIND), dimension(:,:), allocatable :: delsq_divergence, &
- 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 => grid % maxLevelEdgeTop % array
@@ -151,34 +152,11 @@
edgeMask => 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) = &
- ( divergence(k,cell2) - divergence(k,cell1) ) * invDcEdge &
- -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 &
+ -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) = &
- ( divergence(k,cell2) - divergence(k,cell1) ) * invDcEdge &
- -( vorticity(k,vertex2) - vorticity(k,vertex1)) * invDvEdge
-
u_diffusion = (delsq_divergence(k,cell2) - delsq_divergence(k,cell1)) * invDcEdge &
-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>