Path: blob/main/examples/tree_1d_dgsem/elixir_advection_diffusion_cfl.jl
5586 views
1using OrdinaryDiffEqLowStorageRK2using Trixi34###############################################################################5# semidiscretization of the linear advection diffusion equation67advection_velocity = 0.18equations = LinearScalarAdvectionEquation1D(advection_velocity)9diffusivity() = 0.110equations_parabolic = LaplaceDiffusion1D(diffusivity(), equations)1112solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs)1314coordinates_min = -convert(Float64, pi)15coordinates_max = convert(Float64, pi)1617# Create a uniformly refined mesh with periodic boundaries18mesh = TreeMesh(coordinates_min, coordinates_max,19initial_refinement_level = 4,20n_cells_max = 30_000, periodicity = true) # set maximum capacity of tree data structure)2122function x_trans_periodic(x, domain_length = SVector(2 * pi), center = SVector(0.0))23x_normalized = x .- center24x_shifted = x_normalized .% domain_length25x_offset = ((x_shifted .< -0.5 * domain_length) - (x_shifted .> 0.5 * domain_length)) .*26domain_length27return center + x_shifted + x_offset28end2930function initial_condition_diffusive_convergence_test(x, t,31equation::LinearScalarAdvectionEquation1D)32# Store translated coordinate for easy use of exact solution33x_trans = x_trans_periodic(x - equation.advection_velocity * t)3435nu = diffusivity()36c = 0.037A = 1.038L = 239f = 1 / L40omega = 1.041scalar = c + A * sin(omega * sum(x_trans)) * exp(-nu * omega^2 * t)42return SVector(scalar)43end44initial_condition = initial_condition_diffusive_convergence_test4546semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),47initial_condition, solver;48boundary_conditions = (boundary_condition_periodic,49boundary_condition_periodic))5051###############################################################################52# ODE solvers, callbacks etc.5354tspan = (0.0, 1.0)55ode = semidiscretize(semi, tspan);5657summary_callback = SummaryCallback()5859analysis_callback = AnalysisCallback(semi, interval = 100)6061alive_callback = AliveCallback(analysis_interval = 100)6263# Stepsize callback which selects the timestep according to the most restrictive CFL condition.64# For coarser grids, linear stability is governed by the hyperbolic CFL condition,65# while for high refinements the flow becomes diffusion-dominated.66stepsize_callback = StepsizeCallback(cfl = 1.6,67cfl_parabolic = 0.3)6869callbacks = CallbackSet(summary_callback, analysis_callback, alive_callback,70stepsize_callback)7172###############################################################################73# run the simulation7475sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false),76dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback77save_everystep = false, callback = callbacks);787980