OrdinaryDiffEqOperatorSplitting.jl is a component package in the DifferentialEquations ecosystem. It holds operator splitting solvers and utilities.
Assuming that you already have Julia correctly installed, it suffices to import OrdinaryDiffEqOperatorSplitting.jl in the standard way:
import Pkg;
Pkg.add("OrdinaryDiffEqOperatorSplitting");
OrdinaryDiffEqOperatorSplitting.jl is part of the SciML common interface. The only requirement is that the user passes an algorithm
compatible to the corresponding function to solve
. For example, we can solve a simple split problem using the Euler()
algorithm
for each subproblem with the LieTrotterGodunov
algorithm, by defining a problem tree and an analogue solver tree via tuples:
using OrdinaryDiffEqLowOrderRK, OrdinaryDiffEqOperatorSplitting
# This is the true, full ODE.
function ode_true(du, u, p, t)
du .-= 0.1u
du[1] -= 0.01u[3]
du[3] -= 0.01u[1]
end
# This is the first operator of the ODE.
function ode1(du, u, p, t)
@. du = -0.1u
end
f1 = ODEFunction(ode1)
f1dofs = [1,2,3]
# This is the second operator of the ODE.
function ode2(du, u, p, t)
du[1] = -0.01u[2]
du[2] = -0.01u[1]
end
f2 = ODEFunction(ode2)
f2dofs = [1,3]
# This defines the split of the ODE.
f = GenericSplitFunction((f1, f2), (f1dofs, f2dofs))
# Next we can define the split problem.
u0 = [-1.0, 1.0, 0.0]
tspan = (0.0, 1.0)
prob = OperatorSplittingProblem(f, u0, tspan)
# And the time integration algorithm.
alg = LieTrotterGodunov(
(Euler(), Euler())
)
# Right now OrdinaryDiffEqOperatorSplitting.jl does not implement the SciML solution interface,
# but we can only intermediate solutions via the iterator interface.
integrator = init(prob, alg, dt=0.1)
for (u, t) in TimeChoiceIterator(integrator, 0.0:0.5:1.0)
@show t, u
end
For the list of available solvers, please refer to the OrdinaryDiffEqOperatorSplitting.jl Solvers pages.