<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, &
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) > 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 + &
- 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 + &
- deriv_two(i+1,2,iEdge) * tracers(iTracer,k,cellsOnCell(i,cell2))
- end do
-
- endif
-
!-- if u > 0:
- if (u(k,iEdge) > 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) / 12. &
- -(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
+! if (u(k,iEdge) > 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) &
+!/ 12. -(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
!-- else u <= 0:
- 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) / 12. &
- +(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) &
+/ 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 + &
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 + &
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) * ( &
0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2)) &
-(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>