@@ -81,89 +81,50 @@ class RK45Integrator : public AdaptiveIntegrator<S> {
8181 constexpr time_type c4_4 = static_cast <time_type>(393.0 /640.0 );
8282 constexpr time_type c5_4 = static_cast <time_type>(-92097.0 /339200.0 );
8383 constexpr time_type c6_4 = static_cast <time_type>(187.0 /2100.0 );
84- constexpr time_type c7_4 = static_cast <time_type>( 1.0 /40.0 );
84+ // Note: c7_4 = 1.0/40.0 is not used in RK45 (only in RK45 with FSAL)
8585
8686 // k1 = f(t, y)
8787 this ->sys_ (this ->current_time_ , state, k1);
8888
8989 // k2 = f(t + a2*dt, y + dt*(b21*k1))
9090 for (std::size_t i = 0 ; i < state.size (); ++i) {
91- auto state_it = state.begin ();
92- auto k1_it = k1.begin ();
93- auto temp_it = temp_state.begin ();
94- temp_it[i] = state_it[i] + dt * b21 * k1_it[i];
91+ temp_state[i] = state[i] + dt * b21 * k1[i];
9592 }
9693 this ->sys_ (this ->current_time_ + a2 * dt, temp_state, k2);
9794
9895 // k3 = f(t + a3*dt, y + dt*(b31*k1 + b32*k2))
9996 for (std::size_t i = 0 ; i < state.size (); ++i) {
100- auto state_it = state.begin ();
101- auto k1_it = k1.begin ();
102- auto k2_it = k2.begin ();
103- auto temp_it = temp_state.begin ();
104- temp_it[i] = state_it[i] + dt * (b31 * k1_it[i] + b32 * k2_it[i]);
97+ temp_state[i] = state[i] + dt * (b31 * k1[i] + b32 * k2[i]);
10598 }
10699 this ->sys_ (this ->current_time_ + a3 * dt, temp_state, k3);
107100
108101 // k4 = f(t + a4*dt, y + dt*(b41*k1 + b42*k2 + b43*k3))
109102 for (std::size_t i = 0 ; i < state.size (); ++i) {
110- auto state_it = state.begin ();
111- auto k1_it = k1.begin ();
112- auto k2_it = k2.begin ();
113- auto k3_it = k3.begin ();
114- auto temp_it = temp_state.begin ();
115- temp_it[i] = state_it[i] + dt * (b41 * k1_it[i] + b42 * k2_it[i] + b43 * k3_it[i]);
103+ temp_state[i] = state[i] + dt * (b41 * k1[i] + b42 * k2[i] + b43 * k3[i]);
116104 }
117105 this ->sys_ (this ->current_time_ + a4 * dt, temp_state, k4);
118106
119107 // k5 = f(t + a5*dt, y + dt*(b51*k1 + b52*k2 + b53*k3 + b54*k4))
120108 for (std::size_t i = 0 ; i < state.size (); ++i) {
121- auto state_it = state.begin ();
122- auto k1_it = k1.begin ();
123- auto k2_it = k2.begin ();
124- auto k3_it = k3.begin ();
125- auto k4_it = k4.begin ();
126- auto temp_it = temp_state.begin ();
127- temp_it[i] = state_it[i] + dt * (b51 * k1_it[i] + b52 * k2_it[i] + b53 * k3_it[i] + b54 * k4_it[i]);
109+ temp_state[i] = state[i] + dt * (b51 * k1[i] + b52 * k2[i] + b53 * k3[i] + b54 * k4[i]);
128110 }
129111 this ->sys_ (this ->current_time_ + a5 * dt, temp_state, k5);
130112
131113 // k6 = f(t + dt, y + dt*(b61*k1 + b62*k2 + b63*k3 + b64*k4 + b65*k5))
132114 for (std::size_t i = 0 ; i < state.size (); ++i) {
133- auto state_it = state.begin ();
134- auto k1_it = k1.begin ();
135- auto k2_it = k2.begin ();
136- auto k3_it = k3.begin ();
137- auto k4_it = k4.begin ();
138- auto k5_it = k5.begin ();
139- auto temp_it = temp_state.begin ();
140- temp_it[i] = state_it[i] + dt * (b61 * k1_it[i] + b62 * k2_it[i] + b63 * k3_it[i] + b64 * k4_it[i] + b65 * k5_it[i]);
115+ temp_state[i] = state[i] + dt * (b61 * k1[i] + b62 * k2[i] + b63 * k3[i] + b64 * k4[i] + b65 * k5[i]);
141116 }
142117 this ->sys_ (this ->current_time_ + dt, temp_state, k6);
143118
144119 // 5th order solution: y_new = y + dt*(c1*k1 + c3*k3 + c4*k4 + c5*k5 + c6*k6)
145120 for (std::size_t i = 0 ; i < state.size (); ++i) {
146- auto state_it = state.begin ();
147- auto k1_it = k1.begin ();
148- auto k3_it = k3.begin ();
149- auto k4_it = k4.begin ();
150- auto k5_it = k5.begin ();
151- auto k6_it = k6.begin ();
152- auto y_new_it = y_new.begin ();
153- y_new_it[i] = state_it[i] + dt * (c1 * k1_it[i] + c3 * k3_it[i] + c4 * k4_it[i] + c5 * k5_it[i] + c6 * k6_it[i]);
121+ y_new[i] = state[i] + dt * (c1 * k1[i] + c3 * k3[i] + c4 * k4[i] + c5 * k5[i] + c6 * k6[i]);
154122 }
155123
156124 // 4th order solution for error estimation
157125 for (std::size_t i = 0 ; i < state.size (); ++i) {
158- auto state_it = state.begin ();
159- auto k1_it = k1.begin ();
160- auto k3_it = k3.begin ();
161- auto k4_it = k4.begin ();
162- auto k5_it = k5.begin ();
163- auto k6_it = k6.begin ();
164- auto error_it = error.begin ();
165- error_it[i] = dt * ((c1 - c1_4) * k1_it[i] + (c3 - c3_4) * k3_it[i] + (c4 - c4_4) * k4_it[i] +
166- (c5 - c5_4) * k5_it[i] + (c6 - c6_4) * k6_it[i]);
126+ error[i] = dt * ((c1 - c1_4) * k1[i] + (c3 - c3_4) * k3[i] + (c4 - c4_4) * k4[i] +
127+ (c5 - c5_4) * k5[i] + (c6 - c6_4) * k6[i]);
167128 }
168129
169130 // Calculate error norm
0 commit comments