Path: blob/main/examples/tree_2d_fdsbp/elixir_euler_vortex.jl
2055 views
# !!! warning "Experimental implementation (upwind SBP)"1# This is an experimental feature and may change in future releases.23using OrdinaryDiffEqSSPRK4using Trixi56###############################################################################7# semidiscretization of the compressible Euler equations89equations = CompressibleEulerEquations2D(1.4)1011"""12initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)1314The classical isentropic vortex test case of15- Chi-Wang Shu (1997)16Essentially Non-Oscillatory and Weighted Essentially Non-Oscillatory17Schemes for Hyperbolic Conservation Laws18[NASA/CR-97-206253](https://ntrs.nasa.gov/citations/19980007543)19"""20function initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)21# needs appropriate mesh size, e.g. [-10,-10]x[10,10]22# for error convergence: make sure that the end time is such that the is back at the initial state!!23# for the current velocity and domain size: t_end should be a multiple of 20s24# initial center of the vortex25inicenter = SVector(0.0, 0.0)26# size and strength of the vortex27iniamplitude = 5.028# base flow29rho = 1.030v1 = 1.031v2 = 1.032vel = SVector(v1, v2)33p = 25.034rt = p / rho # ideal gas equation35t_loc = 0.036cent = inicenter + vel * t_loc # advection of center37# ATTENTION: handle periodic BC, but only for v1 = v2 = 1.0 (!!!!)3839cent = x - cent # distance to center point4041#cent=cross(iniaxis,cent) # distance to axis, tangent vector, length r42# cross product with iniaxis = [0, 0, 1]43cent = SVector(-cent[2], cent[1])44r2 = cent[1]^2 + cent[2]^245du = iniamplitude / (2 * π) * exp(0.5 * (1 - r2)) # vel. perturbation46dtemp = -(equations.gamma - 1) / (2 * equations.gamma * rt) * du^2 # isentropic47rho = rho * (1 + dtemp)^(1 / (equations.gamma - 1))48vel = vel + du * cent49v1, v2 = vel50p = p * (1 + dtemp)^(equations.gamma / (equations.gamma - 1))51prim = SVector(rho, v1, v2, p)52return prim2cons(prim, equations)53end5455initial_condition = initial_condition_isentropic_vortex5657D_upw = upwind_operators(SummationByPartsOperators.Mattsson2017,58derivative_order = 1,59accuracy_order = 4,60xmin = -1.0, xmax = 1.0,61N = 16)62flux_splitting = splitting_steger_warming63solver = FDSBP(D_upw,64surface_integral = SurfaceIntegralUpwind(flux_splitting),65volume_integral = VolumeIntegralUpwind(flux_splitting))6667coordinates_min = (-10.0, -10.0)68coordinates_max = (10.0, 10.0)69mesh = TreeMesh(coordinates_min, coordinates_max,70initial_refinement_level = 3,71n_cells_max = 30_000,72periodicity = true)7374semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)7576###############################################################################77# ODE solvers, callbacks etc.7879tspan = (0.0, 20.0)80ode = semidiscretize(semi, tspan)8182summary_callback = SummaryCallback()8384analysis_interval = 100085analysis_callback = AnalysisCallback(semi, interval = analysis_interval)8687alive_callback = AliveCallback(analysis_interval = analysis_interval)8889save_solution = SaveSolutionCallback(interval = 1000,90save_initial_solution = true,91save_final_solution = true,92solution_variables = cons2prim)9394callbacks = CallbackSet(summary_callback,95analysis_callback,96save_solution,97alive_callback)9899###############################################################################100# run the simulation101102sol = solve(ode, SSPRK43(); abstol = 1.0e-6, reltol = 1.0e-6, dt = 1e-3,103ode_default_options()..., callback = callbacks)104105106