Skip to content

Commit 75ec5dd

Browse files
Merge pull request #1033 from utkarsh530/FRK65
Zero Dissipation ERK6(5)
2 parents 46b4763 + c15a279 commit 75ec5dd

File tree

6 files changed

+376
-2
lines changed

6 files changed

+376
-2
lines changed

src/OrdinaryDiffEq.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ module OrdinaryDiffEq
176176

177177
export FunctionMap, Euler, Heun, Ralston, Midpoint, RK4, ExplicitRK, OwrenZen3, OwrenZen4, OwrenZen5,
178178
BS3, BS5, RK46NL, DP5, Tsit5, DP8, Vern6, Vern7, Vern8, TanYam7, TsitPap8,
179-
Vern9, Feagin10, Feagin12, Feagin14, CompositeAlgorithm, Anas5, RKO65
179+
Vern9, Feagin10, Feagin12, Feagin14, CompositeAlgorithm, Anas5, RKO65, FRK65
180180

181181
export SSPRK22, SSPRK33, SSPRK53, SSPRK53_2N1, SSPRK53_2N2, SSPRK63, SSPRK73, SSPRK83, SSPRK432,
182182
SSPRKMSVS32, SSPRKMSVS43, SSPRK932, SSPRK54, SSPRK104

src/alg_utils.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ isfsal(alg::NDBLSRK144) = false
2525
isfsal(alg::PDIRK44) = false
2626
isfsal(alg::DImplicitEuler) = false
2727
isfsal(alg::RKO65) = false
28+
isfsal(alg::FRK65) = true
2829

2930
get_current_isfsal(alg, cache) = isfsal(alg)
3031
get_current_isfsal(alg::CompositeAlgorithm, cache) = isfsal(alg.algs[cache.current])
@@ -164,7 +165,7 @@ alg_order(alg::Anas5) = 5
164165
alg_order(alg::RK46NL) = 4
165166
alg_order(alg::KuttaPRK2p5) = 5
166167
alg_order(alg::RKO65) = 5
167-
168+
alg_order(alg::FRK65) = 6
168169

169170
alg_order(alg::SymplecticEuler) = 1
170171
alg_order(alg::VelocityVerlet) = 2

src/algorithms.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,11 @@ struct Vern9 <: OrdinaryDiffEqAdaptiveAlgorithm
398398
lazy::Bool
399399
Vern9(;lazy=true) = new(lazy)
400400
end
401+
struct FRK65{T} <: OrdinaryDiffEqAdaptiveAlgorithm
402+
omega::T
403+
FRK65(omega=0.0) = new{typeof(omega)}(omega)
404+
end
405+
401406

402407
################################################################################
403408

