Skip to content

Commit 9025565

Browse files
fix floating point issues in tstops
1 parent 2713e8f commit 9025565

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/callbacks.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ end
3535
# Check if the event occured
3636
if typeof(callback.idxs) <: Void
3737
previous_condition = callback.condition(integrator.tprev,integrator.uprev,integrator)
38-
else
38+
elseif typeof(callback.idxs) <: Number
3939
previous_condition = callback.condition(integrator.tprev,integrator.uprev[callback.idxs],integrator)
40+
else
41+
previous_condition = callback.condition(integrator.tprev,@view(integrator.uprev[callback.idxs]),integrator)
4042
end
4143
if isapprox(previous_condition,0,rtol=callback.reltol,atol=callback.abstol)
4244
prev_sign = 0.0
@@ -45,9 +47,11 @@ end
4547
end
4648
prev_sign_index = 1
4749
if typeof(callback.idxs) <: Void
48-
next_sign = sign(callback.condition(integrator.tprev+integrator.dt,integrator.u,integrator))
50+
next_sign = sign(callback.condition(integrator.t,integrator.u,integrator))
51+
elseif typeof(callback.idxs) <: Number
52+
next_sign = sign(callback.condition(integrator.t,integrator.u[callback.idxs],integrator))
4953
else
50-
next_sign = sign(callback.condition(integrator.tprev+integrator.dt,integrator.u[callback.idxs],integrator))
54+
next_sign = sign(callback.condition(integrator.t,@view(integrator.u[callback.idxs]),integrator))
5155
end
5256
if ((prev_sign<0 && !(typeof(callback.affect!)<:Void)) || (prev_sign>0 && !(typeof(callback.affect_neg!)<:Void))) && prev_sign*next_sign<0
5357
event_occurred = true
@@ -183,7 +187,7 @@ end
183187
end
184188

185189
integrator.u_modified = true
186-
if callback.condition(integrator.tprev+integrator.dt,integrator.u,integrator)
190+
if callback.condition(integrator.t,integrator.u,integrator)
187191
callback.affect!(integrator)
188192
@inbounds if callback.save_positions[2]
189193
savevalues!(integrator)

src/integrators/integrator_utils.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,12 @@ end
175175
integrator.accept_step = (!integrator.isout && integrator.EEst <= 1.0) || (integrator.opts.force_dtmin && abs(integrator.dt) <= abs(integrator.opts.dtmin))
176176
if integrator.accept_step # Accept
177177
integrator.tprev = integrator.t
178-
integrator.t = ttmp
178+
if typeof(integrator.t)<:AbstractFloat && !isempty(integrator.opts.tstops)
179+
tstop = top(integrator.opts.tstops)
180+
abs(ttmp - tstop) < 10eps(integrator.t) ? (integrator.t = tstop) : (integrator.t = ttmp)
181+
else
182+
integrator.t = ttmp
183+
end
179184
integrator.qold = max(integrator.EEst,integrator.opts.qoldinit)
180185
calc_dt_propose!(integrator,dtnew)
181186
handle_callbacks!(integrator)

0 commit comments

Comments
 (0)