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

Conservative AMR #2028

Merged
merged 42 commits into from
Aug 19, 2024
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
5370878
small typo fixes
andrewwinters5000 Aug 1, 2024
47a3b9e
Interpolate and project Ju instead of u to retain discrete conservation
andrewwinters5000 Aug 1, 2024
8f4b373
add specialized routines for TreeMesh and P4estMesh. Hopefully some t…
andrewwinters5000 Aug 1, 2024
2ec952a
remove unused copy
andrewwinters5000 Aug 1, 2024
109eda2
remove false comment
andrewwinters5000 Aug 1, 2024
c11224e
simplify the method on the children
andrewwinters5000 Aug 2, 2024
101013a
update 2d p4est tests
andrewwinters5000 Aug 2, 2024
31de8b9
update 3d p4est tests
andrewwinters5000 Aug 2, 2024
95700e8
update 2d t8code tests
andrewwinters5000 Aug 2, 2024
4d580e6
update 3d t8code tests
andrewwinters5000 Aug 2, 2024
1b70563
update mpi test values
andrewwinters5000 Aug 2, 2024
1f06cd6
fix formatting
andrewwinters5000 Aug 2, 2024
264c87e
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 2, 2024
93e01f1
remove unnecessary comment
andrewwinters5000 Aug 2, 2024
9ed4f52
add new 2d tests including conservation
andrewwinters5000 Aug 5, 2024
455fb34
add new 3d tests including conservation
andrewwinters5000 Aug 5, 2024
921076b
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 7, 2024
7b251fe
update t8code 2d mpi test
andrewwinters5000 Aug 7, 2024
db68602
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 7, 2024
6eb2f64
remove unnecessary Union
andrewwinters5000 Aug 8, 2024
f3074a0
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 8, 2024
0eea376
add comments regarding how element ids are incremented during refine …
andrewwinters5000 Aug 8, 2024
bde64ee
typo fixes
andrewwinters5000 Aug 8, 2024
4f37fcb
another typo fix
andrewwinters5000 Aug 8, 2024
50aa478
fix comment
andrewwinters5000 Aug 8, 2024
7cf1bb8
Apply suggestions from code review
andrewwinters5000 Aug 12, 2024
61034dd
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 14, 2024
aa42899
Apply suggestions from code review
andrewwinters5000 Aug 14, 2024
79fed3e
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 15, 2024
627a169
combine GC.preserve blocks
andrewwinters5000 Aug 15, 2024
1926435
Merge branch 'conservative-amr' of github.com:andrewwinters5000/Trixi…
andrewwinters5000 Aug 15, 2024
b7f3911
fix formatting in elixir
andrewwinters5000 Aug 15, 2024
493bb16
simplify implementation and add if blocks for P4estMesh specialities
andrewwinters5000 Aug 15, 2024
f1f322b
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 15, 2024
c58e567
unify structure across P4estMesh and T8codeMesh
andrewwinters5000 Aug 15, 2024
06829fd
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 16, 2024
7761bfd
fix some of the bad formatting
andrewwinters5000 Aug 16, 2024
03127d0
Merge branch 'conservative-amr' of github.com:andrewwinters5000/Trixi…
andrewwinters5000 Aug 16, 2024
ecd9570
Merge branch 'main' into conservative-amr
andrewwinters5000 Aug 19, 2024
570cf75
Apply suggestions from code review
andrewwinters5000 Aug 19, 2024
cc9f1d9
add news
ranocha Aug 19, 2024
b650fff
Update NEWS.md
ranocha Aug 19, 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
117 changes: 117 additions & 0 deletions examples/p4est_2d_dgsem/elixir_euler_weak_blast_wave_amr.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@

using OrdinaryDiffEq
using Trixi

###############################################################################
# semidiscretization of the compressible Euler equations

equations = CompressibleEulerEquations2D(1.4)

function initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations2D)
# Set up polar coordinates
inicenter = SVector(0.0, 0.0)
x_norm = x[1] - inicenter[1]
y_norm = x[2] - inicenter[2]
r = sqrt(x_norm^2 + y_norm^2)

r0 = 0.2
E = 1
p0_inner = 3
p0_outer = 1

# Calculate primitive variables
rho = 1.1
v1 = 0.0
v2 = 0.0
p = r > r0 ? p0_outer : p0_inner

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

initial_condition = initial_condition_weak_blast_wave

# Get the DG approximation space

# Activate the shock capturing + flux differencing
surface_flux = flux_lax_friedrichs
volume_flux = flux_ranocha
polydeg = 4
basis = LobattoLegendreBasis(polydeg)
indicator_sc = IndicatorHennemannGassner(equations, basis,
alpha_max = 0.5,
alpha_min = 0.001,
alpha_smooth = true,
variable = density_pressure)
volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
volume_flux_dg = volume_flux,
volume_flux_fv = surface_flux)

solver = DGSEM(polydeg = polydeg, surface_flux = surface_flux,
volume_integral = volume_integral)

###############################################################################

# Affine type mapping to take the [-1,1]^2 domain
# and warp it as described in https://arxiv.org/abs/2012.12040
# Warping with the coefficient 0.2 is even more extreme.
function mapping_twist(xi, eta)
y = eta + 0.125 * cos(1.5 * pi * xi) * cos(0.5 * pi * eta)
x = xi + 0.125 * cos(0.5 * pi * xi) * cos(2.0 * pi * y)
return SVector(x, y)
end

# The mesh below can be made periodic
# Create P4estMesh with 8 x 8 trees
trees_per_dimension = (8, 8)
mesh = P4estMesh(trees_per_dimension, polydeg = 4,
mapping = mapping_twist,
initial_refinement_level = 0,
periodicity = true)

semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)

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

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

summary_callback = SummaryCallback()

analysis_interval = 400
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
save_analysis = true,
extra_analysis_errors = (:conservation_error,))

alive_callback = AliveCallback(analysis_interval = analysis_interval)

save_solution = SaveSolutionCallback(dt = 0.2,
save_initial_solution = true,
save_final_solution = true)

amr_indicator = IndicatorLöhner(semi, variable = Trixi.density)
amr_controller = ControllerThreeLevel(semi, amr_indicator,
base_level = 0,
med_level = 1, med_threshold = 0.05,
max_level = 2, max_threshold = 0.1)
amr_callback = AMRCallback(semi, amr_controller,
interval = 5,
adapt_initial_condition = true,
adapt_initial_condition_only_refine = true)

stepsize_callback = StepsizeCallback(cfl = 0.5)

callbacks = CallbackSet(summary_callback,
analysis_callback,
alive_callback,
save_solution,
amr_callback,
stepsize_callback)

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

sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false),
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
save_everystep = false, callback = callbacks);#, maxiters=4);
summary_callback() # print the timer summary
114 changes: 114 additions & 0 deletions examples/p4est_3d_dgsem/elixir_euler_weak_blast_wave_amr.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@

using OrdinaryDiffEq
using Trixi

###############################################################################
# semidiscretization of the compressible Euler equations

equations = CompressibleEulerEquations3D(1.4)

function initial_condition_weak_blast_wave(x, t,
equations::CompressibleEulerEquations3D)
# Set up polar coordinates
inicenter = SVector(0.0, 0.0, 0.0)
x_norm = x[1] - inicenter[1]
y_norm = x[2] - inicenter[2]
z_norm = x[3] - inicenter[3]
r = sqrt(x_norm^2 + y_norm^2 + z_norm^2)

r0 = 0.2
E = 1.0
p0_inner = 3
p0_outer = 1

# Calculate primitive variables
rho = 1.1
v1 = 0.0
v2 = 0.0
v3 = 0.0
p = r > r0 ? p0_outer : p0_inner

return prim2cons(SVector(rho, v1, v2, v3, p), equations)
end

initial_condition = initial_condition_weak_blast_wave

surface_flux = flux_lax_friedrichs
volume_flux = flux_ranocha
polydeg = 4
basis = LobattoLegendreBasis(polydeg)
indicator_sc = IndicatorHennemannGassner(equations, basis,
alpha_max = 1.0,
alpha_min = 0.001,
alpha_smooth = true,
variable = density_pressure)
volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
volume_flux_dg = volume_flux,
volume_flux_fv = surface_flux)

solver = DGSEM(polydeg = polydeg, surface_flux = surface_flux,
volume_integral = volume_integral)

# Setup a periodic mesh with 4 x 4 x 4 trees and 8 x 8 x 8 elements
trees_per_dimension = (4, 4, 4)

# Affine type mapping to take the [-1,1]^3 domain
# and warp it as described in https://arxiv.org/abs/2012.12040
function mapping_twist(xi, eta, zeta)
y = eta + 1 / 6 * (cos(1.5 * pi * xi) * cos(0.5 * pi * eta) * cos(0.5 * pi * zeta))

x = xi + 1 / 6 * (cos(0.5 * pi * xi) * cos(2 * pi * y) * cos(0.5 * pi * zeta))

z = zeta + 1 / 6 * (cos(0.5 * pi * x) * cos(pi * y) * cos(0.5 * pi * zeta))

return SVector(x, y, z)
end

mesh = P4estMesh(trees_per_dimension,
polydeg = 2,
mapping = mapping_twist,
initial_refinement_level = 1,
periodicity = true)

