<p><b>dwj07@fsu.edu</b> 2012-01-20 13:43:38 -0700 (Fri, 20 Jan 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Committing a working copy of vadv3 for standard advection scheme.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_tendency.F        2012-01-20 16:28:23 UTC (rev 1400)
+++ branches/ocean_projects/advection_routines/src/core_ocean/mpas_ocn_tendency.F        2012-01-20 20:43:38 UTC (rev 1401)
@@ -310,7 +310,7 @@
type (diag_type), intent(in) :: d
type (mesh_type), intent(in) :: grid
- real (kind=RKIND), dimension(:), pointer :: hRatioZLevelK, hRatioZLevelKm1, zTopZLevel
+ real (kind=RKIND), dimension(:), pointer :: hRatioZLevelK, hRatioZLevelKm1, zTopZLevel, hMeanTopZLevel
real (kind=RKIND), dimension(:,:), pointer :: &
u,h,wTop, h_edge, vertDiffTopOfCell
real (kind=RKIND), dimension(:,:,:), pointer :: &
@@ -332,6 +332,7 @@
zTopZLevel => grid % zTopZLevel % array
hRatioZLevelK => grid % hRatioZLevelK % array
hRatioZLevelKm1 => grid % hRatioZLevelKm1 % array
+ hMeanTopZLevel => grid % hMeanTopZLevel % array
tend_tr => tend % tracers % array
@@ -357,7 +358,7 @@
! tracer_edge at the boundary will also need to be defined for flux boundaries.
call mpas_timer_start("adv", .false., tracerHadvTimer)
- call mpas_tracer_advection_tend(tracers, uh, wTop, zTopZlevel, hRatioZLevelk, hRatioZLevelKm1, grid, tend_tr)
+ call mpas_tracer_advection_tend(tracers, uh, wTop, hMeanTopZLevel, hRatioZLevelKm1, hRatioZLevelK, grid, tend_tr)
call mpas_timer_stop("adv", tracerHadvTimer)
! call mpas_timer_start("hadv", .false., tracerHadvTimer)
! call ocn_tracer_hadv_tend(grid, u, h_edge, tracers, tend_tr, err)
Modified: branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_helpers.F
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_helpers.F        2012-01-20 16:28:23 UTC (rev 1400)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_helpers.F        2012-01-20 20:43:38 UTC (rev 1401)
@@ -8,13 +8,13 @@
contains
real function flux4(q_im2, q_im1, q_i, q_ip1, u)!{{{
- real (kind=RKIND) :: q_im2, q_im1, q_i, q_ip1, u
+ real (kind=RKIND), intent(in) :: q_im2, q_im1, q_i, q_ip1, u
flux4 = u*( 7.*(q_i + q_im1) - (q_ip1 + q_im2) )/12.0
-! flux4(q_im2, q_im1, q_i, q_ip1, ua) = ua*( 7.*(q_i + q_im1) - (q_ip1 + q_im2) )/12.0
end function!}}}
real function flux3( q_im2, q_im1, q_i, q_ip1, u, coef)!{{{
- real (kind=RKIND) :: q_im2, q_im1, q_i, q_ip1, u, coef
+ real (kind=RKIND), intent(in) :: q_im2, q_im1, q_i, q_ip1, u, coef
+
flux3 = (u * (7.0 * (q_i + q_im1) - (q_ip1 + q_im2)) + coef * abs(u) * ((q_ip1 - q_im2) - 3.0*(q_i-q_im1)))/12.0
end function!}}}
Modified: branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_std_hadv.F
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_std_hadv.F        2012-01-20 16:28:23 UTC (rev 1400)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_std_hadv.F        2012-01-20 20:43:38 UTC (rev 1401)
@@ -67,16 +67,12 @@
do iEdge=1,grid%nEdges
cell1 = cellsOnEdge(1,iEdge)
cell2 = cellsOnEdge(2,iEdge)
- if (cell1 <= grid%nCells .or. cell2 <= grid%nCells) then ! only for owned cells
+ if (cell1 <= grid%nCellsSolve .or. cell2 <= grid%nCellsSolve) then ! only for owned cells
flux_arr(:,:) = 0.
do i=1,nAdvCellsForEdge(iEdge)
iCell = advCellsForEdge(i,iEdge)
do k=1,grid % nVertLevels
-! tracer_weight = adv_coefs(i,iEdge) + coef_3rd_order*sign(1.0, uh(k,iEdge))*adv_coefs_3rd(i,iEdge)
- tracer_weight = sign(1.0, uh(k,iEdge))
- tracer_weight = adv_coefs_3rd(i,iEdge)*tracer_weight
- tracer_weight = coef_3rd_order*tracer_weight
- tracer_weight = adv_coefs(i,iEdge) + tracer_weight
+ tracer_weight = adv_coefs(i,iEdge) + coef_3rd_order*sign(1.0, uh(k,iEdge))*adv_coefs_3rd(i,iEdge)
do iTracer=1,num_tracers
flux_arr(iTracer,k) = flux_arr(iTracer,k) + tracer_weight* tracers(iTracer,k,iCell)
end do
Modified: branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_std_vadv3.F
===================================================================
--- branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_std_vadv3.F        2012-01-20 16:28:23 UTC (rev 1400)
+++ branches/ocean_projects/advection_routines/src/operators/mpas_tracer_advection_std_vadv3.F        2012-01-20 20:43:38 UTC (rev 1401)
@@ -38,6 +38,7 @@
! real (kind=RKIND), dimension( s_old % num_tracers, grid % nVertLevels + 1 ) :: vert_flux
real (kind=RKIND), dimension(:,:), allocatable :: vert_flux
integer :: nVertLevels, num_tracers
+ integer, dimension(:), pointer :: maxLevelCell
integer, parameter :: hadv_opt = 2
@@ -45,20 +46,21 @@
nVertLevels = grid % nVertLevels
num_tracers = size(tracers, dim=1)
+ maxLevelCell => grid % maxLevelCell % array
allocate(vert_flux(num_tracers, nVertLevels+1))
vert_flux(:,1) = 0.
- vert_flux(:,grid % nVertLevels+1) = 0.
+! vert_flux(:,grid % nVertLevels+1) = 0.
do iCell=1,grid % nCellsSolve
k = 2
do iTracer=1,num_tracers
- vert_flux(iTracer,k) = w(k,iCell)*(zWeightDown(k)*tracers(iTracer,k,iCell)+zWeightUp(k)*tracers(iTracer,k-1,iCell))
+ vert_flux(iTracer,k) = w(k,iCell)*(zWeightUp(k)*tracers(iTracer,k,iCell)+zWeightDown(k)*tracers(iTracer,k-1,iCell))
enddo
- do k=3,nVertLevels-1
+ do k=3,maxLevelCell(iCell)-1
do iTracer=1,num_tracers
vert_flux(iTracer,k) = flux3( tracers(iTracer,k-2,iCell),tracers(iTracer,k-1,iCell), &
tracers(iTracer,k ,iCell),tracers(iTracer,k+1,iCell), &
@@ -66,15 +68,17 @@
end do
end do
- k = nVertLevels
+ k = maxLevelCell(iCell)
do iTracer=1,num_tracers
- vert_flux(iTracer,k) = w(k,iCell)*(zWeightDown(k)*tracers(iTracer,k,iCell)+zWeightUp(k)*tracers(iTracer,k-1,iCell))
+ vert_flux(iTracer,k) = w(k,iCell)*(zWeightUp(k)*tracers(iTracer,k,iCell)+zWeightDown(k)*tracers(iTracer,k-1,iCell))
enddo
- do k=1,grid % nVertLevelsSolve
+ vert_Flux(:, maxLevelCell(iCell)+1) = 0.0
+
+ do k=1,maxLevelCell(iCell)
do iTracer=1,num_tracers
- tend(iTracer, k, iCell) = tend(iTracer, k, iCell) - (vert_flux(iTracer, k+1) - vert_flux(iTracer, k)) / zDistance(k)
+ tend(iTracer, k, iCell) = tend(iTracer, k, iCell) + (vert_flux(iTracer, k+1) - vert_flux(iTracer, k))
! tracers(iTracer,k,iCell) = ( tracers(iTracer,k,iCell)*h_old(k,iCell) &
! + dt*( tracer_tend(iTracer,k,iCell) -rdnw(k)*(vert_flux(iTracer,k+1)-vert_flux(iTracer,k)) ) )/h_new(k,iCell)
</font>
</pre>