Skip to content

Commit 6df5ec2

Browse files
committed
SDE reversal
1 parent 2fa86b9 commit 6df5ec2

File tree

2 files changed

+5
-29
lines changed

2 files changed

+5
-29
lines changed

src/integrators/integrator_utils.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ end
4141
modify_dtnew_for_tstops!(integrator)
4242
reject_step!(integrator)
4343
integrator.dt = integrator.dtnew
44-
integrator.sqdt = sqrt(abs(integrator.dt))
44+
integrator.sqdt = integrator.tdir * sqrt(abs(integrator.dt))
4545
end
4646
end
4747

@@ -292,7 +292,7 @@ end
292292

293293
# Allow RSWM1 on Wiener Process to change dt
294294
!isnothing(integrator.W) && (integrator.dt = integrator.W.dt)
295-
integrator.sqdt = @fastmath sqrt(abs(integrator.dt)) # It can change dt, like in RSwM1
295+
integrator.sqdt = @fastmath integrator.tdir*sqrt(abs(integrator.dt)) # It can change dt, like in RSwM1
296296
end
297297

298298
@inline function handle_tstop!(integrator)

src/perform_step/low_order.jl

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ end
174174
if alg_interpretation(integrator.alg) == :Ito
175175
utilde = K + L*integrator.sqdt
176176
ggprime = (integrator.g(utilde,p,t).-L)./(integrator.sqdt)
177-
mil_correction = ggprime.*(W.dW.^2 .- dt)./2
177+
mil_correction = ggprime.*(W.dW.^2 .- abs(dt))./2
178178
elseif alg_interpretation(integrator.alg) == :Stratonovich
179179
utilde = uprev + L*integrator.sqdt
180180
ggprime = (integrator.g(utilde,p,t).-L)./(integrator.sqdt)
@@ -183,6 +183,7 @@ end
183183
error("Alg interpretation invalid. Use either :Ito or :Stratonovich")
184184
end
185185
u = K+L.*W.dW+mil_correction
186+
186187
if integrator.opts.adaptive
187188
du2 = integrator.f(K,p,t+dt)
188189
Ed = dt*(du2 - du1)/2
@@ -196,31 +197,6 @@ end
196197
integrator.u = u
197198
end
198199

199-
#=
200-
@muladd function perform_step!(integrator,cache::RKMilCache)
201-
@unpack du1,du2,K,tmp,L = cache
202-
@unpack t,dt,uprev,u,W,p,f = integrator
203-
integrator.f(du1,uprev,p,t)
204-
integrator.g(L,uprev,p,t)
205-
@.. K = uprev + dt * du1
206-
@.. tmp = K + integrator.sqdt * L
207-
integrator.g(du2,tmp,p,t)
208-
if alg_interpretation(integrator.alg) == :Ito
209-
@.. tmp = (du2-L)/(2integrator.sqdt)*(W.dW^2 - dt)
210-
elseif alg_interpretation(integrator.alg) == :Stratonovich
211-
@.. tmp = (du2-L)/(2integrator.sqdt)*(W.dW^2)
212-
else
213-
error("Alg interpretation invalid. Use either :Ito or :Stratonovich")
214-
end
215-
@.. u = K+L*W.dW + tmp
216-
if integrator.opts.adaptive
217-
@.. tmp = (tmp)/(integrator.opts.abstol + max(integrator.opts.internalnorm(uprev,t),integrator.opts.internalnorm(u,t))*integrator.opts.reltol)
218-
integrator.EEst = integrator.opts.internalnorm(tmp,t)
219-
end
220-
integrator.u = u
221-
end
222-
=#
223-
224200
@muladd function perform_step!(integrator,cache::RKMilCache)
225201
@unpack du1,du2,K,tmp,L = cache
226202
@unpack t,dt,uprev,u,W,p,f = integrator
@@ -231,7 +207,7 @@ end
231207
if alg_interpretation(integrator.alg) == :Ito
232208
@.. tmp = K + integrator.sqdt * L
233209
integrator.g(du2,tmp,p,t)
234-
@.. tmp = (du2-L)/(2integrator.sqdt)*(W.dW.^2 - dt)
210+
@.. tmp = (du2-L)/(2integrator.sqdt)*(W.dW.^2 - abs(dt))
235211
elseif alg_interpretation(integrator.alg) == :Stratonovich
236212
@.. tmp = uprev + integrator.sqdt * L
237213
integrator.g(du2,tmp,p,t)

0 commit comments

Comments
 (0)