Skip to content

Commit

Permalink
Assure conservation for SSP scheme (#1640)
Browse files Browse the repository at this point in the history
* Add denominator variable for SSP scheme

* Fix format

* Implement suggestions
  • Loading branch information
bennibolm authored Sep 16, 2023
1 parent 6069149 commit 73384ac
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/time_integration/methods_SSP.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@ The third-order SSP Runge-Kutta method of Shu and Osher.
This is an experimental feature and may change in future releases.
"""
struct SimpleSSPRK33{StageCallbacks} <: SimpleAlgorithmSSP
a::SVector{3, Float64}
b::SVector{3, Float64}
numerator_a::SVector{3, Float64}
numerator_b::SVector{3, Float64}
denominator::SVector{3, Float64}
c::SVector{3, Float64}
stage_callbacks::StageCallbacks

function SimpleSSPRK33(; stage_callbacks = ())
a = SVector(0.0, 3 / 4, 1 / 3)
b = SVector(1.0, 1 / 4, 2 / 3)
numerator_a = SVector(0.0, 3.0, 1.0) # a = numerator_a / denominator
numerator_b = SVector(1.0, 1.0, 2.0) # b = numerator_b / denominator
denominator = SVector(1.0, 4.0, 3.0)
c = SVector(0.0, 1.0, 1 / 2)

# Butcher tableau
Expand All @@ -42,7 +44,8 @@ struct SimpleSSPRK33{StageCallbacks} <: SimpleAlgorithmSSP
# --------------------
# b | 1/6 1/6 2/3

new{typeof(stage_callbacks)}(a, b, c, stage_callbacks)
new{typeof(stage_callbacks)}(numerator_a, numerator_b, denominator, c,
stage_callbacks)
end
end

Expand Down Expand Up @@ -166,7 +169,9 @@ function solve!(integrator::SimpleIntegratorSSP)
end

# perform convex combination
@. integrator.u = alg.a[stage] * integrator.r0 + alg.b[stage] * integrator.u
@. integrator.u = (alg.numerator_a[stage] * integrator.r0 +
alg.numerator_b[stage] * integrator.u) /
alg.denominator[stage]
end

integrator.iter += 1
Expand Down

0 comments on commit 73384ac

Please sign in to comment.