Path: blob/main/examples/dgmulti_2d/elixir_advection_diffusion_nonperiodic.jl
2055 views
using OrdinaryDiffEqLowStorageRK1using Trixi23dg = DGMulti(polydeg = 3, element_type = Quad(), approximation_type = Polynomial(),4surface_integral = SurfaceIntegralWeakForm(flux_lax_friedrichs),5volume_integral = VolumeIntegralWeakForm())67diffusivity() = 5.0e-289equations = LinearScalarAdvectionEquation2D(1.0, 0.0)10equations_parabolic = LaplaceDiffusion2D(diffusivity(), equations)1112# Example setup taken from13# - Truman Ellis, Jesse Chan, and Leszek Demkowicz (2016).14# Robust DPG methods for transient convection-diffusion.15# In: Building bridges: connections and challenges in modern approaches16# to numerical partial differential equations.17# [DOI](https://doi.org/10.1007/978-3-319-41640-3_6).18function initial_condition_erikkson_johnson(x, t, equations)19l = 420epsilon = diffusivity() # Note: this requires epsilon < 0.6 due to the sqrt21lambda_1 = (-1 + sqrt(1 - 4 * epsilon * l)) / (-2 * epsilon)22lambda_2 = (-1 - sqrt(1 - 4 * epsilon * l)) / (-2 * epsilon)23r1 = (1 + sqrt(1 + 4 * pi^2 * epsilon^2)) / (2 * epsilon)24s1 = (1 - sqrt(1 + 4 * pi^2 * epsilon^2)) / (2 * epsilon)25u = exp(-l * t) * (exp(lambda_1 * x[1]) - exp(lambda_2 * x[1])) +26cos(pi * x[2]) * (exp(s1 * x[1]) - exp(r1 * x[1])) / (exp(-s1) - exp(-r1))27return SVector{1}(u)28end29initial_condition = initial_condition_erikkson_johnson3031# tag different boundary segments32left(x, tol = 50 * eps()) = abs(x[1] + 1) < tol33right(x, tol = 50 * eps()) = abs(x[1]) < tol34bottom(x, tol = 50 * eps()) = abs(x[2] + 0.5) < tol35top(x, tol = 50 * eps()) = abs(x[2] - 0.5) < tol36entire_boundary(x, tol = 50 * eps()) = true37is_on_boundary = Dict(:left => left, :right => right, :top => top, :bottom => bottom,38:entire_boundary => entire_boundary)3940cells_per_dimension = (16, 16)41mesh = DGMultiMesh(dg, cells_per_dimension;42coordinates_min = (-1.0, -0.5),43coordinates_max = (0.0, 0.5),44is_on_boundary)4546# BC types47boundary_condition = BoundaryConditionDirichlet(initial_condition)4849# define inviscid boundary conditions, enforce "do nothing" boundary condition at the outflow50boundary_conditions = (; :left => boundary_condition,51:top => boundary_condition,52:bottom => boundary_condition,53:right => boundary_condition_do_nothing)5455# define viscous boundary conditions56boundary_conditions_parabolic = (; :entire_boundary => boundary_condition)5758semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),59initial_condition, dg;60boundary_conditions = (boundary_conditions,61boundary_conditions_parabolic))6263tspan = (0.0, 1.5)64ode = semidiscretize(semi, tspan)6566summary_callback = SummaryCallback()67alive_callback = AliveCallback(alive_interval = 10)68analysis_interval = 10069analysis_callback = AnalysisCallback(semi, interval = analysis_interval, uEltype = real(dg))70save_solution = SaveSolutionCallback(interval = analysis_interval,71solution_variables = cons2prim)72callbacks = CallbackSet(summary_callback, alive_callback, analysis_callback, save_solution)7374###############################################################################75# run the simulation7677time_int_tol = 1e-878sol = solve(ode, RDPK3SpFSAL49(); abstol = time_int_tol, reltol = time_int_tol,79ode_default_options()..., callback = callbacks)808182