Path: blob/main/examples/tree_1d_dgsem/elixir_burgers_shock.jl
2055 views
using OrdinaryDiffEqLowStorageRK1using Trixi23###############################################################################4# semidiscretization of the (inviscid) Burgers' equation56equations = InviscidBurgersEquation1D()78basis = LobattoLegendreBasis(3)9# Use shock capturing techniques to suppress oscillations at discontinuities10indicator_sc = IndicatorHennemannGassner(equations, basis,11alpha_max = 1.0,12alpha_min = 0.001,13alpha_smooth = true,14variable = first)1516volume_flux = flux_ec17surface_flux = flux_lax_friedrichs1819volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;20volume_flux_dg = volume_flux,21volume_flux_fv = surface_flux)2223solver = DGSEM(basis, surface_flux, volume_integral)2425coordinate_min = 0.026coordinate_max = 1.02728# Make sure to turn periodicity explicitly off as special boundary conditions are specified29mesh = TreeMesh(coordinate_min, coordinate_max,30initial_refinement_level = 6,31n_cells_max = 10_000,32periodicity = false)3334# Discontinuous initial condition (Riemann Problem) leading to a shock to test e.g. correct shock speed.35function initial_condition_shock(x, t, equation::InviscidBurgersEquation1D)36RealT = eltype(x)37scalar = x[1] < 0.5f0 ? convert(RealT, 1.5f0) : convert(RealT, 0.5f0)3839return SVector(scalar)40end4142###############################################################################43# Specify non-periodic boundary conditions4445boundary_condition_inflow = BoundaryConditionDirichlet(initial_condition_shock)4647function boundary_condition_outflow(u_inner, orientation, direction, x, t,48surface_flux_function,49equations::InviscidBurgersEquation1D)50# Calculate the boundary flux entirely from the internal solution state51return flux(u_inner, orientation, equations)52end5354boundary_conditions = (x_neg = boundary_condition_inflow,55x_pos = boundary_condition_outflow)5657initial_condition = initial_condition_shock5859semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,60boundary_conditions = boundary_conditions)6162###############################################################################63# ODE solvers, callbacks etc.6465tspan = (0.0, 0.2)66ode = semidiscretize(semi, tspan)6768summary_callback = SummaryCallback()6970analysis_interval = 10071analysis_callback = AnalysisCallback(semi, interval = analysis_interval)7273alive_callback = AliveCallback(analysis_interval = analysis_interval)7475stepsize_callback = StepsizeCallback(cfl = 0.85)7677callbacks = CallbackSet(summary_callback,78analysis_callback, alive_callback,79stepsize_callback)8081###############################################################################82# run the simulation8384sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false);85dt = 42, # solve needs some value here but it will be overwritten by the stepsize_callback86ode_default_options()..., callback = callbacks);878889