<p><b>dwj07@fsu.edu</b> 2011-10-27 12:44:03 -0600 (Thu, 27 Oct 2011)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Removing enforce_boundaryEdge.<br>
<br>
        Replacing with a mask on all velocity tendency computations.<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-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_tendency.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -519,7 +519,7 @@
d2fdx2_cell1 = 0.0
d2fdx2_cell2 = 0.0
- boundaryMask = .not.(boundaryCell(k,cell1) == 0 .and. boundaryCell(k,cell2) == 0)
+ boundaryMask = abs(transfer(.not.(boundaryCell(k,cell1) == 0 .and. boundaryCell(k,cell2) == 0), boundaryMask))
d2fdx2_cell1 = deriv_two(1,1,iEdge) * h(k,cell1) * boundaryMask
d2fdx2_cell2 = deriv_two(1,2,iEdge) * h(k,cell2) * boundaryMask
@@ -536,7 +536,7 @@
deriv_two(i+1,2,iEdge) * h(k,grid % CellsOnCell % array (i,cell2))
end do
- velMask = 2*(u(k,iEdge) <= 0) - 1
+ velMask = 2*(abs(transfer(u(k,iEdge) <= 0, velMask))) - 1
h_edge(k,iEdge) = 0.5*(h(k,cell1) + h(k,cell2)) - (dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12. &
+ velMask * (dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12.
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        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_rk4.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -178,7 +178,6 @@
endif
call ocn_tend_scalar(block % tend, provis, block % diagnostics, block % mesh)
- call enforce_boundaryEdge(block % tend, block % mesh)
block => block % next
end do
call mpas_timer_stop("RK4-tendency computations")
@@ -607,51 +606,6 @@
end subroutine filter_btr_mode_u!}}}
- subroutine enforce_boundaryEdge(tend, grid)!{{{
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! Enforce any boundary conditions on the normal velocity at each edge
- !
- ! Input: grid - grid metadata
- !
- ! Output: tend_u set to zero at boundaryEdge == 1 locations
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
- implicit none
-
- type (tend_type), intent(inout) :: tend
- type (mesh_type), intent(in) :: grid
-
- integer, dimension(:,:), pointer :: boundaryEdge
- real (kind=RKIND), dimension(:,:), pointer :: tend_u
- integer :: nCells, nEdges, nVertices, nVertLevels
- integer :: iEdge, k
-
- call mpas_timer_start("enforce_boundaryEdge")
-
- nCells = grid % nCells
- nEdges = grid % nEdges
- nVertices = grid % nVertices
- nVertLevels = grid % nVertLevels
-
- boundaryEdge => grid % boundaryEdge % array
- tend_u => tend % u % array
-
- if(maxval(boundaryEdge).le.0) return
-
- do iEdge = 1,nEdges
- do k = 1,nVertLevels
-
- if(boundaryEdge(k,iEdge).eq.1) then
- tend_u(k,iEdge) = 0.0
- endif
-
- enddo
- enddo
- call mpas_timer_stop("enforce_boundaryEdge")
-
- end subroutine enforce_boundaryEdge!}}}
-
end module ocn_time_integration_rk4
! vim: foldmethod=marker
Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_split.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_split.F        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_time_integration_split.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -190,7 +190,6 @@
call ocn_vmix_coefs(block % mesh, block % state % time_levs(2) % state, block % diagnostics, err)
end if
call ocn_tend_u(block % tend, block % state % time_levs(2) % state , block % diagnostics, block % mesh)
- call enforce_boundaryEdge(block % tend, block % mesh)
block => block % next
end do
@@ -1501,51 +1500,6 @@
end subroutine filter_btr_mode_u!}}}
- subroutine enforce_boundaryEdge(tend, grid)!{{{
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! Enforce any boundary conditions on the normal velocity at each edge
- !
- ! Input: grid - grid metadata
- !
- ! Output: tend_u set to zero at boundaryEdge == 1 locations
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
- implicit none
-
- type (tend_type), intent(inout) :: tend
- type (mesh_type), intent(in) :: grid
-
- integer, dimension(:,:), pointer :: boundaryEdge
- real (kind=RKIND), dimension(:,:), pointer :: tend_u
- integer :: nCells, nEdges, nVertices, nVertLevels
- integer :: iEdge, k
-
- call mpas_timer_start("enforce_boundaryEdge")
-
- nCells = grid % nCells
- nEdges = grid % nEdges
- nVertices = grid % nVertices
- nVertLevels = grid % nVertLevels
-
- boundaryEdge => grid % boundaryEdge % array
- tend_u => tend % u % array
-
- if(maxval(boundaryEdge).le.0) return
-
- do iEdge = 1,nEdges
- do k = 1,nVertLevels
-
- if(boundaryEdge(k,iEdge).eq.1) then
- tend_u(k,iEdge) = 0.0
- endif
-
- enddo
- enddo
- call mpas_timer_stop("enforce_boundaryEdge")
-
- end subroutine enforce_boundaryEdge!}}}
-
end module ocn_time_integration_split
! vim: foldmethod=marker
Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_forcing_bottomdrag.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_forcing_bottomdrag.F        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_forcing_bottomdrag.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -109,6 +109,7 @@
integer :: iEdge, nEdgesSolve, k
integer, dimension(:), pointer :: maxLevelEdgeTop
+ integer, dimension(:,:), pointer :: edgeMask
!-----------------------------------------------------------------
!
@@ -124,6 +125,7 @@
nEdgesSolve = grid % nEdgesSolve
maxLevelEdgeTop => grid % maxLevelEdgeTop % array
+ edgeMask => grid % edgeMask % array
do iEdge=1,grid % nEdgesSolve
@@ -139,9 +141,7 @@
! -c |u| u where c is unitless and 1.0e-3.
! see POP Reference guide, section 3.4.4.
- tend(k,iEdge) = tend(k,iEdge) &
- -bottomDragCoef*u(k,iEdge) &
- *sqrt(2.0*ke_edge(k,iEdge))/h_edge(k,iEdge)
+ tend(k,iEdge) = tend(k,iEdge)-edgeMask(k,iEdge)*(bottomDragCoef*u(k,iEdge)*sqrt(2.0*ke_edge(k,iEdge))/h_edge(k,iEdge))
endif
Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_forcing_windstress.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_forcing_windstress.F        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_forcing_windstress.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -106,8 +106,8 @@
integer :: iEdge, nEdgesSolve, k
integer, dimension(:), pointer :: maxLevelEdgeTop
+ integer, dimension(:,:), pointer :: edgeMask
-
!-----------------------------------------------------------------
!
! call relevant routines for computing tendencies
@@ -122,6 +122,7 @@
nEdgesSolve = grid % nEdgesSolve
maxLevelEdgeTop => grid % maxLevelEdgeTop % array
+ edgeMask => grid % edgeMask % array
do iEdge=1,nEdgesSolve
@@ -134,8 +135,7 @@
if (k>0) then
! forcing in top layer only
- tend(1,iEdge) = tend(1,iEdge) &
- + u_src(1,iEdge)/rho_ref/h_edge(1,iEdge)
+ tend(1,iEdge) = tend(1,iEdge) + edgeMask(k, iEdge) * (u_src(1,iEdge)/rho_ref/h_edge(1,iEdge))
endif
enddo
Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del2.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del2.F        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del2.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -115,7 +115,7 @@
integer :: iEdge, nEdgesSolve, cell1, cell2, vertex1, vertex2
integer :: k
integer, dimension(:), pointer :: maxLevelEdgeTop
- integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge
+ integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge, edgeMask
real (kind=RKIND) :: u_diffusion
real (kind=RKIND), dimension(:), pointer :: meshScalingDel2, &
@@ -136,6 +136,7 @@
cellsOnEdge => grid % cellsOnEdge % array
verticesOnEdge => grid % verticesOnEdge % array
meshScalingDel2 => grid % meshScalingDel2 % array
+ edgeMask => grid % edgeMask % array
dcEdge => grid % dcEdge % array
dvEdge => grid % dvEdge % array
@@ -157,7 +158,7 @@
u_diffusion = meshScalingDel2(iEdge) * eddyVisc2 * u_diffusion
- tend(k,iEdge) = tend(k,iEdge) + u_diffusion
+ tend(k,iEdge) = tend(k,iEdge) + edgeMask(k, iEdge) * u_diffusion
end do
end do
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        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_hmix_del4.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -119,7 +119,7 @@
integer, dimension(:), pointer :: maxLevelEdgeTop, maxLevelVertexBot, &
maxLevelCell
- integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge
+ integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge, edgeMask
real (kind=RKIND) :: u_diffusion, r
@@ -147,6 +147,7 @@
areaTriangle => grid % areaTriangle % array
areaCell => grid % areaCell % array
meshScalingDel4 => grid % meshScalingDel4 % array
+ edgeMask => grid % edgeMask % array
allocate(delsq_divergence(nVertLevels, nCells+1))
allocate(delsq_u(nVertLevels, nEdges+1))
@@ -231,7 +232,7 @@
u_diffusion = meshScalingDel4(iEdge) * eddyVisc4 * u_diffusion
- tend(k,iEdge) = tend(k,iEdge) - u_diffusion
+ tend(k,iEdge) = tend(k,iEdge) - edgeMask(k, iEdge) * u_diffusion
end do
end do
Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_pressure_grad.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_pressure_grad.F        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_pressure_grad.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -103,7 +103,7 @@
integer :: nEdgesSolve, iEdge, k, cell1, cell2
integer, dimension(:), pointer :: maxLevelEdgeTop
- integer, dimension(:,:), pointer :: cellsOnEdge
+ integer, dimension(:,:), pointer :: cellsOnEdge, edgeMask
real (kind=RKIND), dimension(:), pointer :: dcEdge
@@ -113,14 +113,15 @@
maxLevelEdgeTop => grid % maxLevelEdgeTop % array
cellsOnEdge => grid % cellsOnEdge % array
dcEdge => grid % dcEdge % array
+ edgeMask => grid % edgeMask % array
+! dwj: 10/25/2011 - Need to explore isopycnal vs zlevel flags
if (config_vert_grid_type.eq.'isopycnal') then
do iEdge=1,nEdgesSolve
cell1 = cellsOnEdge(1,iEdge)
cell2 = cellsOnEdge(2,iEdge)
do k=1,maxLevelEdgeTop(iEdge)
- tend(k,iEdge) = tend(k,iEdge) &
- - (pressure(k,cell2) - pressure(k,cell1))/dcEdge(iEdge)
+ tend(k,iEdge) = tend(k,iEdge) - edgeMask(k, iEdge) * ((pressure(k,cell2) - pressure(k,cell1))/dcEdge(iEdge))
end do
enddo
elseif (config_vert_grid_type.eq.'zlevel') then
@@ -129,9 +130,7 @@
cell2 = cellsOnEdge(2,iEdge)
do k=1,maxLevelEdgeTop(iEdge)
- tend(k,iEdge) = tend(k,iEdge) &
- - rho0Inv*( pressure(k,cell2) &
- - pressure(k,cell1) )/dcEdge(iEdge)
+ tend(k,iEdge) = tend(k,iEdge) - edgeMask(k,iEdge) * rho0Inv*( pressure(k,cell2) - pressure(k,cell1) )/dcEdge(iEdge)
end do
enddo
Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_vadv.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_vadv.F        2011-10-27 17:57:52 UTC (rev 1153)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_vel_vadv.F        2011-10-27 18:44:03 UTC (rev 1154)
@@ -106,7 +106,7 @@
integer :: iEdge, nEdgesSolve, cell1, cell2, k
integer :: nVertLevels
integer, dimension(:), pointer :: maxLevelEdgeTop
- integer, dimension(:,:), pointer :: cellsOnEdge
+ integer, dimension(:,:), pointer :: cellsOnEdge, edgeMask
real :: wTopEdge
real, dimension(:), allocatable :: w_dudzTopEdge
@@ -121,6 +121,7 @@
maxLevelEdgeTop => grid % maxLevelEdgeTop % array
cellsOnEdge => grid % cellsOnEdge % array
zMidZLevel => grid % zMidZLevel % array
+ edgeMask => grid % edgeMask % array
allocate(w_dudzTopEdge(nVertLevels+1))
w_dudzTopEdge(1) = 0.0
@@ -140,8 +141,7 @@
! Average w*du/dz from vertical interface to vertical middle of cell
do k=1,maxLevelEdgeTop(iEdge)
- tend(k,iEdge) = tend(k,iEdge) &
- - 0.5 * (w_dudzTopEdge(k) + w_dudzTopEdge(k+1))
+ tend(k,iEdge) = tend(k,iEdge) - edgeMask(k, iEdge) * 0.5 * (w_dudzTopEdge(k) + w_dudzTopEdge(k+1))
enddo
enddo
deallocate(w_dudzTopEdge)
</font>
</pre>