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

Replace mutable structs using Accessors #2052

Merged
merged 13 commits into from
Sep 11, 2024
1 change: 1 addition & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ authors = ["Michael Schlottke-Lakemper <[email protected]>", "Gregor
version = "0.8.9-DEV"

[deps]
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
ranocha marked this conversation as resolved.
Show resolved Hide resolved
CodeTracking = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2"
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
Expand Down
1 change: 1 addition & 0 deletions src/Trixi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ module Trixi
# Include other packages that are used in Trixi.jl
# (standard library packages first, other packages next, all of them sorted alphabetically)

using Accessors: @reset
using LinearAlgebra: LinearAlgebra, Diagonal, diag, dot, mul!, norm, cross, normalize, I,
UniformScaling, det
using Printf: @printf, @sprintf, println
Expand Down
5 changes: 4 additions & 1 deletion src/callbacks_step/glm_speed.jl
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,10 @@ function update_cleaning_speed!(semi, glm_speed_callback, dt)
c_h_deltat = calc_dt_for_cleaning_speed(cfl, mesh, equations, solver, cache)

# c_h is proportional to its own time step divided by the complete MHD time step
equations.c_h = glm_scale * c_h_deltat / dt
# We use @reset here since the equations are immutable (to work on GPUs etc.).
# Thus, we need to modify the equations field of the semidiscretization.
@reset equations.c_h = glm_scale * c_h_deltat / dt
semi.equations = equations
huiyuxie marked this conversation as resolved.
Show resolved Hide resolved

return semi
end
Expand Down
9 changes: 7 additions & 2 deletions src/equations/ideal_glm_mhd_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
The ideal compressible GLM-MHD equations for an ideal gas with ratio of
specific heats `gamma` in two space dimensions.
"""
mutable struct IdealGlmMhdEquations2D{RealT <: Real} <:
AbstractIdealGlmMhdEquations{2, 9}
struct IdealGlmMhdEquations2D{RealT <: Real} <:
AbstractIdealGlmMhdEquations{2, 9}
gamma::RealT # ratio of specific heats
inv_gamma_minus_one::RealT # = inv(gamma - 1); can be used to write slow divisions as fast multiplications
c_h::RealT # GLM cleaning speed
Expand All @@ -28,6 +28,11 @@ function IdealGlmMhdEquations2D(gamma; initial_c_h = convert(typeof(gamma), NaN)
IdealGlmMhdEquations2D(promote(gamma, initial_c_h)...)
end

# Outer constructor for `@reset` works correctly
function IdealGlmMhdEquations2D(gamma, inv_gamma_minus_one, c_h)
IdealGlmMhdEquations2D(gamma, c_h)
end
huiyuxie marked this conversation as resolved.
Show resolved Hide resolved

have_nonconservative_terms(::IdealGlmMhdEquations2D) = True()
n_nonconservative_terms(::IdealGlmMhdEquations2D) = 2

Expand Down
9 changes: 7 additions & 2 deletions src/equations/ideal_glm_mhd_3d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
The ideal compressible GLM-MHD equations for an ideal gas with ratio of
specific heats `gamma` in three space dimensions.
"""
mutable struct IdealGlmMhdEquations3D{RealT <: Real} <:
AbstractIdealGlmMhdEquations{3, 9}
struct IdealGlmMhdEquations3D{RealT <: Real} <:
AbstractIdealGlmMhdEquations{3, 9}
gamma::RealT # ratio of specific heats
inv_gamma_minus_one::RealT # = inv(gamma - 1); can be used to write slow divisions as fast multiplications
c_h::RealT # GLM cleaning speed
Expand All @@ -28,6 +28,11 @@ function IdealGlmMhdEquations3D(gamma; initial_c_h = convert(typeof(gamma), NaN)
IdealGlmMhdEquations3D(promote(gamma, initial_c_h)...)
end

# Outer constructor for `@reset` works correctly
function IdealGlmMhdEquations3D(gamma, inv_gamma_minus_one, c_h)
IdealGlmMhdEquations3D(gamma, c_h)
end
huiyuxie marked this conversation as resolved.
Show resolved Hide resolved

have_nonconservative_terms(::IdealGlmMhdEquations3D) = True()
function varnames(::typeof(cons2cons), ::IdealGlmMhdEquations3D)
("rho", "rho_v1", "rho_v2", "rho_v3", "rho_e", "B1", "B2", "B3", "psi")
Expand Down
9 changes: 7 additions & 2 deletions src/equations/ideal_glm_mhd_multicomponent_1d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

The ideal compressible multicomponent GLM-MHD equations in one space dimension.
"""
mutable struct IdealGlmMhdMulticomponentEquations1D{NVARS, NCOMP, RealT <: Real} <:
AbstractIdealGlmMhdMulticomponentEquations{1, NVARS, NCOMP}
struct IdealGlmMhdMulticomponentEquations1D{NVARS, NCOMP, RealT <: Real} <:
AbstractIdealGlmMhdMulticomponentEquations{1, NVARS, NCOMP}
gammas::SVector{NCOMP, RealT}
gas_constants::SVector{NCOMP, RealT}
cv::SVector{NCOMP, RealT}
Expand Down Expand Up @@ -51,6 +51,11 @@ function IdealGlmMhdMulticomponentEquations1D(; gammas, gas_constants)
__gas_constants)
end

# Outer constructor for `@reset` works correctly
function IdealGlmMhdMulticomponentEquations1D(gammas, gas_constants, cv, cp, c_h)
IdealGlmMhdMulticomponentEquations1D(gammas = gammas, gas_constants = gas_constants)
end
huiyuxie marked this conversation as resolved.
Show resolved Hide resolved

@inline function Base.real(::IdealGlmMhdMulticomponentEquations1D{NVARS, NCOMP, RealT}) where {
NVARS,
NCOMP,
Expand Down
43 changes: 33 additions & 10 deletions src/equations/ideal_glm_mhd_multicomponent_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

The ideal compressible multicomponent GLM-MHD equations in two space dimensions.
"""
mutable struct IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT <: Real} <:
AbstractIdealGlmMhdMulticomponentEquations{2, NVARS, NCOMP}
struct IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT <: Real} <:
AbstractIdealGlmMhdMulticomponentEquations{2, NVARS, NCOMP}
gammas::SVector{NCOMP, RealT}
gas_constants::SVector{NCOMP, RealT}
cv::SVector{NCOMP, RealT}
Expand All @@ -21,18 +21,19 @@ mutable struct IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT <: Real}
function IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT}(gammas::SVector{NCOMP,
RealT},
gas_constants::SVector{NCOMP,
RealT}) where {
NVARS,
NCOMP,
RealT <:
Real
}
RealT},
c_h::RealT) where {
NVARS,
NCOMP,
RealT <:
Real
}
NCOMP >= 1 ||
throw(DimensionMismatch("`gammas` and `gas_constants` have to be filled with at least one value"))

