Path: blob/main/examples/p4est_2d_dgsem/elixir_eulermulti_shock.jl
5586 views
using OrdinaryDiffEqSSPRK, OrdinaryDiffEqLowStorageRK1using Trixi23# 1) Dry Air 2) SF_64equations = CompressibleEulerMulticomponentEquations2D(gammas = (1.4, 1.648),5gas_constants = (0.287, 1.578))67"""8initial_condition_shock(coordinates, t, equations::CompressibleEulerEquations2D)910Shock traveling from left to right where it interacts with a Perturbed interface.11"""12@inline function initial_condition_shock(x, t,13equations::CompressibleEulerMulticomponentEquations2D)14rho_0 = 1.25 # kg/m^315p_0 = 101325 # Pa16T_0 = 293 # K17u_0 = 352 # m/s18d = 2019w = 402021if x[1] < 2522# Shock region.23v1 = 0.3524v2 = 0.025rho1 = 1.7226rho2 = 0.0327p = 1.5728elseif (x[1] <= 30) || (x[1] <= 70 && abs(125 - x[2]) > w / 2)29# Intermediate region.30v1 = 0.031v2 = 0.032rho1 = 1.2533rho2 = 0.0334p = 1.035else36(x[1] <= 70 + d)37# SF_6 region.38v1 = 0.039v2 = 0.040rho1 = 0.0341rho2 = 6.03 #SF_642p = 1.043end4445return prim2cons(SVector(v1, v2, p, rho1, rho2), equations)46end4748# Define the simulation.49initial_condition = initial_condition_shock5051surface_flux = flux_lax_friedrichs52volume_flux = flux_ranocha53basis = LobattoLegendreBasis(3)5455limiter_idp = SubcellLimiterIDP(equations, basis;56positivity_variables_cons = ["rho" * string(i)57for i in eachcomponent(equations)])5859volume_integral = VolumeIntegralSubcellLimiting(limiter_idp;60volume_flux_dg = volume_flux,61volume_flux_fv = surface_flux)6263solver = DGSEM(basis, surface_flux, volume_integral)6465coordinates_min = (0.0, 0.0)66coordinates_max = (250.0, 250.0)67mesh = P4estMesh((32, 32), polydeg = 3, coordinates_min = (0.0, 0.0),68coordinates_max = (250.0, 250.0), periodicity = (false, true),69initial_refinement_level = 0)7071# Completely free outflow72function boundary_condition_outflow(u_inner, normal_direction::AbstractVector,73x, t,74surface_flux_function,75equations)76# Calculate the boundary flux entirely from the internal solution state77return flux(u_inner, normal_direction, equations)78end7980boundary_conditions = (; x_neg = BoundaryConditionDirichlet(initial_condition),81x_pos = boundary_condition_outflow)8283semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;84boundary_conditions = boundary_conditions)8586###############################################################################87# ODE solvers, callbacks etc.8889tspan = (0.0, 5.0)90ode = semidiscretize(semi, tspan)9192summary_callback = SummaryCallback()9394analysis_interval = 1095analysis_callback = AnalysisCallback(semi, interval = analysis_interval,96save_analysis = true)9798alive_callback = AliveCallback(analysis_interval = analysis_interval)99100save_solution = SaveSolutionCallback(dt = 2.0,101save_initial_solution = true,102save_final_solution = true,103solution_variables = cons2prim)104105stepsize_callback = StepsizeCallback(cfl = 0.2)106107callbacks = CallbackSet(summary_callback,108analysis_callback,109alive_callback,110save_solution,111stepsize_callback)112113###############################################################################114# run the simulation115116stage_callbacks = (SubcellLimiterIDPCorrection(),117BoundsCheckCallback(save_errors = false, interval = 100))118# `interval` is used when calling this elixir in the tests with `save_errors=true`.119120@time begin121sol = Trixi.solve(ode, Trixi.SimpleSSPRK33(stage_callbacks = stage_callbacks);122dt = 0.1, # solve needs some value here but it will be overwritten by the stepsize_callback123ode_default_options()..., callback = callbacks)124end125126127