Source code for sksundae.ida._jactimes
# ida._jactimes.py
from __future__ import annotations
from typing import Callable
[docs]
class IDAJacTimes:
"""Jacobian-vector product."""
__slots__ = ('setupfn', 'solvefn')
def __init__(self, setupfn: Callable | None, solvefn: Callable) -> None:
"""
Wrapper for passing Jacobian-vector product functions to IDA. The
Jacobian-vector product interface is only supported by iterative solvers
(gmres, bicgstab, tfqmr).
Parameters
----------
setupfn : Callable or None
A function to setup data before solving the Jacobian-vector product.
Use None if not needed. The required signature is in the notes.
solvefn : Callable
A function that solves for the Jacobian-vector product `J*v` (or
an approximation to it). The required signature is in the notes.
Raises
------
TypeError
'setupfn' must be type Callable or None.
TypeError
'solvefn' must be type Callable.
Notes
-----
The solve and setup functions require specific function signatures. For
'solvefn' use `f(t, y, yp, res, v, Jv, cj[, userdata])`. Any return
values are ignored. Instead, the function should fill the pre-allocated
memory for 'Jv' (a 1D array) with the solution (or approximation) to
`J*v`. Use `[:]` to fill the array rather than overwriting it. For
example, `Jv[:] = f(...)` is correct whereas `Jv = f(...)` is not.
The user is responsible for managing their own Jacobian data if needed.
'setupfn' can be used to help setup any needed values/data so that
'solvefn' is not overly complex.
'setupfn' requires the signature `f(t, y, yp, res, cj[, userdata])`.
As with 'solvefn', any return values are ignored. However, you can use
the function to define global variables or add them to `userdata` so
they can be passed to 'solvefn'. The order of function calls is always
'resfn' -> 'setupfn' -> 'solvefn' for each integration step.
"""
if setupfn is None:
pass
elif not isinstance(setupfn, Callable):
raise TypeError("'setupfn' must be type Callable.")
if not isinstance(solvefn, Callable):
raise TypeError("'solvefn' must be type Callable.")
self.setupfn = setupfn
self.solvefn = solvefn