Skip to content

Commit 5b818c5

Browse files
Harsh SinghHarsh Singh
authored andcommitted
refactor(IMEX): migrate KenCarp/Kvaerno to IMEXTableau and remove per-method implementations
1 parent f4c1455 commit 5b818c5

5 files changed

Lines changed: 1269 additions & 3256 deletions

File tree

Project.toml

Lines changed: 94 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
1010
CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
1111
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
1212
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
13+
DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d"
1314
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
1415
EnumX = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
1516
ExponentialUtilities = "d4d017d3-3776-5f7e-afef-a10c40355c18"
@@ -27,6 +28,7 @@ Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
2728
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
2829
MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221"
2930
NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
31+
ODEProblemLibrary = "fdc4e326-1af4-4b90-96e7-779fcce2daa5"
3032
OrdinaryDiffEqAdamsBashforthMoulton = "89bda076-bce5-4f1c-845f-551c83cdda9a"
3133
OrdinaryDiffEqBDF = "6ad6398a-0878-4a85-9266-38940aa047c8"
3234
OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8"
@@ -73,38 +75,6 @@ StaticArrayInterface = "0d7ed370-da01-4f52-bd93-41d350b8b718"
7375
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
7476
TruncatedStacktraces = "781d530d-4396-4725-bb49-402e4bee1e77"
7577

76-
[sources]
77-
OrdinaryDiffEqAdamsBashforthMoulton = {path = "lib/OrdinaryDiffEqAdamsBashforthMoulton"}
78-
OrdinaryDiffEqBDF = {path = "lib/OrdinaryDiffEqBDF"}
79-
OrdinaryDiffEqCore = {path = "lib/OrdinaryDiffEqCore"}
80-
OrdinaryDiffEqDefault = {path = "lib/OrdinaryDiffEqDefault"}
81-
OrdinaryDiffEqDifferentiation = {path = "lib/OrdinaryDiffEqDifferentiation"}
82-
OrdinaryDiffEqExplicitRK = {path = "lib/OrdinaryDiffEqExplicitRK"}
83-
OrdinaryDiffEqExponentialRK = {path = "lib/OrdinaryDiffEqExponentialRK"}
84-
OrdinaryDiffEqExtrapolation = {path = "lib/OrdinaryDiffEqExtrapolation"}
85-
OrdinaryDiffEqFIRK = {path = "lib/OrdinaryDiffEqFIRK"}
86-
OrdinaryDiffEqFeagin = {path = "lib/OrdinaryDiffEqFeagin"}
87-
OrdinaryDiffEqFunctionMap = {path = "lib/OrdinaryDiffEqFunctionMap"}
88-
OrdinaryDiffEqHighOrderRK = {path = "lib/OrdinaryDiffEqHighOrderRK"}
89-
OrdinaryDiffEqIMEXMultistep = {path = "lib/OrdinaryDiffEqIMEXMultistep"}
90-
OrdinaryDiffEqLinear = {path = "lib/OrdinaryDiffEqLinear"}
91-
OrdinaryDiffEqLowOrderRK = {path = "lib/OrdinaryDiffEqLowOrderRK"}
92-
OrdinaryDiffEqLowStorageRK = {path = "lib/OrdinaryDiffEqLowStorageRK"}
93-
OrdinaryDiffEqNonlinearSolve = {path = "lib/OrdinaryDiffEqNonlinearSolve"}
94-
OrdinaryDiffEqNordsieck = {path = "lib/OrdinaryDiffEqNordsieck"}
95-
OrdinaryDiffEqPDIRK = {path = "lib/OrdinaryDiffEqPDIRK"}
96-
OrdinaryDiffEqPRK = {path = "lib/OrdinaryDiffEqPRK"}
97-
OrdinaryDiffEqQPRK = {path = "lib/OrdinaryDiffEqQPRK"}
98-
OrdinaryDiffEqRKN = {path = "lib/OrdinaryDiffEqRKN"}
99-
OrdinaryDiffEqRosenbrock = {path = "lib/OrdinaryDiffEqRosenbrock"}
100-
OrdinaryDiffEqSDIRK = {path = "lib/OrdinaryDiffEqSDIRK"}
101-
OrdinaryDiffEqSSPRK = {path = "lib/OrdinaryDiffEqSSPRK"}
102-
OrdinaryDiffEqStabilizedIRK = {path = "lib/OrdinaryDiffEqStabilizedIRK"}
103-
OrdinaryDiffEqStabilizedRK = {path = "lib/OrdinaryDiffEqStabilizedRK"}
104-
OrdinaryDiffEqSymplecticRK = {path = "lib/OrdinaryDiffEqSymplecticRK"}
105-
OrdinaryDiffEqTsit5 = {path = "lib/OrdinaryDiffEqTsit5"}
106-
OrdinaryDiffEqVerner = {path = "lib/OrdinaryDiffEqVerner"}
107-
10878
[compat]
10979
ADTypes = "1.16"
11080
Adapt = "4.3"
@@ -172,10 +142,10 @@ SciMLBase = "2.143"
172142
SciMLOperators = "1.8"
173143
SciMLStructures = "1.7"
174144
SimpleNonlinearSolve = "2.7"
145+
StableRNGs = "1"
175146
Static = "1.2"
176147
StaticArrayInterface = "1.8"
177148
StaticArrays = "1.9.14"
178-
StableRNGs = "1"
179149
StructArrays = "0.6, 0.7"
180150
Symbolics = "6, 7"
181151
TruncatedStacktraces = "1.4"
@@ -198,14 +168,104 @@ Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
198168
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
199169
RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4"
200170
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
201-
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
202171
SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
203172
SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35"
173+
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
204174
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
205175
StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
206176
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
207177
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
208178
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
209179

