@@ -41,12 +41,24 @@ mutable struct RosenbrockCache{uType, rateType, uNoUnitsType, JType, WType, TabT
41
41
alg:: A
42
42
step_limiter!:: StepLimiter
43
43
stage_limiter!:: StageLimiter
44
+ interp_order:: Int
44
45
end
45
46
function full_cache (c:: RosenbrockCache )
46
47
return [c. u, c. uprev, c. dense... , c. du, c. du1, c. du2,
47
48
c. ks... , c. fsalfirst, c. fsallast, c. dT, c. tmp, c. atmp, c. weight, c. linsolve_tmp]
48
49
end
49
50
51
+ struct RosenbrockCombinedConstantCache{TF, UF, Tab, JType, WType, F, AD} <: RosenbrockConstantCache
52
+ tf:: TF
53
+ uf:: UF
54
+ tab:: Tab
55
+ J:: JType
56
+ W:: WType
57
+ linsolve:: F
58
+ autodiff:: AD
59
+ interp_order:: Int
60
+ end
61
+
50
62
@cache mutable struct Rosenbrock23Cache{uType, rateType, uNoUnitsType, JType, WType,
51
63
TabType, TFType, UFType, F, JCType, GCType,
52
64
RTolType, A, AV, StepLimiter, StageLimiter} <: RosenbrockMutableCache
@@ -702,22 +714,16 @@ end
702
714
703
715
# ## Rodas4 methods
704
716
705
- struct Rodas4ConstantCache{TF, UF, Tab, JType, WType, F, AD} <: RosenbrockConstantCache
706
- tf:: TF
707
- uf:: UF
708
- tab:: Tab
709
- J:: JType
710
- W:: WType
711
- linsolve:: F
712
- autodiff:: AD
713
- end
714
-
715
717
tabtype (:: Rodas4 ) = Rodas4Tableau
716
718
tabtype (:: Rodas42 ) = Rodas42Tableau
717
719
tabtype (:: Rodas4P ) = Rodas4PTableau
718
720
tabtype (:: Rodas4P2 ) = Rodas4P2Tableau
721
+ tabtype (:: Rodas5 ) = Rodas5Tableau
722
+ tabtype (:: Rodas5P ) = Rodas5PTableau
723
+ tabtype (:: Rodas5Pr ) = Rodas5PTableau
724
+ tabtype (:: Rodas5Pe ) = Rodas5PTableau
719
725
720
- function alg_cache (alg:: Union{Rodas4, Rodas42, Rodas4P, Rodas4P2} ,
726
+ function alg_cache (alg:: Union{Rodas4, Rodas42, Rodas4P, Rodas4P2, Rodas5, Rodas5P, Rodas5Pe, Rodas5Pr } ,
721
727
u, rate_prototype, :: Type{uEltypeNoUnits} ,
722
728
:: Type{uBottomEltypeNoUnits} , :: Type{tTypeNoUnits} , uprev, uprev2, f, t,
723
729
dt, reltol, p, calck,
@@ -727,21 +733,22 @@ function alg_cache(alg::Union{Rodas4, Rodas42, Rodas4P, Rodas4P2},
727
733
J, W = build_J_W (alg, u, uprev, p, t, dt, f, uEltypeNoUnits, Val (false ))
728
734
linprob = nothing # LinearProblem(W,copy(u); u0=copy(u))
729
735
linsolve = nothing # init(linprob,alg.linsolve,alias_A=true,alias_b=true)
730
- Rodas4ConstantCache (tf, uf,
731
- tabtype (alg)( constvalue (uBottomEltypeNoUnits) ,
732
- constvalue (tTypeNoUnits)) , J, W, linsolve,
733
- alg_autodiff (alg))
736
+ tab = tabtype (alg)( constvalue (uBottomEltypeNoUnits), constvalue (tTypeNoUnits))
737
+ RosenbrockCombinedConstantCache (tf, uf ,
738
+ tab , J, W, linsolve,
739
+ alg_autodiff (alg), size (tab . H, 1 ) )
734
740
end
735
741
736
- function alg_cache (alg:: Union{Rodas4, Rodas42, Rodas4P, Rodas4P2} ,
742
+ function alg_cache (alg:: Union{Rodas4, Rodas42, Rodas4P, Rodas4P2, Rodas5, Rodas5P, Rodas5Pe, Rodas5Pr } ,
737
743
u, rate_prototype, :: Type{uEltypeNoUnits} ,
738
744
:: Type{uBottomEltypeNoUnits} , :: Type{tTypeNoUnits} , uprev, uprev2, f, t,
739
745
dt, reltol, p, calck,
740
746
:: Val{true} ) where {uEltypeNoUnits, uBottomEltypeNoUnits, tTypeNoUnits}
741
747
748
+ tab = tabtype (alg)(constvalue (uBottomEltypeNoUnits), constvalue (tTypeNoUnits))
742
749
# Initialize vectors
743
- dense = [zero (rate_prototype) for _ in 1 : 2 ]
744
- ks = [zero (rate_prototype) for _ in 1 : 6 ]
750
+ dense = [zero (rate_prototype) for _ in 1 : size (tab . H, 1 ) ]
751
+ ks = [zero (rate_prototype) for _ in 1 : size (tab . A, 1 ) ]
745
752
du = zero (rate_prototype)
746
753
du1 = zero (rate_prototype)
747
754
du2 = zero (rate_prototype)
@@ -760,7 +767,6 @@ function alg_cache(alg::Union{Rodas4, Rodas42, Rodas4P, Rodas4P2},
760
767
recursivefill! (atmp, false )
761
768
weight = similar (u, uEltypeNoUnits)
762
769
recursivefill! (weight, false )
763
- tab = tabtype (alg)(constvalue (uBottomEltypeNoUnits), constvalue (tTypeNoUnits))
764
770
765
771
tf = TimeGradientWrapper (f, uprev, p)
766
772
uf = UJacobianWrapper (f, t, p)
@@ -783,190 +789,9 @@ function alg_cache(alg::Union{Rodas4, Rodas42, Rodas4P, Rodas4P2},
783
789
u, uprev, dense, du, du1, du2, ks, fsalfirst, fsallast,
784
790
dT, J, W, tmp, atmp, weight, tab, tf, uf, linsolve_tmp,
785
791
linsolve, jac_config, grad_config, reltol, alg,
786
- alg. step_limiter!, alg. stage_limiter!)
787
- end
788
-
789
- # ###############################################################################
790
-
791
- # ## Rosenbrock5
792
-
793
- struct Rosenbrock5ConstantCache{TF, UF, Tab, JType, WType, F} <: RosenbrockConstantCache
794
- tf:: TF
795
- uf:: UF
796
- tab:: Tab
797
- J:: JType
798
- W:: WType
799
- linsolve:: F
800
- end
801
-
802
- @cache mutable struct Rosenbrock5Cache{
803
- uType, rateType, uNoUnitsType, JType, WType, TabType,
804
- TFType, UFType, F, JCType, GCType, RTolType, A, StepLimiter, StageLimiter} < :
805
- RosenbrockMutableCache
806
- u:: uType
807
- uprev:: uType
808
- dense1:: rateType
809
- dense2:: rateType
810
- dense3:: rateType
811
- du:: rateType
812
- du1:: rateType
813
- du2:: rateType
814
- k1:: rateType
815
- k2:: rateType
816
- k3:: rateType
817
- k4:: rateType
818
- k5:: rateType
819
- k6:: rateType
820
- k7:: rateType
821
- k8:: rateType
822
- fsalfirst:: rateType
823
- fsallast:: rateType
824
- dT:: rateType
825
- J:: JType
826
- W:: WType
827
- tmp:: rateType
828
- atmp:: uNoUnitsType
829
- weight:: uNoUnitsType
830
- tab:: TabType
831
- tf:: TFType
832
- uf:: UFType
833
- linsolve_tmp:: rateType
834
- linsolve:: F
835
- jac_config:: JCType
836
- grad_config:: GCType
837
- reltol:: RTolType
838
- alg:: A
839
- step_limiter!:: StepLimiter
840
- stage_limiter!:: StageLimiter
792
+ alg. step_limiter!, alg. stage_limiter!, size (tab. H, 1 ))
841
793
end
842
794
843
- function alg_cache (alg:: Rodas5 , u, rate_prototype, :: Type{uEltypeNoUnits} ,
844
- :: Type{uBottomEltypeNoUnits} , :: Type{tTypeNoUnits} , uprev, uprev2, f, t,
845
- dt, reltol, p, calck,
846
- :: Val{true} ) where {uEltypeNoUnits, uBottomEltypeNoUnits, tTypeNoUnits}
847
- dense1 = zero (rate_prototype)
848
- dense2 = zero (rate_prototype)
849
- dense3 = zero (rate_prototype)
850
- du = zero (rate_prototype)
851
- du1 = zero (rate_prototype)
852
- du2 = zero (rate_prototype)
853
- k1 = zero (rate_prototype)
854
- k2 = zero (rate_prototype)
855
- k3 = zero (rate_prototype)
856
- k4 = zero (rate_prototype)
857
- k5 = zero (rate_prototype)
858
- k6 = zero (rate_prototype)
859
- k7 = zero (rate_prototype)
860
- k8 = zero (rate_prototype)
861
- fsalfirst = zero (rate_prototype)
862
- fsallast = zero (rate_prototype)
863
- dT = zero (rate_prototype)
864
- J, W = build_J_W (alg, u, uprev, p, t, dt, f, uEltypeNoUnits, Val (true ))
865
- tmp = zero (rate_prototype)
866
- atmp = similar (u, uEltypeNoUnits)
867
- recursivefill! (atmp, false )
868
- weight = similar (u, uEltypeNoUnits)
869
- recursivefill! (weight, false )
870
- tab = Rodas5Tableau (constvalue (uBottomEltypeNoUnits), constvalue (tTypeNoUnits))
871
-
872
- tf = TimeGradientWrapper (f, uprev, p)
873
- uf = UJacobianWrapper (f, t, p)
874
- linsolve_tmp = zero (rate_prototype)
875
- linprob = LinearProblem (W, _vec (linsolve_tmp); u0 = _vec (tmp))
876
- Pl, Pr = wrapprecs (
877
- alg. precs (W, nothing , u, p, t, nothing , nothing , nothing ,
878
- nothing )... , weight, tmp)
879
- linsolve = init (linprob, alg. linsolve, alias_A = true , alias_b = true ,
880
- Pl = Pl, Pr = Pr,
881
- assumptions = LinearSolve. OperatorAssumptions (true ))
882
- grad_config = build_grad_config (alg, f, tf, du1, t)
883
- jac_config = build_jac_config (alg, f, uf, du1, uprev, u, tmp, du2)
884
- Rosenbrock5Cache (u, uprev, dense1, dense2, dense3, du, du1, du2, k1, k2, k3, k4,
885
- k5, k6, k7, k8,
886
- fsalfirst, fsallast, dT, J, W, tmp, atmp, weight, tab, tf, uf,
887
- linsolve_tmp,
888
- linsolve, jac_config, grad_config, reltol, alg, alg. step_limiter!,
889
- alg. stage_limiter!)
890
- end
891
-
892
- function alg_cache (alg:: Rodas5 , u, rate_prototype, :: Type{uEltypeNoUnits} ,
893
- :: Type{uBottomEltypeNoUnits} , :: Type{tTypeNoUnits} , uprev, uprev2, f, t,
894
- dt, reltol, p, calck,
895
- :: Val{false} ) where {uEltypeNoUnits, uBottomEltypeNoUnits, tTypeNoUnits}
896
- tf = TimeDerivativeWrapper (f, u, p)
897
- uf = UDerivativeWrapper (f, t, p)
898
- J, W = build_J_W (alg, u, uprev, p, t, dt, f, uEltypeNoUnits, Val (false ))
899
- linprob = nothing # LinearProblem(W,copy(u); u0=copy(u))
900
- linsolve = nothing # init(linprob,alg.linsolve,alias_A=true,alias_b=true)
901
- Rosenbrock5ConstantCache (tf, uf,
902
- Rodas5Tableau (constvalue (uBottomEltypeNoUnits),
903
- constvalue (tTypeNoUnits)), J, W, linsolve)
904
- end
905
-
906
- function alg_cache (
907
- alg:: Union{Rodas5P, Rodas5Pe, Rodas5Pr} , u, rate_prototype, :: Type{uEltypeNoUnits} ,
908
- :: Type{uBottomEltypeNoUnits} , :: Type{tTypeNoUnits} , uprev, uprev2, f, t,
909
- dt, reltol, p, calck,
910
- :: Val{true} ) where {uEltypeNoUnits, uBottomEltypeNoUnits, tTypeNoUnits}
911
- dense1 = zero (rate_prototype)
912
- dense2 = zero (rate_prototype)
913
- dense3 = zero (rate_prototype)
914
- du = zero (rate_prototype)
915
- du1 = zero (rate_prototype)
916
- du2 = zero (rate_prototype)
917
- k1 = zero (rate_prototype)
918
- k2 = zero (rate_prototype)
919
- k3 = zero (rate_prototype)
920
- k4 = zero (rate_prototype)
921
- k5 = zero (rate_prototype)
922
- k6 = zero (rate_prototype)
923
- k7 = zero (rate_prototype)
924
- k8 = zero (rate_prototype)
925
- fsalfirst = zero (rate_prototype)
926
- fsallast = zero (rate_prototype)
927
- dT = zero (rate_prototype)
928
- J, W = build_J_W (alg, u, uprev, p, t, dt, f, uEltypeNoUnits, Val (true ))
929
- tmp = zero (rate_prototype)
930
- atmp = similar (u, uEltypeNoUnits)
931
- recursivefill! (atmp, false )
932
- weight = similar (u, uEltypeNoUnits)
933
- recursivefill! (weight, false )
934
- tab = Rodas5PTableau (constvalue (uBottomEltypeNoUnits), constvalue (tTypeNoUnits))
935
-
936
- tf = TimeGradientWrapper (f, uprev, p)
937
- uf = UJacobianWrapper (f, t, p)
938
- linsolve_tmp = zero (rate_prototype)
939
- linprob = LinearProblem (W, _vec (linsolve_tmp); u0 = _vec (tmp))
940
- Pl, Pr = wrapprecs (
941
- alg. precs (W, nothing , u, p, t, nothing , nothing , nothing ,
942
- nothing )... , weight, tmp)
943
- linsolve = init (linprob, alg. linsolve, alias_A = true , alias_b = true ,
944
- Pl = Pl, Pr = Pr,
945
- assumptions = LinearSolve. OperatorAssumptions (true ))
946
- grad_config = build_grad_config (alg, f, tf, du1, t)
947
- jac_config = build_jac_config (alg, f, uf, du1, uprev, u, tmp, du2)
948
- Rosenbrock5Cache (u, uprev, dense1, dense2, dense3, du, du1, du2, k1, k2, k3, k4,
949
- k5, k6, k7, k8,
950
- fsalfirst, fsallast, dT, J, W, tmp, atmp, weight, tab, tf, uf,
951
- linsolve_tmp,
952
- linsolve, jac_config, grad_config, reltol, alg, alg. step_limiter!,
953
- alg. stage_limiter!)
954
- end
955
-
956
- function alg_cache (
957
- alg:: Union{Rodas5P, Rodas5Pe, Rodas5Pr} , u, rate_prototype, :: Type{uEltypeNoUnits} ,
958
- :: Type{uBottomEltypeNoUnits} , :: Type{tTypeNoUnits} , uprev, uprev2, f, t,
959
- dt, reltol, p, calck,
960
- :: Val{false} ) where {uEltypeNoUnits, uBottomEltypeNoUnits, tTypeNoUnits}
961
- tf = TimeDerivativeWrapper (f, u, p)
962
- uf = UDerivativeWrapper (f, t, p)
963
- J, W = build_J_W (alg, u, uprev, p, t, dt, f, uEltypeNoUnits, Val (false ))
964
- linprob = nothing # LinearProblem(W,copy(u); u0=copy(u))
965
- linsolve = nothing # init(linprob,alg.linsolve,alias_A=true,alias_b=true)
966
- Rosenbrock5ConstantCache (tf, uf,
967
- Rodas5PTableau (constvalue (uBottomEltypeNoUnits),
968
- constvalue (tTypeNoUnits)), J, W, linsolve)
969
- end
970
795
971
796
function get_fsalfirstlast (
972
797
cache:: Union {Rosenbrock23Cache, Rosenbrock32Cache, Rosenbrock33Cache,
0 commit comments