diff --git a/src/core/MOM_variables.F90 b/src/core/MOM_variables.F90 index 65e915705a..efd558cdb3 100644 --- a/src/core/MOM_variables.F90 +++ b/src/core/MOM_variables.F90 @@ -237,8 +237,8 @@ module MOM_variables kv_bbl_v, & !< The bottom boundary layer viscosity at the v-points [H Z T-1 ~> m2 s-1 or Pa s] ustar_BBL, & !< The turbulence velocity in the bottom boundary layer at !! h points [H T-1 ~> m s-1 or kg m-2 s-1]. - TKE_BBL, & !< A term related to the bottom boundary layer source of turbulent kinetic - !! energy, currently in [H Z2 T-3 ~> m3 s-3 or W m-2]. + BBL_meanKE_loss, & !< The viscous loss of mean kinetic energy in the bottom boundary layer + !! [H L2 T-3 ~> m3 s-3 or W m-2]. taux_shelf, & !< The zonal stresses on the ocean under shelves [R Z L T-2 ~> Pa]. tauy_shelf !< The meridional stresses on the ocean under shelves [R Z L T-2 ~> Pa]. real, allocatable, dimension(:,:) :: tbl_thick_shelf_u diff --git a/src/parameterizations/vertical/MOM_energetic_PBL.F90 b/src/parameterizations/vertical/MOM_energetic_PBL.F90 index e32bc8de2d..fdbd9c13f0 100644 --- a/src/parameterizations/vertical/MOM_energetic_PBL.F90 +++ b/src/parameterizations/vertical/MOM_energetic_PBL.F90 @@ -162,7 +162,9 @@ module MOM_energetic_PBL real :: Max_Enhance_M = 5. !< The maximum allowed LT enhancement to the mixing [nondim]. !/ Bottom boundary layer mixing related options - real :: ePBL_BBL_effic !< The efficiency of bottom boundary layer mixing via ePBL [nondim] + real :: ePBL_BBL_effic !< The efficiency of bottom boundary layer mixing via ePBL, times + !! conversion factors between the natural units of mean kinetic energy + !! and those those used for TKE [Z2 L-2 ~> nondim]. logical :: Use_BBLD_iteration !< If true, use the proximity to the top of the actively turbulent !! bottom boundary layer to constrain the mixing lengths. real :: TKE_decay_BBL !< The ratio of the natural Ekman depth to the TKE decay scale for @@ -654,7 +656,7 @@ subroutine energetic_PBL(h_3d, u_3d, v_3d, tv, fluxes, visc, dt, Kd_int, G, GV, if (CS%ePBL_BBL_effic > 0.0) then if (CS%MLD_iteration_guess .and. (CS%BBL_depth(i,j) > 0.0)) BBLD_io = CS%BBL_depth(i,j) BBLD_in = BBLD_io - BBL_TKE = CS%ePBL_BBL_effic * GV%H_to_RZ * dt * visc%TKE_BBL(i,j) + BBL_TKE = CS%ePBL_BBL_effic * GV%H_to_RZ * dt * visc%BBL_meanKE_loss(i,j) u_star_BBL = max(visc%ustar_BBL(i,j), CS%ustar_min*GV%Z_to_H) call ePBL_BBL_column(h, dz, u, v, T0, S0, dSV_dT_1d, dSV_dS_1d, SpV_dt, absf, dt, Kd, BBL_TKE, & u_star_BBL, Kd_BBL, BBLD_io, mixvel_BBL, mixlen_BBL, GV, US, CS, eCD) @@ -730,7 +732,7 @@ subroutine energetic_PBL(h_3d, u_3d, v_3d, tv, fluxes, visc, dt, Kd_int, G, GV, mixvel, mixlen, GV, US, CS_tmp2, eCD_tmp, Waves, G, i, j) else BLD_1 = BBLD_in ; BLD_2 = BBLD_in - BBL_TKE = CS%ePBL_BBL_effic * GV%H_to_RZ * dt * visc%TKE_BBL(i,j) + BBL_TKE = CS%ePBL_BBL_effic * GV%H_to_RZ * dt * visc%BBL_meanKE_loss(i,j) u_star_BBL = max(visc%ustar_BBL(i,j), CS%ustar_min*GV%Z_to_H) call ePBL_BBL_column(h, dz, u, v, T0, S0, dSV_dT_1d, dSV_dS_1d, SpV_dt, absf, dt, Kd, BBL_TKE, & u_star_BBL, Kd_1, BLD_1, mixvel_BBL, mixlen_BBL, GV, US, CS_tmp1, eCD_tmp) @@ -760,7 +762,8 @@ subroutine energetic_PBL(h_3d, u_3d, v_3d, tv, fluxes, visc, dt, Kd_int, G, GV, enddo ! j-loop if (CS%debug .and. (CS%ePBL_BBL_effic > 0.0)) then - call hchksum(visc%TKE_BBL, "ePBL visc%TKE_BBL", G%HI, unscale=GV%H_to_MKS*US%Z_to_m**2*US%s_to_T**3) + call hchksum(visc%BBL_meanKE_loss, "ePBL visc%BBL_meanKE_loss", G%HI, & + unscale=GV%H_to_MKS*US%L_T_to_m_s**2*US%s_to_T) call hchksum(visc%ustar_BBL, "ePBL visc%ustar_BBL", G%HI, unscale=GV%H_to_MKS*US%s_to_T) call hchksum(Kd_int, "End of ePBL Kd_int", G%HI, unscale=GV%H_to_MKS*US%Z_to_m*US%s_to_T) call hchksum(diag_Velocity_Scale, "ePBL Velocity_Scale", G%HI, unscale=US%Z_to_m*US%s_to_T) @@ -3670,7 +3673,7 @@ subroutine energetic_PBL_init(Time, G, GV, US, param_file, diag, CS) call get_param(param_file, mdl, "EPBL_BBL_EFFIC", CS%ePBL_BBL_effic, & "The efficiency of bottom boundary layer mixing via ePBL. Setting this to a "//& "value that is greater than 0 to enable bottom boundary layer mixing from EPBL.", & - units="nondim", default=0.0) + units="nondim", default=0.0, scale=US%L_to_Z**2) no_BBL = (CS%ePBL_BBL_effic<=0.0) call get_param(param_file, mdl, "USE_BBLD_ITERATION", CS%Use_BBLD_iteration, & "A logical that specifies whether or not to use the distance to the top of the "//& diff --git a/src/parameterizations/vertical/MOM_set_diffusivity.F90 b/src/parameterizations/vertical/MOM_set_diffusivity.F90 index 467f07f088..27c8ed7755 100644 --- a/src/parameterizations/vertical/MOM_set_diffusivity.F90 +++ b/src/parameterizations/vertical/MOM_set_diffusivity.F90 @@ -75,8 +75,10 @@ module MOM_set_diffusivity logical :: LOTW_BBL_use_omega !< If true, use simpler/less precise, BBL diffusivity. real :: Von_Karm !< The von Karman constant as used in the BBL diffusivity calculation !! [nondim]. See (http://en.wikipedia.org/wiki/Von_Karman_constant) - real :: BBL_effic !< efficiency with which the energy extracted - !! by bottom drag drives BBL diffusion in the original BBL scheme [nondim] + real :: BBL_effic !< Efficiency with which the energy extracted + !! by bottom drag drives BBL diffusion in the original BBL scheme, times + !! conversion factors between the natural units of mean kinetic energy + !! and those those used for TKE [Z2 L-2 ~> nondim]. real :: ePBL_BBL_effic !< efficiency with which the energy extracted !! by bottom drag drives BBL diffusion in the ePBL BBL scheme [nondim] real :: cdrag !< quadratic drag coefficient [nondim] @@ -1412,10 +1414,10 @@ subroutine add_drag_diffusivity(h, u, v, tv, fluxes, visc, j, TKE_to_Kd, maxTKE, ! If ustar_h = 0, this is land so this value doesn't matter. I2decay(i) = 0.5*CS%IMax_decay endif - TKE(i) = ((CS%BBL_effic * cdrag_sqrt) * exp(-I2decay(i)*h(i,j,nz)) ) * visc%TKE_BBL(i,j) + TKE(i) = ((CS%BBL_effic * cdrag_sqrt) * exp(-I2decay(i)*h(i,j,nz)) ) * visc%BBL_meanKE_loss(i,j) if (associated(fluxes%TKE_tidal)) & - TKE(i) = TKE(i) + fluxes%TKE_tidal(i,j) * GV%RZ_to_H * & + TKE(i) = TKE(i) + US%Z_to_L**2*fluxes%TKE_tidal(i,j) * GV%RZ_to_H * & (CS%BBL_effic * exp(-I2decay(i)*h(i,j,nz))) ! Distribute the work over a BBL of depth 20^2 ustar^2 / g' following @@ -1471,7 +1473,7 @@ subroutine add_drag_diffusivity(h, u, v, tv, fluxes, visc, j, TKE_to_Kd, maxTKE, else ; TKE_to_layer = 0.0 ; endif ! TKE_Ray has been initialized to 0 above. - if (Rayleigh_drag) TKE_Ray = 0.5*CS%BBL_effic * US%L_to_Z**2 * G%IareaT(i,j) * & + if (Rayleigh_drag) TKE_Ray = 0.5*CS%BBL_effic * G%IareaT(i,j) * & (((G%areaCu(I-1,j) * visc%Ray_u(I-1,j,k) * u(I-1,j,k)**2) + & (G%areaCu(I,j) * visc%Ray_u(I,j,k) * u(I,j,k)**2)) + & ((G%areaCv(i,J-1) * visc%Ray_v(i,J-1,k) * v(i,J-1,k)**2) + & @@ -1576,6 +1578,8 @@ subroutine add_LOTW_BBL_diffusivity(h, u, v, tv, fluxes, visc, j, N2_int, Rho_bo real :: dz(SZI_(G),SZK_(GV)) ! Height change across layers [Z ~> m] real :: dz_above(SZK_(GV)+1) ! Distance from each interface to the surface [Z ~> m] real :: TKE_column ! net TKE input into the column [H Z2 T-3 ~> m3 s-3 or W m-2] + real :: BBL_meanKE_dis ! Sum of tidal and mean kinetic energy dissipation in the bottom boundary layer, which + ! can act as a source of TKE [H L2 T-3 ~> m3 s-3 or W m-2] real :: TKE_remaining ! remaining TKE available for mixing in this layer and above [H Z2 T-3 ~> m3 s-3 or W m-2] real :: TKE_consumed ! TKE used for mixing in this layer [H Z2 T-3 ~> m3 s-3 or W m-2] real :: TKE_Kd_wall ! TKE associated with unlimited law of the wall mixing [H Z2 T-3 ~> m3 s-3 or W m-2] @@ -1639,14 +1643,14 @@ subroutine add_LOTW_BBL_diffusivity(h, u, v, tv, fluxes, visc, j, N2_int, Rho_bo if ((ustar > 0.0) .and. (absf > CS%IMax_decay * ustar)) Idecay = absf / ustar ! Energy input at the bottom [H Z2 T-3 ~> m3 s-3 or W m-2]. - ! (Note that visc%TKE_BBL is in [H Z2 T-3 ~> m3 s-3 or W m-2], set in set_BBL_TKE().) - ! I am still unsure about sqrt(cdrag) in this expressions - AJA - TKE_column = cdrag_sqrt * visc%TKE_BBL(i,j) + ! (Note that visc%BBL_meanKE_loss is in [H L2 T-3 ~> m3 s-3 or W m-2], set in set_BBL_TKE().) + !### I am still unsure about sqrt(cdrag) in this expressions - AJA + BBL_meanKE_dis = cdrag_sqrt * visc%BBL_meanKE_loss(i,j) ! Add in tidal dissipation energy at the bottom [H Z2 T-3 ~> m3 s-3 or W m-2]. ! Note that TKE_tidal is in [R Z3 T-3 ~> W m-2]. if (associated(fluxes%TKE_tidal)) & - TKE_column = TKE_column + fluxes%TKE_tidal(i,j) * GV%RZ_to_H - TKE_column = CS%BBL_effic * TKE_column ! Only use a fraction of the mechanical dissipation for mixing. + BBL_meanKE_dis = BBL_meanKE_dis + US%Z_to_L**2*fluxes%TKE_tidal(i,j) * GV%RZ_to_H + TKE_column = CS%BBL_effic * BBL_meanKE_dis ! Only use a fraction of the mechanical dissipation for mixing. TKE_remaining = TKE_column if (CS%LOTW_BBL_answer_date > 20240630) then @@ -1670,7 +1674,7 @@ subroutine add_LOTW_BBL_diffusivity(h, u, v, tv, fluxes, visc, j, N2_int, Rho_bo ! Add in additional energy input from bottom-drag against slopes (sides) if (Rayleigh_drag) TKE_remaining = TKE_remaining + & - 0.5*CS%BBL_effic * US%L_to_Z**2 * G%IareaT(i,j) * & + 0.5*CS%BBL_effic * G%IareaT(i,j) * & (((G%areaCu(I-1,j) * visc%Ray_u(I-1,j,k) * u(I-1,j,k)**2) + & (G%areaCu(I,j) * visc%Ray_u(I,j,k) * u(I,j,k)**2)) + & ((G%areaCv(i,J-1) * visc%Ray_v(i,J-1,k) * v(i,J-1,k)**2) + & @@ -1949,8 +1953,8 @@ subroutine set_BBL_TKE(u, v, h, tv, fluxes, visc, G, GV, US, CS, OBC) if (allocated(visc%ustar_BBL)) then do j=js,je ; do i=is,ie ; visc%ustar_BBL(i,j) = 0.0 ; enddo ; enddo endif - if (allocated(visc%TKE_BBL)) then - do j=js,je ; do i=is,ie ; visc%TKE_BBL(i,j) = 0.0 ; enddo ; enddo + if (allocated(visc%BBL_meanKE_loss)) then + do j=js,je ; do i=is,ie ; visc%BBL_meanKE_loss(i,j) = 0.0 ; enddo ; enddo endif return endif @@ -2075,7 +2079,7 @@ subroutine set_BBL_TKE(u, v, h, tv, fluxes, visc, G, GV, US, CS, OBC) (G%areaCu(I,j)*(ustar(I)*ustar(I)))) + & ((G%areaCv(i,J-1)*(vstar(i,J-1)*vstar(i,J-1))) + & (G%areaCv(i,J)*(vstar(i,J)*vstar(i,J)))) ) ) - visc%TKE_BBL(i,j) = US%L_to_Z**2 * & + visc%BBL_meanKE_loss(i,j) = & ((((G%areaCu(I-1,j)*(ustar(I-1)*u2_bbl(I-1))) + & (G%areaCu(I,j) * (ustar(I)*u2_bbl(I)))) + & ((G%areaCv(i,J-1)*(vstar(i,J-1)*v2_bbl(i,J-1))) + & @@ -2358,9 +2362,9 @@ subroutine set_diffusivity_init(Time, G, GV, US, param_file, diag, CS, int_tide_ "velocity field to the bottom stress. CDRAG is only used "//& "if BOTTOMDRAGLAW is true.", units="nondim", default=0.003) call get_param(param_file, mdl, "BBL_EFFIC", CS%BBL_effic, & - "The efficiency with which the energy extracted by "//& - "bottom drag drives BBL diffusion. This is only "//& - "used if BOTTOMDRAGLAW is true.", units="nondim", default=0.20) + "The efficiency with which the energy extracted by bottom drag drives BBL "//& + "diffusion. This is only used if BOTTOMDRAGLAW is true.", & + units="nondim", default=0.20, scale=US%L_to_Z**2) call get_param(param_file, mdl, "EPBL_BBL_EFFIC", CS%ePBL_BBL_effic, & units="nondim", default=0.0,do_not_log=.true.) call get_param(param_file, mdl, "BBL_MIXING_MAX_DECAY", decay_length, & diff --git a/src/parameterizations/vertical/MOM_set_viscosity.F90 b/src/parameterizations/vertical/MOM_set_viscosity.F90 index ff97e616d9..963c8c4525 100644 --- a/src/parameterizations/vertical/MOM_set_viscosity.F90 +++ b/src/parameterizations/vertical/MOM_set_viscosity.F90 @@ -3139,7 +3139,7 @@ subroutine set_visc_init(Time, G, GV, US, param_file, diag, visc, CS, restart_CS allocate(visc%kv_bbl_u(IsdB:IedB,jsd:jed), source=0.0) allocate(visc%kv_bbl_v(isd:ied,JsdB:JedB), source=0.0) allocate(visc%ustar_bbl(isd:ied,jsd:jed), source=0.0) - allocate(visc%TKE_bbl(isd:ied,jsd:jed), source=0.0) + allocate(visc%BBL_meanKE_loss(isd:ied,jsd:jed), source=0.0) CS%id_bbl_thick_u = register_diag_field('ocean_model', 'bbl_thick_u', & diag%axesCu1, Time, 'BBL thickness at u points', 'm', conversion=US%Z_to_m) @@ -3214,7 +3214,7 @@ subroutine set_visc_end(visc, CS) if (associated(visc%Kv_shear)) deallocate(visc%Kv_shear) if (associated(visc%Kv_shear_Bu)) deallocate(visc%Kv_shear_Bu) if (allocated(visc%ustar_bbl)) deallocate(visc%ustar_bbl) - if (allocated(visc%TKE_bbl)) deallocate(visc%TKE_bbl) + if (allocated(visc%BBL_meanKE_loss)) deallocate(visc%BBL_meanKE_loss) if (allocated(visc%taux_shelf)) deallocate(visc%taux_shelf) if (allocated(visc%tauy_shelf)) deallocate(visc%tauy_shelf) if (allocated(visc%tbl_thick_shelf_u)) deallocate(visc%tbl_thick_shelf_u)