conspire/math/integrate/dae/explicit/variable_step/verner_9/
mod.rs1use crate::math::{
2 Banded, Scalar, Tensor, TensorVec, Vector,
3 integrate::{
4 ExplicitDaeVariableStep, IntegrationError, ode::explicit::variable_step::verner_9::*,
5 },
6 optimize::{
7 EqualityConstraint, FirstOrderOptimization, FirstOrderRootFinding, SecondOrderOptimization,
8 ZerothOrderRootFinding,
9 },
10};
11use std::ops::{Mul, Sub};
12
13impl<Y, Z, U, V> ExplicitDaeVariableStep<Y, Z, U, V> for Verner9
14where
15 Y: Tensor,
16 Z: Tensor,
17 U: TensorVec<Item = Y>,
18 V: TensorVec<Item = Z>,
19 for<'a> &'a Y: Mul<Scalar, Output = Y> + Sub<&'a Y, Output = Y>,
20{
21 fn slopes_solve(
22 mut evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
23 mut solution: impl FnMut(Scalar, &Y, &Z) -> Result<Z, String>,
24 y: &Y,
25 z: &Z,
26 t: Scalar,
27 dt: Scalar,
28 k: &mut [Y],
29 y_trial: &mut Y,
30 z_trial: &mut Z,
31 ) -> Result<(), String> {
32 k[0] = evolution(t, y, z)?;
33 *y_trial = &k[0] * (A_2_1 * dt) + y;
34 *z_trial = solution(t + C_2 * dt, y_trial, z)?;
35 k[1] = evolution(t + C_2 * dt, y_trial, z_trial)?;
36 *y_trial = &k[0] * (A_3_1 * dt) + &k[1] * (A_3_2 * dt) + y;
37 *z_trial = solution(t + C_3 * dt, y_trial, z_trial)?;
38 k[2] = evolution(t + C_3 * dt, y_trial, z_trial)?;
39 *y_trial = &k[0] * (A_4_1 * dt) + &k[2] * (A_4_3 * dt) + y;
40 *z_trial = solution(t + C_4 * dt, y_trial, z_trial)?;
41 k[3] = evolution(t + C_4 * dt, y_trial, z_trial)?;
42 *y_trial = &k[0] * (A_5_1 * dt) + &k[2] * (A_5_3 * dt) + &k[3] * (A_5_4 * dt) + y;
43 *z_trial = solution(t + C_5 * dt, y_trial, z_trial)?;
44 k[4] = evolution(t + C_5 * dt, y_trial, z_trial)?;
45 *y_trial = &k[0] * (A_6_1 * dt) + &k[3] * (A_6_4 * dt) + &k[4] * (A_6_5 * dt) + y;
46 *z_trial = solution(t + C_6 * dt, y_trial, z_trial)?;
47 k[5] = evolution(t + C_6 * dt, y_trial, z_trial)?;
48 *y_trial = &k[0] * (A_7_1 * dt)
49 + &k[3] * (A_7_4 * dt)
50 + &k[4] * (A_7_5 * dt)
51 + &k[5] * (A_7_6 * dt)
52 + y;
53 *z_trial = solution(t + C_7 * dt, y_trial, z_trial)?;
54 k[6] = evolution(t + C_7 * dt, y_trial, z_trial)?;
55 *y_trial = &k[0] * (A_8_1 * dt) + &k[5] * (A_8_6 * dt) + &k[6] * (A_8_7 * dt) + y;
56 *z_trial = solution(t + C_8 * dt, y_trial, z_trial)?;
57 k[7] = evolution(t + C_8 * dt, y_trial, z_trial)?;
58 *y_trial = &k[0] * (A_9_1 * dt)
59 + &k[5] * (A_9_6 * dt)
60 + &k[6] * (A_9_7 * dt)
61 + &k[7] * (A_9_8 * dt)
62 + y;
63 *z_trial = solution(t + C_9 * dt, y_trial, z_trial)?;
64 k[8] = evolution(t + C_9 * dt, y_trial, z_trial)?;
65 *y_trial = &k[0] * (A_10_1 * dt)
66 + &k[5] * (A_10_6 * dt)
67 + &k[6] * (A_10_7 * dt)
68 + &k[7] * (A_10_8 * dt)
69 + &k[8] * (A_10_9 * dt)
70 + y;
71 *z_trial = solution(t + C_10 * dt, y_trial, z_trial)?;
72 k[9] = evolution(t + C_10 * dt, y_trial, z_trial)?;
73 *y_trial = &k[0] * (A_11_1 * dt)
74 + &k[5] * (A_11_6 * dt)
75 + &k[6] * (A_11_7 * dt)
76 + &k[7] * (A_11_8 * dt)
77 + &k[8] * (A_11_9 * dt)
78 + &k[9] * (A_11_10 * dt)
79 + y;
80 *z_trial = solution(t + C_11 * dt, y_trial, z_trial)?;
81 k[10] = evolution(t + C_11 * dt, y_trial, z_trial)?;
82 *y_trial = &k[0] * (A_12_1 * dt)
83 + &k[5] * (A_12_6 * dt)
84 + &k[6] * (A_12_7 * dt)
85 + &k[7] * (A_12_8 * dt)
86 + &k[8] * (A_12_9 * dt)
87 + &k[9] * (A_12_10 * dt)
88 + &k[10] * (A_12_11 * dt)
89 + y;
90 *z_trial = solution(t + C_12 * dt, y_trial, z_trial)?;
91 k[11] = evolution(t + C_12 * dt, y_trial, z_trial)?;
92 *y_trial = &k[0] * (A_13_1 * dt)
93 + &k[5] * (A_13_6 * dt)
94 + &k[6] * (A_13_7 * dt)
95 + &k[7] * (A_13_8 * dt)
96 + &k[8] * (A_13_9 * dt)
97 + &k[9] * (A_13_10 * dt)
98 + &k[10] * (A_13_11 * dt)
99 + &k[11] * (A_13_12 * dt)
100 + y;
101 *z_trial = solution(t + C_13 * dt, y_trial, z_trial)?;
102 k[12] = evolution(t + C_13 * dt, y_trial, z_trial)?;
103 *y_trial = &k[0] * (A_14_1 * dt)
104 + &k[5] * (A_14_6 * dt)
105 + &k[6] * (A_14_7 * dt)
106 + &k[7] * (A_14_8 * dt)
107 + &k[8] * (A_14_9 * dt)
108 + &k[9] * (A_14_10 * dt)
109 + &k[10] * (A_14_11 * dt)
110 + &k[11] * (A_14_12 * dt)
111 + &k[12] * (A_14_13 * dt)
112 + y;
113 *z_trial = solution(t + C_14 * dt, y_trial, z_trial)?;
114 k[13] = evolution(t + C_14 * dt, y_trial, z_trial)?;
115 *y_trial = &k[0] * (A_15_1 * dt)
116 + &k[5] * (A_15_6 * dt)
117 + &k[6] * (A_15_7 * dt)
118 + &k[7] * (A_15_8 * dt)
119 + &k[8] * (A_15_9 * dt)
120 + &k[9] * (A_15_10 * dt)
121 + &k[10] * (A_15_11 * dt)
122 + &k[11] * (A_15_12 * dt)
123 + &k[12] * (A_15_13 * dt)
124 + &k[13] * (A_15_14 * dt)
125 + y;
126 *z_trial = solution(t + dt, y_trial, z_trial)?;
127 k[14] = evolution(t + dt, y_trial, z_trial)?;
128 *y_trial = &k[0] * (A_16_1 * dt)
129 + &k[5] * (A_16_6 * dt)
130 + &k[6] * (A_16_7 * dt)
131 + &k[7] * (A_16_8 * dt)
132 + &k[8] * (A_16_9 * dt)
133 + &k[9] * (A_16_10 * dt)
134 + &k[10] * (A_16_11 * dt)
135 + &k[11] * (A_16_12 * dt)
136 + &k[12] * (A_16_13 * dt)
137 + y;
138 *z_trial = solution(t + dt, y_trial, z_trial)?;
139 k[15] = evolution(t + dt, y_trial, z_trial)?;
140 *y_trial = (&k[0] * B_1
141 + &k[7] * B_8
142 + &k[8] * B_9
143 + &k[9] * B_10
144 + &k[10] * B_11
145 + &k[11] * B_12
146 + &k[12] * B_13
147 + &k[13] * B_14
148 + &k[14] * B_15)
149 * dt
150 + y;
151 *z_trial = solution(t + dt, y_trial, z_trial)?;
152 Ok(())
153 }
154}
155
156super::implement_solvers!(Verner9);