@@ -63,7 +63,7 @@ function convergence_table(dts, prob, algs, labels, test_setup)
6363
6464 # print table
6565 formatter = (v, i, j) -> (j>1) ? (@sprintf "%5.2e (%4.2f) " v[1] v[2]) : (@sprintf "%5.2e " v)
66- pretty_table(data, formatters = formatter, header = ["Δt"; labels])
66+ pretty_table(data; formatters = [ formatter], column_labels = ["Δt"; labels])
6767end
6868
6969nothing # hide
@@ -78,21 +78,28 @@ First, we test several second-order and third-order MPRK schemes.
7878dts = 0.5 .^ (5:10)
7979
8080# select 2nd order schemes
81- algs2 = [MPRK22(0.5); MPRK22(2.0 / 3.0); MPRK22(1.0); SSPMPRK22(0.5, 1.0); MPDeC(2)]
82- labels2 = ["MPRK22(0.5)"; "MPRK22(2.0/3.0)"; "MPRK22(1.0)"; "SSPMPRK22(0.5, 1.0)"; "MPDeC(2)"]
81+ algs2a = [MPRK22(0.5); MPRK22(2.0 / 3.0); MPRK22(1.0)]
82+ labels2a = ["MPRK22(0.5)"; "MPRK22(2.0/3.0)"; "MPRK22(1.0)"]
83+ algs2b = [SSPMPRK22(0.5, 1.0); MPDeC(2)]
84+ labels2b = ["SSPMPRK22(0.5, 1.0)"; "MPDeC(2)"]
8385
8486# select 3rd order schemes
85- algs3 = [MPRK43I(1.0, 0.5); MPRK43I(0.5, 0.75); MPRK43II(0.5); MPRK43II(2.0 / 3.0);
86- SSPMPRK43(); MPDeC(3)]
87- labels3 = ["MPRK43I(1.0,0.5)"; "MPRK43I(0.5, 0.75)"; "MPRK43II(0.5)"; "MPRK43II(2.0/3.0)";
88- "SSPMPRK43()"; "MPDeC(3)"]
89-
90- convergence_table(dts, prob, algs2, labels2, test_setup)
91-
92- convergence_table(dts, prob, algs3, labels3, test_setup)
87+ algs3a = [MPRK43I(1.0, 0.5); MPRK43I(0.5, 0.75)]
88+ labels3a = ["MPRK43I(1.0,0.5)"; "MPRK43I(0.5, 0.75)"]
89+ algs3b = [MPRK43II(0.5); MPRK43II(2.0 / 3.0)]
90+ labels3b = [ "MPRK43II(0.5)"; "MPRK43II(2.0/3.0)"]
91+ algs3c = [SSPMPRK43(); MPDeC(3)]
92+ labels3c = ["SSPMPRK43()"; "MPDeC(3)"]
93+
94+ convergence_table(dts, prob, algs2a, labels2a, test_setup)
95+ convergence_table(dts, prob, algs2b, labels2b, test_setup)
96+
97+ convergence_table(dts, prob, algs3a, labels3a, test_setup)
98+ convergence_table(dts, prob, algs3b, labels3b, test_setup)
99+ convergence_table(dts, prob, algs3c, labels3c, test_setup)
93100```
94101
95- The table shows that all schemes converge as expected.
102+ The tables show that all schemes converge as expected.
96103
97104### Higher-order MPRK schemes
98105
@@ -111,14 +118,20 @@ prob_d64 = ConservativePDSProblem(P, u0, tspan)
111118dts_d64 = Double64(1/2) .^ (5:9)
112119
113120# select higher-order schemes
114- algs4 = [MPDeC(4); MPDeC(5); MPDeC(6); MPDeC(7); MPDeC(8); MPDeC(9); MPDeC(10)]
115- labels4 = ["MPDeC(4)"; "MPDeC(5)"; "MPDeC(6)"; "MPDeC(7)"; "MPDeC(8)"; "MPDeC(9)"; "MPDeC(10)"]
121+ algs4a = [MPDeC(4); MPDeC(5); MPDeC(6)]
122+ labels4a = ["MPDeC(4)"; "MPDeC(5)"; "MPDeC(6)"]
123+ algs4b = [MPDeC(7); MPDeC(8)]
124+ labels4b = ["MPDeC(7)"; "MPDeC(8)"]
125+ algs4c = [MPDeC(9); MPDeC(10)]
126+ labels4c = ["MPDeC(9)"; "MPDeC(10)"]
116127
117128# solver and tolerances to compute reference solution
118129test_setup_d64 = Dict(:alg => Vern9(), :reltol => 1e-30, :abstol => 1e-30)
119130
120131# compute errors and experimental order of convergence
121- convergence_table(dts_d64, prob_d64, algs4, labels4, test_setup_d64)
132+ convergence_table(dts_d64, prob_d64, algs4a, labels4a, test_setup_d64)
133+ convergence_table(dts_d64, prob_d64, algs4b, labels4b, test_setup_d64)
134+ convergence_table(dts_d64, prob_d64, algs4c, labels4c, test_setup_d64)
122135```
123136
124137Again, all schemes show the expected converge order.
@@ -152,9 +165,12 @@ The following tables demonstrate that the chosen MPRK schemes converge as expect
152165### Second-order and third-order MPRK schemes
153166
154167``` @example eoc
155- convergence_table(dts, prob, algs2, labels2, test_setup)
168+ convergence_table(dts, prob, algs2a, labels2a, test_setup)
169+ convergence_table(dts, prob, algs2b, labels2b, test_setup)
156170
157- convergence_table(dts, prob, algs3, labels3, test_setup)
171+ convergence_table(dts, prob, algs3a, labels3a, test_setup)
172+ convergence_table(dts, prob, algs3b, labels3b, test_setup)
173+ convergence_table(dts, prob, algs3c, labels3c, test_setup)
158174```
159175
160176### Higher-order MPRK schemes
@@ -165,7 +181,9 @@ P(u, p, t) = [0 cospi(t)^2 * u[2]; sinpi(2 * t)^2 * u[1] 0]
165181D(u, p, t) = [cospi(2 * t)^2 * u[1]; sinpi(t)^2 * u[2]]
166182prob_d64 = PDSProblem(P, D, [Double64(9)/10; Double64(1)/10], (Double64(0), Double64(1)))
167183
168- convergence_table(dts_d64, prob_d64, algs4, labels4, test_setup_d64)
184+ convergence_table(dts_d64, prob_d64, algs4a, labels4a, test_setup_d64)
185+ convergence_table(dts_d64, prob_d64, algs4b, labels4b, test_setup_d64)
186+ convergence_table(dts_d64, prob_d64, algs4c, labels4c, test_setup_d64)
169187```
170188
171189## Order reduction
@@ -200,12 +218,18 @@ test_setup = Dict(:alg => Vern9(), :reltol => 1e-14, :abstol => 1e-14)
200218
201219dts = 0.5 .^ (6:12)
202220
203- convergence_table(dts, prob, algs2, labels2, test_setup)
204- convergence_table(dts, prob, algs3, labels3, test_setup)
205- convergence_table(dts, prob, algs4, labels4, test_setup)
221+ convergence_table(dts, prob, algs2a, labels2a, test_setup)
222+ convergence_table(dts, prob, algs2b, labels2b, test_setup)
223+
224+ convergence_table(dts, prob, algs3a, labels3a, test_setup)
225+ convergence_table(dts, prob, algs3b, labels3b, test_setup)
226+ convergence_table(dts, prob, algs3c, labels3c, test_setup)
206227
228+ convergence_table(dts, prob, algs4a, labels4a, test_setup)
229+ convergence_table(dts, prob, algs4b, labels4b, test_setup)
230+ convergence_table(dts, prob, algs4c, labels4c, test_setup)
207231nothing # hide
208232```
209233
210234We find that all methods apart from MPDeC(`` K `` ) methods with `` K ≥ 3 `` converge as expected.
211- The MPDeC(`` K `` ) methods with `` K ≥ 3 `` suffer from order reduction and show convergence order 2 instead of `` K `` .
235+ The MPDeC(`` K `` ) methods with `` K ≥ 3 `` suffer from order reduction and show convergence order 2 instead of `` K `` .
0 commit comments