Skip to content

Commit 4509d5c

Browse files
authored
Merge pull request #31 from SciML/do/reinit-dt
Fix dt reinit
2 parents 50f4cfe + 0337ba9 commit 4509d5c

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

src/integrator.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ function DiffEqBase.reinit!(
182182
u0 = integrator.sol.prob.u0;
183183
t0 = integrator.sol.prob.tspan[1],
184184
tf = integrator.sol.prob.tspan[2],
185+
dt = isadaptive(integrator) ? nothing : integrator.dtcache,
185186
erase_sol = false,
186187
tstops = integrator._tstops,
187188
saveat = integrator._saveat,
@@ -192,6 +193,9 @@ function DiffEqBase.reinit!(
192193
integrator.uprev .= u0
193194
integrator.t = t0
194195
integrator.tprev = t0
196+
if dt !== nothing
197+
integrator.dt = dt
198+
end
195199
integrator.tstops, integrator.saveat = tstops_and_saveat_heaps(t0, tf, tstops, saveat)
196200
integrator.iter = 0
197201
if erase_sol
@@ -214,7 +218,7 @@ function DiffEqBase.reinit!(
214218
u0,
215219
1:length(u0),
216220
integrator.subintegrator_tree;
217-
t0, tf,
221+
t0, tf, dt,
218222
erase_sol,
219223
tstops,
220224
saveat,
@@ -228,8 +232,13 @@ function subreinit!(
228232
u0,
229233
solution_indices,
230234
subintegrator::DiffEqBase.DEIntegrator;
235+
dt,
231236
kwargs...
232237
)
238+
# dt is not reset as expected in reinit!
239+
if dt !== nothing
240+
subintegrator.dt = dt
241+
end
233242
DiffEqBase.reinit!(subintegrator, u0[solution_indices]; kwargs...)
234243
end
235244

test/operator_splitting_api.jl

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ end
165165
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
166166
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
167167

168-
DiffEqBase.reinit!(integrator)
168+
DiffEqBase.reinit!(integrator; dt = dt)
169169
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Default
170170
for (u, t) in DiffEqBase.TimeChoiceIterator(integrator, tspan[1]:5.0:tspan[2])
171171
end
@@ -176,7 +176,7 @@ end
176176
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
177177
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
178178

179-
DiffEqBase.reinit!(integrator)
179+
DiffEqBase.reinit!(integrator; dt = dt)
180180
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Default
181181
for (uprev, tprev, u, t) in DiffEqBase.intervals(integrator)
182182
end
@@ -187,7 +187,7 @@ end
187187
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
188188
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
189189

190-
DiffEqBase.reinit!(integrator)
190+
DiffEqBase.reinit!(integrator; dt = dt)
191191
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Default
192192
DiffEqBase.solve!(integrator)
193193
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Success
@@ -218,8 +218,7 @@ end
218218
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
219219
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
220220

221-
DiffEqBase.reinit!(integrator)
222-
integrator.dt = dt
221+
DiffEqBase.reinit!(integrator; dt = dt)
223222
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Default
224223
for (u, t) in DiffEqBase.TimeChoiceIterator(integrator, tspan[1]:5.0:tspan[2])
225224
end
@@ -228,10 +227,9 @@ end
228227
@test integrator.subintegrator_tree[1].t tspan[2]
229228
@test integrator.dtcache dt
230229
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
231-
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)+1 # We need one extra step after reinit for some reason...
230+
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
232231

233-
DiffEqBase.reinit!(integrator)
234-
integrator.dt = dt
232+
DiffEqBase.reinit!(integrator; dt = dt)
235233
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Default
236234
for (uprev, tprev, u, t) in DiffEqBase.intervals(integrator)
237235
end
@@ -240,18 +238,17 @@ end
240238
@test integrator.subintegrator_tree[1].t tspan[2]
241239
@test integrator.dtcache dt
242240
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
243-
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)+1
241+
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
244242

245-
DiffEqBase.reinit!(integrator)
246-
integrator.dt = dt
243+
DiffEqBase.reinit!(integrator; dt = dt)
247244
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Default
248245
DiffEqBase.solve!(integrator)
249246
@test integrator.sol.retcode == DiffEqBase.ReturnCode.Success
250247
@test integrator.t tspan[2]
251248
@test integrator.subintegrator_tree[1].t tspan[2]
252249
@test integrator.dtcache dt
253250
@test integrator.iter == ceil(Int, (tspan[2]-tspan[1])/dt)
254-
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)+1
251+
@test integrator.subintegrator_tree[1].iter == ceil(Int, (tspan[2]-tspan[1])/dt)
255252
end
256253
end
257254

0 commit comments

Comments
 (0)