trixi-framework / trixi-framework/Trixi.jl

Add Positivity Preserving Feature for GaussSBP nodes

Open
#1,944 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Julia
Stars
731
Forks
166
Avg merge
2d 18h
Merged PRs (30d)
25

Description

Hello,

The positivity preserving feature `PositivityPreservingLimiterZhangShu` does not seem to work for `GaussSBP()` with the time stepper `SSPRK43()` or ` CarpenterKennedy2N54`

1D Compressible Euler example with `GaussSBP()`:

```
using Trixi
using OrdinaryDiffEq

gamma_gas = 1.4
equations = CompressibleEulerEquations1D(gamma_gas)

###############################################################################
# setup the GSBP DG discretization that uses the Gauss operators from
# Chan, Del Rey Fernandez, Carpenter (2019).
# [https://doi.org/10.1137/18M1209234](https://doi.org/10.1137/18M1209234)

# Shu-Osher initial condition for 1D compressible Euler equations
# Example 8, https://www.sciencedirect.com/science/article/pii/0021999189902222
function initial_condition_shu_osher(x, t, equations::CompressibleEulerEquations1D)
x0 = -4

rho_left = 27/7
v_left = 4*sqrt(35)/9
p_left = 31/3

# Replaced v_right = 0 to v_right = 0.1 to avoid positivity issues.
v_right = 0.1
p_right = 1.0

rho = ifelse(x[1] > x0, 1 + 1/5*sin(5*x[1]), rho_left)
v = ifelse(x[1] > x0, v_right, v_left)
p = ifelse(x[1] > x0, p_right, p_left)

return prim2cons(SVector(rho + 0.1*rand(), v + 0.1*rand(), p + 0.1*rand()), equations)
end

initial_condition = initial_condition_shu_osher

surface_flux = flux_lax_friedrichs
volume_flux = flux_ranocha

polydeg = 3
basis = DGMultiBasis(Line(), polydeg, approximation_type = GaussSBP())

indicator_sc = IndicatorHennemannGassner(equations, basis,
alpha_max = 0.5,
alpha_min = 0.001,
alpha_smooth = true,
variable = density_pressure)
volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
volume_flux_dg = volume_flux,
volume_flux_fv = surface_flux)

dg = DGMulti(basis,
surface_integral = SurfaceIntegralWeakForm(surface_flux),
volume_integral = volume_integral)

boundary_condition = BoundaryConditionDirichlet(initial_condition)
boundary_conditions = (; :entire_boundary => boundary_condition)

###############################################################################
# setup the 1D mesh

cells_per_dimension = (64,)
mesh = DGMultiMesh(dg, cells_per_dimension,
coordinates_min = (-5.0,), coordinates_max = (5.0,),
periodicity = false)

###############################################################################
# setup the semidiscretization and ODE problem

semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition,
dg, boundary_conditions = boundary_conditions)

tspan = (0.0, 2.0)
ode = semidiscretize(semi, tspan)

###############################################################################
# setup the callbacks

# prints a summary of the simulation setup and resets the timers
summary_callback = SummaryCallback()

# analyse the solution in regular intervals and prints the results
analysis_callback = AnalysisCallback(semi, interval = 100, uEltype = real(dg))

# handles the re-calculation of the maximum Δt after each time step
stepsize_callback = StepsizeCallback(cfl = 0.1)

# collect all callbacks such that they can be passed to the ODE solver
callbacks = CallbackSet(summary_callback, analysis_callback, stepsize_callback)

# For future work, add PositivityPreservingLimiterZhangShu for DGMulti with Gauss nodes
stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=(5.0e-6, 5.0e-6),
variables=(Trixi.density, pressure))

# ###############################################################################
# # run the simulation

sol = solve(ode, SSPRK43(stage_limiter!), adaptive = true, callback = callbacks, save_everystep = true)
```

Contributor guide

Open the contributing guide

Research direction

Start with the GaussSBP-based DGMulti example in the issue and trace how PositivityPreservingLimiterZhangShu is applied with SSPRK43 and CarpenterKennedy2N54. Compare the limiter's current behavior for GaussSBP nodes with the existing DGMulti setup; done means the supplied 1D Compressible Euler simulation runs without positivity failures for the requested time steppers.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
hpc
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.