From c4394eafb7c81c04ccb90038d0b62a6c5520c4e7 Mon Sep 17 00:00:00 2001 From: Daniel_Doehring Date: Wed, 30 Oct 2024 14:31:46 +0100 Subject: [PATCH] 1D, 3D --- src/solvers/dgsem_tree/dg.jl | 27 ------------------ src/solvers/dgsem_tree/dg_1d.jl | 50 ++++++++++++++------------------- src/solvers/dgsem_tree/dg_3d.jl | 50 ++++++++++++++------------------- 3 files changed, 42 insertions(+), 85 deletions(-) diff --git a/src/solvers/dgsem_tree/dg.jl b/src/solvers/dgsem_tree/dg.jl index febfb0b121f..fd9728168d8 100644 --- a/src/solvers/dgsem_tree/dg.jl +++ b/src/solvers/dgsem_tree/dg.jl @@ -15,33 +15,6 @@ function reset_du!(du, dg, cache) return du end -# pure_and_blended_element_ids!(element_ids_dg, element_ids_dgfv, alpha, dg, cache) -# -# Given blending factors `alpha` and the solver `dg`, fill -# `element_ids_dg` with the IDs of elements using a pure DG scheme and -# `element_ids_dgfv` with the IDs of elements using a blended DG-FV scheme. -function pure_and_blended_element_ids!(element_ids_dg, element_ids_dgfv, alpha, dg::DG, - cache) - empty!(element_ids_dg) - empty!(element_ids_dgfv) - # For `Float64`, this gives 1.8189894035458565e-12 - # For `Float32`, this gives 1.1920929f-5 - RealT = eltype(alpha) - atol = max(100 * eps(RealT), eps(RealT)^convert(RealT, 0.75f0)) - - for element in eachelement(dg, cache) - # Clip blending factor for values close to zero (-> pure DG) - dg_only = isapprox(alpha[element], 0, atol = atol) - if dg_only - push!(element_ids_dg, element) - else - push!(element_ids_dgfv, element) - end - end - - return nothing -end - function volume_jacobian(element, mesh::TreeMesh, cache) return inv(cache.elements.inverse_jacobian[element])^ndims(mesh) end diff --git a/src/solvers/dgsem_tree/dg_1d.jl b/src/solvers/dgsem_tree/dg_1d.jl index d9a8cc8bc6d..4b449a259d7 100644 --- a/src/solvers/dgsem_tree/dg_1d.jl +++ b/src/solvers/dgsem_tree/dg_1d.jl @@ -42,9 +42,6 @@ end function create_cache(mesh::Union{TreeMesh{1}, StructuredMesh{1}, P4estMesh{1}}, equations, volume_integral::VolumeIntegralShockCapturingHG, dg::DG, uEltype) - element_ids_dg = Int[] - element_ids_dgfv = Int[] - cache = create_cache(mesh, equations, VolumeIntegralFluxDifferencing(volume_integral.volume_flux_dg), dg, uEltype) @@ -55,8 +52,7 @@ function create_cache(mesh::Union{TreeMesh{1}, StructuredMesh{1}, P4estMesh{1}}, fstar1_R_threaded = A2dp1_x[A2dp1_x(undef, nvariables(equations), nnodes(dg) + 1) for _ in 1:Threads.nthreads()] - return (; cache..., element_ids_dg, element_ids_dgfv, fstar1_L_threaded, - fstar1_R_threaded) + return (; cache..., fstar1_L_threaded, fstar1_R_threaded) end function create_cache(mesh::Union{TreeMesh{1}, StructuredMesh{1}, P4estMesh{1}}, @@ -256,37 +252,33 @@ function calc_volume_integral!(du, u, nonconservative_terms, equations, volume_integral::VolumeIntegralShockCapturingHG, dg::DGSEM, cache) - @unpack element_ids_dg, element_ids_dgfv = cache @unpack volume_flux_dg, volume_flux_fv, indicator = volume_integral # Calculate blending factors α: u = u_DG * (1 - α) + u_FV * α alpha = @trixi_timeit timer() "blending factors" indicator(u, mesh, equations, dg, cache) - # Determine element ids for DG-only and blended DG-FV volume integral - pure_and_blended_element_ids!(element_ids_dg, element_ids_dgfv, alpha, dg, cache) - - # Loop over pure DG elements - @trixi_timeit timer() "pure DG" @threaded for idx_element in eachindex(element_ids_dg) - element = element_ids_dg[idx_element] - flux_differencing_kernel!(du, u, element, mesh, nonconservative_terms, - equations, - volume_flux_dg, dg, cache) - end - - # Loop over blended DG-FV elements - @trixi_timeit timer() "blended DG-FV" @threaded for idx_element in eachindex(element_ids_dgfv) - element = element_ids_dgfv[idx_element] + RealT = eltype(alpha) + atol = max(100 * eps(RealT), eps(RealT)^convert(RealT, 0.75f0)) + @threaded for element in eachelement(dg, cache) alpha_element = alpha[element] - - # Calculate DG volume integral contribution - flux_differencing_kernel!(du, u, element, mesh, nonconservative_terms, - equations, - volume_flux_dg, dg, cache, 1 - alpha_element) - - # Calculate FV volume integral contribution - fv_kernel!(du, u, mesh, nonconservative_terms, equations, volume_flux_fv, - dg, cache, element, alpha_element) + # Clip blending factor for values close to zero (-> pure DG) + dg_only = isapprox(alpha_element, 0, atol = atol) + + if dg_only + flux_differencing_kernel!(du, u, element, mesh, + nonconservative_terms, equations, + volume_flux_dg, dg, cache) + else + # Calculate DG volume integral contribution + flux_differencing_kernel!(du, u, element, mesh, + nonconservative_terms, equations, + volume_flux_dg, dg, cache, 1 - alpha_element) + + # Calculate FV volume integral contribution + fv_kernel!(du, u, mesh, nonconservative_terms, equations, volume_flux_fv, + dg, cache, element, alpha_element) + end end return nothing diff --git a/src/solvers/dgsem_tree/dg_3d.jl b/src/solvers/dgsem_tree/dg_3d.jl index 85150bc3040..1e8c305edeb 100644 --- a/src/solvers/dgsem_tree/dg_3d.jl +++ b/src/solvers/dgsem_tree/dg_3d.jl @@ -47,9 +47,6 @@ function create_cache(mesh::Union{TreeMesh{3}, StructuredMesh{3}, P4estMesh{3}, T8codeMesh{3}}, equations, volume_integral::VolumeIntegralShockCapturingHG, dg::DG, uEltype) - element_ids_dg = Int[] - element_ids_dgfv = Int[] - cache = create_cache(mesh, equations, VolumeIntegralFluxDifferencing(volume_integral.volume_flux_dg), dg, uEltype) @@ -76,8 +73,7 @@ function create_cache(mesh::Union{TreeMesh{3}, StructuredMesh{3}, P4estMesh{3}, nnodes(dg), nnodes(dg) + 1) for _ in 1:Threads.nthreads()] - return (; cache..., element_ids_dg, element_ids_dgfv, fstar1_L_threaded, - fstar1_R_threaded, + return (; cache..., fstar1_L_threaded, fstar1_R_threaded, fstar2_L_threaded, fstar2_R_threaded, fstar3_L_threaded, fstar3_R_threaded) end @@ -386,37 +382,33 @@ function calc_volume_integral!(du, u, nonconservative_terms, equations, volume_integral::VolumeIntegralShockCapturingHG, dg::DGSEM, cache) - @unpack element_ids_dg, element_ids_dgfv = cache @unpack volume_flux_dg, volume_flux_fv, indicator = volume_integral # Calculate blending factors α: u = u_DG * (1 - α) + u_FV * α alpha = @trixi_timeit timer() "blending factors" indicator(u, mesh, equations, dg, cache) - # Determine element ids for DG-only and blended DG-FV volume integral - pure_and_blended_element_ids!(element_ids_dg, element_ids_dgfv, alpha, dg, cache) - - # Loop over pure DG elements - @trixi_timeit timer() "pure DG" @threaded for idx_element in eachindex(element_ids_dg) - element = element_ids_dg[idx_element] - flux_differencing_kernel!(du, u, element, mesh, - nonconservative_terms, equations, - volume_flux_dg, dg, cache) - end - - # Loop over blended DG-FV elements - @trixi_timeit timer() "blended DG-FV" @threaded for idx_element in eachindex(element_ids_dgfv) - element = element_ids_dgfv[idx_element] + RealT = eltype(alpha) + atol = max(100 * eps(RealT), eps(RealT)^convert(RealT, 0.75f0)) + @threaded for element in eachelement(dg, cache) alpha_element = alpha[element] - - # Calculate DG volume integral contribution - flux_differencing_kernel!(du, u, element, mesh, - nonconservative_terms, equations, - volume_flux_dg, dg, cache, 1 - alpha_element) - - # Calculate FV volume integral contribution - fv_kernel!(du, u, mesh, nonconservative_terms, equations, volume_flux_fv, - dg, cache, element, alpha_element) + # Clip blending factor for values close to zero (-> pure DG) + dg_only = isapprox(alpha_element, 0, atol = atol) + + if dg_only + flux_differencing_kernel!(du, u, element, mesh, + nonconservative_terms, equations, + volume_flux_dg, dg, cache) + else + # Calculate DG volume integral contribution + flux_differencing_kernel!(du, u, element, mesh, + nonconservative_terms, equations, + volume_flux_dg, dg, cache, 1 - alpha_element) + + # Calculate FV volume integral contribution + fv_kernel!(du, u, mesh, nonconservative_terms, equations, volume_flux_fv, + dg, cache, element, alpha_element) + end end return nothing