# Create the semidiscretization object
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)

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

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

summary_callback = SummaryCallback()

analysis_interval = 100
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
extra_analysis_errors = (:conservation_error,))

alive_callback = AliveCallback(analysis_interval = analysis_interval)

amr_indicator = IndicatorLöhner(semi, variable = Trixi.density)
amr_controller = ControllerThreeLevel(semi, amr_indicator,
base_level = 1,
med_level = 2, med_threshold = 0.05,
max_level = 3, max_threshold = 0.15)
amr_callback = AMRCallback(semi, amr_controller,
interval = 1,
adapt_initial_condition = false,
adapt_initial_condition_only_refine = false)

stepsize_callback = StepsizeCallback(cfl = 0.5)

callbacks = CallbackSet(summary_callback,
analysis_callback,
alive_callback,
amr_callback,
stepsize_callback)

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

sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false),
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
save_everystep = false, callback = callbacks);
summary_callback() # print the timer summary
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ amr_controller = ControllerThreeLevel(semi, IndicatorMax(semi, variable = first)
amr_callback = AMRCallback(semi, amr_controller,
interval = 5,
adapt_initial_condition = true,
adapt_initial_condition_only_refine = true)
adapt_initial_condition_only_refine = true,
dynamic_load_balancing = true)

stepsize_callback = StepsizeCallback(cfl = 0.7)

Expand Down
110 changes: 110 additions & 0 deletions examples/t8code_2d_dgsem/elixir_euler_weak_blast_wave_amr.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@

using OrdinaryDiffEq
using Trixi

###############################################################################
# semidiscretization of the compressible Euler equations

equations = CompressibleEulerEquations2D(1.4)

function initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations2D)
# Set up polar coordinates
inicenter = SVector(0.0, 0.0)
x_norm = x[1] - inicenter[1]
y_norm = x[2] - inicenter[2]
r = sqrt(x_norm^2 + y_norm^2)

r0 = 0.2
E = 1
p0_inner = 3
p0_outer = 1

# Calculate primitive variables
rho = 1.1
v1 = 0.0
v2 = 0.0
p = r > r0 ? p0_outer : p0_inner

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

initial_condition = initial_condition_weak_blast_wave

# Get the DG approximation space

# Activate the shock capturing + flux differencing
surface_flux = flux_lax_friedrichs
volume_flux = flux_ranocha
polydeg = 4
basis = LobattoLegendreBasis(polydeg)
indicator_sc = IndicatorHennemannGassner(equations, basis,
alpha_max = 0.5,
alpha_min = 0.001,
alpha_smooth = true,
variable = density_pressure)
volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
volume_flux_dg = volume_flux,
volume_flux_fv = surface_flux)

solver = DGSEM(polydeg = polydeg, surface_flux = surface_flux,
volume_integral = volume_integral)

# Affine type mapping to take the [-1,1]^2 domain
# and warp it as described in https://arxiv.org/abs/2012.12040
# Warping with the coefficient 0.2 is even more extreme.
function mapping_twist(xi, eta)
y = eta + 0.125 * cos(1.5 * pi * xi) * cos(0.5 * pi * eta)
x = xi + 0.125 * cos(0.5 * pi * xi) * cos(2.0 * pi * y)
return SVector(x, y)
end

# The mesh below can be made periodic
# Create T8codeMesh with 8 x 8 trees
trees_per_dimension = (8, 8)
mesh = T8codeMesh(trees_per_dimension, polydeg = 4,
mapping = mapping_twist,
initial_refinement_level = 0,
periodicity = true)

semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)

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

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

summary_callback = SummaryCallback()

analysis_interval = 400
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
save_analysis = true,
extra_analysis_errors = (:conservation_error,))

alive_callback = AliveCallback(analysis_interval = analysis_interval)

amr_indicator = IndicatorLöhner(semi, variable = Trixi.density)
amr_controller = ControllerThreeLevel(semi, amr_indicator,
base_level = 0,
med_level = 1, med_threshold = 0.05,
max_level = 2, max_threshold = 0.1)
amr_callback = AMRCallback(semi, amr_controller,
interval = 5,
adapt_initial_condition = true,
adapt_initial_condition_only_refine = true)

stepsize_callback = StepsizeCallback(cfl = 0.5)

callbacks = CallbackSet(summary_callback,
analysis_callback,
alive_callback,
amr_callback,
stepsize_callback)

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

sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false),
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
save_everystep = false, callback = callbacks);#, maxiters=4);
summary_callback() # print the timer summary
andrewwinters5000 marked this conversation as resolved.
Show resolved Hide resolved
Loading
Loading