Operators
All discrete operators are built using KernelAbstractions.jl and Cartesian indices, similar to WaterLily.jl. This allows for dimension- and backend-agnostic code. See this blog post for how to write kernels. IncompressibleNavierStokes previously relied on assembling sparse operators to perform the same operations. While being very efficient and also compatible with CUDA (CUSPARSE), storing these matrices in memory is expensive for large 3D problems.
IncompressibleNavierStokes.Offset Type
struct Offset{D}
Cartesian index unit vector in D = 2
or D = 3
dimensions. Calling Offset(D)(α)
returns a Cartesian index with 1
in the dimension α
and zeros elsewhere.
See https://b-fg.github.io/2023/05/07/waterlily-on-gpu.html for writing kernel loops using Cartesian indices.
Fields
IncompressibleNavierStokes.Dfield! Method
Dfield!(d, G, p, setup; ϵ) -> Any
Compute the
IncompressibleNavierStokes.Dfield Method
Dfield(p, setup; kwargs...) -> Any
Compute the
Differentiable version.
IncompressibleNavierStokes.Qfield! Method
Qfield!(Q, u, setup) -> Any
Compute the
IncompressibleNavierStokes.Qfield Method
Qfield(u, setup) -> Any
Compute
Differentiable version.
IncompressibleNavierStokes.applybodyforce! Method
applybodyforce!(F, u, t, setup) -> Any
Compute body force (in-place version). Add the result to F
.
IncompressibleNavierStokes.applybodyforce Method
applybodyforce(u, t, setup) -> Any
Compute body force (differentiable version).
IncompressibleNavierStokes.applypressure! Method
applypressure!(u, p, setup) -> Any
Subtract pressure gradient (in-place version).
IncompressibleNavierStokes.avg Method
avg(ϕ, Δ, I, α) -> Any
Average scalar field ϕ
in the α
-direction.
IncompressibleNavierStokes.convection! Method
convection!(F, u, setup) -> Any
Compute convective term (in-place version). Add the result to F
.
IncompressibleNavierStokes.convection Method
convection(u, setup) -> Any
Compute convective term (differentiable version).
IncompressibleNavierStokes.convection_diffusion_temp! Method
convection_diffusion_temp!(c, u, temp, setup) -> Any
Compute convection-diffusion term for the temperature equation. (in-place version). Add result to c
.
IncompressibleNavierStokes.convection_diffusion_temp Method
convection_diffusion_temp(u, temp, setup) -> Any
Compute convection-diffusion term for the temperature equation. (differentiable version).
IncompressibleNavierStokes.convectiondiffusion! Method
convectiondiffusion!(F, u, setup) -> Any
Compute convective and diffusive terms (in-place version). Add the result to F
.
IncompressibleNavierStokes.diffusion! Method
diffusion!(F, u, setup) -> Any
Compute diffusive term (in-place version). Add the result to F
.
IncompressibleNavierStokes.diffusion Method
diffusion(u, setup) -> Any
Compute diffusive term (differentiable version).
IncompressibleNavierStokes.dissipation! Method
dissipation!(diss, diff, u, setup) -> Any
Compute dissipation term for the temperature equation (in-place version). Add result to diss
.
IncompressibleNavierStokes.dissipation Method
dissipation(u, setup) -> Any
Compute dissipation term for the temperature equation (differentiable version).
IncompressibleNavierStokes.dissipation_from_strain! Method
dissipation_from_strain!(ϵ, u, setup) -> Any
Compute dissipation term from strain-rate tensor (in-place version).
IncompressibleNavierStokes.dissipation_from_strain Method
dissipation_from_strain(u, setup) -> Any
Compute dissipation term
IncompressibleNavierStokes.divergence! Method
divergence!(div, u, setup) -> Any
Compute divergence of velocity field (in-place version).
IncompressibleNavierStokes.divergence Method
divergence(u, setup) -> Any
Compute divergence of velocity field (differentiable version).
IncompressibleNavierStokes.divoftensor! Method
divoftensor!(s, σ, setup) -> Any
Compute divergence of a tensor with all components in the pressure points (in-place version). The stress tensors should be precomputed and stored in σ
.
IncompressibleNavierStokes.eig2field! Method
eig2field!(λ, u, setup) -> Any
Compute the second eigenvalue of
IncompressibleNavierStokes.eig2field Method
eig2field(u, setup) -> Any
Compute the second eigenvalue of
Differentiable version.
IncompressibleNavierStokes.get_scale_numbers Method
get_scale_numbers(
u,
setup
) -> NamedTuple{(:uavg, :ϵ, :η, :λ, :Reλ, :L, :τ), <:Tuple{Any, Any, Any, Any, Any, Nothing, Nothing}}
Get the following dimensional scale numbers [7]:
Velocity
Dissipation rate
Kolmolgorov length scale
Taylor length scale
Taylor-scale Reynolds number
Integral length scale
Large-eddy turnover time
IncompressibleNavierStokes.gravity! Method
gravity!(F, temp, setup) -> Any
Compute gravity term (in-place version). add the result to F
.
IncompressibleNavierStokes.gravity Method
gravity(temp, setup) -> Any
Compute gravity term (differentiable version).
IncompressibleNavierStokes.interpolate_u_p! Method
interpolate_u_p!(up, u, setup) -> Any
Interpolate velocity to pressure points (in-place version).
IncompressibleNavierStokes.interpolate_u_p Method
interpolate_u_p(u, setup) -> Any
Interpolate velocity to pressure points (differentiable version).
IncompressibleNavierStokes.interpolate_ω_p! Method
interpolate_ω_p!(ωp, ω, setup) -> Any
Interpolate vorticity to pressure points (in-place version).
IncompressibleNavierStokes.interpolate_ω_p Method
interpolate_ω_p(ω, setup) -> Any
Interpolate vorticity to pressure points (differentiable version).
IncompressibleNavierStokes.kinetic_energy! Method
kinetic_energy!(ke, u, setup; interpolate_first) -> Any
Compute kinetic energy field (in-place version).
IncompressibleNavierStokes.kinetic_energy Method
kinetic_energy(u, setup; kwargs...) -> Any
Compute kinetic energy field interpolate_first
is true, it is given by
Otherwise, it is given by
as in [8].
Differentiable version.
IncompressibleNavierStokes.laplacian! Method
laplacian!(L, p, setup) -> Any
Compute Laplacian of pressure field (in-place version).
IncompressibleNavierStokes.laplacian Method
laplacian(p, setup) -> Any
Compute Laplacian of pressure field (differentiable version).
IncompressibleNavierStokes.momentum! Method
momentum!(F, u, temp, t, setup) -> Any
Right hand side of momentum equations, excluding pressure gradient (in-place version).
IncompressibleNavierStokes.momentum Method
momentum(u, temp, t, setup) -> Any
Right hand side of momentum equations, excluding pressure gradient (differentiable version).
IncompressibleNavierStokes.pressuregradient! Method
pressuregradient!(G, p, setup) -> Any
Compute pressure gradient (in-place version).
IncompressibleNavierStokes.pressuregradient Method
pressuregradient(p, setup) -> Any
Compute pressure gradient (differentiable version).
IncompressibleNavierStokes.scalewithvolume! Method
scalewithvolume!(p, setup) -> Any
Scale scalar field with volume sizes (in-place version).
IncompressibleNavierStokes.scalewithvolume Method
scalewithvolume(p, setup) -> Any
Scale scalar field p
with volume sizes (differentiable version).
IncompressibleNavierStokes.smagorinsky_closure Method
smagorinsky_closure(
setup
) -> IncompressibleNavierStokes.var"#closure#181"
Create Smagorinsky closure model m
. The model is called as m(u, θ)
, where the Smagorinsky constant θ
should be a scalar between 0
and 1
(for example θ = 0.1
).
IncompressibleNavierStokes.smagtensor! Method
smagtensor!(σ, u, θ, setup) -> Any
Compute Smagorinsky stress tensors σ[I]
(in-place version). The Smagorinsky constant θ
should be a scalar between 0
and 1
.
IncompressibleNavierStokes.tensorbasis! Method
tensorbasis!(B, V, u, setup) -> Tuple{Any, Any}
Compute symmetry tensor basis B[1]
-B[11]
and invariants V[1]
-V[5]
, as specified in [9] in equations (9) and (11). Note that B[1]
corresponds to V
to
IncompressibleNavierStokes.tensorbasis Method
tensorbasis(u, setup) -> Tuple{Tuple, Tuple}
Compute symmetry tensor basis (differentiable version).
IncompressibleNavierStokes.total_kinetic_energy Method
total_kinetic_energy(u, setup; kwargs...) -> Any
Compute total kinetic energy. The velocity components are interpolated to the volume centers and squared.
IncompressibleNavierStokes.unit_cartesian_indices Method
unit_cartesian_indices(D) -> Any
Get tuple of all unit vectors as Cartesian indices.
IncompressibleNavierStokes.vorticity! Method
vorticity!(ω, u, setup) -> Any
Compute vorticity field (in-place version).
IncompressibleNavierStokes.vorticity Method
vorticity(u, setup) -> Any
Compute vorticity field (differentiable version).
IncompressibleNavierStokes.laplacian_mat Method
laplacian_mat(setup) -> Any
Get matrix for the Laplacian operator.