cv = gas_constants ./ (gammas .- 1)
cp = gas_constants + gas_constants ./ (gammas .- 1)
c_h = convert(eltype(gammas), NaN)
c_h = convert(eltype(gammas), c_h)

new(gammas, gas_constants, cv, cp, c_h)
end
Expand All @@ -49,8 +50,30 @@ function IdealGlmMhdMulticomponentEquations2D(; gammas, gas_constants)
__gammas = SVector(map(RealT, _gammas))
__gas_constants = SVector(map(RealT, _gas_constants))

c_h = convert(RealT, NaN)

return IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT}(__gammas,
__gas_constants,
c_h)
end

# Outer constructor for `@reset` works correctly
function IdealGlmMhdMulticomponentEquations2D(gammas, gas_constants, cv, cp, c_h)
_gammas = promote(gammas...)
_gas_constants = promote(gas_constants...)
RealT = promote_type(eltype(_gammas), eltype(_gas_constants))

NVARS = length(_gammas) + 8
NCOMP = length(_gammas)

__gammas = SVector(map(RealT, _gammas))
__gas_constants = SVector(map(RealT, _gas_constants))

c_h = convert(RealT, c_h)

return IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT}(__gammas,
__gas_constants)
__gas_constants,
c_h)
end

@inline function Base.real(::IdealGlmMhdMulticomponentEquations2D{NVARS, NCOMP, RealT}) where {
Expand Down
8 changes: 6 additions & 2 deletions src/semidiscretization/semidiscretization_coupled.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ The semidiscretizations can be coupled by gluing meshes together using [`Boundar
!!! warning "Experimental code"
This is an experimental feature and can change any time.
"""
struct SemidiscretizationCoupled{S, Indices, EquationList} <: AbstractSemidiscretization
mutable struct SemidiscretizationCoupled{S, Indices, EquationList} <:
AbstractSemidiscretization
semis::S
u_indices::Indices # u_ode[u_indices[i]] is the part of u_ode corresponding to semis[i]
performance_counter::PerformanceCounter
Expand Down Expand Up @@ -383,7 +384,10 @@ function update_cleaning_speed!(semi_coupled::SemidiscretizationCoupled,
c_h_deltat = calc_dt_for_cleaning_speed(cfl, mesh, equations, solver, cache)

# c_h is proportional to its own time step divided by the complete MHD time step
equations.c_h = glm_scale * c_h_deltat / dt
# We use @reset here since the equations are immutable (to work on GPUs etc.).
# Thus, we need to modify the equations field of the semidiscretization.
@reset equations.c_h = glm_scale * c_h_deltat / dt
semi.equations = equations
huiyuxie marked this conversation as resolved.
Show resolved Hide resolved
huiyuxie marked this conversation as resolved.
Show resolved Hide resolved
end

return semi_coupled
Expand Down
8 changes: 4 additions & 4 deletions src/semidiscretization/semidiscretization_hyperbolic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
A struct containing everything needed to describe a spatial semidiscretization
of a hyperbolic conservation law.
"""
struct SemidiscretizationHyperbolic{Mesh, Equations, InitialCondition,
BoundaryConditions,
SourceTerms, Solver, Cache} <:
AbstractSemidiscretization
mutable struct SemidiscretizationHyperbolic{Mesh, Equations, InitialCondition,
BoundaryConditions,
SourceTerms, Solver, Cache} <:
AbstractSemidiscretization
mesh::Mesh
equations::Equations

Expand Down
Loading