OrdinaryDiffEqExtrapolation

Solvers based on within method parallelism. These solvers perform well for medium sized systems of ordinary differential equations, of about 20 to 500 equations, at low tolerances.

Installation

To be able to access the solvers in OrdinaryDiffEqExtrapolation, you must first install them use the Julia package manager:

using Pkg
Pkg.add("OrdinaryDiffEqExtrapolation")

This will only install the solvers listed at the bottom of this page. If you want to explore other solvers for your problem, you will need to install some of the other libraries listed in the navigation bar on the left.

Example usage

using OrdinaryDiffEqExtrapolation

function lorenz!(du, u, p, t)
    du[1] = 10.0 * (u[2] - u[1])
    du[2] = u[1] * (28.0 - u[3]) - u[2]
    du[3] = u[1] * u[2] - (8 / 3) * u[3]
end
u0 = [1.0; 0.0; 0.0]
tspan = (0.0, 100.0)
prob = ODEProblem(lorenz!, u0, tspan)
sol = solve(prob, ImplicitEulerBarycentricExtrapolation())

Full list of solvers

OrdinaryDiffEqExtrapolation.ImplicitEulerExtrapolationType
ImplicitEulerExtrapolation(; autodiff = AutoForwardDiff(),
                             concrete_jac = nothing,
                             linsolve = nothing,
                             max_order = 12,
                             min_order = 3,
                             init_order = 5,
                             thread = Serial(),
                             sequence = :harmonic)

Parallelized Explicit Extrapolation Method. Extrapolation of implicit Euler method with Romberg sequence. Similar to Hairer's SEULEX.

Keyword Arguments

  • autodiff: Uses ADTypes.jl to specify whether to use automatic differentiation via ForwardDiff.jl or finite differencing via FiniteDiff.jl. Defaults to AutoForwardDiff() for automatic differentiation, which by default uses chunksize = 0, and thus uses the internal ForwardDiff.jl algorithm for the choice. To use FiniteDiff.jl, the AutoFiniteDiff() ADType can be used, which has a keyword argument fdtype with default value Val{:forward}(), and alternatives Val{:central}() and Val{:complex}().
  • concrete_jac: Specifies whether a Jacobian should be constructed. Defaults to nothing, which means it will be chosen true/false depending on circumstances of the solver, such as whether a Krylov subspace method is used for linsolve.
  • linsolve: Any LinearSolve.jl compatible linear solver. For example, to use KLU.jl, specify ImplicitEulerExtrapolation(linsolve = KLUFactorization()). When nothing is passed, uses DefaultLinearSolver.
  • max_order: maximum order of the adaptive order algorithm.
  • min_order: minimum order of the adaptive order algorithm.
  • init_order: initial order of the adaptive order algorithm.
  • thread: determines whether internal broadcasting on appropriate CPU arrays should be serial (thread = Serial()) or use multiple threads (thread = Threaded()) when Julia is started with multiple threads.
  • sequence: the step-number sequences, also called the subdividing sequence. Possible values are :harmonic, :romberg or :bulirsch.

References

@inproceedings{elrod2022parallelizing, title={Parallelizing explicit and implicit extrapolation methods for ordinary differential equations}, author={Elrod, Chris and Ma, Yingbo and Althaus, Konstantin and Rackauckas, Christopher and others}, booktitle={2022 IEEE High Performance Extreme Computing Conference (HPEC)}, pages={1–9}, year={2022}, organization={IEEE}}

source
OrdinaryDiffEqExtrapolation.ImplicitDeuflhardExtrapolationType
ImplicitDeuflhardExtrapolation(; autodiff = AutoForwardDiff(),
                                 concrete_jac = nothing,
                                 linsolve = nothing,
                                 max_order = 10,
                                 min_order = 1,
                                 init_order = 5,
                                 thread = Serial(),
                                 sequence = :harmonic)

Parallelized Explicit Extrapolation Method. Midpoint extrapolation using Barycentric coordinates.

Keyword Arguments

  • autodiff: Uses ADTypes.jl to specify whether to use automatic differentiation via ForwardDiff.jl or finite differencing via FiniteDiff.jl. Defaults to AutoForwardDiff() for automatic differentiation, which by default uses chunksize = 0, and thus uses the internal ForwardDiff.jl algorithm for the choice. To use FiniteDiff.jl, the AutoFiniteDiff() ADType can be used, which has a keyword argument fdtype with default value Val{:forward}(), and alternatives Val{:central}() and Val{:complex}().
  • concrete_jac: Specifies whether a Jacobian should be constructed. Defaults to nothing, which means it will be chosen true/false depending on circumstances of the solver, such as whether a Krylov subspace method is used for linsolve.
  • linsolve: Any LinearSolve.jl compatible linear solver. For example, to use KLU.jl, specify ImplicitDeuflhardExtrapolation(linsolve = KLUFactorization()). When nothing is passed, uses DefaultLinearSolver.
  • max_order: maximum order of the adaptive order algorithm.
  • min_order: minimum order of the adaptive order algorithm.
  • init_order: initial order of the adaptive order algorithm.
  • thread: determines whether internal broadcasting on appropriate CPU arrays should be serial (thread = Serial()) or use multiple threads (thread = Threaded()) when Julia is started with multiple threads.
  • sequence: the step-number sequences, also called the subdividing sequence. Possible values are :harmonic, :romberg or :bulirsch.

