Skip to content

Commit 5f4c60e

Browse files
committed
MinLevel* changes to ocn_tracer_vmix_tend_implicit:
MinLevel* changes to tridiagonal_solve_mult must accompany these changes
1 parent 134246d commit 5f4c60e

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

src/core_ocean/shared/mpas_ocn_vmix.F

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -922,11 +922,11 @@ subroutine ocn_tracer_vmix_tend_implicit(meshPool, dt, vertDiffTopOfCell, layerT
922922
!
923923
!-----------------------------------------------------------------
924924
925-
integer :: iCell, k, num_tracers, N, nCells
925+
integer :: iCell, k, num_tracers, N, Nsurf, nCells
926926
integer, pointer :: nVertLevels
927927
integer, dimension(:), pointer :: nCellsArray
928928
929-
integer, dimension(:), pointer :: maxLevelCell
929+
integer, dimension(:), pointer :: maxLevelCell, minLevelCell
930930
931931
real (kind=RKIND), dimension(:), allocatable :: A,B,C
932932
real (kind=RKIND), dimension(:,:), allocatable :: tracersTemp, rhs
@@ -940,6 +940,7 @@ subroutine ocn_tracer_vmix_tend_implicit(meshPool, dt, vertDiffTopOfCell, layerT
940940
num_tracers = size(tracers, dim=1)
941941
942942
call mpas_pool_get_array(meshPool, 'maxLevelCell', maxLevelCell)
943+
call mpas_pool_get_array(meshPool, 'minLevelCell', minLevelCell)
943944
944945
allocate(A(nVertLevels),B(nVertLevels),C(nVertLevels),tracersTemp(num_tracers,nVertLevels))
945946
allocate(rhs(num_tracers,nVertLevels))
@@ -951,40 +952,42 @@ subroutine ocn_tracer_vmix_tend_implicit(meshPool, dt, vertDiffTopOfCell, layerT
951952
!$omp do schedule(runtime) private(N, A, B, C, rhs, tracersTemp, k)
952953
do iCell = 1, nCells
953954
! Compute A(k), B(k), C(k) for tracers
955+
Nsurf = minLevelCell(iCell)
954956
N = maxLevelCell(iCell)
955957
956958
! A is lower diagonal term
957-
A(1)=0.0_RKIND
958-
do k = 2, N
959+
A(Nsurf)=0.0_RKIND
960+
do k = Nsurf+1, N
959961
A(k) = -2.0_RKIND*dt*vertDiffTopOfCell(k,iCell) &
960962
/ (layerThickness(k-1,iCell) + layerThickness(k,iCell)) / layerThickness(k,iCell)
961963
enddo
962964
963965
! C is upper diagonal term
964-
do k = 1, N-1
966+
do k = Nsurf, N-1
965967
C(k) = -2.0_RKIND*dt*vertDiffTopOfCell(k+1,iCell) &
966968
/ (layerThickness(k,iCell) + layerThickness(k+1,iCell)) / layerThickness(k,iCell)
967969
enddo
968970
C(N) = 0.0_RKIND
969971
970972
! B is diagonal term
971-
do k = 1, N
973+
do k = Nsurf, N
972974
B(k) = 1.0_RKIND - A(k) - C(k)
973975
enddo
974976
975977
if ( config_cvmix_kpp_nonlocal_with_implicit_mix ) then
976978
call ocn_compute_kpp_rhs(tracers(:,:,iCell), rhs(:,:), dt, N, num_tracers, &
977979
layerThickness(:,iCell), vertNonLocalFlux(:,:,iCell), &
978-
tracerGroupSurfaceFlux(:,iCell))
980+
tracerGroupSurfaceFlux(:,iCell)) !mlc-arguments may need to be changed
979981
else
980982
rhs(:,:) = tracers(:,:,iCell)
981983
endif
982984
983-
call tridiagonal_solve_mult(A(2:N), B, C(1:N-1), rhs(:,:), &
984-
tracersTemp, N, nVertLevels, num_tracers)
985+
call tridiagonal_solve_mult(A(Nsurf+1:N), B(Nsurf:N), C(Nsurf:N-1), rhs(:,Nsurf:N), &
986+
tracersTemp(:,Nsurf:N), N, nVertLevels, num_tracers) !mlc-arguments need to be changed
985987
986-
tracers(:,1:N,iCell) = tracersTemp(:,1:N)
988+
tracers(:,Nsurf:N,iCell) = tracersTemp(:,Nsurf:N)
987989
tracers(:,N+1:nVertLevels,iCell) = -1e34
990+
tracers(:,1:Nsurf-1,iCell) = -1e34
988991
end do
989992
!$omp end do
990993
!$omp end parallel

0 commit comments

Comments
 (0)