@@ -77,223 +77,56 @@ function perform_step!(integrator, cache::LowStorageRK3SCache, repeat_step = fal
7777 return _perform_step_iip! (integrator, cache, cache. tab)
7878end
7979
80- # 3S+ low storage methods: 3S methods adding another memory location for the embedded method (non-FSAL version)
8180function initialize! (integrator, cache:: LowStorageRK3SpConstantCache )
82- integrator. fsalfirst = integrator. f (integrator. uprev, integrator. p, integrator. t) # Pre-start fsal
81+ integrator. fsalfirst = integrator. f (integrator. uprev, integrator. p, integrator. t)
8382 OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
8483 integrator. kshortsize = 1
8584 integrator. k = typeof (integrator. k)(undef, integrator. kshortsize)
86-
87- # Avoid undefined entries if k is an array of arrays
8885 integrator. fsallast = zero (integrator. fsalfirst)
8986 return integrator. k[1 ] = integrator. fsalfirst
9087end
9188
92- @muladd function perform_step! (
93- integrator, cache:: LowStorageRK3SpConstantCache ,
94- repeat_step = false
95- )
96- (; t, dt, uprev, u, f, p) = integrator
97- (; γ12end, γ22end, γ32end, δ2end, β1, β2end, c2end, bhat1, bhat2end) = cache
98-
99- # u1
100- integrator. fsalfirst = f (uprev, p, t)
101- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
102- integrator. k[1 ] = integrator. fsalfirst
103- tmp = uprev
104- u = tmp + β1 * dt * integrator. fsalfirst
105- # Initialize utilde for JET
106- utilde = u
107- if integrator. opts. adaptive
108- utilde = bhat1 * dt * integrator. fsalfirst
109- end
110-
111- # other stages
112- for i in eachindex (γ12end)
113- k = f (u, p, t + c2end[i] * dt)
114- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
115- tmp = tmp + δ2end[i] * u
116- u = γ12end[i] * u + γ22end[i] * tmp + γ32end[i] * uprev + β2end[i] * dt * k
117- if integrator. opts. adaptive
118- utilde = utilde + bhat2end[i] * dt * k
119- end
120- end
121-
122- if integrator. opts. adaptive
123- atmp = calculate_residuals (
124- utilde, uprev, u, integrator. opts. abstol,
125- integrator. opts. reltol, integrator. opts. internalnorm, t
126- )
127- OrdinaryDiffEqCore. set_EEst! (integrator, integrator. opts. internalnorm (atmp, t))
128- end
129-
130- integrator. u = u
89+ function perform_step! (integrator, cache:: LowStorageRK3SpConstantCache , repeat_step = false )
90+ return _perform_step_oop! (integrator, cache)
13191end
13292
13393function initialize! (integrator, cache:: LowStorageRK3SpCache )
134- (; k, fsalfirst) = cache
135-
13694 integrator. kshortsize = 1
13795 resize! (integrator. k, integrator. kshortsize)
13896 return integrator. k[1 ] = integrator. fsalfirst
13997end
14098
141- @muladd function perform_step! (integrator, cache:: LowStorageRK3SpCache , repeat_step = false )
142- (; t, dt, uprev, u, f, p) = integrator
143- (; k, tmp, utilde, atmp, stage_limiter!, step_limiter!, thread) = cache
144- (; γ12end, γ22end, γ32end, δ2end, β1, β2end, c2end, bhat1, bhat2end) = cache. tab
145-
146- # u1
147- f (integrator. fsalfirst, uprev, p, t)
148- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
149- @. . broadcast = false thread = thread tmp = uprev
150- @. . broadcast = false thread = thread u = tmp + β1 * dt * integrator. fsalfirst
151- if integrator. opts. adaptive
152- @. . broadcast = false thread = thread utilde = bhat1 * dt * integrator. fsalfirst
153- end
154-
155- # other stages
156- for i in eachindex (γ12end)
157- stage_limiter! (u, integrator, p, t + c2end[i] * dt)
158- f (k, u, p, t + c2end[i] * dt)
159- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
160- @. . broadcast = false thread = thread tmp = tmp + δ2end[i] * u
161- @. . broadcast = false thread = thread u = γ12end[i] * u + γ22end[i] * tmp +
162- γ32end[i] * uprev + β2end[i] * dt * k
163- if integrator. opts. adaptive
164- @. . broadcast = false thread = thread utilde = utilde + bhat2end[i] * dt * k
165- end
166- end
167-
168- stage_limiter! (u, integrator, p, t + dt)
169- step_limiter! (u, integrator, p, t + dt)
170-
171- if integrator. opts. adaptive
172- calculate_residuals! (
173- atmp, utilde, uprev, u, integrator. opts. abstol,
174- integrator. opts. reltol, integrator. opts. internalnorm, t,
175- thread
176- )
177- OrdinaryDiffEqCore. set_EEst! (integrator, integrator. opts. internalnorm (atmp, t))
178- end
99+ function perform_step! (integrator, cache:: LowStorageRK3SpCache , repeat_step = false )
100+ return _perform_step_iip! (integrator, cache, cache. tab)
179101end
180102
181- # 3S+ FSAL low storage methods: 3S methods adding another memory location for the embedded method (FSAL version)
182103function initialize! (integrator, cache:: LowStorageRK3SpFSALConstantCache )
183- integrator. fsalfirst = integrator. f (integrator. uprev, integrator. p, integrator. t) # Pre-start fsal
104+ integrator. fsalfirst = integrator. f (integrator. uprev, integrator. p, integrator. t)
184105 OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
185106 integrator. kshortsize = 2
186107 integrator. k = typeof (integrator. k)(undef, integrator. kshortsize)
187-
188- # Avoid undefined entries if k is an array of arrays
189108 integrator. fsallast = zero (integrator. fsalfirst)
190109 integrator. k[1 ] = integrator. fsalfirst
191110 return integrator. k[2 ] = integrator. fsallast
192111end
193112
194- @muladd function perform_step! (
195- integrator, cache:: LowStorageRK3SpFSALConstantCache ,
196- repeat_step = false
113+ function perform_step! (
114+ integrator, cache:: LowStorageRK3SpFSALConstantCache , repeat_step = false
197115 )
198- (; t, dt, uprev, u, f, p) = integrator
199- (; γ12end, γ22end, γ32end, δ2end, β1, β2end, c2end, bhat1, bhat2end, bhatfsal) = cache
200-
201- # u1
202- tmp = uprev
203- u = tmp + β1 * dt * integrator. fsalfirst
204- # Initialize utilde for JET
205- utilde = u
206- if integrator. opts. adaptive
207- utilde = bhat1 * dt * integrator. fsalfirst
208- end
209-
210- # other stages
211- for i in eachindex (γ12end)
212- k = f (u, p, t + c2end[i] * dt)
213- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
214- tmp = tmp + δ2end[i] * u
215- u = γ12end[i] * u + γ22end[i] * tmp + γ32end[i] * uprev + β2end[i] * dt * k
216- if integrator. opts. adaptive
217- utilde = utilde + bhat2end[i] * dt * k
218- end
219- end
220-
221- # FSAL
222- integrator. fsallast = f (u, p, t + dt)
223- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
224-
225- if integrator. opts. adaptive
226- utilde = utilde + bhatfsal * dt * integrator. fsallast
227- atmp = calculate_residuals (
228- utilde, uprev, u, integrator. opts. abstol,
229- integrator. opts. reltol, integrator. opts. internalnorm, t
230- )
231- OrdinaryDiffEqCore. set_EEst! (integrator, integrator. opts. internalnorm (atmp, t))
232- end
233-
234- integrator. k[1 ] = integrator. fsalfirst
235- integrator. k[2 ] = integrator. fsallast
236- integrator. u = u
116+ return _perform_step_oop! (integrator, cache)
237117end
238118
239119function initialize! (integrator, cache:: LowStorageRK3SpFSALCache )
240- (; k, fsalfirst) = cache
241-
242120 integrator. kshortsize = 2
243121 resize! (integrator. k, integrator. kshortsize)
244122 integrator. k[1 ] = integrator. fsalfirst
245123 integrator. k[2 ] = integrator. fsallast
246- integrator. f (integrator. fsalfirst, integrator. uprev, integrator. p, integrator. t) # FSAL for interpolation
124+ integrator. f (integrator. fsalfirst, integrator. uprev, integrator. p, integrator. t)
247125 return OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
248126end
249127
250- @muladd function perform_step! (
251- integrator, cache:: LowStorageRK3SpFSALCache ,
252- repeat_step = false
253- )
254- (; t, dt, uprev, u, f, p) = integrator
255- (; k, tmp, utilde, atmp, stage_limiter!, step_limiter!, thread) = cache
256- (;
257- γ12end, γ22end, γ32end, δ2end, β1, β2end,
258- c2end, bhat1, bhat2end, bhatfsal,
259- ) = cache. tab
260-
261- # u1
262- @. . broadcast = false thread = thread tmp = uprev
263- @. . broadcast = false thread = thread u = tmp + β1 * dt * integrator. fsalfirst
264- if integrator. opts. adaptive
265- @. . broadcast = false thread = thread utilde = bhat1 * dt * integrator. fsalfirst
266- end
267-
268- # other stages
269- for i in eachindex (γ12end)
270- stage_limiter! (u, integrator, p, t + c2end[i] * dt)
271- f (k, u, p, t + c2end[i] * dt)
272- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
273- @. . broadcast = false thread = thread tmp = tmp + δ2end[i] * u
274- @. . broadcast = false thread = thread u = γ12end[i] * u + γ22end[i] * tmp +
275- γ32end[i] * uprev + β2end[i] * dt * k
276- if integrator. opts. adaptive
277- @. . broadcast = false thread = thread utilde = utilde + bhat2end[i] * dt * k
278- end
279- end
280-
281- stage_limiter! (u, integrator, p, t + dt)
282- step_limiter! (u, integrator, p, t + dt)
283-
284- # FSAL
285- f (k, u, p, t + dt)
286- OrdinaryDiffEqCore. increment_nf! (integrator. stats, 1 )
287-
288- if integrator. opts. adaptive
289- @. . broadcast = false thread = thread utilde = utilde + bhatfsal * dt * k
290- calculate_residuals! (
291- atmp, utilde, uprev, u, integrator. opts. abstol,
292- integrator. opts. reltol, integrator. opts. internalnorm, t,
293- thread
294- )
295- OrdinaryDiffEqCore. set_EEst! (integrator, integrator. opts. internalnorm (atmp, t))
296- end
128+ function perform_step! (integrator, cache:: LowStorageRK3SpFSALCache , repeat_step = false )
129+ return _perform_step_iip! (integrator, cache, cache. tab)
297130end
298131
299132# 2R+ low storage methods
0 commit comments