mod apcf4;
mod apcv4;
use std::marker::PhantomData;
use crate::{
status::Status,
traits::{Real, State},
};
pub struct AdamsPredictorCorrector<E, F, T: Real, Y: State<T>, const S: usize> {
pub h0: T,
h: T,
t: T,
y: Y,
dydt: Y,
tf: T,
t_prev: [T; S],
y_prev: [Y; S],
t_old: T,
y_old: Y,
dydt_old: Y,
k: [Y; S],
evals: usize,
steps: usize,
status: Status<T, Y>,
pub tol: T,
pub h_max: T,
pub h_min: T,
pub max_steps: usize,
pub filter: fn(T) -> T,
pub stages: usize,
family: PhantomData<F>,
equation: PhantomData<E>,
}
impl<E, F, T: Real, Y: State<T>, const S: usize> Default
for AdamsPredictorCorrector<E, F, T, Y, S>
{
fn default() -> Self {
Self {
h0: T::zero(),
h: T::zero(),
t: T::zero(),
y: Y::zeros(),
dydt: Y::zeros(),
t_prev: [T::zero(); S],
y_prev: [Y::zeros(); S],
t_old: T::zero(),
y_old: Y::zeros(),
dydt_old: Y::zeros(),
k: [Y::zeros(); S],
tf: T::zero(),
evals: 0,
steps: 0,
status: Status::Uninitialized,
tol: T::from_f64(1.0e-6).unwrap(),
h_max: T::infinity(),
h_min: T::zero(),
max_steps: 10_000,
filter: |h| h,
stages: S,
family: PhantomData,
equation: PhantomData,
}
}
}
impl<E, F, T: Real, Y: State<T>, const S: usize> AdamsPredictorCorrector<E, F, T, Y, S> {
pub fn tol(mut self, rtol: T) -> Self {
self.tol = rtol;
self
}
pub fn h0(mut self, h0: T) -> Self {
self.h0 = h0;
self
}
pub fn h_min(mut self, h_min: T) -> Self {
self.h_min = h_min;
self
}
pub fn h_max(mut self, h_max: T) -> Self {
self.h_max = h_max;
self
}
pub fn max_steps(mut self, max_steps: usize) -> Self {
self.max_steps = max_steps;
self
}
pub fn filter(mut self, filter: fn(T) -> T) -> Self {
self.filter = filter;
self
}
pub fn stages(&self) -> usize {
self.stages
}
}