diffsol 0.16.1

A library for solving ordinary differential equations (ODEs) in Rust.
Documentation
use diffsol::matrix::MatrixRef;
use diffsol::vector::VectorRef;
use diffsol::LinearSolver;
use diffsol::{
    DefaultDenseMatrix, DefaultSolver, Matrix, OdeEquationsImplicit, OdeSolverMethod,
    OdeSolverProblem,
};

macro_rules! bench_implicit {
    ($g:ident, $name:ident, $solver:ident, $ls:ident, $problem:ident, $m:ty) => {
        $g.bench_function(stringify!($name), |b| {
            b.iter(|| {
                let (problem, soln) = $problem::<$m>(false);
                let t_evals = soln
                    .solution_points
                    .iter()
                    .map(|sp| sp.t)
                    .collect::<Vec<_>>();
                $crate::common::$solver::<_, $ls<_>>(&problem, &t_evals);
            })
        });
    };
}
pub(crate) use bench_implicit;

macro_rules! bench_implicit_cg {
    ($g:ident, $name:ident, $solver:ident, $ls:ident, $problem:ident, $m:ty, $($N:expr),+ $(,)?) => {
        $(
            $g.bench_function(concat!(stringify!($name), "_", $N), |b| {
                b.iter(|| {
                    let (problem, soln) = $problem::<$m, $N>();
                    let t_evals = soln
                        .solution_points
                        .iter()
                        .map(|sp| sp.t)
                        .collect::<Vec<_>>();
                    $crate::common::$solver::<_, $ls<_>>(&problem, &t_evals);
                })
            });
        )+
    };
}
pub(crate) use bench_implicit_cg;

macro_rules! bench_implicit_rt {
    ($g:ident, $name:ident, $solver:ident, $ls:ident, $problem:ident, $m:ty, $($N:expr),+ $(,)?) => {
        $(
            $g.bench_function(concat!(stringify!($name), "_", $N), |b| {
                b.iter(|| {
                    let (problem, soln) = $problem::<$m>(false, $N);
                    let t_evals = soln
                        .solution_points
                        .iter()
                        .map(|sp| sp.t)
                        .collect::<Vec<_>>();
                    $crate::common::$solver::<_, $ls<_>>(&problem, &t_evals);
                })
            });
        )+
    };
}
pub(crate) use bench_implicit_rt;

macro_rules! bench_explicit {
    ($g:ident, $name:ident, $solver:ident, $problem:ident, $m:ty) => {
        $g.bench_function(stringify!($name), |b| {
            b.iter(|| {
                let (problem, soln) = $problem::<$m>(false);
                let t_evals = soln
                    .solution_points
                    .iter()
                    .map(|sp| sp.t)
                    .collect::<Vec<_>>();
                $crate::common::$solver::<_>(&problem, &t_evals);
            })
        });
    };
}
pub(crate) use bench_explicit;

pub(crate) fn bdf<Eqn, LS>(problem: &OdeSolverProblem<Eqn>, t_evals: &[Eqn::T])
where
    Eqn: OdeEquationsImplicit,
    Eqn::M: Matrix + DefaultSolver,
    Eqn::V: DefaultDenseMatrix,
    LS: LinearSolver<Eqn::M>,
    for<'a> &'a Eqn::V: VectorRef<Eqn::V>,
    for<'a> &'a Eqn::M: MatrixRef<Eqn::M>,
{
    let mut s = problem.bdf::<LS>().unwrap();
    let _y = s.solve_dense(t_evals);
}

pub(crate) fn esdirk34<Eqn, LS>(problem: &OdeSolverProblem<Eqn>, t_evals: &[Eqn::T])
where
    Eqn: OdeEquationsImplicit,
    Eqn::M: Matrix + DefaultSolver,
    Eqn::V: DefaultDenseMatrix,
    LS: LinearSolver<Eqn::M>,
    for<'a> &'a Eqn::V: VectorRef<Eqn::V>,
    for<'a> &'a Eqn::M: MatrixRef<Eqn::M>,
{
    let mut s = problem.esdirk34::<LS>().unwrap();
    let _y = s.solve_dense(t_evals);
}

pub(crate) fn tr_bdf2<Eqn, LS>(problem: &OdeSolverProblem<Eqn>, t_evals: &[Eqn::T])
where
    Eqn: OdeEquationsImplicit,
    Eqn::M: Matrix + DefaultSolver,
    Eqn::V: DefaultDenseMatrix,
    LS: LinearSolver<Eqn::M>,
    for<'a> &'a Eqn::V: VectorRef<Eqn::V>,
    for<'a> &'a Eqn::M: MatrixRef<Eqn::M>,
{
    let mut s = problem.tr_bdf2::<LS>().unwrap();
    let _y = s.solve_dense(t_evals);
}

pub(crate) fn tsit45<Eqn>(problem: &OdeSolverProblem<Eqn>, t_evals: &[Eqn::T])
where
    Eqn: OdeEquationsImplicit,
    Eqn::M: Matrix + DefaultSolver,
    Eqn::V: DefaultDenseMatrix,
    for<'a> &'a Eqn::V: VectorRef<Eqn::V>,
    for<'a> &'a Eqn::M: MatrixRef<Eqn::M>,
{
    let mut s = problem.tsit45().unwrap();
    let _y = s.solve_dense(t_evals);
}