180+
[sources.OrdinaryDiffEqAdamsBashforthMoulton]
181+
path = "lib/OrdinaryDiffEqAdamsBashforthMoulton"
182+
183+
[sources.OrdinaryDiffEqBDF]
184+
path = "lib/OrdinaryDiffEqBDF"
185+
186+
[sources.OrdinaryDiffEqCore]
187+
path = "lib/OrdinaryDiffEqCore"
188+
189+
[sources.OrdinaryDiffEqDefault]
190+
path = "lib/OrdinaryDiffEqDefault"
191+
192+
[sources.OrdinaryDiffEqDifferentiation]
193+
path = "lib/OrdinaryDiffEqDifferentiation"
194+
195+
[sources.OrdinaryDiffEqExplicitRK]
196+
path = "lib/OrdinaryDiffEqExplicitRK"
197+
198+
[sources.OrdinaryDiffEqExponentialRK]
199+
path = "lib/OrdinaryDiffEqExponentialRK"
200+
201+
[sources.OrdinaryDiffEqExtrapolation]
202+
path = "lib/OrdinaryDiffEqExtrapolation"
203+
204+
[sources.OrdinaryDiffEqFIRK]
205+
path = "lib/OrdinaryDiffEqFIRK"
206+
207+
[sources.OrdinaryDiffEqFeagin]
208+
path = "lib/OrdinaryDiffEqFeagin"
209+
210+
[sources.OrdinaryDiffEqFunctionMap]
211+
path = "lib/OrdinaryDiffEqFunctionMap"
212+
213+
[sources.OrdinaryDiffEqHighOrderRK]
214+
path = "lib/OrdinaryDiffEqHighOrderRK"
215+
216+
[sources.OrdinaryDiffEqIMEXMultistep]
217+
path = "lib/OrdinaryDiffEqIMEXMultistep"
218+
219+
[sources.OrdinaryDiffEqLinear]
220+
path = "lib/OrdinaryDiffEqLinear"
221+
222+
[sources.OrdinaryDiffEqLowOrderRK]
223+
path = "lib/OrdinaryDiffEqLowOrderRK"
224+
225+
[sources.OrdinaryDiffEqLowStorageRK]
226+
path = "lib/OrdinaryDiffEqLowStorageRK"
227+
228+
[sources.OrdinaryDiffEqNonlinearSolve]
229+
path = "lib/OrdinaryDiffEqNonlinearSolve"
230+
231+
[sources.OrdinaryDiffEqNordsieck]
232+
path = "lib/OrdinaryDiffEqNordsieck"
233+
234+
[sources.OrdinaryDiffEqPDIRK]
235+
path = "lib/OrdinaryDiffEqPDIRK"
236+
237+
[sources.OrdinaryDiffEqPRK]
238+
path = "lib/OrdinaryDiffEqPRK"
239+
240+
[sources.OrdinaryDiffEqQPRK]
241+
path = "lib/OrdinaryDiffEqQPRK"
242+
243+
[sources.OrdinaryDiffEqRKN]
244+
path = "lib/OrdinaryDiffEqRKN"
245+
246+
[sources.OrdinaryDiffEqRosenbrock]
247+
path = "lib/OrdinaryDiffEqRosenbrock"
248+
249+
[sources.OrdinaryDiffEqSDIRK]
250+
path = "lib/OrdinaryDiffEqSDIRK"
251+
252+
[sources.OrdinaryDiffEqSSPRK]
253+
path = "lib/OrdinaryDiffEqSSPRK"
254+
255+
[sources.OrdinaryDiffEqStabilizedIRK]
256+
path = "lib/OrdinaryDiffEqStabilizedIRK"
257+
258+
[sources.OrdinaryDiffEqStabilizedRK]
259+
path = "lib/OrdinaryDiffEqStabilizedRK"
260+
261+
[sources.OrdinaryDiffEqSymplecticRK]
262+
path = "lib/OrdinaryDiffEqSymplecticRK"
263+
264+
[sources.OrdinaryDiffEqTsit5]
265+
path = "lib/OrdinaryDiffEqTsit5"
266+
267+
[sources.OrdinaryDiffEqVerner]
268+
path = "lib/OrdinaryDiffEqVerner"
269+
210270
[targets]
211271
test = ["ComponentArrays", "AlgebraicMultigrid", "IncompleteLU", "DiffEqCallbacks", "DifferentiationInterface", "DiffEqDevTools", "ExplicitImports", "ODEProblemLibrary", "ElasticArrays", "JLArrays", "Random", "SafeTestsets", "StableRNGs", "StructArrays", "Test", "Unitful", "Pkg", "NLsolve", "RecursiveFactorization", "SparseConnectivityTracer", "SparseMatrixColorings", "Statistics"]

