Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reducing memory requirements of 2N methods for special functions #691

Merged
merged 10 commits into from
Mar 16, 2019
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/alg_utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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])

Expand Down
45 changes: 36 additions & 9 deletions src/algorithms.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
ORK256(;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
Expand Down
169 changes: 121 additions & 48 deletions src/caches/low_storage_rk_caches.jl
Original file line number Diff line number Diff line change
@@ -1,12 +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
fsalfirst::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
Expand Down Expand Up @@ -41,15 +42,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -81,15 +90,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -125,15 +142,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -171,15 +196,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -220,15 +253,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,tab)
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}})
Expand Down Expand Up @@ -269,15 +310,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -330,15 +379,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -394,15 +451,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down Expand Up @@ -461,15 +526,23 @@ 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)
k = zero(rate_prototype)
tmp = zero(u)
williamson_condition = alg.williamson_condition
if calck
fsalfirst = zero(rate_prototype)
k = zero(rate_prototype)
wrapper = nothing
williamson_condition = false
else
fsalfirst = k
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,fsalfirst,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}})
Expand Down
Loading