Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 0 additions & 12 deletions src/solvers/dg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -710,18 +710,6 @@ function Base.show(io::IO, mime::MIME"text/plain",
end
end

# Required to be able to run `SimpleSSPRK33` without `VolumeIntegralSubcellLimiting`
Base.resize!(semi, volume_integral::AbstractVolumeIntegral, new_size) = nothing

function Base.resize!(semi, volume_integral::VolumeIntegralSubcellLimiting, new_size)
# Resize container antidiffusive_fluxes
resize!(semi.cache.antidiffusive_fluxes, new_size)

# Resize container subcell_limiter_coefficients
@unpack limiter = volume_integral
return resize!(limiter.cache.subcell_limiter_coefficients, new_size)
end

# TODO: FD. Should this definition live in a different file because it is
# not strictly a DG method?
"""
Expand Down
3 changes: 2 additions & 1 deletion src/solvers/dgsem_p4est/dg_3d_subcell_limiters.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ function create_cache(mesh::P4estMesh{3},
nnodes(dg), nnodes(dg), nnodes(dg))
for _ in 1:Threads.maxthreadid()]

antidiffusive_fluxes = ContainerAntidiffusiveFlux3D{uEltype}(0,
n_elements = nelements(cache_containers.elements)
antidiffusive_fluxes = ContainerAntidiffusiveFlux3D{uEltype}(n_elements,
nvariables(equations),
nnodes(dg))

Expand Down
3 changes: 2 additions & 1 deletion src/solvers/dgsem_p4est/subcell_limiters_3d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,8 @@ end
variable, min_or_max,
initial_check, final_check,
inverse_jacobian, dt,
equations, dg, cache, limiter)
equations::AbstractEquations{3},
dg, cache, limiter)
(; inverse_weights) = dg.basis # Plays role of inverse DG-subcell sizes
(; antidiffusive_flux1_L, antidiffusive_flux1_R, antidiffusive_flux2_L, antidiffusive_flux2_R, antidiffusive_flux3_L, antidiffusive_flux3_R) = cache.antidiffusive_fluxes

Expand Down
30 changes: 19 additions & 11 deletions src/solvers/dgsem_tree/containers_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1342,6 +1342,9 @@ function ContainerAntidiffusiveFlux2D{uEltype}(capacity::Integer, n_variables,
antidiffusive_flux2_R = unsafe_wrap(Array, pointer(_antidiffusive_flux2_R),
(n_variables, n_nodes, n_nodes + 1, capacity))

reset_antidiffusive_fluxes!(antidiffusive_flux1_L, antidiffusive_flux1_R,
antidiffusive_flux2_L, antidiffusive_flux2_R)

return ContainerAntidiffusiveFlux2D{uEltype}(antidiffusive_flux1_L,
antidiffusive_flux1_R,
antidiffusive_flux2_L,
Expand Down Expand Up @@ -1380,17 +1383,22 @@ function Base.resize!(fluxes::ContainerAntidiffusiveFlux2D, capacity)
(n_variables, n_nodes, n_nodes + 1,
capacity))

uEltype = eltype(fluxes.antidiffusive_flux1_L)
@threaded for element in axes(fluxes.antidiffusive_flux1_L, 4)
fluxes.antidiffusive_flux1_L[:, 1, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux1_L[:, n_nodes + 1, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux1_R[:, 1, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux1_R[:, n_nodes + 1, :, element] .= zero(uEltype)

fluxes.antidiffusive_flux2_L[:, :, 1, element] .= zero(uEltype)
fluxes.antidiffusive_flux2_L[:, :, n_nodes + 1, element] .= zero(uEltype)
fluxes.antidiffusive_flux2_R[:, :, 1, element] .= zero(uEltype)
fluxes.antidiffusive_flux2_R[:, :, n_nodes + 1, element] .= zero(uEltype)
return nothing
end

function reset_antidiffusive_fluxes!(antidiffusive_flux1_L, antidiffusive_flux1_R,
antidiffusive_flux2_L, antidiffusive_flux2_R)
uEltype = eltype(antidiffusive_flux1_L)
@threaded for element in axes(antidiffusive_flux1_L, 4)
antidiffusive_flux1_L[:, 1, :, element] .= zero(uEltype)
antidiffusive_flux1_L[:, end, :, element] .= zero(uEltype)
antidiffusive_flux1_R[:, 1, :, element] .= zero(uEltype)
antidiffusive_flux1_R[:, end, :, element] .= zero(uEltype)

antidiffusive_flux2_L[:, :, 1, element] .= zero(uEltype)
antidiffusive_flux2_L[:, :, end, element] .= zero(uEltype)
antidiffusive_flux2_R[:, :, 1, element] .= zero(uEltype)
antidiffusive_flux2_R[:, :, end, element] .= zero(uEltype)
end

return nothing
Expand Down
43 changes: 27 additions & 16 deletions src/solvers/dgsem_tree/containers_3d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,11 @@ function ContainerAntidiffusiveFlux3D{uEltype}(capacity::Integer, n_variables,
antidiffusive_flux3_R = unsafe_wrap(Array, pointer(_antidiffusive_flux3_R),
(n_variables, n_nodes, n_nodes, n_nodes + 1,
capacity))

reset_antidiffusive_fluxes!(antidiffusive_flux1_L, antidiffusive_flux1_R,
antidiffusive_flux2_L, antidiffusive_flux2_R,
antidiffusive_flux3_L, antidiffusive_flux3_R)

return ContainerAntidiffusiveFlux3D{uEltype}(antidiffusive_flux1_L,
antidiffusive_flux1_R,
antidiffusive_flux2_L,
Expand Down Expand Up @@ -908,22 +913,28 @@ function Base.resize!(fluxes::ContainerAntidiffusiveFlux3D, capacity)
n_nodes, n_nodes, n_nodes + 1,
capacity))

uEltype = eltype(fluxes.antidiffusive_flux1_L)
@threaded for element in axes(fluxes.antidiffusive_flux1_L, 5)
fluxes.antidiffusive_flux1_L[:, 1, :, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux1_L[:, n_nodes + 1, :, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux1_R[:, 1, :, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux1_R[:, n_nodes + 1, :, :, element] .= zero(uEltype)

fluxes.antidiffusive_flux2_L[:, :, 1, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux2_L[:, :, n_nodes + 1, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux2_R[:, :, 1, :, element] .= zero(uEltype)
fluxes.antidiffusive_flux2_R[:, :, n_nodes + 1, :, element] .= zero(uEltype)

fluxes.antidiffusive_flux3_L[:, :, :, 1, element] .= zero(uEltype)
fluxes.antidiffusive_flux3_L[:, :, :, n_nodes + 1, element] .= zero(uEltype)
fluxes.antidiffusive_flux3_R[:, :, :, 1, element] .= zero(uEltype)
fluxes.antidiffusive_flux3_R[:, :, :, n_nodes + 1, element] .= zero(uEltype)
return nothing
end

function reset_antidiffusive_fluxes!(antidiffusive_flux1_L, antidiffusive_flux1_R,
antidiffusive_flux2_L, antidiffusive_flux2_R,
antidiffusive_flux3_L, antidiffusive_flux3_R)
uEltype = eltype(antidiffusive_flux1_L)
@threaded for element in axes(antidiffusive_flux1_L, 5)
antidiffusive_flux1_L[:, 1, :, :, element] .= zero(uEltype)
antidiffusive_flux1_L[:, end, :, :, element] .= zero(uEltype)
antidiffusive_flux1_R[:, 1, :, :, element] .= zero(uEltype)
antidiffusive_flux1_R[:, end, :, :, element] .= zero(uEltype)

antidiffusive_flux2_L[:, :, 1, :, element] .= zero(uEltype)
antidiffusive_flux2_L[:, :, end, :, element] .= zero(uEltype)
antidiffusive_flux2_R[:, :, 1, :, element] .= zero(uEltype)
antidiffusive_flux2_R[:, :, end, :, element] .= zero(uEltype)

antidiffusive_flux3_L[:, :, :, 1, element] .= zero(uEltype)
antidiffusive_flux3_L[:, :, :, end, element] .= zero(uEltype)
antidiffusive_flux3_R[:, :, :, 1, element] .= zero(uEltype)
antidiffusive_flux3_R[:, :, :, end, element] .= zero(uEltype)
end

return nothing
Expand Down
3 changes: 2 additions & 1 deletion src/solvers/dgsem_tree/dg_2d_subcell_limiters.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ function create_cache(mesh::Union{TreeMesh{2}, StructuredMesh{2}, P4estMesh{2}},
nnodes(dg), nnodes(dg))
for _ in 1:Threads.maxthreadid()]

antidiffusive_fluxes = ContainerAntidiffusiveFlux2D{uEltype}(0,
n_elements = nelements(cache_containers.elements)
antidiffusive_fluxes = ContainerAntidiffusiveFlux2D{uEltype}(n_elements,
nvariables(equations),
nnodes(dg))

Expand Down
2 changes: 2 additions & 0 deletions src/solvers/dgsem_tree/subcell_limiters.jl
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ end
function create_cache(limiter::Type{SubcellLimiterIDP},
equations::AbstractEquations{NDIMS},
basis::LobattoLegendreBasis, bound_keys) where {NDIMS}
# The number of elements is not yet known here. So, we initialize the container with 0 elements
# and resize it later while initializing the time integration method in `methods_SSP.jl`.
subcell_limiter_coefficients = Trixi.ContainerSubcellLimiterIDP{NDIMS, real(basis)}(0,
nnodes(basis),
bound_keys)
Expand Down
6 changes: 3 additions & 3 deletions src/solvers/dgsem_tree/subcell_limiters_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -429,13 +429,13 @@ end
###############################################################################
# Newton-bisection method

# 2D version
@inline function newton_loops_alpha!(alpha, bound, u, i, j, element,
variable, min_or_max,
initial_check, final_check,
inverse_jacobian, dt,
equations, dg, cache, limiter)
(; inverse_weights) = dg.basis
equations::AbstractEquations{2},
dg, cache, limiter)
(; inverse_weights) = dg.basis # Plays role of inverse DG-subcell sizes
(; antidiffusive_flux1_L, antidiffusive_flux2_L, antidiffusive_flux1_R, antidiffusive_flux2_R) = cache.antidiffusive_fluxes

(; gamma_constant_newton) = limiter
Expand Down
15 changes: 7 additions & 8 deletions src/time_integration/methods_SSP.jl
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,13 @@ function init(ode::ODEProblem, alg::SimpleAlgorithmSSP;
kwargs...),
false, true, false)

# resize container
resize!(integrator.p, integrator.p.solver.volume_integral,
nelements(integrator.p.solver, integrator.p.cache))
# Resize container of volume integral for subcell limiting
_, _, dg, cache = mesh_equations_solver_cache(integrator.p)
if dg.volume_integral isa VolumeIntegralSubcellLimiting
# `subcell_limiter_coefficients` was created with 0 elements
resize!(dg.volume_integral.limiter.cache.subcell_limiter_coefficients,
nelements(dg, cache))
end

# Standard callbacks
initialize_callbacks!(callback, integrator)
Expand Down Expand Up @@ -258,11 +262,6 @@ function Base.resize!(integrator::SimpleIntegratorSSP, new_size)
resize!(integrator.du, new_size)
resize!(integrator.u_tmp, new_size)

# Resize container
# new_size = n_variables * n_nodes^n_dims * n_elements
n_elements = nelements(integrator.p.solver, integrator.p.cache)
resize!(integrator.p, integrator.p.solver.volume_integral, n_elements)

return nothing
end
end # @muladd
Loading