|
150 | 150 | (; t, dt, uprev, u, p, f) = integrator |
151 | 151 | g = integrator.f.g |
152 | 152 | (; z₁, z₂, z₃, z₄, k1, k2, k3, k4, atmp) = cache |
153 | | - (; g1, g4, chi2, nlsolver) = cache |
| 153 | + (; g1, g4, gtmp, chi2, nlsolver) = cache |
154 | 154 | (; z, tmp) = nlsolver |
155 | 155 | (; k, dz) = nlsolver.cache # alias to reduce memory |
156 | 156 | (; |
|
195 | 195 |
|
196 | 196 | ##### Step 2 |
197 | 197 |
|
198 | | - # TODO: Add a cache so this isn't overwritten near the end, so it can not repeat on fail |
199 | | - g(g1, uprev, p, t) |
| 198 | + if !repeat_step && !integrator.last_stepfail |
| 199 | + g(g1, uprev, p, t) |
| 200 | + end |
200 | 201 |
|
201 | 202 | if is_diagonal_noise(integrator.sol.prob) |
202 | 203 | @.. z₄ = chi2 * g1 # use z₄ as storage for the g1*chi2 |
|
255 | 256 | @.. u = tmp + γ * z₃ |
256 | 257 | f2(k3, u, p, t + c3 * dt) |
257 | 258 | k3 .*= dt |
258 | | - # z₄ is storage for the g1*chi2 from earlier |
259 | 259 | @.. tmp = uprev + a41 * z₁ + a42 * z₂ + a43 * z₃ + ea41 * k1 + ea42 * k2 + ea43 * k3 + nb043 * z₄ |
260 | 260 | else |
261 | 261 | (; α41, α42) = cache.tab |
262 | | - # z₄ is storage for the g1*chi2 |
263 | 262 | @.. tmp = uprev + a41 * z₁ + a42 * z₂ + a43 * z₃ + nb043 * z₄ |
264 | 263 | end |
265 | 264 |
|
|
285 | 284 | @.. u = uprev + a41 * z₁ + a42 * z₂ + a43 * z₃ + γ * z₄ + eb1 * k1 + eb2 * k2 + eb3 * k3 + |
286 | 285 | eb4 * k4 + integrator.W.dW * g4 + E₂ |
287 | 286 | else |
288 | | - g1 .-= g4 |
289 | | - mul!(E₂, g1, chi2) |
| 287 | + @.. gtmp = g1 - g4 |
| 288 | + mul!(E₂, gtmp, chi2) |
290 | 289 | mul!(tmp, g4, integrator.W.dW) |
291 | 290 | @.. u = uprev + a41 * z₁ + a42 * z₂ + a43 * z₃ + γ * z₄ + eb1 * k1 + eb2 * k2 + eb3 * k3 + |
292 | 291 | eb4 * k4 + tmp + E₂ |
|
296 | 295 | @.. E₂ = chi2 * (g1 - g4) |
297 | 296 | @.. u = uprev + a41 * z₁ + a42 * z₂ + a43 * z₃ + γ * z₄ + integrator.W.dW * g4 + E₂ |
298 | 297 | else |
299 | | - g1 .-= g4 |
300 | | - mul!(E₂, g1, chi2) |
| 298 | + @.. gtmp = g1 - g4 |
| 299 | + mul!(E₂, gtmp, chi2) |
301 | 300 | mul!(tmp, g4, integrator.W.dW) |
302 | 301 | @.. u = uprev + a41 * z₁ + a42 * z₂ + a43 * z₃ + γ * z₄ + tmp + E₂ |
303 | 302 | end |
|
0 commit comments