From cd7974a3faa662305b2fb24ba37f642ed8372ca8 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Mon, 3 Mar 2025 16:47:08 +0100 Subject: [PATCH 01/21] Add Trixi example --- docs/make.jl | 1 + examples/LocalPreferences.toml | 3 ++ examples/Project.toml | 6 ++- examples/implicit.jl | 2 - examples/trixi.jl | 91 ++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 examples/LocalPreferences.toml create mode 100644 examples/trixi.jl diff --git a/docs/make.jl b/docs/make.jl index 330e9de..75f1657 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -49,6 +49,7 @@ examples = [ "Implicit -- Heat 1D" => "heat_1D", "Implicit -- Heat 1D DG" => "heat_1D_DG", "Implicit -- Heat 2D" => "heat_2D", + "Trixi" => "trixi", ] for (_, name) in examples diff --git a/examples/LocalPreferences.toml b/examples/LocalPreferences.toml new file mode 100644 index 0000000..11d9f7e --- /dev/null +++ b/examples/LocalPreferences.toml @@ -0,0 +1,3 @@ +[Trixi] +loop_vectorization = false +polyester = false diff --git a/examples/Project.toml b/examples/Project.toml index 675a3da..4255e5c 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -1,6 +1,6 @@ [deps] CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" @@ -11,6 +11,10 @@ Observables = "510215fc-4207-5dde-b226-833fc4488ee2" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" +Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" [sources] Ariadne = {path = ".."} + +[compat] +julia = "1.10" diff --git a/examples/implicit.jl b/examples/implicit.jl index c0e84a1..46cbdae 100644 --- a/examples/implicit.jl +++ b/examples/implicit.jl @@ -1,8 +1,6 @@ # # [Implicit schemes](@id implicit_schemes) using Ariadne -using Ariadne - # ## Implicit Euler function G_Euler!(res, uₙ, Δt, f!, du, u, p, t) diff --git a/examples/trixi.jl b/examples/trixi.jl new file mode 100644 index 0000000..00eaffc --- /dev/null +++ b/examples/trixi.jl @@ -0,0 +1,91 @@ +using Trixi + +# Example based on https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_1d_dgsem/elixir_advection_extended.jl + +############################################################################### +# semidiscretization of the linear advection diffusion equation + +advection_velocity = 0.1 +equations = LinearScalarAdvectionEquation1D(advection_velocity) +diffusivity() = 0.1 +equations_parabolic = LaplaceDiffusion1D(diffusivity(), equations) + +# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux +solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) + +coordinates_min = -convert(Float64, pi) # minimum coordinate +coordinates_max = convert(Float64, pi) # maximum coordinate + +# Create a uniformly refined mesh with periodic boundaries +mesh = TreeMesh( + coordinates_min, coordinates_max, + initial_refinement_level = 4, + n_cells_max = 30_000, # set maximum capacity of tree data structure + periodicity = true +) + +function x_trans_periodic( + x, domain_length = SVector(oftype(x[1], 2 * pi)), + center = SVector(oftype(x[1], 0)) + ) + x_normalized = x .- center + x_shifted = x_normalized .% domain_length + x_offset = ( + (x_shifted .< -0.5f0 * domain_length) - + (x_shifted .> 0.5f0 * domain_length) + ) .* + domain_length + return center + x_shifted + x_offset +end + +# Define initial condition +function initial_condition_diffusive_convergence_test( + x, t, + equation::LinearScalarAdvectionEquation1D + ) + # Store translated coordinate for easy use of exact solution + x_trans = x_trans_periodic(x - equation.advection_velocity * t) + + nu = diffusivity() + c = 0 + A = 1 + omega = 1 + scalar = c + A * sin(omega * sum(x_trans)) * exp(-nu * omega^2 * t) + return SVector(scalar) +end +initial_condition = initial_condition_diffusive_convergence_test + +# define periodic boundary conditions everywhere +boundary_conditions = boundary_condition_periodic +boundary_conditions_parabolic = boundary_condition_periodic + +# A semidiscretization collects data structures and functions for the spatial discretization +semi = SemidiscretizationHyperbolicParabolic( + mesh, (equations, equations_parabolic), + initial_condition, + solver; + boundary_conditions = ( + boundary_conditions, + boundary_conditions_parabolic, + ) +) + +############################################################################### +# ODE solvers, callbacks etc. + +# Create ODE problem with time span from 0.0 to 1.0 +tspan = (0.0, 1.0) +ode = semidiscretize(semi, tspan) + +using NewtonKrylov + +include(joinpath(dirname(pathof(NewtonKrylov)), "..", "examples", "implicit.jl")) + +# ## Jacobian +J = jacobian(G_Euler!, ode.f, ode.u0, ode.p, 0.1, first(ode.tspan)) + +# ## Solve with fixed timestep + +Δt = 0.01 +ts = first(ode.tspan):Δt:last(ode.tspan) +solve(G_Euler!, ode.f, ode.u0, ode.p, Δt, ts; verbose = 1, krylov_kwargs = (; verbose = 1)) From e5016aa877a65225ee2e0e142072d7b0d8352614 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Mon, 19 May 2025 15:38:43 +0200 Subject: [PATCH 02/21] implement ODE interface --- docs/LocalPreferences.toml | 3 + docs/Project.toml | 5 + examples/Project.toml | 5 + examples/spring.jl | 6 +- examples/trixi.jl | 239 ++++++++++++------- libs/Implicit/Project.toml | 19 ++ libs/Implicit/src/Implicit.jl | 426 ++++++++++++++++++++++++++++++++++ 7 files changed, 608 insertions(+), 95 deletions(-) create mode 100644 docs/LocalPreferences.toml create mode 100644 libs/Implicit/Project.toml create mode 100644 libs/Implicit/src/Implicit.jl diff --git a/docs/LocalPreferences.toml b/docs/LocalPreferences.toml new file mode 100644 index 0000000..11d9f7e --- /dev/null +++ b/docs/LocalPreferences.toml @@ -0,0 +1,3 @@ +[Trixi] +loop_vectorization = false +polyester = false diff --git a/docs/Project.toml b/docs/Project.toml index 36e9b22..979195f 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -2,6 +2,7 @@ CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" DocumenterCitations = "daee34ce-89f3-4625-b898-19384cb65244" +Implicit = "7f538e44-2768-4ef2-af90-2110c0378286" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" KrylovPreconditioners = "45d422c2-293f-44ce-8315-2cb988662dec" @@ -9,9 +10,13 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" Ariadne = "0be81120-40bf-4f8b-adf0-26103efb66f1" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d" +OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" PlutoStaticHTML = "359b1769-a58e-495b-9770-312e911026ad" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" +Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" [sources] Ariadne = {path = ".."} +Implicit = {path = "../libs/Implicit"} diff --git a/examples/Project.toml b/examples/Project.toml index 4255e5c..c742272 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -2,6 +2,7 @@ CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" +Implicit = "7f538e44-2768-4ef2-af90-2110c0378286" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" KrylovPreconditioners = "45d422c2-293f-44ce-8315-2cb988662dec" @@ -9,12 +10,16 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Ariadne = "0be81120-40bf-4f8b-adf0-26103efb66f1" Observables = "510215fc-4207-5dde-b226-833fc4488ee2" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d" +OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" [sources] Ariadne = {path = ".."} +Implicit = {path = "../libs/Implicit"} +Trixi = {rev = "vc/turbo", url = "https://github.com/trixi-framework/Trixi.jl"} [compat] julia = "1.10" diff --git a/examples/spring.jl b/examples/spring.jl index eb5a6ba..5519f39 100644 --- a/examples/spring.jl +++ b/examples/spring.jl @@ -1,13 +1,9 @@ # # Implicit time-integration (Spring example) # ## Necessary packages -using Ariadne +using Implicit using CairoMakie -# Include the implicit time-steppers from [`Implicit schemes`](@ref implicit_schemes) - -include(joinpath(dirname(pathof(Ariadne)), "..", "examples", "implicit.jl")) - # ## Spring equations function f!(du, u, (γ,), t) diff --git a/examples/trixi.jl b/examples/trixi.jl index 00eaffc..c86a717 100644 --- a/examples/trixi.jl +++ b/examples/trixi.jl @@ -1,91 +1,150 @@ -using Trixi +# # Using the NewtonKrylov.jl based implicit solver with Trixi.jl -# Example based on https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_1d_dgsem/elixir_advection_extended.jl - -############################################################################### -# semidiscretization of the linear advection diffusion equation - -advection_velocity = 0.1 -equations = LinearScalarAdvectionEquation1D(advection_velocity) -diffusivity() = 0.1 -equations_parabolic = LaplaceDiffusion1D(diffusivity(), equations) - -# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux -solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) - -coordinates_min = -convert(Float64, pi) # minimum coordinate -coordinates_max = convert(Float64, pi) # maximum coordinate - -# Create a uniformly refined mesh with periodic boundaries -mesh = TreeMesh( - coordinates_min, coordinates_max, - initial_refinement_level = 4, - n_cells_max = 30_000, # set maximum capacity of tree data structure - periodicity = true -) - -function x_trans_periodic( - x, domain_length = SVector(oftype(x[1], 2 * pi)), - center = SVector(oftype(x[1], 0)) - ) - x_normalized = x .- center - x_shifted = x_normalized .% domain_length - x_offset = ( - (x_shifted .< -0.5f0 * domain_length) - - (x_shifted .> 0.5f0 * domain_length) - ) .* - domain_length - return center + x_shifted + x_offset -end - -# Define initial condition -function initial_condition_diffusive_convergence_test( - x, t, - equation::LinearScalarAdvectionEquation1D - ) - # Store translated coordinate for easy use of exact solution - x_trans = x_trans_periodic(x - equation.advection_velocity * t) - - nu = diffusivity() - c = 0 - A = 1 - omega = 1 - scalar = c + A * sin(omega * sum(x_trans)) * exp(-nu * omega^2 * t) - return SVector(scalar) -end -initial_condition = initial_condition_diffusive_convergence_test - -# define periodic boundary conditions everywhere -boundary_conditions = boundary_condition_periodic -boundary_conditions_parabolic = boundary_condition_periodic - -# A semidiscretization collects data structures and functions for the spatial discretization -semi = SemidiscretizationHyperbolicParabolic( - mesh, (equations, equations_parabolic), - initial_condition, - solver; - boundary_conditions = ( - boundary_conditions, - boundary_conditions_parabolic, - ) -) - -############################################################################### -# ODE solvers, callbacks etc. - -# Create ODE problem with time span from 0.0 to 1.0 -tspan = (0.0, 1.0) -ode = semidiscretize(semi, tspan) - -using NewtonKrylov - -include(joinpath(dirname(pathof(NewtonKrylov)), "..", "examples", "implicit.jl")) - -# ## Jacobian -J = jacobian(G_Euler!, ode.f, ode.u0, ode.p, 0.1, first(ode.tspan)) - -# ## Solve with fixed timestep - -Δt = 0.01 -ts = first(ode.tspan):Δt:last(ode.tspan) -solve(G_Euler!, ode.f, ode.u0, ode.p, Δt, ts; verbose = 1, krylov_kwargs = (; verbose = 1)) +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +# ## Load Trixi Example +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), sol = nothing); +# trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl")); + +ref = copy(sol) + +u = copy(ode.u0) +du = zero(ode.u0) +res = zero(ode.u0) + +F! = Implicit.nonlinear_problem(Implicit.ImplicitEuler(), ode.f) +J = Implicit.NewtonKrylov.JacobianOperator(F!, res, u, (ode.u0, 1.0, du, ode.p, 0.0, (), 1)) + +collect(J) + +using LinearAlgebra +out = zero(u) +v = zero(u) +@time mul!(u, J, v) +@time F!(res, u, (ode.u0, 1.0, du, ode.p, 0.0, (), 1)) + +F! = Implicit.nonlinear_problem(Implicit.SDIRK2(), ode.f) +u1 = copy(ode.u0) +u2 = copy(u1) +J1 = Implicit.NewtonKrylov.JacobianOperator(F!, res, u1, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 1)) +J2 = Implicit.NewtonKrylov.JacobianOperator(F!, res, u2, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 2)) + +using LinearAlgebra +out = zero(u) +v = zero(u) +@time F!(res, u, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 1)) +@time mul!(u, J1, v) + +collect(J1) +collect(J2) + +# Cost of time(Jvp) ≈ 2 * time(rhs) + +# ### Jacobian (of the implicit function given the ode) +J = Implicit.jacobian(Implicit.ImplicitEuler(), ode, 1.0) + +# ### Solve using ODE interface + +sol = solve( + ode, Implicit.ImplicitEuler(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, + # krylov_kwargs=(;verbose=1) +); + +sol = solve( + ode, Implicit.ImplicitMidpoint(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, + # krylov_kwargs=(;verbose=1) +); + +sol = solve( + ode, Implicit.ImplicitTrapezoid(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, + # krylov_kwargs=(;verbose=1) +); + + +sol = solve( + ode, Implicit.TRBDF2(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, + # krylov_kwargs=(;verbose=1) +); + +sol = solve( + ode, Implicit.ESDIRK2(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, + # krylov_kwargs=(;verbose=1) +); + + +# sol = solve( +# ode, Implicit.SDIRK2(); +# dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback +# ode_default_options()..., callback = callbacks, +# # verbose=1, +# krylov_algo = :gmres, +# # krylov_kwargs=(;verbose=1) +# ); + +# ### Plot the (reference) solution + +# We have to manually convert the sol since Implicit has it's own leightweight solution type. +# Create an extension. +## pd = PlotData2D(sol.u[end], sol.prob.p) + +plot(Trixi.PlotData2DTriangulated(ref.u[1], ref.prob.p)) + +# ### Plot the solution + +plot(Trixi.PlotData2DTriangulated(sol.u[end], sol.prob.p)) + +# ## Increase CFL numbers + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), cfl = 10, sol = nothing); + +sol = solve( + ode, Implicit.ImplicitEuler(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, + # krylov_kwargs=(;verbose=1) +); + +@show callbacks.discrete_callbacks[4] + +# ### Plot the solution + +plot(Trixi.PlotData2DTriangulated(sol.u[end], sol.prob.p)) diff --git a/libs/Implicit/Project.toml b/libs/Implicit/Project.toml new file mode 100644 index 0000000..198c4c5 --- /dev/null +++ b/libs/Implicit/Project.toml @@ -0,0 +1,19 @@ +name = "Implicit" +uuid = "7f538e44-2768-4ef2-af90-2110c0378286" +authors = ["Valentin Churavy "] +version = "0.1.0" + +[deps] +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" +NewtonKrylov = "0be81120-40bf-4f8b-adf0-26103efb66f1" +SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" + +[sources] +NewtonKrylov = {path = "../.."} + +[compat] +DiffEqBase = "6.174.0" +NewtonKrylov = "0.1.0" +SciMLBase = "2.91.0" +UnPack = "1.0.2" diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl new file mode 100644 index 0000000..0949aa9 --- /dev/null +++ b/libs/Implicit/src/Implicit.jl @@ -0,0 +1,426 @@ +module Implicit + +using UnPack +import NewtonKrylov + +# Wrapper type for solutions from Implicit.jl's own time integrators, partially mimicking +# SciMLBase.ODESolution +struct TimeIntegratorSolution{tType, uType, P} + t::tType + u::uType + prob::P +end + +# Abstract supertype of Implict.jl's own time integrators for dispatch +abstract type AbstractTimeIntegrator end + +import DiffEqBase + +import DiffEqBase: solve, CallbackSet, ODEProblem +export solve, ODEProblem + +# Interface required by DiffEqCallbacks.jl +function DiffEqBase.get_tstops(integrator::AbstractTimeIntegrator) + return integrator.opts.tstops +end +function DiffEqBase.get_tstops_array(integrator::AbstractTimeIntegrator) + return get_tstops(integrator).valtree +end +function DiffEqBase.get_tstops_max(integrator::AbstractTimeIntegrator) + return maximum(get_tstops_array(integrator)) +end + +function finalize_callbacks(integrator::AbstractTimeIntegrator) + callbacks = integrator.opts.callback + + return if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + cb.finalize(cb, integrator.u, integrator.t, integrator) + end + foreach(callbacks.continuous_callbacks) do cb + cb.finalize(cb, integrator.u, integrator.t, integrator) + end + end +end + +import SciMLBase: get_du, get_tmp_cache, u_modified!, + init, step!, check_error, + get_proposed_dt, set_proposed_dt!, + terminate!, remake, add_tstop!, has_tstop, first_tstop + + +# Abstract base type for time integration schemes +abstract type SimpleImplicitAlgorithm{N} end + +stages(::SimpleImplicitAlgorithm{N}) where {N} = N + +""" +``` +1 | 1 +--|-- + | 1 +``` +""" +struct ImplicitEuler <: SimpleImplicitAlgorithm{1} end +function (::ImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) + f!(du, u, p, t) # t = t0 + c_1 * Δt + + res .= uₙ .+ Δt .* du .- u # Δt * a_11 + return nothing +end + +""" +``` +1/2 | 1/2 +----|---- + | 1 +``` +""" +struct ImplicitMidpoint <: SimpleImplicitAlgorithm{1} end +function (::ImplicitMidpoint)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) + ## Use res for a temporary allocation (uₙ .+ u) ./ 2 + uuₙ = res + uuₙ .= 0.5 .* (uₙ .+ u) + f!(du, uuₙ, p, t + 0.5 * Δt) + + res .= uₙ .+ Δt .* du .- u + return nothing +end + +""" +``` +0 | 0 0 +1 | 1/2 1/2 +--|-------- + | 1/2 1/2 +``` +""" +struct ImplicitTrapezoid <: SimpleImplicitAlgorithm{1} end +function (::ImplicitTrapezoid)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) + ## Use res as the temporary + duₙ = res + f!(duₙ, uₙ, p, t) + f!(du, u, p, t + Δt) + + res .= uₙ .+ (Δt / 2) .* (duₙ .+ du) .- u + return nothing +end + +struct TRBDF2 <: SimpleImplicitAlgorithm{2} end +function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) + γ = 2 - √2 + return if stage == 1 + # Stage 1: Trapezoidal to t + γΔt + duₙ = res + f!(duₙ, uₙ, p, t) + f!(du, u, p, t + γ * Δt) + + res .= uₙ .+ (γ * Δt / 2) .* (duₙ .+ du) .- u + else + u₁ = stages[1] + f!(du, u, p, t + Δt) + + # BDF2 coefficients + c₁ = 1 / γ^2 + c₂ = -(1 - γ)^2 / γ^2 + c₃ = (1 - γ)^2 * Δt / (γ * (2 - γ)) + + res .= c₁ .* u₁ .+ c₂ .* uₙ .+ c₃ .* du .- u + end +end + +# struct ESDIRK2 <: SimpleImplicitAlgorithm{2} end +# function (::ESDIRK2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) +# # Standard ESDIRK2 parameters +# γ = 1 - 1/√2 # ≈ 0.2928932188134525 +# a₂₁ = 1 - γ # ≈ 0.7071067811865476 +# # # Alternative parameter set +# # γ = (2 + √2) / 4 # ≈ 0.8535533905932738 +# # a₂₁ = (2 - √2) / 4 # ≈ 0.1464466094067262 + +# if stage == 1 +# # Stage 1: Explicit stage +# # k₁ = f(tₙ, uₙ) +# # u₁ = uₙ + γΔt * k₁ +# # This is explicit, so no nonlinear solve needed +# f!(du, uₙ, p, t) +# res .= uₙ .+ γ * Δt .* du .- u +# else +# # Stage 2: Implicit stage +# # k₂ = f(tₙ + γΔt, u₁) (from stage 1) +# # u₂ = uₙ + Δt(a₂₁ * k₁ + γ * k₂) +# # = uₙ + Δt((1-γ) * k₁ + γ * k₂) + +# u₁ = stages[1] + +# # Get k₁ = (u₁ - uₙ) / (γΔt) from the explicit stage 1 result +# k₁ = res +# k₁ .= (u₁ .- uₙ) ./ (γ * Δt) + +# # k₂ = f(tₙ + γΔt, u₂) - this is what we're solving for +# f!(du, u, p, t + γ * Δt) + +# res .= uₙ .+ Δt .* (a₂₁ .* k₁ .+ γ .* du) .- u +# end +# end + +# """ +# SDIRK2 (γ = (2-√2)/2 ≈ 0.293) +# ``` +# ``` +# γ | γ 0 +# 1-γ | 1-2γ γ +# ----|-------- +# | 1/2 1/2 +# ``` +# """ +# struct SDIRK2 <: SimpleImplicitAlgorithm{2} end + +# function (::SDIRK2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) +# γ = (2 + √2) / 4 # ≈ 0.8535533905932738 +# a₂₁ = (2 - √2) / 4 # ≈ 0.1464466094067262 + +# if stage == 1 +# # Stage 1: Implicit +# f!(du, u, p, t + γ * Δt) +# res .= uₙ .+ γ * Δt .* du .- u +# elseif stage == 2 +# # Stage 2: Implicit +# u₁ = stages[1] +# k₁ = res +# k₁ .= (u₁ .- uₙ) ./ (γ * Δt) + +# # Compute f(u₂, t + (1-γ)*Δt) +# f!(du, u, p, t + (1 - γ) * Δt) + +# res .= uₙ .+ Δt .* (a₂₁ .* k₁ .+ γ .* du) .- u +# end +# return nothing +# end + +function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} + return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) +end + + +# This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L1 +mutable struct SimpleImplicitOptions{Callback} + callback::Callback # callbacks; used in Trixi.jl + adaptive::Bool # whether the algorithm is adaptive; ignored + dtmax::Float64 # ignored + maxiters::Int # maximal number of time steps + tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored + verbose::Int + algo::Symbol + krylov_kwargs::Any +end + + +function SimpleImplicitOptions(callback, tspan; maxiters = typemax(Int), verbose = 0, krylov_algo = :gmres, krylov_kwargs = (;), kwargs...) + return SimpleImplicitOptions{typeof(callback)}( + callback, false, Inf, maxiters, + [last(tspan)], + verbose, + krylov_algo, + krylov_kwargs + ) +end + +# This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L77 +# This implements the interface components described at +# https://diffeq.sciml.ai/v6.8/basics/integrator/#Handing-Integrators-1 +# which are used in Trixi.jl. +mutable struct SimpleImplicit{ + RealT <: Real, uType, Params, Sol, F, M, Alg <: SimpleImplicitAlgorithm, + SimpleImplicitOptions, + } <: AbstractTimeIntegrator + u::uType + du::uType + u_tmp::uType + stages::NTuple{M, uType} + res::uType + t::RealT + dt::RealT # current time step + dtcache::RealT # ignored + iter::Int # current number of time steps (iteration) + p::Params # will be the semidiscretization from Trixi.jl + sol::Sol # faked + f::F # `rhs!` of the semidiscretization + alg::Alg # SimpleImplicitAlgorithm + opts::SimpleImplicitOptions + finalstep::Bool # added for convenience +end + +# Forward integrator.stats.naccept to integrator.iter (see GitHub PR#771) +function Base.getproperty(integrator::SimpleImplicit, field::Symbol) + if field === :stats + return (naccept = getfield(integrator, :iter),) + end + # general fallback + return getfield(integrator, field) +end + +function init( + ode::ODEProblem, alg::SimpleImplicitAlgorithm{N}; + dt, callback::Union{CallbackSet, Nothing} = nothing, kwargs... + ) where {N} + u = copy(ode.u0) + du = zero(u) + res = zero(u) + u_tmp = similar(u) + stages = ntuple(_ -> similar(u), Val(N - 1)) + t = first(ode.tspan) + iter = 0 + integrator = SimpleImplicit( + u, du, u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + (prob = ode,), ode.f, alg, + SimpleImplicitOptions( + callback, ode.tspan; + kwargs... + ), false + ) + + # initialize callbacks + if callback isa CallbackSet + foreach(callback.continuous_callbacks) do cb + throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) + end + foreach(callback.discrete_callbacks) do cb + cb.initialize(cb, integrator.u, integrator.t, integrator) + end + end + + return integrator +end + +# Fakes `solve`: https://diffeq.sciml.ai/v6.8/basics/overview/#Solving-the-Problems-1 +function solve( + ode::ODEProblem, alg::SimpleImplicitAlgorithm; + dt, callback = nothing, kwargs... + ) + integrator = init(ode, alg, dt = dt, callback = callback; kwargs...) + + # Start actual solve + return solve!(integrator) +end + +function solve!(integrator::SimpleImplicit) + @unpack prob = integrator.sol + + integrator.finalstep = false + + while !integrator.finalstep + step!(integrator) + end # "main loop" timer + + finalize_callbacks(integrator) + + return TimeIntegratorSolution( + (first(prob.tspan), integrator.t), + (prob.u0, integrator.u), + integrator.sol.prob + ) +end + +function step!(integrator::SimpleImplicit) + @unpack prob = integrator.sol + @unpack alg = integrator + t_end = last(prob.tspan) + callbacks = integrator.opts.callback + + @assert !integrator.finalstep + if isnan(integrator.dt) + error("time step size `dt` is NaN") + end + + # if the next iteration would push the simulation beyond the end time, set dt accordingly + if integrator.t + integrator.dt > t_end || + isapprox(integrator.t + integrator.dt, t_end) + integrator.dt = t_end - integrator.t + terminate!(integrator) + end + + # one time step + integrator.u_tmp + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = NewtonKrylov.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; + verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, + algo = integrator.opts.algo, tol_abs = 6.0e-6 + ) + @assert stats.solved + if stage < stages(alg) + integrator.stages[stage] .= integrator.u_tmp + end + end + integrator.u .= integrator.u_tmp + + integrator.iter += 1 + integrator.t += integrator.dt + + begin + # handle callbacks + if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + if cb.condition(integrator.u, integrator.t, integrator) + cb.affect!(integrator) + end + return nothing + end + end + end + + # respect maximum number of iterations + return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep + @warn "Interrupted. Larger maxiters is needed." + terminate!(integrator) + end +end + +# get a cache where the RHS can be stored +get_du(integrator::SimpleImplicit) = integrator.du +get_tmp_cache(integrator::SimpleImplicit) = (integrator.u_tmp,) + +# some algorithms from DiffEq like FSAL-ones need to be informed when a callback has modified u +u_modified!(integrator::SimpleImplicit, ::Bool) = false + +# used by adaptive timestepping algorithms in DiffEq +function set_proposed_dt!(integrator::SimpleImplicit, dt) + return integrator.dt = dt +end + +# Required e.g. for `glm_speed_callback` +function get_proposed_dt(integrator::SimpleImplicit) + return integrator.dt +end + +# stop the time integration +function terminate!(integrator::SimpleImplicit) + integrator.finalstep = true + return empty!(integrator.opts.tstops) +end + +# used for AMR +function Base.resize!(integrator::SimpleImplicit, new_size) + resize!(integrator.u, new_size) + resize!(integrator.du, new_size) + return resize!(integrator.u_tmp, new_size) +end + +### Helper +jacobian(G!, ode::ODEProblem, Δt) = jacobian(G!, ode.f, ode.u0, ode.p, Δt, first(ode.tspan)) + +function jacobian(G!, f!, uₙ, p, Δt, t) + u = copy(uₙ) + du = zero(uₙ) + res = zero(uₙ) + + F! = nonlinear_problem(G!, f!) + + J = NewtonKrylov.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) + return collect(J) +end + +end # module Implicit From 37e9f91328cd83772f66e17156c1e6e7aef019d4 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Tue, 27 May 2025 17:15:41 +0200 Subject: [PATCH 03/21] fix TR-BDF2 implementation --- docs/src/refs.bib | 47 ++++++++++ examples/Project.toml | 5 +- examples/spring.jl | 6 +- examples/trixi.jl | 30 ++---- libs/Implicit/Project.toml | 6 +- libs/Implicit/src/Implicit.jl | 172 +++++++++++++--------------------- 6 files changed, 133 insertions(+), 133 deletions(-) diff --git a/docs/src/refs.bib b/docs/src/refs.bib index 1605a8a..5abda41 100644 --- a/docs/src/refs.bib +++ b/docs/src/refs.bib @@ -51,3 +51,50 @@ @ARTICLE{Kan2022-ko urldate = {2024-10-21}, language = {en} } + +@ARTICLE{Hosea1996-xv, + title = {Analysis and implementation of {TR}-{BDF2}}, + author = {Hosea, M E and Shampine, L F}, + journaltitle = {Applied numerical mathematics: transactions of IMACS}, + publisher = {Elsevier BV}, + volume = {20}, + issue = {1-2}, + pages = {21--37}, + date = {1996-02-01}, + doi = {10.1016/0168-9274(95)00115-8}, + issn = {0168-9274,1873-5460}, + urldate = {2025-03-04}, + language = {en} +} + +@ARTICLE{Bank1985-gh, + title = {Transient simulation of silicon devices and circuits}, + author = {Bank, R E and Coughran, W M and Fichtner, W and Grosse, E H + and Rose, D J and Smith, R K}, + journaltitle = {IEEE transactions on electron devices}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + volume = {32}, + issue = {10}, + pages = {1992--2007}, + date = {1985-10}, + doi = {10.1109/t-ed.1985.22232}, + issn = {0018-9383,1557-9646}, + urldate = {2025-05-27}, + language = {en} +} + +@ARTICLE{Bonaventura2021-za, + title = {The {TR}-{BDF2} method for second order problems in structural + mechanics}, + author = {Bonaventura, Luca and Mármol, Macarena Gómez}, + journaltitle = {Computers \& mathematics with applications (Oxford, England: + 1987)}, + publisher = {Elsevier BV}, + volume = {92}, + pages = {13--26}, + date = {2021-06-15}, + doi = {10.1016/j.camwa.2021.03.037}, + issn = {0898-1221,1873-7668}, + urldate = {2025-05-27}, + language = {en} +} diff --git a/examples/Project.toml b/examples/Project.toml index c742272..f304847 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -1,16 +1,17 @@ [deps] +Ariadne = "0be81120-40bf-4f8b-adf0-26103efb66f1" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" +DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" Implicit = "7f538e44-2768-4ef2-af90-2110c0378286" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" KrylovPreconditioners = "45d422c2-293f-44ce-8315-2cb988662dec" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -Ariadne = "0be81120-40bf-4f8b-adf0-26103efb66f1" Observables = "510215fc-4207-5dde-b226-833fc4488ee2" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d" +OrdinaryDiffEqSDIRK = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" diff --git a/examples/spring.jl b/examples/spring.jl index 5519f39..eb5a6ba 100644 --- a/examples/spring.jl +++ b/examples/spring.jl @@ -1,9 +1,13 @@ # # Implicit time-integration (Spring example) # ## Necessary packages -using Implicit +using Ariadne using CairoMakie +# Include the implicit time-steppers from [`Implicit schemes`](@ref implicit_schemes) + +include(joinpath(dirname(pathof(Ariadne)), "..", "examples", "implicit.jl")) + # ## Spring equations function f!(du, u, (γ,), t) diff --git a/examples/trixi.jl b/examples/trixi.jl index c86a717..3e1f79e 100644 --- a/examples/trixi.jl +++ b/examples/trixi.jl @@ -1,4 +1,4 @@ -# # Using the NewtonKrylov.jl based implicit solver with Trixi.jl +# # Using the an implicit solver based on Ariadne with Trixi.jl using Trixi using Implicit @@ -20,8 +20,8 @@ using CairoMakie @assert !Trixi._PREFERENCE_LOOPVECTORIZATION # ## Load Trixi Example -trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), sol = nothing); -# trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl")); +# trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), sol = nothing); +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl")); ref = copy(sol) @@ -30,7 +30,7 @@ du = zero(ode.u0) res = zero(ode.u0) F! = Implicit.nonlinear_problem(Implicit.ImplicitEuler(), ode.f) -J = Implicit.NewtonKrylov.JacobianOperator(F!, res, u, (ode.u0, 1.0, du, ode.p, 0.0, (), 1)) +J = Implicit.Ariadne.JacobianOperator(F!, res, u, (ode.u0, 1.0, du, ode.p, 0.0, (), 1)) collect(J) @@ -43,8 +43,8 @@ v = zero(u) F! = Implicit.nonlinear_problem(Implicit.SDIRK2(), ode.f) u1 = copy(ode.u0) u2 = copy(u1) -J1 = Implicit.NewtonKrylov.JacobianOperator(F!, res, u1, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 1)) -J2 = Implicit.NewtonKrylov.JacobianOperator(F!, res, u2, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 2)) +J1 = Implicit.Ariadne.JacobianOperator(F!, res, u1, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 1)) +J2 = Implicit.Ariadne.JacobianOperator(F!, res, u2, (ode.u0, 1.0, du, ode.p, 0.0, (u1,), 2)) using LinearAlgebra out = zero(u) @@ -99,25 +99,15 @@ sol = solve( # krylov_kwargs=(;verbose=1) ); +import OrdinaryDiffEqSDIRK +import DifferentiationInterface: AutoFiniteDiff sol = solve( - ode, Implicit.ESDIRK2(); + ode, OrdinaryDiffEqSDIRK.TRBDF2(autodiff = AutoFiniteDiff()); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback ode_default_options()..., callback = callbacks, - # verbose=1, - krylov_algo = :gmres, - # krylov_kwargs=(;verbose=1) + adaptive = false ); - -# sol = solve( -# ode, Implicit.SDIRK2(); -# dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback -# ode_default_options()..., callback = callbacks, -# # verbose=1, -# krylov_algo = :gmres, -# # krylov_kwargs=(;verbose=1) -# ); - # ### Plot the (reference) solution # We have to manually convert the sol since Implicit has it's own leightweight solution type. diff --git a/libs/Implicit/Project.toml b/libs/Implicit/Project.toml index 198c4c5..ab7ecfd 100644 --- a/libs/Implicit/Project.toml +++ b/libs/Implicit/Project.toml @@ -5,15 +5,15 @@ version = "0.1.0" [deps] DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" -NewtonKrylov = "0be81120-40bf-4f8b-adf0-26103efb66f1" +Ariadne = "0be81120-40bf-4f8b-adf0-26103efb66f1" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" [sources] -NewtonKrylov = {path = "../.."} +Ariadne = {path = "../.."} [compat] DiffEqBase = "6.174.0" -NewtonKrylov = "0.1.0" +Ariadne = "0.1.0" SciMLBase = "2.91.0" UnPack = "1.0.2" diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 0949aa9..71d84e5 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -1,7 +1,7 @@ module Implicit using UnPack -import NewtonKrylov +import Ariadne # Wrapper type for solutions from Implicit.jl's own time integrators, partially mimicking # SciMLBase.ODESolution @@ -54,31 +54,18 @@ abstract type SimpleImplicitAlgorithm{N} end stages(::SimpleImplicitAlgorithm{N}) where {N} = N -""" -``` -1 | 1 ---|-- - | 1 -``` -""" struct ImplicitEuler <: SimpleImplicitAlgorithm{1} end function (::ImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - f!(du, u, p, t) # t = t0 + c_1 * Δt + f!(du, u, p, t + Δt) # t = t0 + c_1 * Δt res .= uₙ .+ Δt .* du .- u # Δt * a_11 return nothing end -""" -``` -1/2 | 1/2 -----|---- - | 1 -``` -""" struct ImplicitMidpoint <: SimpleImplicitAlgorithm{1} end function (::ImplicitMidpoint)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - ## Use res for a temporary allocation (uₙ .+ u) ./ 2 + # Evaluate f at midpoint: f((uₙ + u)/2, t + Δt/2) + # Use res for a temporary allocation (uₙ .+ u) ./ 2 uuₙ = res uuₙ .= 0.5 .* (uₙ .+ u) f!(du, uuₙ, p, t + 0.5 * Δt) @@ -87,17 +74,11 @@ function (::ImplicitMidpoint)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) return nothing end -""" -``` -0 | 0 0 -1 | 1/2 1/2 ---|-------- - | 1/2 1/2 -``` -""" struct ImplicitTrapezoid <: SimpleImplicitAlgorithm{1} end function (::ImplicitTrapezoid)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - ## Use res as the temporary + # Need to evaluate f at both endpoints + # f(uₙ, t) and f(u, t + Δt) + # Use res as the temporary for duₙ = f(uₙ, t) duₙ = res f!(duₙ, uₙ, p, t) f!(du, u, p, t + Δt) @@ -106,103 +87,79 @@ function (::ImplicitTrapezoid)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) return nothing end +# Note: Claude came up with these hallucinated coefficients +# they work better, but it is not clear to me how they are derived +# solves "tree_2d_dgsem/elixir_advection_basic.jl" to +# L2 error: 8.23531944e+06 +# Linf error: 1.16541673e+07 +# ∑∂S/∂U ⋅ Uₜ : -1.15789737e+05 +# a₁ = -(1 - γ)^2 / γ^2 # r^2 ≈ 0.5 +# a₂ = 1 / γ^2 +# a₃ = (1 - γ)^2 / (γ * (2 - γ)) +# res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u + + +""" + TRBDF2 + +TR-BDF2 based solver after [Bank1985-gh](@cite). +Using the formula given in [Bonaventura2021-za](@cite) eq (1). +See [Hosea1996-xv](@cite) for how it relates +""" struct TRBDF2 <: SimpleImplicitAlgorithm{2} end function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) γ = 2 - √2 return if stage == 1 - # Stage 1: Trapezoidal to t + γΔt + # Stage 1: Trapezoidal rule to t + γΔt + # u here is u₁ candidate duₙ = res f!(duₙ, uₙ, p, t) f!(du, u, p, t + γ * Δt) - res .= uₙ .+ (γ * Δt / 2) .* (duₙ .+ du) .- u + res .= uₙ .+ ((γ / 2) * Δt) .* (duₙ .+ du) .- u else - u₁ = stages[1] + # Stage 2: BDF2 from t + γΔt to t + Δt + # Note these are unequal timestep f!(du, u, p, t + Δt) - # BDF2 coefficients - c₁ = 1 / γ^2 - c₂ = -(1 - γ)^2 / γ^2 - c₃ = (1 - γ)^2 * Δt / (γ * (2 - γ)) + u₁ = stages[1] - res .= c₁ .* u₁ .+ c₂ .* uₙ .+ c₃ .* du .- u + # Bank1985 defines in eq 32 + # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ + # Manual derivation (devision by (2-γ) and then move everything to one side.) + # solves "tree_2d_dgsem/elixir_advection_basic.jl" to + # L2 error: 3.14058365e-01 + # Linf error: 4.55832844e-01 + # ∑∂S/∂U ⋅ Uₜ : -3.09686107e-04 + # a₁ = -((1 - γ)^2) / (γ * (2 - γ)) + # a₂ = 1 / (γ * (2 - γ)) + # a₃ = - (1 - γ) / (2 - γ) + # res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u + + # after Bonaventura2021 + # solves "tree_2d_dgsem/elixir_advection_basic.jl" to + # L2 error: 1.71224434e-04 + # Linf error: 2.52822142e-04 + # ∑∂S/∂U ⋅ Uₜ : -1.97551209e-09 + # They define the second stage as: + # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ + # Which differs from Bank1985 + # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ + # In the sign of u - γ₂ * Δt + # a₁ == (1-γ₃) + # a₂ == γ₃ + # a₃ == -γ₂ + γ₂ = (1 - γ) / (2 - γ) + γ₃ = 1 / (γ * (2 - γ)) + + res .= (1 - γ₃) .* uₙ .+ γ₃ .* u₁ + (γ₂ * Δt) .* du .- u end end -# struct ESDIRK2 <: SimpleImplicitAlgorithm{2} end -# function (::ESDIRK2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) -# # Standard ESDIRK2 parameters -# γ = 1 - 1/√2 # ≈ 0.2928932188134525 -# a₂₁ = 1 - γ # ≈ 0.7071067811865476 -# # # Alternative parameter set -# # γ = (2 + √2) / 4 # ≈ 0.8535533905932738 -# # a₂₁ = (2 - √2) / 4 # ≈ 0.1464466094067262 - -# if stage == 1 -# # Stage 1: Explicit stage -# # k₁ = f(tₙ, uₙ) -# # u₁ = uₙ + γΔt * k₁ -# # This is explicit, so no nonlinear solve needed -# f!(du, uₙ, p, t) -# res .= uₙ .+ γ * Δt .* du .- u -# else -# # Stage 2: Implicit stage -# # k₂ = f(tₙ + γΔt, u₁) (from stage 1) -# # u₂ = uₙ + Δt(a₂₁ * k₁ + γ * k₂) -# # = uₙ + Δt((1-γ) * k₁ + γ * k₂) - -# u₁ = stages[1] - -# # Get k₁ = (u₁ - uₙ) / (γΔt) from the explicit stage 1 result -# k₁ = res -# k₁ .= (u₁ .- uₙ) ./ (γ * Δt) - -# # k₂ = f(tₙ + γΔt, u₂) - this is what we're solving for -# f!(du, u, p, t + γ * Δt) - -# res .= uₙ .+ Δt .* (a₂₁ .* k₁ .+ γ .* du) .- u -# end -# end - -# """ -# SDIRK2 (γ = (2-√2)/2 ≈ 0.293) -# ``` -# ``` -# γ | γ 0 -# 1-γ | 1-2γ γ -# ----|-------- -# | 1/2 1/2 -# ``` -# """ -# struct SDIRK2 <: SimpleImplicitAlgorithm{2} end - -# function (::SDIRK2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) -# γ = (2 + √2) / 4 # ≈ 0.8535533905932738 -# a₂₁ = (2 - √2) / 4 # ≈ 0.1464466094067262 - -# if stage == 1 -# # Stage 1: Implicit -# f!(du, u, p, t + γ * Δt) -# res .= uₙ .+ γ * Δt .* du .- u -# elseif stage == 2 -# # Stage 2: Implicit -# u₁ = stages[1] -# k₁ = res -# k₁ .= (u₁ .- uₙ) ./ (γ * Δt) - -# # Compute f(u₂, t + (1-γ)*Δt) -# f!(du, u, p, t + (1 - γ) * Δt) - -# res .= uₙ .+ Δt .* (a₂₁ .* k₁ .+ γ .* du) .- u -# end -# return nothing -# end - function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) end - # This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L1 mutable struct SimpleImplicitOptions{Callback} callback::Callback # callbacks; used in Trixi.jl @@ -341,17 +298,18 @@ function step!(integrator::SimpleImplicit) end # one time step - integrator.u_tmp + integrator.u_tmp .= integrator.u for stage in 1:stages(alg) F! = nonlinear_problem(alg, integrator.f) # TODO: Pass in `stages[1:(stage-1)]` or full tuple? - _, stats = NewtonKrylov.newton_krylov!( + _, stats = Ariadne.newton_krylov!( F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, algo = integrator.opts.algo, tol_abs = 6.0e-6 ) @assert stats.solved if stage < stages(alg) + # Store the solution for each stage in stages integrator.stages[stage] .= integrator.u_tmp end end @@ -419,7 +377,7 @@ function jacobian(G!, f!, uₙ, p, Δt, t) F! = nonlinear_problem(G!, f!) - J = NewtonKrylov.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) + J = Ariadne.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) return collect(J) end From 800d79d81da682375f598da9e87f9eb3e3029459 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Fri, 6 Jun 2025 10:43:17 +0200 Subject: [PATCH 04/21] remove hallucinated coefficients --- libs/Implicit/src/Implicit.jl | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 71d84e5..39e61b6 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -87,24 +87,12 @@ function (::ImplicitTrapezoid)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) return nothing end -# Note: Claude came up with these hallucinated coefficients -# they work better, but it is not clear to me how they are derived -# solves "tree_2d_dgsem/elixir_advection_basic.jl" to -# L2 error: 8.23531944e+06 -# Linf error: 1.16541673e+07 -# ∑∂S/∂U ⋅ Uₜ : -1.15789737e+05 -# a₁ = -(1 - γ)^2 / γ^2 # r^2 ≈ 0.5 -# a₂ = 1 / γ^2 -# a₃ = (1 - γ)^2 / (γ * (2 - γ)) -# res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u - - """ TRBDF2 TR-BDF2 based solver after [Bank1985-gh](@cite). Using the formula given in [Bonaventura2021-za](@cite) eq (1). -See [Hosea1996-xv](@cite) for how it relates +See [Hosea1996-xv](@cite) for how it relates to implicit RK methods """ struct TRBDF2 <: SimpleImplicitAlgorithm{2} end function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) @@ -127,20 +115,12 @@ function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) # Bank1985 defines in eq 32 # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ # Manual derivation (devision by (2-γ) and then move everything to one side.) - # solves "tree_2d_dgsem/elixir_advection_basic.jl" to - # L2 error: 3.14058365e-01 - # Linf error: 4.55832844e-01 - # ∑∂S/∂U ⋅ Uₜ : -3.09686107e-04 # a₁ = -((1 - γ)^2) / (γ * (2 - γ)) # a₂ = 1 / (γ * (2 - γ)) # a₃ = - (1 - γ) / (2 - γ) # res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u # after Bonaventura2021 - # solves "tree_2d_dgsem/elixir_advection_basic.jl" to - # L2 error: 1.71224434e-04 - # Linf error: 2.52822142e-04 - # ∑∂S/∂U ⋅ Uₜ : -1.97551209e-09 # They define the second stage as: # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ # Which differs from Bank1985 From 772c66fc5ea047084793bd9597dcd495cdb149e1 Mon Sep 17 00:00:00 2001 From: MarcoArtiano Date: Thu, 26 Jun 2025 14:31:28 +0200 Subject: [PATCH 05/21] add SSP Rosenbrock --- examples/Manifest.toml | 3086 ++++++++++++++++++++++++++++ examples/Project.toml | 2 +- examples/carpenter.jl | 54 + examples/out/mesh.h5 | Bin 0 -> 36832 bytes examples/out/solution_000000000.h5 | Bin 0 -> 34816 bytes examples/out/solution_000000018.h5 | Bin 0 -> 34816 bytes examples/trixi_rosenbrock.jl | 77 + libs/Implicit/Manifest.toml | 898 ++++++++ libs/Implicit/Project.toml | 8 +- libs/Implicit/src/Implicit.jl | 124 +- out/mesh.h5 | Bin 0 -> 36832 bytes out/solution_000000000.h5 | Bin 0 -> 34816 bytes out/solution_000000001.h5 | Bin 0 -> 34816 bytes out/solution_000000002.h5 | Bin 0 -> 34816 bytes out/solution_000000003.h5 | Bin 0 -> 34816 bytes out/solution_000000004.h5 | Bin 0 -> 34816 bytes out/solution_000000005.h5 | Bin 0 -> 34816 bytes out/solution_000000006.h5 | Bin 0 -> 34816 bytes out/solution_000000007.h5 | Bin 0 -> 34816 bytes out/solution_000000008.h5 | Bin 0 -> 34816 bytes out/solution_000000009.h5 | Bin 0 -> 34816 bytes out/solution_000000010.h5 | Bin 0 -> 34816 bytes out/solution_000000018.h5 | Bin 0 -> 34816 bytes out/solution_000000022.h5 | Bin 0 -> 34816 bytes out/solution_000000040.h5 | Bin 0 -> 34816 bytes out/solution_000000100.h5 | Bin 0 -> 34816 bytes out/solution_000000200.h5 | Bin 0 -> 34816 bytes out/solution_000000300.h5 | Bin 0 -> 34816 bytes out/solution_000000400.h5 | Bin 0 -> 34816 bytes out/solution_000000500.h5 | Bin 0 -> 34816 bytes out/solution_000000600.h5 | Bin 0 -> 34816 bytes out/solution_000000700.h5 | Bin 0 -> 34816 bytes out/solution_000000800.h5 | Bin 0 -> 34816 bytes out/solution_000000900.h5 | Bin 0 -> 34816 bytes out/solution_000001000.h5 | Bin 0 -> 34816 bytes 35 files changed, 4232 insertions(+), 17 deletions(-) create mode 100644 examples/Manifest.toml create mode 100644 examples/carpenter.jl create mode 100644 examples/out/mesh.h5 create mode 100644 examples/out/solution_000000000.h5 create mode 100644 examples/out/solution_000000018.h5 create mode 100644 examples/trixi_rosenbrock.jl create mode 100644 libs/Implicit/Manifest.toml create mode 100644 out/mesh.h5 create mode 100644 out/solution_000000000.h5 create mode 100644 out/solution_000000001.h5 create mode 100644 out/solution_000000002.h5 create mode 100644 out/solution_000000003.h5 create mode 100644 out/solution_000000004.h5 create mode 100644 out/solution_000000005.h5 create mode 100644 out/solution_000000006.h5 create mode 100644 out/solution_000000007.h5 create mode 100644 out/solution_000000008.h5 create mode 100644 out/solution_000000009.h5 create mode 100644 out/solution_000000010.h5 create mode 100644 out/solution_000000018.h5 create mode 100644 out/solution_000000022.h5 create mode 100644 out/solution_000000040.h5 create mode 100644 out/solution_000000100.h5 create mode 100644 out/solution_000000200.h5 create mode 100644 out/solution_000000300.h5 create mode 100644 out/solution_000000400.h5 create mode 100644 out/solution_000000500.h5 create mode 100644 out/solution_000000600.h5 create mode 100644 out/solution_000000700.h5 create mode 100644 out/solution_000000800.h5 create mode 100644 out/solution_000000900.h5 create mode 100644 out/solution_000001000.h5 diff --git a/examples/Manifest.toml b/examples/Manifest.toml new file mode 100644 index 0000000..d8e2a50 --- /dev/null +++ b/examples/Manifest.toml @@ -0,0 +1,3086 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "1ca87a630304403ee4dfd01b3a8d28b4f3f0bfae" + +[[deps.ADTypes]] +git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.15.0" +weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AdaptivePredicates]] +git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" +uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" +version = "1.2.0" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.2" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.Ariadne]] +deps = ["Enzyme", "Krylov", "LinearAlgebra", "SparseArrays"] +path = ".." +uuid = "0be81120-40bf-4f8b-adf0-26103efb66f1" +version = "0.1.0" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "f87e559f87a45bece9c9ed97458d3afe98b1ebb9" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.1.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.19.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.AutoHashEquals]] +git-tree-sha1 = "4ec6b48702dacc5994a835c1189831755e4e76ef" +uuid = "15f4f7f2-30c1-5605-9d31-71845cf9641f" +version = "2.2.0" + +[[deps.Automa]] +deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] +git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BaseDirs]] +git-tree-sha1 = "03fea4a4efe25d2069c2d5685155005fc251c0a1" +uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" +version = "1.3.0" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.BracketingNonlinearSolve]] +deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "a9014924595b7a2c1dd14aac516e38fa10ada656" +uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e" +version = "1.3.0" +weakdeps = ["ChainRulesCore", "ForwardDiff"] + + [deps.BracketingNonlinearSolve.extensions] + BracketingNonlinearSolveChainRulesCoreExt = ["ChainRulesCore", "ForwardDiff"] + BracketingNonlinearSolveForwardDiffExt = "ForwardDiff" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.6" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" +version = "1.11.0" + +[[deps.CRlibm]] +deps = ["CRlibm_jll"] +git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e" +uuid = "96374032-68de-5a5b-8d9e-752f78720389" +version = "1.0.2" + +[[deps.CRlibm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.1.1" + +[[deps.CairoMakie]] +deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] +git-tree-sha1 = "68fe8a8ef64cb7931ce8fba69e20ecef8ddfc6c6" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.14.0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.5+0" + +[[deps.CaratheodoryPruning]] +deps = ["LinearAlgebra", "ProgressBars", "Random"] +git-tree-sha1 = "de17842b2a680ad0048fcb455f62ad87d61a0d84" +uuid = "ab320bfc-8242-4797-bfc4-9370c33880e7" +version = "0.1.1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "06ee8d1aa558d2833aa799f6f0b31b30cada405f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.2" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ChangePrecision]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "2ac5097b3caf70b772901abd824e09f991e47296" +uuid = "3cb15238-376d-56a3-8042-d33272777c9a" +version = "1.1.1" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "062c5e1a5bf6ada13db96a4ae4749a4c2234f521" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.9" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON"] +git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.1" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.29.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.DelaunayTriangulation]] +deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] +git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "1.6.4" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] +git-tree-sha1 = "2d87d7bd165c1ca0d11923a9fabe90a9d71e88a6" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.176.0" + + [deps.DiffEqBase.extensions] + DiffEqBaseCUDAExt = "CUDA" + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseForwardDiffExt = ["ForwardDiff"] + DiffEqBaseGTPSAExt = "GTPSA" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseMooncakeExt = "Mooncake" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseSparseArraysExt = "SparseArrays" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffEqCallbacks]] +deps = ["ConcreteStructs", "DataStructures", "DiffEqBase", "DifferentiationInterface", "Functors", "LinearAlgebra", "Markdown", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "80a782f3e65d4900dcf5f2cb71f5e19d9459c04a" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "4.8.0" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "210933c93f39f832d92f9efbbe69a49c453db36d" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.1" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.120" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.EllipsisNotation]] +deps = ["StaticArrayInterface"] +git-tree-sha1 = "3507300d4343e8e4ad080ad24e335274c2e297a9" +uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949" +version = "1.8.0" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.Enzyme]] +deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "InteractiveUtils", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "PrecompileTools", "Preferences", "Printf", "Random", "SparseArrays"] +git-tree-sha1 = "de7f70d73805f4e1a32395afc9d580e4ffc62924" +uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9" +version = "0.13.51" + + [deps.Enzyme.extensions] + EnzymeBFloat16sExt = "BFloat16s" + EnzymeChainRulesCoreExt = "ChainRulesCore" + EnzymeGPUArraysCoreExt = "GPUArraysCore" + EnzymeLogExpFunctionsExt = "LogExpFunctions" + EnzymeSpecialFunctionsExt = "SpecialFunctions" + EnzymeStaticArraysExt = "StaticArrays" + + [deps.Enzyme.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.EnzymeCore]] +git-tree-sha1 = "8272a687bca7b5c601c0c24fc0c71bff10aafdfd" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.12" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.Enzyme_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "97e0a9a3fa1c51ebd94dd076dd847c037b79fd79" +uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef" +version = "0.0.183+0" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArrays"] +git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.8" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.ExponentialUtilities]] +deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "PrecompileTools", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "cae251c76f353e32d32d76fae2fea655eab652af" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.27.0" +weakdeps = ["StaticArrays"] + + [deps.ExponentialUtilities.extensions] + ExponentialUtilitiesStaticArraysExt = "StaticArrays" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExproniconLite]] +git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.14" + +[[deps.Extents]] +git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.6" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "6.1.2+0" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "797762812ed063b9b94f6cc7742bc8883bb5e69e" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.9.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.11+0" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.3.5" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastGaussQuadrature]] +deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "fd923962364b645f3719855c88f7074413a6ad92" +uuid = "442a2c76-b920-505d-bb47-c5924d526838" +version = "1.0.2" + +[[deps.FastPower]] +git-tree-sha1 = "5f7afd4b1a3969dc34d692da2ed856047325b06e" +uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" +version = "1.1.3" + + [deps.FastPower.extensions] + FastPowerEnzymeExt = "Enzyme" + FastPowerForwardDiffExt = "ForwardDiff" + FastPowerMeasurementsExt = "Measurements" + FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerMooncakeExt = "Mooncake" + FastPowerReverseDiffExt = "ReverseDiff" + FastPowerTrackerExt = "Tracker" + + [deps.FastPower.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + + [deps.FileIO.weakdeps] + HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" + +[[deps.FilePaths]] +deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] +git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" +version = "0.8.3" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "f089ab1f834470c525562030c8cfde4025d5e915" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.27.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.16.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.0.1" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FreeTypeAbstraction]] +deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] +git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.8" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Functors]] +deps = ["Compat", "ConstructionBase", "LinearAlgebra", "Random"] +git-tree-sha1 = "60a0339f28a233601cb74468032b5c302d5067de" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.5.2" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] +git-tree-sha1 = "bbb7004345fb6141989835fc9f2f9e93bba3c806" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "1.5.3" + +[[deps.GaussQuadrature]] +deps = ["SpecialFunctions"] +git-tree-sha1 = "eb6f1f48aa994f3018cbd029a17863c6535a266d" +uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" +version = "0.5.8" + +[[deps.GenericSchur]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "f88e0ba1f6b42121a7c1dfe93a9687d8e164c91b" +uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" +version = "0.5.5" + +[[deps.GeoFormatTypes]] +git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" +uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" +version = "0.4.4" + +[[deps.GeoInterface]] +deps = ["DataAPI", "Extents", "GeoFormatTypes"] +git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.4.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "2670cf32dcf0229c9893b895a9afe725edb23545" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.5.9" + +[[deps.GettextRuntime_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] +git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" +version = "0.22.4+0" + +[[deps.Giflib_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" +uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" +version = "5.2.3+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "35fbd0cefb04a516104b8e183ce0df11b70a3f1a" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.84.3+0" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.3" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.11.1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HDF5]] +deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] +git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c" +uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +version = "0.17.2" +weakdeps = ["MPI"] + + [deps.HDF5.extensions] + MPIExt = "MPI" + +[[deps.HDF5_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] +git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" +uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" +version = "1.14.6+0" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.17" + +[[deps.Hwloc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "92f65c4d78ce8cdbb6b68daf88889950b0a99d11" +uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" +version = "2.12.1+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.12" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] +git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.9" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.10" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.11+0" + +[[deps.Implicit]] +deps = ["Ariadne", "DiffEqBase", "Krylov", "LinearAlgebra", "SciMLBase", "UnPack"] +path = "../libs/Implicit" +uuid = "7f538e44-2768-4ef2-af90-2110c0378286" +version = "0.1.0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.0.4+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Random", "RoundingEmulator"] +git-tree-sha1 = "79342df41c3c24664e5bf29395cfdf2f2a599412" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +version = "0.22.36" + + [deps.IntervalArithmetic.extensions] + IntervalArithmeticArblibExt = "Arblib" + IntervalArithmeticDiffRulesExt = "DiffRules" + IntervalArithmeticForwardDiffExt = "ForwardDiff" + IntervalArithmeticIntervalSetsExt = "IntervalSets" + IntervalArithmeticLinearAlgebraExt = "LinearAlgebra" + IntervalArithmeticRecipesBaseExt = "RecipesBase" + IntervalArithmeticSparseArraysExt = "SparseArrays" + + [deps.IntervalArithmetic.weakdeps] + Arblib = "fb37089c-8514-4489-9461-98f9c8763369" + DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.IntervalSets]] +git-tree-sha1 = "5fbb102dcb8b1a858111ae81d56682376130517d" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.11" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.Jieko]] +deps = ["ExproniconLite"] +git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" +uuid = "ae98c720-c025-4a4a-838c-29b094483192" +version = "0.2.1" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.6" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "602c0e9efadafb8abfe8281c3fbf9cf6f406fc03" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.35" +weakdeps = ["EnzymeCore", "LinearAlgebra", "SparseArrays"] + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.9" + +[[deps.Kronecker]] +deps = ["LinearAlgebra", "NamedDims", "SparseArrays", "StatsBase"] +git-tree-sha1 = "9253429e28cceae6e823bec9ffde12460d79bb38" +uuid = "2c470bb0-bcc8-11e8-3dad-c9649493f05e" +version = "0.5.5" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "b94257a1a8737099ca40bc7271a8b374033473ed" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.10.1" + +[[deps.KrylovPreconditioners]] +deps = ["Adapt", "KernelAbstractions", "LightGraphs", "LinearAlgebra", "Metis", "SparseArrays"] +git-tree-sha1 = "52d302d5e950e242f037316b6dd6e1e080afea09" +uuid = "45d422c2-293f-44ce-8315-2cb988662dec" +version = "0.3.4" + + [deps.KrylovPreconditioners.extensions] + KrylovPreconditionersAMDGPUExt = "AMDGPU" + KrylovPreconditionersCUDAExt = "CUDA" + KrylovPreconditionersOneAPIExt = "oneAPI" + + [deps.KrylovPreconditioners.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "9c7c721cfd800d87d48c745d8bfb65144f0a91df" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.4.2" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "2ea068aac1e7f0337d381b0eae3110581e3f3216" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.37+2" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.8+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazyArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "SparseArrays"] +git-tree-sha1 = "866ce84b15e54d758c11946aacd4e5df0e60b7a3" +uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" +version = "2.6.1" + + [deps.LazyArrays.extensions] + LazyArraysBandedMatricesExt = "BandedMatrices" + LazyArraysBlockArraysExt = "BlockArrays" + LazyArraysBlockBandedMatricesExt = "BlockBandedMatrices" + LazyArraysStaticArraysExt = "StaticArrays" + + [deps.LazyArrays.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.LibTracyClient_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d2bc4e1034b2d43076b50f0e34ea094c2cb0a717" +uuid = "ad6e5548-8b26-5c9f-8ef3-ef0ad883f3a5" +version = "0.9.1+6" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.0+0" + +[[deps.LightGraphs]] +deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "432428df5f360964040ed60418dd5601ecd240b6" +uuid = "093fc24a-ae57-5d10-9952-331d41423f4d" +version = "1.3.5" + +[[deps.LightXML]] +deps = ["Libdl", "XML2_jll"] +git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" +uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" +version = "0.9.1" + +[[deps.LineSearch]] +deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"] +git-tree-sha1 = "97d502765cc5cf3a722120f50da03c2474efce04" +uuid = "87fe0de2-c867-4266-b59a-2f0a94fc965b" +version = "0.1.4" +weakdeps = ["LineSearches"] + + [deps.LineSearch.extensions] + LineSearchLineSearchesExt = "LineSearches" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.4.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.4" +weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"] + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + +[[deps.LinearSolve]] +deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] +git-tree-sha1 = "062c11f1d84ffc80d00fddaa515f7e37e8e9f9d5" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "3.18.2" + + [deps.LinearSolve.extensions] + LinearSolveBandedMatricesExt = "BandedMatrices" + LinearSolveBlockDiagonalsExt = "BlockDiagonals" + LinearSolveCUDAExt = "CUDA" + LinearSolveCUDSSExt = "CUDSS" + LinearSolveEnzymeExt = "EnzymeCore" + LinearSolveFastAlmostBandedMatricesExt = "FastAlmostBandedMatrices" + LinearSolveFastLapackInterfaceExt = "FastLapackInterface" + LinearSolveForwardDiffExt = "ForwardDiff" + LinearSolveHYPREExt = "HYPRE" + LinearSolveIterativeSolversExt = "IterativeSolvers" + LinearSolveKernelAbstractionsExt = "KernelAbstractions" + LinearSolveKrylovKitExt = "KrylovKit" + LinearSolveMetalExt = "Metal" + LinearSolvePardisoExt = ["Pardiso", "SparseArrays"] + LinearSolveRecursiveFactorizationExt = "RecursiveFactorization" + LinearSolveSparseArraysExt = "SparseArrays" + LinearSolveSparspakExt = ["SparseArrays", "Sparspak"] + + [deps.LinearSolve.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" + FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" + IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" + RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "e5afce7eaf5b5ca0d444bcb4dc4fd78c54cbbac0" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.172" +weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"] + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.METIS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2eefa8baa858871ae7770c98c3c2a7e46daba5b4" +uuid = "d00139f3-1899-568f-a2f0-47f597d42d70" +version = "5.1.3+0" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.0.1+1" + +[[deps.MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "892676019c58f34e38743bc989b0eca5bce5edc5" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.20.22" + + [deps.MPI.extensions] + AMDGPUExt = "AMDGPU" + CUDAExt = "CUDA" + + [deps.MPI.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MPICH_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "d72d0ecc3f76998aac04e446547259b9ae4c265f" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "4.3.1+0" + +[[deps.MPIPreferences]] +deps = ["Libdl", "Preferences"] +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +version = "0.1.11" + +[[deps.MPItrampoline_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "e214f2a20bdd64c04cd3e4ff62d3c9be7e969a59" +uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" +version = "5.5.4+0" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Makie]] +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] +git-tree-sha1 = "29c5cf33287afa8c06711fec1b33d074f88dd354" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.23.0" + +[[deps.MakieCore]] +deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] +git-tree-sha1 = "6ec4aba99ce1a8c247822ce346b273d0d686e141" +uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" +version = "0.10.0" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] +git-tree-sha1 = "6e64d2321257cc52f47e193407d0659ea1b2b431" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.6.5" + +[[deps.MaybeInplace]] +deps = ["ArrayInterface", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "54e2fdc38130c05b42be423e90da3bade29b74bd" +uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb" +version = "0.1.4" +weakdeps = ["SparseArrays"] + + [deps.MaybeInplace.extensions] + MaybeInplaceSparseArraysExt = "SparseArrays" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Metis]] +deps = ["CEnum", "LinearAlgebra", "METIS_jll", "SparseArrays"] +git-tree-sha1 = "54aca4fd53d39dcd2c3f1bef367b6921e8178628" +uuid = "2679e427-3c69-5b7f-982b-ece356f1e94b" +version = "1.5.0" + + [deps.Metis.extensions] + MetisGraphs = "Graphs" + MetisLightGraphs = "LightGraphs" + MetisSimpleWeightedGraphs = ["SimpleWeightedGraphs", "Graphs"] + + [deps.Metis.weakdeps] + Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6" + LightGraphs = "093fc24a-ae57-5d10-9952-331d41423f4d" + SimpleWeightedGraphs = "47aef6b3-ad0c-573a-a1e2-d07658019622" + +[[deps.MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.4+3" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.Moshi]] +deps = ["ExproniconLite", "Jieko"] +git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" +version = "0.3.5" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.NLSolversBase]] +deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.10.0" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NamedDims]] +deps = ["LinearAlgebra", "Pkg", "Statistics"] +git-tree-sha1 = "90178dc801073728b8b2d0d8677d10909feb94d8" +uuid = "356022a1-0364-5f58-8944-0da4b18d706f" +version = "1.2.2" + + [deps.NamedDims.extensions] + AbstractFFTsExt = "AbstractFFTs" + ChainRulesCoreExt = "ChainRulesCore" + CovarianceEstimationExt = "CovarianceEstimation" + TrackerExt = "Tracker" + + [deps.NamedDims.weakdeps] + AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + CovarianceEstimation = "587fd27a-f159-11e8-2dae-1979310e6154" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NodesAndModes]] +deps = ["DelimitedFiles", "LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "ee6719b4ed5fd08b654017648bf5fa2e2dc8f1ec" +uuid = "7aca2e03-f7e2-4192-9ec8-f4ca66d597fb" +version = "1.1.0" + +[[deps.NonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseMatrixColorings", "StaticArraysCore", "SymbolicIndexingInterface"] +git-tree-sha1 = "aeb6fb02e63b4d4f90337ed90ce54ceb4c0efe77" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "4.9.0" + + [deps.NonlinearSolve.extensions] + NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" + NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration" + NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim" + NonlinearSolveMINPACKExt = "MINPACK" + NonlinearSolveNLSolversExt = "NLSolvers" + NonlinearSolveNLsolveExt = ["NLsolve", "LineSearches"] + NonlinearSolvePETScExt = ["PETSc", "MPI"] + NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations" + NonlinearSolveSpeedMappingExt = "SpeedMapping" + NonlinearSolveSundialsExt = "Sundials" + + [deps.NonlinearSolve.weakdeps] + FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce" + FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176" + LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891" + LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" + MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + NLSolvers = "337daf1e-9722-11e9-073e-8b9effe078ba" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + PETSc = "ace2c81b-2b5f-4b1e-a30d-d662738edfe0" + SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4" + SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412" + Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4" + +[[deps.NonlinearSolveBase]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "Compat", "ConcreteStructs", "DifferentiationInterface", "EnzymeCore", "FastClosures", "LinearAlgebra", "Markdown", "MaybeInplace", "Preferences", "Printf", "RecursiveArrayTools", "SciMLBase", "SciMLJacobianOperators", "SciMLOperators", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"] +git-tree-sha1 = "404d71dd057759f4d590191a643113485c4a482a" +uuid = "be0214bd-f91f-a760-ac4e-3421ce2b2da0" +version = "1.12.0" + + [deps.NonlinearSolveBase.extensions] + NonlinearSolveBaseBandedMatricesExt = "BandedMatrices" + NonlinearSolveBaseDiffEqBaseExt = "DiffEqBase" + NonlinearSolveBaseForwardDiffExt = "ForwardDiff" + NonlinearSolveBaseLineSearchExt = "LineSearch" + NonlinearSolveBaseLinearSolveExt = "LinearSolve" + NonlinearSolveBaseSparseArraysExt = "SparseArrays" + NonlinearSolveBaseSparseMatrixColoringsExt = "SparseMatrixColorings" + + [deps.NonlinearSolveBase.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LineSearch = "87fe0de2-c867-4266-b59a-2f0a94fc965b" + LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + +[[deps.NonlinearSolveFirstOrder]] +deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLJacobianOperators", "Setfield", "StaticArraysCore"] +git-tree-sha1 = "9c8cd0a986518ba317af263549b48e34ac8f776d" +uuid = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d" +version = "1.5.0" + +[[deps.NonlinearSolveQuasiNewton]] +deps = ["ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLOperators", "StaticArraysCore"] +git-tree-sha1 = "e3888bdbab6e0bfadbc3164ef4595e40e7b7e954" +uuid = "9a2c21bd-3a47-402d-9113-8faf9a0ee114" +version = "1.6.0" +weakdeps = ["ForwardDiff"] + + [deps.NonlinearSolveQuasiNewton.extensions] + NonlinearSolveQuasiNewtonForwardDiffExt = "ForwardDiff" + +[[deps.NonlinearSolveSpectralMethods]] +deps = ["CommonSolve", "ConcreteStructs", "DiffEqBase", "LineSearch", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "3398222199e4b9ca0b5840907fb509f28f1a2fdc" +uuid = "26075421-4e9a-44e1-8bd1-420ed7ad02b2" +version = "1.2.0" +weakdeps = ["ForwardDiff"] + + [deps.NonlinearSolveSpectralMethods.extensions] + NonlinearSolveSpectralMethodsForwardDiffExt = "ForwardDiff" + +[[deps.ObjectFile]] +deps = ["Reexport", "StructIO"] +git-tree-sha1 = "09b1fe6ff16e6587fa240c165347474322e77cf1" +uuid = "d8793406-e978-5875-9003-1fc021f44a92" +version = "0.4.4" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.Octavian]] +deps = ["CPUSummary", "IfElse", "LoopVectorization", "ManualMemory", "PolyesterWeave", "PrecompileTools", "Static", "StaticArrayInterface", "ThreadingUtilities", "VectorizationBase"] +git-tree-sha1 = "21d5b4557036561266a7578ae3f9914d18ae5685" +uuid = "6fd5a793-0b7e-452c-907f-f8bfe9c57db4" +version = "0.3.29" + + [deps.Octavian.extensions] + ForwardDiffExt = "ForwardDiff" + HyperDualNumbersExt = "HyperDualNumbers" + + [deps.Octavian.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + HyperDualNumbers = "50ceba7f-c3ee-5a84-a6e8-3ad40456ec97" + +[[deps.OffsetArrays]] +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.17.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLASConsistentFPCSR_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" +uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" +version = "0.3.29+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.3" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.2.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenMPI_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "ec764453819f802fc1e144bfe750c454181bd66d" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "5.0.8+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.0+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.OrdinaryDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "MacroTools", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqAdamsBashforthMoulton", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqDefault", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqExplicitRK", "OrdinaryDiffEqExponentialRK", "OrdinaryDiffEqExtrapolation", "OrdinaryDiffEqFIRK", "OrdinaryDiffEqFeagin", "OrdinaryDiffEqFunctionMap", "OrdinaryDiffEqHighOrderRK", "OrdinaryDiffEqIMEXMultistep", "OrdinaryDiffEqLinear", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqLowStorageRK", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqNordsieck", "OrdinaryDiffEqPDIRK", "OrdinaryDiffEqPRK", "OrdinaryDiffEqQPRK", "OrdinaryDiffEqRKN", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqSSPRK", "OrdinaryDiffEqStabilizedIRK", "OrdinaryDiffEqStabilizedRK", "OrdinaryDiffEqSymplecticRK", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "Static", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] +git-tree-sha1 = "1c2b2df870944e0dc01454fd87479847c55fa26c" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.98.0" + +[[deps.OrdinaryDiffEqAdamsBashforthMoulton]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqLowOrderRK", "Polyester", "RecursiveArrayTools", "Reexport", "Static"] +git-tree-sha1 = "82f78099ecf4e0fa53545811318520d87e7fe0b8" +uuid = "89bda076-bce5-4f1c-845f-551c83cdda9a" +version = "1.2.0" + +[[deps.OrdinaryDiffEqBDF]] +deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqSDIRK", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "StaticArrays", "TruncatedStacktraces"] +git-tree-sha1 = "9124a686af119063bb4d3a8f87044a8f312fcad9" +uuid = "6ad6398a-0878-4a85-9266-38940aa047c8" +version = "1.6.0" + +[[deps.OrdinaryDiffEqCore]] +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "FastBroadcast", "FastClosures", "FastPower", "FillArrays", "FunctionWrappersWrappers", "InteractiveUtils", "LinearAlgebra", "Logging", "MacroTools", "MuladdMacro", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleUnPack", "Static", "StaticArrayInterface", "StaticArraysCore", "SymbolicIndexingInterface", "TruncatedStacktraces"] +git-tree-sha1 = "08dac9c6672a4548439048089bac293759a897fd" +uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +version = "1.26.1" +weakdeps = ["EnzymeCore"] + + [deps.OrdinaryDiffEqCore.extensions] + OrdinaryDiffEqCoreEnzymeCoreExt = "EnzymeCore" + +[[deps.OrdinaryDiffEqDefault]] +deps = ["ADTypes", "DiffEqBase", "EnumX", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "PrecompileTools", "Preferences", "Reexport"] +git-tree-sha1 = "8eeed32442874d1bdcc2192a874a73f1a9a07e31" +uuid = "50262376-6c5a-4cf5-baba-aaf4f84d72d7" +version = "1.4.0" + +[[deps.OrdinaryDiffEqDifferentiation]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqCore", "SciMLBase", "SciMLOperators", "SparseArrays", "SparseMatrixColorings", "StaticArrayInterface", "StaticArrays"] +git-tree-sha1 = "efecf0c4cc44e16251b0e718f08b0876b2a82b80" +uuid = "4302a76b-040a-498a-8c04-15b101fed76b" +version = "1.10.0" + +[[deps.OrdinaryDiffEqExplicitRK]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "TruncatedStacktraces"] +git-tree-sha1 = "4dbce3f9e6974567082ce5176e21aab0224a69e9" +uuid = "9286f039-9fbf-40e8-bf65-aa933bdc4db0" +version = "1.1.0" + +[[deps.OrdinaryDiffEqExponentialRK]] +deps = ["ADTypes", "DiffEqBase", "ExponentialUtilities", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqVerner", "RecursiveArrayTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "8d2ab84d7fabdfde995e5f567361f238069497f5" +uuid = "e0540318-69ee-4070-8777-9e2de6de23de" +version = "1.4.0" + +[[deps.OrdinaryDiffEqExtrapolation]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "FastPower", "LinearSolve", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "RecursiveArrayTools", "Reexport"] +git-tree-sha1 = "80a636aac325c546b04e3bf20f0c80eaa0173dd4" +uuid = "becaefa8-8ca2-5cf9-886d-c06f3d2bd2c4" +version = "1.5.0" + +[[deps.OrdinaryDiffEqFIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "FastGaussQuadrature", "FastPower", "LinearAlgebra", "LinearSolve", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "0da8ec3491821262a3d2828e6370e76b51a770a3" +uuid = "5960d6e9-dd7a-4743-88e7-cf307b64f125" +version = "1.12.0" + +[[deps.OrdinaryDiffEqFeagin]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "Static"] +git-tree-sha1 = "a7cc74d3433db98e59dc3d58bc28174c6c290adf" +uuid = "101fe9f7-ebb6-4678-b671-3a81e7194747" +version = "1.1.0" + +[[deps.OrdinaryDiffEqFunctionMap]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "925a91583d1ab84f1f0fea121be1abf1179c5926" +uuid = "d3585ca7-f5d3-4ba6-8057-292ed1abd90f" +version = "1.1.1" + +[[deps.OrdinaryDiffEqHighOrderRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "Static"] +git-tree-sha1 = "103e017ff186ac39d731904045781c9bacfca2b0" +uuid = "d28bc4f8-55e1-4f49-af69-84c1a99f0f58" +version = "1.1.0" + +[[deps.OrdinaryDiffEqIMEXMultistep]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Reexport"] +git-tree-sha1 = "095bab73a3ff185e9ef971fc42ecc93c7824e589" +uuid = "9f002381-b378-40b7-97a6-27a27c83f129" +version = "1.3.0" + +[[deps.OrdinaryDiffEqLinear]] +deps = ["DiffEqBase", "ExponentialUtilities", "LinearAlgebra", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "940cef72ec8799d869ff1ba3dcf47cf7758e51cf" +uuid = "521117fe-8c41-49f8-b3b6-30780b3f0fb5" +version = "1.3.0" + +[[deps.OrdinaryDiffEqLowOrderRK]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "d4bb32e09d6b68ce2eb45fb81001eab46f60717a" +uuid = "1344f307-1e59-4825-a18e-ace9aa3fa4c6" +version = "1.2.0" + +[[deps.OrdinaryDiffEqLowStorageRK]] +deps = ["Adapt", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "Static", "StaticArrays"] +git-tree-sha1 = "52ec7081e65291fa5c19749312df0818db2fa1bc" +uuid = "b0944070-b475-4768-8dec-fb6eb410534d" +version = "1.3.0" + +[[deps.OrdinaryDiffEqNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "FastClosures", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "PreallocationTools", "RecursiveArrayTools", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "StaticArrays"] +git-tree-sha1 = "ffdb0f5207b0e30f8b1edf99b3b9546d9c48ccaf" +uuid = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" +version = "1.10.0" + +[[deps.OrdinaryDiffEqNordsieck]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqTsit5", "Polyester", "RecursiveArrayTools", "Reexport", "Static"] +git-tree-sha1 = "ef44754f10e0dfb9bb55ded382afed44cd94ab57" +uuid = "c9986a66-5c92-4813-8696-a7ec84c806c8" +version = "1.1.0" + +[[deps.OrdinaryDiffEqPDIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Polyester", "Reexport", "StaticArrays"] +git-tree-sha1 = "ab9897e4bc8e3cf8e15f1cf61dbdd15d6a2341d7" +uuid = "5dd0a6cf-3d4b-4314-aa06-06d4e299bc89" +version = "1.3.1" + +[[deps.OrdinaryDiffEqPRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "Reexport"] +git-tree-sha1 = "da525d277962a1b76102c79f30cb0c31e13fe5b9" +uuid = "5b33eab2-c0f1-4480-b2c3-94bc1e80bda1" +version = "1.1.0" + +[[deps.OrdinaryDiffEqQPRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "Static"] +git-tree-sha1 = "332f9d17d0229218f66a73492162267359ba85e9" +uuid = "04162be5-8125-4266-98ed-640baecc6514" +version = "1.1.0" + +[[deps.OrdinaryDiffEqRKN]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport"] +git-tree-sha1 = "41c09d9c20877546490f907d8dffdd52690dd65f" +uuid = "af6ede74-add8-4cfd-b1df-9a4dbb109d7a" +version = "1.1.0" + +[[deps.OrdinaryDiffEqRosenbrock]] +deps = ["ADTypes", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "Static"] +git-tree-sha1 = "1ce0096d920e95773220e818f29bf4b37ea2bb78" +uuid = "43230ef6-c299-4910-a778-202eb28ce4ce" +version = "1.11.0" + +[[deps.OrdinaryDiffEqSDIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"] +git-tree-sha1 = "b3a7e3a2f355d837c823b435630f035aef446b45" +uuid = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" +version = "1.3.0" + +[[deps.OrdinaryDiffEqSSPRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "Static", "StaticArrays"] +git-tree-sha1 = "651756c030df7a1d49ad484288937f8c398e8a08" +uuid = "669c94d9-1f4b-4b64-b377-1aa079aa2388" +version = "1.3.0" + +[[deps.OrdinaryDiffEqStabilizedIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "RecursiveArrayTools", "Reexport", "StaticArrays"] +git-tree-sha1 = "111c23b68ad644b47e38242af920d5805c7bedb1" +uuid = "e3e12d00-db14-5390-b879-ac3dd2ef6296" +version = "1.3.0" + +[[deps.OrdinaryDiffEqStabilizedRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "StaticArrays"] +git-tree-sha1 = "1b0d894c880e25f7d0b022d7257638cf8ce5b311" +uuid = "358294b1-0aab-51c3-aafe-ad5ab194a2ad" +version = "1.1.0" + +[[deps.OrdinaryDiffEqSymplecticRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport"] +git-tree-sha1 = "a13d59a2d6cfb6a3332a7782638ca6e1cb6ca688" +uuid = "fa646aed-7ef9-47eb-84c4-9443fc8cbfa8" +version = "1.3.0" + +[[deps.OrdinaryDiffEqTsit5]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "Static", "TruncatedStacktraces"] +git-tree-sha1 = "96552f7d4619fabab4038a29ed37dd55e9eb513a" +uuid = "b1df2697-797e-41e3-8120-5422d3b24e4a" +version = "1.1.0" + +[[deps.OrdinaryDiffEqVerner]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "Static", "TruncatedStacktraces"] +git-tree-sha1 = "08f2d3be30874b6e2e937a06b501fb9811f7d8bd" +uuid = "79d7bb75-1356-48c1-b8c0-6832512096c2" +version = "1.2.0" + +[[deps.P4est]] +deps = ["CEnum", "MPI", "MPIPreferences", "P4est_jll", "Preferences", "Reexport", "UUIDs"] +git-tree-sha1 = "6a924bc3d05ebb09de7e8294a30c022461a44720" +uuid = "7d669430-f675-4ae7-b43e-fab78ec5a902" +version = "0.4.13" + +[[deps.P4est_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "Pkg", "TOML", "Zlib_jll"] +git-tree-sha1 = "70c2d9a33b8810198314a5722ee3e9520110b28d" +uuid = "6b5a15aa-cf52-5330-8376-5e5d90283449" +version = "2.8.1+2" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.35" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.4" + +[[deps.Packing]] +deps = ["GeometryBasics"] +git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.1" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "275a9a6d85dc86c24d03d1837a0010226a96f540" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.3+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.PathIntersections]] +deps = ["ForwardDiff", "GaussQuadrature", "LinearAlgebra", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "730201a293befb624c7b3d76ccbd326b0c689067" +uuid = "4c1a95c7-462a-4a7e-b284-959c63fbf1dc" +version = "0.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6f7cd22a802094d239824c57d94c8e2d0f7cfc7d" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.18" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PolynomialBases]] +deps = ["ArgCheck", "AutoHashEquals", "FFTW", "FastGaussQuadrature", "LinearAlgebra", "Requires", "SimpleUnPack", "SpecialFunctions"] +git-tree-sha1 = "e856e397bd7be7b43542677e5cb8c75ec480ce94" +uuid = "c74db56a-226d-5e98-8bb0-a6049094aeea" +version = "0.4.24" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "ForwardDiff"] +git-tree-sha1 = "6d98eace73d82e47f5b16c393de198836d9f790a" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.27" + + [deps.PreallocationTools.extensions] + PreallocationToolsReverseDiffExt = "ReverseDiff" + PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer" + + [deps.PreallocationTools.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.ProgressBars]] +deps = ["Printf"] +git-tree-sha1 = "b437cdb0385ed38312d91d9c00c20f3798b30256" +uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" +version = "1.5.1" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.4" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" +weakdeps = ["Enzyme"] + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "2e154f7d7e38db1af0a14ec751aba33360c3bef9" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.33.0" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "86a8a8b783481e1ea6b9c91dd949cb32191f8ab4" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.15" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.7.1" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.43" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "31587e20cdea9fba3a689033313e658dfc9aae78" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.102.1" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMLStyleExt = "MLStyle" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLJacobianOperators]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DifferentiationInterface", "FastClosures", "LinearAlgebra", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "7da1216346ad79499d08d7e2a3dbf297dc80c829" +uuid = "19f34311-ddf3-4b8b-af20-060888a46c0e" +version = "0.1.6" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "3249fe77f322fe539e935ecb388c8290cd38a3fc" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "1.3.1" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "566c4ed301ccb2a44cbd5a27da5f885e0ed1d5df" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] +git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +version = "0.5.0" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SignedDistanceFields]] +deps = ["Random", "Statistics", "Test"] +git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.0" + +[[deps.SimpleNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "Setfield", "StaticArraysCore"] +git-tree-sha1 = "7aaa5fe4617271b64fce0466d187f2a72edbd81a" +uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" +version = "2.5.0" + + [deps.SimpleNonlinearSolve.extensions] + SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" + SimpleNonlinearSolveDiffEqBaseExt = "DiffEqBase" + SimpleNonlinearSolveReverseDiffExt = "ReverseDiff" + SimpleNonlinearSolveTrackerExt = "Tracker" + + [deps.SimpleNonlinearSolve.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleUnPack]] +git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" +uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" +version = "1.1.0" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "a8dd0ed8a9e277013fdd4da1a413c748b349b7ec" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseMatrixColorings]] +deps = ["ADTypes", "DocStringExtensions", "LinearAlgebra", "PrecompileTools", "Random", "SparseArrays"] +git-tree-sha1 = "9de43e0b9b976f1019bf7a879a686c4514520078" +uuid = "0a514795-09f3-496d-8182-132a7b665d35" +version = "0.4.21" + + [deps.SparseMatrixColorings.extensions] + SparseMatrixColoringsCUDAExt = "CUDA" + SparseMatrixColoringsCliqueTreesExt = "CliqueTrees" + SparseMatrixColoringsColorsExt = "Colors" + + [deps.SparseMatrixColorings.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.2" + +[[deps.StartUpDG]] +deps = ["CaratheodoryPruning", "ConstructionBase", "FillArrays", "HDF5", "Kronecker", "LinearAlgebra", "NodesAndModes", "PathIntersections", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "Setfield", "SparseArrays", "StaticArrays", "Triangulate", "WriteVTK"] +git-tree-sha1 = "5494db18da3dab3d5de98b0a2b5a1b9162c72102" +uuid = "472ebc20-7c99-4d4b-9470-8fde4e9faa0f" +version = "1.2.0" + + [deps.StartUpDG.extensions] + StartUpDGSummationByPartsOperatorsExt = "SummationByPartsOperators" + TriangulatePlotsExt = "Plots" + + [deps.StartUpDG.weakdeps] + Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" + SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.2.0" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.8.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StrideArrays]] +deps = ["ArrayInterface", "LinearAlgebra", "LoopVectorization", "Octavian", "Random", "SLEEFPirates", "Static", "StaticArrayInterface", "StaticArraysCore", "Statistics", "StrideArraysCore", "VectorizationBase", "VectorizedRNG", "VectorizedStatistics"] +git-tree-sha1 = "a009ced9a1952b91f3982a6e06df672189c6cbc9" +uuid = "d1fa6d79-ef01-42a6-86c9-f7c551f8593b" +version = "0.1.29" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.7" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "8ad2e38cbb812e29348719cc63580ec1dfeb9de4" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.1" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StructIO]] +git-tree-sha1 = "c581be48ae1cbf83e899b14c07a807e1787512cc" +uuid = "53d494c1-5632-5724-8f4c-31dff12d585f" +version = "0.3.1" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.SummationByPartsOperators]] +deps = ["ArgCheck", "AutoHashEquals", "FFTW", "InteractiveUtils", "LinearAlgebra", "LoopVectorization", "MuladdMacro", "PolynomialBases", "PrecompileTools", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "SimpleUnPack", "SparseArrays", "StaticArrayInterface", "StaticArrays", "Unrolled"] +git-tree-sha1 = "85c82b92d94264d5376bebf96226bea5ca4e2716" +uuid = "9f78cca6-572e-554e-b819-917d2f1cf240" +version = "0.5.81" + + [deps.SummationByPartsOperators.extensions] + SummationByPartsOperatorsBandedMatricesExt = "BandedMatrices" + SummationByPartsOperatorsDiffEqCallbacksExt = "DiffEqCallbacks" + SummationByPartsOperatorsForwardDiffExt = "ForwardDiff" + SummationByPartsOperatorsOptimForwardDiffExt = ["Optim", "ForwardDiff"] + SummationByPartsOperatorsStructArraysExt = "StructArrays" + + [deps.SummationByPartsOperators.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Optim = "429524aa-4258-5aef-a3af-852621145aeb" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "PrettyTables", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "658f6d01bfe68d6bf47915bf5d868228138c7d71" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.41" + +[[deps.T8code]] +deps = ["CEnum", "Libdl", "MPI", "MPIPreferences", "Preferences", "Reexport", "UUIDs", "t8code_jll"] +git-tree-sha1 = "1b5ef460f156ed68e3affb67f48e2b4bec9915e4" +uuid = "d0cc0030-9a40-4274-8435-baadcfd54fa1" +version = "0.7.4" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.5" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "02aca429c9885d1109e58f400c333521c13d48a0" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.11.4" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.29" + + [deps.TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [deps.TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" + +[[deps.Tracy]] +deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] +git-tree-sha1 = "16439d004690d4086da35528f0c6b4d7006d6dae" +uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" +version = "0.1.4" + + [deps.Tracy.extensions] + TracyProfilerExt = "TracyProfiler_jll" + + [deps.Tracy.weakdeps] + TracyProfiler_jll = "0c351ed6-8a68-550e-8b79-de6f926da83c" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Triangle_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "fe28e9a4684f6f54e868b9136afb8fd11f1734a7" +uuid = "5639c1d2-226c-5e70-8d55-b3095415a16a" +version = "1.6.2+0" + +[[deps.Triangulate]] +deps = ["DocStringExtensions", "Printf", "Triangle_jll"] +git-tree-sha1 = "8c8d7d43f3073f8b9c667b66569f1c090fc5b9c7" +uuid = "f7e6ffb2-c36d-4f8f-a77e-16e897189344" +version = "2.5.1" + + [deps.Triangulate.weakdeps] + CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" + GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" + PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.TriplotRecipes]] +deps = ["RecipesBase", "TriplotBase"] +git-tree-sha1 = "fceb3b0f37ff6ccf3c70b9c5198d2eefec46ada0" +uuid = "808ab39a-a642-4abf-81ff-4cb34ebbffa3" +version = "0.1.2" + +[[deps.Trixi]] +deps = ["Accessors", "CodeTracking", "ConstructionBase", "DataStructures", "DelimitedFiles", "DiffEqBase", "DiffEqCallbacks", "Downloads", "EllipsisNotation", "FillArrays", "ForwardDiff", "HDF5", "LinearAlgebra", "LinearMaps", "LoopVectorization", "MPI", "MuladdMacro", "Octavian", "OffsetArrays", "P4est", "Polyester", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "SimpleUnPack", "SparseArrays", "StableRNGs", "StartUpDG", "Static", "StaticArrayInterface", "StaticArrays", "StrideArrays", "StructArrays", "SummationByPartsOperators", "T8code", "TimerOutputs", "Triangulate", "TriplotBase", "TriplotRecipes", "TrixiBase", "UUIDs"] +git-tree-sha1 = "63f3266dbc10d5e375eaf6f88233201893c13f53" +uuid = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" +version = "0.12.4" + + [deps.Trixi.extensions] + TrixiConvexECOSExt = ["Convex", "ECOS"] + TrixiMakieExt = "Makie" + TrixiNLsolveExt = "NLsolve" + + [deps.Trixi.weakdeps] + Convex = "f65535da-76fb-5f13-bab9-19810c17039a" + ECOS = "e2685f51-7e38-5353-a97d-a921fd2c8199" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + +[[deps.TrixiBase]] +deps = ["ChangePrecision", "TimerOutputs"] +git-tree-sha1 = "6c169bd924738a1a25a860e661ebf5970e6cc820" +uuid = "9a0f1c46-06d5-4909-a5a3-ce25d3fa3284" +version = "0.1.5" +weakdeps = ["MPI"] + + [deps.TrixiBase.extensions] + TrixiBaseMPIExt = "MPI" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.23.1" +weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "Printf"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + ForwardDiffExt = "ForwardDiff" + InverseFunctionsUnitfulExt = "InverseFunctions" + PrintfExt = "Printf" + +[[deps.Unrolled]] +deps = ["MacroTools"] +git-tree-sha1 = "6cc9d682755680e0f0be87c56392b7651efc2c7b" +uuid = "9602ed7d-8fef-5bc8-8597-8f21381861e8" +version = "0.1.5" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" +weakdeps = ["LLVM"] + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + +[[deps.VTKBase]] +git-tree-sha1 = "c2d0db3ef09f1942d08ea455a9e252594be5f3b6" +uuid = "4004b06d-e244-455f-a6ce-a5f9919cc534" +version = "1.0.1" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "4ab62a49f1d8d9548a1c8d1a75e5f55cf196f64e" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.71" + +[[deps.VectorizedRNG]] +deps = ["Distributed", "Random", "SLEEFPirates", "UnPack", "VectorizationBase"] +git-tree-sha1 = "5ca83562ba95272d8709c6c91e31e23c3c4c9825" +uuid = "33b4df10-0173-11e9-2a0c-851a7edac40e" +version = "0.2.25" +weakdeps = ["Requires", "StaticArraysCore"] + + [deps.VectorizedRNG.extensions] + VectorizedRNGStaticArraysExt = ["StaticArraysCore"] + +[[deps.VectorizedStatistics]] +deps = ["LoopVectorization", "PrecompileTools", "Static"] +git-tree-sha1 = "f59703fbab297efe6ad09ef1dc656f8f0a21ad28" +uuid = "3b853605-1c98-4422-8364-4bd93ee0529e" +version = "0.5.10" + +[[deps.WebP]] +deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] +git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" +uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" +version = "0.1.3" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.WriteVTK]] +deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams", "VTKBase"] +git-tree-sha1 = "a329e0b6310244173690d6a4dfc6d1141f9b9370" +uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" +version = "1.21.2" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+1" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.1+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.12+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.7+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaec_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" +uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" +version = "1.1.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "cd155272a3738da6db765745b89e466fa64d0830" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.49+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] +git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.5+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.libwebp_jll]] +deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] +git-tree-sha1 = "d2408cac540942921e7bd77272c32e58c33d8a77" +uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" +version = "1.5.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.t8code_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "Zlib_jll"] +git-tree-sha1 = "cf073e7d4275b8a030140936639f3d6a5eeb3e74" +uuid = "4ee9bed8-4011-53f7-90c2-22363c2f500d" +version = "3.0.1+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "10164.0.1+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.6.0+0" diff --git a/examples/Project.toml b/examples/Project.toml index f304847..940855b 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -10,6 +10,7 @@ KrylovPreconditioners = "45d422c2-293f-44ce-8315-2cb988662dec" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Observables = "510215fc-4207-5dde-b226-833fc4488ee2" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d" OrdinaryDiffEqSDIRK = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" @@ -20,7 +21,6 @@ Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" [sources] Ariadne = {path = ".."} Implicit = {path = "../libs/Implicit"} -Trixi = {rev = "vc/turbo", url = "https://github.com/trixi-framework/Trixi.jl"} [compat] julia = "1.10" diff --git a/examples/carpenter.jl b/examples/carpenter.jl new file mode 100644 index 0000000..a575df6 --- /dev/null +++ b/examples/carpenter.jl @@ -0,0 +1,54 @@ +using OrdinaryDiffEq +using Trixi + +############################################################################### +# semidiscretization of the linear advection equation + +advection_velocity = (0.2, -0.7) +equations = LinearScalarAdvectionEquation2D(advection_velocity) + +# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux +solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) + +coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y)) +coordinates_max = (1.0, 1.0) # maximum coordinates (max(x), max(y)) + +# Create a uniformly refined mesh with periodic boundaries +mesh = TreeMesh(coordinates_min, coordinates_max, + initial_refinement_level = 4, + n_cells_max = 30_000) # set maximum capacity of tree data structure + +# A semidiscretization collects data structures and functions for the spatial discretization +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, + solver) + +############################################################################### +# ODE solvers, callbacks etc. + +# Create ODE problem with time span from 0.0 to 1.0 +ode = semidiscretize(semi, (0.0, 1.0)) + +# At the beginning of the main loop, the SummaryCallback prints a summary of the simulation setup +# and resets the timers +summary_callback = SummaryCallback() + +# The AnalysisCallback allows to analyse the solution in regular intervals and prints the results +analysis_callback = AnalysisCallback(semi, interval = 1) + +# The SaveSolutionCallback allows to save the solution to a file in regular intervals +save_solution = SaveSolutionCallback(interval = 100, + solution_variables = cons2prim) + +# The StepsizeCallback handles the re-calculation of the maximum Δt after each time step +stepsize_callback = StepsizeCallback(cfl = 1.6) + +# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver +callbacks = CallbackSet(summary_callback, analysis_callback, save_solution) + +############################################################################### +# run the simulation + +# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks +sol = solve(ode, RK4(); + dt = 0.01, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, adaptive = false); \ No newline at end of file diff --git a/examples/out/mesh.h5 b/examples/out/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..73de286ae3f89e0bd016fac85c02cc3a14145f10 GIT binary patch literal 36832 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 ECk3#R0RR91 literal 0 HcmV?d00001 diff --git a/examples/out/solution_000000000.h5 b/examples/out/solution_000000000.h5 new file mode 100644 index 0000000000000000000000000000000000000000..1a7d08663e4f8983bd7098c866c9963be0cef186 GIT binary patch literal 34816 zcmeI*TZ~>+6$kJ$Q!YbWLjhxIV+7-aO+ccE;sbK1PHUrrPzsSKwp03Ht8IbK2qBsP zAyK>sMFo8D0hFpii6K!EW5gJPLLgDO$SngR3KTm~WQY)PzVGbc46NzoOli+-wPzl> zr~mU`d#%0KI(x0N&t<-_a&X0K<}aCFbbkg0iv5a3ybdN1g#}}pkkC;~h8xn8zs^!bOi2k)ntZnx38Cbb|*(u#A_(+C8y*LO!lw2U})>E2f(0L$}J$*+0@zG*)pc zH9uXw!y}#ZcIgn>x>g)mS(41@ODkqyUjinAqxX~Ac@xLGM|L%$E^q(tm?zr){{CJE z1F64xeQ5%U;*u`U&!GwKl5c(USsNA>OM8d9^Vf^hEkhIY*A3C`iO}nEq8;u9XOEcT zy83<3|Lvd57&3vj>bn~atmq;Kn6E{B3nl`28yNC-F;OxVCTc%}-C_UwUBhhS%M@a~l7l#TS2a z@Z@L9bpzL&`|JLHPUFL$z2m!Azhztfae5Zq_3wioxboSO-1%!B{pO{|KR2lde$yFC z&V1~v&y^qj;R_!-bieUweE6x?-oA6m`te%(n%2*52mkv0CtrE-=y=I) zJS`lL92^f$uNIC+4z6D~o)(Tr4vq(>x9&JOekCVPVt?X<-y$ErGo63A3xRZOZ4753j1J9n;p+7@tkYU+($Otv|Q_ z>0g`9r!S}TM%?VJ_`5sRmFrSmia&a0IxfzSde_~D{;~6PN$x$JTdw%v;6KV3&)0wB zwENCH_NnsJ&yN1|$Co`hjSs*6^wnp4e)RD&xBfVuXrFQR9rW`T@BGU4lHE_NxZrz# z`0(E+#|a<2qwmNI&;DC^!j9XH_{_ilI*kusvhG*6-}sY9OaABQxSqh9T7S$xKSzJU zoAy6FbFDwO|8wgXx8ga*Cw%+q{oCJv_hY5FeZ#Wj{`BJK{xTWo@NciW?WA`+@<{oC z9}TRyfBfNTeE3;6pR@S)$30woel)G0-NqB`gRi*a#-$Hl_DIR@!E63J{NC$EC&vk2 z|Khh!c+=X^a`ErBT)1TM=rlgOs{2OU{Gav#)S0oKgf~@x=3aku>u=Zp?h3r4l;{83 z^1r$;=705CtQTE>sPpRlTX&qEnesn9^4P1b|7ObnP3vcOF8}A&-{$|S4wvWWI{&x+ zudV~td2?NV=C1#8>sPm`XJdT|zklVrdx}!MI#u6B{sW0ePMwPfr&kNdBL{CvKRxu) z$1b?K9&Vk8eAfxqlgNkjyB4lra&Y~^>5Y7LvODtO#$9)uo~GtMw|?_rUW}JraPtZ` z?~%_>{1*9ee$TDH&OYP3DqYvJ`^2=r702^r+9$A{M?PHLkz0SAea5*W?d!37RodT- z<0;ZUp?Wg%;g#RV$~OPE`M^yS5IWOSW6}WXL@~u2Py7bQhg)~Fa6EEw{le*u{MP?fooar>xwwa$$GYR>%quzb9{b}bev5oKzvtFp zXP?bCANlag?_+8If9iTF##7VrmwWzm z>(A}~-1_U{Q=I=G-Paelo>z_WY@hg^^t?gj!|glg)?a6zaeDri-JVO0bbqhhgW`ozRmyXIS_SbtdHSM)t|Fnf0x(n|7=Uov+eHw&usNKRe$Er zzq$42UVmrn|EBgIU+w(6?;rE^k?A>6b&>hShg#wtq-LtL#9!&3F$&1D*kHY00 z`qi0nes)*??$)1m_OZLo|JD0nF`w_9{6F>nU-ZAYm~H&E{(t5Bht4x~T=ZAnadJ)7 zf4TL?c#id{I@fzu)q3^(~Q6$0G;FgVU>pFoboEW z<>@#cd0O6%e0b&e_Wr;6-+iI>`M>JD8TUo(hq$i@cb~}q2;6;2_l@BA@GAc5-%lae z-v4j!|F_S7PMt5#JLiY<%z5g(h2z8R`#2Asm$5&%^E&ny`Maw>_80AAcT@YXx%Kmd z`~32dyaaD*|F!jh^&Y4=o9p7qf{i*Bi zi_)X6hpYP|e|PtPXB&S_tv}W|@f_z9-qii~-1_<7by@T$e762~ooJsw#tYnaC;j4V zuJza1C(d2hv)grl9FKhh`v#E@cio>`f1Q2CX=W5HihOwG_xAq(zFz;e z>;Jy}{8#J$ecS)?zdEDM|J8SE<>jX94|?SJn9t$O=KuEoKR?HM65dq(ncM%l_1D#> z>Rk6#)vfASEgX*=91l*f7LG>_u3tEw7LG>_jt8f=?l?JhJvr+{?9V!3-H3cRziZ+8 zB?s3poZiT1C%YpbZrpXp=`pY5^rMC2k%QyG>D9vV$iejs$J4^`$iea8^wu3GXI{yf z_t+ml@mu7>`8~J(I{S>%bv?V?7mwqyPFuGlAMU<*ZvA!k8K-?6cB|9kc%`{>`nQ|HZL*7ngA7HQae0`PK>RM&!et_qp}g z*=L;ARdySP7LG>_jt8e#3&$e|*DoAT3&$e|$Ai;bcbpu*lH>Q-pEwaWkq_s0EnL6k z;QEEr8~N;HcjUv3yY4tW=9Qd&v~WCfa6CA@S~wm#xPIYyS~wm#I3Aqdy5r=`D>?HX z`{O5mi+ni0=hk0mpK-SNzxum6F`vtuaCusuhs)FO%J1_3)brFao|=xo*8kPtK~m>M zf5Mxp|EvS_%(ecy_!PI^>le4jr|`&kI zV)x_e`~SuXcb|S)`aT+bd*a9ETmM)6&!02-pP%dI_tpA;Z|SeIkDlm%{xnX0=6`;M zAq$J2Y?x%KnIO!mP&SIKVAUB>ZvPSbOn zkq@u@?t7|j{#R$l`WW6+{h53H&8EY+O_J3~ub@iz_ zced~U;gM74s(az|YTyDFC*OL<`u|MmCc#3@Z>(k%=YyDrn z|6?A_H^0F76^^HcNkRi5Nlt_$36UX1na2zblq9JnNhKj9$&@6ORC1b9gd|Ba zC38YZlJwt?Yq;5{LH@7j-Rt>fI+TFx5k87$xs=U^cJu(LC; zF!28M$AACz=bwKVBL4o&fBpAAU*Pc1N5+3X{_|xFSxkR_f{}rTf&885KY!2r&-a&N z{`(Vd|9qW=xxPO6%)j6N-;e*i?EnAp|M3VI>g$-25Lo{c2ljtHzWnF>{PUlGoi+03 zzrOh2PyR1H{(D~IS^xef|9)RChBbeEf|-Gpfs28ifzijw-8+DR7eCkEKbrP`{V4y} zPsqh!_|NM&@P&Atv){qJ2i*7j1TYBjGB7O0U;g{QlCisw^IrcQj(ffK`s+9ya&{zN zrvJ~EE9?FJ^ZfVE!T$Hp;k(}}$jRCDKmH{D{69xt`QNW&`{(DkKeX5XKfi&0f1v;S zb)5gc&e_Y^+u7&9e}3)1@8-XG|GaN+=KweR13|vdf4y%Kvwtxb{?5+Z@V5l_KYq^t z`8pSOufJc%_CH=nzT+x4)xTbb*Qx*Y2WEzO41y%i2i(1#8Th2A|B^?AlR@PVBJwZx z@7Ik{|GxfTeVPA$z0-mJ$5)S4`ANL+%ccJNea`*kU7jE_uAOn-d?_J6(~Gvhx2U|a!Q|BS)0{kMP&G#K(ZY4(DHA_|Lii`_KRT ze>448#rU@p{QL3m?@dm_zdr@}4C}w~;$`H-L3ZD}&&xT$UMXVU|Nck$fAx2$|0VKq zFo}yUTh1c!A&HMJI#S=Ib5xk#y*2YL^D;4-W9ZWR-Fp^Nc|IjNWA_$QE2^^;3nrFO zGr{SHd#=h*fr&q_d2ZyVCv-PUdE|Gb0G2nQ_RqBjHETqFkIj)47 zY+@e(M_2iz$K1>^YW5F*d2sG>D&(lhWBomH)Xw+DHND`p7l&BxauK074$2oQbc@j8 zoS!oCYDMT3^3%rqz!AvoyP(^lM#p!z-?VLCN6#Ktj;vp#P9HjWGxI$7MHjYWXpu0IBTmNE0C&EWf<@7Op2exS$vQQj~ta(Z&R9H zCql>jyQ;bD7ok;KJ_IBi3DZw5Z9IKzy%62{T;?^iq&l6?c3&}4NS$U`ktJ{LvyN^W zR(Mg6qegGaNc`*we)5+=rZMo1Zg1lueD$F_GK4=Ms$ay@Re>F9LofM&g@&zPrT1wo{@KiuVa1hn;H1J8nF-V zfq(yQ%$=P}rRj111^4BCNYTNcT-NF9WB1eirePK5J?9PhFO3l}dE7c%-};_}O*i*(<=WD!4eX34B2VDVdevPoI0N zbOL;9+vE0x|3py4hVaKMc^h|tPfNBv$OM07&EhR$;0IQOYwLs0eL7f(20w(sCj2S* zd#BD+%7MRcTk#PI@Pk#@Lsh_+*($XrOmQ*2vFYju7oSD+&Xs%#GXr8YZ$T@wrMU?G zKz+gV^C}st@|U6M&6P{3vS*4PY8OgT4f%1`o4zchYD4qCUv1&0a~57bwjqy$PNb#n zhxRbjERW;z?(+UF*&bD!!vGF{`RMGH7pv(L9A)wP-{k0;->T=1n#<4^B741@q5p)6 zfGIhDYjRtT_d|cp18**-LI25#uozD0pOpLHur2g=8}3yj`j_`k)qh1?8duKor$GOK zcWaKhL4O05gmc%R|GngD33C2QvjRd{aQ;%O^Q0r7|DU|!-4@WFq0}rXA8~p7=HvrY z#NSqqxl|tU7iy5WNaD}Hf1-R1;{Q%CZXg_-)L~aC6918lze7m;Pk%nO$O7@txlSblyeYubYiGMe9ml!$c3_^lp@`!&zSSACB{{r*p!>Wi&+>P}~ z*5C_FCD;)CS7G=)dlA z@Q!2PeCcD%%fi@JZMx4cA+k?YUc=T5D6H+br3Ga1^)*lqin zeo306uKrfz02lqisqzrlvayoJQr@vF@TWBEs~y2N)bf@#1HWsr9N%*A-)UP|C4=8_ zcK-wo{=s)QRmZ@0iR}Co1O6&zdzC2gwKmsR)`HJsd?))k_%rIA`TRYdT1EQX>ngy% z#K(Ax@MoJgrq+Ug$s$+F3jCqQqhD{eve7L=r$XpL2KqJkeX&i>pG#bN{S)I-o3tty zS&J$1uuxua9(($~AJ;l1R&^*vXso3E=Bv>gg?*bMIy#J}y<*r8Iy-}vFDf)T`jHMKzS3gUnK z_HGSl#D9FbUhNyipI2GFCm!)HZ#P}v5B(o3lwH+=_{SvN@;HI`KWynUZbJOe*fsgp z%8ZpX$A~N31i!S%`q5tSmzx>;?Et@7@V62N_`!`^=f!}}^V&?R9DF_B_h*N}j|@;+ z9Sy$xydpny@MWIU%9u=3&9~+m%MRkdZe+jB& zqEGMlXV6w%K&vQht%=GPrsHx1mbUC(NVBTlm@m{fkGej{!MR{B2Q}jnS$!;!mr~y? zW;3nHPbF7K2C*jKeV&?*;`UfZy?I>fd+nwoC6v$dWO(NqN>S>{c8$a)t%jR1K33o} zT-bZ=F8IfeU6VKlzLMFW!zX~<2|aBMQfisIe)r4-p`gp|A(7fW!pA|E8Y9_Ftg?3|pWUIe#^8J}Q#)HxTcWN%D`}t&RRn&_9?f;n z|2OoP5b?b-4gEXXQWhn}H)$2Wx;o*B_%FOVFC`Q4FYWSNdkArP&+yud#J{KQlZ`&& zA0y(p?=0fK;^(wM6XNgiVJH0u9PMi&wE~F0&)JOHAjJQZ`{If3h=26L?{C-<|EJTD z%h(bBCkgTE(h-0079qKQ#DAKO?p_6c!@Qhd-rzUwx4D`IK0njGXZyhy&-Ynr5B_*5 z+j0Z&>q8D068=Gvc*2j2$i zf@b--uHy?lQf=g&6dU{W(UFI`-sKSeC0Jp2zap1mtcZ4X(w7tepx zaOTC>UT`j%c?IJ6iw?`I^1$;KT_w4HnA#&p$8awC(GJdnN31*W{6(=oES*y97NMA! z>$j!Wicrf-O>9o#efDnHvQfK3jrttIEV#RU9i_g$y1QeMI#rP*ER_R(>4#bF0r1mG z*lJFKA8PB&*9`vX(d6lF@Y65ct;F*uZSXK}F`hr^Ti46Hbip5>N1Z-^ztg#tDNvTN%-5}POf|d{?>tG+B*cLsO~o(VkU1$ zQ8hky7j!R_rg|1KkK`?prUI=Kbj87u`F^9$x>Alde)6mg&wq5epG5J5j~u<8epvUc zPJ~ipT;b%jUxYflUv&DWh!N_)MP2z+CF;K<^=MTwIt5$OVlZxh%B=aWAreX~xeze88NE=B#F@3Xcg3H6t|f{TaL ze|5VNrBT#h-v^N=FQESVyuM_A67|=q!Nt2C_18usdev>z-y!9-P2#A(Qg5%Ueuetm z;1l0`3ia10Qh)wC)ZYi%tAFdD{vKjgx6cRvu-tULkNI=)c7o5f zz2x$7@Ka=Zl|O=S_-JNuKlsgE*FMA{|JoJHpRPpyRi8AmUXA>_t0~&Z0r}VZT+U-P zp$iES%H}5b&{ypOS`s7#S zr6Zwwzavrq8@zi*-I0ISGZ|kDcMp%UHmdu86%Td$ma`bZ#TRAM!76@4Ir6e|sm7 zO*kVj*)E?=v_k$Z=#doPg8Um;yE!ld`B%awpq14B-H#j9$G}N#?g|h={`D_7&qDIA zsnws|zmR|ZwJ)cV{D0X(s%0MXFMG37KB>R#EPhWqk$)X-w(M2|Kl0kPt-;{8oJK<`zAM~Yk$-(|_;1uk z{tc0HjAKV$l5EIIc0&F&J=(=d@;~nrKUb1}Ps~O-z<;BKnK+jpK>lUQJhYwU|BxdJ zR$q{R<9SDvRv<6sU6Y_}k$)F6E?7wNe~aP6a8mz$tvDaUf1^fZ&$XS0{)QWRZr4D6 zJIlz=V$eTQrpkXK^w)Z4FsTLoPu&&&;RF5q4^H+bL4PlA%{Nz}|G7<8%ip8^2ihr| zu7v(ky1w4z{7Iag<{yME`Z*liETR7@h9k;W&|i_;`vK!h5h}a?r7#=f5>W2zSrONy z<+DuK;TYoYdrI(NGUA^);injcxbSSVu6ITJTPBqxHzWR5?|B1A{q>lv$R_bGsd{{l z3Gp{P@Y`Gn@n^MIBy?`MB;zs!0jhrz_F|hjNw51g&*xvC-EOwSddQQe;~wE zUKILwaO%(}z^|Xq%})S-PtY2ZBjAVa(qG{NzTzvhAaeik`JrA$_%a2KKia@o(a3%? zAN+_Z{*C1Rk+e%Xi13R`1G@fz&#u>5G6X)Wxp3eD@VnLfb|iz(*|cRJ;nzO2wBktS zqNaT~OW#9(huG0PUFhGcdpwr``ro(fNGJEd^wlP8r2g{jHcj1w{)(N8fUO3{$Ah1o=oa*ecp3{<DywA})2UfL!U+y>UzX|-ra*c6D@b~>*Tt)bAw+S65{E^$b-w6MNiNrd>ul&P4 z>IMD+@uVig-)jDOFX0hBl%8ro0UDutEJDoZrJ$gSuGn zZO3FY>+&|Li9os_gA0;m@SsRl3 z$7U1rui)#7XE51<|LARO8@YdYO6-0dIkBG`oSeQkEBLSUC0$P`QvXdx7MvSK z{lB;7p&I;ON}g)D?~M8{doptZ{wpOu@NU%&)c>k8145jV>J(Q-VeMJe|0M5{RQSJ? z#7@nCC#e6!ExCKUq5t@WRdH?5U&5rYkAnVHTu;}L{L^H#=smgr#q#eTB>CsbC3gA0 z?teoZ9VGvZ%}Vkfg8qC-QQAa*MgHG3(chN7KVKekd9q|vygBsWt(00uoriJTC9kRmb7dU{CBESQDM_4;y?P;z>~qJJ@6q(b!Xeymaf|D7r|N%-vmPNT(#D@6act!>#v z|Jj`^g(Uu6D{PF=f1tPyA*A5XvTPDQ2L6KQv6tGxuhASGLH~i)jM_Sn@a-H!Hxd26 zOxBr_^S3O|ksbh_W9HR-qQB-;zajj8O8?p1S;Bu@^z@EB_||QK%ZUE0j}IAHga7`i zraAn7D)+U@LT~85$So=KEA*ccy--f{&*0c+NAz#G=CP0HZ`yBCO!N;p8Cebgl~y;i z>iz=#J1XN;Q=z}l85LJo=+7OHY?}oAE#(~-r9%HMFV^iue})xqRcD}og!3jAOXxq= ztuk2%{kyMLG5dg@{9v2LDEPYZ!!O|fQ`VWM-;(>M){+$k!r(jj*Xxt}r>^xp^_$=~ z{>%=7pG*`ynSrERGRXgDb0ibPw@)Jb-{n7j(+<1T2x^%m2x~Y<}f&B?49xlUoNMc zE+*teEs>>`J&nJN6)Tk}m;NC}9q?;+4GXLU|5&!-6K(JtHXqAd4u0%# zuUr`TaVMT|9su8CCaT~(_{S=(ovgs`xh$c22mGxuZ#Sd=0AG#Ti2eiRe?E0@1NeXZ zjE`o4Z?k8fAzPi*0)diq3k*X40g zLJ`i+U-vLmT-UeqNAmvGnu~`U0*;R1yAVT ztaPgc{y#P2t=CTUSI|~^2LGSZQ%o~O|A~Im^tOteKb7c}`^fp5W?7aB{~taf%N)r+ z%2#&1MgNCVUwBlUoIgI-mHO$>Kh*l+v3WRuwrneGEnYjIe{PoKD13QJKjz|g z`2SQ+m7uc%;-7q{WScJH&!7(h2 z{Rdhwe8e36A4>Veq#w~g%q{x?(LZvb*<303ZllbB55RZW^SBiKCo0Uv>gXcy^=~Li zDS;moy~-j4`hT>gOwj+K-Y9Op0soz1^IM*w1O3Z9CU(I8r!(2@0`dGs%L&VQ;rWYx z_rd%)`akq6-^X`R&|m+)NEe>Js3z~l5xvlVc-V*O0rYpcD&)ot4u`{=SwrYAFPX=Q z=PzpI+)d^H=zqx|Lh>^Bw+AAZlk=BXwKa$l=P$diP{08E(+iJpc?Q0lU8W!5$4#nb z6TbUhqhqz;4|$od@&mtQqp!9O_-&OFUOnK~ruFJy27k7FHBqnicTPKZXoms?97v-ZgazLUwU@Y2R15oc~{5Hp@sCB%fDyv z{6+I}`Ax(BrzeeSnA7=K=nzxe*t-J1wN^{Sv%a1k*SbBJ9+lTyuEo&j&g=iVvxKEv z_}euz8Oo;SEEUr)NwvI8e*J8Ki?UjCQ16b+nAY=$cb4RUe@w-w#~J*lDP$bVz=6*D)0>o0$V4*zvicT zUb3gNMC|_KrZVtH2N>Q(g0J>tna2z8`R?8{IlpX7tHd=lJ-d~Sa;&p{__UCLa?ySE z$ISV&R+PZKYJ(e1B_l6Xtps^k=v^*9J&wE|FPYNKUY#j4rX~1o_qoh+Cdz+vx1vf{ zXUU~XhFgUO<0Y3qwSO~S!$^mSu=P##&ZEsfrHJK8j%g{cx6;aK_*s&o5+(RmQH0)O z=O4%#FGZKOSgx%`{XcAetAX4!JQfx3@kUf&ZAaUpn3h^?$fY@X{peKi~Gx z3dDchVqrN*e37sprqZ^k|4TmUp0Gsy|Gn76ybtwX?vKq*^#3VQ<_+FXsQ;6@%IL?a z{~jB)w2e^zV})P6pM(F?Ch*4TBaXULRn~`4e`mI@&*?(_<=fthE||%JDkXCEq89Vrsx|J7D^b_&=5+PmNE2FZ}kNR3G@J zC3$~F!H?5hRr?G4EgTNa$HA|DyP01Pe09MWv;IQ-)hBEHRAtJ zX9|w_g5O84X+r;>+Hjyno812#uJ3Ya2mguZnTxi_zdw?PNdKQ=4cI!2{wvkIw65kl z^6z<{U_Lf*YP|K&>_Yxcx+{M&75P`Gvx}9~U$sH*`Ekg4E$kx3-lx5&5_J z7xTRgUzssLHyPih<)ton+LhAo3r_Vn~Ui{uA>vRbGfw<%Va{nCiW6LA= zkBf4$o3p_$IO=?50r*}eTck+-7u&YXgWNxd4y7cM`=`qog8{jJBwwEDA@|Sx40hQR z@C}8%LejuLd64@RxqmbUcb*{mUvQ79J-L6@`+t1%2>c8^qXvECUyD`BoFxCw8+`MK zT1i8H00mYSA!hPCff5i~O7O{hS^8|CGt1CrPW2m*VFq4Q~Tq|D>C= zBKT2zr)zb<-xOAP%^R7~f1~$|G|eORfAz`J7v3QM+A=7a zT|@qDT+V%KJ@RjDF-OxEW-B|I_tng{sN<<2b9I zPW;D#QEw_A`qztmeTe=)HCZjN3H^WSfgjU_0#g4E=6wHvbMEDpaEILgBn{7HlKbDh zZ#%Tp5tnYZ+8B4l|LTCe=5oYeT>Y0R=07Nd(0o_)-zlzBK?5hjIoadh;)nPPMqj@| z>Oc3>7YSyF|Jxg@ZL$#mq_z962_ybf`>uJB`d@fg{%Qf@Z~3k!`87ECOeb?Ne?c)7 z{@R89KlMOw{;($EQdM3xNBFt+te=*GUn71u*%161llj}E!Iv6siXivTw|-%7N&UC} zAoGiyzeKj*XH39nT@WyM0sJE;1-Z%j^Y4_tMb4l1{3Pit@HalK7U~9nMD+{9Qt+cQ zeI7`I-<#_%wgLRKVNWhA=r5Cy{c%6^543bSFbVx-PfNw^fc}yTzH+~U{^LsTdx`!( z)}G@)|CNqZKEwGD`iDp*R}?}2))j&4(SM~3G81jkf2CSQClud6|DBfp(QOqF*FiaXg>1#|{0|C!pETRsE-mo{?ySc(2Wy{D^sE&BiT&OM`nQQ*%VwK{JLe#7tD>N-;YTgILi zgI_T0%eM{nKdEr1CmzY;5hN1sY8*dCXnn3+`<817_x@b(xYv_LbLDc`4{I_?1qW4$%+nk`kc1HV_-_ZZmhU6I==r52N98R7;roJwiCC?vbzE12U|D3LIy-oDb z&|X)P3H|*9>T}hh|A_lK$6@GS|5hXw^B-EgEB2L5Lw|!I%_ZBRKZEe4`#R9SbldEo zlhD7Mx$4gF~PkB|0CgLA%+f@4z@qg+k$8U-Ff0oZ>T!Z+B>k91qiukLHZ$9CN_?y#} zE#DFU{CjMvjEKL)j|uN^@OQnuREGHjD(2WjCCr~t-uv$@n*pC^*+rEL;P=MWY^VUg z`p~kvLGa_>$#jwXU&CkBdph99dGK6n2mfW3y#FTfnNq8SS;5zS8+N$^{IO>`?gzl% znA&rD9DMZ((Xld|znHJ#agEU5V$O>Z{yP=*a_d6{=>0{(?Db zJx)Y_woBcYp}*}Srp-yv-}{vMm5KJwlI?GDYa5{dnYylZI?zAY=YA^ue_FzJEkn7) znAYt5dncu!|Lt{Ukz6Z9Xq8oA=0Bi++PM;oV(?YNwNzh#pP!YIu^jxGI*}`9!Iv66 zadjK`d7Iz=a08#yx9!GN@Du4@nTg;Bm+$kG=;$mtn7R6BE%=ki(udLir_*;xxeS4S z(m(p*1@J9a+gQniKfM2OItTa;diS>e2ES%y5J%6|rjmjrp#=E9CHW%5kKw=5KD9}5 z;h0Np3HqUMu#$IcQCb z$HVYn=_chOHu$f!wW@9Pd)#vyJGFoEcr2rLS8V@={y)u|V*3OBKh2Tskii?@RN~t^ zmKzHGmgl!Ru7UqugrzA4e9`XpGsnSSoi4Or7kn4{9Eo$_+a;E6BK#+@oGpvMmpHss z6a9ZWzvIR`^#AFo5d{VK&oo2lr}H1cSEEl|27F=`P*ZLy`A4MfBUHP^G^7$RHL>|E&Nw1yFzNa z6XtI{Djpk|*9p)CoUwd^n7~Oa=Zh7T>Djghzs;Dxt$)5R z5dB|zq;c zeTN%eN&Fe4zK@{)L&b10T^2+9*WCXq#)J6#-zu6HjQHpD#l@iiLmLh2Zy!YbBkj)V z{}um5`#+NSOI8_N=t2C=rDyBwp?{O>MOJt4AIP3e#rz3VyqI&L_tpEG!2hRR`L;HZ^H&t^KZp4fy6U0MDz*eE z+Mp)o3Htx^ggpOrD)<>0g5HFmRi;))gOk|hGy4(xFZitT4gM?b;d-=x7WxOAN}t*V z{TFWQ>L>a?l}`31`d@fIR))Sf<<2vh3ICs7i7aIX{ll(u+#&imZF(f92>ti1SGl|s z`m40|7{mXk)6DialKJcF5t0Q=(0@+scXK27yz4Rx$ozM0b}a*${|>)C7c~QZw`I!2 zPViHuJBJ8gq_x+Y@YmY1$PvC>((67~@I{ufPZIthe`5sUk5q&mPyqkUql~FN;9u4h ztRnN@m+PO65&oQ7?P0<%W|8er!2Gp3v$Q4rUs}&=N(KHaJ*7A2^$GLWTA4TV$o#c_ zx#M~=e{H^5rw-45RQP^79r(Z0_)=5JQE+ag*tc6_{(2{0{x>pz{blRbATs~$yKXoW z{x6;Q{Ob|;ue6Kp$prYXbSuO3&PL27>#5$%N&^4lr5gcc{(M~Xgc6xQXLQ*T4F8wr zS1(-&|DReqo>oZsMgnJ)37>&~hY^`S?_G9D5&Z|c<-l5Y_`mc6b_Z|x|Fpm5l2^Il zkB&xFIfCEw)7%68Gd)3d?j-Z)!82Mm=>O9zc1ULL#r*9hGrc`z{yJ;;bZ{@`Z-4UK zUVRJmw;5ZxSMh?=XE^o)&tKFhmHU2V{#J$aN)4I6mhH5u%&rrm-^ch&llf~ECx^rE z-)NQ8QwiCazZLb^^k)(rQJ$0g&td*HX29(pnZNebh+UC~xzzFpf|rk@{>ueW9$u*b z&TMP9PNDv{RUKAvLH)1z=EeO6^`D2)^8F3e|FL^cKS=#oOAvg~g8J{$$r|?p^?!0& zeu)a||9;*;tufSp&Gus564d`A4Yvh`QUBx5NhVmJ{wwL1rfZ`9t3)^5IDz_ayNj;N zMg3Ll&B?Yy{k27(EuvTsn01V7N`(c zMA+`D;5(YWx~dQU^slwdpTT!bKj|$7zTszSTsNkgu$iE%?R!Ut*{g-ddU-kj{SEz82!$#y^TWV5;)c-ZV!mO4e|JtX7 zrST#EO68vU%#ZxL(dXoGl7Dk$YE6T|zqJ0EpY%1pQw+;%Yd@XYe2A9lue# za7-&etzAGG{D*s6*UtyPgwbXh2l6t1nr){~9PA~JNj=_VT@QR`frrZfhF5X{qKk${NM)8cnJGF^#AEe zRkv~U|7o^uzw6L{rQ=;w#XOLIFAYnJll(83oB@n;v}fIhGSQE0)N&@J zqj#bIQr;fT!_fb3@m|eA=s)|yUTO{WPg6Zz9pdj*GW-?uf3*D{OEUjSKg)P;n_!-2Ap%#s?dCK@OdWJ+a3m=Ylo89IQVvt_Jyc|U$K3)?Qi#G^bdcF z`dsiuM}Fp!`hRJ}vYgyA4tXr9=!5=IlA~#A(0>OX=V=z`KVHk4>J9xbJdPG3^;gdL zjt!~5PuealKwq3PsegMs9QvDm)5MHb*Q9FsVJ`BU0td+c4zpU^fPN(Xm= zzxqYD)>H6(*9PA=1b=*Y=NSf^zp!7t)M>oW2g~pIPon-tSLtx0|4wVLy&pjTpB|at zeF6R}#oMEnPwKD9n^m)9|I7SJ%vZ916|}Bm*LQGApWP?(e{}AK`ZJ{d9(YqcPWG>! zWJ=tz1joTEq=)QZDQ5O%k^0ZI>pt;+>7s4nW98se%MSX&|D{t`<@bhye|}Z1F}Z&* z6|Hh6_5a3lm)*1A=NoJ~8UlXJw2}<`U&<}gg}Wbo^{kIl@So}K^B$I~!QZojVK@9= zn)~J9MaRIme{85g>VM*muZz%srj6atiM4`nX#QNy0rkJcO!PY0zp;DN;6e6pJmZgu zllouZB7K7nrZ#MfPtFXy~?*{hR9t zgU^%wE4#D$Qe^+CNyz#>*}q|RH#I^3jTSbucuDI2@8;vo{m?%$A!;e+Pw8d+M;B>9 z|0P>?zGX#RzKDp=Vg8iL`1w1W{R)Ea{n?gq=m`;-$0P5Ai00B zXldsW{f$exB+31+6Mnvk zU@qDJThbMsP55aJZ2dFfFI5oiA^U#@BJaJ({qx4zZxv+!ui4eaf$aZ@$|vZN{XYZ0 z>?pGTXXnKip`fssF1_0qLiYa-M7;_p`(M^)?(ZP`UtU{X6v+PHNWsoR`2X~kpQCML z|BkQk%`n;jJ8da6SBU+qFE5mI(Eq2yKF((%`+q72f3GL|fAVWCtW(EcQgtI=4B7t+ zVfw~H_Rp&H0^gJUv#RLA#fsn;d9pqv`+uoZDUO6MY@)A5_*~J~D#`xWVCFg+{xcoN z<8DCsW1hh?gs-(rGzIeq^p%~FN@V}9a@8MZvj0`qu(X=&pNWfQ+#>sbnhL^agE4=5 z+Qqle4fD4SnOp40{B6mdBO2zIzkS;CaC;TzZ`1O>JCgmI9sLHeWdCM_SwoEM-_$HP zX`X=j+kn{cZnFP3Ts)>Ri1}M(Me0fs@9&b;p(O>WU9WA2&&5Y7| za{erj9>~ao{_=-cB%}XB3)Tl!6a544UMVN~8>dKQV*Z0Rt&Mv@&R@F6SQ-3(x>+RQ zBsqUQ=jGLi{(7hOTM_+BS6^o$`hQ!rL2NbRufBBsU?@0o)0#_2{68$sd`#lcc&|W; z#Q$uR|cgjOkE}M?_S(z zzaH^7w;#_U`g6bdkwf5dGs8v9=Ta>ns*ek^R%6l=e6pe8sk9G&z4tk(uh`{H0n3?CG*!a3!Yn-LH|RyC#EK$Kb@`o&ItN5eBiuq0R3f` zFmLmK{zazEBSGLh9}8(D`=@SEmo&-#A@7LQ7~xmmYi1_mCbKCiCB~gkPRC$NV*aqUuAk|Ce{W_$Jx^+P?6O5!wH%++rz2 z_W#sAeVRLu`Ri4`bgcq0f6b+`?rJ0EuWRE>2cs~5oe{XLKpykgU1xWB)?)seyXN`{ zvj640V)H}?=C4iSuLS5}{#yTjp2B_b1I@WU?*o61&t);$|69~|HDEFLlgtJDWd5AR zd(CyS|HrrSNI9ARHgOHBCHr5y#AG*;`SU+(Su|gPZ(U$E{*>?^_H!wM@9>^0ry2aE zHzm7IgC8fNDD^yh?Nq&@oo4T%*S$oyy3Hj7_m{6T>}Z{<4^r zJCMxZ2`y+aBJ-Dlt^@pJ{xd%I_#+!|mI{ATA@g_Q&$m-#{_o17!Cz$lv*?(1UL5%9 zp3eKp{9(A^y_aPE^m2{y6!!nAcCK?-Wd3ujkjo+5Kj;LF^~VW6HBI?S@s77(tjUi+Vc|ipGwiF`Az2kmLyeOA^rFL_4^q~|NYS3if3g0YV56A zVrHEP)y4E}9_lZpJ3n%O%zug|d>kh8SFP2rm(GEc9^A4R`Ij;terb#PONG4=5hwk3 z`;xO2zTi)3SZyJENy~x9gwGY{X@UDEd``w}!rxFeqdeErf*`u}Rj-pCb!FP*lk zg3RC5+%w!j=I`RqbN(Xpcj?cPby0sQZ4Wg^(*KPsn~g{QrN@?S<3RqUS+aWONdMjT ztmI?lUn*GRlslQf3K0^XCH+^K z{;Rl_a6g&<8a4a0n#>=JYS|nj^9SE*E+@-_pG+Sh^@n~^u8~OiQQ1+O2!A?AB%jP5 z>%pWiXNV={D z-}`d?Koa~n+nWJ0`{2J_lJjW(1OKgl`b!}8|0!4H2MbC6UsmF#1L^;IMtr|R`oHoz z?NSZ!-*`{H(!CDD~@L6hpcH{m*2l7_?od^G7>d$Xv{*>u!vOSqU)#z7xjNd;%9qiy!ehYru z{FFIq@aH}RewAkh?aB=^!M|AFhJ%{1bWX8;r9i$TYM4^!8bWnW=G~vmA_krk^XPlBKzz4;Ey_T zJ{tl5`of9#Wd0!j>4_N%e63G8XG#CpberVPNcgY!FEDhG`MZ2&?|G#Ey7+5r7Yq9D zdsG=$UxfeapM7Ex>Hm7A)83^2AK3b6KlcA=nJ=7Mb>Y8mluWE^f&Z$>Cf^$X|MiPi zOf%`fmT%F{{R02hVDmGPgYaKF=A6C{!haQ??-2h5{_BKYYfuRIH>RImCH-fP+v+-` z|12ffH8}?VSNCJt$SLr7t68^Jf^YY-goX5fnZCB9VE>;M*T^qh0REQ|TX*9BF1v$A z3-JB551K6ozewkV+aK_U{C5}-|2fItYdI7A=gCD8Y$f13m?ve|!GASp`LV02kbz3S zrj;oV|4pKaC+`aUw@)WLbxHr%seR)y;=j%9?Vlk1*R47e*OTGDxkX&D=!5@S8X>)t z^xuqD?$#y#+r_c^R^tB_n9o-YNB>olb9poIUzx^gzYzcRr46I!%vCAcbcXp^8uZ^| z^~ZtaAC0NUf1SVgvi%xl{-kyv^9;#9rnj?tiT*;|&sfO$%d37CLe8HICy(k4=r8E6 zGfnhQxnEL9^gr7vnM~%7c8pzSV!}DkXyWO_{y%m4>`0F;^w-`q*B1f(Bbf?4n~;xFeMF+k=&qU)!>6aDX+?U%*=9i3gK%&`UW zPYe&-(Tey7sJ&`)L;Ouk+19N`{700RN|FA%MQ>sS>A!pajFujQ{&{CUA7z98U%UCo z(?IakkIu!ogYRqJzi%`6liN8i{(=5hKFoUwztK8=9_c@zj|r*atit<oz0j((V3jMkNtmoGP(RY_Ww${81`Jg0e*cQ z)0J58)3$0`TnArs$;l+_f0Y>OL>(jZC$bSQ@_NC)G&Uv54StW+Hw}I810QF9Vg^6T zBUENSeDQI)$D1!-X)39A(H#hf|2odiSsxGo)pdP;+BW!7Y7VmV%;CRUAF6m}4F5IU z+>_%p{MV-6>ekr5qHG6Mj$;3hUeam#p7^gP7LU0fg8w=ynSOx*z7(sDi{T_VNtMw< ztnhzL%5(a$|4o-JSkC_r{;Qo1oos^sujHq!4!Aw64w@L3K=*q#8tdsKTO4E!Xn zeIJPbufB2jH{$=#W{VWHgD*R@l~ES{bCJ^dd-(kWbWV}*e$sz-ci*Ex<`1+DibLAL zH~%Q*E&#ruc}+X<{}n|J27U&gbuiSP`2U&lCI-a+_gQ7~XEXe_)Fa;qdEiT#>qU5y z{%_UopV7pBQ_SuwBmVy$@h<_NuF6ot-*iNX|9{u;XB6>&C6B((A^zK0FZPp5;Y%G= z7h6mE|AvwazL5U^ioCRN+`nl}q7<`fJP!q)7i?{r6zADfE9Ld;eQJ z&R=X|V2&>IpR*B)c8C5wF+3MZ{`sS=zYf3ufqL}y+-NlP-zqb)qXzmfyf)TP@=tXd z(}y3>rMt&k)CKzcolgojf&QYwdL<0dzgK#wgY=)4X)lnGhX2nxqc7oz_y@YS^<^Rc z2Bi_Bml6Mg_b0C%K>TBP>cvR>`47GSMf(4GR%VUZ|EHQBwsBn)XwOf8UYsb90D)M*6AsT!{aOMf$xI#9z?BLg@?QAGLnX?#<9&P-(E3%pVl( zS(|+We2En;Cy#<(d`Yjt8~mvzx)A$+RM3*9P1ygV>Urh0u>Vi_(;*Wa;4f_y5XJr{ z-7qzL8T+4f;owjw_W$V%2~t61{vazmQ-bg-wr(9F{r@{!eiGRKr?pz2JtzMA{V{`} zPUx@B>C3+X`nxkYS7HB;W;v&K-4XgLyt+>I?F?7|NFY_u@{*?aI%xxL;U~XP4R{1;CtSPot*$*c|y;N`2R*lMuDXNA6_Gzw-5Xh zC9~Va|7R+<|AF~$I@XxgYbE$HX9Q2!fX~M>BS6mIjF;jv;{WU2be8%Ber#T&Jn?^x z-_i5P?_WC_ATWIx{%c@Vg)RC0YsTgr3%`L=$XnV#{P&5@KlOP2q8{-tnZ^DcC8J<* zYzCalTbKHG!hdCN;cLhIH!USd>)wa|`sqx9*G`;sDSr_u%zxAUzs^Tv{+qtIzE+C( zzf}fj#)`qW7_(*|{{PY-vt8K#r~Pi%C3b@!d??S2^jVS=hI_8pP5l2ft@GYw{(z+>;xXZ?ziVJ6{{OH{$u&RlWy^wJlixqroAvn-@t-7`!-}He1!!0{~ z*3rd&yN+Nli572(iF<hc~GIJp;QotU>*^`SzfA9QD8Z+tb2i-rrjKuTQg({(sr& zG#P8u|BwNhrVXh7tu`OeCZhhA=MOJ*M*S`Mb3vH&-(TkY_Zg!8u4$WgZb$tUzds&8 z`v3BhgZ-rc{;?zFO)u(iWj*_4Qh!gKJW@N&|66OHB3JYf>TkNN#?(|#xz@X7RgJBv zzoO^G{eGhUGEBKfJE8vG>6rY^hWpoTrjdLN)L+{g(*#@a=RYV5^Z4Kd;M`q7?AQG#E}wq5iww=Q-F9{#LtHO!guW`ukk?YfHo#?gY4tl$qnHnN5P zM4dSLPH8RpS{)gO-+({6xKrE({OP_5lilFYKawkY0sPu+;u84%FI3o=-!@(Fd3Q(*GZM&2wfM z^6!sok2KPMPqy)!CjEE8wyY%5|Ib)V#gX|xi_nF6{K&ulfvVDp$iJ@}R`-+nyZ8`? z2R~7Ns`jfkc!6(yW#|Kb{{Vd}tuQ79{HHq?=$!+Ze@ zvc0|gq&)Z;^&6LQf?suXD1h{z#|qdw$o$ui@Ih`ee-Pd;vs4iL4T?P562R{ce|TUB z{2B-2!p{td1e` ze^uG%?~(p%(nyqs5cD@*VY;jc`kS~|cj5OxY0dtsj!{MZU$$gnx&ic`ik?eyg#M=v zvY#RIe``2}lW#-+-p-~|XHoypcD6XYhW-n(7tJH{pCT>puYW=R0^ji?#W;VbD^sQP zaQ>b@{_u_5|LBoVfkb~Nz9I47h`;mT@r4eEzoE_l>F7$_vHH4b#)MRoq!OYeNhPUp zLkamQG9@Vzk|afu$W$_vBtw~!5R!x>xkyrm3WbQ0R5TzViEr)iFIdle_IdU?@7`;z zYr&g|^EY|!SQdkGG3wfv?Lqt>cW*25pO~A*OM0pPwJpud8*%<;WM4JU#QB>xZ>*yF z|JXL}K>YtA-Dwx`f6XP&S7SK;wm6UP@ZYmBJ-e^c{-1B)lNp`A&+!#H)3N_|%=k1N z`9Gzui_WY`1wMcM+bAF4PiGr%+5^9DbJ8N>|2^AXi-`Ys{kAuu`se%fo#z66{FM44 z(*IrN$`mC1-@%Y)Zp8muy=NnT0srNb$ZMoOh@Ic6O8jp)koJZ6f9#ZMOc8Ln8&w=T zQ2z&SJv-D;fBV<2Uon4WYifLCZBhUD|G3^0|93x=ctHH$Ju^uFzG!CRzysA|sQ=nW zBiD)lRec2Qi2sGg?tdo!b$y&-Zi4z-?Ogf^{%h9BFgl3zAI00PM>tS_v;Gw`LV#~j zEAB)1X>KxE>cHQz>ciMD@HIl5watMae85_j_qtqIa(c{%^MG zW2rUi54!HHouK`5YR>5+m4*^D;s0i1S8Yk9{afH_w|?5ci7Y=IP5a*zzxdRC@PDO=wK45q z=N%5|r~T`c^Mft4|4rZu$5xRez$N9F=|BtlWvuvsVc)!i- z#r&V`FR-hi`)BuFd=35oNX%N`MEc|Q&-YJJ{_nza)o{{(j{D}8kp8oY>$52z&gG)NEBycL;m#S#w0{qI`lgHa?=x&A*3tg`z-gx#I{!Xf z@7NE(nRYJi813KN+r_Mqzr=cdsC6LyW#z&i!vnxk=6SJ`_V1M(n@?Hc{7*=1Or!kW z_BVxbk-*QE`Xx;7&#@T0O46T*i7xIV{io+Grj_oWPvxjD)jx0Sq#D(q`|I7$q(5;g zH?1o7KN@M{i%3RK{NIb?C|u2EDPZGtZ`ke1AHmVT3^cljsCnTr55<7 zR~E-%{?6*u4;5hk&c0DpH6#5;z1GejnW+Cv<7b^z|L?cs-oby*NPN9pLHpOSd%MRe zfAx-~RygMG>=&h-4DDZ??@oJ#`78TeK*S33e>Ov7B7>LmSKn>lM*H_OtK1J#{db&_ zF@pb}ZEdibr2F@u!^65k;P?A29fbdjeKM`Io$eoJ)H16%z(2$L=P=#B3-_V51%C42 zhS`I_ujg%(&IdmK_MO)W-!##6JMDix(ii=_4gAP_|M9Q*o%ieqIx+uc-&{{Qu^sr{ zo1_{ufiJY@!nh;$uNQi4MrB99)78DqR_tG;7Ybfwuzxi!>Kvl|>ziKwuke2{DbcrQ zMqvLsv#pj3{x8Pm-QaoJzdG^RN5KEZu8+>n)y4kRNxncg7yH+R|DFif0EgSxES2`Z z%GY{sQU0nB)99pyy`)K)mYFf|-T4o6!GFf477B;z06*;T(Pgs0Z#!je>J5B@^rD@Z z|1xVeH(ta1m+2RKszUgxYF;lAfbSN+Dgg6mR%xQz6#EA@IYE2y9`JK>q?Jj3AgbaU zhWRsl?PZ`U=FjY0sp&5%|5Zkn*}fb5*AA`0ldjmm+7F2=9l-vT-?@1f<-ZOVR$Q#c z{x$cR$UoZuzg6hVp#86#{jR6&*uPpgY8=YI{`I&|!fti!U-O?F*P;Du(=CUvX6#?* zuKX&A`7isoufQJu8}>*-^cBqCSnD!vqrKR_Y8v>zC;f5nWx0CNAN`oAcaQGhX61CD z8>oMTw&6)Z)c;hVbS&wQ4v+Otr}~RG-twUPSI_Ni5C11yQ9h-V^hZIOqDrJcij^!# zp!;Xlx17QLiEW+k;!gUb)x$CAl>d8eZc+^CKPojX%k^;ndLeo)@L#eM7wW&kf63Y? zH!CaR{JZz~tqB5-T-q}O+P{aIt4q=T9Z!=0?0=ZfC&njoasCY(*9_7Azp9~hfcEba z87(nYIR6bEZi=LHYX2>8oAQ4(!qth7heE(|FAKZQVa|z`?%RK0tr2Jp0a^p~lrnxlcDgJ*kcU(qt&!hgUFQt#t{{PPH zTD8xpzxA1g^RfRamGd<(r2O5x%`-RB{(W_0?s9$9-=RP{3i@kSXq{wK81Q@b9@^6W z|H$5Xfq#H+^rfWB9Qf&DL%yUxSyA8CfcY;InE!7Z=D$qT6YYnT|E9ub8N~wMd!17( z{HJW&*8Trs{>wJ(e$s>dfzpY9@ymq&N7*`w^e3xiWNPUCeR&a<;stz8)9<4Bl)t94 z>MQi$Y_+?@4jb&>GX`#)r2JJM6XoGh?BCmY_j^(PYQooPMSa-6_iT6M^2PpL;#rK0 z2KMg}0S&8Kv44+#>UYE*`}gp2-MyLEzXu!L&mF@4-RDT=DfqwG>V$9K{$l?wrsr6c zjQzXh-M3@#pRs4l6i(s)Co6O{*K!;1?VH3p1%WSltsyWD_*eCh%^>{IV&Rn%Mux z7N$xmVE=D*Zk_Fn6>||%5_Sype@67FD6^2}kA6lAkpIIvr^FA_`)_x6-RL6lVoYqCJ|Kx8Ic_Hv(f$Xj7B;Z_hQWxz8|K6-fe{v4|>u({& z-2ncL99i|`EpQy|{Awn_zr*3f^{2qUhh9ni*o3~cZ9?z5)LANp(MVf%yOGwbJ$A-&s||{I=jD;%sgSd|978+kOK-@$P5N zlfZwTyS}Ox_^X@*& z5m6}LM(;mc|B|92^xtCn+67X;S=_9@#SHz|P*xx<75z8ZyP}icfBlnRr0dXs4`>`r zw?_YE4Q@ZZf&Sa@c}OA?{Wn%5fujpJ-4a^sqtJgdvinW+(0|WZCdH91?bVhWcH4ok zmbug!{%_VA!Z(n3qNUKPOrLBi0=`yo#nmss*LgIrVG;1V#LEO01HZ$xbPDOeeg$}R z??L|+$q9Jig8nO}b-;}DUo*GfD#8AZRo=g%|2g`vLTp$c@&Dvdloa*dQN!1R$Pw&q%fmce%e`1^@ z{PVx!T$H;EUlaeYdEar3-hXQ|Y88JwABv43Zk7guQr;QZr#(;DHwXCiEDV?A*GTP#E! zLUI1xc_CxO|9kwVR9?aPuZ@=FmBjf+d~*Mxf%9+hbxC}V^RMJG;C=v{FE<)Fk^jUl zDG+&r{X2Wcs4IFg&VSag+B@|9fi$^;)1g0MubVy3XMk@vFMKoczcp)A7Xthe?HCcd ze_wVVTSok^P$p??0erWY*-9+&e{%JaIl#A`KKK{;1MFpue_}6yuNXg5g}Sy_qGV%w;K3Lr-pAlME#d?uGZa+`t!u)=5v3Y$HqBcJz$Oc_dfFDsX+am z-`5@?{^hg}e?k1~6?T25rh?Faux@i--6#Id$QC-`i~2vC*32gX z9Dzouh1#gUP0w_D;{Vy(Q_GP5#Fpf(ews}9o)e{{KeT0!`2EKHlQ!g?<^cRZZGRUx z0Y6vw@2_OwTe|SB#Qc}>D%X5S`qL@V9&>yfZ{H?78z~@{Q zXVi=P*RG=X6!Ty9`E%23%zs%vyOwW(zz>YuFiH9QFQff0TZ4b~&))cI2L8QU61PGC z{Hv24sDBRp`{v$EMdIH)fzVn1*Z;j87AO5*3BTf91@P}aj}&XlU$^7@s2B?V4cz2>z8TDqnU2{CnPW=11aRZSK02i@^WN<;9M6z%P0FI)wON<5k&iZkfu8qz^oT|BI0sF=)g5nHdjO@4)<*NwtmRjst$Sw_V9L;G6xLxYZ4O!zjC^pi#I*+f3c#sr}Bh=|BvU)-h}->DRhg*Ki)f=I{^N_(vzXLT7RSd-@mKfq4!_di?biJQU9W^+6tsU_AvoWuD~ zoQwFd3+KNfa`XY^|3`1Wv?>+n&;KXp$syEV*)kv!`VV$r=-463-&gez8~KRyw`8-L zk-tbNE7foA1{9l{Yj~t^%-Ur@aK3Nn{)x+P1SwbY2e#!ZQlI} z_~!nnUW)_2H1?QeEb8AsdVjJ8^)H^*x?v{j&;9(9DhKL+;@c}(1Ju9v-}OV3zh3B+ zbDi?nm)xAA9F6+(D-OIdLH&!TY`9AGKa zz~|EO4N3yO_)Q-j_zzkB>R#19z<=m?FpC9#M-9(A`u>D&-tJ-e|Cw`bBNb}E*9i&V ze;D{8n?9`@$NlSEy0(G`_y;Z}S(zb!RiRTw+8z0;iF40|CL@2f^?LreH*~49H5CRi ze`O^K%0(!D_qfETY1qHBi#qE}G5=>>{%n6h`MbTtZbFp58|;`_O8Kj^6cdWZk-u80 z@3MFpI76DRfS~u{(nD*RO2jm9RwqtijoZ_kw``JWF~#_7BWH^Wyo( zfM07`_z3%7)~N519p%q*oxa*b`M>7p8g5hm?3Z&=Zt$NmlOa3fDSvi_?u}iP|7+3m zN|^FzZw4ilQ2wk(*uTw$pQkpo=Q{A!PII_W{;QbCl%qqyapkR=0{=H7b~@_;r(rD73Hs1$LO??{`TF%PqNs*vd8;`%G{v89n}ew#r%zFahey2 z`7g81D##4;f2NlI$rn@TZ>?8+u%rCnv@Ia*>&$E#Sx>QB2&lTCIe@skYEa{I& zleMpGME(7brYJY#|3^dL$q4%XL_=ZW#zUz8y{!V7*#DPCdB=QALj7BZuZ{stE` zEhzv0*hcM65o6^WV{?8G-x-cHhPaB~<@6GY8$N{w-Gx z)G+^N3WrBF(f1czuirh4{SV{iSigqqZzU_}PW2DG<0nnuf9Uz?y_oWM4}}k0!v2S8 ze|_}m4&c9iyS4-Ve~kb(HardZ;=Bdd+=1_RvrTZjKY(uUb=r5KAF#^`&a3oP(A|uFv00*!pNVNDZkAL{R#8D#`gy0Pb*#x zJqG_D)4pua`7+=ra0F^o{{Q@OS02iL7SB7hmFoYjYoWtl)PKX_op(roExyXZm+Jpg zD)TbczpF=P_$ccCLpQ04^w*mYay=yd^~@(dc%vYPsaNt6_Wz8cQ?wxEuMTfF&ZGQQ z`7W*uF4RB6ydYo{__dSKe5C*W@T#|s@`qIf`86s3)g)ulTFU?B7g;Jr_b*yxn+fH= z)^E2vM)|J`6oLon`xE)9tNx!q{F3=E1@m9VqvYizj&x)G&ooTcwjz909tSnL ze?nUYdNBWGnryDzfd7x#ml-ff`KxLV)M6=rHF*1G7x=H3^$IoB_@Bw1FSwFI`fs^6 zzr!j2HMi>J4b1;pr+)E}4&W%Jh3%pIeX;2LJCwh_;ay<$ZRoH6GcK?=3>+stS7plo z?_(ES#Qc|$TsodX`tJsjv(qtuX7)I8jrIfoOv=wSq(2{A-~6Z<_!j?e?56K*Ft;Vu z3IB`pqZ5R$Am30&`tOv!7(fo~Rm{L=X_c!yt>&GzVuZ}O^ zSW5Y;e8LYH%3pO<7CK1!+wteM(~9e$|DF^JwmmYJaX$89Bv~K&>!rO>`2H5NAs|BU zCvcjtxE!MV|38)=D=7cp?WK48Bj{4Ci-qhg!2g4*zF(p5KV_JH%0&JX%ird}y%zlM zq%?c@0r-FP-Ss_b;D1(wv-cVJKgY)HBh8;q$qvst0R9*Fkd&wg{H9xbSx4Ss|I1#zpd9fV{*#=};;N^>w>|yAklr5`*UrYbMtGRB{8RQ8F6uAU zd*&}01$?31LD8eYZ`z?M0{s^=7#Ptlh425IU%Yjv3;M60<5f}Uub9EffR2OcOZgv! zmr?)is16)N{tEj@e{?#pM)!ij&!)$Gjvp#R$6 z|HVBA{WrS$66LQjf%2>3>H90|^KvAK|9@0`tCK_j|0&-fPv8GZ+@eu{{WDWgu)k~% z@J+f(-me3`nk^rgvs_U}RTU&(Ke>!ANb4!eO3_20-R4KmdKA#0NIM*mG2@Oei0|AJ3!f~fz# z3A%Tm^0(j2zcQ(Z{+stm|26S{o98tl>c8BZqgPY^HQJ`)sDk@f-OelDj{4iB)i$=; zeJuUG)KroCdXq+#%ArZ@|Cygr4bASTKVQ$R;+v?yK=Sa@bEvv_wK;8sQ+Sn<2oL^KWokUW-P${tKa*}U{sBHPIdz)wpPcA8}+w+Gi5jp=g(`NUC@a0 z|H>|2)NrLqqjd562T8>Lg?{Owz~|TaaP}PV!?xwNg#$lgzNA0BKXgK3GwJ;?TBA6v z8~F1azOGfo`y;ukZW#IlCZyyAKlBI8VMz3d!ZoeA3g8(0t?iC*HpvkAE>`l{M>(3 z|DVCu8Shd5>p62P_X8)ndGIRLf755{8T9?1GPT?iDb!zY{=_nO)PJTbZ#wqxO!7k& zL-Jo4{M5RK`74w1GoeBP__gr0&N)mt?YZaA691NL zI+#oRtFpRBiTqzZO2J9Q|J)1So+AFuHyXJ``R^RpW0p|<`UX465+~rO&$AfE{+Cgd zva}@ree?2$EAhYlx(+8N;J>}FtDL?+&=nX|N&c_wBY#AR|7&lU>d^b6ePW3x=FhAh z&q^-B=QDWLO85f9Eu!7P=V}NL+XMW!)%LrH{}Yaihm!wnPM~-3Zs6xes?`(zo4lAU z@P9M@aus&O|E{X@osWY5g=^N{B>s0`&cze|dmo&iME)BMerY+ z_N$$z62nm9rJt3;mP^5p-LFj}Ar|20!JnZ!@|n^w6R zR^XMQUCIhLwt1qsvA!EVgAoZr~e+%Mg5;1p6XtK`lnVL z_J#hG5sB9nCI6qaiOc9U;Ph3-|AYR5Nfwghg8!Z=JML~l-+%gZ=D?c&<1BeSjq0z} z&%FTqcUG-ssE6KvBHTU(oxo|Fqgg@zKc!=fcaZEypk{#vk%>VMIveKGQ%m>hwQdaD1I zz{i?Yf6wHN=H$O?d@C?P_>F@Zk>vktvW!#s3Vi;T0VCPK=Q~;4hmmb9YnfbA+ zuAB1TOZ9C<$$u!xxBoTe|La+pITk^G`#hyeaWC|@!KybOaUy>`@AErP%HJAX*{?wU zs|X1TPV(Q3ADQ-p{5N*vMh=v}UO(ee@-66Z7cBi_vljYWEtLSzpU~eH771O9fd2O6 z9Ebn=Z~C@W)M5V5OgUntLH-+ug+J%SK!5AsvaHVy_1|mpsEg{KA!a^A_b*>m=@ixf zLhhA7>OT$3Y9G@5GkcbHi|X(AS7Zg-H+{ma$f|B>on)@*m0zW-3M zbe+jx)c< zJWmYb`_D{i)s=qo|Bd&5Jx~729ovqFQ~tC6pG`@WKP_5Y9!LJeKexGc2tR(w=qIXw z>Yr<~$^ZG%cxaI7-|#OSpY~hAinR<(rTh11V&5&Q|HYC`eN_MV;dOC@Z{TptnDCR- z4tCN1ERK-}@5%p}emOFV@Lz7xtswkwaG&pCYkb|2jnEwDSuaX zjdj>C^w;tsN1syu>eS(p7Rq0}SU&IY8PtD{vROzX@GT`S1(N^k?4vw>`u;?F`715* zpKiXJKNb6bc1PYx1M;8F;clh;3D)N0x$b)4ds(b>C;zDnXOk!SPgUl3Ok)1aMBMJ) zM*44W>&54hKf!F)N|Y!6ss1Ie*VsQXgDkfu`A-vn@L8Dj$DD{y){a%`KGw_D)UOk@VO6$|ra3hyHrYdRH&(|21aY z52V{cfBoHQ*6I7uUuQlDv#0#uHeW6d%HNG$rt8&3{;L4P`-#wB509QZMESG-)MNU{ zfB06KH=O*3{iEqclt1j>)8b10uUxaw?c_gGKcx4U{AXuwc~x8nzNGrbK||m-hk06I z|DeJ7>Ddo2;J;kDL0AO-vzy-LHlKli)pb@Y=KsuASFb$sf9=?Gqn8W*Gp7|I5-srG zWP5&d#s5Dh>dUHoTcE#n%rAb^36YD7c7CrK^tVNpi4EPXKl*XZI_9HsnC zkH@7~)1bdCv6K&`{Iz(?58e3x#dg&HYa4+6c9XL#pDOgXH5V?bQvRmupN-X|zm?8h JB}o3i{{eV?n`8h0 literal 0 HcmV?d00001 diff --git a/examples/trixi_rosenbrock.jl b/examples/trixi_rosenbrock.jl new file mode 100644 index 0000000..57be235 --- /dev/null +++ b/examples/trixi_rosenbrock.jl @@ -0,0 +1,77 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +using OrdinaryDiffEq +using Trixi + +############################################################################### +# semidiscretization of the linear advection equation + +advection_velocity = (0.2, -0.7) +equations = LinearScalarAdvectionEquation2D(advection_velocity) + +# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux +solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) + +coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y)) +coordinates_max = (1.0, 1.0) # maximum coordinates (max(x), max(y)) + +# Create a uniformly refined mesh with periodic boundaries +mesh = TreeMesh(coordinates_min, coordinates_max, + initial_refinement_level = 4, + n_cells_max = 30_000) # set maximum capacity of tree data structure + +# A semidiscretization collects data structures and functions for the spatial discretization +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, + solver) + +############################################################################### +# ODE solvers, callbacks etc. + +# Create ODE problem with time span from 0.0 to 1.0 +ode = semidiscretize(semi, (0.0, 1.0)) + +# At the beginning of the main loop, the SummaryCallback prints a summary of the simulation setup +# and resets the timers +summary_callback = SummaryCallback() + +# The AnalysisCallback allows to analyse the solution in regular intervals and prints the results +analysis_callback = AnalysisCallback(semi, interval = 100) + +# The SaveSolutionCallback allows to save the solution to a file in regular intervals +save_solution = SaveSolutionCallback(interval = 100, + solution_variables = cons2prim) + +# The StepsizeCallback handles the re-calculation of the maximum Δt after each time step + +# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver +callbacks = CallbackSet(summary_callback, analysis_callback, save_solution) + +############################################################################### +# run the simulation + +sol = solve( + ode, Implicit.Rosenbrock(); + dt = 0.01, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); \ No newline at end of file diff --git a/libs/Implicit/Manifest.toml b/libs/Implicit/Manifest.toml new file mode 100644 index 0000000..6f47392 --- /dev/null +++ b/libs/Implicit/Manifest.toml @@ -0,0 +1,898 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "6f6af7004b2b0f26c68ea4ea8c9920d5575e05cf" + +[[deps.ADTypes]] +git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.15.0" + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + + [deps.ADTypes.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + + [deps.Adapt.weakdeps] + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.Ariadne]] +deps = ["Enzyme", "Krylov", "LinearAlgebra", "SparseArrays"] +path = "../.." +uuid = "0be81120-40bf-4f8b-adf0-26103efb66f1" +version = "0.1.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.19.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.6" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] +git-tree-sha1 = "2d87d7bd165c1ca0d11923a9fabe90a9d71e88a6" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.176.0" + + [deps.DiffEqBase.extensions] + DiffEqBaseCUDAExt = "CUDA" + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseForwardDiffExt = ["ForwardDiff"] + DiffEqBaseGTPSAExt = "GTPSA" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseMooncakeExt = "Mooncake" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseSparseArraysExt = "SparseArrays" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.Enzyme]] +deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "InteractiveUtils", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "PrecompileTools", "Preferences", "Printf", "Random", "SparseArrays"] +git-tree-sha1 = "de7f70d73805f4e1a32395afc9d580e4ffc62924" +uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9" +version = "0.13.51" + + [deps.Enzyme.extensions] + EnzymeBFloat16sExt = "BFloat16s" + EnzymeChainRulesCoreExt = "ChainRulesCore" + EnzymeGPUArraysCoreExt = "GPUArraysCore" + EnzymeLogExpFunctionsExt = "LogExpFunctions" + EnzymeSpecialFunctionsExt = "SpecialFunctions" + EnzymeStaticArraysExt = "StaticArrays" + + [deps.Enzyme.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.EnzymeCore]] +git-tree-sha1 = "8272a687bca7b5c601c0c24fc0c71bff10aafdfd" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.12" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.Enzyme_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "97e0a9a3fa1c51ebd94dd076dd847c037b79fd79" +uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef" +version = "0.0.183+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExproniconLite]] +git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.14" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.3.5" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastPower]] +git-tree-sha1 = "5f7afd4b1a3969dc34d692da2ed856047325b06e" +uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" +version = "1.1.3" + + [deps.FastPower.extensions] + FastPowerEnzymeExt = "Enzyme" + FastPowerForwardDiffExt = "ForwardDiff" + FastPowerMeasurementsExt = "Measurements" + FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerMooncakeExt = "Mooncake" + FastPowerReverseDiffExt = "ReverseDiff" + FastPowerTrackerExt = "Tracker" + + [deps.FastPower.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] +git-tree-sha1 = "bbb7004345fb6141989835fc9f2f9e93bba3c806" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "1.5.3" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + + [deps.InverseFunctions.weakdeps] + Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.Jieko]] +deps = ["ExproniconLite"] +git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" +uuid = "ae98c720-c025-4a4a-838c-29b094483192" +version = "0.2.1" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "b94257a1a8737099ca40bc7271a8b374033473ed" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.10.1" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "9c7c721cfd800d87d48c745d8bfb65144f0a91df" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.4.2" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "2ea068aac1e7f0337d381b0eae3110581e3f3216" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.37+2" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.LibTracyClient_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d2bc4e1034b2d43076b50f0e34ea094c2cb0a717" +uuid = "ad6e5548-8b26-5c9f-8ef3-ef0ad883f3a5" +version = "0.9.1+6" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Moshi]] +deps = ["ExproniconLite", "Jieko"] +git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" +version = "0.3.5" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.ObjectFile]] +deps = ["Reexport", "StructIO"] +git-tree-sha1 = "09b1fe6ff16e6587fa240c165347474322e77cf1" +uuid = "d8793406-e978-5875-9003-1fc021f44a92" +version = "0.4.4" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" + + [deps.Pkg.extensions] + REPLExt = "REPL" + + [deps.Pkg.weakdeps] + REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6f7cd22a802094d239824c57d94c8e2d0f7cfc7d" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.18" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "2e154f7d7e38db1af0a14ec751aba33360c3bef9" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.33.0" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "86a8a8b783481e1ea6b9c91dd949cb32191f8ab4" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.15" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "31587e20cdea9fba3a689033313e658dfc9aae78" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.102.1" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMLStyleExt = "MLStyle" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "3249fe77f322fe539e935ecb388c8290cd38a3fc" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "1.3.1" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "566c4ed301ccb2a44cbd5a27da5f885e0ed1d5df" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.2.0" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.8.0" + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + + [deps.StaticArrayInterface.weakdeps] + OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.7" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructIO]] +git-tree-sha1 = "c581be48ae1cbf83e899b14c07a807e1787512cc" +uuid = "53d494c1-5632-5724-8f4c-31dff12d585f" +version = "0.3.1" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "PrettyTables", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "658f6d01bfe68d6bf47915bf5d868228138c7d71" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.41" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.5" + +[[deps.Tracy]] +deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] +git-tree-sha1 = "16439d004690d4086da35528f0c6b4d7006d6dae" +uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" +version = "0.1.4" + + [deps.Tracy.extensions] + TracyProfilerExt = "TracyProfiler_jll" + + [deps.Tracy.weakdeps] + TracyProfiler_jll = "0c351ed6-8a68-550e-8b79-de6f926da83c" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" diff --git a/libs/Implicit/Project.toml b/libs/Implicit/Project.toml index ab7ecfd..eedc1e3 100644 --- a/libs/Implicit/Project.toml +++ b/libs/Implicit/Project.toml @@ -4,8 +4,10 @@ authors = ["Valentin Churavy "] version = "0.1.0" [deps] -DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" Ariadne = "0be81120-40bf-4f8b-adf0-26103efb66f1" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" +Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" @@ -13,7 +15,9 @@ UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" Ariadne = {path = "../.."} [compat] -DiffEqBase = "6.174.0" Ariadne = "0.1.0" +DiffEqBase = "6.174.0" +Krylov = "0.10.1" +LinearAlgebra = "1.11.0" SciMLBase = "2.91.0" UnPack = "1.0.2" diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 39e61b6..7ae6266 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -2,6 +2,26 @@ module Implicit using UnPack import Ariadne +using LinearAlgebra +import Ariadne: JacobianOperator, MOperator +using Krylov + +struct MOperator{JOp} + J::JOp + dt::Float64 +end + +Base.size(M::MOperator) = size(M.J) +Base.eltype(M::MOperator) = eltype(M.J) +Base.length(M::MOperator) = length(M.J) + +import LinearAlgebra: mul! +function mul!(out::AbstractVector, M::MOperator, v::AbstractVector) + # out = (I/dt - J(f,x,p)) * v + mul!(out, M.J, v) + @. out = v / M.dt - out + return nothing +end # Wrapper type for solutions from Implicit.jl's own time integrators, partially mimicking # SciMLBase.ODESolution @@ -51,10 +71,12 @@ import SciMLBase: get_du, get_tmp_cache, u_modified!, # Abstract base type for time integration schemes abstract type SimpleImplicitAlgorithm{N} end +abstract type NonDirect{N} <: SimpleImplicitAlgorithm{N} end +abstract type Direct{N} <: SimpleImplicitAlgorithm{N} end stages(::SimpleImplicitAlgorithm{N}) where {N} = N -struct ImplicitEuler <: SimpleImplicitAlgorithm{1} end +struct ImplicitEuler <: NonDirect{1} end function (::ImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) f!(du, u, p, t + Δt) # t = t0 + c_1 * Δt @@ -136,6 +158,70 @@ function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) end end +struct Rosenbrock <: Direct{3} end + +function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) + invdt = inv(Δt) + alpha, c, m, _ = RosenbrockTableau() + @. u = uₙ + @. res = 0 + for j in 1:stage-1 + @. u = u + alpha[stage, j] * stages[j] + @. res = res + c[stage, j] * stages[j] * invdt + end + + ## IT DOES NOT WORK FOR NON-AUTONOMOUS SYSTEMS, THUS T + DT IS USELESS IN THE RHS CALL. + f!(du, u, p, t + Δt) + F!(du, uₙ, p) = f!(du, uₙ, p, t) + + J = JacobianOperator(F!, du, u, p) + M = MOperator(J, Δt) + kc = KrylovConstructor(res) + workspace = krylov_workspace(:gmres, kc) + krylov_solve!(workspace, M, copy(du .+ res)) + stages[stage] .= workspace.x + + if stage == 3 + @. u = uₙ + for j in 1:stage + @. u = u + m[j] * stages[j] + end + end + +end + + function RosenbrockTableau() + + # SSP - Knoth + + nstage = 3 + alpha = zeros(Float64, nstage, nstage) + alpha[2, 1] = 1 + alpha[3, 1] = 1 / 4 + alpha[3, 2] = 1 / 4 + + b = zeros(Float64, nstage) + b[1] = 1 / 6 + b[2] = 1 / 6 + b[3] = 2 / 3 + + gamma = zeros(Float64, nstage, nstage) + gamma[1, 1] = 1 + gamma[2, 2] = 1 + gamma[3, 1] = -3 / 4 + gamma[3, 2] = -3 / 4 + gamma[3, 3] = 1 + + a = alpha * inv(gamma) + m = transpose(b) * inv(gamma) + c = diagm(inv.(diag(gamma))) - inv(gamma) + + return a, c, m, nstage # alpha, c, m + + end + + + function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) end @@ -205,7 +291,7 @@ function init( du = zero(u) res = zero(u) u_tmp = similar(u) - stages = ntuple(_ -> similar(u), Val(N - 1)) + stages = ntuple(_ -> similar(u), Val(N)) t = first(ode.tspan) iter = 0 integrator = SimpleImplicit( @@ -259,6 +345,27 @@ function solve!(integrator::SimpleImplicit) ) end +function stage!(integrator, alg::NonDirect, stage) + F! = nonlinear_problem(alg, integrator.f) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; + verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, + algo = integrator.opts.algo, tol_abs = 6.0e-6 + ) + @assert stats.solved + if stage < stages(alg) + # Store the solution for each stage in stages + integrator.stages[stage] .= integrator.u_tmp + end +end + +function stage!(integrator, alg::Direct, stage) + + alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage) + +end + function step!(integrator::SimpleImplicit) @unpack prob = integrator.sol @unpack alg = integrator @@ -280,18 +387,7 @@ function step!(integrator::SimpleImplicit) # one time step integrator.u_tmp .= integrator.u for stage in 1:stages(alg) - F! = nonlinear_problem(alg, integrator.f) - # TODO: Pass in `stages[1:(stage-1)]` or full tuple? - _, stats = Ariadne.newton_krylov!( - F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; - verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, - algo = integrator.opts.algo, tol_abs = 6.0e-6 - ) - @assert stats.solved - if stage < stages(alg) - # Store the solution for each stage in stages - integrator.stages[stage] .= integrator.u_tmp - end + stage!(integrator, alg, stage) end integrator.u .= integrator.u_tmp diff --git a/out/mesh.h5 b/out/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..ce8faf3151749df8a35c91e306faaadf8ea3bc33 GIT binary patch literal 36832 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 EKd3nYcK`qY literal 0 HcmV?d00001 diff --git a/out/solution_000000002.h5 b/out/solution_000000002.h5 new file mode 100644 index 0000000000000000000000000000000000000000..28231467119422328e2c929288263a567a66efbf GIT binary patch literal 34816 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 S+cDg~+MV+^N7jn}_J0AW%4S&r literal 0 HcmV?d00001 diff --git a/out/solution_000000003.h5 b/out/solution_000000003.h5 new file mode 100644 index 0000000000000000000000000000000000000000..36853cb1bbeb487ed84e3238b21b0d4d6b0dcaa4 GIT binary patch literal 34816 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 E0GDjA!~g&Q literal 0 HcmV?d00001 diff --git a/out/solution_000000004.h5 b/out/solution_000000004.h5 new file mode 100644 index 0000000000000000000000000000000000000000..33b0eca3dd4f44c508753df6956f59ff9a93106a GIT binary patch literal 34816 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 G_WuCe90Aq< literal 0 HcmV?d00001 diff --git a/out/solution_000000005.h5 b/out/solution_000000005.h5 new file mode 100644 index 0000000000000000000000000000000000000000..0f19b82e6389705db16aca5f9351007409604be4 GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000006.h5 b/out/solution_000000006.h5 new file mode 100644 index 0000000000000000000000000000000000000000..ffadadff3e43ca08bfc8852c43eb43d97c8bd047 GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000007.h5 b/out/solution_000000007.h5 new file mode 100644 index 0000000000000000000000000000000000000000..38bd009ca544ed7aba0cd47c764cbc797bde13a9 GIT binary patch literal 34816 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 K(JzkqtA7EU^yk+A literal 0 HcmV?d00001 diff --git a/out/solution_000000008.h5 b/out/solution_000000008.h5 new file mode 100644 index 0000000000000000000000000000000000000000..16216d56036a946b30be416ff38f916f285509c0 GIT binary patch literal 34816 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

aYAGlbxvl0rDX;QGYvcl~MhDTi`(T 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 H_c#9oq|X$Q literal 0 HcmV?d00001 diff --git a/out/solution_000000010.h5 b/out/solution_000000010.h5 new file mode 100644 index 0000000000000000000000000000000000000000..3e229f36406cf8c8978355f082f088f0d0d06395 GIT binary patch literal 34816 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

g11p|KYM<270{^L;l;9TUN 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000018.h5 b/out/solution_000000018.h5 new file mode 100644 index 0000000000000000000000000000000000000000..c5050a5cd548f66252ec569c33e2741710e1390f GIT binary patch literal 34816 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�rI&)l6FhCY_2uLS&oN9MqT zf>ogZ^En0nyLG`y$n(U-apbf9_;%#YD4Y}ZH*YBq{GY4pW8kxUH7<;N26A%1|M{!J z2Y9dB9P00(Ab!+Y#_7xO-<{+ChW^hYYAx_5-08S~wIy#q{D*^|WT5YAb9m9u*Z36r zY2{(So2G9r&OiAH=mb7E1AXffXYijGwgGSW#EJP=R9uaDmPfCPIQEgd!RN1g3A||M zPUwqUO5y(3+Pnz({4OpHho5db=czlX|8Hj&aU1Iy`0vVIT!qhWtK>)c>AGI`gJ0pD z1bnu4FZ_4%wo>rfd7hwy|4u8W2K*hf{J=Xd+2oM>S4Az=;s2`%@54Q>`|tC?f0*59 zi02$0jsowU+6n)ml6Nt5L@FZ@Z)IE}_-YJ~f$Nn1MgKvY$N`-`{UXFEva|z#f7v|h zza94j=!eAC))N1p+1R>k#Q(R3DG>GC(=G=0rYpLBh5xVfWFqQ+>h4MS{E9w@;Qq}8 zpBv!&tzk#~H%xwv`rj7YjC)qI>UmNBqg+zK@8oy}+?YcZ_iqYMI$-^I(I|*KOIsFW z{ZU*aio6vuZ~(t%p@95%2FqfdQLCFnK1(*XfghTz09^QlF7odv;EX)G2A@Qnz3wC6 z_dDAFkN%T^^~d~tAIASpjvsuMV}owUXQoUA^1sscFz_LV56FLFv>L`)IHL;V8Deh_ z{@-)jz;ol`k^d;gJd8ifz#YU9`q~2iM~58Xe`s!C{A)XpVg5}%6@(6DZa3oX+J6zx zDW)(2XU%&JebZFC#r%K&j(GQ)1Hd0)_5|*GE)@D^CdZ)jB`61Rwr&~*Uu@+8;EDGR zLjSLxN|Cw@u0rP0-b3Ww%IK2t{pQf?P;s3NyXsssmZ!Dz^^UP}75%@`eoI449 zLC0p`xg8gv@9@M3I={+pLO=5s8~BOp2Y_c-`$ONH!3{d2x%Uu{>K6LsczEF0speO z4)81KdvO11S34W-d5utBhI?dh`tJolyIm1DeJ&U7U)`c`VDbLn*Y40!$R0*KEk;G$ z+grAf06c5{D)a@q-{78KwVqJKJ2QC`e4lqIz(*Q7p&vbS13Frvg}8tCrvD}II~rSo z=P2&P{lmAjPe>5|?E$G^_-v1#eFZ=5aWkKm5W2;LJHS$iJ4T*kb;HY@O~3n{pN`Mj?h?q7E9O=c$d|K2&mjr)Q>Tyg^btN$SG-}mYMiu;iDvBjV8C?$?BSrh5fXBcAVM5AF+IBG3pti+vC7pMG^D z5<230E+CHFx2NF8cHIX4@trUJ{)gu4{sJWbU3$j2|M}LGAMVrL;3bHAbGz3q-oGlN zwHo(7Tjl)4Jp?_jp8lQtsVDY{<_k9w;&lnu7A^M8*C*i-23zNY;YXNOH zD#-n-`#J97{@pD`Ccv+)@WcJTjg4;bS#w8y#(k=BPnY1n)&&lC;GS`RasTfo&8_fR zA4#X+{J>Z9V2>_>yeuw*iuODg^CjRd~9Y?`f9>53u*rC6M-WWP>LQW%2@60Uje~VR9170nm zfcxKEB<;5l|Mdp(X<6d4^)7e{KebiWMkeC__K8^seEHs8@ZX*qP{KW%hdIOHr{&mH z3jeL_nK0n>M-6fR){mr7+_R;+MG*IRC2q?H-()BsxPa9x{MT>t?%?}JG7bx<^M`uU z(NEHzI*q=u@Uav6Pnp=8=s!((mC)xk$KOXk`9t&__&+NJfV0hiMF07_(-D29&FLoW zBNhHW0siDcFW`JnX3+oXq^`!_|C7(Afo+(!T9P~V0+ zo6ISWddhZg5B6(X9eRKZKfZ(htEiCnwX{TKT$bMd3-zwV`P#P=`K-W0x7Qh(WW&*7f+q$TIEo-WadMc=kcLL2x@`4OzY zd2$!g=PlE##d;ckwG?~>vunUhj>TgA9rWLZK98-Y264{peG7g&mkRLa^XaqX`yUCX zYH|O&+F2{q`D54Y5iden4$n=D^8;6z@Pd9#Wk(WUQx8ugPKE6gpN3-0#^d+`nJC z^8?n|xd)5)@4HiufWI@M4|t1Z1=e56rSn*4mzD=0j(WEv?(2^lTf`fecQKRu_b+gfReYj_{tWgZ>xx=vYIa2?Bw+;d~ zDOAJyFQzbwdp6@vDq=l9n%Io>_gqRJ@R$o)xPS9^+T!2yWAu{+al(@{z<(q%j`hDR zZw=P}4X0F};rmCl53v8J?r<0RTos&&ywQ)I1^y{g7x|a7dw@Lm9qK?nO;lck&&^N= zTu$&Z@;~azh&;dTy@NQT?L*+F@h{?u^J|fRI)*5WzrptZr=+tFtNDK8c&M$|tOu)D zX|;svXM`S9S4)UEht|+ot*B624BMKAQ`#x|t#m3Ya(X!9m-wxR8IGsyN<(&NEm33a zNLebW=3$D==k@*fecj*teVzM#U+4b(aev+)H|p=FQBu!qzl2ja7f);OYI{HGAEgbU z&YqhdQO`{;UwRV$`@;&Oz!Nt_D;1>HmE zRCl#B&sXjwenDXyxKDU8`uk>;pz|$t5P2TQNbwgPD#6dbI*R#wW{S>6^qi3T!!vV#9Q-4D^NG)?(1RPrd;)*;9qIk4w|_c79=Eld zi7(#M1pkn&8u;a*HlxM-&C5+-&UPFec2>;)bHN47%_Mm)_;QDF>B4`#wrFrr%-@cS zx>Vu+KD58MTEsW$o`HYcAo;(`eNQoG%L1kMe_j-I5Z*uGh=$~!4kn?AuLVEvcV6`>z$`dZ&sbhwqzsg^O z&M)LO{Qn%UF-3oWKy2?l6roal23elyxbDSF+Odr#KaaRK2H>#Ki&wtC)$=B~X9R8AN$>4ovCGa0GtcNG8%%0zod3G1^ z-law09pjDRUpLErhPeNAIjDyFS2Z_G@Kd#|*v`GF%$rTzzdF$PBmS#jw#e12oQkK^Z>v40>*#GC)40GD5%kN@x8 z@+Vos|2O2h<#gdcd-=BMT5(@-ZPh*SiAqQK%g?J7V*gexUxWXqU7MPH+D!>_@n1bu zupWHH)E)S5W}ZpMXEW-=xAfGsTL>_sO3-P6UPl0>b>G9v~ zUGy9J*On^a?=^5if34wAz8j|N0AKL`68Q6Otc7QX+?af}tuo@T1qOi^ERKdh*Uf}J zdz?OtK3d#fL%--l9l$M*8KVEP*YXmD{vK_s@LAg#?Tnrg7CL;>DqXgN7maa6e_ubz zXH~V?=7#WJz0mnJ@hi?rc)9OW^xtZlj?Okot>g(f*@ymLwr&ES_FEwOPdMz5B={pj zw@UtRIg#Y+KGMl|`|=gw-#D1VKP|u5sTWS%) z{jW8S7VKFcuU^GI^_v0GzV@hF?K*KUaNC@A_OHJ*4a4Wvv+X@gvHxx0;z_(u2dV0@pb$DF zv?PSyLg(&~-#X_w*Z(~q&bRx%elWW8B6{`H)H{6;3O{PX{Lpaox(@Ri5>mL*MGNaB~lFX4OH_v!sk5Kpnlb= z2`l>j`pS>}@0b7KJ5Zx)#d--_(1?9V$=5^J5C8kZ))M~v#lu?sFTToNze%3>OZ0ow z`W1Sy;P02*FRfonza$-6w{0Kp7wFzA@zpB)^Hu)xhH3q3@N=o%gYM_TI(G~0+O}hd zaKB7}ettRKH}zMkcH0hNpJ;|k&z-Pmf@#ntEbM*v-2}LQd(VIWxi)RvCH`EBfBU(F-&o-D;xB&8{amRR z|KaZ!;1`^*&t2QL5AzGk<^7YMVrl$}J$E}I*uFMXiuYcmtx9sz>!6 z>iz4_nJRIA5^%%2hIRT|LRu$+xqm0|OOf~{yiO84W|AZP`%e^j_y11%&xoN&ps$I)JHZ4yMz1PXch0x%YV(= z;nw5AYmGVcTfDbt=+3(_Zap}p*U}UI@m{m6%kM9D&;MEKZnfmC~OI+pas8-t$to3XT86eSdOjP|XYguK|9bufZawpn z%iF4FxZ|Y&e-ijn2EPyZDZn4#1OHXWDU?)_f9 zmpl1Z_kOvfl5TI}-fu*?j>((5^$Pi8Pv3a|u6MP6zRw!F^@cH9)9eqq?bSQ9F6|cg zeDkL1mWL($d2X+(wE6p6Ugr6O#`idL(@U5A!^xH0dib4Qhre~tXLvfS+~;n6XzW{` zz5e`$ml6El;O7KC7x*K=uMGZmgI^!~rr;+7Ka;`l3Vs^!2ZCSYvm%oly7w!RzWUaK z?)~=O+womj_kPE(UM^SMyubKOU74QpV8o#2Y)8`lfgd^ekt%LfL|B+C<-U?-#q~-N@hE`~4c#xczLm{`0fR1Cx!r>eX7awNZpy_nut*_}#iO zUeT-#24)x%=WWQ!(Jzs74 z&N}{&E_svB4}P`Q+KXNw{P%$Wmks}8;J*_5UxELRvA+h!{*oL1(_(+!;XfVx4}$;q z*#Erj|9M}0RF4P|JU$e1N=qC{w)5F*k4V9UkLp5;1>b^2k`qF`>O~3Oz_Ju+wtKeXSe=& z#xDCFS49 zy49^`>i+ut?IokUa^MGmzZCp@;8zEKGx&dke-Zpl;HLurKKS{;?*slY@MjzROdSTz z33Kna`N#W%+q?Js_~VegBi;Lr?{?&(p>z*H5ymHxwZoPBP9yM+@kMzz2P1x`tYovF1&-O=2OGSCZ!}l*L z;+}v0#e)Y8vPF6!eMkJGwqK-I8U7c-e=qFsGWPci_ID8eYZ(7i68<+D{&&Iu5cvNI z`+Fb$XTyIP_CGoMzk>bG&;Hji{2yiiV+{Z4*#8IYe=+vIC;LB&{a?!dXM=yw@V~_H z{~q|?8U8Q%;9vMf!0%-2Z<)alGW<7$|B3K_9{yLt|7-BS4E}e)|2X(>5C13N|0?_s zg#X9zUk3hz!QY1ceFXk!@GpVC3j8<0Uj_aT;ExAC9Q z2aZ*8&utoVKd0xuzIXj$`*qLHdBy9zyYv+=(z|hB=H3qO=eBmeyJMnzeq@h_yIQ&D zo{pZo<2ScH>gTCF!rb4B^x&5RzZv+uz&{0kX7I}x{MF#s2EPdSao}$Ne>C`yz#j;H zShd?}>$>-ATED=MobLUeXD$8xX!m|s21EqpcJFs;(VGK@x%IcRwT-RPBGT)2e{hxp zZvEJ>bn9zBi1O+jUY&83d%n^5tX=N7ecb+uKjXC1QcqLTwi`r-Pvcl@O-}vbn90NH_x@;{CUqW^Z3|$ZapSxzWQ%GzT_3CbFINl z_xypq6Q91})<=}sdpkPfvbTJ9PV!ZONR35X`t$+0RK&6`Q`Kh12zG$0Uk7`(C zWT&WD?-BSB;8y~FKlnl5$AF&_{9E7`0)H>~!wh~w@aus;5&SdY-yYHAz?bg*UMYHN zN|1ZMpEGa2GseB&zK};Fs=4=jIz0ECif(<_;{4TewT|`*CS6*%mRoOFaCA(!p>bYl z$2phBx#zvAmsS^Z>knU^(|h9htKR7yPtFHcz3$!r<&zV=-Fo`$X`4=Q&)*HWJG`J< zuQ8@w?GAo7y^6&DRmA`P#QzxL{~_Z4PsIQF#Q&<~pT&v)tBLf{w^Z^2ATX%`KRK4Uhpd!{9`8n%V6@) zM<)LaH~EM1&&=Rw#Q%P8^1pE={wx2>Mf_bt{N0BC9ZvjhhyOiJ{EhRG|CKZGe-rp0 z;Qz;hAC3QCMErl%LKNYmwJl2m7DJ1Actic}(|L5TU2K>JS|G&WhLHK_F|3l%w5d41v|IJMPcOU+bnfxz^ z{4W~*E5UyZ_}Re!5&R#(zisgI8~bYoetGOq_-DcQ`}ME+=T-3E1HWtGnJ4PG{B-7p z&SN^c{Iq}Y&`DWbe){#Ov7uouKYeS&H)DFb^;vm78}NGZYhKsL_b#?}>s!|3UJ-Kk zruTLACP69O^XoTON!P}$7uodtAI00;^2W{HQ)zVh+un_7{bnTmo?VAeH>mEOKi;?e z55wL1Z&Q+v&J=jZ>u2zLfIl7l0^rXBKOFp>;7a`hl?s^LfzV&*r|2=R2p3e22x%$fV@FYFj zyXTv(oY&}?t0!$9zq3>0W%oR5e+SLyk9+Vx1pCWpK7TZU{}A}UgZ&+a|GW4f*P_>YGF*@pkw z@ZZev9|itO@GF2n8vLB#&jkM{_$R?{2mTW9FM>Z8{N32!d>{6AF>mgOq|R=i#Fbjv z&DrPLY(;9Mb#{9#;;qeJI{Q3c?#ROWZhhYQ4@wlBde@t}@>c0KZarOvHS@Q)x^I^S zS@*>|d%i#A>Yx4Gy8jOUr@6nn?_H|8W^?sq@m|f?Jy*)Q_3~NsAKm1h-xS&Y?rU!S zag`2hbGv%=dGMcszY_c_;GZz~)4)iQ+pS6njDps4l`m%d|_)kNI z9Ch{lD;2j-KjG^B`uw5upGPMD)8`MJKXoSmJVN~c(Bz*7&F7C?#Q$EL|2!lAdrbcK z)Z~AjkN6vB@;}AjV#MD)CjVPT{4HVfzpseDI{!&V{69_nuK@mT;(uo1|5byp{4*c; zKY*|Juk)uu27j{2|E?2%vk-p|;D7g<_&*T;n-~B4G4VglhyPXle}ezbMEtk@SN>n; zPrreG0Q^Vz|54xse=ie%s}O&y5r4Os_^bG@{6qNH!9Ql=zwj0RJAi)|{AA$A znD}1?{BOa3YT|!h;{Pe)e>viRAn|{biU0YC|8Eli%M$Mx*k2~_ zSA*Z#%$awE!)R9$p++IHxmi<$f$c$bcU zk*~9RZcL6Ma}K$mTf09X_h$EeNEQEFzq;o}lqr<^8@FENrQ%h7ae47z@Y{eNVeqGb z-wXU`@C$;U*Wky1KMwqL;Fkq|4EXPZe-!=g@91y+jsA8P`rBCaw+GSRWIWq^Z7&e7li$l zhyNk)e-Zw*|IOL|KiU6<@IQ_H4`=@`vH$tl|F_uxFAV=9*#E`se|f{d$Nu++e~UjC z{BOYT3jSsA^BemUek}Y?0DlAcWxyW||FyvXhtXe)|1{{Yry2eAA;W)b_>X}9`SAZ3 z{sZ9u5c~(g{|NY({Yn2Ffc<4Q_%Ya@@L$6IJ_P?T_;bO(2mV9!-}}H%X6!F5`s=Ca zug{~uUV#34Ao}anMt?mP{r6S$-!GxR-iiKt4f^YL=&zfjzb=pdI}7@6fAGHo|ANtf z_X9sA_yf^@3;!1QIep-F0KXadA>d~RU;6KEKJ?#Ke;a4?w++$XwnBex^|$HK-}Xa) z8;Jh4Kl)ppKdvVKtVaI#l{tUX`H#*Y&lCSYC;wYO{ux95x0v{^^T%l>{%hyTxv z|80f;{lmon`}p4^`2U|w|IJAJzw*B~edK@k{IQG4|8n_=|H}UY;XlO0fAK$n_#0~C z{{r@Zs^MSxpW^R3?7#SrBmR!}!T(qA{~r6_&*Y!J@(<;o%0I+^0r0;x`Nv4`m48+w z{tp2^1pLE>|5WfF4F6xl|5cO!WrhDw;a~k%%KsF9?-73wz<)~O?`Zh{)8H%qX9Rz` zvA+Y@Uv}`D8~m9j{y#JL%0HEV*#0lY-zCI<#b3q$LB!v$i2rfK-`vDs^?xlT{&zC{ zSH+3HX^6imP5+ttzm$L2{;$3!{tN#V@HdlxtN>r}U-?G~@Y91IWcshvf0K>=t8u3P zDwgQ{eL$9wEWxt zzndoiQ~#gx&u+&4l>e#!Q2kfR|6Zg2>J9iGYx=Kl!T+a*f8~Fv;a~lK>c8p<|C!)l z{eQAQ^?&6u__qJ>2Kb+VUzhw-_Ls`oUj~zZ27%v?{PTVKuZo-gFZJJr(|@&&{;QYi z{~G6`|7r^TSL**NK>yVg`mY+&f7O!yE8!Og{}BCOC+Pp`Zu-Bn7<|w4|4jt{g6aQK z|DXEL+JIjH{q0iI|0VtH0ra=(zf%8S1@yP2(BE!Ce_Pn}{|!Zd`!oGFwN3w5R@48d z{!jIvj>rBg(*Ji2{u{x6Ez|!QVEBKQEwTSp{h#tb>i<;#Um>&qw*PM}{J+ZntN*T? z>A#y~_*eg(`ac`MzxqEbnEp@o|H=N^nf}8Z;7>93H-r8^+219@|3uS&=&S#)uj&6& z|EKiVbxi+NG5B8x{{`TGEBfoc@P82gtHS?O^w-s~zXitr;?RHpi2WTv|6LFK%BKHN z{io{x+X4O{@b`mX6Z{$ASD^nY1^VyB=)d1We_ajzwfgVW|993$|J4oj*YBYJR{!5f z`oHF*{|+|#Z|Tn$f&VV}>i^q>{``0J-{%c}O7!QqP5)mv^xwAsFCF;mzuIW@*V2Eh z|7scf>(`C`dJFnn+kYkfZ4~<3VMc#l8vSi^^nahA|Frf02-E+e`v0%g|KB(Df9d}+ zq5sQh>i_=e|NMOPe@Oqihx&UeqyI~W{_+a?yLU|ee}K{7m7@M$2mPh$|I%No|3mse z^?&RFKO^{7f1v)8B1Zow`~~O_iW&Xic(*mzDaz^jB7Y*N^(E^mpq2Xhi+J zw9#Lw{(p!1Yg+2B7pT9g{x1D#cJQS?l>Xq3ssBoUD17O^r2l(B{r430--qC<{(l2} z=}*I{|Em7pjr!|U>hIED%{TSmtww(({g>*m(toM`D*fGQ>aWMBzjibFgFXgd`U9)~ zlm1ZpvsLK7RDYg8{aN*Y=?_kTuln-^qrX!9f1){mQ~m8U^|wgQ-&B89{a^a4S?2sr z_18w!-!^dmc9r_S_}@qUe+T*x@h|<~+vq>)qCc_xOMe^z|M71Qr(tk>SsQSP3hthv; z2Y(Fs(*KnPU;59>;ER8&KT!Q$`nwR$U#0(4{Z;yp6Gs0b{#F0K%K7U&_?P}}fvLZ% z{(sig|7CyDpJbu_KZpA7S@5HpQ!%7!<_%B{x1EU&VN<^)%mOR zcRGLV%lYeL&VN&y`m4@gRsY{e{rw^J-*eP|g};&d?`@+$m}~S08IAr=^?&IPV~zg6 zxIseUQ&R?bfv-N-JPozH<|I&Ym zf7ze(r)}Y1^?&J)r9b%*{fX6|eh>fBe?H~>eGU76mHn6gQuTN7Fa2jnbN;UL|7iBV zD(CN&*njCSAHl!$2hx8EKMwqJ)E^cZ{-r53e=PoGfAT-7Kh?tiGMW05^e57P z$p5JR(-{8$F!le5od0(=_4fksuk(MMzpMTu{lyygU;2yT@L!GnA7sw|t^Py$1L4O| ze<}pN&i}=~@Kt|O{a^Y6@h|&R{YU4oI)4u|^&g$Ts{XF?cRPPg{NLsLRp;+};XeuI z|3iJ$|D`{$=l>R8`V*c1%Kmizuk&BopYUaW(x2G#e|!F_^MB1>8*I+sV>o}+`Mc`> ztIhni7N-86$(;XBH2Q=2oIelX{8{tobpEUQzvj;ge;eoj%fWBM`LFOx`Z)jB`LE7j zb8`M`&)-!4|B&;y4>*5o!ufv^&fn5={-2WbSDnA5;{3HQ=dWjs{#fyUJfA{O>#Bei?YOj<$t#SL;6$c50rnLGV$N$A3aR|srtY4r*(|}K=ps&KQi_ABgB8}e^>a3 z|2c`j(tp-5@n7**`n$2jU-@6ffAybO{h{i=ivP+#760Y`t^P~?U-_r%zl#6T|H=QV z{_e~FN`GbbcZ&b*P5d8C{dFV$U;01m{}q3v|5E&y{?Ph=;Y)ug|8Mn&^8eERdE_6$ zuT1>0^*8H(=TLu@{!j5={$Kvr)_*mBGv3r+lj8q};Qyunlm0~dPuZV7e{8`1I+1_o zCI6HDQ~FcsKczpB{#5y&%|H7Pf5V9Xr;Pq%GV#AB@&79ESNWgxmx{m9 z{g?i-Hv2FBWq+#wOMfuK=nqu?m;Rs#_5aU|{YiiDosaxO@jrt4>#yX0$*I3)A^y*X z|7hy3KT&^uh5Rqn)L&Kqk0<`y`KyZm(tikF`V-B6RsJ!<=nqu?mHt5Z*8ZeFkp4va zQ`LWkA3*(eijVlK_%HpP;_qnc|JR8BIjH|C{;K|K^?zlEzd^)*=?|wFeAS<={!sdZ z@!($vU-Mt3KhXSH=?_AU{?FEbd!qk)h5GBO#Q)Jg>i-`R|26+Ll=!duTM+R-4e`G> z^0C$s;>;C~YPFa3q)?}~rvKQw<=`j0B$%l-e3Hpz+rv9$_zw{pmslV^1{;vAJ=C5h~uj=n5 zssHb#{@#cB`#<1c^LJ-af3FJudg}kOKjHrb{$cPxr2b#U%zxAT-{RnF{;%dwYyNNz z>i^$>ulc*r-~Q|TU)BFL|4s8(51aXG*_pqVf%^&R#9Va(s^VCJuC{;TT$n!l;}uZsVFl7ISOaY3^jA4d{%7@{F~r}xGOx;zdnD6f7ze-SN~Bh!@uJ15%ypAKWP7T|H4?}ujcRT{s-N^ zApND{|4fsAH8uRp{=~oXKgECLANKx<67WCGHY!5 zf6ZT&{!a5(tDyh;)`$Ksi1@4d`!|jLuRHN~IPrHD`oGk~Ups$(fzcn@`v)}tU-u8Z z1it3a+xh?f!PoqG52cF(Eq*9{MDh%U)B8WrDp!>LgK&XZ)^T$C*r^6uUQ>Y=s)MP z|8J6i+5K1kcY*xtWgq!pQSz^TCjVOi|AFu?eC2=3z%Sqf{|}@8)cq5hKYS1S%L~5j zPx+tb|4V`$HGfz0e|_Emp#1L?^H-Js4Kn&q-Tx41?5`g9n*V>1 z{8RR)`L9c{Kh6Kw{S(61{S&gk!QlHd|GxtI(`07;uIB%0{(FR(zh9d9ubRKE`M;XK zU&zeg-D2kNKQQy(HUG7&ng73s`LCM)ulolqzUI&B{sGOOy<+CiYX0zjgRlAj&5Zu` z;(wU`uKAmq|F8L*KQezS8~R(#U+-z=Z#`xHmgY}y!TvP=e+>TTtl?juKg9ngK7WXR z`5)asaRL7${`L7o^QZ0neck_{{Xb#m@9X{t&41SXUG0BS!~c5tAIJP%@vr&2{@9=9 z|Lgt%-T!bLe9iwA{wn7G`nrGOHvI1Ze=PV<;9v8nL(TkO&3}$E{1;;Wuk_cNzpwdg z&6)qZ5B_!kLnidsec)g7f2F_H{8!C?d%*lR;h#qTT>$(pX8y43uc?_otosKv|5x^x z1pT+{PxF6InfYtdUk94`YtnzmqW{+Xea&ARg#KIef2IGfi~f58`fJVK*Zl*+m;QVw z`tLO0Ut|7Ta-%=j{R5i+KLq?G=)Z+uAAHUK*Zfzjzt#LL&HvT>P0fGR{7uc@YKs0_ z`fJVK)ch^YUkgP4eHs02MdoiQ|5W_f{D0m5r1Kx;e>#6s{-^v?=TE-wAJgX#-9M(! zAIkrd5&t!RU-vInHuLv&|Bvq93H}fHm-;`3lK;&x@!#G*rTp)0)BmCSrxgDq$v-sz zU*}J{|3~*fbteB92mW&Kb^av(y8-`O$4C5~WAZ=6|LyqS5$62I#@|t9{<`9SR&)NO z`+wAbavA@x{3AF0Co75nx_`=7{;B!@I)Cyb{_Ffn{=X#gSM%3@ApV{)^Y?ZCiu|wc zU-{U~UswEHYy7Y7e;L61^#J^TdGMPs|6TrH@h7{F`TrZ4|F8M;#fU$e|E~LobpMa; zAJY9V>c444{Fnca#Qz_`|K>OTSN%72>Az9@*ZnI&#Q#^#{OyP4{ukZ`Q`>*?dwExQg zlz+t%f49TG@-NN*SNu(9?jI1o@{e=apYWCctswpjU;Gz_f8GD2`+vm0?thT|eNOz> z{ZH}4U*&&ieDq)G{vXZ%*ZmKgzpDBFS>V4r@n7@z{pr8@%-}x*KN|b9__}{c`KR!8 z|G-}I56%DA{X_QtsVC&0cK&;5=C5uw{a2d*uls+ZiU04K{wvLY*Zg($Un&0E`K!V| zM*gAs^NRoK|I+;`zvk~M{}TU8+5a;1-|7A*d;h{M<_|0XtAhRQ#r}k^ z`M;^)|0ei(;a~Zu@K=Lh0DRe>?jJZ$|DW=|m+8OzmHw-}X8y14e-i)7|5}s(RiOV* z{dZ^Rzj|usuihm8t4{tWeA%DvKa~Ax{;=}T56%4pWx%)nUyr~~>0|z@?Z49eclCd1 z{_AWr|9unvS0hdTRbl$C#?t>~=fA7}>sQnNH;w+Yjy~qUs{c&$=hgo=1$^B5*G}fYo;3Y`cK)XA|H@_huk8GF^?#}VM)Thn(SNni^xtUyujX%Ep#M+(r|SPa zg#Bs$?;!e5i_-rm|D*mt-9M)JzqbEW^M9kTKM(usN&lVZ@AhK?jh#r|vlv-(fx8~$Z~x_@Ai5Br-6|Lf>KEQRf2aAYn*S^Px1IkQWahv5n*aK~nZKs~E6rck z{5k2rHUC%h-=zPx{b$mjYyPX|4_p0rZSXb!*XqBezkS`zf7ARmJAYOEH=6(U2Kw)k X^k1p}M*Ux!zgC9+E6snC{`&s_(o1O5 literal 0 HcmV?d00001 diff --git a/out/solution_000000200.h5 b/out/solution_000000200.h5 new file mode 100644 index 0000000000000000000000000000000000000000..d2cd70fd38cd76a97820e5d1b3937ca3ca97a6d3 GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000300.h5 b/out/solution_000000300.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5a452482ef906c31ecc1cc78205fe8727279a9fa GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000400.h5 b/out/solution_000000400.h5 new file mode 100644 index 0000000000000000000000000000000000000000..335358a3e10b0e895b4af3dc3f6352408b7353b7 GIT binary patch literal 34816 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 AWB>pF literal 0 HcmV?d00001 diff --git a/out/solution_000000500.h5 b/out/solution_000000500.h5 new file mode 100644 index 0000000000000000000000000000000000000000..c6d75bc602607753cd7f4a29552b4e764442c3ac GIT binary patch literal 34816 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 RzX$pM|3Lo#Z+ZOx{{>URlnwv@ literal 0 HcmV?d00001 diff --git a/out/solution_000000600.h5 b/out/solution_000000600.h5 new file mode 100644 index 0000000000000000000000000000000000000000..d0abdb39d979ff19f8a61ad83fdb5466c7cb477c GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000900.h5 b/out/solution_000000900.h5 new file mode 100644 index 0000000000000000000000000000000000000000..2c8fca684dda5b10d76ee2e91d1926040648181d GIT binary patch literal 34816 zcmeHQcU%?M5?(I7N=q=JV$4foECd8pKs+E~G>QUJEC_;Lg-8>y#YXHPw%AQ7cxUdN)wn5JGw`#aWHSSx9LZHSq<6vKN+;5EMZ=

YaNj?0I2_j>3+Z=!nUqq+?!b3I5N) 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≠V@tdn5n@c;i8d4OLU diff --git a/out/solution_000001000.h5 b/out/solution_000001000.h5 deleted file mode 100644 index 15c26a49bcd64a233121e4d5ff877e539d8a419a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 QZ;$-{4#@w1TfqPSU!le|e*gdg From b0aa1b54e14e6849dd0b01c5ce8b5f797a59d071 Mon Sep 17 00:00:00 2001 From: MarcoArtiano Date: Thu, 26 Jun 2025 15:13:04 +0200 Subject: [PATCH 08/21] add struct for tableau --- examples/trixi_rosenbrock.jl | 2 +- libs/Implicit/src/Implicit.jl | 34 ++++++++++++++++++++++++---------- out/mesh.h5 | Bin 0 -> 36832 bytes out/solution_000000000.h5 | Bin 0 -> 34816 bytes out/solution_000000003.h5 | Bin 0 -> 34816 bytes 5 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 out/mesh.h5 create mode 100644 out/solution_000000000.h5 create mode 100644 out/solution_000000003.h5 diff --git a/examples/trixi_rosenbrock.jl b/examples/trixi_rosenbrock.jl index 772cae3..6c9abbc 100644 --- a/examples/trixi_rosenbrock.jl +++ b/examples/trixi_rosenbrock.jl @@ -30,4 +30,4 @@ sol = solve( ode_default_options()..., callback = callbacks, # verbose=1, krylov_algo = :gmres, -); +); \ No newline at end of file diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 15ffcc2..11063ae 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -160,14 +160,13 @@ end struct Rosenbrock <: Direct{3} end -function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspace, M) +function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspace, M, RK) invdt = inv(Δt) - alpha, c, m, _ = RosenbrockTableau() @. u = uₙ @. res = 0 for j in 1:(stage-1) - @. u = u + alpha[stage, j] * stages[j] - @. res = res + c[stage, j] * stages[j] * invdt + @. u = u + RK.a[stage, j] * stages[j] + @. res = res + RK.c[stage, j] * stages[j] * invdt end ## It does not work for non-autonomous systems. @@ -179,11 +178,18 @@ function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspac if stage == 3 @. u = uₙ for j in 1:stage - @. u = u + m[j] * stages[j] + @. u = u + RK.m[j] * stages[j] end end end +abstract type RKTableau end + +struct RosenbrockButcher{T1 <: AbstractArray, T2 <: AbstractArray} <: RKTableau + a::T1 + c::T1 + m::T2 +end function RosenbrockTableau() @@ -209,11 +215,17 @@ function RosenbrockTableau() a = alpha * inv(gamma) m = transpose(b) * inv(gamma) c = diagm(inv.(diag(gamma))) - inv(gamma) + return RosenbrockButcher(a, c, vec(m)) - return a, c, m, nstage # alpha, c, m +end +function RKTableau(alg::Direct) + return RosenbrockTableau() end +function RKTableau(alg::NonDirect) + return RosenbrockTableau() +end function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} @@ -249,7 +261,7 @@ end # which are used in Trixi.jl. mutable struct SimpleImplicit{ RealT <: Real, uType, Params, Sol, F, M, Alg <: SimpleImplicitAlgorithm, - SimpleImplicitOptions, + SimpleImplicitOptions, RKTableau, } <: AbstractTimeIntegrator u::uType du::uType @@ -266,6 +278,7 @@ mutable struct SimpleImplicit{ alg::Alg # SimpleImplicitAlgorithm opts::SimpleImplicitOptions finalstep::Bool # added for convenience + RK::RKTableau end # Forward integrator.stats.naccept to integrator.iter (see GitHub PR#771) @@ -294,8 +307,7 @@ function init( SimpleImplicitOptions( callback, ode.tspan; kwargs..., - ), false, - ) + ), false, RKTableau(alg)) # initialize callbacks if callback isa CallbackSet @@ -365,8 +377,9 @@ function stage!(integrator, alg::Direct) workspace = krylov_workspace(:gmres, kc) for stage in 1:stages(alg) - alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, workspace, M) + alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, workspace, M, integrator.RK) end + end function step!(integrator::SimpleImplicit) @@ -389,6 +402,7 @@ function step!(integrator::SimpleImplicit) # one time step integrator.u_tmp .= integrator.u + stage!(integrator, alg) integrator.u .= integrator.u_tmp diff --git a/out/mesh.h5 b/out/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..b6fb4f4bd0d48c5f72180fd3e77199e68df21cad GIT binary patch literal 36832 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000003.h5 b/out/solution_000000003.h5 new file mode 100644 index 0000000000000000000000000000000000000000..076822c58c32927142bcff2683071aad63e7e3fa GIT binary patch literal 34816 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

&g0aHnS4^JDsiIZ(%+G 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 A00000 literal 0 HcmV?d00001 From bea7d6af22d2b685a9cb5706ff974b9eca2dcc1c Mon Sep 17 00:00:00 2001 From: MarcoArtiano Date: Thu, 26 Jun 2025 15:13:32 +0200 Subject: [PATCH 09/21] delete some useless files --- out/mesh.h5 | Bin 36832 -> 0 bytes out/solution_000000000.h5 | Bin 34816 -> 0 bytes out/solution_000000003.h5 | Bin 34816 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 out/mesh.h5 delete mode 100644 out/solution_000000000.h5 delete mode 100644 out/solution_000000003.h5 diff --git a/out/mesh.h5 b/out/mesh.h5 deleted file mode 100644 index b6fb4f4bd0d48c5f72180fd3e77199e68df21cad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36832 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 diff --git a/out/solution_000000003.h5 b/out/solution_000000003.h5 deleted file mode 100644 index 076822c58c32927142bcff2683071aad63e7e3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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

&g0aHnS4^JDsiIZ(%+G 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 A00000 From 6e81d6f98123557091be7c553c5436d525b1a329 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Thu, 26 Jun 2025 23:26:49 +0200 Subject: [PATCH 10/21] add DIRK --- examples/trixi_dirk.jl | 36 +++++++++ libs/Implicit/src/Implicit.jl | 146 +++++++++++++++++++++++++++++++++- 2 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 examples/trixi_dirk.jl diff --git a/examples/trixi_dirk.jl b/examples/trixi_dirk.jl new file mode 100644 index 0000000..b0c85b4 --- /dev/null +++ b/examples/trixi_dirk.jl @@ -0,0 +1,36 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), cfl = 10.0, sol = nothing, save_solution = nothing); + +############################################################################### +# run the simulation + +sol = solve( + ode, + # Implicit.RKImplicitEuler(); + # Implicit.KS2(); + Implicit.Crouzeix(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); \ No newline at end of file diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 11063ae..9048b6d 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -145,7 +145,7 @@ function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) # after Bonaventura2021 # They define the second stage as: # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ - # Which differs from Bank1985 + # Which differs from Bank1985) # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ # In the sign of u - γ₂ * Δt # a₁ == (1-γ₃) @@ -158,6 +158,38 @@ function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) end end +abstract type DIRK{N} <: SimpleImplicitAlgorithm{N} end + +struct RKImplicitEuler <: DIRK{1} end + +function (::RKImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) + if stage == 1 + # Stage 1: + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du + else + @. u = uₙ + RK.b[1] * Δt * stages[1] + end + +end + +struct KS2 <: DIRK{2} end +struct QZ2 <: DIRK{2} end +struct Crouzeix <: DIRK{2} end + +function (::DIRK{2})(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) + if stage == 1 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du + elseif stage == 2 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage,2] * Δt .* du + else + @. u = uₙ + Δt * (RK.b[1] * stages[1] + RK.b[2] * stages[2]) + end + +end + struct Rosenbrock <: Direct{3} end function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspace, M, RK) @@ -191,6 +223,12 @@ struct RosenbrockButcher{T1 <: AbstractArray, T2 <: AbstractArray} <: RKTableau m::T2 end +struct DIRKButcher{T1 <: AbstractArray, T2 <: AbstractArray} <: RKTableau + a::T1 + b::T2 + c::T2 +end + function RosenbrockTableau() # SSP - Knoth @@ -219,6 +257,72 @@ function RosenbrockTableau() end +function ImplicitEulerTableau() + + nstage = 1 + a = zeros(Float64, nstage, nstage) + a[1,1] = 1 + + b = zeros(Float64, nstage) + b[1] = 1 + + c = zeros(Float64, nstage) + c[1] = 1 + return DIRKButcher(a,b,c) +end + +# Kraaijevanger and Spijker's two-stage Diagonally Implicit Runge–Kutta method: +function KS2Tableau() + nstage = 2 + a = zeros(Float64, nstage, nstage) + a[1,1] = 1/2 + a[2,1] = -1/2 + a[2,2] = 2 + b = zeros(Float64, nstage) + b[1] = -1/2 + b[2] = 3/2 + + c = zeros(Float64, nstage) + c[1] = 1/2 + c[2] = 3/2 + return DIRKButcher(a,b,c) + +end +# Qin and Zhang's two-stage, 2nd order, symplectic Diagonally Implicit Runge–Kutta method: +function QZ2Tableau() + nstage = 2 + a = zeros(Float64, nstage, nstage) + a[1,1] = 1/4 + a[2,1] = 1/2 + a[2,2] = 1/4 + b = zeros(Float64, nstage) + b[1] = 1/2 + b[2] = 1/2 + + c = zeros(Float64, nstage) + c[1] = 1/4 + c[2] = 3/4 + return DIRKButcher(a,b,c) +end + +# Crouzeix's two-stage, 3rd order Diagonally Implicit Runge–Kutta method +function CrouzeixTableau() + nstage = 2 + a = zeros(Float64, nstage, nstage) + a[1,1] = 1/2 + sqrt(3)/6 + a[2,1] = -sqrt(3)/3 + a[2,2] = 1/2 + sqrt(3)/6 + b = zeros(Float64, nstage) + b[1] = 1/2 + b[2] = 1/2 + + c = zeros(Float64, nstage) + c[1] = 1/2 + sqrt(3)/6 + c[2] = 1/2 - sqrt(3)/6 + return DIRKButcher(a,b,c) +end + + function RKTableau(alg::Direct) return RosenbrockTableau() end @@ -227,11 +331,30 @@ function RKTableau(alg::NonDirect) return RosenbrockTableau() end +function RKTableau(alg::RKImplicitEuler) + return ImplicitEulerTableau() +end + +function RKTableau(alg::KS2) + return KS2Tableau() +end + +function RKTableau(alg::QZ2) + return QZ2Tableau() +end + +function RKTableau(alg::Crouzeix) + return CrouzeixTableau() +end function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) end +function nonlinear_problem(alg::DIRK, f::F) where {F} + return (res, u, (uₙ, Δt, du, p, t, stages, stage, RK)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage, RK) +end + # This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L1 mutable struct SimpleImplicitOptions{Callback} callback::Callback # callbacks; used in Trixi.jl @@ -368,6 +491,27 @@ function stage!(integrator, alg::NonDirect) end end +function stage!(integrator, alg::DIRK) + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage, integrator.RK), integrator.res; + verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, + algo = integrator.opts.algo, tol_abs = 6.0e-6, + ) + @assert stats.solved + + # Store the solution for each stage in stages + integrator.f(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .= integrator.du + if stage == stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage+1, integrator.RK) + end + + end +end + function stage!(integrator, alg::Direct) F!(du, u, p) = integrator.f(du, u, p, integrator.t) From 2ee55900b5d4013bff39baf874b29600db3ae68d Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Thu, 26 Jun 2025 23:42:51 +0200 Subject: [PATCH 11/21] Add three-stage DIRK --- examples/trixi_dirk.jl | 5 +- libs/Implicit/src/Implicit.jl | 92 +++++++++++++++++++++++++++++++---- 2 files changed, 85 insertions(+), 12 deletions(-) diff --git a/examples/trixi_dirk.jl b/examples/trixi_dirk.jl index b0c85b4..211d54a 100644 --- a/examples/trixi_dirk.jl +++ b/examples/trixi_dirk.jl @@ -27,8 +27,9 @@ trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic. sol = solve( ode, # Implicit.RKImplicitEuler(); - # Implicit.KS2(); - Implicit.Crouzeix(); + # Implicit.KS22(); + # Implicit.C23(); + Implicit.L33(); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback ode_default_options()..., callback = callbacks, # verbose=1, diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 9048b6d..32ec9b7 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -173,9 +173,9 @@ function (::RKImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) end -struct KS2 <: DIRK{2} end -struct QZ2 <: DIRK{2} end -struct Crouzeix <: DIRK{2} end +struct KS22 <: DIRK{2} end +struct QZ22 <: DIRK{2} end +struct C23 <: DIRK{2} end function (::DIRK{2})(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) if stage == 1 @@ -190,6 +190,25 @@ function (::DIRK{2})(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) end +struct C34 <: DIRK{3} end +struct L33 <: DIRK{3} end + +function (::DIRK{3})(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) + if stage == 1 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du + elseif stage == 2 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage,2] * Δt .* du + elseif stage == 3 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage,2] * Δt .* stages[2] - RK.a[stage,3] * Δt .* du + else + @. u = uₙ + Δt * (RK.b[1] * stages[1] + RK.b[2] * stages[2] + RK.b[3] * stages[3]) + end + +end + struct Rosenbrock <: Direct{3} end function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspace, M, RK) @@ -272,7 +291,7 @@ function ImplicitEulerTableau() end # Kraaijevanger and Spijker's two-stage Diagonally Implicit Runge–Kutta method: -function KS2Tableau() +function KS22Tableau() nstage = 2 a = zeros(Float64, nstage, nstage) a[1,1] = 1/2 @@ -289,7 +308,7 @@ function KS2Tableau() end # Qin and Zhang's two-stage, 2nd order, symplectic Diagonally Implicit Runge–Kutta method: -function QZ2Tableau() +function QZ22Tableau() nstage = 2 a = zeros(Float64, nstage, nstage) a[1,1] = 1/4 @@ -306,7 +325,7 @@ function QZ2Tableau() end # Crouzeix's two-stage, 3rd order Diagonally Implicit Runge–Kutta method -function CrouzeixTableau() +function C23Tableau() nstage = 2 a = zeros(Float64, nstage, nstage) a[1,1] = 1/2 + sqrt(3)/6 @@ -321,7 +340,52 @@ function CrouzeixTableau() c[2] = 1/2 - sqrt(3)/6 return DIRKButcher(a,b,c) end +# Crouzeix's three-stage, 4th order Diagonally Implicit Runge–Kutta method: +function C34Tableau() + nstage = 3 + alpha = 2/sqrt(3)*cospi(1/18) + a = zeros(Float64, nstage, nstage) + a[1,1] = (1+alpha)/2 + a[2,1] = -alpha/2 + a[2,2] = a[1,1] + a[3,1] = 1+ alpha + a[3,2] = -(1+2*alpha) + a[3,3] = (1+alpha)/2 + b = zeros(Float64, nstage) + b[1] = 1/(6*alpha^2) + b[2] = 1-1/(3*alpha^2) + b[3] = 1/(6*alpha^2) + + c = zeros(Float64, nstage) + c[1] = a[1,1] + c[2] = a[2,1] + a[2,2] + c[3] = a[3,1] + a[3,2] + a[3,3] + return DIRKButcher(a,b,c) +end +# L-Stable third order, FSAL! It can be optmized, because of the FSAL. +function L33Tableau() + nstage = 3 + x = 0.4368665215 + alpha = 2/sqrt(3)*cospi(1/18) + a = zeros(Float64, nstage, nstage) + a[1,1] = x + a[2,1] = (1-x)/2 + a[2,2] = x + a[3,1] = -3*x^2/2 + 4*x - 1/4 + a[3,2] = 3*x^2/2 -5*x + 5/4 + a[3,3] = x + b = zeros(Float64, nstage) + b[1] = a[3,1] + b[2] = a[3,2] + b[3] = a[3,3] + + c = zeros(Float64, nstage) + c[1] = a[1,1] + c[2] = a[2,1] + a[2,2] + c[3] = a[3,1] + a[3,2] + a[3,3] + return DIRKButcher(a,b,c) +end function RKTableau(alg::Direct) return RosenbrockTableau() @@ -335,16 +399,24 @@ function RKTableau(alg::RKImplicitEuler) return ImplicitEulerTableau() end -function RKTableau(alg::KS2) +function RKTableau(alg::KS22) return KS2Tableau() end -function RKTableau(alg::QZ2) +function RKTableau(alg::QZ22) return QZ2Tableau() end -function RKTableau(alg::Crouzeix) - return CrouzeixTableau() +function RKTableau(alg::C23) + return C23Tableau() +end + +function RKTableau(alg::C34) + return C34Tableau() +end + +function RKTableau(alg::L33) + return L33Tableau() end function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} From 8735a38314ed58b15e4ebf603823fa59b6911baa Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Fri, 27 Jun 2025 09:06:02 +0200 Subject: [PATCH 12/21] add TRBDF2 as DIRK --- examples/trixi_dirk.jl | 3 +- libs/Implicit/src/Implicit.jl | 881 ++++++++++++++++++---------------- 2 files changed, 457 insertions(+), 427 deletions(-) diff --git a/examples/trixi_dirk.jl b/examples/trixi_dirk.jl index 211d54a..4f5d358 100644 --- a/examples/trixi_dirk.jl +++ b/examples/trixi_dirk.jl @@ -29,7 +29,8 @@ sol = solve( # Implicit.RKImplicitEuler(); # Implicit.KS22(); # Implicit.C23(); - Implicit.L33(); + # Implicit.L33(); + Implicit.RKTRBDF2(); dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback ode_default_options()..., callback = callbacks, # verbose=1, diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 32ec9b7..eb3069a 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -7,8 +7,8 @@ import Ariadne: JacobianOperator, MOperator using Krylov struct MOperator{JOp} - J::JOp - dt::Float64 + J::JOp + dt::Float64 end Base.size(M::MOperator) = size(M.J) @@ -17,18 +17,18 @@ Base.length(M::MOperator) = length(M.J) import LinearAlgebra: mul! function mul!(out::AbstractVector, M::MOperator, v::AbstractVector) - # out = (I/dt - J(f,x,p)) * v - mul!(out, M.J, v) - @. out = v / M.dt - out - return nothing + # out = (I/dt - J(f,x,p)) * v + mul!(out, M.J, v) + @. out = v / M.dt - out + return nothing end # Wrapper type for solutions from Implicit.jl's own time integrators, partially mimicking # SciMLBase.ODESolution -struct TimeIntegratorSolution{tType, uType, P} - t::tType - u::uType - prob::P +struct TimeIntegratorSolution{tType,uType,P} + t::tType + u::uType + prob::P end # Abstract supertype of Implict.jl's own time integrators for dispatch @@ -41,32 +41,32 @@ export solve, ODEProblem # Interface required by DiffEqCallbacks.jl function DiffEqBase.get_tstops(integrator::AbstractTimeIntegrator) - return integrator.opts.tstops + return integrator.opts.tstops end function DiffEqBase.get_tstops_array(integrator::AbstractTimeIntegrator) - return get_tstops(integrator).valtree + return get_tstops(integrator).valtree end function DiffEqBase.get_tstops_max(integrator::AbstractTimeIntegrator) - return maximum(get_tstops_array(integrator)) + return maximum(get_tstops_array(integrator)) end function finalize_callbacks(integrator::AbstractTimeIntegrator) - callbacks = integrator.opts.callback + callbacks = integrator.opts.callback - return if callbacks isa CallbackSet - foreach(callbacks.discrete_callbacks) do cb - cb.finalize(cb, integrator.u, integrator.t, integrator) - end - foreach(callbacks.continuous_callbacks) do cb - cb.finalize(cb, integrator.u, integrator.t, integrator) - end - end + return if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + cb.finalize(cb, integrator.u, integrator.t, integrator) + end + foreach(callbacks.continuous_callbacks) do cb + cb.finalize(cb, integrator.u, integrator.t, integrator) + end + end end import SciMLBase: get_du, get_tmp_cache, u_modified!, - init, step!, check_error, - get_proposed_dt, set_proposed_dt!, - terminate!, remake, add_tstop!, has_tstop, first_tstop + init, step!, check_error, + get_proposed_dt, set_proposed_dt!, + terminate!, remake, add_tstop!, has_tstop, first_tstop # Abstract base type for time integration schemes @@ -78,35 +78,35 @@ stages(::SimpleImplicitAlgorithm{N}) where {N} = N struct ImplicitEuler <: NonDirect{1} end function (::ImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - f!(du, u, p, t + Δt) # t = t0 + c_1 * Δt + f!(du, u, p, t + Δt) # t = t0 + c_1 * Δt - res .= uₙ .+ Δt .* du .- u # Δt * a_11 - return nothing + res .= uₙ .+ Δt .* du .- u # Δt * a_11 + return nothing end struct ImplicitMidpoint <: SimpleImplicitAlgorithm{1} end function (::ImplicitMidpoint)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - # Evaluate f at midpoint: f((uₙ + u)/2, t + Δt/2) - # Use res for a temporary allocation (uₙ .+ u) ./ 2 - uuₙ = res - uuₙ .= 0.5 .* (uₙ .+ u) - f!(du, uuₙ, p, t + 0.5 * Δt) + # Evaluate f at midpoint: f((uₙ + u)/2, t + Δt/2) + # Use res for a temporary allocation (uₙ .+ u) ./ 2 + uuₙ = res + uuₙ .= 0.5 .* (uₙ .+ u) + f!(du, uuₙ, p, t + 0.5 * Δt) - res .= uₙ .+ Δt .* du .- u - return nothing + res .= uₙ .+ Δt .* du .- u + return nothing end struct ImplicitTrapezoid <: SimpleImplicitAlgorithm{1} end function (::ImplicitTrapezoid)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - # Need to evaluate f at both endpoints - # f(uₙ, t) and f(u, t + Δt) - # Use res as the temporary for duₙ = f(uₙ, t) - duₙ = res - f!(duₙ, uₙ, p, t) - f!(du, u, p, t + Δt) + # Need to evaluate f at both endpoints + # f(uₙ, t) and f(u, t + Δt) + # Use res as the temporary for duₙ = f(uₙ, t) + duₙ = res + f!(duₙ, uₙ, p, t) + f!(du, u, p, t + Δt) - res .= uₙ .+ (Δt / 2) .* (duₙ .+ du) .- u - return nothing + res .= uₙ .+ (Δt / 2) .* (duₙ .+ du) .- u + return nothing end """ @@ -118,44 +118,44 @@ See [Hosea1996-xv](@cite) for how it relates to implicit RK methods """ struct TRBDF2 <: SimpleImplicitAlgorithm{2} end function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - γ = 2 - √2 - return if stage == 1 - # Stage 1: Trapezoidal rule to t + γΔt - # u here is u₁ candidate - duₙ = res - f!(duₙ, uₙ, p, t) - f!(du, u, p, t + γ * Δt) - - res .= uₙ .+ ((γ / 2) * Δt) .* (duₙ .+ du) .- u - else - # Stage 2: BDF2 from t + γΔt to t + Δt - # Note these are unequal timestep - f!(du, u, p, t + Δt) - - u₁ = stages[1] - - # Bank1985 defines in eq 32 - # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ - # Manual derivation (devision by (2-γ) and then move everything to one side.) - # a₁ = -((1 - γ)^2) / (γ * (2 - γ)) - # a₂ = 1 / (γ * (2 - γ)) - # a₃ = - (1 - γ) / (2 - γ) - # res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u - - # after Bonaventura2021 - # They define the second stage as: - # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ - # Which differs from Bank1985) - # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ - # In the sign of u - γ₂ * Δt - # a₁ == (1-γ₃) - # a₂ == γ₃ - # a₃ == -γ₂ - γ₂ = (1 - γ) / (2 - γ) - γ₃ = 1 / (γ * (2 - γ)) - - res .= (1 - γ₃) .* uₙ .+ γ₃ .* u₁ + (γ₂ * Δt) .* du .- u - end + γ = 2 - √2 + return if stage == 1 + # Stage 1: Trapezoidal rule to t + γΔt + # u here is u₁ candidate + duₙ = res + f!(duₙ, uₙ, p, t) + f!(du, u, p, t + γ * Δt) + + res .= uₙ .+ ((γ / 2) * Δt) .* (duₙ .+ du) .- u + else + # Stage 2: BDF2 from t + γΔt to t + Δt + # Note these are unequal timestep + f!(du, u, p, t + Δt) + + u₁ = stages[1] + + # Bank1985 defines in eq 32 + # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ + # Manual derivation (devision by (2-γ) and then move everything to one side.) + # a₁ = -((1 - γ)^2) / (γ * (2 - γ)) + # a₂ = 1 / (γ * (2 - γ)) + # a₃ = - (1 - γ) / (2 - γ) + # res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u + + # after Bonaventura2021 + # They define the second stage as: + # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ + # Which differs from Bank1985) + # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ + # In the sign of u - γ₂ * Δt + # a₁ == (1-γ₃) + # a₂ == γ₃ + # a₃ == -γ₂ + γ₂ = (1 - γ) / (2 - γ) + γ₃ = 1 / (γ * (2 - γ)) + + res .= (1 - γ₃) .* uₙ .+ γ₃ .* u₁ + (γ₂ * Δt) .* du .- u + end end abstract type DIRK{N} <: SimpleImplicitAlgorithm{N} end @@ -163,13 +163,13 @@ abstract type DIRK{N} <: SimpleImplicitAlgorithm{N} end struct RKImplicitEuler <: DIRK{1} end function (::RKImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) - if stage == 1 - # Stage 1: - f!(du, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du - else - @. u = uₙ + RK.b[1] * Δt * stages[1] - end + if stage == 1 + # Stage 1: + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du + else + @. u = uₙ + RK.b[1] * Δt * stages[1] + end end @@ -178,276 +178,305 @@ struct QZ22 <: DIRK{2} end struct C23 <: DIRK{2} end function (::DIRK{2})(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) - if stage == 1 - f!(du, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du - elseif stage == 2 - f!(du, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage,2] * Δt .* du - else - @. u = uₙ + Δt * (RK.b[1] * stages[1] + RK.b[2] * stages[2]) - end + if stage == 1 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du + elseif stage == 2 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage, 2] * Δt .* du + else + @. u = uₙ + Δt * (RK.b[1] * stages[1] + RK.b[2] * stages[2]) + end end struct C34 <: DIRK{3} end struct L33 <: DIRK{3} end +struct RKTRBDF2 <: DIRK{3} end + function (::DIRK{3})(res, uₙ, Δt, f!, du, u, p, t, stages, stage, RK) - if stage == 1 - f!(du, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du - elseif stage == 2 - f!(du, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage,2] * Δt .* du - elseif stage == 3 - f!(du, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage,2] * Δt .* stages[2] - RK.a[stage,3] * Δt .* du - else - @. u = uₙ + Δt * (RK.b[1] * stages[1] + RK.b[2] * stages[2] + RK.b[3] * stages[3]) - end + if stage == 1 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* du + elseif stage == 2 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage, 2] * Δt .* du + elseif stage == 3 + f!(du, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, 1] * Δt .* stages[1] - RK.a[stage, 2] * Δt .* stages[2] - RK.a[stage, 3] * Δt .* du + else + @. u = uₙ + Δt * (RK.b[1] * stages[1] + RK.b[2] * stages[2] + RK.b[3] * stages[3]) + end end struct Rosenbrock <: Direct{3} end function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspace, M, RK) - invdt = inv(Δt) - @. u = uₙ - @. res = 0 - for j in 1:(stage-1) - @. u = u + RK.a[stage, j] * stages[j] - @. res = res + RK.c[stage, j] * stages[j] * invdt - end + invdt = inv(Δt) + @. u = uₙ + @. res = 0 + for j in 1:(stage-1) + @. u = u + RK.a[stage, j] * stages[j] + @. res = res + RK.c[stage, j] * stages[j] * invdt + end - ## It does not work for non-autonomous systems. - f!(du, u, p, t + Δt) + ## It does not work for non-autonomous systems. + f!(du, u, p, t + Δt) - krylov_solve!(workspace, M, copy(du .+ res)) - stages[stage] .= workspace.x + krylov_solve!(workspace, M, copy(du .+ res)) + stages[stage] .= workspace.x - if stage == 3 - @. u = uₙ - for j in 1:stage - @. u = u + RK.m[j] * stages[j] - end - end + if stage == 3 + @. u = uₙ + for j in 1:stage + @. u = u + RK.m[j] * stages[j] + end + end end abstract type RKTableau end -struct RosenbrockButcher{T1 <: AbstractArray, T2 <: AbstractArray} <: RKTableau - a::T1 - c::T1 - m::T2 +struct RosenbrockButcher{T1<:AbstractArray,T2<:AbstractArray} <: RKTableau + a::T1 + c::T1 + m::T2 end -struct DIRKButcher{T1 <: AbstractArray, T2 <: AbstractArray} <: RKTableau - a::T1 - b::T2 - c::T2 +struct DIRKButcher{T1<:AbstractArray,T2<:AbstractArray} <: RKTableau + a::T1 + b::T2 + c::T2 end function RosenbrockTableau() - # SSP - Knoth - nstage = 3 - alpha = zeros(Float64, nstage, nstage) - alpha[2, 1] = 1 - alpha[3, 1] = 1 / 4 - alpha[3, 2] = 1 / 4 + # SSP - Knoth + nstage = 3 + alpha = zeros(Float64, nstage, nstage) + alpha[2, 1] = 1 + alpha[3, 1] = 1 / 4 + alpha[3, 2] = 1 / 4 - b = zeros(Float64, nstage) - b[1] = 1 / 6 - b[2] = 1 / 6 - b[3] = 2 / 3 + b = zeros(Float64, nstage) + b[1] = 1 / 6 + b[2] = 1 / 6 + b[3] = 2 / 3 - gamma = zeros(Float64, nstage, nstage) - gamma[1, 1] = 1 - gamma[2, 2] = 1 - gamma[3, 1] = -3 / 4 - gamma[3, 2] = -3 / 4 - gamma[3, 3] = 1 + gamma = zeros(Float64, nstage, nstage) + gamma[1, 1] = 1 + gamma[2, 2] = 1 + gamma[3, 1] = -3 / 4 + gamma[3, 2] = -3 / 4 + gamma[3, 3] = 1 - a = alpha * inv(gamma) - m = transpose(b) * inv(gamma) - c = diagm(inv.(diag(gamma))) - inv(gamma) - return RosenbrockButcher(a, c, vec(m)) + a = alpha * inv(gamma) + m = transpose(b) * inv(gamma) + c = diagm(inv.(diag(gamma))) - inv(gamma) + return RosenbrockButcher(a, c, vec(m)) end function ImplicitEulerTableau() - nstage = 1 - a = zeros(Float64, nstage, nstage) - a[1,1] = 1 + nstage = 1 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 - b = zeros(Float64, nstage) - b[1] = 1 + b = zeros(Float64, nstage) + b[1] = 1 - c = zeros(Float64, nstage) - c[1] = 1 - return DIRKButcher(a,b,c) + c = zeros(Float64, nstage) + c[1] = 1 + return DIRKButcher(a, b, c) end # Kraaijevanger and Spijker's two-stage Diagonally Implicit Runge–Kutta method: function KS22Tableau() - nstage = 2 - a = zeros(Float64, nstage, nstage) - a[1,1] = 1/2 - a[2,1] = -1/2 - a[2,2] = 2 - b = zeros(Float64, nstage) - b[1] = -1/2 - b[2] = 3/2 + nstage = 2 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 / 2 + a[2, 1] = -1 / 2 + a[2, 2] = 2 + b = zeros(Float64, nstage) + b[1] = -1 / 2 + b[2] = 3 / 2 - c = zeros(Float64, nstage) - c[1] = 1/2 - c[2] = 3/2 - return DIRKButcher(a,b,c) + c = zeros(Float64, nstage) + c[1] = 1 / 2 + c[2] = 3 / 2 + return DIRKButcher(a, b, c) end + # Qin and Zhang's two-stage, 2nd order, symplectic Diagonally Implicit Runge–Kutta method: function QZ22Tableau() - nstage = 2 - a = zeros(Float64, nstage, nstage) - a[1,1] = 1/4 - a[2,1] = 1/2 - a[2,2] = 1/4 - b = zeros(Float64, nstage) - b[1] = 1/2 - b[2] = 1/2 + nstage = 2 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 / 4 + a[2, 1] = 1 / 2 + a[2, 2] = 1 / 4 + b = zeros(Float64, nstage) + b[1] = 1 / 2 + b[2] = 1 / 2 - c = zeros(Float64, nstage) - c[1] = 1/4 - c[2] = 3/4 - return DIRKButcher(a,b,c) + c = zeros(Float64, nstage) + c[1] = 1 / 4 + c[2] = 3 / 4 + return DIRKButcher(a, b, c) end # Crouzeix's two-stage, 3rd order Diagonally Implicit Runge–Kutta method function C23Tableau() - nstage = 2 - a = zeros(Float64, nstage, nstage) - a[1,1] = 1/2 + sqrt(3)/6 - a[2,1] = -sqrt(3)/3 - a[2,2] = 1/2 + sqrt(3)/6 - b = zeros(Float64, nstage) - b[1] = 1/2 - b[2] = 1/2 - - c = zeros(Float64, nstage) - c[1] = 1/2 + sqrt(3)/6 - c[2] = 1/2 - sqrt(3)/6 - return DIRKButcher(a,b,c) + nstage = 2 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 / 2 + sqrt(3) / 6 + a[2, 1] = -sqrt(3) / 3 + a[2, 2] = 1 / 2 + sqrt(3) / 6 + b = zeros(Float64, nstage) + b[1] = 1 / 2 + b[2] = 1 / 2 + + c = zeros(Float64, nstage) + c[1] = 1 / 2 + sqrt(3) / 6 + c[2] = 1 / 2 - sqrt(3) / 6 + return DIRKButcher(a, b, c) end # Crouzeix's three-stage, 4th order Diagonally Implicit Runge–Kutta method: function C34Tableau() - nstage = 3 - alpha = 2/sqrt(3)*cospi(1/18) - a = zeros(Float64, nstage, nstage) - a[1,1] = (1+alpha)/2 - a[2,1] = -alpha/2 - a[2,2] = a[1,1] - a[3,1] = 1+ alpha - a[3,2] = -(1+2*alpha) - a[3,3] = (1+alpha)/2 - b = zeros(Float64, nstage) - b[1] = 1/(6*alpha^2) - b[2] = 1-1/(3*alpha^2) - b[3] = 1/(6*alpha^2) - - c = zeros(Float64, nstage) - c[1] = a[1,1] - c[2] = a[2,1] + a[2,2] - c[3] = a[3,1] + a[3,2] + a[3,3] - return DIRKButcher(a,b,c) + nstage = 3 + alpha = 2 / sqrt(3) * cospi(1 / 18) + a = zeros(Float64, nstage, nstage) + a[1, 1] = (1 + alpha) / 2 + a[2, 1] = -alpha / 2 + a[2, 2] = a[1, 1] + a[3, 1] = 1 + alpha + a[3, 2] = -(1 + 2 * alpha) + a[3, 3] = (1 + alpha) / 2 + b = zeros(Float64, nstage) + b[1] = 1 / (6 * alpha^2) + b[2] = 1 - 1 / (3 * alpha^2) + b[3] = 1 / (6 * alpha^2) + + c = zeros(Float64, nstage) + c[1] = a[1, 1] + c[2] = a[2, 1] + a[2, 2] + c[3] = a[3, 1] + a[3, 2] + a[3, 3] + return DIRKButcher(a, b, c) end # L-Stable third order, FSAL! It can be optmized, because of the FSAL. function L33Tableau() + nstage = 3 + x = 0.4368665215 + alpha = 2 / sqrt(3) * cospi(1 / 18) + a = zeros(Float64, nstage, nstage) + a[1, 1] = x + a[2, 1] = (1 - x) / 2 + a[2, 2] = x + a[3, 1] = -3 * x^2 / 2 + 4 * x - 1 / 4 + a[3, 2] = 3 * x^2 / 2 - 5 * x + 5 / 4 + a[3, 3] = x + b = zeros(Float64, nstage) + b[1] = a[3, 1] + b[2] = a[3, 2] + b[3] = a[3, 3] + + c = zeros(Float64, nstage) + c[1] = a[1, 1] + c[2] = a[2, 1] + a[2, 2] + c[3] = a[3, 1] + a[3, 2] + a[3, 3] + return DIRKButcher(a, b, c) +end + +function TRBDF2Tableau() nstage = 3 - x = 0.4368665215 - alpha = 2/sqrt(3)*cospi(1/18) + gamma = 2 - sqrt(2) a = zeros(Float64, nstage, nstage) - a[1,1] = x - a[2,1] = (1-x)/2 - a[2,2] = x - a[3,1] = -3*x^2/2 + 4*x - 1/4 - a[3,2] = 3*x^2/2 -5*x + 5/4 - a[3,3] = x - b = zeros(Float64, nstage) - b[1] = a[3,1] - b[2] = a[3,2] - b[3] = a[3,3] - - c = zeros(Float64, nstage) - c[1] = a[1,1] - c[2] = a[2,1] + a[2,2] - c[3] = a[3,1] + a[3,2] + a[3,3] - return DIRKButcher(a,b,c) + a[2,1] = gamma/2 + a[2,2] = a[2,1] + a[3,1] = 1/(2*(2-gamma)) + a[3,2] = a[3,1] + a[3,3] = (1-gamma)/(2-gamma) + + b = zeros(Float64, nstage) + b[1] = a[3, 1] + b[2] = a[3, 2] + b[3] = a[3, 3] + + c = zeros(Float64, nstage) + c[1] = a[1, 1] + c[2] = a[2, 1] + a[2, 2] + c[3] = a[3, 1] + a[3, 2] + a[3, 3] + return DIRKButcher(a, b, c) end function RKTableau(alg::Direct) - return RosenbrockTableau() + return RosenbrockTableau() end function RKTableau(alg::NonDirect) - return RosenbrockTableau() + return RosenbrockTableau() end function RKTableau(alg::RKImplicitEuler) - return ImplicitEulerTableau() + return ImplicitEulerTableau() end function RKTableau(alg::KS22) - return KS2Tableau() + return KS2Tableau() end function RKTableau(alg::QZ22) - return QZ2Tableau() + return QZ2Tableau() end function RKTableau(alg::C23) - return C23Tableau() + return C23Tableau() end function RKTableau(alg::C34) - return C34Tableau() + return C34Tableau() end function RKTableau(alg::L33) - return L33Tableau() + return L33Tableau() +end + +function RKTableau(alg::RKTRBDF2) + return TRBDF2Tableau() end function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} - return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) + return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) end function nonlinear_problem(alg::DIRK, f::F) where {F} - return (res, u, (uₙ, Δt, du, p, t, stages, stage, RK)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage, RK) + return (res, u, (uₙ, Δt, du, p, t, stages, stage, RK)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage, RK) end # This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L1 mutable struct SimpleImplicitOptions{Callback} - callback::Callback # callbacks; used in Trixi.jl - adaptive::Bool # whether the algorithm is adaptive; ignored - dtmax::Float64 # ignored - maxiters::Int # maximal number of time steps - tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored - verbose::Int - algo::Symbol - krylov_kwargs::Any + callback::Callback # callbacks; used in Trixi.jl + adaptive::Bool # whether the algorithm is adaptive; ignored + dtmax::Float64 # ignored + maxiters::Int # maximal number of time steps + tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored + verbose::Int + algo::Symbol + krylov_kwargs::Any end -function SimpleImplicitOptions(callback, tspan; maxiters = typemax(Int), verbose = 0, krylov_algo = :gmres, krylov_kwargs = (;), kwargs...) - return SimpleImplicitOptions{typeof(callback)}( - callback, false, Inf, maxiters, - [last(tspan)], - verbose, - krylov_algo, - krylov_kwargs, - ) +function SimpleImplicitOptions(callback, tspan; maxiters=typemax(Int), verbose=0, krylov_algo=:gmres, krylov_kwargs=(;), kwargs...) + return SimpleImplicitOptions{typeof(callback)}( + callback, false, Inf, maxiters, + [last(tspan)], + verbose, + krylov_algo, + krylov_kwargs, + ) end # This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L77 @@ -455,194 +484,194 @@ end # https://diffeq.sciml.ai/v6.8/basics/integrator/#Handing-Integrators-1 # which are used in Trixi.jl. mutable struct SimpleImplicit{ - RealT <: Real, uType, Params, Sol, F, M, Alg <: SimpleImplicitAlgorithm, - SimpleImplicitOptions, RKTableau, + RealT<:Real,uType,Params,Sol,F,M,Alg<:SimpleImplicitAlgorithm, + SimpleImplicitOptions,RKTableau, } <: AbstractTimeIntegrator - u::uType - du::uType - u_tmp::uType - stages::NTuple{M, uType} - res::uType - t::RealT - dt::RealT # current time step - dtcache::RealT # ignored - iter::Int # current number of time steps (iteration) - p::Params # will be the semidiscretization from Trixi.jl - sol::Sol # faked - f::F # `rhs!` of the semidiscretization - alg::Alg # SimpleImplicitAlgorithm - opts::SimpleImplicitOptions - finalstep::Bool # added for convenience - RK::RKTableau + u::uType + du::uType + u_tmp::uType + stages::NTuple{M,uType} + res::uType + t::RealT + dt::RealT # current time step + dtcache::RealT # ignored + iter::Int # current number of time steps (iteration) + p::Params # will be the semidiscretization from Trixi.jl + sol::Sol # faked + f::F # `rhs!` of the semidiscretization + alg::Alg # SimpleImplicitAlgorithm + opts::SimpleImplicitOptions + finalstep::Bool # added for convenience + RK::RKTableau end # Forward integrator.stats.naccept to integrator.iter (see GitHub PR#771) function Base.getproperty(integrator::SimpleImplicit, field::Symbol) - if field === :stats - return (naccept = getfield(integrator, :iter),) - end - # general fallback - return getfield(integrator, field) + if field === :stats + return (naccept=getfield(integrator, :iter),) + end + # general fallback + return getfield(integrator, field) end function init( - ode::ODEProblem, alg::SimpleImplicitAlgorithm{N}; - dt, callback::Union{CallbackSet, Nothing} = nothing, kwargs..., + ode::ODEProblem, alg::SimpleImplicitAlgorithm{N}; + dt, callback::Union{CallbackSet,Nothing}=nothing, kwargs..., ) where {N} - u = copy(ode.u0) - du = zero(u) - res = zero(u) - u_tmp = similar(u) - stages = ntuple(_ -> similar(u), Val(N)) - t = first(ode.tspan) - iter = 0 - integrator = SimpleImplicit( - u, du, u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, - (prob = ode,), ode.f, alg, - SimpleImplicitOptions( - callback, ode.tspan; - kwargs..., - ), false, RKTableau(alg)) - - # initialize callbacks - if callback isa CallbackSet - foreach(callback.continuous_callbacks) do cb - throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) - end - foreach(callback.discrete_callbacks) do cb - cb.initialize(cb, integrator.u, integrator.t, integrator) - end - end - - return integrator + u = copy(ode.u0) + du = zero(u) + res = zero(u) + u_tmp = similar(u) + stages = ntuple(_ -> similar(u), Val(N)) + t = first(ode.tspan) + iter = 0 + integrator = SimpleImplicit( + u, du, u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + (prob=ode,), ode.f, alg, + SimpleImplicitOptions( + callback, ode.tspan; + kwargs..., + ), false, RKTableau(alg)) + + # initialize callbacks + if callback isa CallbackSet + foreach(callback.continuous_callbacks) do cb + throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) + end + foreach(callback.discrete_callbacks) do cb + cb.initialize(cb, integrator.u, integrator.t, integrator) + end + end + + return integrator end # Fakes `solve`: https://diffeq.sciml.ai/v6.8/basics/overview/#Solving-the-Problems-1 function solve( - ode::ODEProblem, alg::SimpleImplicitAlgorithm; - dt, callback = nothing, kwargs..., + ode::ODEProblem, alg::SimpleImplicitAlgorithm; + dt, callback=nothing, kwargs..., ) - integrator = init(ode, alg, dt = dt, callback = callback; kwargs...) + integrator = init(ode, alg, dt=dt, callback=callback; kwargs...) - # Start actual solve - return solve!(integrator) + # Start actual solve + return solve!(integrator) end function solve!(integrator::SimpleImplicit) - @unpack prob = integrator.sol + @unpack prob = integrator.sol - integrator.finalstep = false + integrator.finalstep = false - while !integrator.finalstep - step!(integrator) - end # "main loop" timer + while !integrator.finalstep + step!(integrator) + end # "main loop" timer - finalize_callbacks(integrator) + finalize_callbacks(integrator) - return TimeIntegratorSolution( - (first(prob.tspan), integrator.t), - (prob.u0, integrator.u), - integrator.sol.prob, - ) + return TimeIntegratorSolution( + (first(prob.tspan), integrator.t), + (prob.u0, integrator.u), + integrator.sol.prob, + ) end function stage!(integrator, alg::NonDirect) - for stage in 1:stages(alg) - F! = nonlinear_problem(alg, integrator.f) - # TODO: Pass in `stages[1:(stage-1)]` or full tuple? - _, stats = Ariadne.newton_krylov!( - F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; - verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, - algo = integrator.opts.algo, tol_abs = 6.0e-6, - ) - @assert stats.solved - if stage < stages(alg) - # Store the solution for each stage in stages - integrator.stages[stage] .= integrator.u_tmp - end - end + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; + verbose=integrator.opts.verbose, krylov_kwargs=integrator.opts.krylov_kwargs, + algo=integrator.opts.algo, tol_abs=6.0e-6, + ) + @assert stats.solved + if stage < stages(alg) + # Store the solution for each stage in stages + integrator.stages[stage] .= integrator.u_tmp + end + end end function stage!(integrator, alg::DIRK) - for stage in 1:stages(alg) - F! = nonlinear_problem(alg, integrator.f) - # TODO: Pass in `stages[1:(stage-1)]` or full tuple? - _, stats = Ariadne.newton_krylov!( - F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage, integrator.RK), integrator.res; - verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, - algo = integrator.opts.algo, tol_abs = 6.0e-6, - ) - @assert stats.solved - - # Store the solution for each stage in stages - integrator.f(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) - integrator.stages[stage] .= integrator.du - if stage == stages(alg) - alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage+1, integrator.RK) - end - - end + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage, integrator.RK), integrator.res; + verbose=integrator.opts.verbose, krylov_kwargs=integrator.opts.krylov_kwargs, + algo=integrator.opts.algo, tol_abs=6.0e-6, + ) + @assert stats.solved + + # Store the solution for each stage in stages + integrator.f(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .= integrator.du + if stage == stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK) + end + + end end function stage!(integrator, alg::Direct) - F!(du, u, p) = integrator.f(du, u, p, integrator.t) - J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) - M = MOperator(J, integrator.dt) - kc = KrylovConstructor(integrator.res) - workspace = krylov_workspace(:gmres, kc) + F!(du, u, p) = integrator.f(du, u, p, integrator.t) + J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) + M = MOperator(J, integrator.dt) + kc = KrylovConstructor(integrator.res) + workspace = krylov_workspace(:gmres, kc) - for stage in 1:stages(alg) - alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, workspace, M, integrator.RK) - end + for stage in 1:stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, workspace, M, integrator.RK) + end end function step!(integrator::SimpleImplicit) - @unpack prob = integrator.sol - @unpack alg = integrator - t_end = last(prob.tspan) - callbacks = integrator.opts.callback - - @assert !integrator.finalstep - if isnan(integrator.dt) - error("time step size `dt` is NaN") - end - - # if the next iteration would push the simulation beyond the end time, set dt accordingly - if integrator.t + integrator.dt > t_end || - isapprox(integrator.t + integrator.dt, t_end) - integrator.dt = t_end - integrator.t - terminate!(integrator) - end - - # one time step - integrator.u_tmp .= integrator.u - - stage!(integrator, alg) - - integrator.u .= integrator.u_tmp - - integrator.iter += 1 - integrator.t += integrator.dt - - begin - # handle callbacks - if callbacks isa CallbackSet - foreach(callbacks.discrete_callbacks) do cb - if cb.condition(integrator.u, integrator.t, integrator) - cb.affect!(integrator) - end - return nothing - end - end - end - - # respect maximum number of iterations - return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep - @warn "Interrupted. Larger maxiters is needed." - terminate!(integrator) - end + @unpack prob = integrator.sol + @unpack alg = integrator + t_end = last(prob.tspan) + callbacks = integrator.opts.callback + + @assert !integrator.finalstep + if isnan(integrator.dt) + error("time step size `dt` is NaN") + end + + # if the next iteration would push the simulation beyond the end time, set dt accordingly + if integrator.t + integrator.dt > t_end || + isapprox(integrator.t + integrator.dt, t_end) + integrator.dt = t_end - integrator.t + terminate!(integrator) + end + + # one time step + integrator.u_tmp .= integrator.u + + stage!(integrator, alg) + + integrator.u .= integrator.u_tmp + + integrator.iter += 1 + integrator.t += integrator.dt + + begin + # handle callbacks + if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + if cb.condition(integrator.u, integrator.t, integrator) + cb.affect!(integrator) + end + return nothing + end + end + end + + # respect maximum number of iterations + return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep + @warn "Interrupted. Larger maxiters is needed." + terminate!(integrator) + end end # get a cache where the RHS can be stored @@ -654,39 +683,39 @@ u_modified!(integrator::SimpleImplicit, ::Bool) = false # used by adaptive timestepping algorithms in DiffEq function set_proposed_dt!(integrator::SimpleImplicit, dt) - return integrator.dt = dt + return integrator.dt = dt end # Required e.g. for `glm_speed_callback` function get_proposed_dt(integrator::SimpleImplicit) - return integrator.dt + return integrator.dt end # stop the time integration function terminate!(integrator::SimpleImplicit) - integrator.finalstep = true - return empty!(integrator.opts.tstops) + integrator.finalstep = true + return empty!(integrator.opts.tstops) end # used for AMR function Base.resize!(integrator::SimpleImplicit, new_size) - resize!(integrator.u, new_size) - resize!(integrator.du, new_size) - return resize!(integrator.u_tmp, new_size) + resize!(integrator.u, new_size) + resize!(integrator.du, new_size) + return resize!(integrator.u_tmp, new_size) end ### Helper jacobian(G!, ode::ODEProblem, Δt) = jacobian(G!, ode.f, ode.u0, ode.p, Δt, first(ode.tspan)) function jacobian(G!, f!, uₙ, p, Δt, t) - u = copy(uₙ) - du = zero(uₙ) - res = zero(uₙ) + u = copy(uₙ) + du = zero(uₙ) + res = zero(uₙ) - F! = nonlinear_problem(G!, f!) + F! = nonlinear_problem(G!, f!) - J = Ariadne.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) - return collect(J) + J = Ariadne.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) + return collect(J) end end # module Implicit From 05eb94f2cafc5563b4ffe37b355a781be3ae5dc3 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Fri, 27 Jun 2025 09:29:46 +0200 Subject: [PATCH 13/21] add quick convergence analysis for TRBDF2 as DIRK --- examples/trixi_convergence.jl | 56 +++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 examples/trixi_convergence.jl diff --git a/examples/trixi_convergence.jl b/examples/trixi_convergence.jl new file mode 100644 index 0000000..d097e1c --- /dev/null +++ b/examples/trixi_convergence.jl @@ -0,0 +1,56 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), cfl = 1.25/2, sol = nothing, save_solution = nothing, + initial_refinement_level = 6, advection_velocity = (1.0, 1.0)); + +ode = semidiscretize(semi, (0.0, 2.0)) + +############################################################################### +# run the simulation + +sol = solve( + ode, + # Implicit.RKImplicitEuler(); + # Implicit.KS22(); + # Implicit.C23(); + # Implicit.L33(); + Implicit.RKTRBDF2(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); + +cfl_vec = [10.0, 5.0, 2.5, 1.25, 1.25/2] +l2_vec = [1.07287321e-02, 2.69376612e-03, 6.75387935e-04, 1.68974528e-04, 4.22696680e-05] +linf_vec = [1.51727157e-02, 3.80957386e-03, 9.55254494e-04, 2.38966657e-04, 5.97799432e-05] +f = Figure() +ax = Axis(f[1, 1], xlabel = "CFL", ylabel = "Error", + xscale = log10, yscale = log10, title = "Convergence Plot") + +lines!(ax, cfl_vec, l2_vec, label = "L2 norm") +lines!(ax, cfl_vec, linf_vec, label = "L∞ norm") +lines!(ax, cfl_vec, 1e-4.*cfl_vec.^2, label = "2nd order") + +axislegend(ax; position = :rb) + +f \ No newline at end of file From db867b693bac87ebb5c26e6d7832ba2fa784796d Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Thu, 17 Jul 2025 21:29:09 +0200 Subject: [PATCH 14/21] add linear imex and imex --- Manifest.toml | 322 ++++++++ examples/Manifest.toml | 209 +++--- examples/out/mesh.h5 | Bin 0 -> 36832 bytes examples/out/solution_000000000.h5 | Bin 0 -> 34816 bytes examples/out/solution_000000003.h5 | Bin 0 -> 34816 bytes examples/trixi_adv_diff_imex.jl | 103 +++ examples/trixi_imex.jl | 34 + examples/trixi_linear_imex.jl | 34 + examples/trixi_navier_stokes_imex.jl | 38 + examples/trixi_navier_stokes_linear_imex.jl | 38 + libs/Implicit/Manifest.toml | 781 +++++++++++++++++++- libs/Implicit/Project.toml | 2 + libs/Implicit/src/Implicit.jl | 11 +- libs/Implicit/src/imex.jl | 263 +++++++ libs/Implicit/src/linear_imex.jl | 269 +++++++ libs/Implicit/src/skeleton.jl | 263 +++++++ src/Ariadne.jl | 151 ++-- 17 files changed, 2335 insertions(+), 183 deletions(-) create mode 100644 Manifest.toml create mode 100644 examples/out/mesh.h5 create mode 100644 examples/out/solution_000000000.h5 create mode 100644 examples/out/solution_000000003.h5 create mode 100644 examples/trixi_adv_diff_imex.jl create mode 100644 examples/trixi_imex.jl create mode 100644 examples/trixi_linear_imex.jl create mode 100644 examples/trixi_navier_stokes_imex.jl create mode 100644 examples/trixi_navier_stokes_linear_imex.jl create mode 100644 libs/Implicit/src/imex.jl create mode 100644 libs/Implicit/src/linear_imex.jl create mode 100644 libs/Implicit/src/skeleton.jl diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 0000000..0459249 --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,322 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "65f9f6999611571ccf228f448404abce642254f9" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Enzyme]] +deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "InteractiveUtils", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "PrecompileTools", "Preferences", "Printf", "Random", "SparseArrays"] +git-tree-sha1 = "59b0bc9ffe802326b67d218923ff2f325cfc9cdf" +uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9" +version = "0.13.57" + + [deps.Enzyme.extensions] + EnzymeBFloat16sExt = "BFloat16s" + EnzymeChainRulesCoreExt = "ChainRulesCore" + EnzymeGPUArraysCoreExt = "GPUArraysCore" + EnzymeLogExpFunctionsExt = "LogExpFunctions" + EnzymeSpecialFunctionsExt = "SpecialFunctions" + EnzymeStaticArraysExt = "StaticArrays" + + [deps.Enzyme.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.EnzymeCore]] +git-tree-sha1 = "8272a687bca7b5c601c0c24fc0c71bff10aafdfd" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.12" + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + + [deps.EnzymeCore.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + +[[deps.Enzyme_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "49dfd66929c794a6ec806bcb48d4d5d4b1280d11" +uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef" +version = "0.0.184+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] +git-tree-sha1 = "eb1e212e12cc058fa16712082d44be499d23638c" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "1.6.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "b94257a1a8737099ca40bc7271a8b374033473ed" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.10.1" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "9c7c721cfd800d87d48c745d8bfb65144f0a91df" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.4.2" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "2ea068aac1e7f0337d381b0eae3110581e3f3216" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.37+2" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.LibTracyClient_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d2bc4e1034b2d43076b50f0e34ea094c2cb0a717" +uuid = "ad6e5548-8b26-5c9f-8ef3-ef0ad883f3a5" +version = "0.9.1+6" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.ObjectFile]] +deps = ["Reexport", "StructIO"] +git-tree-sha1 = "09b1fe6ff16e6587fa240c165347474322e77cf1" +uuid = "d8793406-e978-5875-9003-1fc021f44a92" +version = "0.4.4" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" + + [deps.Pkg.extensions] + REPLExt = "REPL" + + [deps.Pkg.weakdeps] + REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.StructIO]] +git-tree-sha1 = "c581be48ae1cbf83e899b14c07a807e1787512cc" +uuid = "53d494c1-5632-5724-8f4c-31dff12d585f" +version = "0.3.1" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Tracy]] +deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] +git-tree-sha1 = "91dbaee0f50faa4357f7e9fc69442c7b6364dfe5" +uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" +version = "0.1.5" + + [deps.Tracy.extensions] + TracyProfilerExt = "TracyProfiler_jll" + + [deps.Tracy.weakdeps] + TracyProfiler_jll = "0c351ed6-8a68-550e-8b79-de6f926da83c" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" diff --git a/examples/Manifest.toml b/examples/Manifest.toml index d8e2a50..58fd47c 100644 --- a/examples/Manifest.toml +++ b/examples/Manifest.toml @@ -196,9 +196,9 @@ uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" version = "1.11.0" [[deps.BaseDirs]] -git-tree-sha1 = "03fea4a4efe25d2069c2d5685155005fc251c0a1" +git-tree-sha1 = "0b3c211ec48050496075523ea7ee045db9341a42" uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" -version = "1.3.0" +version = "1.3.1" [[deps.BitTwiddlingConvenienceFunctions]] deps = ["Static"] @@ -258,9 +258,9 @@ version = "1.1.1" [[deps.CairoMakie]] deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "68fe8a8ef64cb7931ce8fba69e20ecef8ddfc6c6" +git-tree-sha1 = "22e8c06a60dd4894a5e74dba616e636cb6ebe13c" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.14.0" +version = "0.15.3" [[deps.Cairo_jll]] deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] @@ -316,9 +316,9 @@ version = "0.4.1" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +git-tree-sha1 = "a656525c8b46aa6a1c76891552ed5381bb32ae7b" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.29.0" +version = "3.30.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] @@ -364,9 +364,9 @@ version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +git-tree-sha1 = "3a3dfb30697e96a440e4149c8c51bf32f818c0f3" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.16.0" +version = "4.17.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -386,6 +386,12 @@ weakdeps = ["InverseFunctions"] [deps.CompositionsBase.extensions] CompositionsBaseInverseFunctionsExt = "InverseFunctions" +[[deps.ComputePipeline]] +deps = ["Observables", "Preferences"] +git-tree-sha1 = "21d0d31878a58a902013389bf5c0fcc5be4bbe5a" +uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" +version = "0.1.2" + [[deps.ConcreteStructs]] git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" @@ -453,9 +459,9 @@ version = "1.9.1" [[deps.DiffEqBase]] deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] -git-tree-sha1 = "2d87d7bd165c1ca0d11923a9fabe90a9d71e88a6" +git-tree-sha1 = "e9b34e0eb3443492f396c97e7fed08630752a4f2" uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.176.0" +version = "6.177.2" [deps.DiffEqBase.extensions] DiffEqBaseCUDAExt = "CUDA" @@ -511,9 +517,9 @@ version = "1.15.1" [[deps.DifferentiationInterface]] deps = ["ADTypes", "LinearAlgebra"] -git-tree-sha1 = "210933c93f39f832d92f9efbbe69a49c453db36d" +git-tree-sha1 = "f620da805b82bec64ab4d5f881c7592c82dbc08a" uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" -version = "0.7.1" +version = "0.7.3" [deps.DifferentiationInterface.extensions] DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" @@ -609,9 +615,9 @@ version = "1.0.5" [[deps.Enzyme]] deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "InteractiveUtils", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "PrecompileTools", "Preferences", "Printf", "Random", "SparseArrays"] -git-tree-sha1 = "de7f70d73805f4e1a32395afc9d580e4ffc62924" +git-tree-sha1 = "32a24059c12417620b747fcae9e0864d45ef92b0" uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9" -version = "0.13.51" +version = "0.13.61" [deps.Enzyme.extensions] EnzymeBFloat16sExt = "BFloat16s" @@ -640,9 +646,9 @@ weakdeps = ["Adapt"] [[deps.Enzyme_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "97e0a9a3fa1c51ebd94dd076dd847c037b79fd79" +git-tree-sha1 = "5c024fa2548c53d10c70d151a1e7051fa9483209" uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef" -version = "0.0.183+0" +version = "0.0.186+0" [[deps.ExactPredicates]] deps = ["IntervalArithmetic", "Random", "StaticArrays"] @@ -883,9 +889,9 @@ version = "0.2.0" [[deps.GPUCompiler]] deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] -git-tree-sha1 = "bbb7004345fb6141989835fc9f2f9e93bba3c806" +git-tree-sha1 = "eb1e212e12cc058fa16712082d44be499d23638c" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "1.5.3" +version = "1.6.1" [[deps.GaussQuadrature]] deps = ["SpecialFunctions"] @@ -899,22 +905,17 @@ git-tree-sha1 = "f88e0ba1f6b42121a7c1dfe93a9687d8e164c91b" uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" version = "0.5.5" -[[deps.GeoFormatTypes]] -git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" -uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" -version = "0.4.4" - -[[deps.GeoInterface]] -deps = ["DataAPI", "Extents", "GeoFormatTypes"] -git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" -uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -version = "1.4.1" - [[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] -git-tree-sha1 = "2670cf32dcf0229c9893b895a9afe725edb23545" +deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b" uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.5.9" +version = "0.5.10" + + [deps.GeometryBasics.extensions] + GeometryBasicsGeoInterfaceExt = "GeoInterface" + + [deps.GeometryBasics.weakdeps] + GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" [[deps.GettextRuntime_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] @@ -1039,7 +1040,7 @@ uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" version = "3.1.11+0" [[deps.Implicit]] -deps = ["Ariadne", "DiffEqBase", "Krylov", "LinearAlgebra", "SciMLBase", "UnPack"] +deps = ["Ariadne", "DiffEqBase", "Krylov", "LinearAlgebra", "SciMLBase", "Trixi", "UnPack"] path = "../libs/Implicit" uuid = "7f538e44-2768-4ef2-af90-2110c0378286" version = "0.1.0" @@ -1173,9 +1174,9 @@ version = "3.1.1+0" [[deps.KernelAbstractions]] deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] -git-tree-sha1 = "602c0e9efadafb8abfe8281c3fbf9cf6f406fc03" +git-tree-sha1 = "38a03910123867c11af988e8718d12c98bf6a234" uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.9.35" +version = "0.9.37" weakdeps = ["EnzymeCore", "LinearAlgebra", "SparseArrays"] [deps.KernelAbstractions.extensions] @@ -1185,9 +1186,9 @@ weakdeps = ["EnzymeCore", "LinearAlgebra", "SparseArrays"] [[deps.KernelDensity]] deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" +git-tree-sha1 = "ba51324b894edaf1df3ab16e2cc6bc3280a2f1a7" uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.9" +version = "0.6.10" [[deps.Kronecker]] deps = ["LinearAlgebra", "NamedDims", "SparseArrays", "StatsBase"] @@ -1219,9 +1220,9 @@ version = "0.3.4" [[deps.LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.2+0" +version = "3.100.3+0" [[deps.LERC_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1377,9 +1378,9 @@ version = "1.3.5" [[deps.LightXML]] deps = ["Libdl", "XML2_jll"] -git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" +git-tree-sha1 = "d5d2e3abfb30ea9c2cff81d243e7235b51315ec2" uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" -version = "0.9.1" +version = "0.9.2" [[deps.LineSearch]] deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"] @@ -1416,9 +1417,9 @@ weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"] [[deps.LinearSolve]] deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] -git-tree-sha1 = "062c11f1d84ffc80d00fddaa515f7e37e8e9f9d5" +git-tree-sha1 = "989a36162c76f5b4d0c3028333725600bb1481b7" uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -version = "3.18.2" +version = "3.19.2" [deps.LinearSolve.extensions] LinearSolveBandedMatricesExt = "BandedMatrices" @@ -1539,16 +1540,10 @@ uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.16" [[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "29c5cf33287afa8c06711fec1b33d074f88dd354" +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] +git-tree-sha1 = "8ca3fbbe6685f2fb232526cabe25ef471d520c37" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.23.0" - -[[deps.MakieCore]] -deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] -git-tree-sha1 = "6ec4aba99ce1a8c247822ce346b273d0d686e141" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.10.0" +version = "0.24.3" [[deps.ManualMemory]] git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" @@ -1626,9 +1621,9 @@ version = "0.3.4" [[deps.Moshi]] deps = ["ExproniconLite", "Jieko"] -git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +git-tree-sha1 = "53f817d3e84537d84545e0ad749e483412dd6b2a" uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" -version = "0.3.5" +version = "0.3.7" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" @@ -1652,10 +1647,10 @@ uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" version = "1.1.3" [[deps.NamedDims]] -deps = ["LinearAlgebra", "Pkg", "Statistics"] -git-tree-sha1 = "90178dc801073728b8b2d0d8677d10909feb94d8" +deps = ["LinearAlgebra", "Statistics"] +git-tree-sha1 = "f9e4a49ecd1ea2eccfb749a506fa882c094152b4" uuid = "356022a1-0364-5f58-8944-0da4b18d706f" -version = "1.2.2" +version = "1.2.3" [deps.NamedDims.extensions] AbstractFFTsExt = "AbstractFFTs" @@ -1688,9 +1683,9 @@ version = "1.1.0" [[deps.NonlinearSolve]] deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseMatrixColorings", "StaticArraysCore", "SymbolicIndexingInterface"] -git-tree-sha1 = "aeb6fb02e63b4d4f90337ed90ce54ceb4c0efe77" +git-tree-sha1 = "d2ec18c1e4eccbb70b64be2435fc3b06fbcdc0a1" uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "4.9.0" +version = "4.10.0" [deps.NonlinearSolve.extensions] NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" @@ -1803,10 +1798,10 @@ weakdeps = ["Adapt"] OffsetArraysAdaptExt = "Adapt" [[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" +version = "1.3.6+0" [[deps.OpenBLASConsistentFPCSR_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -1844,9 +1839,9 @@ version = "5.0.8+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +git-tree-sha1 = "87510f7292a2b21aeff97912b0898f9553cc5c2c" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.0+0" +version = "3.5.1+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -1856,9 +1851,9 @@ version = "0.5.6+0" [[deps.Opus_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +git-tree-sha1 = "c392fc5dd032381919e3b22dd32d6443760ce7ea" uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.3+0" +version = "1.5.2+0" [[deps.OrderedCollections]] git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" @@ -1867,9 +1862,9 @@ version = "1.8.1" [[deps.OrdinaryDiffEq]] deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "MacroTools", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqAdamsBashforthMoulton", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqDefault", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqExplicitRK", "OrdinaryDiffEqExponentialRK", "OrdinaryDiffEqExtrapolation", "OrdinaryDiffEqFIRK", "OrdinaryDiffEqFeagin", "OrdinaryDiffEqFunctionMap", "OrdinaryDiffEqHighOrderRK", "OrdinaryDiffEqIMEXMultistep", "OrdinaryDiffEqLinear", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqLowStorageRK", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqNordsieck", "OrdinaryDiffEqPDIRK", "OrdinaryDiffEqPRK", "OrdinaryDiffEqQPRK", "OrdinaryDiffEqRKN", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqSSPRK", "OrdinaryDiffEqStabilizedIRK", "OrdinaryDiffEqStabilizedRK", "OrdinaryDiffEqSymplecticRK", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "Static", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] -git-tree-sha1 = "1c2b2df870944e0dc01454fd87479847c55fa26c" +git-tree-sha1 = "569b4267680ff8e51359f8d9aca1e97b284b5e58" uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -version = "6.98.0" +version = "6.99.0" [[deps.OrdinaryDiffEqAdamsBashforthMoulton]] deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqLowOrderRK", "Polyester", "RecursiveArrayTools", "Reexport", "Static"] @@ -1885,19 +1880,23 @@ version = "1.6.0" [[deps.OrdinaryDiffEqCore]] deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "FastBroadcast", "FastClosures", "FastPower", "FillArrays", "FunctionWrappersWrappers", "InteractiveUtils", "LinearAlgebra", "Logging", "MacroTools", "MuladdMacro", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleUnPack", "Static", "StaticArrayInterface", "StaticArraysCore", "SymbolicIndexingInterface", "TruncatedStacktraces"] -git-tree-sha1 = "08dac9c6672a4548439048089bac293759a897fd" +git-tree-sha1 = "1bd20b621e8dee5f2d170ae31631bf573ab77eec" uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" -version = "1.26.1" -weakdeps = ["EnzymeCore"] +version = "1.26.2" [deps.OrdinaryDiffEqCore.extensions] OrdinaryDiffEqCoreEnzymeCoreExt = "EnzymeCore" + OrdinaryDiffEqCoreMooncakeExt = "Mooncake" + + [deps.OrdinaryDiffEqCore.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" [[deps.OrdinaryDiffEqDefault]] deps = ["ADTypes", "DiffEqBase", "EnumX", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "PrecompileTools", "Preferences", "Reexport"] -git-tree-sha1 = "8eeed32442874d1bdcc2192a874a73f1a9a07e31" +git-tree-sha1 = "7e2f4ec76ebac709401064fd2cf73ad993d1e694" uuid = "50262376-6c5a-4cf5-baba-aaf4f84d72d7" -version = "1.4.0" +version = "1.5.0" [[deps.OrdinaryDiffEqDifferentiation]] deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqCore", "SciMLBase", "SciMLOperators", "SparseArrays", "SparseMatrixColorings", "StaticArrayInterface", "StaticArrays"] @@ -2033,9 +2032,9 @@ version = "1.3.0" [[deps.OrdinaryDiffEqStabilizedRK]] deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "StaticArrays"] -git-tree-sha1 = "1b0d894c880e25f7d0b022d7257638cf8ce5b311" +git-tree-sha1 = "e08548c18880428f8121d7a5985ad94134bc4c10" uuid = "358294b1-0aab-51c3-aafe-ad5ab194a2ad" -version = "1.1.0" +version = "1.1.2" [[deps.OrdinaryDiffEqSymplecticRK]] deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport"] @@ -2166,15 +2165,15 @@ version = "0.1.2" [[deps.PolynomialBases]] deps = ["ArgCheck", "AutoHashEquals", "FFTW", "FastGaussQuadrature", "LinearAlgebra", "Requires", "SimpleUnPack", "SpecialFunctions"] -git-tree-sha1 = "e856e397bd7be7b43542677e5cb8c75ec480ce94" +git-tree-sha1 = "d04bec789dce5ff61e8f128b6aee0eda09a3855f" uuid = "c74db56a-226d-5e98-8bb0-a6049094aeea" -version = "0.4.24" +version = "0.4.25" [[deps.PreallocationTools]] deps = ["Adapt", "ArrayInterface", "ForwardDiff"] -git-tree-sha1 = "6d98eace73d82e47f5b16c393de198836d9f790a" +git-tree-sha1 = "2cc315bb7f6e4d59081bad744cdb911d6374fc7f" uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" -version = "0.4.27" +version = "0.4.29" [deps.PreallocationTools.extensions] PreallocationToolsReverseDiffExt = "ReverseDiff" @@ -2273,13 +2272,14 @@ version = "1.3.4" [[deps.RecursiveArrayTools]] deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] -git-tree-sha1 = "2e154f7d7e38db1af0a14ec751aba33360c3bef9" +git-tree-sha1 = "efc718978d97745c58e69c5115a35c51a080e45e" uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "3.33.0" +version = "3.34.1" [deps.RecursiveArrayTools.extensions] RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions" RecursiveArrayToolsMeasurementsExt = "Measurements" RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] @@ -2291,6 +2291,7 @@ version = "3.33.0" [deps.RecursiveArrayTools.weakdeps] FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" @@ -2362,9 +2363,9 @@ version = "0.6.43" [[deps.SciMLBase]] deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] -git-tree-sha1 = "31587e20cdea9fba3a689033313e658dfc9aae78" +git-tree-sha1 = "50c540cd0569d43d5cec57b9610e7f1361d3532d" uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "2.102.1" +version = "2.103.1" [deps.SciMLBase.extensions] SciMLBaseChainRulesCoreExt = "ChainRulesCore" @@ -2480,9 +2481,9 @@ version = "1.1.0" [[deps.Sixel]] deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "a8dd0ed8a9e277013fdd4da1a413c748b349b7ec" +git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.4" +version = "0.1.5" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" @@ -2570,9 +2571,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +git-tree-sha1 = "cbea8a6bd7bed51b1619658dec70035e07b8502f" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.13" +version = "1.9.14" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -2758,9 +2759,9 @@ version = "0.5.29" [[deps.Tracy]] deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] -git-tree-sha1 = "16439d004690d4086da35528f0c6b4d7006d6dae" +git-tree-sha1 = "91dbaee0f50faa4357f7e9fc69442c7b6364dfe5" uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" -version = "0.1.4" +version = "0.1.5" [deps.Tracy.extensions] TracyProfilerExt = "TracyProfiler_jll" @@ -2803,9 +2804,9 @@ version = "0.1.2" [[deps.Trixi]] deps = ["Accessors", "CodeTracking", "ConstructionBase", "DataStructures", "DelimitedFiles", "DiffEqBase", "DiffEqCallbacks", "Downloads", "EllipsisNotation", "FillArrays", "ForwardDiff", "HDF5", "LinearAlgebra", "LinearMaps", "LoopVectorization", "MPI", "MuladdMacro", "Octavian", "OffsetArrays", "P4est", "Polyester", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "SimpleUnPack", "SparseArrays", "StableRNGs", "StartUpDG", "Static", "StaticArrayInterface", "StaticArrays", "StrideArrays", "StructArrays", "SummationByPartsOperators", "T8code", "TimerOutputs", "Triangulate", "TriplotBase", "TriplotRecipes", "TrixiBase", "UUIDs"] -git-tree-sha1 = "63f3266dbc10d5e375eaf6f88233201893c13f53" +git-tree-sha1 = "9c925440d5076380c03e8d5f5ce82762d3a98ca4" uuid = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" -version = "0.12.4" +version = "0.12.6" [deps.Trixi.extensions] TrixiConvexECOSExt = ["Convex", "ECOS"] @@ -2820,9 +2821,9 @@ version = "0.12.4" [[deps.TrixiBase]] deps = ["ChangePrecision", "TimerOutputs"] -git-tree-sha1 = "6c169bd924738a1a25a860e661ebf5970e6cc820" +git-tree-sha1 = "ac4cc9637b76ae2100829f4505f6ed691889097f" uuid = "9a0f1c46-06d5-4909-a5a3-ce25d3fa3284" -version = "0.1.5" +version = "0.1.6" weakdeps = ["MPI"] [deps.TrixiBase.extensions] @@ -2929,9 +2930,9 @@ version = "1.21.2" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +git-tree-sha1 = "c217bad8fccb3bbfef7d7902326eacfbd0d702ad" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.6+1" +version = "2.14.4+0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -3023,15 +3024,15 @@ version = "5.11.0+0" [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.3+0" +version = "2.0.4+0" [[deps.libpng_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "cd155272a3738da6db765745b89e466fa64d0830" +git-tree-sha1 = "07b6a107d926093898e82b3b1db657ebe33134ec" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.49+0" +version = "1.6.50+0" [[deps.libsixel_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] @@ -3040,16 +3041,16 @@ uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" version = "1.10.5+0" [[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+2" +version = "1.3.8+0" [[deps.libwebp_jll]] deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] -git-tree-sha1 = "d2408cac540942921e7bd77272c32e58c33d8a77" +git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3" uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" -version = "1.5.0+0" +version = "1.6.0+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] diff --git a/examples/out/mesh.h5 b/examples/out/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..71bd752473ba5a1154072f3dbf70c1da21cb2241 GIT binary patch literal 36832 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 literal 0 HcmV?d00001 diff --git a/examples/out/solution_000000003.h5 b/examples/out/solution_000000003.h5 new file mode 100644 index 0000000000000000000000000000000000000000..fd879e6f11231d2fdfedc4286cdbb404ba964926 GIT binary patch literal 34816 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

&g0aHnS4^JDsiIZ(%+G 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 A(EtDd literal 0 HcmV?d00001 diff --git a/examples/trixi_adv_diff_imex.jl b/examples/trixi_adv_diff_imex.jl new file mode 100644 index 0000000..1fa5e95 --- /dev/null +++ b/examples/trixi_adv_diff_imex.jl @@ -0,0 +1,103 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie +using OrdinaryDiffEqLowStorageRK +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + + +############################################################################### +# semidiscretization of the linear advection-diffusion equation + +advection_velocity = (1.5, 1.0) +equations = LinearScalarAdvectionEquation2D(advection_velocity) +diffusivity() = 1.0 +equations_parabolic = LaplaceDiffusion2D(diffusivity(), equations) + +# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux +solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) + +coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y)) +coordinates_max = (1.0, 1.0) # maximum coordinates (max(x), max(y)) + +# Create a uniformly refined mesh with periodic boundaries +mesh = TreeMesh(coordinates_min, coordinates_max, + initial_refinement_level = 4, + periodicity = true, + n_cells_max = 30_000) # set maximum capacity of tree data structure + +# Define initial condition +function initial_condition_diffusive_convergence_test(x, t, + equation::LinearScalarAdvectionEquation2D) + # Store translated coordinate for easy use of exact solution + RealT = eltype(x) + x_trans = x - equation.advection_velocity * t + + nu = diffusivity() + c = 1 + A = 0.5f0 + L = 2 + f = 1.0f0 / L + omega = 2 * convert(RealT, pi) * f + scalar = c + A * sin(omega * sum(x_trans)) * exp(-2 * nu * omega^2 * t) + return SVector(scalar) +end +initial_condition = initial_condition_diffusive_convergence_test + +# define periodic boundary conditions everywhere +boundary_conditions = boundary_condition_periodic +boundary_conditions_parabolic = boundary_condition_periodic + +# A semidiscretization collects data structures and functions for the spatial discretization +semi = SemidiscretizationHyperbolicParabolic(mesh, + (equations, equations_parabolic), + initial_condition, solver; + solver_parabolic = ViscousFormulationBassiRebay1(), + boundary_conditions = (boundary_conditions, + boundary_conditions_parabolic)) + +############################################################################### +# ODE solvers, callbacks etc. + +# Create ODE problem with time span from 0.0 to 1.5 +tspan = (0.0, 1.5) +ode = semidiscretize(semi, tspan) + +# At the beginning of the main loop, the SummaryCallback prints a summary of the simulation setup +# and resets the timers +summary_callback = SummaryCallback() + +# The AnalysisCallback allows to analyse the solution in regular intervals and prints the results +analysis_interval = 100 +analysis_callback = AnalysisCallback(semi, interval = analysis_interval) + +# The AliveCallback prints short status information in regular intervals +alive_callback = AliveCallback(analysis_interval = analysis_interval) + +# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver +callbacks = CallbackSet(summary_callback, analysis_callback, alive_callback) + +############################################################################### +# run the simulation + +sol = solve( + ode, + Implicit.RKImplicitExplicitEuler(); + dt = 0.001, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); diff --git a/examples/trixi_imex.jl b/examples/trixi_imex.jl new file mode 100644 index 0000000..f39e5f1 --- /dev/null +++ b/examples/trixi_imex.jl @@ -0,0 +1,34 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_diffusion.jl"), sol = nothing); + +############################################################################### +# run the simulation + +sol = solve( + ode, + Implicit.RKImplicitExplicitEuler(); + dt = 0.001, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); diff --git a/examples/trixi_linear_imex.jl b/examples/trixi_linear_imex.jl new file mode 100644 index 0000000..9816efc --- /dev/null +++ b/examples/trixi_linear_imex.jl @@ -0,0 +1,34 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_diffusion.jl"), sol = nothing); + +############################################################################### +# run the simulation + +sol = solve( + ode, + Implicit.RKLinearImplicitExplicitEuler(); + dt = 0.001, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); diff --git a/examples/trixi_navier_stokes_imex.jl b/examples/trixi_navier_stokes_imex.jl new file mode 100644 index 0000000..f1c641b --- /dev/null +++ b/examples/trixi_navier_stokes_imex.jl @@ -0,0 +1,38 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_convergence.jl"), sol = nothing); + + +############################################################################### +# run the simulation + +sol = solve( + ode, + Implicit.RKImplicitExplicitEuler(); + dt = 0.001/2, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); + +## dt_vec = [0.001, 0.001/2, 0.0001] +## l2_vec = [4.95311953e-04, 2.48996489e-04 ,5.40458032e-05, ] diff --git a/examples/trixi_navier_stokes_linear_imex.jl b/examples/trixi_navier_stokes_linear_imex.jl new file mode 100644 index 0000000..8a71a13 --- /dev/null +++ b/examples/trixi_navier_stokes_linear_imex.jl @@ -0,0 +1,38 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_convergence.jl"), sol = nothing); + + +############################################################################### +# run the simulation + +sol = solve( + ode, + Implicit.RKLinearImplicitExplicitEuler(); + dt = 0.001/2, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); + +## dt_vec = [0.001, 0.001/2, 0.0001] +## l2_vec = [4.95311953e-04, 2.48996489e-04 ,5.40458032e-05, ] diff --git a/libs/Implicit/Manifest.toml b/libs/Implicit/Manifest.toml index 6f47392..3130175 100644 --- a/libs/Implicit/Manifest.toml +++ b/libs/Implicit/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.11.5" manifest_format = "2.0" -project_hash = "6f6af7004b2b0f26c68ea4ea8c9920d5575e05cf" +project_hash = "620c71fb489466ffbb11337c9833c44e98ee2776" [[deps.ADTypes]] git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" @@ -19,6 +19,20 @@ version = "1.15.0" ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + + [deps.AbstractFFTs.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + [[deps.Accessors]] deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" @@ -48,14 +62,22 @@ deps = ["LinearAlgebra", "Requires"] git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] [deps.Adapt.extensions] AdaptSparseArraysExt = "SparseArrays" AdaptStaticArraysExt = "StaticArrays" - [deps.Adapt.weakdeps] - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" @@ -103,6 +125,11 @@ version = "7.19.0" uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" version = "1.11.0" +[[deps.AutoHashEquals]] +git-tree-sha1 = "4ec6b48702dacc5994a835c1189831755e4e76ef" +uuid = "15f4f7f2-30c1-5605-9d31-71845cf9641f" +version = "2.2.0" + [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" version = "1.11.0" @@ -124,17 +151,47 @@ git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" version = "0.2.6" +[[deps.CaratheodoryPruning]] +deps = ["LinearAlgebra", "ProgressBars", "Random"] +git-tree-sha1 = "de17842b2a680ad0048fcb455f62ad87d61a0d84" +uuid = "ab320bfc-8242-4797-bfc4-9370c33880e7" +version = "0.1.1" + +[[deps.ChangePrecision]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "2ac5097b3caf70b772901abd824e09f991e47296" +uuid = "3cb15238-376d-56a3-8042-d33272777c9a" +version = "1.1.1" + [[deps.CloseOpenIntervals]] deps = ["Static", "StaticArrayInterface"] git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" version = "0.1.13" +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "062c5e1a5bf6ada13db96a4ae4749a4c2234f521" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.9" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + [[deps.CommonSolve]] git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" version = "0.2.4" +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + [[deps.CommonWorldInvalidations]] git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" @@ -142,9 +199,9 @@ version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +git-tree-sha1 = "3a3dfb30697e96a440e4149c8c51bf32f818c0f3" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.16.0" +version = "4.17.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -216,11 +273,17 @@ deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" version = "1.11.0" +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + [[deps.DiffEqBase]] deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] -git-tree-sha1 = "2d87d7bd165c1ca0d11923a9fabe90a9d71e88a6" +git-tree-sha1 = "e9b34e0eb3443492f396c97e7fed08630752a4f2" uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.176.0" +version = "6.177.2" [deps.DiffEqBase.extensions] DiffEqBaseCUDAExt = "CUDA" @@ -256,6 +319,74 @@ version = "6.176.0" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" +[[deps.DiffEqCallbacks]] +deps = ["ConcreteStructs", "DataStructures", "DiffEqBase", "DifferentiationInterface", "Functors", "LinearAlgebra", "Markdown", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "80a782f3e65d4900dcf5f2cb71f5e19d9459c04a" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "4.8.0" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "f620da805b82bec64ab4d5f881c7592c82dbc08a" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.3" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + [[deps.Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" @@ -271,6 +402,12 @@ deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" version = "1.6.0" +[[deps.EllipsisNotation]] +deps = ["StaticArrayInterface"] +git-tree-sha1 = "3507300d4343e8e4ad080ad24e335274c2e297a9" +uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949" +version = "1.8.0" + [[deps.EnumX]] git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" @@ -278,9 +415,9 @@ version = "1.0.5" [[deps.Enzyme]] deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "InteractiveUtils", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "PrecompileTools", "Preferences", "Printf", "Random", "SparseArrays"] -git-tree-sha1 = "de7f70d73805f4e1a32395afc9d580e4ffc62924" +git-tree-sha1 = "32a24059c12417620b747fcae9e0864d45ef92b0" uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9" -version = "0.13.51" +version = "0.13.61" [deps.Enzyme.extensions] EnzymeBFloat16sExt = "BFloat16s" @@ -309,9 +446,9 @@ weakdeps = ["Adapt"] [[deps.Enzyme_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "97e0a9a3fa1c51ebd94dd076dd847c037b79fd79" +git-tree-sha1 = "5c024fa2548c53d10c70d151a1e7051fa9483209" uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef" -version = "0.0.183+0" +version = "0.0.186+0" [[deps.ExprTools]] git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" @@ -323,6 +460,18 @@ git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" version = "0.10.14" +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "797762812ed063b9b94f6cc7742bc8883bb5e69e" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.9.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.11+0" + [[deps.FastBroadcast]] deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" @@ -334,6 +483,12 @@ git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" version = "0.3.2" +[[deps.FastGaussQuadrature]] +deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "fd923962364b645f3719855c88f7074413a6ad92" +uuid = "442a2c76-b920-505d-bb47-c5924d526838" +version = "1.0.2" + [[deps.FastPower]] git-tree-sha1 = "5f7afd4b1a3969dc34d692da2ed856047325b06e" uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" @@ -361,6 +516,32 @@ version = "1.1.3" uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" version = "1.11.0" +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + + [deps.FillArrays.weakdeps] + PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.0.1" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + [[deps.FunctionWrappers]] git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" @@ -372,6 +553,12 @@ git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" version = "0.1.3" +[[deps.Functors]] +deps = ["Compat", "ConstructionBase", "LinearAlgebra", "Random"] +git-tree-sha1 = "60a0339f28a233601cb74468032b5c302d5067de" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.5.2" + [[deps.Future]] deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" @@ -385,15 +572,55 @@ version = "0.2.0" [[deps.GPUCompiler]] deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] -git-tree-sha1 = "bbb7004345fb6141989835fc9f2f9e93bba3c806" +git-tree-sha1 = "eb1e212e12cc058fa16712082d44be499d23638c" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "1.5.3" +version = "1.6.1" + +[[deps.GaussQuadrature]] +deps = ["SpecialFunctions"] +git-tree-sha1 = "eb6f1f48aa994f3018cbd029a17863c6535a266d" +uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" +version = "0.5.8" + +[[deps.HDF5]] +deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] +git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c" +uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +version = "0.17.2" +weakdeps = ["MPI"] + + [deps.HDF5.extensions] + MPIExt = "MPI" + +[[deps.HDF5_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] +git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" +uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" +version = "1.14.6+0" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.17" + +[[deps.Hwloc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "92f65c4d78ce8cdbb6b68daf88889950b0a99d11" +uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" +version = "2.12.1+0" [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.0.4+0" + [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" @@ -412,6 +639,11 @@ version = "0.1.17" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + [[deps.IteratorInterfaceExtensions]] git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" uuid = "82899510-4779-5014-852e-03e436cf321d" @@ -429,6 +661,12 @@ git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" uuid = "ae98c720-c025-4a4a-838c-29b094483192" version = "0.2.1" +[[deps.Kronecker]] +deps = ["LinearAlgebra", "NamedDims", "SparseArrays", "StatsBase"] +git-tree-sha1 = "9253429e28cceae6e823bec9ffde12460d79bb38" +uuid = "2c470bb0-bcc8-11e8-3dad-c9649493f05e" +version = "0.5.5" + [[deps.Krylov]] deps = ["LinearAlgebra", "Printf", "SparseArrays"] git-tree-sha1 = "b94257a1a8737099ca40bc7271a8b374033473ed" @@ -504,15 +742,112 @@ version = "0.9.1+6" uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" version = "1.11.0" +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.LightXML]] +deps = ["Libdl", "XML2_jll"] +git-tree-sha1 = "d5d2e3abfb30ea9c2cff81d243e7235b51315ec2" +uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" +version = "0.9.2" + [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" version = "1.11.0" +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.4" + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + + [deps.LinearMaps.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" version = "1.11.0" +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "e5afce7eaf5b5ca0d444bcb4dc4fd78c54cbbac0" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.172" + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.LoopVectorization.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.0.1+1" + +[[deps.MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "892676019c58f34e38743bc989b0eca5bce5edc5" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.20.22" + + [deps.MPI.extensions] + AMDGPUExt = "AMDGPU" + CUDAExt = "CUDA" + + [deps.MPI.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MPICH_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "d72d0ecc3f76998aac04e446547259b9ae4c265f" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "4.3.1+0" + +[[deps.MPIPreferences]] +deps = ["Libdl", "Preferences"] +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +version = "0.1.11" + +[[deps.MPItrampoline_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "e214f2a20bdd64c04cd3e4ff62d3c9be7e969a59" +uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" +version = "5.5.4+0" + [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" @@ -533,11 +868,27 @@ deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" version = "2.28.6+0" +[[deps.MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.4+3" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + [[deps.Moshi]] deps = ["ExproniconLite", "Jieko"] -git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +git-tree-sha1 = "53f817d3e84537d84545e0ad749e483412dd6b2a" uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" -version = "0.3.5" +version = "0.3.7" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" @@ -548,32 +899,127 @@ git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" version = "0.2.4" +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NamedDims]] +deps = ["LinearAlgebra", "Statistics"] +git-tree-sha1 = "f9e4a49ecd1ea2eccfb749a506fa882c094152b4" +uuid = "356022a1-0364-5f58-8944-0da4b18d706f" +version = "1.2.3" + + [deps.NamedDims.extensions] + AbstractFFTsExt = "AbstractFFTs" + ChainRulesCoreExt = "ChainRulesCore" + CovarianceEstimationExt = "CovarianceEstimation" + TrackerExt = "Tracker" + + [deps.NamedDims.weakdeps] + AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + CovarianceEstimation = "587fd27a-f159-11e8-2dae-1979310e6154" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" +[[deps.NodesAndModes]] +deps = ["DelimitedFiles", "LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "ee6719b4ed5fd08b654017648bf5fa2e2dc8f1ec" +uuid = "7aca2e03-f7e2-4192-9ec8-f4ca66d597fb" +version = "1.1.0" + [[deps.ObjectFile]] deps = ["Reexport", "StructIO"] git-tree-sha1 = "09b1fe6ff16e6587fa240c165347474322e77cf1" uuid = "d8793406-e978-5875-9003-1fc021f44a92" version = "0.4.4" +[[deps.Octavian]] +deps = ["CPUSummary", "IfElse", "LoopVectorization", "ManualMemory", "PolyesterWeave", "PrecompileTools", "Static", "StaticArrayInterface", "ThreadingUtilities", "VectorizationBase"] +git-tree-sha1 = "21d5b4557036561266a7578ae3f9914d18ae5685" +uuid = "6fd5a793-0b7e-452c-907f-f8bfe9c57db4" +version = "0.3.29" + + [deps.Octavian.extensions] + ForwardDiffExt = "ForwardDiff" + HyperDualNumbersExt = "HyperDualNumbers" + + [deps.Octavian.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + HyperDualNumbers = "50ceba7f-c3ee-5a84-a6e8-3ad40456ec97" + +[[deps.OffsetArrays]] +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.17.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" version = "0.3.27+1" +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenMPI_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "ec764453819f802fc1e144bfe750c454181bd66d" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "5.0.8+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "87510f7292a2b21aeff97912b0898f9553cc5c2c" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.1+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + [[deps.OrderedCollections]] git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.8.1" +[[deps.P4est]] +deps = ["CEnum", "MPI", "MPIPreferences", "P4est_jll", "Preferences", "Reexport", "UUIDs"] +git-tree-sha1 = "6a924bc3d05ebb09de7e8294a30c022461a44720" +uuid = "7d669430-f675-4ae7-b43e-fab78ec5a902" +version = "0.4.13" + +[[deps.P4est_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "Pkg", "TOML", "Zlib_jll"] +git-tree-sha1 = "70c2d9a33b8810198314a5722ee3e9520110b28d" +uuid = "6b5a15aa-cf52-5330-8376-5e5d90283449" +version = "2.8.1+2" + [[deps.Parameters]] deps = ["OrderedCollections", "UnPack"] git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" version = "0.12.3" +[[deps.PathIntersections]] +deps = ["ForwardDiff", "GaussQuadrature", "LinearAlgebra", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "730201a293befb624c7b3d76ccbd326b0c689067" +uuid = "4c1a95c7-462a-4a7e-b284-959c63fbf1dc" +version = "0.3.0" + [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" @@ -585,6 +1031,12 @@ version = "1.11.0" [deps.Pkg.weakdeps] REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + [[deps.Polyester]] deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] git-tree-sha1 = "6f7cd22a802094d239824c57d94c8e2d0f7cfc7d" @@ -597,6 +1049,12 @@ git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" version = "0.2.2" +[[deps.PolynomialBases]] +deps = ["ArgCheck", "AutoHashEquals", "FFTW", "FastGaussQuadrature", "LinearAlgebra", "Requires", "SimpleUnPack", "SpecialFunctions"] +git-tree-sha1 = "d04bec789dce5ff61e8f128b6aee0eda09a3855f" +uuid = "c74db56a-226d-5e98-8bb0-a6049094aeea" +version = "0.4.25" + [[deps.PrecompileTools]] deps = ["Preferences"] git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" @@ -620,6 +1078,17 @@ deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" version = "1.11.0" +[[deps.ProgressBars]] +deps = ["Printf"] +git-tree-sha1 = "b437cdb0385ed38312d91d9c00c20f3798b30256" +uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" +version = "1.5.1" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + [[deps.Random]] deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" @@ -633,13 +1102,14 @@ version = "1.3.4" [[deps.RecursiveArrayTools]] deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] -git-tree-sha1 = "2e154f7d7e38db1af0a14ec751aba33360c3bef9" +git-tree-sha1 = "efc718978d97745c58e69c5115a35c51a080e45e" uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "3.33.0" +version = "3.34.1" [deps.RecursiveArrayTools.extensions] RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions" RecursiveArrayToolsMeasurementsExt = "Measurements" RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] @@ -651,6 +1121,7 @@ version = "3.33.0" [deps.RecursiveArrayTools.weakdeps] FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" @@ -685,11 +1156,17 @@ git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" uuid = "94e857df-77ce-4151-89e5-788b33177be4" version = "0.1.0" +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.43" + [[deps.SciMLBase]] deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] -git-tree-sha1 = "31587e20cdea9fba3a689033313e658dfc9aae78" +git-tree-sha1 = "50c540cd0569d43d5cec57b9610e7f1361d3532d" uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "2.102.1" +version = "2.103.1" [deps.SciMLBase.extensions] SciMLBaseChainRulesCoreExt = "ChainRulesCore" @@ -745,15 +1222,58 @@ git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" version = "1.1.2" +[[deps.SimpleUnPack]] +git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" +uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" +version = "1.1.0" + [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" version = "1.11.0" +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.11.0" +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.1" + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + + [deps.SpecialFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.StartUpDG]] +deps = ["CaratheodoryPruning", "ConstructionBase", "FillArrays", "HDF5", "Kronecker", "LinearAlgebra", "NodesAndModes", "PathIntersections", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "Setfield", "SparseArrays", "StaticArrays", "Triangulate", "WriteVTK"] +git-tree-sha1 = "5494db18da3dab3d5de98b0a2b5a1b9162c72102" +uuid = "472ebc20-7c99-4d4b-9470-8fde4e9faa0f" +version = "1.2.0" + + [deps.StartUpDG.extensions] + StartUpDGSummationByPartsOperatorsExt = "SummationByPartsOperators" + TriangulatePlotsExt = "Plots" + + [deps.StartUpDG.weakdeps] + Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" + SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" + [[deps.Static]] deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" @@ -765,14 +1285,25 @@ deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools" git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" version = "1.8.0" +weakdeps = ["OffsetArrays", "StaticArrays"] [deps.StaticArrayInterface.extensions] StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" StaticArrayInterfaceStaticArraysExt = "StaticArrays" - [deps.StaticArrayInterface.weakdeps] - OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "cbea8a6bd7bed51b1619658dec70035e07b8502f" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.14" + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + + [deps.StaticArrays.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [[deps.StaticArraysCore]] git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" @@ -789,6 +1320,24 @@ weakdeps = ["SparseArrays"] [deps.Statistics.extensions] SparseArraysExt = ["SparseArrays"] +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StrideArrays]] +deps = ["ArrayInterface", "LinearAlgebra", "LoopVectorization", "Octavian", "Random", "SLEEFPirates", "Static", "StaticArrayInterface", "StaticArraysCore", "Statistics", "StrideArraysCore", "VectorizationBase", "VectorizedRNG", "VectorizedStatistics"] +git-tree-sha1 = "a009ced9a1952b91f3982a6e06df672189c6cbc9" +uuid = "d1fa6d79-ef01-42a6-86c9-f7c551f8593b" +version = "0.1.29" + [[deps.StrideArraysCore]] deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" @@ -801,6 +1350,27 @@ git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" version = "0.4.1" +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "8ad2e38cbb812e29348719cc63580ec1dfeb9de4" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.1" + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + + [deps.StructArrays.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + [[deps.StructIO]] git-tree-sha1 = "c581be48ae1cbf83e899b14c07a807e1787512cc" uuid = "53d494c1-5632-5724-8f4c-31dff12d585f" @@ -811,12 +1381,38 @@ deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" version = "7.7.0+0" +[[deps.SummationByPartsOperators]] +deps = ["ArgCheck", "AutoHashEquals", "FFTW", "InteractiveUtils", "LinearAlgebra", "LoopVectorization", "MuladdMacro", "PolynomialBases", "PrecompileTools", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "SimpleUnPack", "SparseArrays", "StaticArrayInterface", "StaticArrays", "Unrolled"] +git-tree-sha1 = "85c82b92d94264d5376bebf96226bea5ca4e2716" +uuid = "9f78cca6-572e-554e-b819-917d2f1cf240" +version = "0.5.81" + + [deps.SummationByPartsOperators.extensions] + SummationByPartsOperatorsBandedMatricesExt = "BandedMatrices" + SummationByPartsOperatorsDiffEqCallbacksExt = "DiffEqCallbacks" + SummationByPartsOperatorsForwardDiffExt = "ForwardDiff" + SummationByPartsOperatorsOptimForwardDiffExt = ["Optim", "ForwardDiff"] + SummationByPartsOperatorsStructArraysExt = "StructArrays" + + [deps.SummationByPartsOperators.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Optim = "429524aa-4258-5aef-a3af-852621145aeb" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + [[deps.SymbolicIndexingInterface]] deps = ["Accessors", "ArrayInterface", "PrettyTables", "RuntimeGeneratedFunctions", "StaticArraysCore"] git-tree-sha1 = "658f6d01bfe68d6bf47915bf5d868228138c7d71" uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" version = "0.3.41" +[[deps.T8code]] +deps = ["CEnum", "Libdl", "MPI", "MPIPreferences", "Preferences", "Reexport", "UUIDs", "t8code_jll"] +git-tree-sha1 = "1b5ef460f156ed68e3affb67f48e2b4bec9915e4" +uuid = "d0cc0030-9a40-4274-8435-baadcfd54fa1" +version = "0.7.4" + [[deps.TOML]] deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" @@ -845,11 +1441,23 @@ git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" version = "0.5.5" +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.29" + + [deps.TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [deps.TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" + [[deps.Tracy]] deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] -git-tree-sha1 = "16439d004690d4086da35528f0c6b4d7006d6dae" +git-tree-sha1 = "91dbaee0f50faa4357f7e9fc69442c7b6364dfe5" uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" -version = "0.1.4" +version = "0.1.5" [deps.Tracy.extensions] TracyProfilerExt = "TracyProfiler_jll" @@ -857,6 +1465,66 @@ version = "0.1.4" [deps.Tracy.weakdeps] TracyProfiler_jll = "0c351ed6-8a68-550e-8b79-de6f926da83c" +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Triangle_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "fe28e9a4684f6f54e868b9136afb8fd11f1734a7" +uuid = "5639c1d2-226c-5e70-8d55-b3095415a16a" +version = "1.6.2+0" + +[[deps.Triangulate]] +deps = ["DocStringExtensions", "Printf", "Triangle_jll"] +git-tree-sha1 = "8c8d7d43f3073f8b9c667b66569f1c090fc5b9c7" +uuid = "f7e6ffb2-c36d-4f8f-a77e-16e897189344" +version = "2.5.1" + + [deps.Triangulate.weakdeps] + CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" + GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" + PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.TriplotRecipes]] +deps = ["RecipesBase", "TriplotBase"] +git-tree-sha1 = "fceb3b0f37ff6ccf3c70b9c5198d2eefec46ada0" +uuid = "808ab39a-a642-4abf-81ff-4cb34ebbffa3" +version = "0.1.2" + +[[deps.Trixi]] +deps = ["Accessors", "CodeTracking", "ConstructionBase", "DataStructures", "DelimitedFiles", "DiffEqBase", "DiffEqCallbacks", "Downloads", "EllipsisNotation", "FillArrays", "ForwardDiff", "HDF5", "LinearAlgebra", "LinearMaps", "LoopVectorization", "MPI", "MuladdMacro", "Octavian", "OffsetArrays", "P4est", "Polyester", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "SimpleUnPack", "SparseArrays", "StableRNGs", "StartUpDG", "Static", "StaticArrayInterface", "StaticArrays", "StrideArrays", "StructArrays", "SummationByPartsOperators", "T8code", "TimerOutputs", "Triangulate", "TriplotBase", "TriplotRecipes", "TrixiBase", "UUIDs"] +git-tree-sha1 = "9c925440d5076380c03e8d5f5ce82762d3a98ca4" +uuid = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" +version = "0.12.6" + + [deps.Trixi.extensions] + TrixiConvexECOSExt = ["Convex", "ECOS"] + TrixiMakieExt = "Makie" + TrixiNLsolveExt = "NLsolve" + + [deps.Trixi.weakdeps] + Convex = "f65535da-76fb-5f13-bab9-19810c17039a" + ECOS = "e2685f51-7e38-5353-a97d-a921fd2c8199" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + +[[deps.TrixiBase]] +deps = ["ChangePrecision", "TimerOutputs"] +git-tree-sha1 = "ac4cc9637b76ae2100829f4505f6ed691889097f" +uuid = "9a0f1c46-06d5-4909-a5a3-ce25d3fa3284" +version = "0.1.6" +weakdeps = ["MPI"] + + [deps.TrixiBase.extensions] + TrixiBaseMPIExt = "MPI" + [[deps.TruncatedStacktraces]] deps = ["InteractiveUtils", "MacroTools", "Preferences"] git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" @@ -877,11 +1545,62 @@ version = "1.0.2" uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" version = "1.11.0" +[[deps.Unrolled]] +deps = ["MacroTools"] +git-tree-sha1 = "6cc9d682755680e0f0be87c56392b7651efc2c7b" +uuid = "9602ed7d-8fef-5bc8-8597-8f21381861e8" +version = "0.1.5" + +[[deps.VTKBase]] +git-tree-sha1 = "c2d0db3ef09f1942d08ea455a9e252594be5f3b6" +uuid = "4004b06d-e244-455f-a6ce-a5f9919cc534" +version = "1.0.1" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "4ab62a49f1d8d9548a1c8d1a75e5f55cf196f64e" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.71" + +[[deps.VectorizedRNG]] +deps = ["Distributed", "Random", "SLEEFPirates", "UnPack", "VectorizationBase"] +git-tree-sha1 = "5ca83562ba95272d8709c6c91e31e23c3c4c9825" +uuid = "33b4df10-0173-11e9-2a0c-851a7edac40e" +version = "0.2.25" +weakdeps = ["Requires", "StaticArraysCore"] + + [deps.VectorizedRNG.extensions] + VectorizedRNGStaticArraysExt = ["StaticArraysCore"] + +[[deps.VectorizedStatistics]] +deps = ["LoopVectorization", "PrecompileTools", "Static"] +git-tree-sha1 = "f59703fbab297efe6ad09ef1dc656f8f0a21ad28" +uuid = "3b853605-1c98-4422-8364-4bd93ee0529e" +version = "0.5.10" + +[[deps.WriteVTK]] +deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams", "VTKBase"] +git-tree-sha1 = "a329e0b6310244173690d6a4dfc6d1141f9b9370" +uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" +version = "1.21.2" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "c217bad8fccb3bbfef7d7902326eacfbd0d702ad" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.14.4+0" + [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" version = "1.2.13+1" +[[deps.libaec_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" +uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" +version = "1.1.3+0" + [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" @@ -892,7 +1611,19 @@ deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" version = "1.59.0+0" +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+0" + [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" version = "17.4.0+2" + +[[deps.t8code_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "Zlib_jll"] +git-tree-sha1 = "cf073e7d4275b8a030140936639f3d6a5eeb3e74" +uuid = "4ee9bed8-4011-53f7-90c2-22363c2f500d" +version = "3.0.1+0" diff --git a/libs/Implicit/Project.toml b/libs/Implicit/Project.toml index eedc1e3..239a4e4 100644 --- a/libs/Implicit/Project.toml +++ b/libs/Implicit/Project.toml @@ -9,6 +9,7 @@ DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" [sources] @@ -20,4 +21,5 @@ DiffEqBase = "6.174.0" Krylov = "0.10.1" LinearAlgebra = "1.11.0" SciMLBase = "2.91.0" +Trixi = "0.12.5" UnPack = "1.0.2" diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index eb3069a..65d6090 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -3,9 +3,10 @@ module Implicit using UnPack using Ariadne: Ariadne using LinearAlgebra -import Ariadne: JacobianOperator, MOperator +import Ariadne: JacobianOperator using Krylov +using Trixi: @trixi_timeit struct MOperator{JOp} J::JOp dt::Float64 @@ -616,10 +617,10 @@ end function stage!(integrator, alg::Direct) F!(du, u, p) = integrator.f(du, u, p, integrator.t) - J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) - M = MOperator(J, integrator.dt) + J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) + M = MOperator(J, integrator.dt) kc = KrylovConstructor(integrator.res) - workspace = krylov_workspace(:gmres, kc) + workspace = krylov_workspace(:gmres, kc) for stage in 1:stages(alg) alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, workspace, M, integrator.RK) @@ -718,4 +719,6 @@ function jacobian(G!, f!, uₙ, p, Δt, t) return collect(J) end +include("imex.jl") +include("linear_imex.jl") end # module Implicit diff --git a/libs/Implicit/src/imex.jl b/libs/Implicit/src/imex.jl new file mode 100644 index 0000000..37db72c --- /dev/null +++ b/libs/Implicit/src/imex.jl @@ -0,0 +1,263 @@ + +abstract type SimpleImplicitExplicitAlgorithm{N} end + +abstract type RKIMEX{N} <: SimpleImplicitExplicitAlgorithm{N} end + +struct RKImplicitExplicitEuler <: RKIMEX{1} end + +function (::RKImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK) + if stage == 1 + # Stage 1: + ## f2 is the conservative part + ## f1 is the parabolic part + f2!(du, uₙ, p, t + RK.c[stage] * Δt ) + f1!(du_tmp, u, p, t + RK.c[stage] * Δt ) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du - RK.a[stage,stage] * Δt * du_tmp + else + @. u = uₙ + RK.b[1] * Δt * stages[1] + end + +end + +stages(::SimpleImplicitExplicitAlgorithm{N}) where {N} = N + +function nonlinear_problem(alg::SimpleImplicitExplicitAlgorithm, f2::F2) where {F2} + return (res, u, (uₙ, Δt, f1, du, du_tmp, p, t, stages, stage, RK)) -> alg(res, uₙ, Δt, f1, f2, du, du_tmp, u, p, t, stages, stage, RK) +end + +mutable struct SimpleImplicitExplicitOptions{Callback} + callback::Callback # callbacks; used in Trixi.jl + adaptive::Bool # whether the algorithm is adaptive; ignored + dtmax::Float64 # ignored + maxiters::Int # maximal number of time steps + tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored + verbose::Int + algo::Symbol + krylov_kwargs::Any +end + +function RKTableau(alg::RKImplicitExplicitEuler) + return ImplicitExplicitEulerTableau() +end + +function ImplicitExplicitEulerTableau() + + nstage = 1 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 + + b = zeros(Float64, nstage) + b[1] = 1 + + c = zeros(Float64, nstage) + c[1] = 1 + return DIRKButcher(a, b, c) +end + + +function SimpleImplicitExplicitOptions(callback, tspan; maxiters=typemax(Int), verbose=0, krylov_algo=:gmres, krylov_kwargs=(;), kwargs...) + return SimpleImplicitExplicitOptions{typeof(callback)}( + callback, false, Inf, maxiters, + [last(tspan)], + verbose, + krylov_algo, + krylov_kwargs, + ) +end + +mutable struct SimpleImplicitExplicit{ + RealT<:Real,uType,Params,Sol,F,F1,F2,M,Alg<:SimpleImplicitExplicitAlgorithm, + SimpleImplicitExplicitOptions,RKTableau, +} <: AbstractTimeIntegrator + u::uType + du::uType + du_tmp::uType + u_tmp::uType + stages::NTuple{M,uType} + res::uType + t::RealT + dt::RealT # current time step + dtcache::RealT # ignored + iter::Int # current number of time steps (iteration) + p::Params # will be the semidiscretization from Trixi.jl + sol::Sol # faked + f::F #TODO: that should be sum of f1 and f2 + f1::F1 # `rhs!` parabolic + f2::F2 # rhs! conservative + alg::Alg # SimpleImplicitAlgorithm + opts::SimpleImplicitExplicitOptions + finalstep::Bool # added for convenience + RK::RKTableau +end + + +function Base.getproperty(integrator::SimpleImplicitExplicit, field::Symbol) + if field === :stats + return (naccept=getfield(integrator, :iter),) + end + # general fallback + return getfield(integrator, field) +end + +function init( + ode::ODEProblem, alg::SimpleImplicitExplicitAlgorithm{N}; + dt, callback::Union{CallbackSet,Nothing}=nothing, kwargs..., +) where {N} + u = copy(ode.u0) + du = zero(u) + res = zero(u) + u_tmp = similar(u) + stages = ntuple(_ -> similar(u), Val(N)) + t = first(ode.tspan) + iter = 0 + integrator = SimpleImplicitExplicit( + u, du, copy(du), u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + (prob=ode,), ode.f.f1, ode.f.f1, ode.f.f2, alg, + SimpleImplicitExplicitOptions( + callback, ode.tspan; + kwargs..., + ), false, RKTableau(alg)) + + # initialize callbacks + if callback isa CallbackSet + foreach(callback.continuous_callbacks) do cb + throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) + end + foreach(callback.discrete_callbacks) do cb + cb.initialize(cb, integrator.u, integrator.t, integrator) + end + end + + return integrator +end + +# Fakes `solve`: https://diffeq.sciml.ai/v6.8/basics/overview/#Solving-the-Problems-1 +function solve( + ode::ODEProblem, alg::SimpleImplicitExplicitAlgorithm; + dt, callback=nothing, kwargs..., +) + integrator = init(ode, alg, dt=dt, callback=callback; kwargs...) + + # Start actual solve + return solve!(integrator) +end + +function solve!(integrator::SimpleImplicitExplicit) + @unpack prob = integrator.sol + + integrator.finalstep = false + + while !integrator.finalstep + step!(integrator) + end # "main loop" timer + + finalize_callbacks(integrator) + + return TimeIntegratorSolution( + (first(prob.tspan), integrator.t), + (prob.u0, integrator.u), + integrator.sol.prob, + ) +end + + +function step!(integrator::SimpleImplicitExplicit) + @unpack prob = integrator.sol + @unpack alg = integrator + t_end = last(prob.tspan) + callbacks = integrator.opts.callback + + @assert !integrator.finalstep + if isnan(integrator.dt) + error("time step size `dt` is NaN") + end + + # if the next iteration would push the simulation beyond the end time, set dt accordingly + if integrator.t + integrator.dt > t_end || + isapprox(integrator.t + integrator.dt, t_end) + integrator.dt = t_end - integrator.t + terminate!(integrator) + end + + # one time step + integrator.u_tmp .= integrator.u + + stage!(integrator, alg) + + integrator.u .= integrator.u_tmp + + integrator.iter += 1 + integrator.t += integrator.dt + + begin + # handle callbacks + if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + if cb.condition(integrator.u, integrator.t, integrator) + cb.affect!(integrator) + end + return nothing + end + end + end + + # respect maximum number of iterations + return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep + @warn "Interrupted. Larger maxiters is needed." + terminate!(integrator) + end +end + + +function stage!(integrator, alg::RKIMEX) + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f2) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.f1, integrator.du, integrator.du_tmp, integrator.p, integrator.t, integrator.stages, stage, integrator.RK), integrator.res; + verbose=integrator.opts.verbose, krylov_kwargs=integrator.opts.krylov_kwargs, + algo=integrator.opts.algo, tol_abs=6.0e-6, + ) + @assert stats.solved + # Store the solution for each stage in stages + ## For a split Problem we need to compute rhs_conservative and rhs_parabolic + integrator.f2(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .= integrator.du + integrator.f1(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .+= integrator.du + if stage == stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK) + end + + end +end + +# get a cache where the RHS can be stored +get_du(integrator::SimpleImplicitExplicit) = integrator.du +get_tmp_cache(integrator::SimpleImplicitExplicit) = (integrator.u_tmp,) + +# some algorithms from DiffEq like FSAL-ones need to be informed when a callback has modified u +u_modified!(integrator::SimpleImplicitExplicit, ::Bool) = false + +# used by adaptive timestepping algorithms in DiffEq +function set_proposed_dt!(integrator::SimpleImplicitExplicit, dt) + return integrator.dt = dt +end + +# Required e.g. for `glm_speed_callback` +function get_proposed_dt(integrator::SimpleImplicitExplicit) + return integrator.dt +end + +# stop the time integration +function terminate!(integrator::SimpleImplicitExplicit) + integrator.finalstep = true + return empty!(integrator.opts.tstops) +end + +# used for AMR +function Base.resize!(integrator::SimpleImplicitExplicit, new_size) + resize!(integrator.u, new_size) + resize!(integrator.du, new_size) + return resize!(integrator.u_tmp, new_size) +end diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl new file mode 100644 index 0000000..d74ff3b --- /dev/null +++ b/libs/Implicit/src/linear_imex.jl @@ -0,0 +1,269 @@ +abstract type SimpleLinearImplicitExplicitAlgorithm{N} end + +abstract type RKLIMEX{N} <: SimpleLinearImplicitExplicitAlgorithm{N} end + +struct RKLinearImplicitExplicitEuler <: RKLIMEX{1} end + +function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK, J, lin_du_tmp, lin_du_tmp1) + if stage == 1 + # Stage 1: + ## f2 is the conservative part + ## f1 is the parabolic part + mul!(lin_du_tmp, J, uₙ) + mul!(lin_du_tmp1, J, u) + f2!(du, u, p, t + RK.c[stage] * Δt) + f1!(du_tmp, u, p, t + RK.c[stage] * Δt) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* (du .+ du_tmp .- lin_du_tmp1 .+ lin_du_tmp) + else + @. u = uₙ + RK.b[1] * Δt * stages[1] + end + +end + +stages(::SimpleLinearImplicitExplicitAlgorithm{N}) where {N} = N + +function nonlinear_problem(alg::SimpleLinearImplicitExplicitAlgorithm, f2::F2) where {F2} + return (res, u, (uₙ, Δt, f1, du, du_tmp, p, t, stages, stage, RK, J, lin_du_tmp, lin_du_tmp1)) -> alg(res, uₙ, Δt, f1, f2, du, du_tmp, u, p, t, stages, stage, RK, J, lin_du_tmp, lin_du_tmp1) +end + +mutable struct SimpleLinearImplicitExplicitOptions{Callback} + callback::Callback # callbacks; used in Trixi.jl + adaptive::Bool # whether the algorithm is adaptive; ignored + dtmax::Float64 # ignored + maxiters::Int # maximal number of time steps + tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored + verbose::Int + algo::Symbol + krylov_kwargs::Any +end + +function RKTableau(alg::RKLinearImplicitExplicitEuler) + return LinearImplicitExplicitEulerTableau() +end + +function LinearImplicitExplicitEulerTableau() + + nstage = 1 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 + + b = zeros(Float64, nstage) + b[1] = 1 + + c = zeros(Float64, nstage) + c[1] = 1 + return DIRKButcher(a, b, c) +end + + +function SimpleLinearImplicitExplicitOptions(callback, tspan; maxiters=typemax(Int), verbose=0, krylov_algo=:gmres, krylov_kwargs=(;), kwargs...) + return SimpleLinearImplicitExplicitOptions{typeof(callback)}( + callback, false, Inf, maxiters, + [last(tspan)], + verbose, + krylov_algo, + krylov_kwargs, + ) +end + +mutable struct SimpleLinearImplicitExplicit{ + RealT<:Real,uType,Params,Sol,F,F1,F2,M,Alg<:SimpleLinearImplicitExplicitAlgorithm, + SimpleLinearImplicitExplicitOptions,RKTableau, +} <: AbstractTimeIntegrator + u::uType + du::uType + du_tmp::uType + lin_du_tmp::uType + lin_du_tmp1::uType + u_tmp::uType + stages::NTuple{M,uType} + res::uType + t::RealT + dt::RealT # current time step + dtcache::RealT # ignored + iter::Int # current number of time steps (iteration) + p::Params # will be the semidiscretization from Trixi.jl + sol::Sol # faked + f::F #TODO: that should be sum of f1 and f2 + f1::F1 # `rhs!` parabolic + f2::F2 # rhs! conservative + alg::Alg # SimpleImplicitAlgorithm + opts::SimpleLinearImplicitExplicitOptions + finalstep::Bool # added for convenience + RK::RKTableau +end + + +function Base.getproperty(integrator::SimpleLinearImplicitExplicit, field::Symbol) + if field === :stats + return (naccept=getfield(integrator, :iter),) + end + # general fallback + return getfield(integrator, field) +end + +function init( + ode::ODEProblem, alg::SimpleLinearImplicitExplicitAlgorithm{N}; + dt, callback::Union{CallbackSet,Nothing}=nothing, kwargs..., +) where {N} + u = copy(ode.u0) + du = zero(u) + res = zero(u) + u_tmp = similar(u) + stages = ntuple(_ -> similar(u), Val(N)) + t = first(ode.tspan) + iter = 0 + integrator = SimpleLinearImplicitExplicit( + u, du, copy(du),copy(du), copy(du), u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + (prob=ode,), ode.f.f1, ode.f.f1, ode.f.f2, alg, + SimpleLinearImplicitExplicitOptions( + callback, ode.tspan; + kwargs..., + ), false, RKTableau(alg)) + + # initialize callbacks + if callback isa CallbackSet + foreach(callback.continuous_callbacks) do cb + throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) + end + foreach(callback.discrete_callbacks) do cb + cb.initialize(cb, integrator.u, integrator.t, integrator) + end + end + + return integrator +end + +# Fakes `solve`: https://diffeq.sciml.ai/v6.8/basics/overview/#Solving-the-Problems-1 +function solve( + ode::ODEProblem, alg::SimpleLinearImplicitExplicitAlgorithm; + dt, callback=nothing, kwargs..., +) + integrator = init(ode, alg, dt=dt, callback=callback; kwargs...) + + # Start actual solve + return solve!(integrator) +end + +function solve!(integrator::SimpleLinearImplicitExplicit) + @unpack prob = integrator.sol + + integrator.finalstep = false + + while !integrator.finalstep + step!(integrator) + end # "main loop" timer + + finalize_callbacks(integrator) + + return TimeIntegratorSolution( + (first(prob.tspan), integrator.t), + (prob.u0, integrator.u), + integrator.sol.prob, + ) +end + + +function step!(integrator::SimpleLinearImplicitExplicit) + @unpack prob = integrator.sol + @unpack alg = integrator + t_end = last(prob.tspan) + callbacks = integrator.opts.callback + + @assert !integrator.finalstep + if isnan(integrator.dt) + error("time step size `dt` is NaN") + end + + # if the next iteration would push the simulation beyond the end time, set dt accordingly + if integrator.t + integrator.dt > t_end || + isapprox(integrator.t + integrator.dt, t_end) + integrator.dt = t_end - integrator.t + terminate!(integrator) + end + + # one time step + integrator.u_tmp .= integrator.u + + stage!(integrator, alg) + + integrator.u .= integrator.u_tmp + + integrator.iter += 1 + integrator.t += integrator.dt + + begin + # handle callbacks + if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + if cb.condition(integrator.u, integrator.t, integrator) + cb.affect!(integrator) + end + return nothing + end + end + end + + # respect maximum number of iterations + return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep + @warn "Interrupted. Larger maxiters is needed." + terminate!(integrator) + end +end + + +function stage!(integrator, alg::RKLIMEX) + F!(du, u, p) = integrator.f1(du, u, p, integrator.t) + J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f2) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.f1, integrator.du, integrator.du_tmp, integrator.p, integrator.t, integrator.stages, stage, integrator.RK, J, integrator.lin_du_tmp, integrator.lin_du_tmp1), integrator.res; + verbose=integrator.opts.verbose, krylov_kwargs=integrator.opts.krylov_kwargs, + algo=integrator.opts.algo, tol_abs=6.0e-6, + ) + @assert stats.solved + # Store the solution for each stage in stages + ## For a split Problem we need to compute rhs_conservative and rhs_parabolic + integrator.f2(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .= integrator.du + integrator.f1(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .+= integrator.du + if stage == stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK, J, integrator.lin_du_tmp, integrator.lin_du_tmp1) + end + + end +end + +# get a cache where the RHS can be stored +get_du(integrator::SimpleLinearImplicitExplicit) = integrator.du +get_tmp_cache(integrator::SimpleLinearImplicitExplicit) = (integrator.u_tmp,) + +# some algorithms from DiffEq like FSAL-ones need to be informed when a callback has modified u +u_modified!(integrator::SimpleLinearImplicitExplicit, ::Bool) = false + +# used by adaptive timestepping algorithms in DiffEq +function set_proposed_dt!(integrator::SimpleLinearImplicitExplicit, dt) + return integrator.dt = dt +end + +# Required e.g. for `glm_speed_callback` +function get_proposed_dt(integrator::SimpleLinearImplicitExplicit) + return integrator.dt +end + +# stop the time integration +function terminate!(integrator::SimpleLinearImplicitExplicit) + integrator.finalstep = true + return empty!(integrator.opts.tstops) +end + +# used for AMR +function Base.resize!(integrator::SimpleLinearImplicitExplicit, new_size) + resize!(integrator.u, new_size) + resize!(integrator.du, new_size) + return resize!(integrator.u_tmp, new_size) +end + diff --git a/libs/Implicit/src/skeleton.jl b/libs/Implicit/src/skeleton.jl new file mode 100644 index 0000000..1b7bb22 --- /dev/null +++ b/libs/Implicit/src/skeleton.jl @@ -0,0 +1,263 @@ +abstract type SimpleImplicitExplicitAlgorithm{N} end + +abstract type RKIMEX{N} <: SimpleImplicitExplicitAlgorithm{N} end + +struct RKImplicitExplicitEuler <: RKIMEX{1} end + +function (::RKImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK) + if stage == 1 + # Stage 1: + ## f2 is the conservative part + ## f1 is the parabolic part + f2!(du, uₙ, p, t + RK.c[stage] * Δt ) + f1!(du_tmp, u, p, t + RK.c[stage] * Δt ) + return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* du - RK.a[stage,stage] * Δt * du_tmp + else + @. u = uₙ + RK.b[1] * Δt * stages[1] + end + +end + +stages(::SimpleImplicitExplicitAlgorithm{N}) where {N} = N + +function nonlinear_problem(alg::SimpleImplicitExplicitAlgorithm, f2::F2) where {F2} + return (res, u, (uₙ, Δt, f1, du, du_tmp, p, t, stages, stage, RK)) -> alg(res, uₙ, Δt, f1, f2, du, du_tmp, u, p, t, stages, stage, RK) +end + +mutable struct SimpleImplicitExplicitOptions{Callback} + callback::Callback # callbacks; used in Trixi.jl + adaptive::Bool # whether the algorithm is adaptive; ignored + dtmax::Float64 # ignored + maxiters::Int # maximal number of time steps + tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored + verbose::Int + algo::Symbol + krylov_kwargs::Any +end + +function RKTableau(alg::RKImplicitExplicitEuler) + return ImplicitExplicitEulerTableau() +end + +function ImplicitExplicitEulerTableau() + + nstage = 1 + a = zeros(Float64, nstage, nstage) + a[1, 1] = 1 + + b = zeros(Float64, nstage) + b[1] = 1 + + c = zeros(Float64, nstage) + c[1] = 1 + return DIRKButcher(a, b, c) +end + + +function SimpleImplicitExplicitOptions(callback, tspan; maxiters=typemax(Int), verbose=0, krylov_algo=:gmres, krylov_kwargs=(;), kwargs...) + return SimpleImplicitExplicitOptions{typeof(callback)}( + callback, false, Inf, maxiters, + [last(tspan)], + verbose, + krylov_algo, + krylov_kwargs, + ) +end + +mutable struct SimpleImplicitExplicit{ + RealT<:Real,uType,Params,Sol,F,F1,F2,M,Alg<:SimpleImplicitExplicitAlgorithm, + SimpleImplicitExplicitOptions,RKTableau, +} <: AbstractTimeIntegrator + u::uType + du::uType + du_tmp::uType + u_tmp::uType + stages::NTuple{M,uType} + res::uType + t::RealT + dt::RealT # current time step + dtcache::RealT # ignored + iter::Int # current number of time steps (iteration) + p::Params # will be the semidiscretization from Trixi.jl + sol::Sol # faked + f::F #TODO: that should be sum of f1 and f2 + f1::F1 # `rhs!` parabolic + f2::F2 # rhs! conservative + alg::Alg # SimpleImplicitAlgorithm + opts::SimpleImplicitExplicitOptions + finalstep::Bool # added for convenience + RK::RKTableau +end + + +function Base.getproperty(integrator::SimpleImplicitExplicit, field::Symbol) + if field === :stats + return (naccept=getfield(integrator, :iter),) + end + # general fallback + return getfield(integrator, field) +end + +function init( + ode::ODEProblem, alg::SimpleImplicitExplicitAlgorithm{N}; + dt, callback::Union{CallbackSet,Nothing}=nothing, kwargs..., +) where {N} + u = copy(ode.u0) + du = zero(u) + res = zero(u) + u_tmp = similar(u) + stages = ntuple(_ -> similar(u), Val(N)) + t = first(ode.tspan) + iter = 0 + integrator = SimpleImplicitExplicit( + u, du, copy(du), u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + (prob=ode,), ode.f.f1, ode.f.f1, ode.f.f2, alg, + SimpleImplicitExplicitOptions( + callback, ode.tspan; + kwargs..., + ), false, RKTableau(alg)) + + # initialize callbacks + if callback isa CallbackSet + foreach(callback.continuous_callbacks) do cb + throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) + end + foreach(callback.discrete_callbacks) do cb + cb.initialize(cb, integrator.u, integrator.t, integrator) + end + end + + return integrator +end + +# Fakes `solve`: https://diffeq.sciml.ai/v6.8/basics/overview/#Solving-the-Problems-1 +function solve( + ode::ODEProblem, alg::SimpleImplicitExplicitAlgorithm; + dt, callback=nothing, kwargs..., +) + integrator = init(ode, alg, dt=dt, callback=callback; kwargs...) + + # Start actual solve + return solve!(integrator) +end + +function solve!(integrator::SimpleImplicitExplicit) + @unpack prob = integrator.sol + + integrator.finalstep = false + + while !integrator.finalstep + step!(integrator) + end # "main loop" timer + + finalize_callbacks(integrator) + + return TimeIntegratorSolution( + (first(prob.tspan), integrator.t), + (prob.u0, integrator.u), + integrator.sol.prob, + ) +end + + +function step!(integrator::SimpleImplicitExplicit) + @unpack prob = integrator.sol + @unpack alg = integrator + t_end = last(prob.tspan) + callbacks = integrator.opts.callback + + @assert !integrator.finalstep + if isnan(integrator.dt) + error("time step size `dt` is NaN") + end + + # if the next iteration would push the simulation beyond the end time, set dt accordingly + if integrator.t + integrator.dt > t_end || + isapprox(integrator.t + integrator.dt, t_end) + integrator.dt = t_end - integrator.t + terminate!(integrator) + end + + # one time step + integrator.u_tmp .= integrator.u + + stage!(integrator, alg) + + integrator.u .= integrator.u_tmp + + integrator.iter += 1 + integrator.t += integrator.dt + + begin + # handle callbacks + if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + if cb.condition(integrator.u, integrator.t, integrator) + cb.affect!(integrator) + end + return nothing + end + end + end + + # respect maximum number of iterations + return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep + @warn "Interrupted. Larger maxiters is needed." + terminate!(integrator) + end +end + + +function stage!(integrator, alg::RKIMEX) + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f2) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.f1, integrator.du, integrator.du_tmp, integrator.p, integrator.t, integrator.stages, stage, integrator.RK), integrator.res; + verbose=integrator.opts.verbose, krylov_kwargs=integrator.opts.krylov_kwargs, + algo=integrator.opts.algo, tol_abs=6.0e-6, + ) + @assert stats.solved + # Store the solution for each stage in stages + ## For a split Problem we need to compute rhs_conservative and rhs_parabolic + integrator.f2(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .= integrator.du + integrator.f1(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) + integrator.stages[stage] .+= integrator.du + if stage == stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK) + end + + end +end + +# get a cache where the RHS can be stored +get_du(integrator::SimpleImplicitExplicit) = integrator.du +get_tmp_cache(integrator::SimpleImplicitExplicit) = (integrator.u_tmp,) + +# some algorithms from DiffEq like FSAL-ones need to be informed when a callback has modified u +u_modified!(integrator::SimpleImplicitExplicit, ::Bool) = false + +# used by adaptive timestepping algorithms in DiffEq +function set_proposed_dt!(integrator::SimpleImplicitExplicit, dt) + return integrator.dt = dt +end + +# Required e.g. for `glm_speed_callback` +function get_proposed_dt(integrator::SimpleImplicitExplicit) + return integrator.dt +end + +# stop the time integration +function terminate!(integrator::SimpleImplicitExplicit) + integrator.finalstep = true + return empty!(integrator.opts.tstops) +end + +# used for AMR +function Base.resize!(integrator::SimpleImplicitExplicit, new_size) + resize!(integrator.u, new_size) + resize!(integrator.du, new_size) + return resize!(integrator.u_tmp, new_size) +end + diff --git a/src/Ariadne.jl b/src/Ariadne.jl index 2be23dc..39217fe 100644 --- a/src/Ariadne.jl +++ b/src/Ariadne.jl @@ -11,51 +11,130 @@ using Enzyme ## import LinearAlgebra: mul! -function maybe_duplicated(x, ::Val{N} = Val(1)) where {N} - # TODO cache? +function init_cache(x) if !Enzyme.Compiler.guaranteed_const(typeof(x)) - if N == 1 - return Duplicated(x, Enzyme.make_zero(x)) - else - return BatchDuplicated(x, ntuple(_ -> Enzyme.make_zero(x), Val(N))) - end + Enzyme.make_zero(x) else + return nothing + end +end + +function maybe_duplicated(x::T, x′::Union{Nothing, T}) where {T} + if x′ === nothing return Const(x) + else + Enzyme.remake_zero!(x′) + return Duplicated(x, x′) end end -# TODO: JacobianOperator with thunk +abstract type AbstractJacobianOperator end + """ JacobianOperator Efficient implementation of `J(f,x,p) * v` and `v * J(f, x,p)'` """ -struct JacobianOperator{F, A, P} +struct JacobianOperator{F, A, P} <: AbstractJacobianOperator f::F # F!(res, u, p) + f′::Union{Nothing, F} # cache res::A u::A p::P + p′::Union{Nothing, P} # cache function JacobianOperator(f::F, res, u, p) where {F} - return new{F, typeof(u), typeof(p)}(f, res, u, p) + f′ = init_cache(f) + p′ = init_cache(p) + return new{F, typeof(u), typeof(p)}(f, f′, res, u, p, p′) end end +batch_size(::JacobianOperator) = 1 + Base.size(J::JacobianOperator) = (length(J.res), length(J.u)) Base.eltype(J::JacobianOperator) = eltype(J.u) Base.length(J::JacobianOperator) = prod(size(J)) -function mul!(out::AbstractVector, J::JacobianOperator, v::AbstractVector) +function mul!(out, J::JacobianOperator, v) autodiff( Forward, - maybe_duplicated(J.f), Const, + maybe_duplicated(J.f, J.f′), Const, Duplicated(J.res, reshape(out, size(J.res))), Duplicated(J.u, reshape(v, size(J.u))), - maybe_duplicated(J.p) + maybe_duplicated(J.p, J.p′) ) return nothing end +LinearAlgebra.adjoint(J::JacobianOperator) = Adjoint(J) +LinearAlgebra.transpose(J::JacobianOperator) = Transpose(J) + +# Jᵀ(y, u) = ForwardDiff.gradient!(y, x -> dot(F(x), u), xk) +# or just reverse mode + +function mul!(out, J′::Union{Adjoint{<:Any, <:JacobianOperator}, Transpose{<:Any, <:JacobianOperator}}, v) + J = parent(J′) + # TODO: provide cache for `copy(v)` + # Enzyme zeros input derivatives and that confuses the solvers. + # If `out` is non-zero we might get spurious gradients + fill!(out, 0) + autodiff( + Reverse, + maybe_duplicated(J.f, J.f′), Const, + Duplicated(J.res, reshape(copy(v), size(J.res))), + Duplicated(J.u, reshape(out, size(J.u))), + maybe_duplicated(J.p, J.p′) + ) + return nothing +end + + +function init_cache(x, ::Val{N}) where {N} + if !Enzyme.Compiler.guaranteed_const(typeof(x)) + return ntuple(_ -> Enzyme.make_zero(x), Val(N)) + else + return nothing + end +end + +function maybe_duplicated(x::T, x′::Union{Nothing, NTuple{N, T}}, ::Val{N}) where {T, N} + if x′ === nothing + return Const(x) + else + Enzyme.remake_zero!(x′) + return BatchDuplicated(x, x′) + end +end + +""" + BatchedJacobianOperator{N} + + +""" +struct BatchedJacobianOperator{N, F, A, P} <: AbstractJacobianOperator + f::F # F!(res, u, p) + f′::Union{Nothing, NTuple{N, F}} # cache + res::A + u::A + p::P + p′::Union{Nothing, NTuple{N, P}} # cache + function BatchedJacobianOperator{N}(f::F, res, u, p) where {F, N} + f′ = init_cache(f, Val(N)) + p′ = init_cache(p, Val(N)) + return new{N, F, typeof(u), typeof(p)}(f, f′, res, u, p, p′) + end +end + +batch_size(::BatchedJacobianOperator{N}) where {N} = N + +Base.size(J::BatchedJacobianOperator) = (length(J.res), length(J.u)) +Base.eltype(J::BatchedJacobianOperator) = eltype(J.u) +Base.length(J::BatchedJacobianOperator) = prod(size(J)) + +LinearAlgebra.adjoint(J::BatchedJacobianOperator) = Adjoint(J) +LinearAlgebra.transpose(J::BatchedJacobianOperator) = Transpose(J) + if VERSION >= v"1.11.0" function tuple_of_vectors(M::Matrix{T}, shape) where {T} @@ -66,49 +145,23 @@ if VERSION >= v"1.11.0" end end - function mul!(Out::AbstractMatrix, J::JacobianOperator, V::AbstractMatrix) + function mul!(Out, J::BatchedJacobianOperator{N}, V) where {N} @assert size(Out, 2) == size(V, 2) out = tuple_of_vectors(Out, size(J.res)) v = tuple_of_vectors(V, size(J.u)) - N = length(out) + @assert N == length(out) autodiff( Forward, - maybe_duplicated(J.f, Val(N)), Const, + maybe_duplicated(J.f, J.f′, Val(N)), Const, BatchDuplicated(J.res, out), BatchDuplicated(J.u, v), - maybe_duplicated(J.p, Val(N)) + maybe_duplicated(J.p, J.p′, Val(N)) ) return nothing end -end # VERSION >= v"1.11.0" - -LinearAlgebra.adjoint(J::JacobianOperator) = Adjoint(J) -LinearAlgebra.transpose(J::JacobianOperator) = Transpose(J) - -# Jᵀ(y, u) = ForwardDiff.gradient!(y, x -> dot(F(x), u), xk) -# or just reverse mode - -function mul!(out::AbstractVector, J′::Union{Adjoint{<:Any, <:JacobianOperator}, Transpose{<:Any, <:JacobianOperator}}, v::AbstractVector) - J = parent(J′) - # TODO: provide cache for `copy(v)` - # Enzyme zeros input derivatives and that confuses the solvers. - # If `out` is non-zero we might get spurious gradients - fill!(out, 0) - autodiff( - Reverse, - maybe_duplicated(J.f), Const, - Duplicated(J.res, reshape(copy(v), size(J.res))), - Duplicated(J.u, reshape(out, size(J.u))), - maybe_duplicated(J.p) - ) - return nothing -end - -if VERSION >= v"1.11.0" - - function mul!(Out::AbstractMatrix, J′::Union{Adjoint{<:Any, <:JacobianOperator}, Transpose{<:Any, <:JacobianOperator}}, V::AbstractMatrix) + function mul!(Out, J′::Union{Adjoint{<:Any, <:BatchedJacobianOperator{N}}, Transpose{<:Any, <:BatchedJacobianOperator{N}}}, V) where {N} J = parent(J′) @assert size(Out, 2) == size(V, 2) @@ -122,22 +175,20 @@ if VERSION >= v"1.11.0" out = tuple_of_vectors(Out, size(J.u)) v = tuple_of_vectors(V, size(J.res)) - N = length(out) + @assert N == length(out) - # TODO: BatchDuplicated for J.f autodiff( Reverse, - maybe_duplicated(J.f, Val(N)), Const, + maybe_duplicated(J.f, J.f′, Val(N)), Const, BatchDuplicated(J.res, v), BatchDuplicated(J.u, out), - maybe_duplicated(J.p, Val(N)) + maybe_duplicated(J.p, J.p′, Val(N)) ) return nothing end - end # VERSION >= v"1.11.0" -function Base.collect(JOp::Union{Adjoint{<:Any, <:JacobianOperator}, Transpose{<:Any, <:JacobianOperator}, JacobianOperator}) +function Base.collect(JOp::Union{Adjoint{<:Any, <:AbstractJacobianOperator}, Transpose{<:Any, <:AbstractJacobianOperator}, AbstractJacobianOperator}) N, M = size(JOp) if JOp isa JacobianOperator v = zero(JOp.u) From 0a04a0956fd4e85b41c349ec431f41c47c9a7cf8 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Thu, 17 Jul 2025 21:32:19 +0200 Subject: [PATCH 15/21] remove out files --- examples/out/mesh.h5 | Bin 36832 -> 0 bytes examples/out/solution_000000000.h5 | Bin 34816 -> 0 bytes examples/out/solution_000000003.h5 | Bin 34816 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/out/mesh.h5 delete mode 100644 examples/out/solution_000000000.h5 delete mode 100644 examples/out/solution_000000003.h5 diff --git a/examples/out/mesh.h5 b/examples/out/mesh.h5 deleted file mode 100644 index 71bd752473ba5a1154072f3dbf70c1da21cb2241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36832 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 diff --git a/examples/out/solution_000000003.h5 b/examples/out/solution_000000003.h5 deleted file mode 100644 index fd879e6f11231d2fdfedc4286cdbb404ba964926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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

&g0aHnS4^JDsiIZ(%+G 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 A(EtDd From dd53d2fb9858cf375259db7d5378d5f34dd2f9f2 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Thu, 17 Jul 2025 22:33:54 +0200 Subject: [PATCH 16/21] fix linear implicit --- libs/Implicit/src/linear_imex.jl | 38 ++++++++++++++------------------ 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl index d74ff3b..3df80b7 100644 --- a/libs/Implicit/src/linear_imex.jl +++ b/libs/Implicit/src/linear_imex.jl @@ -4,17 +4,23 @@ abstract type RKLIMEX{N} <: SimpleLinearImplicitExplicitAlgorithm{N} end struct RKLinearImplicitExplicitEuler <: RKLIMEX{1} end -function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK, J, lin_du_tmp, lin_du_tmp1) +function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK, M, lin_du_tmp, lin_du_tmp1, workspace) if stage == 1 # Stage 1: ## f2 is the conservative part ## f1 is the parabolic part mul!(lin_du_tmp, J, uₙ) mul!(lin_du_tmp1, J, u) - f2!(du, u, p, t + RK.c[stage] * Δt) - f1!(du_tmp, u, p, t + RK.c[stage] * Δt) - return res .= u .- uₙ .- RK.a[stage, stage] * Δt .* (du .+ du_tmp .- lin_du_tmp1 .+ lin_du_tmp) - else + f2!(du, uₙ, p, t + RK.c[stage] * Δt) + f1!(du_tmp, uₙ, p, t + RK.c[stage] * Δt) + + res .= uₙ .+ RK.a[stage, stage] * Δt .* (du .+ du_tmp .- lin_du_tmp) + krylov_solve!(workspace, M, copy(res)) + + f2!(du, workspace.x, p, t + RK.c[stage] * Δt) + f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) + + stages[stage] .= du .+ du_tmp @. u = uₙ + RK.b[1] * Δt * stages[1] end @@ -211,27 +217,17 @@ function step!(integrator::SimpleLinearImplicitExplicit) end end - function stage!(integrator, alg::RKLIMEX) - F!(du, u, p) = integrator.f1(du, u, p, integrator.t) + F!(du, u, p) = integrator.f1(du, u, p, integrator.t) ## parabolic J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) - for stage in 1:stages(alg) - F! = nonlinear_problem(alg, integrator.f2) - # TODO: Pass in `stages[1:(stage-1)]` or full tuple? - _, stats = Ariadne.newton_krylov!( - F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.f1, integrator.du, integrator.du_tmp, integrator.p, integrator.t, integrator.stages, stage, integrator.RK, J, integrator.lin_du_tmp, integrator.lin_du_tmp1), integrator.res; - verbose=integrator.opts.verbose, krylov_kwargs=integrator.opts.krylov_kwargs, - algo=integrator.opts.algo, tol_abs=6.0e-6, - ) - @assert stats.solved + M = MOperator(J, integrator.dt) + kc = KrylovConstructor(integrator.res) + workspace = krylov_workspace(:gmres, kc) + for stage in 1:stages(alg) # Store the solution for each stage in stages ## For a split Problem we need to compute rhs_conservative and rhs_parabolic - integrator.f2(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) - integrator.stages[stage] .= integrator.du - integrator.f1(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) - integrator.stages[stage] .+= integrator.du if stage == stages(alg) - alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK, J, integrator.lin_du_tmp, integrator.lin_du_tmp1) + alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK, M, integrator.lin_du_tmp, integrator.lin_du_tmp1, workspace) end end From d9e9d75705aecbdf66406220724a1a63763d79b1 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Thu, 17 Jul 2025 23:48:27 +0200 Subject: [PATCH 17/21] minor changes --- examples/trixi_rosenbrock.jl | 4 ++-- libs/Implicit/src/linear_imex.jl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/trixi_rosenbrock.jl b/examples/trixi_rosenbrock.jl index 6c9abbc..c530c86 100644 --- a/examples/trixi_rosenbrock.jl +++ b/examples/trixi_rosenbrock.jl @@ -19,7 +19,7 @@ using CairoMakie @assert !Trixi._PREFERENCE_POLYESTER @assert !Trixi._PREFERENCE_LOOPVECTORIZATION -trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), cfl = 10.0, sol = nothing); +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), CFL = 10.0, sol = nothing); ############################################################################### # run the simulation @@ -30,4 +30,4 @@ sol = solve( ode_default_options()..., callback = callbacks, # verbose=1, krylov_algo = :gmres, -); \ No newline at end of file +); diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl index 3df80b7..7962fd3 100644 --- a/libs/Implicit/src/linear_imex.jl +++ b/libs/Implicit/src/linear_imex.jl @@ -10,7 +10,7 @@ function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, ## f2 is the conservative part ## f1 is the parabolic part mul!(lin_du_tmp, J, uₙ) - mul!(lin_du_tmp1, J, u) +# mul!(lin_du_tmp1, J, u) f2!(du, uₙ, p, t + RK.c[stage] * Δt) f1!(du_tmp, uₙ, p, t + RK.c[stage] * Δt) @@ -220,7 +220,7 @@ end function stage!(integrator, alg::RKLIMEX) F!(du, u, p) = integrator.f1(du, u, p, integrator.t) ## parabolic J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) - M = MOperator(J, integrator.dt) + M = MOperator(J, inv(integrator.dt)) kc = KrylovConstructor(integrator.res) workspace = krylov_workspace(:gmres, kc) for stage in 1:stages(alg) From 17228e0df5cdc79c22e660ed8c5c288566df2eba Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Fri, 18 Jul 2025 12:05:27 +0200 Subject: [PATCH 18/21] fix lhs for linear implicit --- examples/Manifest.toml | 24 +++++++++--------- examples/trixi_lid_driven_linear.jl | 39 +++++++++++++++++++++++++++++ libs/Implicit/src/Implicit.jl | 12 +++++++-- libs/Implicit/src/linear_imex.jl | 10 +++++++- 4 files changed, 70 insertions(+), 15 deletions(-) create mode 100644 examples/trixi_lid_driven_linear.jl diff --git a/examples/Manifest.toml b/examples/Manifest.toml index 58fd47c..0c72bb8 100644 --- a/examples/Manifest.toml +++ b/examples/Manifest.toml @@ -388,9 +388,9 @@ weakdeps = ["InverseFunctions"] [[deps.ComputePipeline]] deps = ["Observables", "Preferences"] -git-tree-sha1 = "21d0d31878a58a902013389bf5c0fcc5be4bbe5a" +git-tree-sha1 = "e215ba0e9a9e9377f2ed87cf3eb26840c8990585" uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" -version = "0.1.2" +version = "0.1.3" [[deps.ConcreteStructs]] git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" @@ -689,9 +689,9 @@ version = "0.1.6" [[deps.FFMPEG_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38" +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "6.1.2+0" +version = "4.4.4+1" [[deps.FFTW]] deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] @@ -1057,9 +1057,9 @@ version = "0.1.5" [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.0.4+0" +version = "2025.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -3075,13 +3075,13 @@ uuid = "4ee9bed8-4011-53f7-90c2-22363c2f500d" version = "3.0.1+0" [[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "10164.0.1+0" +version = "2021.5.5+0" [[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.6.0+0" +version = "3.5.0+0" diff --git a/examples/trixi_lid_driven_linear.jl b/examples/trixi_lid_driven_linear.jl new file mode 100644 index 0000000..64b1ee9 --- /dev/null +++ b/examples/trixi_lid_driven_linear.jl @@ -0,0 +1,39 @@ +# # Using the an implicit solver based on Ariadne with Trixi.jl + +using Trixi +using Implicit +using CairoMakie + + +# Notes: +# Must disable both Polyester and LoopVectorization for Enzyme to be able to differentiate Trixi.jl +# Using https://github.com/trixi-framework/Trixi.jl/pull/2295 +# +# LocalPreferences.jl +# ```toml +# [Trixi] +# loop_vectorization = false +# polyester = false +# ``` + +@assert !Trixi._PREFERENCE_POLYESTER +@assert !Trixi._PREFERENCE_LOOPVECTORIZATION + +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_lid_driven_cavity.jl"), sol = nothing); + + +############################################################################### +# run the simulation + +sol = solve( + ode, + #Implicit.RKLinearImplicitExplicitEuler(); + Implicit.KS22(); + dt = 0.001, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); + +## dt_vec = [0.001, 0.001/2, 0.0001] +## l2_vec = [4.95311953e-04, 2.48996489e-04 ,5.40458032e-05, ] diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 65d6090..d2f000f 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -12,6 +12,14 @@ struct MOperator{JOp} dt::Float64 end +struct LMOperator{JOp} + J::JOp +dt::Float64 +end + +Base.size(M::LMOperator) = size(M.J) +Base.eltype(M::LMOperator) = eltype(M.J) +Base.length(M::LMOperator) = length(M.J) Base.size(M::MOperator) = size(M.J) Base.eltype(M::MOperator) = eltype(M.J) Base.length(M::MOperator) = length(M.J) @@ -426,11 +434,11 @@ function RKTableau(alg::RKImplicitEuler) end function RKTableau(alg::KS22) - return KS2Tableau() + return KS22Tableau() end function RKTableau(alg::QZ22) - return QZ2Tableau() + return QZ22Tableau() end function RKTableau(alg::C23) diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl index 7962fd3..65ae3e7 100644 --- a/libs/Implicit/src/linear_imex.jl +++ b/libs/Implicit/src/linear_imex.jl @@ -4,6 +4,14 @@ abstract type RKLIMEX{N} <: SimpleLinearImplicitExplicitAlgorithm{N} end struct RKLinearImplicitExplicitEuler <: RKLIMEX{1} end + +function mul!(out::AbstractVector, M::LMOperator, v::AbstractVector) + # out = (I/dt - J(f,x,p)) * v + mul!(out, M.J, v) + @. out = v - out * M.dt + return nothing +end + function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK, M, lin_du_tmp, lin_du_tmp1, workspace) if stage == 1 # Stage 1: @@ -220,7 +228,7 @@ end function stage!(integrator, alg::RKLIMEX) F!(du, u, p) = integrator.f1(du, u, p, integrator.t) ## parabolic J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) - M = MOperator(J, inv(integrator.dt)) + M = LMOperator(J, integrator.dt) kc = KrylovConstructor(integrator.res) workspace = krylov_workspace(:gmres, kc) for stage in 1:stages(alg) From 530df4a9ba6eefd5be7216bd33d5bd26eda6fa2f Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Fri, 18 Jul 2025 15:25:13 +0200 Subject: [PATCH 19/21] fix time integrator for linear implicit --- examples/trixi_lid_driven_linear.jl | 6 +++--- examples/trixi_navier_stokes_linear_imex.jl | 3 --- libs/Implicit/src/imex.jl | 2 +- libs/Implicit/src/linear_imex.jl | 19 +++++++------------ 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/examples/trixi_lid_driven_linear.jl b/examples/trixi_lid_driven_linear.jl index 64b1ee9..6a0f55c 100644 --- a/examples/trixi_lid_driven_linear.jl +++ b/examples/trixi_lid_driven_linear.jl @@ -27,9 +27,9 @@ trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_lid sol = solve( ode, - #Implicit.RKLinearImplicitExplicitEuler(); - Implicit.KS22(); - dt = 0.001, # solve needs some value here but it will be overwritten by the stepsize_callback + Implicit.RKLinearImplicitExplicitEuler(); + #Implicit.KS22(); + dt = 0.01, # solve needs some value here but it will be overwritten by the stepsize_callback ode_default_options()..., callback = callbacks, # verbose=1, krylov_algo = :gmres, diff --git a/examples/trixi_navier_stokes_linear_imex.jl b/examples/trixi_navier_stokes_linear_imex.jl index 8a71a13..c115991 100644 --- a/examples/trixi_navier_stokes_linear_imex.jl +++ b/examples/trixi_navier_stokes_linear_imex.jl @@ -21,7 +21,6 @@ using CairoMakie trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_convergence.jl"), sol = nothing); - ############################################################################### # run the simulation @@ -34,5 +33,3 @@ sol = solve( krylov_algo = :gmres, ); -## dt_vec = [0.001, 0.001/2, 0.0001] -## l2_vec = [4.95311953e-04, 2.48996489e-04 ,5.40458032e-05, ] diff --git a/libs/Implicit/src/imex.jl b/libs/Implicit/src/imex.jl index 37db72c..41f1f77 100644 --- a/libs/Implicit/src/imex.jl +++ b/libs/Implicit/src/imex.jl @@ -225,7 +225,7 @@ function stage!(integrator, alg::RKIMEX) integrator.stages[stage] .= integrator.du integrator.f1(integrator.du, integrator.u_tmp, integrator.p, integrator.t + integrator.RK.c[stage] * integrator.dt) integrator.stages[stage] .+= integrator.du - if stage == stages(alg) + if stage == stages(alg) alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK) end diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl index 65ae3e7..61df48a 100644 --- a/libs/Implicit/src/linear_imex.jl +++ b/libs/Implicit/src/linear_imex.jl @@ -4,7 +4,6 @@ abstract type RKLIMEX{N} <: SimpleLinearImplicitExplicitAlgorithm{N} end struct RKLinearImplicitExplicitEuler <: RKLIMEX{1} end - function mul!(out::AbstractVector, M::LMOperator, v::AbstractVector) # out = (I/dt - J(f,x,p)) * v mul!(out, M.J, v) @@ -17,21 +16,19 @@ function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, # Stage 1: ## f2 is the conservative part ## f1 is the parabolic part - mul!(lin_du_tmp, J, uₙ) + mul!(lin_du_tmp, M.J, uₙ) # mul!(lin_du_tmp1, J, u) f2!(du, uₙ, p, t + RK.c[stage] * Δt) f1!(du_tmp, uₙ, p, t + RK.c[stage] * Δt) res .= uₙ .+ RK.a[stage, stage] * Δt .* (du .+ du_tmp .- lin_du_tmp) krylov_solve!(workspace, M, copy(res)) - - f2!(du, workspace.x, p, t + RK.c[stage] * Δt) - f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) - - stages[stage] .= du .+ du_tmp - @. u = uₙ + RK.b[1] * Δt * stages[1] + @. u = workspace.x +# f2!(du, workspace.x, p, t + RK.c[stage] * Δt) +# f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) +# stages[stage] .= du .+ du_tmp +# @. u = uₙ + RK.b[1] * Δt * stages[1] end - end stages(::SimpleLinearImplicitExplicitAlgorithm{N}) where {N} = N @@ -234,9 +231,7 @@ function stage!(integrator, alg::RKLIMEX) for stage in 1:stages(alg) # Store the solution for each stage in stages ## For a split Problem we need to compute rhs_conservative and rhs_parabolic - if stage == stages(alg) - alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage + 1, integrator.RK, M, integrator.lin_du_tmp, integrator.lin_du_tmp1, workspace) - end + alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, integrator.RK, M, integrator.lin_du_tmp, integrator.lin_du_tmp1, workspace) end end From cad182b5c2ef3ba7b72d51d51e1eaf0bc420b5d9 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Fri, 18 Jul 2025 16:00:11 -0400 Subject: [PATCH 20/21] implement linear ssp imex --- examples/Manifest.toml | 29 ++++++- examples/Project.toml | 1 + examples/trixi_fvm_lid_driven.jl | 83 ++++++++++++++++++ examples/trixi_lid_driven_linear.jl | 7 +- libs/Implicit/src/linear_imex.jl | 125 ++++++++++++++++++++++++++-- 5 files changed, 235 insertions(+), 10 deletions(-) create mode 100644 examples/trixi_fvm_lid_driven.jl diff --git a/examples/Manifest.toml b/examples/Manifest.toml index 0c72bb8..f9db8fc 100644 --- a/examples/Manifest.toml +++ b/examples/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.11.5" manifest_format = "2.0" -project_hash = "1ca87a630304403ee4dfd01b3a8d28b4f3f0bfae" +project_hash = "bd968805694a58fc0357e8b0ea61144c0696459a" [[deps.ADTypes]] git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" @@ -372,6 +372,11 @@ weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] CompatLinearAlgebraExt = "LinearAlgebra" +[[deps.Compiler]] +git-tree-sha1 = "382d79bfe72a406294faca39ef0c3cef6e6ce1f1" +uuid = "807dbc54-b67e-4c79-8afb-eafe4df6f2e1" +version = "0.1.1" + [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" @@ -1172,6 +1177,12 @@ git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" version = "3.1.1+0" +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "6ac9e4acc417a5b534ace12690bc6973c25b862f" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.10.3" + [[deps.KernelAbstractions]] deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] git-tree-sha1 = "38a03910123867c11af988e8718d12c98bf6a234" @@ -1490,6 +1501,12 @@ weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"] ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] SpecialFunctionsExt = "SpecialFunctions" +[[deps.LoweredCodeUtils]] +deps = ["Compiler", "JuliaInterpreter"] +git-tree-sha1 = "b882a7dd7ef37643066ae8f9380beea8fdd89cae" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "3.4.2" + [[deps.METIS_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "2eefa8baa858871ae7770c98c3c2a7e46daba5b4" @@ -2317,6 +2334,16 @@ git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.1" +[[deps.Revise]] +deps = ["CodeTracking", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "f6f7d30fb0d61c64d0cfe56cf085a7c9e7d5bc80" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.8.0" +weakdeps = ["Distributed"] + + [deps.Revise.extensions] + DistributedExt = "Distributed" + [[deps.Rmath]] deps = ["Random", "Rmath_jll"] git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" diff --git a/examples/Project.toml b/examples/Project.toml index 940855b..a010312 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -14,6 +14,7 @@ OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d" OrdinaryDiffEqSDIRK = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SummationByPartsOperators = "9f78cca6-572e-554e-b819-917d2f1cf240" Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" diff --git a/examples/trixi_fvm_lid_driven.jl b/examples/trixi_fvm_lid_driven.jl new file mode 100644 index 0000000..2f9ba74 --- /dev/null +++ b/examples/trixi_fvm_lid_driven.jl @@ -0,0 +1,83 @@ +using OrdinaryDiffEqLowStorageRK +using Trixi +using Implicit +############################################################################### +# semidiscretization of the ideal compressible Navier-Stokes equations + +prandtl_number() = 0.72 +mu = 0.001 + +equations = CompressibleEulerEquations2D(1.4) +equations_parabolic = CompressibleNavierStokesDiffusion2D(equations, mu = mu, + Prandtl = prandtl_number()) + +# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux +solver = DGSEM(polydeg = 0, surface_flux = flux_lax_friedrichs) + +coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y)) +coordinates_max = (1.0, 1.0) # maximum coordinates (max(x), max(y)) + +# Create a uniformly refined mesh +trees_per_dimension = (16, 16) +mesh = P4estMesh(trees_per_dimension, + polydeg = 0, initial_refinement_level = 0, + coordinates_min = coordinates_min, coordinates_max = coordinates_max, + periodicity = (false, false)) + +function initial_condition_cavity(x, t, equations::CompressibleEulerEquations2D) + Ma = 0.1 + rho = 1.0 + u, v = 0.0, 0.0 + p = 1.0 / (Ma^2 * equations.gamma) + return prim2cons(SVector(rho, u, v, p), equations) +end +initial_condition = initial_condition_cavity + +# BC types +velocity_bc_lid = NoSlip((x, t, equations_parabolic) -> SVector(1.0, 0.0)) +velocity_bc_cavity = NoSlip((x, t, equations_parabolic) -> SVector(0.0, 0.0)) +heat_bc = Adiabatic((x, t, equations_parabolic) -> 0.0) +boundary_condition_lid = BoundaryConditionNavierStokesWall(velocity_bc_lid, heat_bc) +boundary_condition_cavity = BoundaryConditionNavierStokesWall(velocity_bc_cavity, heat_bc) + +boundary_conditions = Dict(:x_neg => boundary_condition_slip_wall, + :y_neg => boundary_condition_slip_wall, + :y_pos => boundary_condition_slip_wall, + :x_pos => boundary_condition_slip_wall) + +boundary_conditions_parabolic = Dict(:x_neg => boundary_condition_cavity, + :y_neg => boundary_condition_cavity, + :y_pos => boundary_condition_lid, + :x_pos => boundary_condition_cavity) + +# A semidiscretization collects data structures and functions for the spatial discretization +semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic), + initial_condition, solver; + boundary_conditions = (boundary_conditions, + boundary_conditions_parabolic)) + +############################################################################### +# ODE solvers, callbacks etc. + +# Create ODE problem with time span `tspan` +tspan = (0.0, 25.0) +ode = semidiscretize(semi, tspan) + +summary_callback = SummaryCallback() +alive_callback = AliveCallback(alive_interval = 100) +analysis_interval = 100 +analysis_callback = AnalysisCallback(semi, interval = analysis_interval) +callbacks = CallbackSet(summary_callback, alive_callback) + +############################################################################### +# run the simulation + +sol = solve( + ode, + Implicit.RKLinearImplicitExplicitEuler(); + #Implicit.KS22(); + dt = 0.00001, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); diff --git a/examples/trixi_lid_driven_linear.jl b/examples/trixi_lid_driven_linear.jl index 6a0f55c..5327b5c 100644 --- a/examples/trixi_lid_driven_linear.jl +++ b/examples/trixi_lid_driven_linear.jl @@ -19,17 +19,18 @@ using CairoMakie @assert !Trixi._PREFERENCE_POLYESTER @assert !Trixi._PREFERENCE_LOOPVECTORIZATION -trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_lid_driven_cavity.jl"), sol = nothing); +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_navierstokes_lid_driven_cavity.jl"), sol = nothing, mu = 0.1); +ode = semidiscretize(semi, (0.0, 10.0)) ############################################################################### # run the simulation sol = solve( ode, - Implicit.RKLinearImplicitExplicitEuler(); + Implicit.RKLSSPIMEX332(); #Implicit.KS22(); - dt = 0.01, # solve needs some value here but it will be overwritten by the stepsize_callback + dt = 0.001, # solve needs some value here but it will be overwritten by the stepsize_callback ode_default_options()..., callback = callbacks, # verbose=1, krylov_algo = :gmres, diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl index 61df48a..5883307 100644 --- a/libs/Implicit/src/linear_imex.jl +++ b/libs/Implicit/src/linear_imex.jl @@ -2,8 +2,20 @@ abstract type SimpleLinearImplicitExplicitAlgorithm{N} end abstract type RKLIMEX{N} <: SimpleLinearImplicitExplicitAlgorithm{N} end + +struct IMEXRKButcher{T1<:AbstractArray,T2<:AbstractArray} <: RKTableau + a::T1 + b::T2 + c::T2 + ah::T1 + bh::T2 + ch::T2 +end + struct RKLinearImplicitExplicitEuler <: RKLIMEX{1} end +struct RKLSSPIMEX332 <: RKLIMEX{3} end + function mul!(out::AbstractVector, M::LMOperator, v::AbstractVector) # out = (I/dt - J(f,x,p)) * v mul!(out, M.J, v) @@ -11,7 +23,7 @@ function mul!(out::AbstractVector, M::LMOperator, v::AbstractVector) return nothing end -function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, stage, RK, M, lin_du_tmp, lin_du_tmp1, workspace) +function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, ustages, jstages, stage, RK, M, lin_du_tmp, lin_du_tmp1, workspace) if stage == 1 # Stage 1: ## f2 is the conservative part @@ -22,7 +34,7 @@ function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, f1!(du_tmp, uₙ, p, t + RK.c[stage] * Δt) res .= uₙ .+ RK.a[stage, stage] * Δt .* (du .+ du_tmp .- lin_du_tmp) - krylov_solve!(workspace, M, copy(res)) + krylov_solve!(workspace, M, copy(res)) @. u = workspace.x # f2!(du, workspace.x, p, t + RK.c[stage] * Δt) # f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) @@ -31,6 +43,64 @@ function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, end end + +function (::RKLIMEX{3})(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, ustages, jstages, stage, RK, M, lin_du_tmp, lin_du_tmp1, workspace) + F!(du, u, p) = f1!(du, u, p, t) ## parabolic + if stage == 1 + # Stage 1: + ## f2 is the conservative part + ## f1 is the parabolic part + J = JacobianOperator(F!, du, uₙ, p) + M = LMOperator(J, RK.ah[stage,stage] * Δt) + krylov_solve!(workspace, M, copy(uₙ)) + @. u = workspace.x + J = JacobianOperator(F!, du, u, p) + mul!(jstages[stage], J, u) + + f2!(du, workspace.x, p, t + RK.c[stage] * Δt) + f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) + stages[stage] .= du .+ du_tmp - jstages[stage] + ustages[stage] .= u +# @. u = uₙ + RK.b[1] * Δt * stages[1] + elseif stage == 2 + + J = JacobianOperator(F!, du, ustages[1], p) + M = LMOperator(J, RK.ah[stage,stage] * Δt) + mul!(lin_du_tmp, M.J, uₙ) +# mul!(lin_du_tmp1, J, u) + res .= uₙ + RK.a[stage,1] * Δt * stages[1] - Δt * RK.ah[stage,1] * jstages[1] + + krylov_solve!(workspace, M, copy(res)) + @. u = workspace.x + J = JacobianOperator(F!, du, u, p) + mul!(jstages[stage], J, u) + f2!(du, workspace.x, p, t + RK.c[stage] * Δt) + f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) + stages[stage] .= du .+ du_tmp - jstages[stage] + ustages[stage] .= u + + elseif stage == 3 + + J = JacobianOperator(F!, du, ustages[2], p) + M = LMOperator(J, RK.ah[stage,stage] * Δt) + mul!(lin_du_tmp, M.J, uₙ) +# mul!(lin_du_tmp1, J, u) + res .= uₙ + RK.a[stage,1] * Δt * stages[1] + RK.a[stage,2] * Δt * stages[2] - Δt * RK.ah[stage,1] * jstages[1] - Δt * RK.ah[stage,2] * jstages[2] + krylov_solve!(workspace, M, copy(res)) + @. u = workspace.x + J = JacobianOperator(F!, du, u, p) + mul!(jstages[stage], J, u) + f2!(du, workspace.x, p, t + RK.c[stage] * Δt) + f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) + stages[stage] .= du .+ du_tmp - jstages[stage] + ustages[stage] .= u + + @. u = uₙ + RK.b[1] * Δt * stages[1] + RK.b[2] * Δt * stages[2] + RK.b[3] * Δt * stages[3] - RK.bh[1] * Δt * jstages[1] - RK.bh[2] * Δt * jstages[2] - RK.bh[3] * Δt * jstages[3] + + + end +end + stages(::SimpleLinearImplicitExplicitAlgorithm{N}) where {N} = N function nonlinear_problem(alg::SimpleLinearImplicitExplicitAlgorithm, f2::F2) where {F2} @@ -48,6 +118,45 @@ mutable struct SimpleLinearImplicitExplicitOptions{Callback} krylov_kwargs::Any end +function RKTableau(alg::RKLSSPIMEX332) +return RKLSSPIMEX332Tableau() +end + +function RKLSSPIMEX332Tableau() + + nstage = 3 + a = zeros(Float64, nstage, nstage) + a[2, 1] = 0.5 + a[3, 1] = 0.5 + a[3, 2] = 0.5 + + b = zeros(Float64, nstage) + b[1] = 1/3 + b[2] = 1/3 + b[3] = 1/3 + + c = zeros(Float64, nstage) + c[2] = 0.5 + c[3] = 1.0 + ah = zeros(Float64, nstage, nstage) + ah[1, 1] = 1/4 + ah[2, 2] = 1/4 + ah[3, 1] = 1/3 + ah[3, 2] = 1/3 + ah[3, 3] = 1/3 + + bh = zeros(Float64, nstage) + bh[1] = 1/3 + bh[2] = 1/3 + bh[3] = 1/3 + + ch = zeros(Float64, nstage) + ch[1] = 1/4 + ch[2] = 1/4 + ch[3] = 1.0 + return IMEXRKButcher(a, b, c, ah, bh, ch) +end + function RKTableau(alg::RKLinearImplicitExplicitEuler) return LinearImplicitExplicitEulerTableau() end @@ -88,6 +197,8 @@ mutable struct SimpleLinearImplicitExplicit{ lin_du_tmp1::uType u_tmp::uType stages::NTuple{M,uType} + ustages::NTuple{M,uType} + jstages::NTuple{M,uType} res::uType t::RealT dt::RealT # current time step @@ -122,10 +233,12 @@ function init( res = zero(u) u_tmp = similar(u) stages = ntuple(_ -> similar(u), Val(N)) + ustages = ntuple(_ -> similar(u), Val(N)) + jstages = ntuple(_ -> similar(u), Val(N)) t = first(ode.tspan) iter = 0 integrator = SimpleLinearImplicitExplicit( - u, du, copy(du),copy(du), copy(du), u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + u, du, copy(du),copy(du), copy(du), u_tmp,stages, ustages, jstages, res, t, dt, zero(dt), iter, ode.p, (prob=ode,), ode.f.f1, ode.f.f1, ode.f.f2, alg, SimpleLinearImplicitExplicitOptions( callback, ode.tspan; @@ -225,13 +338,13 @@ end function stage!(integrator, alg::RKLIMEX) F!(du, u, p) = integrator.f1(du, u, p, integrator.t) ## parabolic J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) - M = LMOperator(J, integrator.dt) + M = LMOperator(J, integrator.dt) kc = KrylovConstructor(integrator.res) - workspace = krylov_workspace(:gmres, kc) + workspace = krylov_workspace(:gmres, kc) for stage in 1:stages(alg) # Store the solution for each stage in stages ## For a split Problem we need to compute rhs_conservative and rhs_parabolic - alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, integrator.RK, M, integrator.lin_du_tmp, integrator.lin_du_tmp1, workspace) + alg(integrator.res, integrator.u, integrator.dt, integrator.f1, integrator.f2, integrator.du, integrator.du_tmp, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, integrator.ustages, integrator.jstages, stage, integrator.RK, M, integrator.lin_du_tmp, integrator.lin_du_tmp1, workspace) end end From edcafb5752a48c62d5bb311df34ed288ec0e7f68 Mon Sep 17 00:00:00 2001 From: Marco Artiano Date: Wed, 23 Jul 2025 12:30:25 +0200 Subject: [PATCH 21/21] add rtol and atol to krylov_solve! --- libs/Implicit/src/linear_imex.jl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libs/Implicit/src/linear_imex.jl b/libs/Implicit/src/linear_imex.jl index 5883307..e2aa144 100644 --- a/libs/Implicit/src/linear_imex.jl +++ b/libs/Implicit/src/linear_imex.jl @@ -34,7 +34,7 @@ function (::RKLinearImplicitExplicitEuler)(res, uₙ, Δt, f1!, f2!, du, du_tmp, f1!(du_tmp, uₙ, p, t + RK.c[stage] * Δt) res .= uₙ .+ RK.a[stage, stage] * Δt .* (du .+ du_tmp .- lin_du_tmp) - krylov_solve!(workspace, M, copy(res)) + krylov_solve!(workspace, M, res, atol = 1e-6, rtol = 1e-6) @. u = workspace.x # f2!(du, workspace.x, p, t + RK.c[stage] * Δt) # f1!(du_tmp, workspace.x, p, t + RK.c[stage] * Δt) @@ -52,7 +52,7 @@ function (::RKLIMEX{3})(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, u ## f1 is the parabolic part J = JacobianOperator(F!, du, uₙ, p) M = LMOperator(J, RK.ah[stage,stage] * Δt) - krylov_solve!(workspace, M, copy(uₙ)) + krylov_solve!(workspace, M, uₙ, atol = 1e-6, rtol = 1e-6) @. u = workspace.x J = JacobianOperator(F!, du, u, p) mul!(jstages[stage], J, u) @@ -70,7 +70,7 @@ function (::RKLIMEX{3})(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, u # mul!(lin_du_tmp1, J, u) res .= uₙ + RK.a[stage,1] * Δt * stages[1] - Δt * RK.ah[stage,1] * jstages[1] - krylov_solve!(workspace, M, copy(res)) + krylov_solve!(workspace, M, res, atol = 1e-6, rtol = 1e-6) @. u = workspace.x J = JacobianOperator(F!, du, u, p) mul!(jstages[stage], J, u) @@ -86,7 +86,7 @@ function (::RKLIMEX{3})(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, u mul!(lin_du_tmp, M.J, uₙ) # mul!(lin_du_tmp1, J, u) res .= uₙ + RK.a[stage,1] * Δt * stages[1] + RK.a[stage,2] * Δt * stages[2] - Δt * RK.ah[stage,1] * jstages[1] - Δt * RK.ah[stage,2] * jstages[2] - krylov_solve!(workspace, M, copy(res)) + krylov_solve!(workspace, M, res, atol = 1e-6, rtol = 1e-6) @. u = workspace.x J = JacobianOperator(F!, du, u, p) mul!(jstages[stage], J, u) @@ -96,8 +96,6 @@ function (::RKLIMEX{3})(res, uₙ, Δt, f1!, f2!, du, du_tmp, u, p, t, stages, u ustages[stage] .= u @. u = uₙ + RK.b[1] * Δt * stages[1] + RK.b[2] * Δt * stages[2] + RK.b[3] * Δt * stages[3] - RK.bh[1] * Δt * jstages[1] - RK.bh[2] * Δt * jstages[2] - RK.bh[3] * Δt * jstages[3] - - end end

YaNj?0I2_j>3+Z=!nUqq+?!b3I5N) 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≠V@tdn5n@c;i8d4OLU literal 0 HcmV?d00001 diff --git a/out/solution_000001000.h5 b/out/solution_000001000.h5 new file mode 100644 index 0000000000000000000000000000000000000000..15c26a49bcd64a233121e4d5ff877e539d8a419a GIT binary patch literal 34816 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 QZ;$-{4#@w1TfqPSU!le|e*gdg literal 0 HcmV?d00001 From d0805cab82c01f072aeb62638562b2f5b9f33999 Mon Sep 17 00:00:00 2001 From: MarcoArtiano Date: Thu, 26 Jun 2025 14:48:45 +0200 Subject: [PATCH 06/21] some cleanup --- examples/trixi_rosenbrock.jl | 58 +++++------------------------------- 1 file changed, 7 insertions(+), 51 deletions(-) diff --git a/examples/trixi_rosenbrock.jl b/examples/trixi_rosenbrock.jl index 57be235..772cae3 100644 --- a/examples/trixi_rosenbrock.jl +++ b/examples/trixi_rosenbrock.jl @@ -19,59 +19,15 @@ using CairoMakie @assert !Trixi._PREFERENCE_POLYESTER @assert !Trixi._PREFERENCE_LOOPVECTORIZATION -using OrdinaryDiffEq -using Trixi - -############################################################################### -# semidiscretization of the linear advection equation - -advection_velocity = (0.2, -0.7) -equations = LinearScalarAdvectionEquation2D(advection_velocity) - -# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux -solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) - -coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y)) -coordinates_max = (1.0, 1.0) # maximum coordinates (max(x), max(y)) - -# Create a uniformly refined mesh with periodic boundaries -mesh = TreeMesh(coordinates_min, coordinates_max, - initial_refinement_level = 4, - n_cells_max = 30_000) # set maximum capacity of tree data structure - -# A semidiscretization collects data structures and functions for the spatial discretization -semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, - solver) - -############################################################################### -# ODE solvers, callbacks etc. - -# Create ODE problem with time span from 0.0 to 1.0 -ode = semidiscretize(semi, (0.0, 1.0)) - -# At the beginning of the main loop, the SummaryCallback prints a summary of the simulation setup -# and resets the timers -summary_callback = SummaryCallback() - -# The AnalysisCallback allows to analyse the solution in regular intervals and prints the results -analysis_callback = AnalysisCallback(semi, interval = 100) - -# The SaveSolutionCallback allows to save the solution to a file in regular intervals -save_solution = SaveSolutionCallback(interval = 100, - solution_variables = cons2prim) - -# The StepsizeCallback handles the re-calculation of the maximum Δt after each time step - -# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver -callbacks = CallbackSet(summary_callback, analysis_callback, save_solution) +trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_advection_basic.jl"), cfl = 10.0, sol = nothing); ############################################################################### # run the simulation sol = solve( - ode, Implicit.Rosenbrock(); - dt = 0.01, # solve needs some value here but it will be overwritten by the stepsize_callback - ode_default_options()..., callback = callbacks, - # verbose=1, - krylov_algo = :gmres, -); \ No newline at end of file + ode, Implicit.Rosenbrock(); + dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback + ode_default_options()..., callback = callbacks, + # verbose=1, + krylov_algo = :gmres, +); From f8ea589b848db393ac7a87c18a20d0758d022f6d Mon Sep 17 00:00:00 2001 From: MarcoArtiano Date: Thu, 26 Jun 2025 14:50:31 +0200 Subject: [PATCH 07/21] some more cleanup --- examples/carpenter.jl | 54 --- examples/out/mesh.h5 | Bin 36832 -> 0 bytes examples/out/solution_000000000.h5 | Bin 34816 -> 0 bytes examples/out/solution_000000018.h5 | Bin 34816 -> 0 bytes libs/Implicit/src/Implicit.jl | 590 +++++++++++++++-------------- out/mesh.h5 | Bin 36832 -> 0 bytes out/solution_000000000.h5 | Bin 34816 -> 0 bytes out/solution_000000001.h5 | Bin 34816 -> 0 bytes out/solution_000000002.h5 | Bin 34816 -> 0 bytes out/solution_000000003.h5 | Bin 34816 -> 0 bytes out/solution_000000004.h5 | Bin 34816 -> 0 bytes out/solution_000000005.h5 | Bin 34816 -> 0 bytes out/solution_000000006.h5 | Bin 34816 -> 0 bytes out/solution_000000007.h5 | Bin 34816 -> 0 bytes out/solution_000000008.h5 | Bin 34816 -> 0 bytes out/solution_000000009.h5 | Bin 34816 -> 0 bytes out/solution_000000010.h5 | Bin 34816 -> 0 bytes out/solution_000000018.h5 | Bin 34816 -> 0 bytes out/solution_000000022.h5 | Bin 34816 -> 0 bytes out/solution_000000040.h5 | Bin 34816 -> 0 bytes out/solution_000000100.h5 | Bin 34816 -> 0 bytes out/solution_000000200.h5 | Bin 34816 -> 0 bytes out/solution_000000300.h5 | Bin 34816 -> 0 bytes out/solution_000000400.h5 | Bin 34816 -> 0 bytes out/solution_000000500.h5 | Bin 34816 -> 0 bytes out/solution_000000600.h5 | Bin 34816 -> 0 bytes out/solution_000000700.h5 | Bin 34816 -> 0 bytes out/solution_000000800.h5 | Bin 34816 -> 0 bytes out/solution_000000900.h5 | Bin 34816 -> 0 bytes out/solution_000001000.h5 | Bin 34816 -> 0 bytes 30 files changed, 296 insertions(+), 348 deletions(-) delete mode 100644 examples/carpenter.jl delete mode 100644 examples/out/mesh.h5 delete mode 100644 examples/out/solution_000000000.h5 delete mode 100644 examples/out/solution_000000018.h5 delete mode 100644 out/mesh.h5 delete mode 100644 out/solution_000000000.h5 delete mode 100644 out/solution_000000001.h5 delete mode 100644 out/solution_000000002.h5 delete mode 100644 out/solution_000000003.h5 delete mode 100644 out/solution_000000004.h5 delete mode 100644 out/solution_000000005.h5 delete mode 100644 out/solution_000000006.h5 delete mode 100644 out/solution_000000007.h5 delete mode 100644 out/solution_000000008.h5 delete mode 100644 out/solution_000000009.h5 delete mode 100644 out/solution_000000010.h5 delete mode 100644 out/solution_000000018.h5 delete mode 100644 out/solution_000000022.h5 delete mode 100644 out/solution_000000040.h5 delete mode 100644 out/solution_000000100.h5 delete mode 100644 out/solution_000000200.h5 delete mode 100644 out/solution_000000300.h5 delete mode 100644 out/solution_000000400.h5 delete mode 100644 out/solution_000000500.h5 delete mode 100644 out/solution_000000600.h5 delete mode 100644 out/solution_000000700.h5 delete mode 100644 out/solution_000000800.h5 delete mode 100644 out/solution_000000900.h5 delete mode 100644 out/solution_000001000.h5 diff --git a/examples/carpenter.jl b/examples/carpenter.jl deleted file mode 100644 index a575df6..0000000 --- a/examples/carpenter.jl +++ /dev/null @@ -1,54 +0,0 @@ -using OrdinaryDiffEq -using Trixi - -############################################################################### -# semidiscretization of the linear advection equation - -advection_velocity = (0.2, -0.7) -equations = LinearScalarAdvectionEquation2D(advection_velocity) - -# Create DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux -solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) - -coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y)) -coordinates_max = (1.0, 1.0) # maximum coordinates (max(x), max(y)) - -# Create a uniformly refined mesh with periodic boundaries -mesh = TreeMesh(coordinates_min, coordinates_max, - initial_refinement_level = 4, - n_cells_max = 30_000) # set maximum capacity of tree data structure - -# A semidiscretization collects data structures and functions for the spatial discretization -semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, - solver) - -############################################################################### -# ODE solvers, callbacks etc. - -# Create ODE problem with time span from 0.0 to 1.0 -ode = semidiscretize(semi, (0.0, 1.0)) - -# At the beginning of the main loop, the SummaryCallback prints a summary of the simulation setup -# and resets the timers -summary_callback = SummaryCallback() - -# The AnalysisCallback allows to analyse the solution in regular intervals and prints the results -analysis_callback = AnalysisCallback(semi, interval = 1) - -# The SaveSolutionCallback allows to save the solution to a file in regular intervals -save_solution = SaveSolutionCallback(interval = 100, - solution_variables = cons2prim) - -# The StepsizeCallback handles the re-calculation of the maximum Δt after each time step -stepsize_callback = StepsizeCallback(cfl = 1.6) - -# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver -callbacks = CallbackSet(summary_callback, analysis_callback, save_solution) - -############################################################################### -# run the simulation - -# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks -sol = solve(ode, RK4(); - dt = 0.01, # solve needs some value here but it will be overwritten by the stepsize_callback - ode_default_options()..., callback = callbacks, adaptive = false); \ No newline at end of file diff --git a/examples/out/mesh.h5 b/examples/out/mesh.h5 deleted file mode 100644 index 73de286ae3f89e0bd016fac85c02cc3a14145f10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36832 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 ECk3#R0RR91 diff --git a/examples/out/solution_000000000.h5 b/examples/out/solution_000000000.h5 deleted file mode 100644 index 1a7d08663e4f8983bd7098c866c9963be0cef186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 JB}o3i{{eV?n`8h0 diff --git a/libs/Implicit/src/Implicit.jl b/libs/Implicit/src/Implicit.jl index 7ae6266..15ffcc2 100644 --- a/libs/Implicit/src/Implicit.jl +++ b/libs/Implicit/src/Implicit.jl @@ -1,14 +1,14 @@ module Implicit using UnPack -import Ariadne +using Ariadne: Ariadne using LinearAlgebra import Ariadne: JacobianOperator, MOperator using Krylov struct MOperator{JOp} - J::JOp - dt::Float64 + J::JOp + dt::Float64 end Base.size(M::MOperator) = size(M.J) @@ -17,56 +17,56 @@ Base.length(M::MOperator) = length(M.J) import LinearAlgebra: mul! function mul!(out::AbstractVector, M::MOperator, v::AbstractVector) - # out = (I/dt - J(f,x,p)) * v - mul!(out, M.J, v) - @. out = v / M.dt - out - return nothing + # out = (I/dt - J(f,x,p)) * v + mul!(out, M.J, v) + @. out = v / M.dt - out + return nothing end # Wrapper type for solutions from Implicit.jl's own time integrators, partially mimicking # SciMLBase.ODESolution struct TimeIntegratorSolution{tType, uType, P} - t::tType - u::uType - prob::P + t::tType + u::uType + prob::P end # Abstract supertype of Implict.jl's own time integrators for dispatch abstract type AbstractTimeIntegrator end -import DiffEqBase +using DiffEqBase: DiffEqBase import DiffEqBase: solve, CallbackSet, ODEProblem export solve, ODEProblem # Interface required by DiffEqCallbacks.jl function DiffEqBase.get_tstops(integrator::AbstractTimeIntegrator) - return integrator.opts.tstops + return integrator.opts.tstops end function DiffEqBase.get_tstops_array(integrator::AbstractTimeIntegrator) - return get_tstops(integrator).valtree + return get_tstops(integrator).valtree end function DiffEqBase.get_tstops_max(integrator::AbstractTimeIntegrator) - return maximum(get_tstops_array(integrator)) + return maximum(get_tstops_array(integrator)) end function finalize_callbacks(integrator::AbstractTimeIntegrator) - callbacks = integrator.opts.callback - - return if callbacks isa CallbackSet - foreach(callbacks.discrete_callbacks) do cb - cb.finalize(cb, integrator.u, integrator.t, integrator) - end - foreach(callbacks.continuous_callbacks) do cb - cb.finalize(cb, integrator.u, integrator.t, integrator) - end - end + callbacks = integrator.opts.callback + + return if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + cb.finalize(cb, integrator.u, integrator.t, integrator) + end + foreach(callbacks.continuous_callbacks) do cb + cb.finalize(cb, integrator.u, integrator.t, integrator) + end + end end import SciMLBase: get_du, get_tmp_cache, u_modified!, - init, step!, check_error, - get_proposed_dt, set_proposed_dt!, - terminate!, remake, add_tstop!, has_tstop, first_tstop + init, step!, check_error, + get_proposed_dt, set_proposed_dt!, + terminate!, remake, add_tstop!, has_tstop, first_tstop # Abstract base type for time integration schemes @@ -78,39 +78,39 @@ stages(::SimpleImplicitAlgorithm{N}) where {N} = N struct ImplicitEuler <: NonDirect{1} end function (::ImplicitEuler)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - f!(du, u, p, t + Δt) # t = t0 + c_1 * Δt + f!(du, u, p, t + Δt) # t = t0 + c_1 * Δt - res .= uₙ .+ Δt .* du .- u # Δt * a_11 - return nothing + res .= uₙ .+ Δt .* du .- u # Δt * a_11 + return nothing end struct ImplicitMidpoint <: SimpleImplicitAlgorithm{1} end function (::ImplicitMidpoint)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - # Evaluate f at midpoint: f((uₙ + u)/2, t + Δt/2) - # Use res for a temporary allocation (uₙ .+ u) ./ 2 - uuₙ = res - uuₙ .= 0.5 .* (uₙ .+ u) - f!(du, uuₙ, p, t + 0.5 * Δt) - - res .= uₙ .+ Δt .* du .- u - return nothing + # Evaluate f at midpoint: f((uₙ + u)/2, t + Δt/2) + # Use res for a temporary allocation (uₙ .+ u) ./ 2 + uuₙ = res + uuₙ .= 0.5 .* (uₙ .+ u) + f!(du, uuₙ, p, t + 0.5 * Δt) + + res .= uₙ .+ Δt .* du .- u + return nothing end struct ImplicitTrapezoid <: SimpleImplicitAlgorithm{1} end function (::ImplicitTrapezoid)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - # Need to evaluate f at both endpoints - # f(uₙ, t) and f(u, t + Δt) - # Use res as the temporary for duₙ = f(uₙ, t) - duₙ = res - f!(duₙ, uₙ, p, t) - f!(du, u, p, t + Δt) - - res .= uₙ .+ (Δt / 2) .* (duₙ .+ du) .- u - return nothing + # Need to evaluate f at both endpoints + # f(uₙ, t) and f(u, t + Δt) + # Use res as the temporary for duₙ = f(uₙ, t) + duₙ = res + f!(duₙ, uₙ, p, t) + f!(du, u, p, t + Δt) + + res .= uₙ .+ (Δt / 2) .* (duₙ .+ du) .- u + return nothing end """ - TRBDF2 + TRBDF2 TR-BDF2 based solver after [Bank1985-gh](@cite). Using the formula given in [Bonaventura2021-za](@cite) eq (1). @@ -118,135 +118,129 @@ See [Hosea1996-xv](@cite) for how it relates to implicit RK methods """ struct TRBDF2 <: SimpleImplicitAlgorithm{2} end function (::TRBDF2)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - γ = 2 - √2 - return if stage == 1 - # Stage 1: Trapezoidal rule to t + γΔt - # u here is u₁ candidate - duₙ = res - f!(duₙ, uₙ, p, t) - f!(du, u, p, t + γ * Δt) - - res .= uₙ .+ ((γ / 2) * Δt) .* (duₙ .+ du) .- u - else - # Stage 2: BDF2 from t + γΔt to t + Δt - # Note these are unequal timestep - f!(du, u, p, t + Δt) - - u₁ = stages[1] - - # Bank1985 defines in eq 32 - # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ - # Manual derivation (devision by (2-γ) and then move everything to one side.) - # a₁ = -((1 - γ)^2) / (γ * (2 - γ)) - # a₂ = 1 / (γ * (2 - γ)) - # a₃ = - (1 - γ) / (2 - γ) - # res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u - - # after Bonaventura2021 - # They define the second stage as: - # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ - # Which differs from Bank1985 - # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ - # In the sign of u - γ₂ * Δt - # a₁ == (1-γ₃) - # a₂ == γ₃ - # a₃ == -γ₂ - γ₂ = (1 - γ) / (2 - γ) - γ₃ = 1 / (γ * (2 - γ)) - - res .= (1 - γ₃) .* uₙ .+ γ₃ .* u₁ + (γ₂ * Δt) .* du .- u - end + γ = 2 - √2 + return if stage == 1 + # Stage 1: Trapezoidal rule to t + γΔt + # u here is u₁ candidate + duₙ = res + f!(duₙ, uₙ, p, t) + f!(du, u, p, t + γ * Δt) + + res .= uₙ .+ ((γ / 2) * Δt) .* (duₙ .+ du) .- u + else + # Stage 2: BDF2 from t + γΔt to t + Δt + # Note these are unequal timestep + f!(du, u, p, t + Δt) + + u₁ = stages[1] + + # Bank1985 defines in eq 32 + # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ + # Manual derivation (devision by (2-γ) and then move everything to one side.) + # a₁ = -((1 - γ)^2) / (γ * (2 - γ)) + # a₂ = 1 / (γ * (2 - γ)) + # a₃ = - (1 - γ) / (2 - γ) + # res .= a₁ .* uₙ .+ a₂ .* u₁ .+ a₃ .* Δt .* du .- u + + # after Bonaventura2021 + # They define the second stage as: + # u - γ₂ * Δt * f(u, t+Δt) = (1-γ₃)uₙ + γ₃u₁ + # Which differs from Bank1985 + # (2-γ)u + (1-γ)Δt * f(u, t+Δt) = 1/γ * u₁ - 1/γ * (1-γ)^2 * uₙ + # In the sign of u - γ₂ * Δt + # a₁ == (1-γ₃) + # a₂ == γ₃ + # a₃ == -γ₂ + γ₂ = (1 - γ) / (2 - γ) + γ₃ = 1 / (γ * (2 - γ)) + + res .= (1 - γ₃) .* uₙ .+ γ₃ .* u₁ + (γ₂ * Δt) .* du .- u + end end struct Rosenbrock <: Direct{3} end -function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage) - invdt = inv(Δt) - alpha, c, m, _ = RosenbrockTableau() - @. u = uₙ - @. res = 0 - for j in 1:stage-1 - @. u = u + alpha[stage, j] * stages[j] - @. res = res + c[stage, j] * stages[j] * invdt - end - - ## IT DOES NOT WORK FOR NON-AUTONOMOUS SYSTEMS, THUS T + DT IS USELESS IN THE RHS CALL. - f!(du, u, p, t + Δt) - F!(du, uₙ, p) = f!(du, uₙ, p, t) - - J = JacobianOperator(F!, du, u, p) - M = MOperator(J, Δt) - kc = KrylovConstructor(res) - workspace = krylov_workspace(:gmres, kc) - krylov_solve!(workspace, M, copy(du .+ res)) - stages[stage] .= workspace.x - - if stage == 3 - @. u = uₙ - for j in 1:stage - @. u = u + m[j] * stages[j] - end - end +function (::Rosenbrock)(res, uₙ, Δt, f!, du, u, p, t, stages, stage, workspace, M) + invdt = inv(Δt) + alpha, c, m, _ = RosenbrockTableau() + @. u = uₙ + @. res = 0 + for j in 1:(stage-1) + @. u = u + alpha[stage, j] * stages[j] + @. res = res + c[stage, j] * stages[j] * invdt + end -end + ## It does not work for non-autonomous systems. + f!(du, u, p, t + Δt) - function RosenbrockTableau() + krylov_solve!(workspace, M, copy(du .+ res)) + stages[stage] .= workspace.x - # SSP - Knoth + if stage == 3 + @. u = uₙ + for j in 1:stage + @. u = u + m[j] * stages[j] + end + end - nstage = 3 - alpha = zeros(Float64, nstage, nstage) - alpha[2, 1] = 1 - alpha[3, 1] = 1 / 4 - alpha[3, 2] = 1 / 4 +end - b = zeros(Float64, nstage) - b[1] = 1 / 6 - b[2] = 1 / 6 - b[3] = 2 / 3 +function RosenbrockTableau() - gamma = zeros(Float64, nstage, nstage) - gamma[1, 1] = 1 - gamma[2, 2] = 1 - gamma[3, 1] = -3 / 4 - gamma[3, 2] = -3 / 4 - gamma[3, 3] = 1 + # SSP - Knoth + nstage = 3 + alpha = zeros(Float64, nstage, nstage) + alpha[2, 1] = 1 + alpha[3, 1] = 1 / 4 + alpha[3, 2] = 1 / 4 - a = alpha * inv(gamma) - m = transpose(b) * inv(gamma) - c = diagm(inv.(diag(gamma))) - inv(gamma) + b = zeros(Float64, nstage) + b[1] = 1 / 6 + b[2] = 1 / 6 + b[3] = 2 / 3 - return a, c, m, nstage # alpha, c, m + gamma = zeros(Float64, nstage, nstage) + gamma[1, 1] = 1 + gamma[2, 2] = 1 + gamma[3, 1] = -3 / 4 + gamma[3, 2] = -3 / 4 + gamma[3, 3] = 1 - end + a = alpha * inv(gamma) + m = transpose(b) * inv(gamma) + c = diagm(inv.(diag(gamma))) - inv(gamma) + + return a, c, m, nstage # alpha, c, m + +end function nonlinear_problem(alg::SimpleImplicitAlgorithm, f::F) where {F} - return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) + return (res, u, (uₙ, Δt, du, p, t, stages, stage)) -> alg(res, uₙ, Δt, f, du, u, p, t, stages, stage) end # This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L1 mutable struct SimpleImplicitOptions{Callback} - callback::Callback # callbacks; used in Trixi.jl - adaptive::Bool # whether the algorithm is adaptive; ignored - dtmax::Float64 # ignored - maxiters::Int # maximal number of time steps - tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored - verbose::Int - algo::Symbol - krylov_kwargs::Any + callback::Callback # callbacks; used in Trixi.jl + adaptive::Bool # whether the algorithm is adaptive; ignored + dtmax::Float64 # ignored + maxiters::Int # maximal number of time steps + tstops::Vector{Float64} # tstops from https://diffeq.sciml.ai/v6.8/basics/common_solver_opts/#Output-Control-1; ignored + verbose::Int + algo::Symbol + krylov_kwargs::Any end function SimpleImplicitOptions(callback, tspan; maxiters = typemax(Int), verbose = 0, krylov_algo = :gmres, krylov_kwargs = (;), kwargs...) - return SimpleImplicitOptions{typeof(callback)}( - callback, false, Inf, maxiters, - [last(tspan)], - verbose, - krylov_algo, - krylov_kwargs - ) + return SimpleImplicitOptions{typeof(callback)}( + callback, false, Inf, maxiters, + [last(tspan)], + verbose, + krylov_algo, + krylov_kwargs, + ) end # This struct is needed to fake https://github.com/SciML/OrdinaryDiffEq.jl/blob/0c2048a502101647ac35faabd80da8a5645beac7/src/integrators/type.jl#L77 @@ -254,163 +248,171 @@ end # https://diffeq.sciml.ai/v6.8/basics/integrator/#Handing-Integrators-1 # which are used in Trixi.jl. mutable struct SimpleImplicit{ - RealT <: Real, uType, Params, Sol, F, M, Alg <: SimpleImplicitAlgorithm, - SimpleImplicitOptions, - } <: AbstractTimeIntegrator - u::uType - du::uType - u_tmp::uType - stages::NTuple{M, uType} - res::uType - t::RealT - dt::RealT # current time step - dtcache::RealT # ignored - iter::Int # current number of time steps (iteration) - p::Params # will be the semidiscretization from Trixi.jl - sol::Sol # faked - f::F # `rhs!` of the semidiscretization - alg::Alg # SimpleImplicitAlgorithm - opts::SimpleImplicitOptions - finalstep::Bool # added for convenience + RealT <: Real, uType, Params, Sol, F, M, Alg <: SimpleImplicitAlgorithm, + SimpleImplicitOptions, +} <: AbstractTimeIntegrator + u::uType + du::uType + u_tmp::uType + stages::NTuple{M, uType} + res::uType + t::RealT + dt::RealT # current time step + dtcache::RealT # ignored + iter::Int # current number of time steps (iteration) + p::Params # will be the semidiscretization from Trixi.jl + sol::Sol # faked + f::F # `rhs!` of the semidiscretization + alg::Alg # SimpleImplicitAlgorithm + opts::SimpleImplicitOptions + finalstep::Bool # added for convenience end # Forward integrator.stats.naccept to integrator.iter (see GitHub PR#771) function Base.getproperty(integrator::SimpleImplicit, field::Symbol) - if field === :stats - return (naccept = getfield(integrator, :iter),) - end - # general fallback - return getfield(integrator, field) + if field === :stats + return (naccept = getfield(integrator, :iter),) + end + # general fallback + return getfield(integrator, field) end function init( - ode::ODEProblem, alg::SimpleImplicitAlgorithm{N}; - dt, callback::Union{CallbackSet, Nothing} = nothing, kwargs... - ) where {N} - u = copy(ode.u0) - du = zero(u) - res = zero(u) - u_tmp = similar(u) - stages = ntuple(_ -> similar(u), Val(N)) - t = first(ode.tspan) - iter = 0 - integrator = SimpleImplicit( - u, du, u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, - (prob = ode,), ode.f, alg, - SimpleImplicitOptions( - callback, ode.tspan; - kwargs... - ), false - ) - - # initialize callbacks - if callback isa CallbackSet - foreach(callback.continuous_callbacks) do cb - throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) - end - foreach(callback.discrete_callbacks) do cb - cb.initialize(cb, integrator.u, integrator.t, integrator) - end - end - - return integrator + ode::ODEProblem, alg::SimpleImplicitAlgorithm{N}; + dt, callback::Union{CallbackSet, Nothing} = nothing, kwargs..., +) where {N} + u = copy(ode.u0) + du = zero(u) + res = zero(u) + u_tmp = similar(u) + stages = ntuple(_ -> similar(u), Val(N)) + t = first(ode.tspan) + iter = 0 + integrator = SimpleImplicit( + u, du, u_tmp, stages, res, t, dt, zero(dt), iter, ode.p, + (prob = ode,), ode.f, alg, + SimpleImplicitOptions( + callback, ode.tspan; + kwargs..., + ), false, + ) + + # initialize callbacks + if callback isa CallbackSet + foreach(callback.continuous_callbacks) do cb + throw(ArgumentError("Continuous callbacks are unsupported with the implicit time integration methods.")) + end + foreach(callback.discrete_callbacks) do cb + cb.initialize(cb, integrator.u, integrator.t, integrator) + end + end + + return integrator end # Fakes `solve`: https://diffeq.sciml.ai/v6.8/basics/overview/#Solving-the-Problems-1 function solve( - ode::ODEProblem, alg::SimpleImplicitAlgorithm; - dt, callback = nothing, kwargs... - ) - integrator = init(ode, alg, dt = dt, callback = callback; kwargs...) + ode::ODEProblem, alg::SimpleImplicitAlgorithm; + dt, callback = nothing, kwargs..., +) + integrator = init(ode, alg, dt = dt, callback = callback; kwargs...) - # Start actual solve - return solve!(integrator) + # Start actual solve + return solve!(integrator) end function solve!(integrator::SimpleImplicit) - @unpack prob = integrator.sol + @unpack prob = integrator.sol - integrator.finalstep = false + integrator.finalstep = false - while !integrator.finalstep - step!(integrator) - end # "main loop" timer + while !integrator.finalstep + step!(integrator) + end # "main loop" timer - finalize_callbacks(integrator) + finalize_callbacks(integrator) - return TimeIntegratorSolution( - (first(prob.tspan), integrator.t), - (prob.u0, integrator.u), - integrator.sol.prob - ) + return TimeIntegratorSolution( + (first(prob.tspan), integrator.t), + (prob.u0, integrator.u), + integrator.sol.prob, + ) end -function stage!(integrator, alg::NonDirect, stage) - F! = nonlinear_problem(alg, integrator.f) - # TODO: Pass in `stages[1:(stage-1)]` or full tuple? - _, stats = Ariadne.newton_krylov!( - F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; - verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, - algo = integrator.opts.algo, tol_abs = 6.0e-6 - ) - @assert stats.solved - if stage < stages(alg) - # Store the solution for each stage in stages - integrator.stages[stage] .= integrator.u_tmp - end +function stage!(integrator, alg::NonDirect) + for stage in 1:stages(alg) + F! = nonlinear_problem(alg, integrator.f) + # TODO: Pass in `stages[1:(stage-1)]` or full tuple? + _, stats = Ariadne.newton_krylov!( + F!, integrator.u_tmp, (integrator.u, integrator.dt, integrator.du, integrator.p, integrator.t, integrator.stages, stage), integrator.res; + verbose = integrator.opts.verbose, krylov_kwargs = integrator.opts.krylov_kwargs, + algo = integrator.opts.algo, tol_abs = 6.0e-6, + ) + @assert stats.solved + if stage < stages(alg) + # Store the solution for each stage in stages + integrator.stages[stage] .= integrator.u_tmp + end + end end -function stage!(integrator, alg::Direct, stage) +function stage!(integrator, alg::Direct) - alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage) + F!(du, u, p) = integrator.f(du, u, p, integrator.t) + J = JacobianOperator(F!, integrator.du, integrator.u, integrator.p) + M = MOperator(J, integrator.dt) + kc = KrylovConstructor(integrator.res) + workspace = krylov_workspace(:gmres, kc) + for stage in 1:stages(alg) + alg(integrator.res, integrator.u, integrator.dt, integrator.f, integrator.du, integrator.u_tmp, integrator.p, integrator.t, integrator.stages, stage, workspace, M) + end end function step!(integrator::SimpleImplicit) - @unpack prob = integrator.sol - @unpack alg = integrator - t_end = last(prob.tspan) - callbacks = integrator.opts.callback - - @assert !integrator.finalstep - if isnan(integrator.dt) - error("time step size `dt` is NaN") - end - - # if the next iteration would push the simulation beyond the end time, set dt accordingly - if integrator.t + integrator.dt > t_end || - isapprox(integrator.t + integrator.dt, t_end) - integrator.dt = t_end - integrator.t - terminate!(integrator) - end - - # one time step - integrator.u_tmp .= integrator.u - for stage in 1:stages(alg) - stage!(integrator, alg, stage) - end - integrator.u .= integrator.u_tmp - - integrator.iter += 1 - integrator.t += integrator.dt - - begin - # handle callbacks - if callbacks isa CallbackSet - foreach(callbacks.discrete_callbacks) do cb - if cb.condition(integrator.u, integrator.t, integrator) - cb.affect!(integrator) - end - return nothing - end - end - end - - # respect maximum number of iterations - return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep - @warn "Interrupted. Larger maxiters is needed." - terminate!(integrator) - end + @unpack prob = integrator.sol + @unpack alg = integrator + t_end = last(prob.tspan) + callbacks = integrator.opts.callback + + @assert !integrator.finalstep + if isnan(integrator.dt) + error("time step size `dt` is NaN") + end + + # if the next iteration would push the simulation beyond the end time, set dt accordingly + if integrator.t + integrator.dt > t_end || + isapprox(integrator.t + integrator.dt, t_end) + integrator.dt = t_end - integrator.t + terminate!(integrator) + end + + # one time step + integrator.u_tmp .= integrator.u + stage!(integrator, alg) + + integrator.u .= integrator.u_tmp + + integrator.iter += 1 + integrator.t += integrator.dt + + begin + # handle callbacks + if callbacks isa CallbackSet + foreach(callbacks.discrete_callbacks) do cb + if cb.condition(integrator.u, integrator.t, integrator) + cb.affect!(integrator) + end + return nothing + end + end + end + + # respect maximum number of iterations + return if integrator.iter >= integrator.opts.maxiters && !integrator.finalstep + @warn "Interrupted. Larger maxiters is needed." + terminate!(integrator) + end end # get a cache where the RHS can be stored @@ -422,39 +424,39 @@ u_modified!(integrator::SimpleImplicit, ::Bool) = false # used by adaptive timestepping algorithms in DiffEq function set_proposed_dt!(integrator::SimpleImplicit, dt) - return integrator.dt = dt + return integrator.dt = dt end # Required e.g. for `glm_speed_callback` function get_proposed_dt(integrator::SimpleImplicit) - return integrator.dt + return integrator.dt end # stop the time integration function terminate!(integrator::SimpleImplicit) - integrator.finalstep = true - return empty!(integrator.opts.tstops) + integrator.finalstep = true + return empty!(integrator.opts.tstops) end # used for AMR function Base.resize!(integrator::SimpleImplicit, new_size) - resize!(integrator.u, new_size) - resize!(integrator.du, new_size) - return resize!(integrator.u_tmp, new_size) + resize!(integrator.u, new_size) + resize!(integrator.du, new_size) + return resize!(integrator.u_tmp, new_size) end ### Helper jacobian(G!, ode::ODEProblem, Δt) = jacobian(G!, ode.f, ode.u0, ode.p, Δt, first(ode.tspan)) function jacobian(G!, f!, uₙ, p, Δt, t) - u = copy(uₙ) - du = zero(uₙ) - res = zero(uₙ) + u = copy(uₙ) + du = zero(uₙ) + res = zero(uₙ) - F! = nonlinear_problem(G!, f!) + F! = nonlinear_problem(G!, f!) - J = Ariadne.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) - return collect(J) + J = Ariadne.JacobianOperator(F!, res, u, (uₙ, Δt, du, p, t)) + return collect(J) end end # module Implicit diff --git a/out/mesh.h5 b/out/mesh.h5 deleted file mode 100644 index ce8faf3151749df8a35c91e306faaadf8ea3bc33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36832 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 EKd3nYcK`qY diff --git a/out/solution_000000002.h5 b/out/solution_000000002.h5 deleted file mode 100644 index 28231467119422328e2c929288263a567a66efbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 S+cDg~+MV+^N7jn}_J0AW%4S&r diff --git a/out/solution_000000003.h5 b/out/solution_000000003.h5 deleted file mode 100644 index 36853cb1bbeb487ed84e3238b21b0d4d6b0dcaa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 E0GDjA!~g&Q diff --git a/out/solution_000000004.h5 b/out/solution_000000004.h5 deleted file mode 100644 index 33b0eca3dd4f44c508753df6956f59ff9a93106a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 G_WuCe90Aq< diff --git a/out/solution_000000005.h5 b/out/solution_000000005.h5 deleted file mode 100644 index 0f19b82e6389705db16aca5f9351007409604be4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 diff --git a/out/solution_000000006.h5 b/out/solution_000000006.h5 deleted file mode 100644 index ffadadff3e43ca08bfc8852c43eb43d97c8bd047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 diff --git a/out/solution_000000007.h5 b/out/solution_000000007.h5 deleted file mode 100644 index 38bd009ca544ed7aba0cd47c764cbc797bde13a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 K(JzkqtA7EU^yk+A diff --git a/out/solution_000000008.h5 b/out/solution_000000008.h5 deleted file mode 100644 index 16216d56036a946b30be416ff38f916f285509c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 zcmeGFcRUyT`}dFAWP}P05)HCxDXNzS4XKodj0UoInq-Agq3rCUl-1BOUfK#F5~8w+ zijtkLuY{qgR67u|I{j`MgNp2zWgp654h&=%mG&C5bRcz9Si zScLG8|NYPSzaK0ClfUx6{{O!ZIQZ{p)_*_$`!JRpY?Hsh$|A@@zc=&W?+g9=^XIWo z{(|MdkK3)kaU=c8e}DdeKmYr*|Nl?_KOTWi8?|;&2=@Jp1JA#oU;oRWfBzS`M*oZt z{_hw6FMj?nU!%At|B(OwTz(c6`~o`*7YjcN4-2cknU$Rji_pZ^HTk76{@0iC|N08~ zSvLLqJl=^9ocKI*r(=g)tsLxKSf&fHut-k)=70Yx=~~&FA9CJxd1|NOcC{cZj?@893s&fLY))b*sJIsV=hv;Q!=oz2a+P5dt5{*SNo z|NJ})E8EG>y`@iH_%Ez*Fd?F(M zVWaV*bM1eh|DV3>lb>(q`v38>WANFJ*8cCm=ak9#5ZA@k-0^=DWHMEV$jZV!`IY?p za#;UWOjg!^zc7&;`0?*&_KDx8-}#^ZM)Yx<^mm^4nT?GNe*n+FKaZXDUjSHGJn7^9 z`!Vg`FVhEa)iAc?XOYEkQT&jn_J=0oM=47GBH)jl_}K-?i4Xjj*OUMJfB(O1|I0D{ zbAtbVp8T^Z8~*z$=vTP@ifQ z<R}VZXw}T#{nnj~{nK=%ivM&n~-3ys^`qi#TwBE2A(oAt=?F^FK05_rN=%h7w0j5`>hhGZE0t0UX$eGG~C6o95bA) zFWAM<@6h?p!r8@m?-<7&nIl?cTRWFc;=|0M@L)b2ktbqBMylyjH*~~`tZq)ZNc{Oz zIE#oc=aCRh{NA)z4~XBf_tPEXf6n)gB>ssm^-o=5C3*QVn%B@%dc0z$4p|)2oPYu$*hjz5pA;TWSmI9 z1kuRcoNFnPKHT`e49DtmyfgKc+m-MT)*SR<>B3nqJiN%lop} zs8CT!{3ki$2MS*?CVu>u8}-DW6@1c#_{TC6+KJy4SaFT`LTV?~h;Pd(GMo5HC*_tC z|A|zOJ@M_&Mez}TXXFKS;=d^RNq)$tf_y^jU5M zW473j@dmMWh7Hf`ARqZA#(=si_p2`r48glKmqWd)85e~Yv-pJ1D9ZV0`FF>&sYOT5 zSWH=dj;BaqWcnfLWh_NXf2S`bzP!K!J>na31f>(-q2{v#@jJgH$q_$T^s6TE&s=mf zApVMt%MTL&N4Lu`@t1`32NK^VkRSY>GS5rI-*Tq^xAz2}uPSq#_}5Ow@(|x}bE_%w zyNuWOo|wy`rJ&34N$b~d#_o?T@A=k$XKZ~E`fPPuJ!4!yTj}7=6sGxxT6GWBc*cg3 z6prE>=?s;PhGB){xeWEE*8VlCzcSVhe0mqEQ^{DnSJr&`ab#d^%)Pfs2u zuM{X^`FZb;M#3<2=|<-z&yRL8TQBl#H5C2A*j36VP5Kua95*5TyA9t#|9B0DW2AqU z+23cRzsTJyIi&wLvDFHsf7EN9O{D*9#p(s5|Hfc{C(=L7_!BSb|4nbk8q!~B{`!}s z|BIkHW72>6li#hRzmAy0MbclA)o~ide~n4>PKy7_(!d)Of2S24eiZ*_XJSk#{^_cz zODX=lqV3L7{L?Ob&ZGDjc}Mn9{Qs`dyg>2i=laS;`Y$>&o=Wkrek+6cpAV~J-8m6| zgQ0cM-@e4ck>Wp+>@b)3>hcAX`6ql4`DZhcrNkdzG}nyyUI(I(fAT@vHpEvi?=&X9 z+pexL;`^>KME;o%uY>*$5o3|Wx4Nc2O8Qr-3qpTK`+eY_%U)wfd|mNb9i;#KMPiMl zzw%%W^xtAQ+)Vl(a-O9~`gdNvwTARJU{ByA{VUTpCz1ZbN=y&ZpGzpQg7lAwpAY?; z)nwvBCiH)i$&o?&msDyEk^WB;*wsk?upct(NdIX&s~U;#y&&o{@$=M!%PIfP@`+Rv zzm7R8*>r+0*?wAx_~B14@DqQA&8O4Ex2aiUPyD9*tZL#9&v|1_`4^W|u-|urzwsNMQMmB-&BmNc#$HJ&F9F?Lrr#d*vEwnV zOzHVI!+tJ{WyoG~kX>Eth+c?W`VdoZ`Sg=+w>lUciN$hxp+k&N@BH@A6mG5gt}g1t zw|R5qKKLT#VZ@I#(fL7q_dh+ieoXLN`raxMf0iaEAMpp;OZkZ}cI>wk@l8y_c!+P8 z$2Uy;;!1(*#6R|Z5cAH7cypKb9a@L$gMY$g7O^HPGUH!B(YU#?B*U4WX6E$jx4YPwdmz2SG#e_-KK)F0k5Q{>;kpS$^_{}PMbQPO`2n}ICp@4TUioAmeFTHqL`*?!W0eZynuU+Y-Ajr2G8{S*2ZUHN5B`imQxYm)x57V6O7<;4mH z>Ho?_4}2bV2k;-Bs!TyfJ#4l-g1K&dC zBlz!gt4~n=-M+fWmiV8&g~0!!uo(Ogn|s#~-&VY)o%dcF^WFiIr!ICQ%#%shuOjrv znMV_{yDyz)FUmT+dUlO;5#x5zs)EK3FBmFY)+=rQ_JXlapIKRBdvx$Gt z8j{L9Mw*#M{i}A(>1t&LZoJkL&)dap_lhay84(OdavtYW`c)eBnS6vaU4k6{c znH4j&6d$v65?^+2UlH-AA2k90uaLwy;rN2g z%FqjZ51u}K;wOo`?;^hT6qz@~pDR5KzKX)=P2!tbUdSeXj9cN!u9P8WtW@W+d?ogx z92OOhIuVYdoh+LdZwcTkiXP|wd@=YrW7K4;QoqPc25)v=!?c0tjOp&%>n-*@XC!Sr zRI%@26SKl%S>G({PG&`Z<-GHMI+<0k1d5(0bTj8mp1=CqdzzNLp6!6vyqQ|j9mBcp zCNs4(_}Gm5xMypH9P?MB{M+GB4E@a(azp2efBV=vp#Q*J@jAswH5lG4H`uLeNO*^{5zK52K^U|YeE0dXICTtrX>!wQ2e*tGlu>_ z_JN51mWCV9UnP5qD8>JPL>%HT{{AQ8FK<1gfZ}f?m3xfhzfJB9;-4}g4gIy*WH@FRS!Nmh_)Jd$5Z1zkTVGGU?C1!{HO@|5NzmC(?iO{rzu9f4&x#U!=c^ zB^UI+W#R_??;i~bC;e}3a~dT5zYQ*f{yj-U(0~4!MrYz1glqsmaee^!OC=m-h|gp? zfWIqs5c~zHI^dU|c5Wd4U~nV&J!gc#Um;#5N%8+LYPudIE%Wk^9IMba2EZ}AI_;+#8uQ{z+HT*`Z?pGM%U#7gHIW~ zMn`PkS1=hlHA+RwZ}S*Jp0<+FE$z&Zie@j>;V!1Cxze0zf?dqk^Rm56jxMG}!V{5% z98s;<)VJdcKFrk88R6I@@kC6^c)gc+wvL$AFTY%W;&%_8C?dY$Ws4x9fxU=z?oOMj7Hmc3pJW?7 z`-&K~v(0Y){r-rtnax~z{i=J6r=OqC7vR3hP`ezmBH6B!DWAQ`{*!$NbBQ?*->`BU z(^S!3^+8)RQ{vO+kK;CCS{l-?427PHXa!rYYjZj^UCVQqskh{)kXH2*w=VL3j^|Sw zsQ>#rqy+z8?C$Y~{9kwT>+j_M(lx*2$^WBk(s{`LqmAURkpJi0Y&%2#|3|k2{io=) zhj!%uf2`_t!YBOyUgoAW^8eo)t>xo}2@0dmY-;;DZi1^8h{(s2-2TJ2+ zkpJIMoeTf}Wcd#LpPf!OC-Ft)cDfPYx7wed_;DVKz+datokD!SaLZWYpKsiP{xi$m z8vRF%7E3en&qxR?ruzFi=mYAn-vLR~-%T&dQpo=+(w4}O|6WkHVWIwS^}?`t>i@2+ zdk_Cro_;Qu>hIC-p{uC>8|{rn|M&f3Eb4F7kE03XzY=HTR+0bztdTFI{!e2`2mE*C zieD>;e@An{4eCE$1$;&SF>V-&`k!%jEer8yxc0CS|E6g$>c6^GMmYKZmg-9y#BX1} zO_TU)ukNA#M+sjzMgFh(@ZBEb51DtP{y*L;g8KhEs2KIXbM1ck|EZ}AEv>x(*&C#9kpB=K-Q2*UR zn!z`%6#)O|jVmt1XW<$FU)6dV_-@U<;16*;fd4$Q-vs`J?@Hji@i&A2E;GiF>aXt# zH`L#(!}+McKCbNW|0iy{s;T}hFQEc+`JQ?tx;e|Fc7vqyB0>XGi_7 zwX#9|kJDI(`uoKF80v56SvAyOuktR`-ymG@sxjM4(mio zf3L2Y(Eph+AN2qISNt;R-yw87l=RQ<@qqu2uKKJ?{b%^EE$IK`vMhp0e}klaeE*@Y znUqiYr)SfG{L?8p#mzSn{}*Q;7E=G!zB%hP^?xb*k~%5=Y`Usar2ohz;XKm+MD;cF ze+xU(?~(r(OAG~4{N+xymr(!5Z&Qi*&#ee-r~d1bQ(7(Q&pZE$0QtYMO+Mmp+^U&D z{=aMYO*Y~S?5kuFzw37e^naXLf&Op({*SW6_u~2fg!ruC&C1mOeI8YW{_^w7E)n0O zT(y+=A;}%!m;PDQP5f?|vKHb8RGNXW;kNV^^?!!CMmfY6?Ug-E`af7tKC{v^8YI{PS=zFPn9l5|M#ls?pxCTfm$y5zlX!$;lGcji{_L6 z)-C6O{!V4)(0?E6@B7sMwY0PwQvWAe!f}H5vjvtS|75B^g3np@7X61vqe%<#MHr^& zKaZ$#qyJ3#5K%||&m37;Nqn`bUf>(N+lKt(JM0JlmuYzzNBzfvGg;_Ay_ufKzu>}p zBjO)C6#)Nz*zXVjZJ28V|6O~a4F1cR{O&dRuh)ws@L&7zaQN@x;hk^Ef7$I;%_jey zky!)({V?Y-{5RyVCj9rjb<#BQU)O0i@ZVJX68Nv~?V0f3tGnzkk^dj+E<*pYtM@MW zZYG&`$p5oUZkG^WKI=3357nu+Ci#3F#l+uUs31*z?R&i7%czcmzj~eWFY^C~@>(;A zf7ibO{l`qZKj7c)zd4uuU%T@I{C|#uHT=J1UJ(5MV&4T@@_(b>HXY>umm^MHC;u1R zRj5k-zsh-+5c&V7YnrRb|Nks~V@Lk~yTJkeZ!6THLjE7J`F0)o|Kn|I;s4nY(eVGF zt>d2L|9iG6qyO`x2@KKN{^R>{>-9_@2H zTA`7eJJgo3Xk86{48HNEMc~_XF~Fatl?XnwUH&xjS@i3`XP03&B7Wc!@f*Znv)B;) z)<;#~7YuTP->G}rgZOq|j)LD8p9X&5Zk8#;_fWsKo%rRRGyYo6otOh`T3Rdh>o;@e zcF*^3*L`P}*KCc?Z>?v_m}l4@G)Q5bi*MWDF%-wtcz5jY>uc%E{Vy+g7mnpJ_f6`5V(JX&ztvTw72kij)Fc0jd8Z@)gp}XTB>kHm zs-XYx=9SRj>Fi4AzmioB`X?^0h5jZtZ$W?NuF3op3%?BgmDs-^{txw~5dV8oT8Mv0 zun*$z)U_7z-=Exv_=hkD4p96p9^6bt{L?QX{*vAA5dXp@e271%pF85el2D#v3Hj%?QyTeqV*VxY zUUw3(gR`LYDf%^&a zPv$c}@-O1u9^_x@v25g@&g=rq%)wvGyqO1LOmZrj11^I*1@v+m>E{B*AH=jWTzhZj z{Zx!)ZsM6QyZZeDX6id0UJ1iIX1n?HDWylBGVku%?yu=z!K~!8S)}B5jj?Qe%dg=l z&lpb4c{f|*s~O(0uM#5ChZq-kA3wePRtHly{M(|dp+iied1WnLDcnUj+zY|?V2c3% zwdd^}#J5=;4Sw4G==;Rq>>~jFQlXJ4#D9NX3w*sj#sS1PE>#1+`luxM(~No2iLX6+ z{W|f_Sgbxn{Mh9W!7na~ZY6$`!|A5%8HEB7zA~-queza;hgc&Y!|&2pWU&R>4ko`nA%O%9Nz{;R2ZA^0XsdBMMZ=>+%-dIG?|al^BK z_yeg2!PnpW2>cJ9&%Y=B=M&O1h_7*ae7XSfm%Z==|F+ge@O9lB zz`xj4yO8`hTkF0to&S7~RDu6~znktz{%>4fgYzE&tB@PyzcV!yP=70yA5*0IyKl!w zW$OPzF1k8U|EH5T74>(~LCzKA|3Bx>uAu&JpREXbOs1N?VEOzh% z_Gm9B{-KShz%QD62mCZ;E%4`++Jf)+H%E@@@1_I6sK1|I4%{UFpHrq_LG{;pqm&ud z-&Z-mm%{(0H|(PNTXiTfn(A+Z{_81Je=~z`o+tlze{O{O`!Uhni|TLa%WvFNe@AZ~ z9VP#7DBptm8(7z;PxV*pT8a$u(+oKEsQ<7j9s^&()!CZ(`FoyN5dT#F@Dk!{E}XlE z_z~S-5{N(dp)NP^*){nBiND~JBlzc98+?g>@`gAU@y#sK%*{z>&e%~5_8)&DRJz0FkrLt~c9k^bwa z?T7xW9rr{3BAb=SzhyHyzmxuZ>m%{~$7~-fHR}I3XVonr{R@pbR+9d)R#EVOYhion z@2^(1jP&Q2$5~JLx6x_x{844>A@p~0b38}+SJw6#@qc}g2k}2E&kz3{lzfNyFBHCN zP4PeSWF6w~A}|y2ABwlRPVsM#7UrS&Uu|MV{D%}g5&zPp>^53HTWBHqn{LA+D@Fad!SGPRr-*Gtk5b1CBV*hL6 z$5x!5LHyOGg#Kxc)tRLKrnP}yq`#_}`@~Ut9P=i-D)i4(UFJpli#wM^kpAWmzLk*vW%;k6 ze_)K^DbhczJ>?_mKU7ojgY+-yP}hL}&uiU6`hWfU`w#Igy9Mhh|Fowwz+cJBo=tqY z4}rGCmou5Vp7?*Kw17XLH=nj-VMI(wp{tB3BLU0K;+-nsa?oF z?^!F6e-7piI>guZTylu~e|K?79QpsxLm_*}f3PoA8wCI73eN?9o}2*qlDs+K$66SA68~DR5BPas`@mNz zJP&@Gxm*PCd*59I|JU4e;3sidfUoVR{fYeF_3EVmAI(XH|DW38A4UEj{Mko`{J$^G zeuVs=dHEUqzyE%>2l@Y?t=M7m|2|iZW#s><4Oij+Pxnr9ApZ}a;`EjLU-ekfa`Jxx z{~-9kZlCEg@_#2gkulQ$!5MS(fA$|%qW`PEu@T>YWJxw2CH+?%c7*=Ae3{UnQ)Dml zZ-;(d6y={OPY?RP2emTj|85Tl?4j>JcD$HhOZk^rl7arODS9XJ?^i{i0qHMsjoXU! zx6Bbo|K-JPs!#ftmhWVFIH7;_27l=9!?GRmKR0I%;@^KS6#bXhAyM>STT_x`NPic* zBZz-rei-^M#b~W$ivP2nPUydQ9`GUl${V=bsQ+p?Zfi#TH(T3dDgUl%tS}(HpL)Sx z%D)Ax^lK>pgioK9q5d=PljCIn8Qj4``PUzs;6?hkA6+I*{PN8|z`wQK6#Zv;u1+NJ zdwi#yqWsIPn$%xcs2%#J9#{EB`de!sOrrkp#P2iEfA^G&(WL+G&5pnu#&cj*74J_Y)ZZS(z3 zdLeJ@7+CFKs2h$7=@o(<~doAD(p+e6@|dI>fI{x(>cTc>wsW!6D$Q zWX-7|eqmZY_?!27fG?7e2ma{B!?U*DYh%22RxP+}H^Oj_6?&bkKhBtb!=X9hG`p5< zVzX?GR1x!=-K>Jf>KDvdl`V?fyIwG}XJn4L;T2! zzI@`BzMTvHYUx?vH!Nky5x>v2FrWB`ADDu#ec9p>@#D%Y5{RF1VJY|}#QyDqhjSLt{_T>oXHB$! zD;T!|`?nGWGT6U;?OgfAV()XNuyy+9sEPgCsXniM(*CW7oHX`t_kL$77@63=?cUXs zO8d9--g{yH_Nuoo_HXZRUuZ=8w_IgW4bcDD1$_U(dh8nXKirss`jf<-xry|jpL_uN zzrQwFf0jPK0sZB#Za+l&8(1=+|GVq4(0|wFInaOI^5?!{3@H|9s>h zEhhboUX+7Bx8@-DuIH1$e{vuhd`UiO@O=#?`B^?C;4kEN0DpB?0{GRQ$>66MJOe*X zLnemw_kKGa`b)hshyE{9-%FGJW_G)w|H@)*=)YF9w1M`ouilAjB>l@*9sNT3pA5bV z{Z9-3ok#oE!%r0RNdG&Y&S|8-lZ^%Rw-lKN{cB943`u|6o=4Hd|NDJ5_+{(Oz!yEy z0sg_3o8T`CTnoPE`D*Z8Rno!FzP=9p4YtYPN2!j3Z~09Jd?Bwr;M=>}fM0T53jFVD zvcV6l3J#_H>*z!e?0=68+hYG(*!cQA+P{|BQT>SauT7dyMbQ2=_l~vLzusPE*FgK% z#omi0YbW-vOL=|0Y5)6_S;ZXMzb>phGeG;-(;SPZ(f;+B@P{n4e=Qbv4*S=4fAPD)=y`^|F5>Lf&Z>At$_c&wz>)bXS-_%|F2%vh4YuvY(Jd8=wDv|{tMna z=s)I2E!{=_&$}oQ=RZX^Snm>FJJTBdhwK4C_`gT55BiTgaW`=O^hu-?=RZ?!9Rq)N z&ua7^48fcv^8fuWB*0%;HxvEG0q2L{uQ?siP4#ys(;oio+GKw+JY5)S@ZQE~9a4wN?#{}pQt_zz6ZfiD+e3I3ra4yeD)%O>k@N!Dcjow{nW{))WH zME!mFp#t@{^U`GfeP?$a^*5wH8uj<3=w$s>)t#)rrQDPCcZa$K>aVKEWc?pCpRB(o z^Cs)>tHKcYj}Lz_>c6t!B!4!07wUgl*h~1&afx*B%Nm_f{}bCx!4Fs^okafAA}5Uc zpMK8`{^KW=j`}}v@$GN&pOwL9Q2%u$a!~(IUv)Tf(}%w+w)I$8g<>lUN_Cdihd{;KepqW(s7 zNu&Pyrd&k*72uTVBK>XCHIaYU$0z&0v+q|R|1<>E^hkfcB2nm{k~rCaZdfY{{deyb zg#Kb}hR~mX@I3UtGbjfAE8;U-NPp>hR?xpe>^$`UdR`Fv^XJHklmGJU9!C6?ENfm- z|EI0|1M#07QIGidbWZkP*5fwje7$^XxH8ZRgRFLvvHLjB+V#JAud z?Qpn9{omBFJ(;BcgZUC~ssGelnFfCFhT6~6|Lq((!SQE8f3NS``KbSV_O~1Sq04pG zssCHbYaUPj+p(~E3EjU++iC*;eXE}V{dbC#byNSxA^25+?q6*>?t%VqtKF;y^8fi| zE8EEb@9q5jgZjUdkt@*uy^`7eg#7>2C(SJK|HUsX`|19bG~Ws6Z}FXbKl#7GyNz+g zxBd1U{N?Mt!MEQ(Bt`wl*@TF8;iN=Z7uu-}En$@ZTlvfraG% zZ7!Vf-*l7H@ZaDIZH?r=-h1k$$^XyB$ijc+mw$l&N=hgEA^-mo%Q}<%m;K^m_-|2V z4*d7E7AO2S{bkb?;%h(6FQofld&@V1Z+D(OoBY3LuWugldwpBOssH#L=3_(mzp`~^ zR1n|pt=@d%_k2(EqWB>#Wuc4`C@Kf+R$s6V;;C;LyiOJnH&w#zA?{$wy* zP=7oall`aBZAs{Va&aW;&-%DG=)bO(9EbiX25Tqvcg=_Xy}J_8f34%4?7yZ|uY&#t zobl+t3hp?e{|fr-4*kDx&q4f8Y>-6%6~~x~{wpIf6Z$_=KZ*D^9BP98dsW|pZ+CZ+ z?>@K&{C5ZQ!0+%$0RN)%B>ykxB;QXW7W~%>ohSRh{z<+;a5nfJp%UOrq|E`}`0ga% zYRU=lFE9QAzE@@!`oHKsb?E<=mxMrngK0|W|5kbDq5lipUy1(D^@lO;UoDy$i2g6i z<~aJlng#sm|7=s@(f=(J-;4e)_G&Wvzry?B=>L=+6`=o%{eBJoAIFX+@VzuYfiFHY z6#S23%fT-eegghl{|fN=ml%R?bIJ+)_1o;gAC;U6{(b*R{#;iR@D1jKgMV{c6!=E2 zlYE}1x4{<~Z^ZpSU9BqIzY6-k4)?Dv-Z+H&SL-{ajOhN=T6g(nbpLBmE6#!LUs?Wi zSV8x%p6+-xO82j7>*H|$D&JlX_pjc1?u`kZxPR4m*?ENSUoDD1F?s(^dGh`r^TTxu zx_`xC!h!o=nI&c5f7zl9zRBkq;NLx2dw}>a_|}8}z-Gvf_*-Y(0RKQv2ly}4qreZ1 zl>wh!MI8LzxCrpKcUXh}(9;U{zuJsWfuGy87yGv>YF1+ZmQ&;g_HU(V{(>3(h`)-64&wi9wgcj?Ih7spw~*|Xr2Bt4KhnVGGBg1H=d4`t z>-}fgk^U?etJEm}Y@9YZ6JI05at-m#&ir9*oX9`ptuo-Z{B{68rbP(+d%6rZx_^4I zLG~}*|CEvX4E`s{YTW<(Ha_ng?O%shwB!DjQDPPJ7Z-b6O8V<0NBkxIYZh3jk^X@n zI=N{7nz`{nH0i&u=qm32i9Xo|{qv`$LI2j1@s*Ji`dd8UxkdZeqg=+g|5tP-ScUel z`@&x0{^#O*mymyq9n#3Z$3M%#zi;f1{8RaMeUSM4$<@llZ@zdF{LpTW9C{G}p1Y+r<90qMhJzw~77lF`P)BdfKOy70dzuva}r6S$`%GUiD zOZ&G^MX1G z*JVn7E^eLJzqJ+&#{PGtKn3=1cQkpfqWf35R|djp{(oIYbt&CH(a;v>r28kFiOGv- z|8&pE>Ry`vE1ye~r}=+br|4(eKbQRY zJMx}P%>U1&rQW9be~#zke!72>EG+hr_D>adZQMum|K0i}n7?Zc%VPd6Q1&yB?q3|z z)WQDUE$3P$&EM6hNJP^7U+u0n=I>|bov5ezd*AC7qBMUGSvudB=KojRhiB3Ki!Dhr z{?Pn?o&H@xn!iV-r(yn{*dT@Z`<(JDDVqPkPSuQ|{e!4icM53#;B9^@?w`bZU&)~T zgUrYx+&}5vriuMemhZvX|Ld^od`x_U&NK4FcVX>3OMDI8Y2w5eo;jzR_}o`kOA>#| z$ilyL|HMwX0QXP!s{R%uepS>S?0*KWx551Njp;1RUzdE_hWYDFhJ7#1U&q`MFn^Wv z%fS5AGbBKj=C9KOVl-*~8o&K9=C8F^mtg){;lq#le_n!9Bh6o>Exuy^YOZ+-=C8B7 zHv7~3^_4M~GR=R_2pVGlYvY0o;IAC;#r{`!!n``-PrK5M{ewJ@2F(ARO>Zj@e`3Uj z{jb2n)!+~F7=j{AV$LeTmOEQ@UQ6@W?OWpoY5sb@D-QG5=j(hh z|83^TI!5z%=^HcoY5vYUP>lKO=EVctw0~!Cn_GwG@BJEH*gu%*<%InMo_D$6Kb{w5 zMf|@94;>`F+BFsIA9!3keT4X{u6JD`e#b^7>>sq}x?%rdSU&^v-#skelk;bZrI`Om z&Dx3i^U|ITnEz&cOx#U;i65IW|DAE(9P{5zGH=+4k!m{^jq`&aU?gO-c(lPTj^p8=#a+LNzN)|WPkp6$7AEnd& z$y}ivMVkMo`fbJjXVTxz8kB#|DR$UDE-IFsod5f>D3bnjE`G)SvE(`#=zp+cDfB;W zeA$Ea=Tw@xoaXP_*W^L}K=G@XzrUUnYeVrj(;B@(@i*dcSV;OudM@*(_|I#v&!YIN zomnAH`ri=G^r!s`U7`C^X#cJ(InsyppUHiG7U{pMb=e^8e^`f|<|F;f&iL=7_@4{d zhx{9wI{<#DMF#di1m3V8B)+ZeWoP0Kvme3!L9>h0UgFnZ=ME%(WOTU@@g2W^MgFCf zS|a~O<|v#Y{sIM~sl?ZcWFH~ERoN-*AGo&s#QtCH2{A6KiTUf8S>p$qzdIz?d?5X| z_}{-s`p>`ZXHNQmTKx(0{|^jzcGAD*>c&W#ze}|`CX)X0Ct{09f2o-lu>TjU5}12; zLjR+8e>Ic-wP&Kgk^YfN7C3+XbD`Un^ndXo;}^|;P0|xF{~zF2#{7R8$FFqaA9-~| zp7;lcv*alMHd%V{5dTv}9P)3iRZ$S}lYaeqM|_d%Lw1yZLi0pBY5s3GH|GWM4c>J1 z6MwfA_Y%s#jbdN4i0=}$#)Rgt+FxvvY5qF(kBAGMzs|3_GDPRUJrM^E)A{TE%RA-i z{C8lkA{Xu7iL8`nrSso!X1mYP{I&1lTg+eMTvq(1{Xd(^<`kO$FUdKF^VhXeZtgUH zy`p7^^WO@$%U@~!d-~#>gT%k^tRsc^_HrAoiJ!Pm_!sflTZy;)nBWJE_9+ton(g(i`CDpkD9&HUPWSrL{QsP+kSCqL zx^ZbPr}_UKIUbz9HGEs>O!NP~;ksXR{5KR^a^q_j0*#(!cOrT`K9n?ySak(%)RP5&NgZtCP-A{-yA1r;z@;OMW5${IXMV z{?9*ldhLw~{mUM2=_CCY%|Fpe`YVcm$NuTC9Gf}m-{o%QMDY&{Jb8uUf1_&Z7K;BJ z?lU|z|9{U@Wk>pdiW!CeWASHk{@){UM400LCdnb3;vey2z6QpmP-epRS<&kBoQ0Oxpjv7r1>D z>F>9Ym4o;~nwyh}e_L+>_&s&ckblLVn-wYlg57&YY5(M83or6d!TzZy@#8m(KbM@~ z`#dvPLHWljeqN9G>u(1+693DY9&h5`8q{4${LuNT1;p>vy|aS&13Ezq=={|*sxgn| z?+N^2IRD+YWy%*ifBid_jPqaFl{z?o-|;k8f#&}{t;0Bf{ZYRwh0b4n%dg=4^6A<|Um! zw+Je=6TdCxtPq|5s>Jpc(fRMyv_W~|iyWW0P&;w{`(vB$apLQ9i@&4u-<~tuz<+*x z-Z$cVTTiK=^M7SA6+t@xojv;QChZ>>uy*ATe{;3(6*_;lT=5g4pt=nJu=taB>l~#auulltWpU?{wZw= zKTi5LtUWkH`hQS5g8Wmx#e0tQ59_mDOZj){crNt!a}h)RDQ4w#BmFCHJ!m5R*+w2A z|0+$hasJP-Edlx0(QUy_`d8Jx$NopOaTw0u7uF=VQvCTOhh|ay?{te5Qv8)GMi75B z8`cLD|En>F&r|%jRjZa#{Es%w$N78nZtYfzzqrDMMv6aM!)*bI|7Is0=%1Fd<~GHD zW6S>e#LrFe!uh{w))(;e4{3wHKj5=8@x#84!-ZBOMHvhX)(kM|3=R%`_cJ3>$On4zs7z?1Mj~Lo;r#8Ar8dsr zn%>Fc{D11l`#p62))pOgozDNm=BMKQwGDTdDAM_Vipdpqn*V=zdJpff?Yh4U=l=_9 zgO=0z|CineAL;z9&{zcL|2spk;{4xp|6H8^E3b?lrT#B&eLeR7^uykx|Jzr6>>Bz1 zm)$`o-e=u^8didkJvwzjd+axPpzsGuGIgzCpOoR z|Jybk!v3ed+&AohmYoS;kpG8X+|e52F1kqmyPnVY1o`jJ za7|hA->;wfn#q4<<~3peueVwzp8WqIZ!zwFG;fsYrT*_(tHcB9KUh;OF#rE+F_nk- zhsT}R$p2N;qkPH#KT9-Y|8sCOrI+}YF0u*Ke{8ilq9R-L8lF8+hLf^>_Xo(H5%zQF3?M zss7He=0W|By>bclKUzu;^|xT=Zb{7W7oJP?KV12CEb&{S4}<^U@+9B8z5@J;N79|dpI5sH{J%w~!4E0k4gc97<9Lzk zueD+d>i_L0>ZrfbY*wiM>ilNSRDUnU?#28~@ZB%?|9$%zpQ-)|iX8n!_4n4E4%Gkn z#L4|D33Cb5|HY!LsK3bu{;0nT?#w{_Wfc;_{LQ#%0Q;wxe|TX2|7dIs`a1?63?uy| zXMfm0`RD0A2mN2kwc-TIzdv(4kbjPkJ64nb7la6+|2#W8Z5#D}Z@;PF{*lxvi3-v` z)@nQa|H+Gye9FIx>zPYQ|3424wo&|L8!{hL|0OJ&{D%6kdj^%*|6_Z_rAGSK-a3x? zd$rnh6^eg7t10$Bd5?!YqWBB=%zK0W>$RQ%^?zl_ui(Etp5k0Ie`h`!aV-AVb^d?UM@@-I7X;V<(4kY$SKKfk`wd`A6;!bRgK>OYLax(2ELER5NV z{_~ck=^^s}cW0mB{n!0fm*Bq+v)bVQYI?lzU%u$HTjc+NrjPOdDvQb&EAoFK`C0GC zf4BB+5+(oLoUsu8zp>93{@bbl82-Dujg^=Dch6f}`2W@m+VI~;$2=s-e=qT!JV*Zj zLG8&?n*Z-^vjG3btmH@J|NZLy@c-$)x50ldqK)}KPv<}@@o%|l;r&_jQ_p>A{=ca{ z9ek7OgJb0XWeZKF65m>ACf=V_^?C=syI2(7e-*XeGMD^6?58K*-+a~-jrU(!^CRH@ zQm{-&}~b~gF{2HP@4n*Vo4n;Vk<-_zVDMgAYIy&dznMmAB*-`>x$Uq${eljHV` z{6AA87W215hNm!ptCDgHqWQo64ZBd%-|>?>>QCcNZPcHaO_HcT>pdM&f7r)1qy8w= zPu8F3C0+RbV|CGc^qIxwLo*7nQ{{QXVb@ZR}P#I zQ$Hg9Stssd|AOhOAVTraa65$li+jZ*#Q)1MEBde2do}3)F2C6de!>Md@bjPC24BUQ z6?~7x81Or5Ou$!>GAtqf+IimKZ|AWGzo_9o_?gA8z;DR-fc}r^WDUMg;eGI%b7p{V zEc{-P^lvL^!~RDL+h+8Ct_MWzY5!xIjCKq4e>&dYH%Nck(6y?h|F6+?AE2 zztWmu^nYVZ80i1J_)?dV{^sKwYDs_VxnqX({_5A#OX&Z)b;A8f|I)m-;Qw*x0Do1$ z7Vw#hlHl*&!qH0noNtEUXP#aS{M*;UV48wHpt(Q=KsaUwczV;I)R_PeUk5)bQFBs_Y%g$S6p`){QUdRZE5~nfBc+1 z@oN(j!OyBb0e|zZN@p{a+eR>hCM%kNlIA9LDz_J1VX~f16rO=r5a?4gE!@ zZNv8;hO7AS{f8M_AoPz4)GUL+JN}aE)GKc&z&wn z{Hs@{ApU!gMj`$+M^7UDIr6%Qe~0u4;%_3!K>XAG#lPpS2;%Sm@G|1>qf{qH`Db$> z6#T-<&)^qyWr1IyFSVWY59vOS{SUo$+pS3dyZ4q_lm1Wk>v2*39o+K*{1<$D;2S)< zhWu*}aKik5b9oo^KjQQf^ZzSGHU}vGx*tYD|IYFq(0}m}8R&0ZJpU2tKhzKb{U52W z#s0_YI&51PMEf0~K+-H z|GO9F|Hn4W!~B2MR13WS>OQX#@4pE)dE))o3%UK6zwf+Uhxb=EZw$NUHZgx+A~X5^ z>#aq?nE%TwPQm-DRxgIYFO^pW|M=?b;3u!B0$+E}_&(x)dg>0oagZGNmmd0of5P}N z`0NT!;Io>Iga35wFZfFD+ER$Wr>+X`zrNTZ3;st73Gj3MZSejk$Gc~Ee=Bah2lM}g zlzP0s8ld_f?{Ai-eZ%}eSv&#r|I1#Ec>nhjSDgXP|G#f-!uwkz?#Y<{=V)2s{Wtqa zRg0|?^M5e|KfJ#-EpQz3{{tcQc>gzpCo7x$UsQOF8lC?%+P#MVPZz8ar~c1MxpI*D zzsi#<<*5H-8F9t=ldy468TEhlzRA7R{|$Ue@1g!L^P>m+Uv{x}4)uSn505>d{;&L0 z(l6@&=GQr({}d12x}EwzW1GKm)PJqM(o;bFmyUS}{MUHmq5}0_7e7|iQ~x)7$taA@ zfBsa)*-`%|5TN~r{I^oiX*te+!s5?T|Fy8}I^N%Zd)w$I^c`tji1YpC;la`72v07%m@G6r-U2CPpOQ>{%2z?1O6XtZvp?0T%=H+mBPa5z8q|H{A0brIjCPF9lm0?YIN5`V8oGyH#-Cf`irM>;xbk^lEw zt~aFp&oiclpXmMlliBC3aR1|>W(U>ZatX6k^8c3tjwI zL;IicBPRUx{(7p|4<+*d8#;m=a_WTY&oe!|M#{@5PPt?aBX-J@vu< z)rggc68Znl#(Zn4zsa+-ys7?rs@w5X{guA0jrx1IlpXa~;#1vu@?XIdO+4iPhaZKH zkpG9>?n3=_J?65H>hDuFS@4@;7UKQ?f_LoTi|x^MB);(5vWk0Si%_^e9Qf1?{$f0O^a zah$Is|F@CkL;Y=9XLO6||D3Tk{8WFhK3$?h{(maw2kP(6)4M~-|6kN3qyFmZR+W+e zzno`>`dhVk(V}Y;^*8KKX+HUX^yTlrHR%2A?ZtTiok!-53Dy6zwMSGa{{)brT%aGOOIRh{(sTi2n&k8jAiOZ zioca?|4NE~lwX1g#Xo+$c^kz){qTB0ivOYo6#>-$9n=x?1Ml}q}6DD%Mn-CLgJGNgZZs~Pq`*S~&qj`Y{jzJ&k&L&L7G@Zaqj z-q2stGyXyJg#NefTON`Ay(NY4U(X(C`0qU4DD3}980ZaA{(TZxNB$kF6RxKIQ+%!P zBtOPml=82U@77Y{H(EZze}CdnvP%f@yVHd(QvWHeV2b>E64~NN@4psa{i72c9l)+-)+%~N^P9jzdLO*4ezf<*G}U&F|mKA z_OWOK`LAh?9sHNwY61NB^G`PT@4^?ko_Q1dcQ*&$&7%FgvLQXZzj|{2)7!LvcTMf{ zP4ZterXAjYeX(dC{MR);Cu%>`dytkQ${Bb}RP65l?(4gUYqf(P%&si~59 zf427Jy;ZdTw?%&?-e2wNGz^PBpp{(SXMT~7M%m8mo({q5VlHc|X7n;zaK{W}^8gDL(jx~+d{ z|8ke?(QewmoFm$e_jk=7S|a{@tVVc$UuoNR#6Q+DbvniWIWV;G zJLTWv#MS#q|CZRK|EHxhaR+i+`!Fh`P7#unNcluUu^XjnOHrzmhNIG8+KNz$B!$wX z)K*d%(xlR$QL+)Dup_$&sZ4bwp?1SA@mcqK{(}3u)^A}|>?sw5r_2KlRmDAgSfAwu-Yu?c=|Ld_=8{P>2t73iMe!{;xGILyp@UQ9( zDjO;Mt0P+CZwdeFoT-iY_l;M4!@ruc+5`Xo{Eu(y%4{k_0rMd#oN04ueB+^;D3$YSoT5iiY2E8NN96x&@j~){`M5X!XQyeg?7xolr_03p2N{fE{a+VYvi{9)-0&}J{uPOT z|A&@4>wkA?6aM9r;^Tja{NGPCSufUqwuu4j-=_7G{8hX%@h@MUA)h1Gf5h?atba+V zI_ux#vp(w|CG!OTv*Pmy_@6Ib4T4|Oun_)Mr7fCb|J{@y41Z!+Kk~oVFE3s2gAQ!P zKYed?jr9J2_Atr+yVMW9ZclsmU&$89KfTz{0>0vja{SNRYJPf&{99KZCjVhd*YU5O zS}+~|+P?dv%0>PiYvS>*Ubwjz|C;_aC;Y38aq;-qG$+p_|1(J)_sop`TOUX;9u*!(QAe1zivspyI$~X)WYGfyh!(gd4cHvKG>vyfA#9Oz3YVk&8F~0iRix`J}7lSOjrN4ZB-BaYsQfw z_}6+nZ^6I%)JF~f>eS8?_+K}qoTmR@Ux_=pp|21XcXZ*80lP5kg=2VA&^V9i__}|RWZNmR*|0rq-8FiY8`rlshiub4He71@Z^?#w#zxn>S_EGx(6g0J-`=|1QU8>^$ zPui{ie1F&k=}Py{kX-Jc9!AptAG0?h^F;l9cDRWDFAq*e28;STQGP!EUnbZGasRV= z--G(Ee(E*z7j|crsQ*X&EBODCCM&)FljhPw{hf7TBJclr?WyGdPu^Wi>i?vb8q|N| zPnY=rqBcltf#BOr(1w3s*@gcmtLuh>uG{->?q1pi@H z6#svkf2o1rT`QaaKR=IbhhN$%2VeeiJM}-Z`5p5gqx&D@|IhS~rTqWV)Ro@f(RM4w zzrQ;voA;kA7v^yOTAupA`D^iE9Ph6L_?Rsd=dbCDT>k$Y+WnF9*D64k``?&bVIJcA zec`y6`(K{HBF^9ES0;1+o77lrChGr@L%Hz7%zAVGlz*HD-#ha+?wb6{OtBd{y+WJYpb*1>&f`R&)h#5en^cme3#_$y#Lbb?Zf$d zJa9kfZx7@9`2QCiJjnU4Xzs=Nn`6+y`ER+an)AP7-&fv$$yl7v`Mb$r1m~}wjV|YJ zXKn!g{VGdS&i`J?<2ip5h92kq)vkAdUl-;HKO!Lve#ww?@XKr3)W!M##q%Qkc;}b! z$12aG{yPsdg}r1Vx{`a#T1Yfh>1iqu@HqQU%cIo_&on#EZ!to*e>_R>K+s-;p zoWDK$=5zj*+LzpzkKQCEu#M4og2XV z8~Qr1{#P>p!N0%JfP+77;r%Ubw}eWT#- z?U+sd-x*>Bzed&?{)Qu$cz>!mejx8pt@sfS-(>rE_;OQrk^h24BMSxpmWMq1uSZv> zz3~69Z1~^%Q+v!eiu(Jwjvy??O(;=6B$pRE!HKd$%|^}o@=7QXB#CH9|*@)!6C6{p~rtUe0= zw1VV+&q)b}Z+Kdb`kR?{kotRm*&6Dv?bhqm-}%#i$rbg#wfPTl!VkRnn4 z-+tGp{*R3ANBy7iE}Ht=cZTGDcS!1{EatB?dSy_5^?ehlzfYA9P=B?|vbld;8D0uM zSnfaY$Am`R6!TxxYacRy_C@c+5ix)EL#G$~)MuBA1^;`$bL!&$QNJ}3zO|0zpUn!b z_$=nX3hE5;znUGiVgBsThyL(0^~W=R*1P)_{F^ebYN`J+hZj))LxWvv4#sQ=RjG--?ZD_fO$7KvT+H@|o8rvA4X=u-d3+*KQMr)&OZr)}mlF@L2s zOAh~Pu-$y>|G3Oup<@2#%BW?$KV|UKll<@hC!740v^qI|oQzj;{zMKdBL7(iYsvqH zwmavK`lR{nKbJJ={i$zzrT3@g%ACnxaZ(iLk4F1?^8Zq8&i)(o-#X5po~Fylzk9QE z|4Mo&-M`kPy(a(U5&QA~7k=4F{>N)2|G#ScI__VApVxE$+SS!(F6QsTY9;^vlH3*C zzxGrHa{nrxd4T+lrb_<(dwmv>zq@HH{MGlv$$#mK|M`c%O7Bk?W$c4LR5b*?=17UZ z)%rAirx_367g;pGKU964{a63U9==;r8T{D3JK={`Nbe8mU$=(8xkHcpU&C0*|6e;r z@~^9$9Z3G+S#|jLgMM$}{?~J2AM!u=bpiLkHjPy7e{!F!$iLeH$^UOBYsLL<-L-Sv z|7zFW;QkkHDf!n|@43zW?_^?k_z7Q=*?)@)JlKCVX?pNek~Fw~%2!DDPxVV0@NNDr z@$Gh;hVN=V4gTcDvFtz94(a`Y_w7;e-OQ!;2V6h8v;X8@--GY=S3drCt5(UspX$Gc z`MW5|AQNS;VWLOgI}`gEB<#= z^9zoGzhQRyc`^Sr!_6E14udD~9qXm{2ii_Kz#nvK3w*gViSUb4zBB)&eRw!tOWYSDk|l&>iH|Lqj;uh$M4x@2Hi|E*(GDEaG$$C7{BC?E3I zOqVDB)xTSi|00zf_Fq$jF8SZx8-f4-y@kd&asIR#nUH_TDl780GatnM+op1#{JX76 zV*h!a@Ff3m&12->!}vYxKi_u<>;K(A^8fFC>dE>)nm7gjzu&|6tpCHUR8ZT77Ho7@D}-(uZK)<1H`Pu73O)d1FC$J!VE=omftHMtYn zf7a0p;ZHSl_Y?Df@vei-#QfnD*>L>-d7&!!hp#$JWd1K^)O+}IIvbh)vz;ToKcJpJ zp7}pZ*;@F?*I&Rds4ReQy147=Q-j%muVWX%mp54t-#qdV{8z?a@M9jiW()otIcxY$ zyWYaDH+l;{S@8vY%R{dCUniI8(Eoit@+kh-xc7$mUuU|6To?Vzdrfa2>+VG z#|->yu7yqb-~Nc4U?BRxTi$pwe>XeqIR3RgKHbh7?drdtpYRy}TFp*1{A*tv2H}70 zKGOsK$<&_kuU_%-iDu&(Fgwc6$bEcRL^M<{ojE<;_1H~@p;=Q(f@tBDxLYO-V>5$i~d`~ zPY%rg{nRa||2n4nCH}1l)uL&l|F%x`KK`wbCqkLO@vcjv|2w*y)ze;G{kNNy<>Xo%1J`~Cm@_|MD!{}2BkkAR6GV*^59{ZAZt|M}SdPyYP#uas-}J$>=N zpZs5Z{5M}Sx&MBXf4?t3+fw=j2OBpVKN~L_yT6;aUl7|g*3b3#N7MbUALal03HjMf z{&^iA>kC=0bKf4~9PAz7AH*gyjg3v5^@sodr)1{s@9rFE?&|F89LR7Bb$7*=8UFL- zDh7Xlp8x(ic>n$!+X8&U-P}F@<4^L>e{*={f4`3BpP%0`)H(1!{{{a2f&TB;P5JkA z?!NAR?*765`L+N4ZT_40&)?h6J;=*3IDDHs{k;*he=!z;?(S<@e+u0H_&NXQ>pZ-D z|Gtjrf4mOgQORpLy^Qrbb@~kl8yDMj#5vg8&z((3Lg&BaQJuo3I>Cy_zu24f>z&TO zum4wHj=!&W3;ut6b#@kho!9yAzvtw?@c}m|*nQi76lC&W80(+xY&?H|l7D_2_J1lS zJNrMMU?m6r`sX7D>(B8g|LJdpuj9hsne}nfq)GG*c>no+9PIxDfQ@Z8zV6>&!vB04 zU%Y0ey%#^5Ed3GUM|tY+%!(gU6#pU6w`6?`qU5A6{3oyf{{Dae&q@E~82>uKzaRg8 zZ)C&2KLtL+{cpUcu}@(ovbVE~uX~WAavazH{zv(L^>?TaENHUV)MN;(>oaM%w1)Ab z-fr?7TT_OQ(NB*V%hxijM5f(VbKzzxJYU3Izlw_)%NhK;V3eI%ueG7h#^zVcB@?An zKMzSUOfyG4IkD05 zrqYx#{`h)3ruZs}n8P~yjJKi&^}gdKjCT>O8mgm)jFjERMn~)n88sUU!>U*EFn8@X zYc#F<-lBJ?BG@@}wB^%}uB3Z;Z7q{6PZVCeE5{g66AUd^P+%ktas_@ikY!A0oV8YW zT*x?`Z}jDOi8WJfkrSsd>tlnQ$ra<@7R=d}%d|o)H!_8`uor?qi%Y%^{ErrGTHv45 z_16R6u&uue{F6I(m4ScjgHjOq>TiEE++p$4A2{6r-y$hH0DL#zkPz^te)$@Mf4lmv z*a;T*(;taHLadJxr&_LopS-D94t$#jBFe2nMhx4>Cq5Q?>M=6roqqn^Rhuz!M*cca ztSW=|MT1j$A}8}Hm$7#6nvRxy+gp!OO`g*(1pi zeER!QpOzRS*MHUL)6sm4wEJ%s%@f$djQuuA_?q}SX77vxD(eM}nNPR6U5P&+&lJBu zVFf-%s_G#4vy{7Dg8y02br<+TN;MN@EdF4gP#^e}leX7fV)17!lnVskOeg;p_!)~P zR)NoD<9;9fpI$#*!M|H-H4FT@&mPmjH$S>X0eoGpMo#c`u6SM^US-6HnIU>(hM)=~ z|JCm_wF9yYm$TdCgB3)WHd8HTc7^*97*rnZoqF?r_G z!3C=FjCG}hmv@TtGG@&WsrvN&i*A;dwUwB@FjJrZ#5w)Q%}lSZ0r`LsIi`zN(nzuV zSj#fIV*|6c8ZlfR3GM*@^wQQR;QRRm9RS}#?0$O?i{BE0ou}PQUg$|PWKUSd7#w7B_A!ry!j~V*&OSQ z%-q@)N9Wn=F=|52-&O51WawF}EtlZ7W(08;ZG!#}G>nI#znMuG>0j5pxe)qK_8WFb z{_)h^lz{%#*QJ=qzr+ifkZj|AO-Gy4B+p=r6c*n-=uXk($W| z{ohyADMSB18@y$pf2eO|9^zkQQ^K9^ABKr-&e~@uI9elTYf$PD)JhR6Ke1=5lL-3y&^ov6Ov>j!mRxJGm zl!t4f{|2=O_Rv32WAlntEd3LTWy+!d+FP=N(BIv3*a!OmEEceb{sDJCB|v|Tr|j9# zzcPAZE%ZP8{naS+UueBL6Z-QvSaw1GSoxn-(7&p7@0c@-f7Jf%G4R()9!-3OFy?XaJ-o*my&mce#T1>k&aLW9&+Y#Glan-=wO@vp8Mc@(8$6A^ma5&; zHNAeKUZQ$3W09QNC-FR9hJotBEx((lF%q1(^oDoLU{q)LUwm*H;}RC1o99mx_$ys@e*k}`dzBmbe9zwR0KaQfSqu2*)QcU#zh&>8 z1Agz))0|&f{MA=78o|#!B6SS>dFAax;OqOosrjTM&X^^ieJ=i?0rTs?vZ^~}225x6 zFD})5>zNiMQ_kwBf7LDBFotdzO1kB z`=r2pp_r2KVZH*hIqvr+^Y_b`JAbjomD$f?>})?}B*JgUxG(LtLz2Umu~DSxxatWP zhQj;kdB{K0(4;@mKQZh9)t`Zz>l~r~LNmoV(Er`bB`2YOYwe{0=)dxYgd6m?*LCU=zpwEa@iQg9 zUI9O?ok{%ndv_53iJ7`R_}qdP+rS@uJ(Kj`!T*Bz6aM+c?>#3={I_eK6F;KYo%nMD z?h=34B=8aRe_y_?0s5y5ysw1*vGJ8|(0_Hpks;`>U}-uP`rq3WqyYUhb0TV?e{7VZ zA@u)z!I1Rd6_-W&SGg}XhyIhxE>}bUuV40%{_M}gN&l*6xuk!6;;Y->H;4bA{JSNw zgZR;MeNN!p6~~Q%ud5a*0RB;#1j@g2%Vv~=UvzziWN!5+>)Y%D}x<%b4f;)*Y>EF=FiBq0l$C%8_wLzijqe2YZHC>DW)>r_PLT zUL}XX|6bYp8vMYuv#)~h(|eZ({JT8U7J|R_O|UEY_fFnR0Y5UyI|BUn;k^0aH?8$t z2LAZR;Rx_+{MdrQZ;5*32mTPd_#pVjO-?hxzvE^02YmiZI%&3=noLPs?bYWltzkMu z?&6+pYs$>1Dzg_|zLr^FE&JQZg_|*Dd&)V-Ra^}Jc%ku{QFexb$g?%!HotT|MjFe% z9g<>x{cYfJ>)KN0`R7TE!Wv3U=HX8Z+WeO?!++im-5zbuSikw*C075N#FX-Qq>p}Xj`|*hKuXeph4fMZn zD=!B9o6Sc^f4_ZKDgR~(j8pyja6t6~^#7u^g!EV2UrhPeSLIImw||Ls0^;v|l>ZIl zZ~Uu~;-8tGG8yr|>bZUq;_rNV6UD!MV3gt?Zu2P|@!!8?kr?9tt}B+}e`{xSB;v2N z!7Bvuw-SEmi}+_xHK+Jn-@ZoiKUchQ0`YG;_bV0r!g*b!zrM-?;;Us@6aS)ytR(n` zcjJjKn|y`%-x{-t-#x-D4*u%$P~!i*a)9_r`iqG#U*<;oTUzK5zw`DL;`45oBED1K zn_%eQzvrhJ^iN6Fd&nt0*1*3H^6Xsr7{Z#numUpnsWQ zt|#<=boRq}=mi{#zs3qoBWb{B`1oetb=Q`3n-n z=U`WH2VZD^jwhHmJT=R)P%jga9-&;iyzy0$%AMm*k ze8i?leY|{Ejw$as#j8X?f$7q*EBJ$fER%Cz z-vU*~g-r80)vG5;tQkfnjiIdfe~iYcsYWKhEf{0T>ib#mzZl$gN|oSSt|+YrKbTu# z75E}scPfI&-G1)w$dW$^un3q)jUVL@cW-9N^ao~zo zWiIEdu4qi;WEB5gcP+@QL)XArthaerQwxuQT;+q_uPu|-E!L5cRbU#qtXfvQN0NCw zO|JWymKakycHek$G#`_DUECxwfh`P8N3I{N{+nUU8>PHK(3l~(RdLb51FZK=3l8wZ z|Er2Udf@+GUdf$7|EH#VcN6^I@tO7l_&@t4FY^EW89jaQ|LvOP?2VE`T|JHUX$yEys()%l_&@c-TjtM~B#H^K|k(SLUFOUPamWiSMT32j61OKl#+*A$!4{Elsf&ZRazEMDzReybF&YTSY?K!uX z>TitMwIis%a@YNP9a;6)Ji-4I{P$)?T_*hZ?BFp|`0q>uuJ7fn`g<-qK@a^Ok05^- z{MTVcRSx_&%lz~Y@SjK={$qwQ%M^&g9~LaF{M`te$TU-NFoH`ITn;vlO33-XUp{a5-rk{&r

aYAGlbxvl0rDX;QGYvcl~MhDTi`(T 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 H_c#9oq|X$Q diff --git a/out/solution_000000010.h5 b/out/solution_000000010.h5 deleted file mode 100644 index 3e229f36406cf8c8978355f082f088f0d0d06395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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

g11p|KYM<270{^L;l;9TUN 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 diff --git a/out/solution_000000018.h5 b/out/solution_000000018.h5 deleted file mode 100644 index c5050a5cd548f66252ec569c33e2741710e1390f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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�rI&)l6FhCY_2uLS&oN9MqT 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 X^k1p}M*Ux!zgC9+E6snC{`&s_(o1O5 diff --git a/out/solution_000000200.h5 b/out/solution_000000200.h5 deleted file mode 100644 index d2cd70fd38cd76a97820e5d1b3937ca3ca97a6d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 diff --git a/out/solution_000000300.h5 b/out/solution_000000300.h5 deleted file mode 100644 index 5a452482ef906c31ecc1cc78205fe8727279a9fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 diff --git a/out/solution_000000400.h5 b/out/solution_000000400.h5 deleted file mode 100644 index 335358a3e10b0e895b4af3dc3f6352408b7353b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 AWB>pF diff --git a/out/solution_000000500.h5 b/out/solution_000000500.h5 deleted file mode 100644 index c6d75bc602607753cd7f4a29552b4e764442c3ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 RzX$pM|3Lo#Z+ZOx{{>URlnwv@ diff --git a/out/solution_000000600.h5 b/out/solution_000000600.h5 deleted file mode 100644 index d0abdb39d979ff19f8a61ad83fdb5466c7cb477c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 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 diff --git a/out/solution_000000900.h5 b/out/solution_000000900.h5 deleted file mode 100644 index 2c8fca684dda5b10d76ee2e91d1926040648181d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 zcmeHQcU%?M5?(I7N=q=JV$4foECd8pKs+E~G>QUJEC_;Lg-8>y#YXHPw%AQ7cxUdN)wn5JGw`#aWHSSx9LZHSq<6vKN+;5EMZ=