conspire/math/integrate/dae/explicit/variable_step/verner_8/
mod.rs1use crate::math::{
2 Derivative, Differentiate, Quantity, Scalar, Tensor, TensorVec,
3 integrate::{ExplicitDaeVariableStepExplicit, ode::explicit::variable_step::verner_8::*},
4};
5use std::ops::{Mul, Sub};
6
7impl<Y, Z, U, V, W, T> ExplicitDaeVariableStepExplicit<Y, Z, U, V, W, T> for Verner8
8where
9 Y: Differentiate<T> + Tensor,
10 Z: PartialEq + Tensor,
11 Derivative<Y, T>: Mul<Quantity<T>, Output = Y>,
12 U: TensorVec<Item = Y>,
13 V: TensorVec<Item = Z>,
14 W: TensorVec<Item = Derivative<Y, T>>,
15 for<'a> &'a Y: Mul<Scalar, Output = Y> + Sub<&'a Y, Output = Y>,
16 for<'a> &'a Derivative<Y, T>:
17 Mul<Scalar, Output = Derivative<Y, T>> + Mul<Quantity<T>, Output = Y>,
18{
19 fn slopes_solve(
20 mut evolution: impl FnMut(Quantity<T>, &Y, &Z) -> Result<Derivative<Y, T>, String>,
21 mut solution: impl FnMut(Quantity<T>, &Y, &Z) -> Result<Z, String>,
22 y: &Y,
23 z: &Z,
24 t: Quantity<T>,
25 dt: Quantity<T>,
26 k: &mut [Derivative<Y, T>],
27 y_trial: &mut Y,
28 z_trial: &mut Z,
29 ) -> Result<(), String> {
30 k[0] = evolution(t, y, z)?;
31 *y_trial = &k[0] * (A_2_1 * dt) + y;
32 *z_trial = solution(t + C_2 * dt, y_trial, z)?;
33 k[1] = evolution(t + C_2 * dt, y_trial, z_trial)?;
34 *y_trial = &k[0] * (A_3_1 * dt) + &k[1] * (A_3_2 * dt) + y;
35 *z_trial = solution(t + C_3 * dt, y_trial, z_trial)?;
36 k[2] = evolution(t + C_3 * dt, y_trial, z_trial)?;
37 *y_trial = &k[0] * (A_4_1 * dt) + &k[2] * (A_4_3 * dt) + y;
38 *z_trial = solution(t + C_4 * dt, y_trial, z_trial)?;
39 k[3] = evolution(t + C_4 * dt, y_trial, z_trial)?;
40 *y_trial = &k[0] * (A_5_1 * dt) + &k[2] * (A_5_3 * dt) + &k[3] * (A_5_4 * dt) + y;
41 *z_trial = solution(t + C_5 * dt, y_trial, z_trial)?;
42 k[4] = evolution(t + C_5 * dt, y_trial, z_trial)?;
43 *y_trial = &k[0] * (A_6_1 * dt) + &k[3] * (A_6_4 * dt) + &k[4] * (A_6_5 * dt) + y;
44 *z_trial = solution(t + C_6 * dt, y_trial, z_trial)?;
45 k[5] = evolution(t + C_6 * dt, y_trial, z_trial)?;
46 *y_trial = &k[0] * (A_7_1 * dt)
47 + &k[3] * (A_7_4 * dt)
48 + &k[4] * (A_7_5 * dt)
49 + &k[5] * (A_7_6 * dt)
50 + y;
51 *z_trial = solution(t + C_7 * dt, y_trial, z_trial)?;
52 k[6] = evolution(t + C_7 * dt, y_trial, z_trial)?;
53 *y_trial = &k[0] * (A_8_1 * dt)
54 + &k[3] * (A_8_4 * dt)
55 + &k[4] * (A_8_5 * dt)
56 + &k[5] * (A_8_6 * dt)
57 + &k[6] * (A_8_7 * dt)
58 + y;
59 *z_trial = solution(t + C_8 * dt, y_trial, z_trial)?;
60 k[7] = evolution(t + C_8 * dt, y_trial, z_trial)?;
61 *y_trial = &k[0] * (A_9_1 * dt)
62 + &k[3] * (A_9_4 * dt)
63 + &k[4] * (A_9_5 * dt)
64 + &k[5] * (A_9_6 * dt)
65 + &k[6] * (A_9_7 * dt)
66 + &k[7] * (A_9_8 * dt)
67 + y;
68 *z_trial = solution(t + C_9 * dt, y_trial, z_trial)?;
69 k[8] = evolution(t + C_9 * dt, y_trial, z_trial)?;
70 *y_trial = &k[0] * (A_10_1 * dt)
71 + &k[3] * (A_10_4 * dt)
72 + &k[4] * (A_10_5 * dt)
73 + &k[5] * (A_10_6 * dt)
74 + &k[6] * (A_10_7 * dt)
75 + &k[7] * (A_10_8 * dt)
76 + &k[8] * (A_10_9 * dt)
77 + y;
78 *z_trial = solution(t + C_10 * dt, y_trial, z_trial)?;
79 k[9] = evolution(t + C_10 * dt, y_trial, z_trial)?;
80 *y_trial = &k[0] * (A_11_1 * dt)
81 + &k[3] * (A_11_4 * dt)
82 + &k[4] * (A_11_5 * dt)
83 + &k[5] * (A_11_6 * dt)
84 + &k[6] * (A_11_7 * dt)
85 + &k[7] * (A_11_8 * dt)
86 + &k[8] * (A_11_9 * dt)
87 + &k[9] * (A_11_10 * dt)
88 + y;
89 *z_trial = solution(t + C_11 * dt, y_trial, z_trial)?;
90 k[10] = evolution(t + C_11 * dt, y_trial, z_trial)?;
91 *y_trial = &k[0] * (A_12_1 * dt)
92 + &k[3] * (A_12_4 * dt)
93 + &k[4] * (A_12_5 * dt)
94 + &k[5] * (A_12_6 * dt)
95 + &k[6] * (A_12_7 * dt)
96 + &k[7] * (A_12_8 * dt)
97 + &k[8] * (A_12_9 * dt)
98 + &k[9] * (A_12_10 * dt)
99 + &k[10] * (A_12_11 * dt)
100 + y;
101 *z_trial = solution(t + dt, y_trial, z_trial)?;
102 k[11] = evolution(t + dt, y_trial, z_trial)?;
103 *y_trial = &k[0] * (A_13_1 * dt)
104 + &k[3] * (A_13_4 * dt)
105 + &k[4] * (A_13_5 * dt)
106 + &k[5] * (A_13_6 * dt)
107 + &k[6] * (A_13_7 * dt)
108 + &k[7] * (A_13_8 * dt)
109 + &k[8] * (A_13_9 * dt)
110 + &k[9] * (A_13_10 * dt)
111 + y;
112 *z_trial = solution(t + dt, y_trial, z_trial)?;
113 k[12] = evolution(t + dt, y_trial, z_trial)?;
114 *y_trial = (&k[0] * B_1
115 + &k[5] * B_6
116 + &k[6] * B_7
117 + &k[7] * B_8
118 + &k[8] * B_9
119 + &k[9] * B_10
120 + &k[10] * B_11
121 + &k[11] * B_12)
122 * dt
123 + y;
124 *z_trial = solution(t + dt, y_trial, z_trial)?;
125 Ok(())
126 }
127}