-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into ci_julia_19
- Loading branch information
Showing
48 changed files
with
6,179 additions
and
605 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,14 +4,18 @@ authors = ["Andrew R. Winters <[email protected]>", "Michael Schlottke- | |
version = "0.1.0-pre" | ||
|
||
[deps] | ||
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" | ||
MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" | ||
Static = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" | ||
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" | ||
Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" | ||
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" | ||
|
||
[compat] | ||
LinearAlgebra = "1" | ||
MuladdMacro = "0.2.2" | ||
Static = "0.3, 0.4, 0.5, 0.6, 0.7, 0.8" | ||
StaticArrays = "1" | ||
Trixi = "0.5.17, 0.6" | ||
Trixi = "0.7" | ||
julia = "1.8" | ||
Printf = "1" |
113 changes: 113 additions & 0 deletions
113
examples/structured_2d_dgsem/elixir_shallowwater_conical_island.jl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
|
||
using OrdinaryDiffEq | ||
using Trixi | ||
using TrixiShallowWater | ||
|
||
############################################################################### | ||
# Semidiscretization of the shallow water equations | ||
|
||
equations = ShallowWaterEquationsWetDry2D(gravity_constant = 9.81, H0 = 1.4) | ||
|
||
""" | ||
initial_condition_conical_island(x, t, equations::ShallowWaterEquationsWetDry2D) | ||
Initial condition for the [`ShallowWaterEquationsWetDry2D`](@ref) to test the [`hydrostatic_reconstruction_chen_noelle`](@ref) | ||
and its handling of discontinuous water heights at the start in combination with wetting and | ||
drying. The bottom topography is given by a conical island in the middle of the domain. Around that | ||
island, there is a cylindrical water column at t=0 and the rest of the domain is dry. This | ||
discontinuous water height is smoothed by a logistic function. This simulation uses periodic | ||
boundary conditions. | ||
""" | ||
function initial_condition_conical_island(x, t, equations::ShallowWaterEquationsWetDry2D) | ||
# Set the background values | ||
|
||
v1 = 0.0 | ||
v2 = 0.0 | ||
|
||
x1, x2 = x | ||
b = max(0.1, 1.0 - 4.0 * sqrt(x1^2 + x2^2)) | ||
|
||
# use a logistic function to transfer water height value smoothly | ||
L = equations.H0 # maximum of function | ||
x0 = 0.3 # center point of function | ||
k = -25.0 # sharpness of transfer | ||
|
||
H = max(b, L / (1.0 + exp(-k * (sqrt(x1^2 + x2^2) - x0)))) | ||
|
||
# It is mandatory to shift the water level at dry areas to make sure the water height h | ||
# stays positive. The system would not be stable for h set to a hard 0 due to division by h in | ||
# the computation of velocity, e.g., (h v1) / h. Therefore, a small dry state threshold | ||
# with a default value of 500*eps() ≈ 1e-13 in double precision, is set in the constructor above | ||
# for the ShallowWaterEquationsWetDry and added to the initial condition if h = 0. | ||
# This default value can be changed within the constructor call depending on the simulation setup. | ||
H = max(H, b + equations.threshold_limiter) | ||
return prim2cons(SVector(H, v1, v2, b), equations) | ||
end | ||
|
||
initial_condition = initial_condition_conical_island | ||
|
||
############################################################################### | ||
# Get the DG approximation space | ||
|
||
volume_flux = (flux_wintermeyer_etal, flux_nonconservative_wintermeyer_etal) | ||
surface_flux = (FluxHydrostaticReconstruction(flux_hll_chen_noelle, | ||
hydrostatic_reconstruction_chen_noelle), | ||
flux_nonconservative_chen_noelle) | ||
|
||
basis = LobattoLegendreBasis(4) | ||
|
||
indicator_sc = IndicatorHennemannGassnerShallowWater(equations, basis, | ||
alpha_max = 0.5, | ||
alpha_min = 0.001, | ||
alpha_smooth = true, | ||
variable = waterheight_pressure) | ||
volume_integral = VolumeIntegralShockCapturingHG(indicator_sc; | ||
volume_flux_dg = volume_flux, | ||
volume_flux_fv = surface_flux) | ||
|
||
solver = DGSEM(basis, surface_flux, volume_integral) | ||
|
||
############################################################################### | ||
# Get the StructuredMesh and setup a periodic mesh | ||
|
||
coordinates_min = (-1.0, -1.0) | ||
coordinates_max = (1.0, 1.0) | ||
|
||
cells_per_dimension = (16, 16) | ||
|
||
mesh = StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max) | ||
|
||
# Create the semi discretization object | ||
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver) | ||
|
||
############################################################################### | ||
# ODE solver | ||
|
||
tspan = (0.0, 10.0) | ||
ode = semidiscretize(semi, tspan) | ||
|
||
############################################################################### | ||
# Callbacks | ||
|
||
summary_callback = SummaryCallback() | ||
|
||
analysis_interval = 1000 | ||
analysis_callback = AnalysisCallback(semi, interval = analysis_interval) | ||
|
||
alive_callback = AliveCallback(analysis_interval = analysis_interval) | ||
|
||
save_solution = SaveSolutionCallback(interval = 100, | ||
save_initial_solution = true, | ||
save_final_solution = true) | ||
|
||
callbacks = CallbackSet(summary_callback, analysis_callback, alive_callback, save_solution) | ||
|
||
############################################################################### | ||
# run the simulation | ||
|
||
stage_limiter! = PositivityPreservingLimiterShallowWater(variables = (Trixi.waterheight,)) | ||
|
||
sol = solve(ode, SSPRK43(stage_limiter!); | ||
ode_default_options()..., callback = callbacks); | ||
|
||
summary_callback() # print the timer summary |
118 changes: 118 additions & 0 deletions
118
examples/structured_2d_dgsem/elixir_shallowwater_parabolic_bowl.jl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
|
||
using OrdinaryDiffEq | ||
using Trixi | ||
using TrixiShallowWater | ||
|
||
############################################################################### | ||
# Semidiscretization of the shallow water equations | ||
|
||
equations = ShallowWaterEquationsWetDry2D(gravity_constant = 9.81) | ||
|
||
""" | ||
initial_condition_parabolic_bowl(x, t, equations:: ShallowWaterEquationsWetDry2D) | ||
Well-known initial condition to test the [`hydrostatic_reconstruction_chen_noelle`](@ref) and its | ||
wet-dry mechanics. This test has an analytical solution. The initial condition is defined by the | ||
analytical solution at time t=0. The bottom topography defines a bowl and the water level is given | ||
by an oscillating lake. | ||
The original test and its analytical solution were first presented in | ||
- William C. Thacker (1981) | ||
Some exact solutions to the nonlinear shallow-water wave equations | ||
[DOI: 10.1017/S0022112081001882](https://doi.org/10.1017/S0022112081001882). | ||
The particular setup below is taken from Section 6.2 of | ||
- Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and Timothy Warburton (2018) | ||
An entropy stable discontinuous Galerkin method for the shallow water equations on | ||
curvilinear meshes with wet/dry fronts accelerated by GPUs | ||
[DOI: 10.1016/j.jcp.2018.08.038](https://doi.org/10.1016/j.jcp.2018.08.038). | ||
""" | ||
function initial_condition_parabolic_bowl(x, t, equations::ShallowWaterEquationsWetDry2D) | ||
a = 1.0 | ||
h_0 = 0.1 | ||
sigma = 0.5 | ||
ω = sqrt(2 * equations.gravity * h_0) / a | ||
|
||
v1 = -sigma * ω * sin(ω * t) | ||
v2 = sigma * ω * cos(ω * t) | ||
|
||
b = h_0 * ((x[1])^2 + (x[2])^2) / a^2 | ||
|
||
H = sigma * h_0 / a^2 * (2 * x[1] * cos(ω * t) + 2 * x[2] * sin(ω * t) - sigma) + h_0 | ||
|
||
# It is mandatory to shift the water level at dry areas to make sure the water height h | ||
# stays positive. The system would not be stable for h set to a hard 0 due to division by h in | ||
# the computation of velocity, e.g., (h v1) / h. Therefore, a small dry state threshold | ||
# with a default value of 500*eps() ≈ 1e-13 in double precision, is set in the constructor above | ||
# for the ShallowWaterEquationsWetDry and added to the initial condition if h = 0. | ||
# This default value can be changed within the constructor call depending on the simulation setup. | ||
H = max(H, b + equations.threshold_limiter) | ||
return prim2cons(SVector(H, v1, v2, b), equations) | ||
end | ||
|
||
initial_condition = initial_condition_parabolic_bowl | ||
|
||
############################################################################### | ||
# Get the DG approximation space | ||
|
||
volume_flux = (flux_wintermeyer_etal, flux_nonconservative_wintermeyer_etal) | ||
surface_flux = (FluxHydrostaticReconstruction(flux_hll_chen_noelle, | ||
hydrostatic_reconstruction_chen_noelle), | ||
flux_nonconservative_chen_noelle) | ||
|
||
basis = LobattoLegendreBasis(4) | ||
|
||
indicator_sc = IndicatorHennemannGassnerShallowWater(equations, basis, | ||
alpha_max = 0.6, | ||
alpha_min = 0.001, | ||
alpha_smooth = true, | ||
variable = waterheight_pressure) | ||
volume_integral = VolumeIntegralShockCapturingHG(indicator_sc; | ||
volume_flux_dg = volume_flux, | ||
volume_flux_fv = surface_flux) | ||
|
||
solver = DGSEM(basis, surface_flux, volume_integral) | ||
|
||
############################################################################### | ||
|
||
coordinates_min = (-2.0, -2.0) | ||
coordinates_max = (2.0, 2.0) | ||
|
||
cells_per_dimension = (150, 150) | ||
|
||
mesh = StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max) | ||
|
||
# create the semi discretization object | ||
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver) | ||
|
||
############################################################################### | ||
# ODE solvers, callbacks etc. | ||
|
||
tspan = (0.0, 1.0) | ||
ode = semidiscretize(semi, tspan) | ||
|
||
summary_callback = SummaryCallback() | ||
|
||
analysis_interval = 1000 | ||
analysis_callback = AnalysisCallback(semi, interval = analysis_interval, | ||
save_analysis = false, | ||
extra_analysis_integrals = (energy_kinetic, | ||
energy_internal)) | ||
|
||
alive_callback = AliveCallback(analysis_interval = analysis_interval) | ||
|
||
save_solution = SaveSolutionCallback(interval = 100, | ||
save_initial_solution = true, | ||
save_final_solution = true) | ||
|
||
callbacks = CallbackSet(summary_callback, analysis_callback, alive_callback, save_solution) | ||
|
||
stage_limiter! = PositivityPreservingLimiterShallowWater(variables = (Trixi.waterheight,)) | ||
|
||
############################################################################### | ||
# run the simulation | ||
|
||
sol = solve(ode, SSPRK43(stage_limiter!); | ||
ode_default_options()..., callback = callbacks); | ||
|
||
summary_callback() # print the timer summary |
59 changes: 59 additions & 0 deletions
59
examples/structured_2d_dgsem/elixir_shallowwater_source_terms.jl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
|
||
using OrdinaryDiffEq | ||
using Trixi | ||
using TrixiShallowWater | ||
|
||
############################################################################### | ||
# semidiscretization of the shallow water equations | ||
|
||
equations = ShallowWaterEquationsWetDry2D(gravity_constant = 9.81) | ||
|
||
initial_condition = initial_condition_convergence_test | ||
|
||
volume_flux = (flux_wintermeyer_etal, flux_nonconservative_wintermeyer_etal) | ||
solver = DGSEM(polydeg = 3, | ||
surface_flux = (flux_lax_friedrichs, flux_nonconservative_fjordholm_etal), | ||
volume_integral = VolumeIntegralFluxDifferencing(volume_flux)) | ||
|
||
coordinates_min = (0.0, 0.0) | ||
coordinates_max = (sqrt(2.0), sqrt(2.0)) | ||
|
||
cells_per_dimension = (8, 8) | ||
|
||
mesh = StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max) | ||
|
||
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver, | ||
source_terms = source_terms_convergence_test) | ||
|
||
############################################################################### | ||
# ODE solvers, callbacks etc. | ||
|
||
tspan = (0.0, 1.0) | ||
ode = semidiscretize(semi, tspan) | ||
|
||
summary_callback = SummaryCallback() | ||
|
||
analysis_interval = 100 | ||
analysis_callback = AnalysisCallback(semi, interval = analysis_interval) | ||
|
||
alive_callback = AliveCallback(analysis_interval = analysis_interval) | ||
|
||
save_solution = SaveSolutionCallback(interval = 100, | ||
save_initial_solution = true, | ||
save_final_solution = true, | ||
solution_variables = cons2prim) | ||
|
||
stepsize_callback = StepsizeCallback(cfl = 2.0) | ||
|
||
callbacks = CallbackSet(summary_callback, | ||
analysis_callback, alive_callback, | ||
save_solution, | ||
stepsize_callback) | ||
|
||
############################################################################### | ||
# run the simulation | ||
|
||
sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false), | ||
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback | ||
save_everystep = false, callback = callbacks); | ||
summary_callback() # print the timer summary |
Oops, something went wrong.