From 849b09e6241dbc8732c5f8ecc49808490788401b Mon Sep 17 00:00:00 2001 From: bennibolm Date: Thu, 16 Nov 2023 12:17:44 +0100 Subject: [PATCH] Revise derivative function call; Add default derivative version --- src/equations/compressible_euler_2d.jl | 3 ++- src/equations/equations.jl | 6 ++++++ src/equations/ideal_glm_mhd_2d.jl | 3 ++- src/solvers/dgsem_tree/subcell_limiters_2d.jl | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/equations/compressible_euler_2d.jl b/src/equations/compressible_euler_2d.jl index f3d46da2451..ca10fbac665 100644 --- a/src/equations/compressible_euler_2d.jl +++ b/src/equations/compressible_euler_2d.jl @@ -1405,7 +1405,8 @@ end end # Transformation from conservative variables u to d(p)/d(u) -@inline function pressure(u, equations::CompressibleEulerEquations2D, derivative::True) +@inline function variable_derivative(::typeof(pressure), + u, equations::CompressibleEulerEquations2D) rho, rho_v1, rho_v2, rho_e = u v1 = rho_v1 / rho diff --git a/src/equations/equations.jl b/src/equations/equations.jl index ba2ad1cd1cd..fd8e858ae06 100644 --- a/src/equations/equations.jl +++ b/src/equations/equations.jl @@ -369,6 +369,12 @@ of the correct length `nvariables(equations)`. """ function energy_internal end +# Default implementation of derivation for `variable`. Used for subcell limiting. +# Implementing a derivative function for a specific function improves the performance. +@inline function variable_derivative(variable, u, equations) + return ForwardDiff.gradient(x -> variable(x, equations), u) +end + #################################################################################################### # Include files with actual implementations for different systems of equations. diff --git a/src/equations/ideal_glm_mhd_2d.jl b/src/equations/ideal_glm_mhd_2d.jl index dd80803e6a6..e486b5532b5 100644 --- a/src/equations/ideal_glm_mhd_2d.jl +++ b/src/equations/ideal_glm_mhd_2d.jl @@ -1063,7 +1063,8 @@ end end # Transformation from conservative variables u to d(p)/d(u) -@inline function pressure(u, equations::IdealGlmMhdEquations2D, derivative::True) +@inline function variable_derivative(::typeof(pressure), + u, equations::IdealGlmMhdEquations2D) rho, rho_v1, rho_v2, rho_v3, rho_e, B1, B2, B3, psi = u v1 = rho_v1 / rho diff --git a/src/solvers/dgsem_tree/subcell_limiters_2d.jl b/src/solvers/dgsem_tree/subcell_limiters_2d.jl index 2ff8c9e8d0c..e362d71cacc 100644 --- a/src/solvers/dgsem_tree/subcell_limiters_2d.jl +++ b/src/solvers/dgsem_tree/subcell_limiters_2d.jl @@ -466,7 +466,7 @@ end # Goal and d(Goal)d(u) function @inline goal_function(variable, bound, u, equations) = bound - variable(u, equations) @inline function dgoal_function(variable, u, dt, antidiffusive_flux, equations) - -dot(variable(u, equations, True()), dt * antidiffusive_flux) + -dot(variable_derivative(variable, u, equations), dt * antidiffusive_flux) end # Final checks