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

Subcell limiting: Revise order of bounds using a Dict #1649

Merged
8 changes: 4 additions & 4 deletions src/solvers/dgsem_tree/containers_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1334,7 +1334,7 @@ mutable struct ContainerSubcellLimiterIDP2D{uEltype <: Real}
end

function ContainerSubcellLimiterIDP2D{uEltype}(capacity::Integer, n_nodes,
length) where {uEltype <: Real}
number_bounds) where {uEltype <: Real}
nan_uEltype = convert(uEltype, NaN)

# Initialize fields with defaults
Expand All @@ -1345,9 +1345,9 @@ function ContainerSubcellLimiterIDP2D{uEltype}(capacity::Integer, n_nodes,
_alpha2 = fill(nan_uEltype, n_nodes * (n_nodes + 1) * capacity)
alpha2 = unsafe_wrap(Array, pointer(_alpha2), (n_nodes, n_nodes + 1, capacity))

_variable_bounds = Vector{Vector{uEltype}}(undef, length)
variable_bounds = Vector{Array{uEltype, 3}}(undef, length)
for i in 1:length
_variable_bounds = Vector{Vector{uEltype}}(undef, number_bounds)
variable_bounds = Vector{Array{uEltype, 3}}(undef, number_bounds)
for i in 1:number_bounds
_variable_bounds[i] = fill(nan_uEltype, n_nodes * n_nodes * capacity)
variable_bounds[i] = unsafe_wrap(Array, pointer(_variable_bounds[i]),
(n_nodes, n_nodes, capacity))
Expand Down
10 changes: 8 additions & 2 deletions src/solvers/dgsem_tree/subcell_limiters.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,15 @@ function SubcellLimiterIDP(equations::AbstractEquations, basis;
positivity_variables_cons = [],
positivity_correction_factor = 0.1)
positivity = (length(positivity_variables_cons) > 0)
number_bounds = length(positivity_variables_cons)

cache = create_cache(SubcellLimiterIDP, equations, basis, number_bounds)
bounds_order = Dict()
sloede marked this conversation as resolved.
Show resolved Hide resolved
counter = 1
for index in positivity_variables_cons
bounds_order = Dict(bounds_order..., "$(index)_min" => counter)
sloede marked this conversation as resolved.
Show resolved Hide resolved
sloede marked this conversation as resolved.
Show resolved Hide resolved
counter += 1
end

cache = create_cache(SubcellLimiterIDP, equations, basis, bounds_order)

SubcellLimiterIDP{typeof(positivity_correction_factor), typeof(cache)}(positivity,
positivity_variables_cons,
Expand Down
15 changes: 7 additions & 8 deletions src/solvers/dgsem_tree/subcell_limiters_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,14 @@
#! format: noindent

# this method is used when the limiter is constructed as for shock-capturing volume integrals
function create_cache(indicator::Type{SubcellLimiterIDP},
equations::AbstractEquations{2},
basis::LobattoLegendreBasis, number_bounds)
function create_cache(limiter::Type{SubcellLimiterIDP}, equations::AbstractEquations{2},
basis::LobattoLegendreBasis, bounds_order)
subcell_limiter_coefficients = Trixi.ContainerSubcellLimiterIDP2D{real(basis)
}(0,
nnodes(basis),
number_bounds)
length(bounds_order))

cache = (; subcell_limiter_coefficients)

return cache
return (; subcell_limiter_coefficients, bounds_order)
end

function (limiter::SubcellLimiterIDP)(u::AbstractArray{<:Any, 4}, semi, dg::DGSEM, t,
Expand Down Expand Up @@ -65,7 +62,9 @@ end

@unpack variable_bounds = limiter.cache.subcell_limiter_coefficients

var_min = variable_bounds[index]
(; variable_bounds) = limiter.cache.subcell_limiter_coefficients
(; bounds_order) = limiter.cache
var_min = variable_bounds[bounds_order["$(variable)_min"]]
bennibolm marked this conversation as resolved.
Show resolved Hide resolved

@threaded for element in eachelement(dg, semi.cache)
inverse_jacobian = cache.elements.inverse_jacobian[element]
Expand Down