References

@inproceedings{elrod2022parallelizing, title={Parallelizing explicit and implicit extrapolation methods for ordinary differential equations}, author={Elrod, Chris and Ma, Yingbo and Althaus, Konstantin and Rackauckas, Christopher and others}, booktitle={2022 IEEE High Performance Extreme Computing Conference (HPEC)}, pages={1–9}, year={2022}, organization={IEEE}}

source
OrdinaryDiffEqExtrapolation.ImplicitHairerWannerExtrapolationType
ImplicitHairerWannerExtrapolation(; autodiff = AutoForwardDiff(),
                                    concrete_jac = nothing,
                                    linsolve = nothing,
                                    max_order = 10,
                                    min_order = 2,
                                    init_order = 5,
                                    thread = Serial(),
                                    sequence = :harmonic)

Parallelized Explicit Extrapolation Method. Midpoint extrapolation using Barycentric coordinates, following Hairer's SODEX in the adaptivity behavior.

Keyword Arguments

  • autodiff: Uses ADTypes.jl to specify whether to use automatic differentiation via ForwardDiff.jl or finite differencing via FiniteDiff.jl. Defaults to AutoForwardDiff() for automatic differentiation, which by default uses chunksize = 0, and thus uses the internal ForwardDiff.jl algorithm for the choice. To use FiniteDiff.jl, the AutoFiniteDiff() ADType can be used, which has a keyword argument fdtype with default value Val{:forward}(), and alternatives Val{:central}() and Val{:complex}().
  • concrete_jac: Specifies whether a Jacobian should be constructed. Defaults to nothing, which means it will be chosen true/false depending on circumstances of the solver, such as whether a Krylov subspace method is used for linsolve.
  • linsolve: Any LinearSolve.jl compatible linear solver. For example, to use KLU.jl, specify ImplicitHairerWannerExtrapolation(linsolve = KLUFactorization()). When nothing is passed, uses DefaultLinearSolver.
  • max_order: maximum order of the adaptive order algorithm.
  • min_order: minimum order of the adaptive order algorithm.
  • init_order: initial order of the adaptive order algorithm.
  • thread: determines whether internal broadcasting on appropriate CPU arrays should be serial (thread = Serial()) or use multiple threads (thread = Threaded()) when Julia is started with multiple threads.
  • sequence: the step-number sequences, also called the subdividing sequence. Possible values are :harmonic, :romberg or :bulirsch.

References

@inproceedings{elrod2022parallelizing, title={Parallelizing explicit and implicit extrapolation methods for ordinary differential equations}, author={Elrod, Chris and Ma, Yingbo and Althaus, Konstantin and Rackauckas, Christopher and others}, booktitle={2022 IEEE High Performance Extreme Computing Conference (HPEC)}, pages={1–9}, year={2022}, organization={IEEE}}

source
OrdinaryDiffEqExtrapolation.ImplicitEulerBarycentricExtrapolationType
ImplicitEulerBarycentricExtrapolation(; autodiff = AutoForwardDiff(),
                                        concrete_jac = nothing,
                                        linsolve = nothing,
                                        max_order = 10,
                                        min_order = 3,
                                        init_order = 5,
                                        thread = Serial(),
                                        sequence = :harmonic,
                                        sequence_factor = 2)

Parallelized Explicit Extrapolation Method. Euler extrapolation using Barycentric coordinates, following Hairer's SODEX in the adaptivity behavior.

Keyword Arguments

  • autodiff: Uses ADTypes.jl to specify whether to use automatic differentiation via ForwardDiff.jl or finite differencing via FiniteDiff.jl. Defaults to AutoForwardDiff() for automatic differentiation, which by default uses chunksize = 0, and thus uses the internal ForwardDiff.jl algorithm for the choice. To use FiniteDiff.jl, the AutoFiniteDiff() ADType can be used, which has a keyword argument fdtype with default value Val{:forward}(), and alternatives Val{:central}() and Val{:complex}().
  • concrete_jac: Specifies whether a Jacobian should be constructed. Defaults to nothing, which means it will be chosen true/false depending on circumstances of the solver, such as whether a Krylov subspace method is used for linsolve.
  • linsolve: Any LinearSolve.jl compatible linear solver. For example, to use KLU.jl, specify ImplicitEulerBarycentricExtrapolation(linsolve = KLUFactorization()). When nothing is passed, uses DefaultLinearSolver.
  • max_order: maximum order of the adaptive order algorithm.
  • min_order: minimum order of the adaptive order algorithm.
  • init_order: initial order of the adaptive order algorithm.
  • thread: determines whether internal broadcasting on appropriate CPU arrays should be serial (thread = Serial()) or use multiple threads (thread = Threaded()) when Julia is started with multiple threads.
  • sequence: the step-number sequences, also called the subdividing sequence. Possible values are :harmonic, :romberg or :bulirsch.
  • sequence_factor: denotes which even multiple of sequence to take while evaluating internal discretizations.

References

@inproceedings{elrod2022parallelizing, title={Parallelizing explicit and implicit extrapolation methods for ordinary differential equations}, author={Elrod, Chris and Ma, Yingbo and Althaus, Konstantin and Rackauckas, Christopher and others}, booktitle={2022 IEEE High Performance Extreme Computing Conference (HPEC)}, pages={1–9}, year={2022}, organization={IEEE}}

source