Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sutherlands Law for temperature dependent viscosity #1808

Merged
merged 45 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
8b0ad52
sample 2D
DanielDoehring Jan 19, 2024
cb8366a
bug fixes
DanielDoehring Jan 19, 2024
4cb135b
typo
DanielDoehring Jan 21, 2024
4819fc3
sutherlands 1d
DanielDoehring Jan 21, 2024
56afd97
sutherlands 3d
DanielDoehring Jan 21, 2024
96339b9
Merge branch 'main' into SutherlandsLaw
DanielDoehring Jan 21, 2024
3ba7388
fmt
DanielDoehring Jan 21, 2024
4cf4db7
Merge branch 'main' into SutherlandsLaw
DanielDoehring Jan 22, 2024
fe859cc
Merge branch 'main' into SutherlandsLaw
DanielDoehring Jan 23, 2024
33e0c44
Merge branch 'main' into SutherlandsLaw
DanielDoehring Jan 31, 2024
428d05f
Merge branch 'main' into SutherlandsLaw
DanielDoehring Jan 31, 2024
9e8cf27
Merge branch 'main' into SutherlandsLaw
DanielDoehring Jan 31, 2024
df9a0cc
Merge branch 'main' into SutherlandsLaw
DanielDoehring Feb 1, 2024
5307c84
main merge
DanielDoehring Mar 6, 2024
bf1f79e
Merge branch 'main' into SutherlandsLaw
DanielDoehring Mar 6, 2024
9db2b64
test var mu
DanielDoehring Mar 6, 2024
d6fd3bd
variable mu
DanielDoehring Mar 6, 2024
ddc258b
Merge branch 'SutherlandsLaw' of github.com:DanielDoehring/Trixi.jl i…
DanielDoehring Mar 6, 2024
0507e1a
fmt
DanielDoehring Mar 6, 2024
bf88ef8
example using sutherland
DanielDoehring Mar 6, 2024
6e4f1d1
comment
DanielDoehring Mar 6, 2024
dc794f9
example
DanielDoehring Mar 6, 2024
4ddd55c
reset toml
DanielDoehring Mar 6, 2024
7abf37f
Merge branch 'main' into SutherlandsLaw
DanielDoehring Mar 6, 2024
4ec5a29
Merge branch 'main' into SutherlandsLaw
DanielDoehring Mar 6, 2024
1516991
Shorten
DanielDoehring Mar 7, 2024
15f47d6
Unit test
DanielDoehring Mar 7, 2024
08347d9
fmt
DanielDoehring Mar 7, 2024
99c7ef2
Update examples/tree_2d_dgsem/elixir_navierstokes_taylor_green_vortex…
DanielDoehring Mar 18, 2024
b07287d
remove todo
DanielDoehring Mar 18, 2024
40287d0
Merge branch 'main' into SutherlandsLaw
DanielDoehring Mar 18, 2024
319005e
Apply suggestions from code review
DanielDoehring Mar 18, 2024
4ddfaf6
test vals
DanielDoehring Mar 18, 2024
040eca8
non-functionalized mu
DanielDoehring Mar 19, 2024
1b55228
comments & dosctrings
DanielDoehring Mar 19, 2024
4580ac8
docstrings
DanielDoehring Mar 19, 2024
08bd818
fix tests
DanielDoehring Mar 19, 2024
b0d2c6e
avoid if
DanielDoehring Mar 22, 2024
03c7c88
docstring and comments
DanielDoehring Mar 22, 2024
e521e09
Merge branch 'main' into SutherlandsLaw
DanielDoehring Mar 22, 2024
e743e8d
Update src/equations/compressible_navier_stokes.jl
DanielDoehring Mar 22, 2024
5c4c001
fmt
DanielDoehring Mar 22, 2024
c9a26ae
Merge branch 'SutherlandsLaw' of github.com:DanielDoehring/Trixi.jl i…
DanielDoehring Mar 22, 2024
f9091d9
Merge branch 'main' into SutherlandsLaw
DanielDoehring Mar 25, 2024
042b18e
Merge branch 'main' into SutherlandsLaw
jlchan Mar 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions examples/dgmulti_2d/elixir_navierstokes_lid_driven_cavity.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ using Trixi
###############################################################################
# semidiscretization of the ideal compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 0.001
mu = 0.001

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600
mu = 6.25e-4 # equivalent to Re = 1600

equations = CompressibleEulerEquations3D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu,
Prandtl = prandtl_number())

"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ using Trixi
###############################################################################
# semidiscretization of the ideal compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 0.001
mu = 0.001

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ using Trixi
###############################################################################
# semidiscretization of the ideal compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 0.001
mu = 0.001

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux
Expand Down
5 changes: 2 additions & 3 deletions examples/p4est_3d_dgsem/elixir_navierstokes_blast_wave_amr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600
mu = 6.25e-4 # equivalent to Re = 1600

