Path: blob/main/examples/structured_1d_dgsem/elixir_linearizedeuler_characteristic_system.jl
2055 views
using OrdinaryDiffEqLowStorageRK1using LinearAlgebra: dot2using Trixi34###############################################################################5# semidiscretization of the linearized Euler equations67rho_0 = 1.08v_0 = 1.09c_0 = 1.010equations = LinearizedEulerEquations1D(rho_0, v_0, c_0)1112solver = DGSEM(polydeg = 3, surface_flux = flux_hll)1314coordinates_min = (0.0,) # minimum coordinate15coordinates_max = (1.0,) # maximum coordinate16cells_per_dimension = (64,)1718mesh = StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max)1920# For eigensystem of the linearized Euler equations see e.g.21# https://www.nas.nasa.gov/assets/nas/pdf/ams/2018/introtocfd/Intro2CFD_Lecture1_Pulliam_Euler_WaveEQ.pdf22# Linearized Euler: Eigensystem23lin_euler_eigvals = [v_0 - c_0; v_0; v_0 + c_0]24lin_euler_eigvecs = [-rho_0/c_0 1 rho_0/c_0;251 0 1;26-rho_0*c_0 0 rho_0*c_0]27lin_euler_eigvecs_inv = inv(lin_euler_eigvecs)2829# Trace back characteristics.30# See https://metaphor.ethz.ch/x/2019/hs/401-4671-00L/literature/mishra_hyperbolic_pdes.pdf, p.9531function compute_char_initial_pos(x, t)32return SVector(x[1], x[1], x[1]) .- t * lin_euler_eigvals33end3435function compute_primal_sol(char_vars)36return lin_euler_eigvecs * char_vars37end3839# Initial condition is in principle arbitrary, only periodicity is required40function initial_condition_entropy_wave(x, t, equations::LinearizedEulerEquations1D)41# Parameters42alpha = 1.043beta = 150.044center = 0.54546rho_prime = alpha * exp(-beta * (x[1] - center)^2)47v_prime = 0.048p_prime = 0.04950return SVector(rho_prime, v_prime, p_prime)51end5253function initial_condition_char_vars(x, t, equations::LinearizedEulerEquations1D)54# Trace back characteristics55x_char = compute_char_initial_pos(x, t)5657# Employ periodicity58for p in 1:359while x_char[p] < coordinates_min[1]60x_char[p] += coordinates_max[1] - coordinates_min[1]61end62while x_char[p] > coordinates_max[1]63x_char[p] -= coordinates_max[1] - coordinates_min[1]64end65end6667# Set up characteristic variables68w = zeros(3)69t_0 = 0 # Assumes t_0 = 070for p in 1:371u_char = initial_condition_entropy_wave(x_char[p], t_0, equations)72w[p] = dot(lin_euler_eigvecs_inv[p, :], u_char)73end7475return compute_primal_sol(w)76end7778initial_condition = initial_condition_char_vars7980semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)8182###############################################################################83# ODE solvers, callbacks etc.8485tspan = (0.0, 0.3)86ode = semidiscretize(semi, tspan)8788summary_callback = SummaryCallback()8990analysis_interval = 10091analysis_callback = AnalysisCallback(semi, interval = analysis_interval)9293alive_callback = AliveCallback(analysis_interval = analysis_interval)9495stepsize_callback = StepsizeCallback(cfl = 1.0)9697# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver98callbacks = CallbackSet(summary_callback, analysis_callback, alive_callback,99stepsize_callback)100101###############################################################################102# run the simulation103104sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false);105dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback106ode_default_options()..., callback = callbacks);107108109