src/caches/low_order_rk_caches.jl

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,3 +617,248 @@ function alg_cache(alg::RKO65,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUni
617617
tab = RKO65ConstantCache(constvalue(uBottomEltypeNoUnits),constvalue(tTypeNoUnits))
618618
RKO65Cache(u,uprev,k, k1,k2,k3,k4,k5,k6, tmp, fsalfirst, tab)
619619
end
620+
621+
@cache struct FRK65Cache{uType,rateType,uNoUnitsType,TabType} <: OrdinaryDiffEqMutableCache
622+
u::uType
623+
uprev::uType
624+
utilde::uType
625+
k1::rateType
626+
k2::rateType
627+
k3::rateType
628+
k4::rateType
629+
k5::rateType
630+
k6::rateType
631+
k7::rateType
632+
k8::rateType
633+
k9::rateType
634+
tmp::uType
635+
atmp::uNoUnitsType
636+
tab::TabType
637+
end
638+
639+
struct FRK65ConstantCache{T1,T2} <: OrdinaryDiffEqConstantCache
640+
641+
α21::T1
642+
α31::T1
643+
α41::T1
644+
α51::T1
645+
α61::T1
646+
α71::T1
647+
α81::T1
648+
α91::T1
649+
650+
α32::T1
651+
652+
α43::T1
653+
α53::T1
654+
α63::T1
655+
α73::T1
656+
α83::T1
657+
658+
α54::T1
659+
α64::T1
660+
α74::T1
661+
α84::T1
662+
α94::T1
663+
664+
α65::T1
665+
α75::T1
666+
α85::T1
667+
α95::T1
668+
669+
α76::T1
670+
α86::T1
671+
α96::T1
672+
673+
α87::T1
674+
α97::T1
675+
676+
α98::T1
677+
678+
β1::T1
679+
# β4::T1
680+
# β5::T1
681+
# β6::T1
682+
β7::T1
683+
β8::T1
684+
685+
β1tilde::T1
686+
β4tilde::T1
687+
β5tilde::T1
688+
β6tilde::T1
689+
β7tilde::T1
690+
β8tilde::T1
691+
β9tilde::T1
692+
693+
c2::T2
694+
c3::T2
695+
c4::T2
696+
c5::T2
697+
c6::T2
698+
c7::T2
699+
c8::T2
700+
c9::T2
701+
702+
d1::T1
703+
d2::T1
704+
d3::T1
705+
d4::T1
706+
d5::T1
707+
d6::T1
708+
d7::T1
709+
d8::T1
710+
d9::T1
711+
d10::T1
712+
d11::T1
713+
d12::T1
714+
d13::T1
715+
716+
e1::T1
717+
e2::T1
718+
e3::T1
719+
e4::T1
720+
e5::T1
721+
e6::T1
722+
e7::T1
723+
e8::T1
724+
e9::T1
725+
e10::T1
726+
e11::T1
727+
728+
f1::T1
729+
f2::T1
730+
f3::T1
731+
f4::T1
732+
f5::T1
733+
f6::T1
734+
f7::T1
735+
f8::T1
736+
f9::T1
737+
f10::T1
738+
f11::T1
739+
740+
function FRK65ConstantCache(T1,T2)
741+
742+
# elements of Butcher Table
743+
α21 = T1(1//89)
744+
α31 = T1(-38624//142129)
745+
α41 = T1(51//1508)
746+
α51 = T1(3259284578//3517556363)
747+
α61 = T1(-108363632681//45875676369)
748+
α71 = T1(7137368591//11299833148)
749+
α81 = T1(8898824396//9828950919)
750+
α91 = T1(1026331676//33222204855)
751+
752+
α32 = T1(51442//142129)
753+
754+
α43 = T1(153//1508)
755+
α53 = T1(-69727055112//19553806387)
756+
α63 = T1(80902506271//8700424616)
757+
α73 = T1(-33088067061//10572251159)
758+
α83 = T1(25673454973//11497947835)
759+
760+
761+
α54 = T1(36230363390//11788838981)
762+
α64 = T1(-120088218786//17139312481)
763+
α74 = T1(11481363823//3650030081)
764+
α84 = T1(-74239028301//15737704666)
765+
α94 = T1(1450675392//5936579813)
766+
767+
α65 = T1(4533285649//6676940598)
768+
α75 = T1(-4096673444//7349814937)
769+
α85 = T1(222688842816//44196813415)
770+
α95 = T1(4617877550//16762182457)
771+
772+
α76 = T1(9911918171//12847192605)
773+
α86 = T1(-105204445705//30575217706)
774+
α96 = T1(1144867463//6520294355)
775+
776+
α87 = T1(8799291910//8966990271)
777+
α97 = T1(1822809703//7599996644)
778+
779+
α98 = T1(79524953//2351253316)
780+
781+
β1 = T1(1026331676//33222204855)
782+
#β4 = T1(1450675392//5936579813)
783+
#β5 = T1(4617877550//16762182457)
784+
#β6 = T1(1144867463//6520294355)
785+
β7 = T1(1822809703//7599996644)
786+
β8 = T1(79524953//2351253316)
787+
788+
β1tilde = T1(413034411//13925408836)
789+
β4tilde = T1(1865954212//7538591735)
790+
β5tilde = T1(4451980162//16576017119)
791+
β6tilde = T1(1157843020//6320223511)
792+
β7tilde = T1(802708729//3404369569)
793+
β8tilde = T1(-251398161//17050111121)
794+
β9tilde = T1(1//20)
795+
796+
c2 = T2(1//89)
797+
c3 = T2(34//377)
798+
c4 = T2(51//377)
799+
c5 = T2(14497158//33407747)
800+
c6 = T2(9744566553//16002998914)
801+
c7 = T2(330//383)
802+
c8 = T2(1//1)
803+
c9 = T2(1//1)
804+
805+
d1 = T1(140209127//573775965)
806+
d2 = T1(-8530039//263747097)
807+
d3 = T1(-308551//104235790)
808+
d4 = T1(233511//333733259)
809+
d5 = T1(9126//184950985)
810+
d6 = T1(22//50434083)
811+
d7 = T1(19//424427471)
812+
d8 = T1(-28711//583216934059)
813+
d9 = T1(-3831531//316297807)
814+
d10 = T1(551767//187698280)
815+
d11 = T1(9205//210998423)
816+
d12 = T1(-250//519462673)
817+
d13 = T1(67//327513887)
818+
819+
e1=T1(437217689//1587032700)
820+
e2=T1(-15824413//592362279)
821+
e3=T1(-1563775//341846569)
822+
e4=T1(270497//369611210)
823+
e5=T1(-26623//453099487)
824+
e6=T1(-616297487849)
825+
e7=T1(-47682337//491732789)
826+
e8=T1(-4778275//287766311)
827+
e9=T1(641177//265376522)
828+
e10=T1(44633//291742143)
829+
e11=T1(611//223639880)
830+
831+
f1=T1(44861261//255495624)
832+
f2=T1(-11270940//352635157)
833+
f3=T1(-182222//232874507)
834+
f4=T1(164263//307215200)
835+
f5=T1(32184//652060417)
836+
f6=T1(-352//171021903)
837+
f7=T1(-18395427//101056291)
838+
f8=T1(-621686//139501937)
839+
f9=T1(2030024//612171255)
840+
f10=T1(-711049//7105160932)
841+
f11=T1(267//333462710)
842+
843+
new{T1,T2}(α21, α31, α41, α51, α61, α71, α81, α91, α32, α43, α53, α63, α73, α83, α54, α64, α74, α84, α94, α65, α75, α85, α95, α76, α86, α96, α87, α97, α98, β1, β7, β8, β1tilde, β4tilde, β5tilde, β6tilde, β7tilde, β8tilde, β9tilde, c2, c3, c4, c5, c6, c7, c8, c9, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11)
844+
end
845+
end
846+
847+
alg_cache(alg::FRK65,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Val{false}) = FRK65ConstantCache(constvalue(uBottomEltypeNoUnits),constvalue(tTypeNoUnits))
848+
849+
function alg_cache(alg::FRK65,u,rate_prototype,uEltypeNoUnits,uBottomEltypeNoUnits,tTypeNoUnits,uprev,uprev2,f,t,dt,reltol,p,calck,::Val{true})
850+
tab = FRK65ConstantCache(constvalue(uBottomEltypeNoUnits),constvalue(tTypeNoUnits))
851+
k1 = zero(rate_prototype)
852+
k2 = zero(rate_prototype)
853+
k3 = zero(rate_prototype)
854+
k4 = zero(rate_prototype)
855+
k5 = zero(rate_prototype)
856+
k6 = zero(rate_prototype)
857+
k7 = zero(rate_prototype)
858+
k8 = zero(rate_prototype)
859+
k9 = zero(rate_prototype)
860+
utilde = similar(u)
861+
atmp = similar(u,uEltypeNoUnits)
862+
tmp = similar(u)
863+
FRK65Cache(u, uprev, utilde, k1, k2, k3, k4, k5, k6, k7, k8, k9, tmp, atmp, tab)
864+
end

0 commit comments

Comments
 (0)