equations = CompressibleEulerEquations3D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu,
Prandtl = prandtl_number())

function initial_condition_3d_blast_wave(x, t, equations::CompressibleEulerEquations3D)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600
mu = 6.25e-4 # equivalent to Re = 1600

equations = CompressibleEulerEquations3D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu,
Prandtl = prandtl_number())

"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600
mu = 6.25e-4 # equivalent to Re = 1600

equations = CompressibleEulerEquations3D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu,
Prandtl = prandtl_number())

"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ using Trixi
###############################################################################
# semidiscretization of the ideal compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 0.001
mu = 0.001

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux
Expand Down
5 changes: 2 additions & 3 deletions examples/tree_2d_dgsem/elixir_navierstokes_shearlayer_amr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 1.0 / 3.0 * 10^(-5) # equivalent to Re = 30,000
mu = 1.0 / 3.0 * 10^(-4) # equivalent to Re = 30,000

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600
mu = 6.25e-4 # equivalent to Re = 1600

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

"""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@

using OrdinaryDiffEq
using Trixi

###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

prandtl_number() = 0.72

# Use Sutherland's law for a temperature-dependent viscosity.
# For details, see e.g.
# Frank M. White: Viscous Fluid Flow, 2nd Edition.
# 1991, McGraw-Hill, ISBN, 0-07-069712-4
# Pages 28 and 29.
@inline function mu(u, equations)
sloede marked this conversation as resolved.
Show resolved Hide resolved
T_ref = 291.15

R_specific_air = 287.052874
T = R_specific_air * Trixi.temperature(u, equations)

C_air = 120.0
mu_ref_air = 1.827e-5

return mu_ref_air * (T_ref + C_air) / (T + C_air) * (T / T_ref)^1.5
end

equations = CompressibleEulerEquations2D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu,
Prandtl = prandtl_number())

"""
initial_condition_taylor_green_vortex(x, t, equations::CompressibleEulerEquations2D)

