Turbulent diffusivity closures and large eddy simulation models
A turbulent diffusivity closure representing the effects of viscous dissipation and diffusion can be passed via the closure
keyword.
See turbulence closures and large eddy simulation for more details on turbulent diffusivity closures.
Constant isotropic diffusivity
To use constant isotropic values for the viscosity $\nu$ and diffusivity $\kappa$ you can use ScalarDiffusivity
:
julia> using Oceananigans.TurbulenceClosures
julia> closure = ScalarDiffusivity(ν=1e-2, κ=1e-2)
ScalarDiffusivity{ExplicitTimeDiscretization}(ν=0.01, κ=0.01)
Constant anisotropic diffusivity
To specify constant values for the horizontal and vertical viscosities, $\nu_h$ and $\nu_z$, and horizontal and vertical diffusivities, $\kappa_h$ and $\kappa_z$, you can use HorizontalScalarDiffusivity()
and VerticalScalarDiffusivity()
, e.g.,
julia> using Oceananigans.TurbulenceClosures
julia> horizontal_closure = HorizontalScalarDiffusivity(ν=1e-3, κ=2e-3)
HorizontalScalarDiffusivity{ExplicitTimeDiscretization}(ν=0.001, κ=0.002)
julia> vertical_closure = VerticalScalarDiffusivity(ν=1e-3, κ=2e-3)
VerticalScalarDiffusivity{ExplicitTimeDiscretization}(ν=0.001, κ=0.002)
After that you can set, e.g., closure = (horizontal_closure, vertical_closure)
when constructing the model so that all components will be taken into account when calculating the diffusivity term. Note that VerticalScalarDiffusivity
and HorizontalScalarDiffusivity
are implemented using different schemes with different conservation properties.
Tracer-specific diffusivities
You can also set different diffusivities for each tracer in your simulation by passing a NamedTuple as the argument $\kappa$:
julia> using Oceananigans.TurbulenceClosures
julia> ScalarDiffusivity(ν=1e-6, κ=(S=1e-7, T=1e-10))
ScalarDiffusivity{ExplicitTimeDiscretization}(ν=1.0e-6, κ=(S=1.0e-7, T=1.0e-10))
The example above sets a viscosity of 1e-6
, a diffusivity for a tracer called T
of 1e-7
, and a diffusivity for a tracer called S
of 1e-10
. Specifying diffusivities this way is also valid for HorizontalScalarDiffusivity
and VerticalScalarDiffusivity
. If this method is used, diffusivities for all tracers need to be specified.
Smagorinsky-Lilly
To use the default Smagorinsky-Lilly LES closure, we write
julia> using Oceananigans.TurbulenceClosures
julia> closure = SmagorinskyLilly()
Smagorinsky closure with
├── coefficient = LillyCoefficient(smagorinsky = 0.16, reduction_factor = 1.0)
└── Pr = 1.0
The parameters C
, Cb
, and Pr
may alternatively be specified explicitly. For more details see SmagorinskyLilly
.
Anisotropic minimum dissipation
To use the constant anisotropic minimum dissipation (AMD) LES closure,
julia> using Oceananigans.TurbulenceClosures
julia> closure = AnisotropicMinimumDissipation()
AnisotropicMinimumDissipation{ExplicitTimeDiscretization} turbulence closure with:
Poincaré constant for momentum eddy viscosity Cν: 0.08333333333333333
Poincaré constant for tracer(s) eddy diffusivit(ies) Cκ: 0.08333333333333333
Buoyancy modification multiplier Cb: nothing
no parameters are required although they may be specified. By default, the background viscosity and diffusivity are assumed to be the molecular values for seawater. For more details see AnisotropicMinimumDissipation
.
Convective Adjustment Vertical Diffusivity–Viscosity
To use the a convective adjustment scheme that applies enhanced values for vertical diffusivity $\kappa_z$ and/or viscosity $\nu_z$, anytime and anywhere the background stratification becomes unstable.
julia> using Oceananigans
julia> closure = ConvectiveAdjustmentVerticalDiffusivity(convective_κz = 1.0, background_κz = 1e-3)
ConvectiveAdjustmentVerticalDiffusivity{VerticallyImplicitTimeDiscretization}(background_κz=0.001 convective_κz=1.0 background_νz=0.0 convective_νz=0.0)