conspire/math/integrate/ode/explicit/fixed_step/verner_8/
mod.rs1#[cfg(test)]
2mod test;
3
4use crate::math::{
5 Derivative, Differentiate, Quantity, Scalar, Tensor, TensorVec,
6 integrate::{
7 Explicit, FixedStep, FixedStepExplicit, IntegrationError, OdeIntegrator, Times,
8 VariableStepExplicit, Verner8 as Verner8VariableStep,
9 },
10};
11use std::ops::{Mul, Sub};
12
13#[doc = include_str!("doc.md")]
14#[derive(Debug, Default)]
15pub struct Verner8 {
16 dt: Scalar,
18}
19
20impl<Y, U> OdeIntegrator<Y, U> for Verner8
21where
22 Y: Tensor,
23 U: TensorVec<Item = Y>,
24{
25}
26
27impl<T> FixedStep<T> for Verner8 {
28 fn dt(&self) -> Quantity<T> {
29 Quantity::new(self.dt)
30 }
31}
32
33impl<Y, U, V, T> Explicit<Y, U, V, T> for Verner8
34where
35 Y: Differentiate<T> + Tensor,
36 Derivative<Y, T>: Mul<Quantity<T>, Output = Y>,
37 for<'a> &'a Y: Mul<Scalar, Output = Y> + Sub<&'a Y, Output = Y>,
38 for<'a> &'a Derivative<Y, T>:
39 Mul<Scalar, Output = Derivative<Y, T>> + Mul<Quantity<T>, Output = Y>,
40 U: TensorVec<Item = Y>,
41 V: TensorVec<Item = Derivative<Y, T>>,
42{
43 const SLOPES: usize = 12;
44 fn integrate(
45 &self,
46 function: impl FnMut(Quantity<T>, &Y) -> Result<Derivative<Y, T>, String>,
47 time: &[Quantity<T>],
48 initial_condition: Y,
49 ) -> Result<(Times<T>, U, V), IntegrationError> {
50 self.integrate_fixed_step(function, time, initial_condition)
51 }
52}
53
54impl<Y, U, V, T> FixedStepExplicit<Y, U, V, T> for Verner8
55where
56 Verner8VariableStep: VariableStepExplicit<Y, U, V, T>,
57 Y: Differentiate<T> + Tensor,
58 Derivative<Y, T>: Mul<Quantity<T>, Output = Y>,
59 for<'a> &'a Y: Mul<Scalar, Output = Y> + Sub<&'a Y, Output = Y>,
60 for<'a> &'a Derivative<Y, T>:
61 Mul<Scalar, Output = Derivative<Y, T>> + Mul<Quantity<T>, Output = Y>,
62 U: TensorVec<Item = Y>,
63 V: TensorVec<Item = Derivative<Y, T>>,
64{
65 fn step(
66 &self,
67 function: impl FnMut(Quantity<T>, &Y) -> Result<Derivative<Y, T>, String>,
68 y: &Y,
69 t: Quantity<T>,
70 dt: Quantity<T>,
71 k: &mut [Derivative<Y, T>],
72 y_trial: &mut Y,
73 ) -> Result<(), String> {
74 Verner8VariableStep::slopes(function, y, t, dt, k, y_trial)
75 }
76}