Skip to content

Commit babd22c

Browse files
Merge pull request #26 from devmotion/abstol_reltol
Fix and test element-wise tolerances for SRI, SRIW1, SRA, SRA1, and RKMil
2 parents ea3f1ae + 06f3e7d commit babd22c

File tree

8 files changed

+61
-18
lines changed

8 files changed

+61
-18
lines changed

src/initdt.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function sde_determine_initdt{tType,uType}(u0::uType,t::tType,tdir,dtmax,abstol,reltol,internalnorm,prob,order)
22
f = prob.f
33
g = prob.g
4-
d₀ = internalnorm(u0./(abstol+abs.(u0)*reltol))
4+
d₀ = internalnorm(u0./(abstol.+abs.(u0).*reltol))
55
if !isinplace(prob)
66
f₀ = f(t,u0)
77
g₀ = 3g(t,u0)

src/integrators/low_order.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,8 @@ end
159159
@inbounds u[i] = K[i]+L[i]*W.dW[i] + tmp[i]
160160
end
161161
if integrator.opts.adaptive
162-
@tight_loop_macros for i in eachindex(u)
163-
@inbounds tmp[i] = @muladd(tmp[i])/@muladd(integrator.opts.abstol + max(abs(uprev[i]),abs(u[i]))*integrator.opts.reltol)
162+
@tight_loop_macros for (i,atol,rtol) in zip(eachindex(u),Iterators.cycle(integrator.opts.abstol),Iterators.cycle(integrator.opts.reltol))
163+
@inbounds tmp[i] = @muladd(tmp[i])/@muladd(atol + max(abs(uprev[i]),abs(u[i]))*rtol)
164164
end
165165
integrator.EEst = integrator.opts.internalnorm(tmp)
166166
end

src/integrators/sra.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ end
8585
end
8686

8787
if integrator.opts.adaptive
88-
for i in eachindex(u)
89-
@inbounds tmp[i] = @muladd(integrator.opts.delta*E₁[i]+E₂[i])/@muladd(integrator.opts.abstol + max(abs(uprev[i]),abs(u[i]))*integrator.opts.reltol)
88+
@tight_loop_macros for (i,atol,rtol,δ) in zip(eachindex(u),Iterators.cycle(integrator.opts.abstol),
89+
Iterators.cycle(integrator.opts.reltol),Iterators.cycle(integrator.opts.delta))
90+
@inbounds tmp[i] = @muladd*E₁[i]+E₂[i])/@muladd(atol + max(abs(uprev[i]),abs(u[i]))*rtol)
9091
end
9192
integrator.EEst = integrator.opts.internalnorm(tmp)
9293
end
@@ -186,8 +187,9 @@ end
186187
end
187188

188189
if integrator.opts.adaptive
189-
@tight_loop_macros for i in eachindex(u)
190-
@inbounds tmp[i] = (integrator.opts.delta*E₁[i]+E₂[i])/(integrator.opts.abstol + max(abs(uprev[i]),abs(u[i]))*integrator.opts.reltol)
190+
@tight_loop_macros for (i,atol,rtol,δ) in zip(eachindex(u),Iterators.cycle(integrator.opts.abstol),
191+
Iterators.cycle(integrator.opts.reltol),Iterators.cycle(integrator.opts.delta))
192+
@inbounds tmp[i] = @muladd*E₁[i]+E₂[i])/@muladd(atol + max(abs(uprev[i]),abs(u[i]))*rtol)
191193
end
192194
integrator.EEst = integrator.opts.internalnorm(tmp)
193195
end

src/integrators/sri.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,9 @@ end
113113
end
114114

115115
if integrator.opts.adaptive
116-
@tight_loop_macros for i in eachindex(u)
117-
@inbounds tmp[i] = @muladd(integrator.opts.delta*E₁[i]+E₂[i])/@muladd(integrator.opts.abstol + max(abs(uprev[i]),abs(u[i]))*integrator.opts.reltol)
116+
@tight_loop_macros for (i,atol,rtol,δ) in zip(eachindex(u),Iterators.cycle(integrator.opts.abstol),
117+
Iterators.cycle(integrator.opts.reltol),Iterators.cycle(integrator.opts.delta))
118+
@inbounds tmp[i] = @muladd*E₁[i]+E₂[i])/@muladd(atol + max(abs(uprev[i]),abs(u[i]))*rtol)
118119
end
119120
integrator.EEst = integrator.opts.internalnorm(tmp)
120121
end
@@ -208,8 +209,9 @@ end
208209
end
209210

210211
if integrator.opts.adaptive
211-
@tight_loop_macros for i in eachindex(u)
212-
@inbounds tmp[i] = @muladd(integrator.opts.delta*E₁[i]+E₂[i])/@muladd(integrator.opts.abstol + max(abs(uprev[i]),abs(u[i]))*integrator.opts.reltol)
212+
@tight_loop_macros for (i,atol,rtol,δ) in zip(eachindex(u),Iterators.cycle(integrator.opts.abstol),
213+
Iterators.cycle(integrator.opts.reltol),Iterators.cycle(integrator.opts.delta))
214+
@inbounds tmp[i] = @muladd*E₁[i]+E₂[i])/@muladd(atol + max(abs(uprev[i]),abs(u[i]))*rtol)
213215
end
214216
integrator.EEst = integrator.opts.internalnorm(tmp)
215217
end

src/options_type.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
type SDEOptions{uEltype,uEltypeNoUnits,tTypeNoUnits,tType,F2,F3,F4,F5,F6,tstopsType,ECType,SType,MI}
1+
type SDEOptions{tTypeNoUnits,tType,F2,F3,F4,F5,F6,tstopsType,ECType,SType,MI,A,R,D}
22
maxiters::MI
33
timeseries_steps::Int
44
save_everystep::Bool
55
adaptive::Bool
6-
abstol::uEltype
7-
reltol::uEltypeNoUnits
6+
abstol::A
7+
reltol::R
88
gamma::tTypeNoUnits
99
qmax::tTypeNoUnits
1010
qmin::tTypeNoUnits
@@ -24,7 +24,7 @@ type SDEOptions{uEltype,uEltypeNoUnits,tTypeNoUnits,tType,F2,F3,F4,F5,F6,tstopsT
2424
dense_errors::Bool
2525
beta1::tTypeNoUnits
2626
beta2::tTypeNoUnits
27-
delta::uEltypeNoUnits
27+
delta::D
2828
qoldinit::tTypeNoUnits
2929
dense::Bool
3030
save_start::Bool

src/solve.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,15 +210,15 @@ function init{uType,tType,isinplace,algType<:Union{AbstractRODEAlgorithm,Abstrac
210210

211211
uEltype = recursive_eltype(u)
212212

213-
opts = SDEOptions(maxiters,timeseries_steps,save_everystep,adaptive,uEltype(uEltype(1)*abstol),
214-
uEltypeNoUnits(reltol),tTypeNoUnits(gamma),tTypeNoUnits(qmax),tTypeNoUnits(qmin),
213+
opts = SDEOptions(maxiters,timeseries_steps,save_everystep,adaptive,map(uEltype,abstol),
214+
map(uEltypeNoUnits,reltol),tTypeNoUnits(gamma),tTypeNoUnits(qmax),tTypeNoUnits(qmin),
215215
dtmax,dtmin,internalnorm,save_idxs,
216216
tstops_internal,saveat_internal,d_discontinuities_internal,
217217
userdata,
218218
progress,progress_steps,
219219
progress_name,progress_message,
220220
timeseries_errors,dense_errors,
221-
tTypeNoUnits(beta1),tTypeNoUnits(beta2),uEltypeNoUnits(delta),tTypeNoUnits(qoldinit),
221+
tTypeNoUnits(beta1),tTypeNoUnits(beta2),map(uEltypeNoUnits,delta),tTypeNoUnits(qoldinit),
222222
dense,save_start,save_noise,
223223
callbacks_internal,isoutofdomain,unstable_check,verbose,calck,force_dtmin,
224224
advance_to_tstop,stop_at_next_tstop)

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ LONGER_TESTS && @time @testset "Weak Convergence Tests" begin include("weak_conv
2626
@time @testset "Composite Tests" begin include("composite_algorithm_test.jl") end
2727
@time @testset "Events Tests" begin include("events_test.jl") end
2828
@time @testset "Cache Tests" begin include("cache_test.jl") end
29+
@time @testset "Element-wise Tolerances Tests" begin include("tolerances_tests.jl") end
2930

3031
#Adaptive SDE
3132
@time @testset "Adaptive SDE Linear Tests" begin include("adaptive/sde_linearadaptive_tests.jl") end

test/tolerances_tests.jl

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using StochasticDiffEq, DiffEqProblemLibrary, Base.Test
2+
3+
#=
4+
f = (t,u) -> begin
5+
du = similar(u)
6+
prob_sde_2Dlinear.f(t,u,du)
7+
return du
8+
end
9+
σ = (t,u) -> begin
10+
du = similar(u)
11+
prob_sde_2Dlinear.g(t,u,du)
12+
return du
13+
end
14+
15+
probs = [prob_sde_2Dlinear,
16+
SDEProblem(f,σ,prob_sde_2Dlinear.u0,prob_sde_2Dlinear.tspan)]
17+
=#
18+
19+
probs = [prob_sde_2Dlinear]
20+
algs = [SRI(),SRIW1(),SRA1(),SRA(),RKMil()]
21+
22+
for alg in algs, prob in probs
23+
dt = typeof(alg)<:StochasticDiffEqAdaptiveAlgorithm ? 0.0 : 0.1
24+
srand(100)
25+
sol = solve(prob,alg;dt=dt)
26+
27+
# Vector of element-wise absolute tolerances
28+
srand(100)
29+
sol2 = solve(prob,alg;dt=dt,abstol=fill(1e-2,4,2))
30+
31+
@test sol.t == sol2.t && sol.u == sol2.u
32+
33+
# Vector of element-wise relative tolerances
34+
srand(100)
35+
sol2 = solve(prob,alg;dt=dt,reltol=fill(1e-2,4,2))
36+
37+
@test sol.t == sol2.t && sol.u == sol2.u
38+
end

0 commit comments

Comments
 (0)