<p><b>ringler@lanl.gov</b> 2010-12-09 20:15:31 -0700 (Thu, 09 Dec 2010)</p><p><br>
change order of operations in computation of coriolis force<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/profiling/src/core_ocean/module_time_integration.F
===================================================================
--- branches/ocean_projects/profiling/src/core_ocean/module_time_integration.F        2010-12-09 23:42:58 UTC (rev 643)
+++ branches/ocean_projects/profiling/src/core_ocean/module_time_integration.F        2010-12-10 03:15:31 UTC (rev 644)
@@ -250,6 +250,7 @@
!
! A little clean up at the end: decouple new scalar fields and compute diagnostics for new state
!
+ call timer_start("ts_rk4_cleanup")
block => domain % blocklist
do while (associated(block))
do iCell=1,block % mesh % nCells
@@ -270,6 +271,7 @@
block => block % next
end do
+ call timer_stop("ts_rk4_cleanup")
call deallocate_state(provis)
@@ -322,6 +324,7 @@
real (kind=RKIND), dimension(:,:), pointer :: u_src
real (kind=RKIND), parameter :: rho_ref = 1000.0
+ real (kind=RKIND), allocatable :: qq(:)
call timer_start("ts_rk4_stage_tend_hu_pointer")
h => s % h % array
@@ -338,28 +341,28 @@
MontPot => s % MontPot % array
pressure => s % pressure % array
- weightsOnEdge => grid % weightsOnEdge % array
- kiteAreasOnVertex => grid % kiteAreasOnVertex % array
- cellsOnEdge => grid % cellsOnEdge % array
- cellsOnVertex => grid % cellsOnVertex % array
- verticesOnEdge => grid % verticesOnEdge % array
- nEdgesOnCell => grid % nEdgesOnCell % array
- edgesOnCell => grid % edgesOnCell % array
- nEdgesOnEdge => grid % nEdgesOnEdge % array
- edgesOnEdge => grid % edgesOnEdge % array
- edgesOnVertex => grid % edgesOnVertex % array
- dcEdge => grid % dcEdge % array
- dvEdge => grid % dvEdge % array
- areaCell => grid % areaCell % array
- areaTriangle => grid % areaTriangle % array
- h_s => grid % h_s % array
- fVertex => grid % fVertex % array
- fEdge => grid % fEdge % array
- zMidZLevel => grid % zMidZLevel % array
- zTopZLevel => grid % zTopZLevel % array
- maxLevelCell => grid % maxLevelCell % array
- maxLevelEdgeTop => grid % maxLevelEdgeTop % array
- maxLevelVertexBot => grid % maxLevelVertexBot % array
+ weightsOnEdge => grid % weightsOnEdge % array
+ kiteAreasOnVertex => grid % kiteAreasOnVertex % array
+ cellsOnEdge => grid % cellsOnEdge % array
+ cellsOnVertex => grid % cellsOnVertex % array
+ verticesOnEdge => grid % verticesOnEdge % array
+ nEdgesOnCell => grid % nEdgesOnCell % array
+ edgesOnCell => grid % edgesOnCell % array
+ nEdgesOnEdge => grid % nEdgesOnEdge % array
+ edgesOnEdge => grid % edgesOnEdge % array
+ edgesOnVertex => grid % edgesOnVertex % array
+ dcEdge => grid % dcEdge % array
+ dvEdge => grid % dvEdge % array
+ areaCell => grid % areaCell % array
+ areaTriangle => grid % areaTriangle % array
+ h_s => grid % h_s % array
+ fVertex => grid % fVertex % array
+ fEdge => grid % fEdge % array
+ zMidZLevel => grid % zMidZLevel % array
+ zTopZLevel => grid % zTopZLevel % array
+ maxLevelCell => grid % maxLevelCell % array
+ maxLevelEdgeTop => grid % maxLevelEdgeTop % array
+ maxLevelVertexBot => grid % maxLevelVertexBot % array
tend_h => tend % h % array
tend_u => tend % u % array
@@ -371,6 +374,7 @@
nVertLevels = grid % nVertLevels
u_src => grid % u_src % array
+ allocate(qq(nVertLevels)
call timer_stop("ts_rk4_stage_tend_hu_pointer")
@@ -614,27 +618,54 @@
!
! velocity tendency: nonlinear Coriolis term and grad of kinetic energy
!
+ ! call timer_start("ts_rk4_stage_tend_hu_u_coriolis")
+ ! do iEdge=1,grid % nEdgesSolve
+ ! cell1 = cellsOnEdge(1,iEdge)
+ ! cell2 = cellsOnEdge(2,iEdge)
+ !
+ ! do k=1,maxLevelEdgeTop(iEdge)
+ !
+ ! q = 0.0
+ ! do j = 1,nEdgesOnEdge(iEdge)
+ ! eoe = edgesOnEdge(j,iEdge)
+ ! workpv = 0.5 * (pv_edge(k,iEdge) + pv_edge(k,eoe))
+ ! q = q + weightsOnEdge(j,iEdge) * u(k,eoe) * workpv * h_edge(k,eoe)
+ ! end do
+ ! tend_u(k,iEdge) = tend_u(k,iEdge) &
+ ! + q &
+ ! - ( ke(k,cell2) - ke(k,cell1) ) / dcEdge(iEdge)
+ !
+ ! end do
+ ! end do
+ ! call timer_stop("ts_rk4_stage_tend_hu_u_coriolis")
+
call timer_start("ts_rk4_stage_tend_hu_u_coriolis")
do iEdge=1,grid % nEdgesSolve
cell1 = cellsOnEdge(1,iEdge)
cell2 = cellsOnEdge(2,iEdge)
+ qq(:) = 0.0
+ do j = 1,nEdgesOnEdge(iEdge)
+ eoe = edgesOnEdge(j,iEdge)
+
+ do k=1,maxLevelEdgeTop(iEdge)
+ workpv = 0.5 * (pv_edge(k,iEdge) + pv_edge(k,eoe))
+ qq(k) = qq(k) + weightsOnEdge(j,iEdge) * u(k,eoe) * workpv * h_edge(k,eoe)
+ enddo
+
+ end do
+
do k=1,maxLevelEdgeTop(iEdge)
-
- q = 0.0
- do j = 1,nEdgesOnEdge(iEdge)
- eoe = edgesOnEdge(j,iEdge)
- workpv = 0.5 * (pv_edge(k,iEdge) + pv_edge(k,eoe))
- q = q + weightsOnEdge(j,iEdge) * u(k,eoe) * workpv * h_edge(k,eoe)
- end do
tend_u(k,iEdge) = tend_u(k,iEdge) &
- + q &
+ + qq(k) &
- ( ke(k,cell2) - ke(k,cell1) ) / dcEdge(iEdge)
end do
+
end do
call timer_stop("ts_rk4_stage_tend_hu_u_coriolis")
+
!
! velocity tendency: forcing and bottom drag
!
@@ -722,6 +753,8 @@
call timer_stop("ts_rk4_stage_tend_hu_u_vmix")
call timer_stop("ts_rk4_stage_tend_hu_u")
+ deallocate(qq)
+
end subroutine compute_tend
</font>
</pre>