Classical time stepping with IrksomeΒΆ
Irksome generates Runge-Kutta methods for semi-discrete Firedrake UFL forms. It can provide the classical time integrator while Yonderdrake provides a spatial fractional operator:
import firedrake as fd
import irksome
from yonderdrake import SpectralFractionalLaplacian
mesh = fd.UnitSquareMesh(24, 24)
V = fd.FunctionSpace(mesh, "CG", 1)
u = fd.Function(V)
v = fd.TestFunction(V)
t = fd.Constant(0.0)
dt = fd.Constant(0.01)
bc = fd.DirichletBC(V, 0.0, "on_boundary")
F = (
fd.inner(irksome.Dt(u), v)
+ fd.inner(
SpectralFractionalLaplacian(u, 0.7, bcs=bc),
v,
)
) * fd.dx
stepper = irksome.TimeStepper(
F,
irksome.GaussLegendre(1),
t,
dt,
u,
bcs=bc,
solver_parameters={
"mat_type": "matfree",
"snes_type": "ksponly",
"ksp_type": "gmres",
},
)
stepper.advance()
Irksome transforms Dt(u). The external operator supplies its action and
derivative. Use a matrix-free Jacobian for this composition, as in the example
above.
Irksome is optional and does not evolve fractional memory: it supplies the
classical time integrator only. Use FractionalTimeStepper when the residual
contains a fractional time marker. The
Gallery shows both compositions.
See the Irksome repository for installation and its complete time-stepping interface.