From f34c38e37a10d11db2d044d2e190715670afdde7 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 31 Jan 2024 23:07:40 +0100 Subject: [PATCH 01/16] Outsource saving of bounds check errors --- src/callbacks_stage/subcell_bounds_check.jl | 36 ++++++---- .../subcell_bounds_check_2d.jl | 69 ++++++++++--------- 2 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/callbacks_stage/subcell_bounds_check.jl b/src/callbacks_stage/subcell_bounds_check.jl index 4dbf44d29c..da3f686da2 100644 --- a/src/callbacks_stage/subcell_bounds_check.jl +++ b/src/callbacks_stage/subcell_bounds_check.jl @@ -42,23 +42,35 @@ function (callback::BoundsCheckCallback)(u_ode, integrator, stage) (stage == length(alg.c)) && (iter % callback.interval == 0 || integrator.finalstep) @trixi_timeit timer() "check_bounds" check_bounds(u, mesh, equations, solver, cache, - solver.volume_integral, t, - iter + 1, - callback.output_directory, - save_errors) + solver.volume_integral) + + if save_errors + @trixi_timeit timer() "save_errors" save_bounds_check_errors(callback.output_directory, + u, t, iter + 1, + equations, + solver.volume_integral) + end +end + +@inline function check_bounds(u, mesh, equations, solver, cache, + volume_integral::AbstractVolumeIntegral) + return nothing +end + +@inline function check_bounds(u, mesh, equations, solver, cache, + volume_integral::VolumeIntegralSubcellLimiting) + check_bounds(u, mesh, equations, solver, cache, volume_integral.limiter) end -function check_bounds(u, mesh, equations, solver, cache, - volume_integral::AbstractVolumeIntegral, t, iter, - output_directory, save_errors) +@inline function save_bounds_check_errors(output_directory, u, t, iter, equations, + volume_integral::AbstractVolumeIntegral) return nothing end -function check_bounds(u, mesh, equations, solver, cache, - volume_integral::VolumeIntegralSubcellLimiting, t, iter, - output_directory, save_errors) - check_bounds(u, mesh, equations, solver, cache, volume_integral.limiter, t, iter, - output_directory, save_errors) +@inline function save_bounds_check_errors(output_directory, u, t, iter, equations, + volume_integral::VolumeIntegralSubcellLimiting) + save_bounds_check_errors(output_directory, u, t, iter, equations, + volume_integral.limiter) end function init_callback(callback::BoundsCheckCallback, semi) diff --git a/src/callbacks_stage/subcell_bounds_check_2d.jl b/src/callbacks_stage/subcell_bounds_check_2d.jl index 19d73968c9..9818bdb2c5 100644 --- a/src/callbacks_stage/subcell_bounds_check_2d.jl +++ b/src/callbacks_stage/subcell_bounds_check_2d.jl @@ -6,8 +6,7 @@ #! format: noindent @inline function check_bounds(u, mesh::AbstractMesh{2}, equations, solver, cache, - limiter::SubcellLimiterIDP, - time, iter, output_directory, save_errors) + limiter::SubcellLimiterIDP) (; local_minmax, positivity) = solver.volume_integral.limiter (; variable_bounds) = limiter.cache.subcell_limiter_coefficients (; idp_bounds_delta_local, idp_bounds_delta_global) = limiter.cache @@ -85,40 +84,48 @@ idp_bounds_delta_local[key][stride_size]) end - if save_errors - # Print to output file - open("$output_directory/deviations.txt", "a") do f - print(f, iter, ", ", time) - if local_minmax - for v in limiter.local_minmax_variables_cons - v_string = string(v) - print(f, ", ", - idp_bounds_delta_local[Symbol(v_string, "_min")][stride_size], - ", ", - idp_bounds_delta_local[Symbol(v_string, "_max")][stride_size]) - end + return nothing +end + +@inline function save_bounds_check_errors(output_directory, u, time, iter, equations, + limiter::SubcellLimiterIDP) + (; local_minmax, positivity) = limiter + (; idp_bounds_delta_local) = limiter.cache + + stride_size = div(128, sizeof(eltype(u))) # = n + + # Print errors to output file + open("$output_directory/deviations.txt", "a") do f + print(f, iter, ", ", time) + if local_minmax + for v in limiter.local_minmax_variables_cons + v_string = string(v) + print(f, ", ", + idp_bounds_delta_local[Symbol(v_string, "_min")][stride_size], + ", ", + idp_bounds_delta_local[Symbol(v_string, "_max")][stride_size]) end - if positivity - for v in limiter.positivity_variables_cons - if v in limiter.local_minmax_variables_cons - continue - end - print(f, ", ", - idp_bounds_delta_local[Symbol(string(v), "_min")][stride_size]) - end - for variable in limiter.positivity_variables_nonlinear - print(f, ", ", - idp_bounds_delta_local[Symbol(string(variable), "_min")][stride_size]) + end + if positivity + for v in limiter.positivity_variables_cons + if v in limiter.local_minmax_variables_cons + continue end + print(f, ", ", + idp_bounds_delta_local[Symbol(string(v), "_min")][stride_size]) end - println(f) - end - # Reset local maximum deviations - for (key, _) in idp_bounds_delta_local - for i in 1:Threads.nthreads() - idp_bounds_delta_local[key][stride_size * i] = zero(eltype(idp_bounds_delta_local[key][stride_size])) + for variable in limiter.positivity_variables_nonlinear + print(f, ", ", + idp_bounds_delta_local[Symbol(string(variable), "_min")][stride_size]) end end + println(f) + end + # Reset local maximum deviations + for (key, _) in idp_bounds_delta_local + for i in 1:Threads.nthreads() + idp_bounds_delta_local[key][stride_size * i] = zero(eltype(idp_bounds_delta_local[key][stride_size])) + end end return nothing From 5e5fecf214502035e4560e7be43a8a8a1effed92 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Thu, 1 Feb 2024 13:51:55 +0100 Subject: [PATCH 02/16] Increase coverage by activate saving of bounds check errors for local limiting --- .../elixir_euler_sedov_blast_wave_sc_subcell.jl | 4 +++- ...ulti_shock_bubble_shockcapturing_subcell_positivity.jl | 5 ++--- test/test_tree_2d_euler.jl | 8 +++++++- test/test_tree_2d_eulermulti.jl | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl b/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl index c1ba3d9696..4b01a9753e 100644 --- a/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl +++ b/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl @@ -83,7 +83,9 @@ callbacks = CallbackSet(summary_callback, ############################################################################### # run the simulation -stage_callbacks = (SubcellLimiterIDPCorrection(), BoundsCheckCallback(save_errors = false)) +stage_callbacks = (SubcellLimiterIDPCorrection(), + BoundsCheckCallback(save_errors = false, interval = 100, + output_directory = "out")) sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback diff --git a/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl b/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl index 78ff47e255..4d1cb9f2d3 100644 --- a/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl +++ b/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl @@ -133,10 +133,9 @@ callbacks = CallbackSet(summary_callback, ############################################################################### # run the simulation -output_directory = "out" stage_callbacks = (SubcellLimiterIDPCorrection(), - BoundsCheckCallback(save_errors = true, interval = 100, - output_directory = output_directory)) + BoundsCheckCallback(save_errors = false, interval = 100, + output_directory = "out")) sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index b937abe92c..08fe04e724 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -368,6 +368,7 @@ end end @trixi_testset "elixir_euler_sedov_blast_wave_sc_subcell.jl" begin + rm("out/deviations.txt", force = true) @test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_sedov_blast_wave_sc_subcell.jl"), l2=[ @@ -384,7 +385,12 @@ end ], tspan=(0.0, 1.0), initial_refinement_level=4, - coverage_override=(maxiters = 6,)) + coverage_override=(maxiters = 6,), + save_errors=true, + output_directory="out") + lines = readlines("out/deviations.txt") + @test lines[1] == "# iter, simu_time, rho_min, rho_max" + @test startswith(lines[end], "1") # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) let diff --git a/test/test_tree_2d_eulermulti.jl b/test/test_tree_2d_eulermulti.jl index 7c4a4e722e..34667e407a 100644 --- a/test/test_tree_2d_eulermulti.jl +++ b/test/test_tree_2d_eulermulti.jl @@ -80,6 +80,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") ], initial_refinement_level=3, tspan=(0.0, 0.001), + save_errors=true, output_directory="out") lines = readlines("out/deviations.txt") @test lines[1] == "# iter, simu_time, rho1_min, rho2_min" From d4a3e4ba570f37372184d04bce3f784928d7629c Mon Sep 17 00:00:00 2001 From: bennibolm Date: Thu, 1 Feb 2024 14:37:16 +0100 Subject: [PATCH 03/16] Fix test for saving errors with coverage --- test/test_tree_2d_euler.jl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 08fe04e724..3159a1fbf3 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -390,7 +390,13 @@ end output_directory="out") lines = readlines("out/deviations.txt") @test lines[1] == "# iter, simu_time, rho_min, rho_max" - @test startswith(lines[end], "1") + cmd = string(Base.julia_cmd()) + coverage = occursin("--code-coverage", cmd) && + !occursin("--code-coverage=none", cmd) + if !coverage + # Run without coverage takes 96 time steps. + @test startswith(lines[end], "96") + end # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) let From af1b407dea8e24312cdfba536bd453825ef7dbb9 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Tue, 6 Feb 2024 14:59:43 +0100 Subject: [PATCH 04/16] Remove empty line --- src/callbacks_stage/subcell_bounds_check.jl | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/callbacks_stage/subcell_bounds_check.jl b/src/callbacks_stage/subcell_bounds_check.jl index da3f686da2..e8c9f3b61c 100644 --- a/src/callbacks_stage/subcell_bounds_check.jl +++ b/src/callbacks_stage/subcell_bounds_check.jl @@ -52,21 +52,11 @@ function (callback::BoundsCheckCallback)(u_ode, integrator, stage) end end -@inline function check_bounds(u, mesh, equations, solver, cache, - volume_integral::AbstractVolumeIntegral) - return nothing -end - @inline function check_bounds(u, mesh, equations, solver, cache, volume_integral::VolumeIntegralSubcellLimiting) check_bounds(u, mesh, equations, solver, cache, volume_integral.limiter) end -@inline function save_bounds_check_errors(output_directory, u, t, iter, equations, - volume_integral::AbstractVolumeIntegral) - return nothing -end - @inline function save_bounds_check_errors(output_directory, u, t, iter, equations, volume_integral::VolumeIntegralSubcellLimiting) save_bounds_check_errors(output_directory, u, t, iter, equations, @@ -77,8 +67,6 @@ function init_callback(callback::BoundsCheckCallback, semi) init_callback(callback, semi, semi.solver.volume_integral) end -init_callback(callback::BoundsCheckCallback, semi, volume_integral::AbstractVolumeIntegral) = nothing - function init_callback(callback::BoundsCheckCallback, semi, volume_integral::VolumeIntegralSubcellLimiting) init_callback(callback, semi, volume_integral.limiter) @@ -123,8 +111,6 @@ function finalize_callback(callback::BoundsCheckCallback, semi) finalize_callback(callback, semi, semi.solver.volume_integral) end -finalize_callback(callback::BoundsCheckCallback, semi, volume_integral::AbstractVolumeIntegral) = nothing - function finalize_callback(callback::BoundsCheckCallback, semi, volume_integral::VolumeIntegralSubcellLimiting) finalize_callback(callback, semi, volume_integral.limiter) From bc61d69269fa90198583d004015fb7277855e29b Mon Sep 17 00:00:00 2001 From: bennibolm Date: Tue, 19 Mar 2024 11:44:26 +0100 Subject: [PATCH 05/16] Implement suggestions --- .../elixir_euler_sedov_blast_wave_sc_subcell.jl | 4 ++-- ...rmulti_shock_bubble_shockcapturing_subcell_positivity.jl | 4 ++-- src/callbacks_stage/subcell_bounds_check_2d.jl | 6 +++++- test/test_tree_2d_euler.jl | 3 +-- test/test_tree_2d_eulermulti.jl | 3 +-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl b/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl index 4b01a9753e..c464569286 100644 --- a/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl +++ b/examples/tree_2d_dgsem/elixir_euler_sedov_blast_wave_sc_subcell.jl @@ -84,8 +84,8 @@ callbacks = CallbackSet(summary_callback, # run the simulation stage_callbacks = (SubcellLimiterIDPCorrection(), - BoundsCheckCallback(save_errors = false, interval = 100, - output_directory = "out")) + BoundsCheckCallback(save_errors = false, interval = 100)) +# `interval` is used when calling this elixir in the tests with `save_errors=true`. sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback diff --git a/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl b/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl index 4d1cb9f2d3..be14c448e4 100644 --- a/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl +++ b/examples/tree_2d_dgsem/elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl @@ -134,8 +134,8 @@ callbacks = CallbackSet(summary_callback, # run the simulation stage_callbacks = (SubcellLimiterIDPCorrection(), - BoundsCheckCallback(save_errors = false, interval = 100, - output_directory = "out")) + BoundsCheckCallback(save_errors = false, interval = 100)) +# `interval` is used when calling this elixir in the tests with `save_errors=true`. sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback diff --git a/src/callbacks_stage/subcell_bounds_check_2d.jl b/src/callbacks_stage/subcell_bounds_check_2d.jl index 9818bdb2c5..4f7b8373e9 100644 --- a/src/callbacks_stage/subcell_bounds_check_2d.jl +++ b/src/callbacks_stage/subcell_bounds_check_2d.jl @@ -92,7 +92,11 @@ end (; local_minmax, positivity) = limiter (; idp_bounds_delta_local) = limiter.cache - stride_size = div(128, sizeof(eltype(u))) # = n + # Note: Accessing the threaded memory vector `idp_bounds_delta_local` with + # `deviation = idp_bounds_delta_local[key][Threads.threadid()]` causes critical performance + # issues due to False Sharing. For more information see note in `check_bounds`. + # As a result, the total maximum deviation is saved in the entry with index `stride_size`. + stride_size = div(128, sizeof(eltype(u))) # Print errors to output file open("$output_directory/deviations.txt", "a") do f diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 3159a1fbf3..693e4296d5 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -386,8 +386,7 @@ end tspan=(0.0, 1.0), initial_refinement_level=4, coverage_override=(maxiters = 6,), - save_errors=true, - output_directory="out") + save_errors=true) lines = readlines("out/deviations.txt") @test lines[1] == "# iter, simu_time, rho_min, rho_max" cmd = string(Base.julia_cmd()) diff --git a/test/test_tree_2d_eulermulti.jl b/test/test_tree_2d_eulermulti.jl index 34667e407a..c8d1cd6232 100644 --- a/test/test_tree_2d_eulermulti.jl +++ b/test/test_tree_2d_eulermulti.jl @@ -80,8 +80,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") ], initial_refinement_level=3, tspan=(0.0, 0.001), - save_errors=true, - output_directory="out") + save_errors=true) lines = readlines("out/deviations.txt") @test lines[1] == "# iter, simu_time, rho1_min, rho2_min" @test startswith(lines[end], "1") From c196ec35ec03e675d87f6c9b114a52652659d0f2 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Tue, 7 May 2024 14:27:09 +0200 Subject: [PATCH 06/16] Use `joinpath` --- test/test_tree_2d_euler.jl | 4 ++-- test/test_tree_2d_eulermulti.jl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 908272a622..402d14839c 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -400,7 +400,7 @@ end end @trixi_testset "elixir_euler_sedov_blast_wave_sc_subcell.jl" begin - rm("out/deviations.txt", force = true) + rm(joinpath("out", "deviations.txt"), force = true) @test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_sedov_blast_wave_sc_subcell.jl"), l2=[ @@ -419,7 +419,7 @@ end initial_refinement_level=4, coverage_override=(maxiters = 6,), save_errors=true) - lines = readlines("out/deviations.txt") + lines = readlines(joinpath("out", "deviations.txt")) @test lines[1] == "# iter, simu_time, rho_min, rho_max" cmd = string(Base.julia_cmd()) coverage = occursin("--code-coverage", cmd) && diff --git a/test/test_tree_2d_eulermulti.jl b/test/test_tree_2d_eulermulti.jl index 9c60f39c09..660a3261f3 100644 --- a/test/test_tree_2d_eulermulti.jl +++ b/test/test_tree_2d_eulermulti.jl @@ -61,7 +61,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") end @trixi_testset "elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl" begin - rm("out/deviations.txt", force = true) + rm(joinpath("out", "deviations.txt"), force = true) @test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_eulermulti_shock_bubble_shockcapturing_subcell_positivity.jl"), l2=[ @@ -81,7 +81,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") initial_refinement_level=3, tspan=(0.0, 0.001), save_errors=true) - lines = readlines("out/deviations.txt") + lines = readlines(joinpath("out", "deviations.txt")) @test lines[1] == "# iter, simu_time, rho1_min, rho2_min" @test startswith(lines[end], "1") # Ensure that we do not have excessive memory allocations From b268f2f2467b0ebac6d918129cf72c0479767973 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Tue, 7 May 2024 14:29:54 +0200 Subject: [PATCH 07/16] Add test with coverage --- test/test_tree_2d_euler.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 402d14839c..0d79e2ab6e 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -424,7 +424,10 @@ end cmd = string(Base.julia_cmd()) coverage = occursin("--code-coverage", cmd) && !occursin("--code-coverage=none", cmd) - if !coverage + if coverage + # Run with coverage takes 1 time step. + @test startswith(lines[end], "1") + else # Run without coverage takes 96 time steps. @test startswith(lines[end], "96") end From 60249f5def08cca99961483beeaba52bec65dde0 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 13:17:05 +0200 Subject: [PATCH 08/16] Fix I/O test for modified elixir --- test/test_tree_2d_euler.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 3505c4e073..84a38a11fb 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -420,16 +420,16 @@ end coverage_override=(maxiters = 6,), save_errors=true) lines = readlines(joinpath("out", "deviations.txt")) - @test lines[1] == "# iter, simu_time, rho_min, rho_max" + @test lines[1] == "# iter, simu_time, rho_min, rho_max, entropy_guermond_etal_min" cmd = string(Base.julia_cmd()) coverage = occursin("--code-coverage", cmd) && !occursin("--code-coverage=none", cmd) if coverage - # Run with coverage takes 1 time step. + # Run with coverage takes 6 time steps but only saves after the first. @test startswith(lines[end], "1") else - # Run without coverage takes 96 time steps. - @test startswith(lines[end], "96") + # Run without coverage takes 89 time steps. + @test startswith(lines[end], "89") end # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) From 9ccfd9ee469dd4ad39b8c990487f5103f9064375 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 13:17:46 +0200 Subject: [PATCH 09/16] Add more accurate test --- test/test_tree_2d_eulermulti.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_tree_2d_eulermulti.jl b/test/test_tree_2d_eulermulti.jl index 660a3261f3..58a51d3970 100644 --- a/test/test_tree_2d_eulermulti.jl +++ b/test/test_tree_2d_eulermulti.jl @@ -83,7 +83,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") save_errors=true) lines = readlines(joinpath("out", "deviations.txt")) @test lines[1] == "# iter, simu_time, rho1_min, rho2_min" - @test startswith(lines[end], "1") + @test startswith(lines[end], "15") # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) let From 50472c87612717c0edc2e8dade6ba0012335653a Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 13:46:57 +0200 Subject: [PATCH 10/16] Redo last change; Default maxiters with coverage is 1 --- test/test_tree_2d_eulermulti.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_tree_2d_eulermulti.jl b/test/test_tree_2d_eulermulti.jl index 58a51d3970..660a3261f3 100644 --- a/test/test_tree_2d_eulermulti.jl +++ b/test/test_tree_2d_eulermulti.jl @@ -83,7 +83,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") save_errors=true) lines = readlines(joinpath("out", "deviations.txt")) @test lines[1] == "# iter, simu_time, rho1_min, rho2_min" - @test startswith(lines[end], "15") + @test startswith(lines[end], "1") # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) let From 27f049cf95c17cea61a29d55271f4b04ac52a0cf Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 13:48:49 +0200 Subject: [PATCH 11/16] Change order of lines --- src/callbacks_stage/subcell_bounds_check.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/callbacks_stage/subcell_bounds_check.jl b/src/callbacks_stage/subcell_bounds_check.jl index c91fd1e54b..6f70f77413 100644 --- a/src/callbacks_stage/subcell_bounds_check.jl +++ b/src/callbacks_stage/subcell_bounds_check.jl @@ -38,12 +38,12 @@ function (callback::BoundsCheckCallback)(u_ode, integrator, stage) (; t, iter, alg) = integrator u = wrap_array(u_ode, mesh, equations, solver, cache) - save_errors = callback.save_errors && (callback.interval > 0) && - (stage == length(alg.c)) && - (iter % callback.interval == 0 || integrator.finalstep) @trixi_timeit timer() "check_bounds" check_bounds(u, mesh, equations, solver, cache, solver.volume_integral) + save_errors = callback.save_errors && (callback.interval > 0) && + (stage == length(alg.c)) && + (iter % callback.interval == 0 || integrator.finalstep) if save_errors @trixi_timeit timer() "save_errors" save_bounds_check_errors(callback.output_directory, u, t, iter + 1, From a6d598653b2742d3b7d75ca6df2671d3bce8d866 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 13:50:13 +0200 Subject: [PATCH 12/16] Save deviations if maxiters is reached --- src/callbacks_stage/subcell_bounds_check.jl | 4 +++- test/test_tree_2d_euler.jl | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/callbacks_stage/subcell_bounds_check.jl b/src/callbacks_stage/subcell_bounds_check.jl index 6f70f77413..8771921a3f 100644 --- a/src/callbacks_stage/subcell_bounds_check.jl +++ b/src/callbacks_stage/subcell_bounds_check.jl @@ -43,7 +43,9 @@ function (callback::BoundsCheckCallback)(u_ode, integrator, stage) save_errors = callback.save_errors && (callback.interval > 0) && (stage == length(alg.c)) && - (iter % callback.interval == 0 || integrator.finalstep) + (iter % callback.interval == 0 || # Every `interval` time steps + integrator.finalstep || # Planned last time step + (iter + 1) >= integrator.opts.maxiters) # Maximum iterations reached if save_errors @trixi_timeit timer() "save_errors" save_bounds_check_errors(callback.output_directory, u, t, iter + 1, diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 84a38a11fb..9a40b1a4d7 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -425,8 +425,8 @@ end coverage = occursin("--code-coverage", cmd) && !occursin("--code-coverage=none", cmd) if coverage - # Run with coverage takes 6 time steps but only saves after the first. - @test startswith(lines[end], "1") + # Run with coverage takes 6 time steps. + @test startswith(lines[end], "6") else # Run without coverage takes 89 time steps. @test startswith(lines[end], "89") From 02bdb1477ea11ff25e8e159a00e00711794235c8 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 13:57:27 +0200 Subject: [PATCH 13/16] Add comment --- test/test_tree_2d_eulermulti.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_tree_2d_eulermulti.jl b/test/test_tree_2d_eulermulti.jl index 660a3261f3..5b98461168 100644 --- a/test/test_tree_2d_eulermulti.jl +++ b/test/test_tree_2d_eulermulti.jl @@ -83,6 +83,7 @@ EXAMPLES_DIR = pkgdir(Trixi, "examples", "tree_2d_dgsem") save_errors=true) lines = readlines(joinpath("out", "deviations.txt")) @test lines[1] == "# iter, simu_time, rho1_min, rho2_min" + # Runs with and without coverage take 1 and 15 time steps. @test startswith(lines[end], "1") # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) From 3b513ed7223dc689cce697817491b782e1be6c96 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Wed, 8 May 2024 14:27:03 +0200 Subject: [PATCH 14/16] Save deviations at correct time steps --- docs/literate/src/files/subcell_shock_capturing.jl | 11 +++++------ src/callbacks_stage/subcell_bounds_check.jl | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/literate/src/files/subcell_shock_capturing.jl b/docs/literate/src/files/subcell_shock_capturing.jl index 8a98fdae28..b4d0896536 100644 --- a/docs/literate/src/files/subcell_shock_capturing.jl +++ b/docs/literate/src/files/subcell_shock_capturing.jl @@ -277,11 +277,10 @@ plot(sol) # timestep and simulation time. # ```` # iter, simu_time, rho_min, rho_max -# 1, 0.0, 0.0, 0.0 -# 101, 0.29394033217556337, 0.0, 0.0 -# 201, 0.6012597465597065, 0.0, 0.0 -# 301, 0.9559096690030839, 0.0, 0.0 -# 401, 1.3674274981949077, 0.0, 0.0 -# 501, 1.8395301696603052, 0.0, 0.0 +# 100, 0.29103427131404924, 0.0, 0.0 +# 200, 0.5980281923063808, 0.0, 0.0 +# 300, 0.9520853560765293, 0.0, 0.0 +# 400, 1.3630295622683186, 0.0, 0.0 +# 500, 1.8344999624013498, 0.0, 0.0 # 532, 1.9974179806990118, 0.0, 0.0 # ```` diff --git a/src/callbacks_stage/subcell_bounds_check.jl b/src/callbacks_stage/subcell_bounds_check.jl index 8771921a3f..3f3e151436 100644 --- a/src/callbacks_stage/subcell_bounds_check.jl +++ b/src/callbacks_stage/subcell_bounds_check.jl @@ -43,7 +43,7 @@ function (callback::BoundsCheckCallback)(u_ode, integrator, stage) save_errors = callback.save_errors && (callback.interval > 0) && (stage == length(alg.c)) && - (iter % callback.interval == 0 || # Every `interval` time steps + ((iter + 1) % callback.interval == 0 || # Every `interval` time steps integrator.finalstep || # Planned last time step (iter + 1) >= integrator.opts.maxiters) # Maximum iterations reached if save_errors From 81110372451ea4717c30812e15ad4e3b469a4c1b Mon Sep 17 00:00:00 2001 From: bennibolm Date: Sat, 11 May 2024 12:27:36 +0200 Subject: [PATCH 15/16] Add test for saving deviations for positivity limiter (non-linear) --- ...ixir_euler_kelvin_helmholtz_instability_sc_subcell.jl | 3 ++- test/test_tree_2d_euler.jl | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl b/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl index 1817672778..c9024d7f73 100644 --- a/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl +++ b/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl @@ -83,7 +83,8 @@ callbacks = CallbackSet(summary_callback, ############################################################################### # run the simulation -stage_callbacks = (SubcellLimiterIDPCorrection(), BoundsCheckCallback(save_errors = false)) +stage_callbacks = (SubcellLimiterIDPCorrection(), + BoundsCheckCallback(save_errors = false, interval = 100)) sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback diff --git a/test/test_tree_2d_euler.jl b/test/test_tree_2d_euler.jl index 9a40b1a4d7..a004d1452b 100644 --- a/test/test_tree_2d_euler.jl +++ b/test/test_tree_2d_euler.jl @@ -628,6 +628,7 @@ end end @trixi_testset "elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl" begin + rm(joinpath("out", "deviations.txt"), force = true) @test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl"), l2=[ @@ -642,7 +643,13 @@ end 0.5822547982757897, 0.7300051017382696, ], - tspan=(0.0, 2.0)) + tspan=(0.0, 2.0), + coverage_override=(maxiters = 7,), + save_errors=true) + lines = readlines(joinpath("out", "deviations.txt")) + @test lines[1] == "# iter, simu_time, rho_min, pressure_min" + # Run without (with) coverage takes 745 (7) time steps + @test startswith(lines[end], "7") # Ensure that we do not have excessive memory allocations # (e.g., from type instabilities) let From b5902337e293a0929b222123b902b6f77518b489 Mon Sep 17 00:00:00 2001 From: bennibolm Date: Sun, 12 May 2024 10:58:16 +0200 Subject: [PATCH 16/16] Add comment --- .../elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl b/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl index c9024d7f73..9e9fb45e7d 100644 --- a/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl +++ b/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_sc_subcell.jl @@ -85,6 +85,7 @@ callbacks = CallbackSet(summary_callback, stage_callbacks = (SubcellLimiterIDPCorrection(), BoundsCheckCallback(save_errors = false, interval = 100)) +# `interval` is used when calling this elixir in the tests with `save_errors=true`. sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback