@@ -6,11 +6,10 @@ an Adaptive BDF2 Formula and Comparison with The MATLAB Ode15s. Procedia Compute
6
6
ABDF2: Multistep Method
7
7
An adaptive order 2 L-stable fixed leading coefficient multistep BDF method.
8
8
"""
9
- struct ABDF2{CS, AD, F, F2, P, FDT, ST, CJ, K, T, StepLimiter} < :
9
+ struct ABDF2{CS, AD, F, F2, FDT, ST, CJ, K, T, StepLimiter} < :
10
10
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
11
11
linsolve:: F
12
12
nlsolve:: F2
13
- precs:: P
14
13
κ:: K
15
14
tol:: T
16
15
smooth_est:: Bool
@@ -20,14 +19,14 @@ struct ABDF2{CS, AD, F, F2, P, FDT, ST, CJ, K, T, StepLimiter} <:
20
19
end
21
20
function ABDF2 (; chunk_size = Val {0} (), autodiff = true , standardtag = Val {true} (),
22
21
concrete_jac = nothing , diff_type = Val{:forward },
23
- κ = nothing , tol = nothing , linsolve = nothing , precs = DEFAULT_PRECS,
22
+ κ = nothing , tol = nothing , linsolve = nothing ,
24
23
nlsolve = NLNewton (),
25
24
smooth_est = true , extrapolant = :linear ,
26
25
controller = :Standard , step_limiter! = trivial_limiter!)
27
26
ABDF2{
28
27
_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve), typeof (nlsolve),
29
- typeof (precs), diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
30
- typeof (κ), typeof (tol), typeof (step_limiter!)}(linsolve, nlsolve, precs, κ, tol,
28
+ diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
29
+ typeof (κ), typeof (tol), typeof (step_limiter!)}(linsolve, nlsolve, κ, tol,
31
30
smooth_est, extrapolant, controller, step_limiter!)
32
31
end
33
32
@@ -36,11 +35,10 @@ Uri M. Ascher, Steven J. Ruuth, Brian T. R. Wetton. Implicit-Explicit Methods fo
36
35
Dependent Partial Differential Equations. 1995 Society for Industrial and Applied Mathematics
37
36
Journal on Numerical Analysis, 32(3), pp 797-823, 1995. doi: https://doi.org/10.1137/0732037
38
37
"""
39
- struct SBDF{CS, AD, F, F2, P, FDT, ST, CJ, K, T} < :
38
+ struct SBDF{CS, AD, F, F2, FDT, ST, CJ, K, T} < :
40
39
OrdinaryDiffEqNewtonAlgorithm{CS, AD, FDT, ST, CJ}
41
40
linsolve:: F
42
41
nlsolve:: F2
43
- precs:: P
44
42
κ:: K
45
43
tol:: T
46
44
extrapolant:: Symbol
50
48
51
49
function SBDF (order; chunk_size = Val {0} (), autodiff = Val {true} (),
52
50
standardtag = Val {true} (), concrete_jac = nothing , diff_type = Val{:forward },
53
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (), κ = nothing ,
51
+ linsolve = nothing , nlsolve = NLNewton (), κ = nothing ,
54
52
tol = nothing ,
55
53
extrapolant = :linear , ark = false )
56
54
SBDF{_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve), typeof (nlsolve),
57
- typeof (precs), diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
55
+ diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
58
56
typeof (κ), typeof (tol)}(linsolve,
59
57
nlsolve,
60
- precs,
61
58
κ,
62
59
tol,
63
60
extrapolant,
68
65
# All keyword form needed for remake
69
66
function SBDF (; chunk_size = Val {0} (), autodiff = Val {true} (), standardtag = Val {true} (),
70
67
concrete_jac = nothing , diff_type = Val{:forward },
71
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (), κ = nothing ,
68
+ linsolve = nothing , nlsolve = NLNewton (), κ = nothing ,
72
69
tol = nothing ,
73
70
extrapolant = :linear ,
74
71
order, ark = false )
75
72
SBDF{_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve), typeof (nlsolve),
76
- typeof (precs), diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
73
+ diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
77
74
typeof (κ), typeof (tol)}(linsolve,
78
75
nlsolve,
79
- precs,
80
76
κ,
81
77
tol,
82
78
extrapolant,
@@ -136,11 +132,10 @@ Optional parameter kappa defaults to Shampine's accuracy-optimal -0.1850.
136
132
137
133
See also `QNDF`.
138
134
"""
139
- struct QNDF1{CS, AD, F, F2, P, FDT, ST, CJ, κType, StepLimiter} < :
135
+ struct QNDF1{CS, AD, F, F2, FDT, ST, CJ, κType, StepLimiter} < :
140
136
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
141
137
linsolve:: F
142
138
nlsolve:: F2
143
- precs:: P
144
139
extrapolant:: Symbol
145
140
kappa: :κType
146
141
controller:: Symbol
@@ -149,15 +144,14 @@ end
149
144
150
145
function QNDF1 (; chunk_size = Val {0} (), autodiff = Val {true} (), standardtag = Val {true} (),
151
146
concrete_jac = nothing , diff_type = Val{:forward },
152
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (),
147
+ linsolve = nothing , nlsolve = NLNewton (),
153
148
extrapolant = :linear , kappa = - 37 // 200 ,
154
149
controller = :Standard , step_limiter! = trivial_limiter!)
155
150
QNDF1{
156
151
_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve), typeof (nlsolve),
157
- typeof (precs), diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
152
+ diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
158
153
typeof (kappa), typeof (step_limiter!)}(linsolve,
159
154
nlsolve,
160
- precs,
161
155
extrapolant,
162
156
kappa,
163
157
controller,
@@ -170,11 +164,10 @@ An adaptive order 2 quasi-constant timestep L-stable numerical differentiation f
170
164
171
165
See also `QNDF`.
172
166
"""
173
- struct QNDF2{CS, AD, F, F2, P, FDT, ST, CJ, κType, StepLimiter} < :
167
+ struct QNDF2{CS, AD, F, F2, FDT, ST, CJ, κType, StepLimiter} < :
174
168
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
175
169
linsolve:: F
176
170
nlsolve:: F2
177
- precs:: P
178
171
extrapolant:: Symbol
179
172
kappa: :κType
180
173
controller:: Symbol
@@ -183,15 +176,14 @@ end
183
176
184
177
function QNDF2 (; chunk_size = Val {0} (), autodiff = Val {true} (), standardtag = Val {true} (),
185
178
concrete_jac = nothing , diff_type = Val{:forward },
186
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (),
179
+ linsolve = nothing , nlsolve = NLNewton (),
187
180
extrapolant = :linear , kappa = - 1 // 9 ,
188
181
controller = :Standard , step_limiter! = trivial_limiter!)
189
182
QNDF2{
190
183
_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve), typeof (nlsolve),
191
- typeof (precs), diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
184
+ diff_type, _unwrap_val (standardtag), _unwrap_val (concrete_jac),
192
185
typeof (kappa), typeof (step_limiter!)}(linsolve,
193
186
nlsolve,
194
- precs,
195
187
extrapolant,
196
188
kappa,
197
189
controller,
@@ -214,12 +206,11 @@ year={1997},
214
206
publisher={SIAM}
215
207
}
216
208
"""
217
- struct QNDF{MO, CS, AD, F, F2, P, FDT, ST, CJ, K, T, κType, StepLimiter} < :
209
+ struct QNDF{MO, CS, AD, F, F2, FDT, ST, CJ, K, T, κType, StepLimiter} < :
218
210
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
219
211
max_order:: Val{MO}
220
212
linsolve:: F
221
213
nlsolve:: F2
222
- precs:: P
223
214
κ:: K
224
215
tol:: T
225
216
extrapolant:: Symbol
@@ -231,16 +222,15 @@ end
231
222
function QNDF (; max_order:: Val{MO} = Val {5} (), chunk_size = Val {0} (),
232
223
autodiff = Val {true} (), standardtag = Val {true} (), concrete_jac = nothing ,
233
224
diff_type = Val{:forward },
234
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (), κ = nothing ,
225
+ linsolve = nothing , nlsolve = NLNewton (), κ = nothing ,
235
226
tol = nothing ,
236
- extrapolant = :linear , kappa = (
237
- - 37 // 200 , - 1 // 9 , - 823 // 10000 , - 83 // 2000 , 0 // 1 ),
227
+ extrapolant = :linear , kappa = (- 37 // 200 , - 1 // 9 , - 823 // 10000 , - 83 // 2000 , 0 // 1 ),
238
228
controller = :Standard , step_limiter! = trivial_limiter!) where {MO}
239
229
QNDF{MO, _unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve),
240
- typeof (nlsolve), typeof (precs), diff_type, _unwrap_val (standardtag),
230
+ typeof (nlsolve), diff_type, _unwrap_val (standardtag),
241
231
_unwrap_val (concrete_jac),
242
232
typeof (κ), typeof (tol), typeof (kappa), typeof (step_limiter!)}(
243
- max_order, linsolve, nlsolve, precs, κ, tol,
233
+ max_order, linsolve, nlsolve, κ, tol,
244
234
extrapolant, kappa, controller, step_limiter!)
245
235
end
246
236
@@ -251,22 +241,20 @@ MEBDF2: Multistep Method
251
241
The second order Modified Extended BDF method, which has improved stability properties over the standard BDF.
252
242
Fixed timestep only.
253
243
"""
254
- struct MEBDF2{CS, AD, F, F2, P, FDT, ST, CJ} < :
244
+ struct MEBDF2{CS, AD, F, F2, FDT, ST, CJ} < :
255
245
OrdinaryDiffEqNewtonAlgorithm{CS, AD, FDT, ST, CJ}
256
246
linsolve:: F
257
247
nlsolve:: F2
258
- precs:: P
259
248
extrapolant:: Symbol
260
249
end
261
250
function MEBDF2 (; chunk_size = Val {0} (), autodiff = true , standardtag = Val {true} (),
262
251
concrete_jac = nothing , diff_type = Val{:forward },
263
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (),
252
+ linsolve = nothing , nlsolve = NLNewton (),
264
253
extrapolant = :constant )
265
254
MEBDF2{_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve),
266
- typeof (nlsolve), typeof (precs), diff_type, _unwrap_val (standardtag),
255
+ typeof (nlsolve), diff_type, _unwrap_val (standardtag),
267
256
_unwrap_val (concrete_jac)}(linsolve,
268
257
nlsolve,
269
- precs,
270
258
extrapolant)
271
259
end
272
260
@@ -283,12 +271,11 @@ year={2002},
283
271
publisher={Walter de Gruyter GmbH \\ & Co. KG}
284
272
}
285
273
"""
286
- struct FBDF{MO, CS, AD, F, F2, P, FDT, ST, CJ, K, T, StepLimiter} < :
274
+ struct FBDF{MO, CS, AD, F, F2, FDT, ST, CJ, K, T, StepLimiter} < :
287
275
OrdinaryDiffEqNewtonAdaptiveAlgorithm{CS, AD, FDT, ST, CJ}
288
276
max_order:: Val{MO}
289
277
linsolve:: F
290
278
nlsolve:: F2
291
- precs:: P
292
279
κ:: K
293
280
tol:: T
294
281
extrapolant:: Symbol
@@ -299,14 +286,14 @@ end
299
286
function FBDF (; max_order:: Val{MO} = Val {5} (), chunk_size = Val {0} (),
300
287
autodiff = Val {true} (), standardtag = Val {true} (), concrete_jac = nothing ,
301
288
diff_type = Val{:forward },
302
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (), κ = nothing ,
289
+ linsolve = nothing , nlsolve = NLNewton (), κ = nothing ,
303
290
tol = nothing ,
304
291
extrapolant = :linear , controller = :Standard , step_limiter! = trivial_limiter!) where {MO}
305
292
FBDF{MO, _unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve),
306
- typeof (nlsolve), typeof (precs), diff_type, _unwrap_val (standardtag),
293
+ typeof (nlsolve), diff_type, _unwrap_val (standardtag),
307
294
_unwrap_val (concrete_jac),
308
295
typeof (κ), typeof (tol), typeof (step_limiter!)}(
309
- max_order, linsolve, nlsolve, precs, κ, tol, extrapolant,
296
+ max_order, linsolve, nlsolve, κ, tol, extrapolant,
310
297
controller, step_limiter!)
311
298
end
312
299
@@ -390,41 +377,39 @@ See also `SBDF`, `IMEXEuler`.
390
377
"""
391
378
IMEXEulerARK (; kwargs... ) = SBDF (1 ; ark = true , kwargs... )
392
379
393
- struct DImplicitEuler{CS, AD, F, F2, P, FDT, ST, CJ} <: DAEAlgorithm{CS, AD, FDT, ST, CJ}
380
+ struct DImplicitEuler{CS, AD, F, F2, FDT, ST, CJ} <: DAEAlgorithm{CS, AD, FDT, ST, CJ}
394
381
linsolve:: F
395
382
nlsolve:: F2
396
- precs:: P
397
383
extrapolant:: Symbol
398
384
controller:: Symbol
399
385
end
400
386
function DImplicitEuler (;
401
387
chunk_size = Val {0} (), autodiff = true , standardtag = Val {true} (),
402
388
concrete_jac = nothing , diff_type = Val{:forward },
403
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (),
389
+ linsolve = nothing , nlsolve = NLNewton (),
404
390
extrapolant = :constant ,
405
391
controller = :Standard )
406
392
DImplicitEuler{_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve),
407
- typeof (nlsolve), typeof (precs), diff_type, _unwrap_val (standardtag),
393
+ typeof (nlsolve), diff_type, _unwrap_val (standardtag),
408
394
_unwrap_val (concrete_jac)}(linsolve,
409
- nlsolve, precs, extrapolant, controller)
395
+ nlsolve, extrapolant, controller)
410
396
end
411
397
412
- struct DABDF2{CS, AD, F, F2, P, FDT, ST, CJ} <: DAEAlgorithm{CS, AD, FDT, ST, CJ}
398
+ struct DABDF2{CS, AD, F, F2, FDT, ST, CJ} <: DAEAlgorithm{CS, AD, FDT, ST, CJ}
413
399
linsolve:: F
414
400
nlsolve:: F2
415
- precs:: P
416
401
extrapolant:: Symbol
417
402
controller:: Symbol
418
403
end
419
404
function DABDF2 (; chunk_size = Val {0} (), autodiff = Val {true} (), standardtag = Val {true} (),
420
405
concrete_jac = nothing , diff_type = Val{:forward },
421
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (),
406
+ linsolve = nothing , nlsolve = NLNewton (),
422
407
extrapolant = :constant ,
423
408
controller = :Standard )
424
409
DABDF2{_unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve),
425
- typeof (nlsolve), typeof (precs), diff_type, _unwrap_val (standardtag),
410
+ typeof (nlsolve), diff_type, _unwrap_val (standardtag),
426
411
_unwrap_val (concrete_jac)}(linsolve,
427
- nlsolve, precs, extrapolant, controller)
412
+ nlsolve, extrapolant, controller)
428
413
end
429
414
430
415
#=
@@ -441,11 +426,10 @@ DBDF(;chunk_size=Val{0}(),autodiff=Val{true}(), standardtag = Val{true}(), concr
441
426
linsolve,nlsolve,precs,extrapolant)
442
427
=#
443
428
444
- struct DFBDF{MO, CS, AD, F, F2, P, FDT, ST, CJ, K, T} <: DAEAlgorithm{CS, AD, FDT, ST, CJ}
429
+ struct DFBDF{MO, CS, AD, F, F2, FDT, ST, CJ, K, T} <: DAEAlgorithm{CS, AD, FDT, ST, CJ}
445
430
max_order:: Val{MO}
446
431
linsolve:: F
447
432
nlsolve:: F2
448
- precs:: P
449
433
κ:: K
450
434
tol:: T
451
435
extrapolant:: Symbol
@@ -454,13 +438,13 @@ end
454
438
function DFBDF (; max_order:: Val{MO} = Val {5} (), chunk_size = Val {0} (),
455
439
autodiff = Val {true} (), standardtag = Val {true} (), concrete_jac = nothing ,
456
440
diff_type = Val{:forward },
457
- linsolve = nothing , precs = DEFAULT_PRECS, nlsolve = NLNewton (), κ = nothing ,
441
+ linsolve = nothing , nlsolve = NLNewton (), κ = nothing ,
458
442
tol = nothing ,
459
443
extrapolant = :linear , controller = :Standard ) where {MO}
460
444
DFBDF{MO, _unwrap_val (chunk_size), _unwrap_val (autodiff), typeof (linsolve),
461
- typeof (nlsolve), typeof (precs), diff_type, _unwrap_val (standardtag),
445
+ typeof (nlsolve), diff_type, _unwrap_val (standardtag),
462
446
_unwrap_val (concrete_jac),
463
- typeof (κ), typeof (tol)}(max_order, linsolve, nlsolve, precs, κ, tol, extrapolant,
447
+ typeof (κ), typeof (tol)}(max_order, linsolve, nlsolve, κ, tol, extrapolant,
464
448
controller)
465
449
end
466
450
0 commit comments