Path: blob/main/examples/p4est_2d_dgsem/elixir_navierstokes_SD7003airfoil.jl
2055 views
using OrdinaryDiffEqLowStorageRK1using Trixi23###############################################################################4# semidiscretization of the compressible Euler equations56gamma = 1.478U_inf = 0.29aoa = 4 * pi / 18010rho_inf = 1.4 # with gamma = 1.4 => p_inf = 1.01112Re = 10000.013airfoil_cord_length = 1.01415t_c = airfoil_cord_length / U_inf1617prandtl_number() = 0.7218mu() = rho_inf * U_inf * airfoil_cord_length / Re1920equations = CompressibleEulerEquations2D(gamma)21equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu(),22Prandtl = prandtl_number(),23gradient_variables = GradientVariablesPrimitive())2425@inline function initial_condition_mach02_flow(x, t, equations)26# set the freestream flow parameters such that c_inf = 1.0 => Mach 0.227rho_freestream = 1.42829# Values correspond to `aoa = 4 * pi / 180`30v1 = 0.19951281005196486 # 0.2 * cos(aoa)31v2 = 0.01395129474882506 # 0.2 * sin(aoa)3233p_freestream = 1.03435prim = SVector(rho_freestream, v1, v2, p_freestream)36return prim2cons(prim, equations)37end38initial_condition = initial_condition_mach02_flow3940surf_flux = flux_hllc41vol_flux = flux_chandrashekar42solver = DGSEM(polydeg = 3, surface_flux = surf_flux,43volume_integral = VolumeIntegralFluxDifferencing(vol_flux))4445###############################################################################46# Get the uncurved mesh from a file (downloads the file if not available locally)4748# Get quadratic meshfile49mesh_file_name = "SD7003_2D_Quadratic.inp"5051mesh_file = Trixi.download("https://gist.githubusercontent.com/DanielDoehring/bd2aa20f7e6839848476a0e87ede9f69/raw/1bc8078b4a57634819dc27010f716e68a225c9c6/SD7003_2D_Quadratic.inp",52joinpath(@__DIR__, mesh_file_name))5354# There is also a linear mesh file available at55# https://gist.githubusercontent.com/DanielDoehring/375df933da8a2081f58588529bed21f0/raw/18592aa90f1c86287b4f742fd405baf55c3cf133/SD7003_2D_Linear.inp5657boundary_symbols = [:Airfoil, :FarField]58mesh = P4estMesh{2}(mesh_file, boundary_symbols = boundary_symbols)5960boundary_condition_free_stream = BoundaryConditionDirichlet(initial_condition)6162velocity_bc_airfoil = NoSlip((x, t, equations) -> SVector(0.0, 0.0))63heat_bc = Adiabatic((x, t, equations) -> 0.0)64boundary_condition_airfoil = BoundaryConditionNavierStokesWall(velocity_bc_airfoil, heat_bc)6566boundary_conditions_hyp = Dict(:FarField => boundary_condition_free_stream,67:Airfoil => boundary_condition_slip_wall)6869boundary_conditions_para = Dict(:FarField => boundary_condition_free_stream,70:Airfoil => boundary_condition_airfoil)7172semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),73initial_condition, solver;74boundary_conditions = (boundary_conditions_hyp,75boundary_conditions_para))7677###############################################################################78# ODE solvers, callbacks etc.7980# Run simulation until initial pressure wave is gone.81# Note: This is a very long simulation!82tspan = (0.0, 30 * t_c)8384# Drag/Lift coefficient measurements should then be done over the 30 to 35 t_c interval85# by restarting the simulation.8687ode = semidiscretize(semi, tspan)8889summary_callback = SummaryCallback()9091f_aoa() = aoa92f_rho_inf() = rho_inf93f_U_inf() = U_inf94f_linf() = airfoil_cord_length9596force_boundary_symbol = (:Airfoil,)97drag_coefficient = AnalysisSurfaceIntegral(force_boundary_symbol,98DragCoefficientPressure2D(f_aoa(), f_rho_inf(),99f_U_inf(), f_linf()))100101drag_coefficient_shear_force = AnalysisSurfaceIntegral(force_boundary_symbol,102DragCoefficientShearStress2D(f_aoa(),103f_rho_inf(),104f_U_inf(),105f_linf()))106107lift_coefficient = AnalysisSurfaceIntegral(force_boundary_symbol,108LiftCoefficientPressure2D(f_aoa(), f_rho_inf(),109f_U_inf(), f_linf()))110111# For long simulation run, use a large interval.112# For measurements once the simulation has settled in, one should use a113# significantly smaller interval, e.g. 500 to record the drag/lift coefficients.114analysis_interval = 10_000115analysis_callback = AnalysisCallback(semi, interval = analysis_interval,116output_directory = "out",117save_analysis = true,118analysis_errors = Symbol[], # Turn off standard errors119analysis_integrals = (drag_coefficient,120drag_coefficient_shear_force,121lift_coefficient))122123stepsize_callback = StepsizeCallback(cfl = 2.2)124125alive_callback = AliveCallback(alive_interval = 50)126127save_solution = SaveSolutionCallback(interval = analysis_interval,128save_initial_solution = true,129save_final_solution = true,130solution_variables = cons2prim,131output_directory = "out")132133save_restart = SaveRestartCallback(interval = analysis_interval,134save_final_restart = true)135136callbacks = CallbackSet(summary_callback,137analysis_callback,138alive_callback,139stepsize_callback,140save_solution,141save_restart);142143###############################################################################144# run the simulation145146sol = solve(ode,147CarpenterKennedy2N54(williamson_condition = false,148thread = Trixi.True());149dt = 1.0, ode_default_options()..., callback = callbacks)150151152