Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Time integrator in the paired explicit Runge Kutta scheme: Perk p3 single ext #35

Closed
wants to merge 96 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
da330cc
make NLsolve a weapdep
warisa-r May 25, 2024
a6789b3
fmt
warisa-r May 25, 2024
bcd4091
add NEWS.md but TBD on the ref pull request
warisa-r May 25, 2024
fd3d4ca
add comments and adjustment on solve_a_unknown
warisa-r May 25, 2024
c280292
modular implementation with init, step!, and solve_step!
warisa-r May 25, 2024
3ddf5c4
fmt
warisa-r May 25, 2024
b9b4243
add test
warisa-r May 26, 2024
a727a87
adda body of p3 constructor test
warisa-r May 28, 2024
cb98a3f
changes according to test and correct variable names
warisa-r May 29, 2024
d84daed
only check the values of a_matrix from second row to end
warisa-r May 31, 2024
1332c28
adjust the the constructor of path coefficient and its test
warisa-r May 31, 2024
777f28c
Merge branch 'DanielDoehring:main' into PERK_p3_single_ext
warisa-r Jun 3, 2024
7bf717a
adjust the test and add a seed to the randomized initial guess for re…
warisa-r Jun 4, 2024
05853cf
Merge branch 'PERK_p3_single_ext' of https://github.com/warisa-r/Trix…
warisa-r Jun 4, 2024
43cf02d
add NLsolve as a dependency for testing
warisa-r Jun 4, 2024
9ed5e2b
Update ext/TrixiNLsolveExt.jl
warisa-r Jun 6, 2024
a739350
Update ext/TrixiNLsolveExt.jl
warisa-r Jun 6, 2024
cf71784
Update ext/TrixiNLsolveExt.jl
warisa-r Jun 6, 2024
01a4343
Update ext/TrixiNLsolveExt.jl
warisa-r Jun 6, 2024
0deb7bc
Update ext/TrixiNLsolveExt.jl
warisa-r Jun 6, 2024
0708bc4
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 6, 2024
0a5ad48
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 6, 2024
0a3ab55
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 6, 2024
8c978e2
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 6, 2024
45324a2
optimize the loop for step! by moving the condition outside
warisa-r Jun 10, 2024
ca5951a
fmt
warisa-r Jun 10, 2024
76a7a6b
more type generic
warisa-r Jun 10, 2024
03fad1b
change some names
warisa-r Jun 10, 2024
78ae8da
update test
warisa-r Jun 10, 2024
c5c455f
Correcting steps!
warisa-r Jun 10, 2024
1bfb576
Apply suggestions from code review
warisa-r Jun 10, 2024
86a4daa
Update examples/structured_1d_dgsem/elixir_burgers_perk3.jl
warisa-r Jun 10, 2024
786de99
Update examples/structured_1d_dgsem/elixir_burgers_perk3.jl
warisa-r Jun 10, 2024
a3d6df5
add docstring about dt_opt
warisa-r Jun 10, 2024
f84d171
Merge branch 'main' into PERK_p3_single_ext
DanielDoehring Jun 11, 2024
4e35589
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 11, 2024
a4b3df6
merge k_higher in the last stage to a bigger loop
warisa-r Jun 12, 2024
6a03a3a
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 12, 2024
b5f227a
change solve_step! to solve!
warisa-r Jun 14, 2024
d029c21
Correct the logic of step!
warisa-r Jun 17, 2024
ff5c590
deprecation
DanielDoehring Jun 18, 2024
df7ec64
Optimize K_S1 away
DanielDoehring Jun 18, 2024
b9977c0
fmt
DanielDoehring Jun 18, 2024
34d0eb5
remove dt_opt as an attribute of PERK3
warisa-r Jun 20, 2024
13ac6dc
change the objective function to match the number of equations
warisa-r Jun 24, 2024
516e95f
fmt
warisa-r Jun 24, 2024
fdba17d
minor comment fix
warisa-r Jun 24, 2024
b78f39a
delete some stuff left from random
warisa-r Jun 24, 2024
000f117
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jun 25, 2024
3289faf
minor adjustments
warisa-r Jun 25, 2024
d73c377
minor change to the comment
warisa-r Jun 25, 2024
b22476e
add proper comment and bring seed back
warisa-r Jun 25, 2024
2ec41fa
update test values
warisa-r Jun 25, 2024
03fb32f
fmt
warisa-r Jun 25, 2024
cda3c84
change the keyword according to the error in the test pipeline and ed…
warisa-r Jun 25, 2024
84f6a6d
remove unused import
warisa-r Jun 25, 2024
144bfa1
fix test values in misc
warisa-r Jun 25, 2024
6e53ad2
add max iteration
warisa-r Jun 26, 2024
a34d412
Update ext/TrixiNLsolveExt.jl
warisa-r Jun 26, 2024
a65cdb8
Apply suggestions from code review
DanielDoehring Jul 5, 2024
6d2fc6d
remove the allocating part of is_sol_valid
warisa-r Jul 5, 2024
cd22981
Merge branch 'PERK_p3_single_ext' of https://github.com/warisa-r/Trix…
warisa-r Jul 5, 2024
e95fe97
removing dt_opt and update test values
warisa-r Jul 5, 2024
c61187c
Update NEWS.md
warisa-r Jul 5, 2024
2fc3085
update cfl number for the simulation
warisa-r Jul 5, 2024
ac055ab
Merge branch 'PERK_p3_single_ext' of https://github.com/warisa-r/Trix…
warisa-r Jul 5, 2024
bd55f1d
Update examples/structured_1d_dgsem/elixir_burgers_perk3.jl
warisa-r Jul 5, 2024
8d08b87
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jul 5, 2024
c5c00bc
Update src/time_integration/paired_explicit_runge_kutta/methods_PERK3.jl
warisa-r Jul 5, 2024
6fa8647
change from a_stages_stages.txt to a_stages.txt
warisa-r Jul 5, 2024
532f483
Merge branch 'PERK_p3_single_ext' of https://github.com/warisa-r/Trix…
warisa-r Jul 5, 2024
88c92e2
fixed step size should work with save solution now
warisa-r Jul 8, 2024
71f2841
Update examples/structured_1d_dgsem/elixir_burgers_perk3.jl
warisa-r Jul 9, 2024
739b54b
add save solution to the example
warisa-r Jul 9, 2024
995107b
update test to be compatible with save_solution
warisa-r Jul 9, 2024
640c7f6
move comment regarding seed upwards
warisa-r Jul 9, 2024
e923305
Revert "Correct the logic of step!" only the part that meddles with m…
warisa-r Jul 9, 2024
f3f4e25
correct methods_PERK3
warisa-r Jul 9, 2024
a6addd7
move is_sol_valid closer to the for loop
warisa-r Jul 9, 2024
87c6cae
fmt
warisa-r Jul 9, 2024
0d642fb
Revert some random changes in other test unit
warisa-r Jul 9, 2024
d602a95
add tolerance to the test
warisa-r Jul 9, 2024
2669e76
Merge branch 'main' into PERK_p3_single_ext
warisa-r Jul 9, 2024
bc358e4
modify functions so that they are also compatible with PERK3
warisa-r Jul 9, 2024
10d7126
change function's name to be more descriptive
warisa-r Jul 9, 2024
75de088
change function's name to be more descriptive in all files
warisa-r Jul 9, 2024
58fabb7
Revert irrelevent change in TrixiConvexECOSExt.jl
warisa-r Jul 9, 2024
40dd610
add PR number to NEWS.md
warisa-r Jul 9, 2024
c104ff2
fmt
warisa-r Jul 9, 2024
76487b5
change from using Random to StableRNGs
warisa-r Jul 9, 2024
ecbb0ff
fix the value in unit test
warisa-r Jul 9, 2024
bcadd5a
remove prints
warisa-r Jul 9, 2024
47e52d0
minor comment correction
warisa-r Jul 10, 2024
9826457
attempt to fix the error at fixed time step
warisa-r Jul 10, 2024
d66b241
add the missing clause to test set
warisa-r Jul 10, 2024
d405551
adjust allocation values in test of perk3
warisa-r Jul 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ for human readability.
- New time integrator `PairedExplicitRK2`, implementing the second-order paired explicit Runge-Kutta
method with [Convex.jl](https://github.com/jump-dev/Convex.jl) and [ECOS.jl](https://github.com/jump-dev/ECOS.jl) ([#1908])
- Add subcell limiting support for `StructuredMesh` ([#1946]).
- New time integrator `PairedExplicitRK3`, implementing the third-order paired explicit Runge-Kutta
method with [Convex.jl](https://github.com/jump-dev/Convex.jl), [ECOS.jl](https://github.com/jump-dev/ECOS.jl),
and [NLsolve.jl](https://github.com/JuliaNLSolvers/NLsolve.jl) ([#2008])

## Changes when updating to v0.7 from v0.6.x

Expand Down
12 changes: 9 additions & 3 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ Requires = "ae029012-a4dd-5104-9daa-d747884805df"
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
SimpleUnPack = "ce78b400-467f-4804-87d8-8f486da07d0a"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
StartUpDG = "472ebc20-7c99-4d4b-9470-8fde4e9faa0f"
Static = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
StaticArrayInterface = "0d7ed370-da01-4f52-bd93-41d350b8b718"
Expand All @@ -50,13 +51,15 @@ TrixiBase = "9a0f1c46-06d5-4909-a5a3-ce25d3fa3284"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[weakdeps]
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
Convex = "f65535da-76fb-5f13-bab9-19810c17039a"
ECOS = "e2685f51-7e38-5353-a97d-a921fd2c8199"
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"

[extensions]
TrixiMakieExt = "Makie"
TrixiConvexECOSExt = ["Convex", "ECOS"]
TrixiMakieExt = "Makie"
TrixiNLsolveExt = "NLsolve"

[compat]
CodeTracking = "1.0.5"
Expand All @@ -79,6 +82,7 @@ LoopVectorization = "0.12.151"
MPI = "0.20"
Makie = "0.19, 0.20"
MuladdMacro = "0.2.2"
NLsolve = "4.5.1"
Octavian = "0.3.21"
OffsetArrays = "1.12"
P4est = "0.4.9"
Expand All @@ -92,6 +96,7 @@ Requires = "1.1"
SciMLBase = "1.90, 2"
SimpleUnPack = "1.1"
SparseArrays = "1"
StableRNGs = "1.0.2"
StartUpDG = "0.17.7"
Static = "0.8.7"
StaticArrayInterface = "1.4"
Expand All @@ -109,6 +114,7 @@ UUIDs = "1.6"
julia = "1.8"

[extras]
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
Convex = "f65535da-76fb-5f13-bab9-19810c17039a"
ECOS = "e2685f51-7e38-5353-a97d-a921fd2c8199"
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
60 changes: 60 additions & 0 deletions examples/structured_1d_dgsem/elixir_burgers_perk3.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using Convex, ECOS
using NLsolve
using OrdinaryDiffEq
using Trixi

###############################################################################
# semidiscretization of the (inviscid) Burgers equation

equations = InviscidBurgersEquation1D()

initial_condition = initial_condition_convergence_test

# Create DG solver with polynomial degree = 4 and (local) Lax-Friedrichs/Rusanov flux as surface flux
solver = DGSEM(polydeg = 4, surface_flux = flux_lax_friedrichs)

coordinates_min = (0.0,) # minimum coordinate
coordinates_max = (1.0,) # maximum coordinate
cells_per_dimension = (64,)

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, 2.0)
ode = semidiscretize(semi, tspan)

summary_callback = SummaryCallback()

analysis_interval = 200
analysis_callback = AnalysisCallback(semi, interval = analysis_interval)

alive_callback = AliveCallback(analysis_interval = analysis_interval)

save_solution = SaveSolutionCallback(dt = 0.1,
save_initial_solution = true,
save_final_solution = true,
solution_variables = cons2prim)

stepsize_callback = StepsizeCallback(cfl = 3.7)

callbacks = CallbackSet(summary_callback,
analysis_callback, alive_callback, save_solution,
stepsize_callback)

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

# Optimize 8-stage, third order P-ERK scheme for this semidiscretization
ode_algorithm = Trixi.PairedExplicitRK3(8, tspan, semi)
warisa-r marked this conversation as resolved.
Show resolved Hide resolved

sol = Trixi.solve(ode, ode_algorithm,
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
save_everystep = false, callback = callbacks);

# Print the timer summary
summary_callback()
80 changes: 80 additions & 0 deletions ext/TrixiNLsolveExt.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Package extension for adding NLsolve-based features to Trixi.jl
module TrixiNLsolveExt

# Required for coefficient optimization in P-ERK scheme integrators
if isdefined(Base, :get_extension)
using NLsolve: nlsolve
else
# Until Julia v1.9 is the minimum required version for Trixi.jl, we still support Requires.jl
using ..NLsolve: nlsolve
end

# We use a random initialization of the nonlinear solver.
# To make the tests reproducible, we need to seed the RNG
using StableRNGs: StableRNG, rand

# Use functions that are to be extended and additional symbols that are not exported
using Trixi: Trixi, PairedExplicitRK3_butcher_tableau_objective_function,
solve_a_butcher_coeffs_unknown!, @muladd

# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).
# Since these FMAs can increase the performance of many numerical algorithms,
# we need to opt-in explicitly.
# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.
@muladd begin
#! format: noindent

# Find the values of the a_{i, i-1} in the Butcher tableau matrix A by solving a system of
# non-linear equations that arise from the relation of the stability polynomial to the Butcher tableau.
# For details, see Proposition 3.2, Equation (3.3) from
# Hairer, Wanner: Solving Ordinary Differential Equations 2
function Trixi.solve_a_butcher_coeffs_unknown!(a_unknown, num_stages, monomial_coeffs,
c_s2, c;
verbose, max_iter = 100000)

# Define the objective_function
function objective_function(x)
return Trixi.PairedExplicitRK3_butcher_tableau_objective_function(x, num_stages,
num_stages,
monomial_coeffs,
c_s2)
end

# To ensure consistency and reproducibility of results across runs, we use
# a seeded random initial guess.
rng = StableRNG(555)

is_sol_valid = false

for _ in 1:max_iter
# Due to the nature of the nonlinear solver, different initial guesses can lead to
# small numerical differences in the solution.

x0 = 0.1 .* rand(rng, num_stages - 2)

sol = nlsolve(objective_function, x0, method = :trust_region,
ftol = 4e-16, # Enforce objective up to machine precision
iterations = 10^4, xtol = 1e-13)

a_unknown = sol.zero

# Check if the values a[i, i-1] >= 0.0 (which stem from the nonlinear solver)
# and also c[i] - a[i, i-1] >= 0.0 since all coefficients should be non-negative
is_sol_valid = all(x -> !isnan(x) && x >= 0, a_unknown) &&
all(!isnan(c[i] - a_unknown[i - 2]) &&
c[i] - a_unknown[i - 2] >= 0 for i in eachindex(c) if i > 2)

if is_sol_valid
return a_unknown
else
if verbose
println("Solution invalid. Restart the process of solving non-linear system of equations again.")
end
end
end

error("Maximum number of iterations ($max_iter) reached. Cannot find valid sets of coefficients.")
end
end # @muladd

end # module TrixiNLsolveExt
6 changes: 6 additions & 0 deletions src/Trixi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,12 @@ function __init__()
end
end

@static if !isdefined(Base, :get_extension)
@require NLsolve="2774e3e8-f4cf-5e23-947b-6d7e65073b56" begin
include("../ext/TrixiNLsolveExt.jl")
end
end

# FIXME upstream. This is a hacky workaround for
# https://github.com/trixi-framework/Trixi.jl/issues/628
# https://github.com/trixi-framework/Trixi.jl/issues/1185
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,11 @@ mutable struct PairedExplicitRK2Integrator{RealT <: Real, uType, Params, Sol, F,
end

"""
add_tstop!(integrator::PairedExplicitRK2Integrator, t)
add_tstop!(integrator::AbstractPairedExplicitRKSingleIntegrator, t)
Add a time stop during the time integration process.
This function is called after the periodic SaveSolutionCallback to specify the next stop to save the solution.
"""
function add_tstop!(integrator::PairedExplicitRK2Integrator, t)
function add_tstop!(integrator::AbstractPairedExplicitRKSingleIntegrator, t)
integrator.tdir * (t - integrator.t) < zero(integrator.t) &&
error("Tried to add a tstop that is behind the current time. This is strictly forbidden")
# We need to remove the first entry of tstops when a new entry is added.
Expand All @@ -248,8 +248,8 @@ function add_tstop!(integrator::PairedExplicitRK2Integrator, t)
push!(integrator.opts.tstops, integrator.tdir * t)
end

has_tstop(integrator::PairedExplicitRK2Integrator) = !isempty(integrator.opts.tstops)
first_tstop(integrator::PairedExplicitRK2Integrator) = first(integrator.opts.tstops)
has_tstop(integrator::AbstractPairedExplicitRKSingleIntegrator) = !isempty(integrator.opts.tstops)
first_tstop(integrator::AbstractPairedExplicitRKSingleIntegrator) = first(integrator.opts.tstops)

# Forward integrator.stats.naccept to integrator.iter (see GitHub PR#771)
function Base.getproperty(integrator::PairedExplicitRK, field::Symbol)
Expand Down
Loading
Loading