Skip to content

Commit 90cc0b2

Browse files
committed
add dtrelax parameter to callbacks
1 parent 00b5b04 commit 90cc0b2

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

src/callbacks.jl

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ Contains a single callback whose `condition` is a continuous function. The callb
7171
if the starting condition is less than the tolerance from zero, then no root will be detected.
7272
This is to stop repeat events happening just after a previously rootfound event.
7373
"""
74-
struct ContinuousCallback{F1,F2,F3,F4,T,T2,I} <: AbstractContinuousCallback
74+
struct ContinuousCallback{F1,F2,F3,F4,T,T2,I,R} <: AbstractContinuousCallback
7575
condition::F1
7676
affect!::F2
7777
affect_neg!::F3
@@ -80,16 +80,17 @@ struct ContinuousCallback{F1,F2,F3,F4,T,T2,I} <: AbstractContinuousCallback
8080
rootfind::Bool
8181
interp_points::Int
8282
save_positions::BitArray{1}
83+
dtrelax::R
8384
abstol::T
8485
reltol::T2
8586
ContinuousCallback(condition::F1,affect!::F2,affect_neg!::F3,
8687
initialize::F4,idxs::I,rootfind,
87-
interp_points,save_positions,abstol::T,reltol::T2) where {F1,F2,F3,F4,T,T2,I} =
88-
new{F1,F2,F3,F4,T,T2,I}(condition,
88+
interp_points,save_positions,dtrelax::R,abstol::T,reltol::T2) where {F1,F2,F3,F4,T,T2,I,R} =
89+
new{F1,F2,F3,F4,T,T2,I,R}(condition,
8990
affect!,affect_neg!,
9091
initialize,idxs,rootfind,interp_points,
9192
BitArray(collect(save_positions)),
92-
abstol,reltol)
93+
dtrelax,abstol,reltol)
9394
end
9495

9596
ContinuousCallback(condition,affect!,affect_neg!;
@@ -98,11 +99,13 @@ ContinuousCallback(condition,affect!,affect_neg!;
9899
rootfind=true,
99100
save_positions=(true,true),
100101
interp_points=10,
102+
dtrelax=1.0,
101103
abstol=10eps(),reltol=0) = ContinuousCallback(
102104
condition,affect!,affect_neg!,initialize,
103105
idxs,
104106
rootfind,interp_points,
105-
save_positions,abstol,reltol)
107+
save_positions,
108+
dtrelax,abstol,reltol)
106109

107110
function ContinuousCallback(condition,affect!;
108111
initialize = INITIALIZE_DEFAULT,
@@ -111,12 +114,14 @@ function ContinuousCallback(condition,affect!;
111114
save_positions=(true,true),
112115
affect_neg! = affect!,
113116
interp_points=10,
117+
dtrelax=1.0,
114118
abstol=10eps(),reltol=0)
115119

116120
ContinuousCallback(
117121
condition,affect!,affect_neg!,initialize,idxs,
118122
rootfind,interp_points,
119-
collect(save_positions),abstol,reltol)
123+
collect(save_positions),
124+
dtrelax,abstol,reltol)
120125

121126
end
122127

@@ -157,7 +162,7 @@ multiple events.
157162
158163
Rest of the arguments have the same meaning as in [`ContinuousCallback`](@ref).
159164
"""
160-
struct VectorContinuousCallback{F1,F2,F3,F4,T,T2,I} <: AbstractContinuousCallback
165+
struct VectorContinuousCallback{F1,F2,F3,F4,T,T2,I,R} <: AbstractContinuousCallback
161166
condition::F1
162167
affect!::F2
163168
affect_neg!::F3
@@ -167,17 +172,18 @@ struct VectorContinuousCallback{F1,F2,F3,F4,T,T2,I} <: AbstractContinuousCallbac
167172
rootfind::Bool
168173
interp_points::Int
169174
save_positions::BitArray{1}
175+
dtrelax::R
170176
abstol::T
171177
reltol::T2
172178
VectorContinuousCallback(condition::F1,affect!::F2,affect_neg!::F3,len::Int,
173179
initialize::F4,idxs::I,rootfind,
174-
interp_points,save_positions,
175-
abstol::T,reltol::T2) where {F1,F2,F3,F4,T,T2,I} =
176-
new{F1,F2,F3,F4,T,T2,I}(condition,
180+
interp_points,save_positions,dtrelax::R,
181+
abstol::T,reltol::T2) where {F1,F2,F3,F4,T,T2,I,R} =
182+
new{F1,F2,F3,F4,T,T2,I,R}(condition,
177183
affect!,affect_neg!,len,
178184
initialize,idxs,rootfind,interp_points,
179185
BitArray(collect(save_positions)),
180-
abstol,reltol)
186+
dtrelax,abstol,reltol)
181187
end
182188

183189
VectorContinuousCallback(condition,affect!,affect_neg!,len;
@@ -186,12 +192,14 @@ VectorContinuousCallback(condition,affect!,affect_neg!,len;
186192
rootfind=true,
187193
save_positions=(true,true),
188194
interp_points=10,
195+
dtrelax=1.0,
189196
abstol=10eps(),reltol=0) = VectorContinuousCallback(
190197
condition,affect!,affect_neg!,len,
191198
initialize,
192199
idxs,
193200
rootfind,interp_points,
194-
save_positions,abstol,reltol)
201+
save_positions,dtrelax,
202+
abstol,reltol)
195203

196204
function VectorContinuousCallback(condition,affect!,len;
197205
initialize = INITIALIZE_DEFAULT,
@@ -200,12 +208,14 @@ function VectorContinuousCallback(condition,affect!,len;
200208
save_positions=(true,true),
201209
affect_neg! = affect!,
202210
interp_points=10,
211+
dtrelax=1.0,
203212
abstol=10eps(),reltol=0)
204213

205214
VectorContinuousCallback(
206215
condition,affect!,affect_neg!,len,initialize,idxs,
207216
rootfind,interp_points,
208-
collect(save_positions),abstol,reltol)
217+
collect(save_positions),
218+
dtrelax,abstol,reltol)
209219

210220
end
211221

@@ -757,6 +767,10 @@ function apply_callback!(integrator,callback::Union{ContinuousCallback,VectorCon
757767

758768
change_t_via_interpolation!(integrator,integrator.tprev+cb_time)
759769

770+
if integrator.opts.adaptive
771+
set_proposed_dt!(integrator, max(integrator.opts.dtmin+eps(integrator.dt), callback.dtrelax * integrator.dt))
772+
end
773+
760774
# handle saveat
761775
_, savedexactly = savevalues!(integrator)
762776
saved_in_cb = true

0 commit comments

Comments
 (0)