@@ -922,11 +922,11 @@ subroutine ocn_tracer_vmix_tend_implicit(meshPool, dt, vertDiffTopOfCell, layerT
922
922
!
923
923
!-----------------------------------------------------------------
924
924
925
- integer :: iCell, k, num_tracers, N, nCells
925
+ integer :: iCell, k, num_tracers, N, Nsurf, nCells
926
926
integer, pointer :: nVertLevels
927
927
integer, dimension(:), pointer :: nCellsArray
928
928
929
- integer, dimension(:), pointer :: maxLevelCell
929
+ integer, dimension(:), pointer :: maxLevelCell, minLevelCell
930
930
931
931
real (kind=RKIND), dimension(:), allocatable :: A,B,C
932
932
real (kind=RKIND), dimension(:,:), allocatable :: tracersTemp, rhs
@@ -940,6 +940,7 @@ subroutine ocn_tracer_vmix_tend_implicit(meshPool, dt, vertDiffTopOfCell, layerT
940
940
num_tracers = size(tracers, dim=1)
941
941
942
942
call mpas_pool_get_array(meshPool, ' maxLevelCell' , maxLevelCell)
943
+ call mpas_pool_get_array(meshPool, ' minLevelCell' , minLevelCell)
943
944
944
945
allocate(A(nVertLevels),B(nVertLevels),C(nVertLevels),tracersTemp(num_tracers,nVertLevels))
945
946
allocate(rhs(num_tracers,nVertLevels))
@@ -951,40 +952,42 @@ subroutine ocn_tracer_vmix_tend_implicit(meshPool, dt, vertDiffTopOfCell, layerT
951
952
!$omp do schedule(runtime) private(N, A, B, C, rhs, tracersTemp, k)
952
953
do iCell = 1, nCells
953
954
! Compute A(k), B(k), C(k) for tracers
955
+ Nsurf = minLevelCell(iCell)
954
956
N = maxLevelCell(iCell)
955
957
956
958
! 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
959
961
A(k) = -2.0_RKIND*dt*vertDiffTopOfCell(k,iCell) &
960
962
/ (layerThickness(k-1,iCell) + layerThickness(k,iCell)) / layerThickness(k,iCell)
961
963
enddo
962
964
963
965
! C is upper diagonal term
964
- do k = 1 , N-1
966
+ do k = Nsurf , N-1
965
967
C(k) = -2.0_RKIND*dt*vertDiffTopOfCell(k+1,iCell) &
966
968
/ (layerThickness(k,iCell) + layerThickness(k+1,iCell)) / layerThickness(k,iCell)
967
969
enddo
968
970
C(N) = 0.0_RKIND
969
971
970
972
! B is diagonal term
971
- do k = 1 , N
973
+ do k = Nsurf , N
972
974
B(k) = 1.0_RKIND - A(k) - C(k)
973
975
enddo
974
976
975
977
if ( config_cvmix_kpp_nonlocal_with_implicit_mix ) then
976
978
call ocn_compute_kpp_rhs(tracers(:,:,iCell), rhs(:,:), dt, N, num_tracers, &
977
979
layerThickness(:,iCell), vertNonLocalFlux(:,:,iCell), &
978
- tracerGroupSurfaceFlux(:,iCell))
980
+ tracerGroupSurfaceFlux(:,iCell)) !mlc-arguments may need to be changed
979
981
else
980
982
rhs(:,:) = tracers(:,:,iCell)
981
983
endif
982
984
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
985
987
986
- tracers(:,1 :N,iCell) = tracersTemp(:,1 :N)
988
+ tracers(:,Nsurf :N,iCell) = tracersTemp(:,Nsurf :N)
987
989
tracers(:,N+1:nVertLevels,iCell) = -1e34
990
+ tracers(:,1:Nsurf-1,iCell) = -1e34
988
991
end do
989
992
!$omp end do
990
993
!$omp end parallel
0 commit comments