The classical viscous Taylor-Green vortex in 2D.
This forms the basis behind the 3D case found for instance in
- Jonathan R. Bull and Antony Jameson
Simulation of the Compressible Taylor Green Vortex using High-Order Flux Reconstruction Schemes
[DOI: 10.2514/6.2014-3210](https://doi.org/10.2514/6.2014-3210)
"""
function initial_condition_taylor_green_vortex(x, t,
equations::CompressibleEulerEquations2D)
A = 1.0 # magnitude of speed
Ms = 0.1 # maximum Mach number

rho = 1.0
v1 = A * sin(x[1]) * cos(x[2])
v2 = -A * cos(x[1]) * sin(x[2])
p = (A / Ms)^2 * rho / equations.gamma # scaling to get Ms
p = p + 1.0 / 4.0 * A^2 * rho * (cos(2 * x[1]) + cos(2 * x[2]))

return prim2cons(SVector(rho, v1, v2, p), equations)
end
initial_condition = initial_condition_taylor_green_vortex

volume_flux = flux_ranocha
solver = DGSEM(polydeg = 3, surface_flux = flux_hllc,
volume_integral = VolumeIntegralFluxDifferencing(volume_flux))

coordinates_min = (-1.0, -1.0) .* pi
coordinates_max = (1.0, 1.0) .* pi
mesh = TreeMesh(coordinates_min, coordinates_max,
initial_refinement_level = 4,
n_cells_max = 100_000)

semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),
initial_condition, solver)

###############################################################################
# ODE solvers, callbacks etc.

tspan = (0.0, 20.0)
ode = semidiscretize(semi, tspan)

summary_callback = SummaryCallback()

analysis_interval = 100
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
save_analysis = true,
extra_analysis_integrals = (energy_kinetic,
energy_internal))

alive_callback = AliveCallback(analysis_interval = analysis_interval)

callbacks = CallbackSet(summary_callback,
analysis_callback,
alive_callback)

###############################################################################
# run the simulation

time_int_tol = 1e-9
sol = solve(ode, RDPK3SpFSAL49(); abstol = time_int_tol, reltol = time_int_tol,
ode_default_options()..., callback = callbacks)
summary_callback() # print the timer summary
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ using Trixi
###############################################################################
# semidiscretization of the compressible Navier-Stokes equations

# TODO: parabolic; unify names of these accessor functions
prandtl_number() = 0.72
mu() = 6.25e-4 # equivalent to Re = 1600
mu = 6.25e-4 # equivalent to Re = 1600

equations = CompressibleEulerEquations3D(1.4)
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu(),
equations_parabolic = CompressibleNavierStokesDiffusion3D(equations, mu = mu,
Prandtl = prandtl_number())

"""
Expand Down
14 changes: 14 additions & 0 deletions src/equations/compressible_navier_stokes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,17 @@ Under `GradientVariablesEntropy`, the Navier-Stokes discretization is provably e
"""
struct GradientVariablesPrimitive end
struct GradientVariablesEntropy end

"""
dynamic_viscosity(u, equations)

Wrapper for the dynamic viscosity that calls
`dynamic_viscosity(u, equations.mu, equations)` which dispatches on the type of
`equations.mu`.
For constant `equations.mu`, i.e., `equations.mu` is of `Real`-type it is returned directly.
In the opposite case, `equations.mu` is assumed to be a function with arguments
`u` and `equations` and is called with these arguments.
DanielDoehring marked this conversation as resolved.
Show resolved Hide resolved
"""
dynamic_viscosity(u, equations) = dynamic_viscosity(u, equations.mu, equations)
dynamic_viscosity(u, mu::Real, equations) = mu
dynamic_viscosity(u, mu::T, equations) where {T} = mu(u, equations)
26 changes: 16 additions & 10 deletions src/equations/compressible_navier_stokes_1d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ the [`CompressibleEulerEquations1D`](@ref).

Fluid properties such as the dynamic viscosity ``\mu`` can be provided in any consistent unit system, e.g.,
[``\mu``] = kg m⁻¹ s⁻¹.
The viscosity ``\mu`` may be a constant or a function of the current state, e.g.,
depending on temperature (Sutherland's law): ``\mu = \mu(T)``.
DanielDoehring marked this conversation as resolved.
Show resolved Hide resolved
In the latter case, the function `mu` needs to have the signature `mu(u, equations)`.

The particular form of the compressible Navier-Stokes implemented is
```math
Expand Down Expand Up @@ -80,7 +83,7 @@ where
w_2 = \frac{\rho v1}{p},\, w_3 = -\frac{\rho}{p}
```
"""
struct CompressibleNavierStokesDiffusion1D{GradientVariables, RealT <: Real,
struct CompressibleNavierStokesDiffusion1D{GradientVariables, RealT <: Real, Mu,
E <: AbstractCompressibleEulerEquations{1}} <:
AbstractCompressibleNavierStokesDiffusion{1, 3, GradientVariables}
# TODO: parabolic
Expand All @@ -89,7 +92,7 @@ struct CompressibleNavierStokesDiffusion1D{GradientVariables, RealT <: Real,
gamma::RealT # ratio of specific heats
inv_gamma_minus_one::RealT # = inv(gamma - 1); can be used to write slow divisions as fast multiplications

mu::RealT # viscosity
mu::Mu # viscosity
Pr::RealT # Prandtl number
kappa::RealT # thermal diffusivity for Fick's law

Expand All @@ -103,16 +106,17 @@ function CompressibleNavierStokesDiffusion1D(equations::CompressibleEulerEquatio
gradient_variables = GradientVariablesPrimitive())
gamma = equations.gamma
inv_gamma_minus_one = equations.inv_gamma_minus_one
μ, Pr = promote(mu, Prandtl)

# Under the assumption of constant Prandtl number the thermal conductivity
# constant is kappa = gamma μ / ((gamma-1) Pr).
# constant is kappa = gamma μ / ((gamma-1) Prandtl).
# Important note! Factor of μ is accounted for later in `flux`.
kappa = gamma * inv_gamma_minus_one / Pr
# This avoids recomputation of kappa for non-constant μ.
kappa = gamma * inv_gamma_minus_one / Prandtl

CompressibleNavierStokesDiffusion1D{typeof(gradient_variables), typeof(gamma),
typeof(mu),
typeof(equations)}(gamma, inv_gamma_minus_one,
μ, Pr, kappa,
mu, Prandtl, kappa,
equations,
gradient_variables)
end
Expand Down Expand Up @@ -159,10 +163,12 @@ function flux(u, gradients, orientation::Integer,
# in the implementation
q1 = equations.kappa * dTdx

# Constant dynamic viscosity is copied to a variable for readability.
# Offers flexibility for dynamic viscosity via Sutherland's law where it depends
# on temperature and reference values, Ts and Tref such that mu(T)
mu = equations.mu
# In the simplest cases, the user passed in `mu` or `mu()`
# (which returns just a constant) but
# more complex functions like Sutherland's law are possible.
# `dynamic_viscosity` is a helper function that handles both cases
# by dispatching on the type of `equations.mu`.
mu = dynamic_viscosity(u, equations)

# viscous flux components in the x-direction
f1 = zero(rho)
Expand Down
Loading
Loading