Path: blob/main/examples/p4est_2d_dgsem/elixir_navierstokes_couette_flow.jl
2055 views
using OrdinaryDiffEqLowStorageRK1using Trixi23###############################################################################4# semidiscretization of the ideal compressible Navier-Stokes equations56# Fluid parameters7gamma() = 1.48prandtl_number() = 0.71910# Parameters for compressible, yet viscous set up11Re() = 10012Ma() = 1.21314# Parameters that can be freely chosen15v_top() = 116rho_in() = 117height() = 1.01819# Parameters that follow from Reynolds and Mach number + adiabatic index gamma20nu() = v_top() * height() / Re()2122c() = v_top() / Ma()23p_over_rho() = c()^2 / gamma()24p_in() = rho_in() * p_over_rho()25mu() = rho_in() * nu()2627equations = CompressibleEulerEquations2D(gamma())28equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),29Prandtl = prandtl_number())3031# Set inflow, impose known/expected velocity profile32@inline function initial_condition(x, t, equations)33v1 = x[2] / height() * v_top() # Linear profile from 0 to v_top34v2 = 0.03536prim = SVector(rho_in(), v1, v2, p_in())37return prim2cons(prim, equations)38end3940len() = 5 * height() # Roughly constant at this len of the channel41coordinates_min = (0.0, 0.0) # minimum coordinates (min(x), min(y))42coordinates_max = (len(), height()) # maximum coordinates (max(x), max(y))4344trees_per_dimension = (36, 12)45mesh = P4estMesh(trees_per_dimension, polydeg = 1,46coordinates_min = coordinates_min, coordinates_max = coordinates_max,47periodicity = (false, false))4849# Free outflow50function boundary_condition_outflow(u_inner, normal_direction::AbstractVector, x, t,51surface_flux_function,52equations::CompressibleEulerEquations2D)53# Calculate the boundary flux entirely from the internal solution state54return flux(u_inner, normal_direction, equations)55end5657### Hyperbolic boundary conditions ###58bs_hyperbolic = Dict(:x_neg => BoundaryConditionDirichlet(initial_condition), # Weakly enforced inflow BC59:x_pos => boundary_condition_outflow, # Free outflow/extended domain60# Top/Bottom of channel: Walls61:y_neg => boundary_condition_slip_wall,62:y_pos => boundary_condition_slip_wall)6364### Parabolic boundary conditions ###6566velocity_bc_top_left = NoSlip((x, t, equations) -> SVector(x[2] / height() * v_top(), 0))67# Use isothermal for inflow - adiabatic should also work68heat_bc_top_left = Isothermal() do x, t, equations_parabolic69Trixi.temperature(initial_condition(x, t,70equations_parabolic),71equations_parabolic)72end73bc_parabolic_top_left = BoundaryConditionNavierStokesWall(velocity_bc_top_left,74heat_bc_top_left)7576velocity_bc_bottom = NoSlip((x, t, equations) -> SVector(0, 0))77heat_bc_bottom = Adiabatic((x, t, equations) -> 0)78boundary_condition_bottom = BoundaryConditionNavierStokesWall(velocity_bc_bottom,79heat_bc_bottom)8081# On right end: Just copy the state/gradients82@inline function boundary_condition_copy(flux_inner,83u_inner,84normal::AbstractVector,85x, t,86operator_type::Trixi.Gradient,87equations::CompressibleNavierStokesDiffusion2D{GradientVariablesPrimitive})88return u_inner89end90@inline function boundary_condition_copy(flux_inner,91u_inner,92normal::AbstractVector,93x, t,94operator_type::Trixi.Divergence,95equations::CompressibleNavierStokesDiffusion2D{GradientVariablesPrimitive})96return flux_inner97end9899bcs_parabolic = Dict(:x_neg => bc_parabolic_top_left,100:x_pos => boundary_condition_copy,101:y_neg => boundary_condition_bottom,102:y_pos => bc_parabolic_top_left)103104solver = DGSEM(polydeg = 3, surface_flux = flux_hll)105106semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),107initial_condition, solver,108boundary_conditions = (bs_hyperbolic,109bcs_parabolic))110111###############################################################################112113tspan = (0, 5)114ode = semidiscretize(semi, tspan)115116summary_callback = SummaryCallback()117118analysis_interval = 1000119analysis_callback = AnalysisCallback(semi, interval = analysis_interval,120extra_analysis_errors = (:l2_error_primitive,121:linf_error_primitive))122123alive_callback = AliveCallback(analysis_interval = analysis_interval)124125save_solution = SaveSolutionCallback(dt = 1.0,126save_initial_solution = true,127save_final_solution = true,128solution_variables = cons2prim)129130callbacks = CallbackSet(summary_callback,131analysis_callback,132alive_callback,133save_solution)134135###############################################################################136137time_int_tol = 1e-7138sol = solve(ode, RDPK3SpFSAL49();139abstol = time_int_tol, reltol = time_int_tol,140ode_default_options()..., callback = callbacks)141142143