lib/OrdinaryDiffEqSDIRK/src/algorithms.jl

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ function SDIRK_docstring(
7979
)
8080
end
8181

82+
abstract type OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ} <:
83+
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ} end
84+
8285
@doc SDIRK_docstring(
8386
"A 1st order implicit solver. A-B-L-stable. Adaptive timestepping through a divided differences estimate. Strong-stability preserving (SSP). Good for highly stiff equations.",
8487
"ImplicitEuler";
@@ -486,7 +489,7 @@ end
486489
"""
487490
)
488491
struct Kvaerno3{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
489-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
492+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
490493
linsolve::F
491494
nlsolve::F2
492495
precs::P
@@ -538,7 +541,7 @@ end
538541
"""
539542
)
540543
struct KenCarp3{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
541-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
544+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
542545
linsolve::F
543546
nlsolve::F2
544547
precs::P
@@ -1045,7 +1048,7 @@ end
10451048
"""
10461049
)
10471050
struct Kvaerno4{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
1048-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
1051+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
10491052
linsolve::F
10501053
nlsolve::F2
10511054
precs::P
@@ -1101,7 +1104,7 @@ end
11011104
"""
11021105
)
11031106
struct Kvaerno5{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
1104-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
1107+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
11051108
linsolve::F
11061109
nlsolve::F2
11071110
precs::P
@@ -1153,7 +1156,7 @@ end
11531156
"""
11541157
)
11551158
struct KenCarp4{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
1156-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
1159+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
11571160
linsolve::F
11581161
nlsolve::F2
11591162
precs::P
@@ -1207,14 +1210,15 @@ end
12071210
controller = :PI,
12081211
"""
12091212
)
1210-
struct KenCarp47{CS, AD, F, F2, P, FDT, ST, CJ} <:
1211-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
1213+
struct KenCarp47{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
1214+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
12121215
linsolve::F
12131216
nlsolve::F2
12141217
precs::P
12151218
smooth_est::Bool
12161219
extrapolant::Symbol
12171220
controller::Symbol
1221+
step_limiter!::StepLimiter
12181222
autodiff::AD
12191223
end
12201224
function KenCarp47(;
@@ -1223,17 +1227,17 @@ function KenCarp47(;
12231227
diff_type = Val{:forward}(),
12241228
linsolve = nothing, precs = DEFAULT_PRECS, nlsolve = NLNewton(),
12251229
smooth_est = true, extrapolant = :linear,
1226-
controller = :PI
1230+
controller = :PI, step_limiter! = trivial_limiter!
12271231
)
12281232
AD_choice, chunk_size, diff_type = _process_AD_choice(autodiff, chunk_size, diff_type)
12291233

12301234
return KenCarp47{
12311235
_unwrap_val(chunk_size), typeof(AD_choice), typeof(linsolve),
12321236
typeof(nlsolve), typeof(precs), diff_type, _unwrap_val(standardtag),
1233-
_unwrap_val(concrete_jac),
1237+
_unwrap_val(concrete_jac), typeof(step_limiter!),
12341238
}(
12351239
linsolve, nlsolve, precs, smooth_est, extrapolant,
1236-
controller, AD_choice
1240+
controller, step_limiter!, AD_choice
12371241
)
12381242
end
12391243

@@ -1259,7 +1263,7 @@ end
12591263
"""
12601264
)
12611265
struct KenCarp5{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
1262-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
1266+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
12631267
linsolve::F
12641268
nlsolve::F2
12651269
precs::P
@@ -1311,14 +1315,15 @@ end
13111315
controller = :PI,
13121316
"""
13131317
)
1314-
struct KenCarp58{CS, AD, F, F2, P, FDT, ST, CJ} <:
1315-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
1318+
struct KenCarp58{CS, AD, F, F2, P, FDT, ST, CJ, StepLimiter} <:
1319+
OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ}
13161320
linsolve::F
13171321
nlsolve::F2
13181322
precs::P
13191323
smooth_est::Bool
13201324
extrapolant::Symbol
13211325
controller::Symbol
1326+
step_limiter!::StepLimiter
13221327
autodiff::AD
13231328
end
13241329
function KenCarp58(;
@@ -1327,17 +1332,17 @@ function KenCarp58(;
13271332
diff_type = Val{:forward}(),
13281333
linsolve = nothing, precs = DEFAULT_PRECS, nlsolve = NLNewton(),
13291334
smooth_est = true, extrapolant = :linear,
1330-
controller = :PI
1335+
controller = :PI, step_limiter! = trivial_limiter!
13311336
)
13321337
AD_choice, chunk_size, diff_type = _process_AD_choice(autodiff, chunk_size, diff_type)
13331338

13341339
return KenCarp58{
13351340
_unwrap_val(chunk_size), typeof(AD_choice), typeof(linsolve),
13361341
typeof(nlsolve), typeof(precs), diff_type, _unwrap_val(standardtag),
1337-
_unwrap_val(concrete_jac),
1342+
_unwrap_val(concrete_jac), typeof(step_limiter!),
13381343
}(
13391344
linsolve, nlsolve, precs, smooth_est, extrapolant,
1340-
controller, AD_choice
1345+
controller, step_limiter!, AD_choice
13411346
)
13421347
end
13431348

@@ -1594,9 +1599,6 @@ function ESDIRK659L2SA(;
15941599
)
15951600
end
15961601

1597-
abstract type OrdinaryDiffEqNewtonAdaptiveIMEXAlgorithm{CS, AD, FDT, ST, CJ} <:
1598-
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ} end
1599-
16001602
@doc SDIRK_docstring(
16011603
"3rd order L-stable IMEX ARK method. Uses a generic tableau-driven implementation that supports both split and non-split forms.",
16021604
"ARS343";

0 commit comments

Comments
 (0)