Source code for openpnm.integrators._scipy

from scipy.integrate import solve_ivp

from openpnm.algorithms._solution import TransientSolution
from openpnm.integrators import Integrator

__all__ = ['ScipyRK45']


[docs] class ScipyRK45(Integrator): """Integrator class based on SciPy's implementation of RK45""" def __init__(self, atol=1e-6, rtol=1e-6, verbose=False, linsolver=None): self.atol = atol self.rtol = rtol self.verbose = verbose self.linsolver = linsolver
[docs] def solve(self, rhs, x0, tspan, saveat, **kwargs): """ Solves the system of ODEs defined by dy/dt = rhs(t, y). Parameters ---------- rhs : function handle RHS vector in the system of ODEs defined by dy/dt = rhs(t, y) x0 : array_like Initial value for the system of ODEs tspan : array_like 2-element tuple (or array) representing the timespan for the system of ODEs saveat : float or array_like If float, defines the time interval at which the solution is to be stored. If array_like, defines the time points at which the solution is to be stored. **kwargs : keyword arguments Other keyword arguments that might get used by the integrator Returns ------- TransientSolution Solution of the system of ODEs stored in a subclass of numpy's ndarray with some added functionalities (ex. you can get the solution at intermediate time points via: y = soln(t_i)). """ options = { "atol": self.atol, "rtol": self.rtol, "t_eval": saveat, # FIXME: uncomment next line when/if scipy#11815 is merged # "verbose": self.verbose, } sol = solve_ivp(rhs, tspan, x0, method="RK45", **options) if sol.success: return TransientSolution(sol.t, sol.y) raise Exception(sol.message)