use crate::{model::*, opti::*, utils::*}; use nalgebra::{base::*, ComplexField}; pub trait Solver, const D: usize> { fn f(&self, model: &M, x: Vect) -> Vect; } #[derive(Clone)] pub struct ExplicitEulerSolver> { pub dt: T, } impl, S: Settings, M: Model, const D: usize> Solver for ExplicitEulerSolver { fn f(&self, model: &M, x: Vect) -> Vect { model.f(x) * self.dt + x } } #[derive(Clone)] pub struct ImplicitEulerSolver> { pub dt: T, pub tol: T, pub niters: usize, } impl< T: Copy + ComplexField + PartialOrd, S: Settings, M: Model, const D: usize, > Solver for ImplicitEulerSolver where Const: ToTypenum + DimMin, Output = Const>, { fn f(&self, model: &M, x: Vect) -> Vect { newton(model, x, self.dt, self.tol, self.niters) } }