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

DGMulti non-conservative terms appear to be broken #1774

Closed
jlchan opened this issue Dec 13, 2023 · 4 comments
Closed

DGMulti non-conservative terms appear to be broken #1774

jlchan opened this issue Dec 13, 2023 · 4 comments
Labels
bug Something isn't working

Comments

@jlchan
Copy link
Contributor

jlchan commented Dec 13, 2023

I think the DGMulti treatment of all non-conservative terms is incorrect. In VolumeIntegralFluxDifferencing, I noticed that while conservative flux contributions are expected to be scaled by a factor of 2, non-conservative fluxes are not. This is not properly accounted for by DGMulti in hadamard_sum (which is used in the volume integral calculation).

The boundary terms incorporate the additional scaling of the non-conservative terms properly, but there may still be some issues related to the surface integral terms - if I fix the factor of 2 scaling issue in the volume integral, things still crash.

@jlchan
Copy link
Contributor Author

jlchan commented Dec 13, 2023

This might explain some of the odd CI test failures with DGMulti for non-conservative equations we observed in previous PRs too.

@ranocha ranocha added the bug Something isn't working label Dec 14, 2023
@DanielDoehring
Copy link
Contributor

Do you have found an example showcasing issues? This Alfven-wave test

using OrdinaryDiffEq
using Trixi

###############################################################################
# semidiscretization of the compressible ideal GLM-MHD equations
equations = IdealGlmMhdEquations2D(1.4)

surface_flux = (flux_lax_friedrichs, flux_nonconservative_powell)
volume_flux = (flux_hindenlang_gassner, flux_nonconservative_powell)

solver = DGMulti(polydeg = 3, element_type = Quad(), approximation_type = GaussSBP(),
                 surface_integral = SurfaceIntegralWeakForm(surface_flux),
                 volume_integral = VolumeIntegralFluxDifferencing(volume_flux))

initial_refinement_level = 3
N = 2^initial_refinement_level                 
cells_per_dimension = (N, N)
mesh = DGMultiMesh(solver, cells_per_dimension, periodicity = true, 
                   coordinates_min = (0.0, 0.0), coordinates_max = (sqrt(2), sqrt(2)))

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

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

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

summary_callback = SummaryCallback()

analysis_interval = 100
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
                                     uEltype = real(solver))
alive_callback = AliveCallback(alive_interval = 10)

cfl = 0.8
stepsize_callback = StepsizeCallback(cfl = cfl)
glm_speed_callback = GlmSpeedCallback(glm_scale = 0.5, cfl = cfl)

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

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

sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false),
            dt = 1e-5, # 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

looks fine:

####################################################################################################
l2
rho                 rho_v1              rho_v2              rho_v3              rho_e               B1                  B2                  B3                  psi                 
error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       
1.87e-05  -         4.42e-06  -         4.42e-06  -         6.34e-06  -         7.21e-06  -         6.38e-06  -         6.38e-06  -         6.54e-06  -         4.40e-06  -         
5.28e-07  5.15      2.70e-07  4.03      2.70e-07  4.03      3.60e-07  4.14      4.46e-07  4.01      3.81e-07  4.06      3.81e-07  4.06      3.67e-07  4.16      4.80e-07  3.20      
2.72e-08  4.28      1.68e-08  4.01      1.68e-08  4.01      2.23e-08  4.01      2.98e-08  3.91      2.25e-08  4.08      2.25e-08  4.08      2.23e-08  4.04      4.41e-08  3.44      
1.64e-09  4.05      1.05e-09  4.00      1.05e-09  4.00      1.38e-09  4.02      2.04e-09  3.86      1.48e-09  3.92      1.48e-09  3.92      1.39e-09  4.01      1.03e-09  5.42      

mean      4.49      mean      4.01      mean      4.01      mean      4.06      mean      3.93      mean      4.02      mean      4.02      mean      4.07      mean      4.02      
----------------------------------------------------------------------------------------------------
linf
rho                 rho_v1              rho_v2              rho_v3              rho_e               B1                  B2                  B3                  psi                 
error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       error     EOC       
4.12e-05  -         1.07e-05  -         1.07e-05  -         1.46e-05  -         1.62e-05  -         1.36e-05  -         1.36e-05  -         1.44e-05  -         7.43e-06  -         
1.14e-06  5.17      6.17e-07  4.12      6.17e-07  4.12      7.85e-07  4.21      1.16e-06  3.80      8.10e-07  4.07      8.10e-07  4.07      8.08e-07  4.15      9.54e-07  2.96      
7.12e-08  4.00      4.03e-08  3.94      4.03e-08  3.94      4.92e-08  4.00      6.65e-08  4.13      4.71e-08  4.11      4.71e-08  4.11      4.93e-08  4.04      9.14e-08  3.38      
4.21e-09  4.08      2.54e-09  3.99      2.54e-09  3.99      3.11e-09  3.98      5.41e-09  3.62      3.30e-09  3.83      3.30e-09  3.83      3.10e-09  3.99      2.13e-09  5.42      

mean      4.42      mean      4.01      mean      4.01      mean      4.06      mean      3.85      mean      4.00      mean      4.00      mean      4.06      mean      3.92      
----------------------------------------------------------------------------------------------------

@jlchan
Copy link
Contributor Author

jlchan commented Dec 18, 2023

I think this is because the non-conservative part of the ideal MHD equations is the divergence cleaning term. This can be incorrectly scaled without incurring a catastrophic error (it just amounts to a change in the cleaning speed).

If you try CompressibleEulerQuasi1D (see for example https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_1d_dgsem/elixir_euler_quasi_1d_source_terms.jl) with DGMulti, it fails while DGSEM + TreeMesh1D works.

@jlchan
Copy link
Contributor Author

jlchan commented Jan 3, 2024

@jlchan jlchan closed this as completed Jan 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants