From 2b270e14f5ae7d1830e1f4df1221ef2996ff4787 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Thu, 7 Mar 2019 16:53:04 +0530 Subject: [PATCH 01/10] Adds WilliamsonWrapper --- src/perform_step/low_storage_rk_perform_step.jl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/perform_step/low_storage_rk_perform_step.jl b/src/perform_step/low_storage_rk_perform_step.jl index d90387e443..d17d8ebc51 100644 --- a/src/perform_step/low_storage_rk_perform_step.jl +++ b/src/perform_step/low_storage_rk_perform_step.jl @@ -55,9 +55,9 @@ end # other stages for i in eachindex(A2end) - f(k, u, p, t+c2end[i]*dt) + @. tmp = A2end[i]*tmp + f(WilliamsonWrapper{typeof(tmp),typeof(dt)}(tmp,dt), u, p, t+c2end[i]*dt) integrator.destats.nf += 1 - @. tmp = A2end[i]*tmp + dt*k @. u = u + B2end[i]*tmp end @@ -65,7 +65,12 @@ end integrator.destats.nf += 1 end +struct WilliamsonWrapper{kType, dtType} + kref::kType + dt::dtType +end +Base.setindex!(a::WilliamsonWrapper{kType, dtType}, b::bType, c::cType) where {kType, dtType, bType, cType} = (a.kref[c] += a.dt * b) # 2C low storage methods function initialize!(integrator,cache::LowStorageRK2CConstantCache) From 1923618111f657e1da59eb0f72e8e609f25cb782 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Sat, 9 Mar 2019 23:20:42 +0530 Subject: [PATCH 02/10] Removes fsal from 2N methods --- src/alg_utils.jl | 10 +++ src/caches/low_storage_rk_caches.jl | 64 ++++++++----------- .../low_storage_rk_perform_step.jl | 19 +++--- 3 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/alg_utils.jl b/src/alg_utils.jl index 6885c5eca1..70f8943069 100644 --- a/src/alg_utils.jl +++ b/src/alg_utils.jl @@ -12,6 +12,16 @@ isfsal(alg::Rodas4P) = false isfsal(alg::Vern7) = false isfsal(alg::Vern8) = false isfsal(alg::Vern9) = false +# Pseudo Non-FSAL +isfsal(alg::ORK256) = false +isfsal(alg::CarpenterKennedy2N54) = false +isfsal(alg::HSLDDRK64) = false +isfsal(alg::DGLDDRK73_C) = false +isfsal(alg::DGLDDRK84_C) = false +isfsal(alg::DGLDDRK84_F) = false +isfsal(alg::NDBLSRK124) = false +isfsal(alg::NDBLSRK134) = false +isfsal(alg::NDBLSRK144) = false get_current_isfsal(alg, cache) = isfsal(alg) get_current_isfsal(alg::CompositeAlgorithm, cache) = isfsal(alg.algs[cache.current]) diff --git a/src/caches/low_storage_rk_caches.jl b/src/caches/low_storage_rk_caches.jl index ffb8f5d516..3a26a0b2ad 100644 --- a/src/caches/low_storage_rk_caches.jl +++ b/src/caches/low_storage_rk_caches.jl @@ -5,7 +5,6 @@ uprev::uType k::rateType tmp::uType - fsalfirst::rateType tab::TabType end @@ -42,14 +41,13 @@ end function alg_cache(alg::ORK256,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = ORK256ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::ORK256,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -82,14 +80,13 @@ end function alg_cache(alg::CarpenterKennedy2N54,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = CarpenterKennedy2N54ConstantCache(real(uBottomEltypeNoUnits),real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::CarpenterKennedy2N54,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -126,14 +123,13 @@ end function alg_cache(alg::HSLDDRK64,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = HSLDDRK64ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::HSLDDRK64,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -172,14 +168,13 @@ end function alg_cache(alg::DGLDDRK73_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = DGLDDRK73_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::DGLDDRK73_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -221,14 +216,13 @@ end function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = DGLDDRK84_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -270,14 +264,13 @@ end function alg_cache(alg::DGLDDRK84_F,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = DGLDDRK84_FConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::DGLDDRK84_F,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -331,14 +324,13 @@ end function alg_cache(alg::NDBLSRK124,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = NDBLSRK124ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::NDBLSRK124,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -395,14 +387,13 @@ end function alg_cache(alg::NDBLSRK134,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = NDBLSRK134ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::NDBLSRK134,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -462,14 +453,13 @@ end function alg_cache(alg::NDBLSRK144,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = similar(u) - k = zero(rate_prototype) if calck - fsalfirst = zero(rate_prototype) + k = zero(rate_prototype) else - fsalfirst = k + k = tmp end tab = NDBLSRK144ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,fsalfirst,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab) end function alg_cache(alg::NDBLSRK144,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) diff --git a/src/perform_step/low_storage_rk_perform_step.jl b/src/perform_step/low_storage_rk_perform_step.jl index d17d8ebc51..6f9bdd94f3 100644 --- a/src/perform_step/low_storage_rk_perform_step.jl +++ b/src/perform_step/low_storage_rk_perform_step.jl @@ -27,30 +27,30 @@ end u = u + B2end[i]*tmp end - integrator.fsallast = f(u, p, t+dt) # For interpolation, then FSAL'd integrator.destats.nf += 1 integrator.k[1] = integrator.fsalfirst + integrator.fsalfirst = f(u, p, t+dt) # For interpolation, then FSAL'd integrator.u = u end function initialize!(integrator,cache::LowStorageRK2NCache) - @unpack k,fsalfirst = cache - integrator.fsalfirst = fsalfirst - integrator.fsallast = k + @unpack k, tmp = cache + # integrator.fsalfirst = fsalfirst + # integrator.fsallast = k integrator.kshortsize = 1 resize!(integrator.k, integrator.kshortsize) - integrator.k[1] = integrator.fsalfirst - integrator.f(integrator.fsalfirst,integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation + integrator.k[1] = k + integrator.f(WilliamsonWrapper(tmp,integrator.dt),integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation integrator.destats.nf += 1 end @muladd function perform_step!(integrator,cache::LowStorageRK2NCache,repeat_step=false) @unpack t,dt,u,f,p = integrator - @unpack k,fsalfirst,tmp = cache + @unpack k,tmp = cache @unpack A2end,B1,B2end,c2end = cache.tab # u1 - @. tmp = dt*fsalfirst + # @. tmp = dt*fsalfirst @. u = u + B1*tmp # other stages @@ -62,6 +62,7 @@ end end f(k, u, p, t+dt) + @. tmp = dt*k integrator.destats.nf += 1 end @@ -71,6 +72,8 @@ struct WilliamsonWrapper{kType, dtType} end Base.setindex!(a::WilliamsonWrapper{kType, dtType}, b::bType, c::cType) where {kType, dtType, bType, cType} = (a.kref[c] += a.dt * b) +Base.size(a::WilliamsonWrapper{kType, dtType}) where {kType, dtType} = size(a.kref) +Base.copyto!(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = (a.kref .+= a.dt .* b) # 2C low storage methods function initialize!(integrator,cache::LowStorageRK2CConstantCache) From 6083c3048209d6d9f5738afed30e60fcb11e165b Mon Sep 17 00:00:00 2001 From: kanav99 Date: Wed, 13 Mar 2019 02:16:32 +0530 Subject: [PATCH 03/10] Fixes instability error --- src/caches/low_storage_rk_caches.jl | 20 +++++++++---------- .../low_storage_rk_perform_step.jl | 13 ++++++------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/caches/low_storage_rk_caches.jl b/src/caches/low_storage_rk_caches.jl index 3a26a0b2ad..5b00e35264 100644 --- a/src/caches/low_storage_rk_caches.jl +++ b/src/caches/low_storage_rk_caches.jl @@ -4,7 +4,7 @@ u::uType uprev::uType k::rateType - tmp::uType + tmp::uType # tmp acts as second register and fsal both tab::TabType end @@ -40,7 +40,7 @@ function ORK256ConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::ORK256,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -79,7 +79,7 @@ function CarpenterKennedy2N54ConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::CarpenterKennedy2N54,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -122,7 +122,7 @@ function HSLDDRK64ConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::HSLDDRK64,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -167,7 +167,7 @@ function DGLDDRK73_CConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::DGLDDRK73_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -215,7 +215,7 @@ function DGLDDRK84_CConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -263,7 +263,7 @@ function DGLDDRK84_FConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::DGLDDRK84_F,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -323,7 +323,7 @@ function NDBLSRK124ConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::NDBLSRK124,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -386,7 +386,7 @@ function NDBLSRK134ConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::NDBLSRK134,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else @@ -452,7 +452,7 @@ function NDBLSRK144ConstantCache(::Type{T}, ::Type{T2}) where {T,T2} end function alg_cache(alg::NDBLSRK144,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) - tmp = similar(u) + tmp = zero(u) if calck k = zero(rate_prototype) else diff --git a/src/perform_step/low_storage_rk_perform_step.jl b/src/perform_step/low_storage_rk_perform_step.jl index 6f9bdd94f3..ab4d771626 100644 --- a/src/perform_step/low_storage_rk_perform_step.jl +++ b/src/perform_step/low_storage_rk_perform_step.jl @@ -35,8 +35,6 @@ end function initialize!(integrator,cache::LowStorageRK2NCache) @unpack k, tmp = cache - # integrator.fsalfirst = fsalfirst - # integrator.fsallast = k integrator.kshortsize = 1 resize!(integrator.k, integrator.kshortsize) integrator.k[1] = k @@ -50,13 +48,12 @@ end @unpack A2end,B1,B2end,c2end = cache.tab # u1 - # @. tmp = dt*fsalfirst @. u = u + B1*tmp # other stages for i in eachindex(A2end) @. tmp = A2end[i]*tmp - f(WilliamsonWrapper{typeof(tmp),typeof(dt)}(tmp,dt), u, p, t+c2end[i]*dt) + f(WilliamsonWrapper(tmp,dt), u, p, t+c2end[i]*dt) integrator.destats.nf += 1 @. u = u + B2end[i]*tmp end @@ -71,9 +68,11 @@ struct WilliamsonWrapper{kType, dtType} dt::dtType end -Base.setindex!(a::WilliamsonWrapper{kType, dtType}, b::bType, c::cType) where {kType, dtType, bType, cType} = (a.kref[c] += a.dt * b) -Base.size(a::WilliamsonWrapper{kType, dtType}) where {kType, dtType} = size(a.kref) -Base.copyto!(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = (a.kref .+= a.dt .* b) +@inline Base.setindex!(a::WilliamsonWrapper{kType, dtType}, b::bType, c::cType) where {kType, dtType, bType, cType} = (a.kref[c] += a.dt * b) +@inline Base.getindex(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = a.kref[b] +@inline Base.size(a::WilliamsonWrapper{kType, dtType}) where {kType, dtType} = size(a.kref) +@inline Base.copyto!(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = @. a.kref += a.dt * b +#Base.broadcast!(::typeof(=), a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = (a.kref .+= a.dt .* b) # 2C low storage methods function initialize!(integrator,cache::LowStorageRK2CConstantCache) From d192a1399510fd309bd701955103f9fb7d2b4b31 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Wed, 13 Mar 2019 15:33:51 +0530 Subject: [PATCH 04/10] Adds williamson condition flag --- src/algorithms.jl | 45 ++++++++++++---- src/caches/low_storage_rk_caches.jl | 54 +++++++++++++++---- .../low_storage_rk_perform_step.jl | 15 ++++-- 3 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/algorithms.jl b/src/algorithms.jl index a7a15309b4..fc584c474e 100644 --- a/src/algorithms.jl +++ b/src/algorithms.jl @@ -49,15 +49,42 @@ struct Anas5{T} <: OrdinaryDiffEqAlgorithm end Anas5(; w=1) = Anas5(w) -struct ORK256 <: OrdinaryDiffEqAlgorithm end -struct CarpenterKennedy2N54 <: OrdinaryDiffEqAlgorithm end -struct HSLDDRK64 <: OrdinaryDiffEqAlgorithm end -struct DGLDDRK73_C <: OrdinaryDiffEqAlgorithm end -struct DGLDDRK84_C <: OrdinaryDiffEqAlgorithm end -struct DGLDDRK84_F <: OrdinaryDiffEqAlgorithm end -struct NDBLSRK124 <: OrdinaryDiffEqAlgorithm end -struct NDBLSRK134 <: OrdinaryDiffEqAlgorithm end -struct NDBLSRK144 <: OrdinaryDiffEqAlgorithm end +struct ORK256 <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + QRK256(;williamson_condition=true) = new(williamson_condition) +end +struct CarpenterKennedy2N54 <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + CarpenterKennedy2N54(;williamson_condition=true) = new(williamson_condition) +end +struct HSLDDRK64 <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + HSLDDRK64(;williamson_condition=true) = new(williamson_condition) +end +struct DGLDDRK73_C <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + DGLDDRK73_C(;williamson_condition=true) = new(williamson_condition) +end +struct DGLDDRK84_C <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + DGLDDRK84_C(;williamson_condition=true) = new(williamson_condition) +end +struct DGLDDRK84_F <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + DGLDDRK84_F(;williamson_condition=true) = new(williamson_condition) +end +struct NDBLSRK124 <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + NDBLSRK124(;williamson_condition=true) = new(williamson_condition) +end +struct NDBLSRK134 <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + NDBLSRK134(;williamson_condition=true) = new(williamson_condition) +end +struct NDBLSRK144 <: OrdinaryDiffEqAlgorithm + williamson_condition::Bool + NDBLSRK144(;williamson_condition=true) = new(williamson_condition) +end struct CFRLDDRK64 <: OrdinaryDiffEqAlgorithm end struct TSLDDRK74 <: OrdinaryDiffEqAlgorithm end struct CKLLSRK43_2 <: OrdinaryDiffEqAdaptiveAlgorithm end diff --git a/src/caches/low_storage_rk_caches.jl b/src/caches/low_storage_rk_caches.jl index 5b00e35264..a6ba1b861f 100644 --- a/src/caches/low_storage_rk_caches.jl +++ b/src/caches/low_storage_rk_caches.jl @@ -44,7 +44,11 @@ function alg_cache(alg::ORK256,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUn if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = ORK256ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -83,7 +87,11 @@ function alg_cache(alg::CarpenterKennedy2N54,u,rate_prototype,uEltypeNoUnits,uBo if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = CarpenterKennedy2N54ConstantCache(real(uBottomEltypeNoUnits),real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -126,7 +134,11 @@ function alg_cache(alg::HSLDDRK64,u,rate_prototype,uEltypeNoUnits,uBottomEltypeN if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = HSLDDRK64ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -171,7 +183,11 @@ function alg_cache(alg::DGLDDRK73_C,u,rate_prototype,uEltypeNoUnits,uBottomEltyp if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = DGLDDRK73_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -219,7 +235,11 @@ function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltyp if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = DGLDDRK84_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -267,7 +287,11 @@ function alg_cache(alg::DGLDDRK84_F,u,rate_prototype,uEltypeNoUnits,uBottomEltyp if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = DGLDDRK84_FConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -327,7 +351,11 @@ function alg_cache(alg::NDBLSRK124,u,rate_prototype,uEltypeNoUnits,uBottomEltype if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = NDBLSRK124ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -390,7 +418,11 @@ function alg_cache(alg::NDBLSRK134,u,rate_prototype,uEltypeNoUnits,uBottomEltype if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = NDBLSRK134ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) @@ -456,7 +488,11 @@ function alg_cache(alg::NDBLSRK144,u,rate_prototype,uEltypeNoUnits,uBottomEltype if calck k = zero(rate_prototype) else - k = tmp + if alg.williamson_condition + k = tmp + else + k = zero(rate_prototype) + end end tab = NDBLSRK144ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) LowStorageRK2NCache(u,uprev,k,tmp,tab) diff --git a/src/perform_step/low_storage_rk_perform_step.jl b/src/perform_step/low_storage_rk_perform_step.jl index ab4d771626..34fa6502ce 100644 --- a/src/perform_step/low_storage_rk_perform_step.jl +++ b/src/perform_step/low_storage_rk_perform_step.jl @@ -38,7 +38,12 @@ function initialize!(integrator,cache::LowStorageRK2NCache) integrator.kshortsize = 1 resize!(integrator.k, integrator.kshortsize) integrator.k[1] = k - integrator.f(WilliamsonWrapper(tmp,integrator.dt),integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation + if integrator.alg.williamson_condition + integrator.f(WilliamsonWrapper(tmp,integrator.dt),integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation + else + integrator.f(k ,integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation + @. tmp += integrator.dt * k + end integrator.destats.nf += 1 end @@ -53,7 +58,12 @@ end # other stages for i in eachindex(A2end) @. tmp = A2end[i]*tmp - f(WilliamsonWrapper(tmp,dt), u, p, t+c2end[i]*dt) + if integrator.alg.williamson_condition + f(WilliamsonWrapper(tmp,dt), u, p, t+c2end[i]*dt) + else + f(k, u, p, t+c2end[i]*dt) + @. tmp += dt * k + end integrator.destats.nf += 1 @. u = u + B2end[i]*tmp end @@ -72,7 +82,6 @@ end @inline Base.getindex(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = a.kref[b] @inline Base.size(a::WilliamsonWrapper{kType, dtType}) where {kType, dtType} = size(a.kref) @inline Base.copyto!(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = @. a.kref += a.dt * b -#Base.broadcast!(::typeof(=), a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = (a.kref .+= a.dt .* b) # 2C low storage methods function initialize!(integrator,cache::LowStorageRK2CConstantCache) From ca383bf3d990a1c8a3ffdd718800826f72b94f84 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Wed, 13 Mar 2019 16:08:19 +0530 Subject: [PATCH 05/10] Fixes typo error --- src/algorithms.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms.jl b/src/algorithms.jl index fc584c474e..65d5c2856d 100644 --- a/src/algorithms.jl +++ b/src/algorithms.jl @@ -51,7 +51,7 @@ Anas5(; w=1) = Anas5(w) struct ORK256 <: OrdinaryDiffEqAlgorithm williamson_condition::Bool - QRK256(;williamson_condition=true) = new(williamson_condition) + ORK256(;williamson_condition=true) = new(williamson_condition) end struct CarpenterKennedy2N54 <: OrdinaryDiffEqAlgorithm williamson_condition::Bool From a1817a8ed8678605bcb2166a4c75d33faee77f90 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Thu, 14 Mar 2019 00:48:39 +0530 Subject: [PATCH 06/10] Fixes allocations --- src/caches/low_storage_rk_caches.jl | 85 ++++++++++++++----- .../low_storage_rk_perform_step.jl | 19 +++-- 2 files changed, 77 insertions(+), 27 deletions(-) diff --git a/src/caches/low_storage_rk_caches.jl b/src/caches/low_storage_rk_caches.jl index a6ba1b861f..dced10e3e4 100644 --- a/src/caches/low_storage_rk_caches.jl +++ b/src/caches/low_storage_rk_caches.jl @@ -1,11 +1,13 @@ # 2N low storage methods introduced by Williamson -@cache struct LowStorageRK2NCache{uType,rateType,TabType} <: OrdinaryDiffEqMutableCache +@cache struct LowStorageRK2NCache{uType,rateType,TabType,WrapperType} <: OrdinaryDiffEqMutableCache u::uType uprev::uType k::rateType tmp::uType # tmp acts as second register and fsal both tab::TabType + wrapper::WrapperType + williamson_condition::Bool end struct LowStorageRK2NConstantCache{N,T,T2} <: OrdinaryDiffEqConstantCache @@ -41,17 +43,22 @@ end function alg_cache(alg::ORK256,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = ORK256ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::ORK256,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -84,17 +91,22 @@ end function alg_cache(alg::CarpenterKennedy2N54,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = CarpenterKennedy2N54ConstantCache(real(uBottomEltypeNoUnits),real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::CarpenterKennedy2N54,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -131,17 +143,22 @@ end function alg_cache(alg::HSLDDRK64,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = HSLDDRK64ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::HSLDDRK64,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -180,17 +197,22 @@ end function alg_cache(alg::DGLDDRK73_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = DGLDDRK73_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::DGLDDRK73_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -232,17 +254,22 @@ end function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = DGLDDRK84_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,williamson_condition) end function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -284,17 +311,22 @@ end function alg_cache(alg::DGLDDRK84_F,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = DGLDDRK84_FConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::DGLDDRK84_F,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -348,17 +380,22 @@ end function alg_cache(alg::NDBLSRK124,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = NDBLSRK124ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::NDBLSRK124,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -415,17 +452,22 @@ end function alg_cache(alg::NDBLSRK134,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = NDBLSRK134ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::NDBLSRK134,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) @@ -485,17 +527,22 @@ end function alg_cache(alg::NDBLSRK144,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{true}}) tmp = zero(u) + williamson_condition = alg.williamson_condition if calck k = zero(rate_prototype) + wrapper = nothing + williamson_condition = false else - if alg.williamson_condition + if williamson_condition k = tmp + wrapper = WilliamsonWrapper(tmp, dt) else k = zero(rate_prototype) + wrapper = nothing end end tab = NDBLSRK144ConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::NDBLSRK144,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) diff --git a/src/perform_step/low_storage_rk_perform_step.jl b/src/perform_step/low_storage_rk_perform_step.jl index 34fa6502ce..c480e0803e 100644 --- a/src/perform_step/low_storage_rk_perform_step.jl +++ b/src/perform_step/low_storage_rk_perform_step.jl @@ -34,12 +34,13 @@ end end function initialize!(integrator,cache::LowStorageRK2NCache) - @unpack k, tmp = cache + @unpack k, tmp, wrapper, williamson_condition = cache integrator.kshortsize = 1 resize!(integrator.k, integrator.kshortsize) integrator.k[1] = k - if integrator.alg.williamson_condition - integrator.f(WilliamsonWrapper(tmp,integrator.dt),integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation + if williamson_condition + wrapper.dt = integrator.dt + integrator.f(wrapper,integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation else integrator.f(k ,integrator.uprev,integrator.p,integrator.t) # FSAL for interpolation @. tmp += integrator.dt * k @@ -49,17 +50,19 @@ end @muladd function perform_step!(integrator,cache::LowStorageRK2NCache,repeat_step=false) @unpack t,dt,u,f,p = integrator - @unpack k,tmp = cache + @unpack k,tmp,wrapper,williamson_condition = cache @unpack A2end,B1,B2end,c2end = cache.tab # u1 @. u = u + B1*tmp - + if williamson_condition + wrapper.dt = dt + end # other stages for i in eachindex(A2end) @. tmp = A2end[i]*tmp - if integrator.alg.williamson_condition - f(WilliamsonWrapper(tmp,dt), u, p, t+c2end[i]*dt) + if williamson_condition + f(wrapper, u, p, t+c2end[i]*dt) else f(k, u, p, t+c2end[i]*dt) @. tmp += dt * k @@ -73,7 +76,7 @@ end integrator.destats.nf += 1 end -struct WilliamsonWrapper{kType, dtType} +mutable struct WilliamsonWrapper{kType, dtType} kref::kType dt::dtType end From 25440e9d5ad71e7c0deeb8ce0cf9e0712a450b93 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Thu, 14 Mar 2019 02:53:25 +0530 Subject: [PATCH 07/10] Fixes CI Failure --- src/caches/low_storage_rk_caches.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caches/low_storage_rk_caches.jl b/src/caches/low_storage_rk_caches.jl index dced10e3e4..5d8d011952 100644 --- a/src/caches/low_storage_rk_caches.jl +++ b/src/caches/low_storage_rk_caches.jl @@ -269,7 +269,7 @@ function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltyp end end tab = DGLDDRK84_CConstantCache(real(uBottomEltypeNoUnits), real(tTypeNoUnits)) - LowStorageRK2NCache(u,uprev,k,tmp,tab,williamson_condition) + LowStorageRK2NCache(u,uprev,k,tmp,tab,wrapper,williamson_condition) end function alg_cache(alg::DGLDDRK84_C,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Type{Val{false}}) From 81c5ba8ef76c2d118c4f6ed6d3f65a9dab660c77 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Thu, 14 Mar 2019 16:38:56 +0530 Subject: [PATCH 08/10] Updates low storage tests --- test/ode/ode_low_storage_rk_tests.jl | 36 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/test/ode/ode_low_storage_rk_tests.jl b/test/ode/ode_low_storage_rk_tests.jl index c2c6e2b6ee..20557c3861 100644 --- a/test/ode/ode_low_storage_rk_tests.jl +++ b/test/ode/ode_low_storage_rk_tests.jl @@ -52,9 +52,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -77,9 +77,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -102,9 +102,9 @@ for prob in test_problems_nonlinear @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -127,9 +127,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -152,9 +152,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -177,9 +177,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -202,9 +202,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -227,9 +227,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -252,9 +252,9 @@ for prob in test_problems_nonlinear @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) -@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 -integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 +integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) From 35a7c7e655f56f842f07ff05e29e872387823aa2 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Fri, 15 Mar 2019 12:27:01 +0530 Subject: [PATCH 09/10] Adds extra tests --- test/ode/ode_low_storage_rk_tests.jl | 105 ++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 3 deletions(-) diff --git a/test/ode/ode_low_storage_rk_tests.jl b/test/ode/ode_low_storage_rk_tests.jl index 20557c3861..e2df60e0ba 100644 --- a/test/ode/ode_low_storage_rk_tests.jl +++ b/test/ode/ode_low_storage_rk_tests.jl @@ -38,23 +38,34 @@ prob_ode_large = ODEProblem((du,u,p,t)-> du .= u, u0_large, (0.0,1.0)) alg = ORK256() +alg2 = ORK256(;williamson_condition=false) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -63,23 +74,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = CarpenterKennedy2N54() +alg2 = CarpenterKennedy2N54(;williamson_condition=false) dts = 1 ./ 2 .^(7:-1:3) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -88,23 +110,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = HSLDDRK64() +alg2 = HSLDDRK64(;williamson_condition=true) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test_broken sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -113,23 +146,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = DGLDDRK73_C() +alg2 = DGLDDRK73_C(;williamson_condition=false) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -138,23 +182,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = DGLDDRK84_C() +alg2 = DGLDDRK84_C(;williamson_condition=false) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -163,23 +218,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = DGLDDRK84_F() +alg2 = DGLDDRK84_F(;williamson_condition=false) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -188,23 +254,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = NDBLSRK124() +alg2 = NDBLSRK124(;williamson_condition=false) dts = 1 ./ 2 .^(7:-1:3) for prob in test_problems_only_time - sim = test_convergence(dts, prob, alg) + sim = test_convergence(dts, prob, alg) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear - sim = test_convergence(dts, prob, alg) + sim = test_convergence(dts, prob, alg) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear - sim = test_convergence(dts, prob, alg) + sim = test_convergence(dts, prob, alg) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -213,23 +290,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = NDBLSRK134() +alg2 = NDBLSRK134(;williamson_condition=false) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) @@ -238,23 +326,34 @@ sol_new = solve(new_prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=fa alg = NDBLSRK144() +alg2 = NDBLSRK144(;williamson_condition=false) dts = 1 ./ 2 .^(8:-1:4) for prob in test_problems_only_time sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_linear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end for prob in test_problems_nonlinear sim = test_convergence(dts, prob, alg) @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol + sim = test_convergence(dts, prob, alg2) + @test sim.𝒪est[:final] ≈ OrdinaryDiffEq.alg_order(alg) atol=testTol end integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 integ = init(prob_ode_large, alg, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) @test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 2 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 4 +integ = init(prob_ode_large, alg2, dt=1.e-2, save_start=false, save_end=false, save_everystep=false, alias_u0=true) +@test Base.summarysize(integ) ÷ Base.summarysize(u0_large) <= 3 # test whether aliasing u0 is bad new_prob_ode_nonlinear_inplace = ODEProblem(prob_ode_nonlinear_inplace.f,[1.],(0.,0.5)) sol_old = solve(prob_ode_nonlinear_inplace, alg, dt=1.e-4, save_everystep=false, save_start=false) From e4e8ffdd9a1908d188572eef976b2fe2ab3a2da2 Mon Sep 17 00:00:00 2001 From: kanav99 Date: Fri, 15 Mar 2019 23:31:04 +0530 Subject: [PATCH 10/10] Removes getindex for WilliamsonWrapper --- src/perform_step/low_storage_rk_perform_step.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/perform_step/low_storage_rk_perform_step.jl b/src/perform_step/low_storage_rk_perform_step.jl index c480e0803e..48e8204fba 100644 --- a/src/perform_step/low_storage_rk_perform_step.jl +++ b/src/perform_step/low_storage_rk_perform_step.jl @@ -82,7 +82,6 @@ mutable struct WilliamsonWrapper{kType, dtType} end @inline Base.setindex!(a::WilliamsonWrapper{kType, dtType}, b::bType, c::cType) where {kType, dtType, bType, cType} = (a.kref[c] += a.dt * b) -@inline Base.getindex(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = a.kref[b] @inline Base.size(a::WilliamsonWrapper{kType, dtType}) where {kType, dtType} = size(a.kref) @inline Base.copyto!(a::WilliamsonWrapper{kType, dtType}, b::bType) where {kType, dtType, bType} = @. a.kref += a.dt * b