Path: blob/main/examples/tree_3d_dgsem/elixir_hypdiff_lax_friedrichs.jl
2055 views
using Trixi12###############################################################################3# semidiscretization of the hyperbolic diffusion equations45equations = HyperbolicDiffusionEquations3D()67function initial_condition_poisson_periodic(x, t, equations::HyperbolicDiffusionEquations3D)8# elliptic equation: -νΔϕ = f9# depending on initial constant state, c, for phi this converges to the solution ϕ + c10if iszero(t)11phi = 0.012q1 = 0.013q2 = 0.014q3 = 0.015else16phi = sin(2 * pi * x[1]) * sin(2 * pi * x[2]) * sin(2 * pi * x[3])17q1 = 2 * pi * cos(2 * pi * x[1]) * sin(2 * pi * x[2]) * sin(2 * pi * x[3])18q2 = 2 * pi * sin(2 * pi * x[1]) * cos(2 * pi * x[2]) * sin(2 * pi * x[3])19q3 = 2 * pi * sin(2 * pi * x[1]) * sin(2 * pi * x[2]) * cos(2 * pi * x[3])20end21return SVector(phi, q1, q2, q3)22end23initial_condition = initial_condition_poisson_periodic2425@inline function source_terms_poisson_periodic(u, x, t,26equations::HyperbolicDiffusionEquations3D)27# elliptic equation: -νΔϕ = f28# analytical solution: phi = sin(2πx)*sin(2πy) and f = -8νπ^2 sin(2πx)*sin(2πy)29@unpack inv_Tr = equations30C = -12 * equations.nu * pi^23132x1, x2, x3 = x33tmp1 = sinpi(2 * x1)34tmp2 = sinpi(2 * x2)35tmp3 = sinpi(2 * x3)36du1 = -C * tmp1 * tmp2 * tmp337du2 = -inv_Tr * u[2]38du3 = -inv_Tr * u[3]39du4 = -inv_Tr * u[4]4041return SVector(du1, du2, du3, du4)42end4344solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs)4546coordinates_min = (0.0, 0.0, 0.0)47coordinates_max = (1.0, 1.0, 1.0)48mesh = TreeMesh(coordinates_min, coordinates_max,49initial_refinement_level = 3,50n_cells_max = 30_000)5152semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,53source_terms = source_terms_poisson_periodic)5455###############################################################################56# ODE solvers, callbacks etc.5758tspan = (0.0, 2.0)59ode = semidiscretize(semi, tspan)6061summary_callback = SummaryCallback()6263resid_tol = 5.0e-1264steady_state_callback = SteadyStateCallback(abstol = resid_tol, reltol = 0.0)6566analysis_interval = 20067analysis_callback = AnalysisCallback(semi, interval = analysis_interval,68extra_analysis_integrals = (entropy, energy_total))6970alive_callback = AliveCallback(analysis_interval = analysis_interval)7172save_solution = SaveSolutionCallback(interval = 100,73save_initial_solution = true,74save_final_solution = true,75solution_variables = cons2prim)7677stepsize_callback = StepsizeCallback(cfl = 2.4)7879callbacks = CallbackSet(summary_callback, steady_state_callback,80analysis_callback, alive_callback,81save_solution,82stepsize_callback)8384###############################################################################85# run the simulation8687sol = Trixi.solve(ode, Trixi.HypDiffN3Erk3Sstar52();88dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback89ode_default_options()..., callback = callbacks);909192