1
1
import SciMLBase
2
- import OrdinaryDiffEq as ODE
3
2
import ClimaTimeSteppers as CTS
4
3
5
4
is_explicit_CTS_algo_type (alg_or_tableau) =
@@ -8,35 +7,13 @@ is_explicit_CTS_algo_type(alg_or_tableau) =
8
7
is_imex_CTS_algo_type (alg_or_tableau) =
9
8
alg_or_tableau <: CTS.IMEXARKAlgorithmName
10
9
11
- is_implicit_type (:: typeof (ODE. IMEXEuler)) = true
12
- is_implicit_type (alg_or_tableau) =
13
- alg_or_tableau <: Union {
14
- ODE. OrdinaryDiffEqImplicitAlgorithm,
15
- ODE. OrdinaryDiffEqAdaptiveImplicitAlgorithm,
16
- } || is_imex_CTS_algo_type (alg_or_tableau)
17
-
18
- is_ordinary_diffeq_newton (:: typeof (ODE. IMEXEuler)) = true
19
- is_ordinary_diffeq_newton (alg_or_tableau) =
20
- alg_or_tableau <: Union {
21
- ODE. OrdinaryDiffEqNewtonAlgorithm,
22
- ODE. OrdinaryDiffEqNewtonAdaptiveAlgorithm,
23
- }
24
-
25
10
is_imex_CTS_algo (:: CTS.IMEXAlgorithm ) = true
26
11
is_imex_CTS_algo (:: SciMLBase.AbstractODEAlgorithm ) = false
27
12
28
- is_implicit (:: ODE.OrdinaryDiffEqImplicitAlgorithm ) = true
29
- is_implicit (:: ODE.OrdinaryDiffEqAdaptiveImplicitAlgorithm ) = true
30
- is_implicit (ode_algo) = is_imex_CTS_algo (ode_algo)
31
-
32
- is_rosenbrock (:: ODE.Rosenbrock23 ) = true
33
- is_rosenbrock (:: ODE.Rosenbrock32 ) = true
34
- is_rosenbrock (:: SciMLBase.AbstractODEAlgorithm ) = false
35
- use_transform (ode_algo) =
36
- ! (is_imex_CTS_algo (ode_algo) || is_rosenbrock (ode_algo))
13
+ use_transform (ode_algo) = ! is_imex_CTS_algo (ode_algo)
37
14
38
15
function jac_kwargs (ode_algo, Y, jacobi_flags)
39
- if is_implicit (ode_algo)
16
+ if is_imex_CTS_algo (ode_algo)
40
17
W = SchurComplementW (Y, use_transform (ode_algo), jacobi_flags)
41
18
if use_transform (ode_algo)
42
19
return (; jac_prototype = W, Wfact_t = Wfact!)
@@ -57,32 +34,17 @@ function ode_configuration(
57
34
ode_name = split (ode_name, " ." )[end ]
58
35
end
59
36
ode_sym = Symbol (ode_name)
60
- alg_or_tableau = if hasproperty (ODE, ode_sym)
61
- @warn " apply_limiter flag is ignored for OrdinaryDiffEq algorithms"
62
- getproperty (ODE, ode_sym)
63
- else
64
- getproperty (CTS, ode_sym)
65
- end
37
+ alg_or_tableau = getproperty (CTS, ode_sym)
66
38
@info " Using ODE config: `$alg_or_tableau `"
67
39
68
40
if is_explicit_CTS_algo_type (alg_or_tableau)
69
41
return CTS. ExplicitAlgorithm (alg_or_tableau ())
70
- elseif ! is_implicit_type (alg_or_tableau)
42
+ elseif ! is_imex_CTS_algo_type (alg_or_tableau)
71
43
return alg_or_tableau ()
72
- elseif is_ordinary_diffeq_newton (alg_or_tableau)
73
- if max_newton_iters == 1
74
- error (" OridinaryDiffEq requires at least 2 Newton iterations" )
75
- end
76
- # κ like a relative tolerance; its default value in ODE is 0.01
77
- nlsolve = ODE. NLNewton (;
78
- κ = max_newton_iters == 2 ? Inf : 0.01 ,
79
- max_iter = max_newton_iters,
80
- )
81
- return alg_or_tableau (; linsolve = linsolve!, nlsolve)
82
44
elseif is_imex_CTS_algo_type (alg_or_tableau)
83
45
newtons_method = CTS. NewtonsMethod (; max_iters = max_newton_iters)
84
46
return CTS. IMEXAlgorithm (alg_or_tableau (), newtons_method)
85
47
else
86
- return alg_or_tableau (; linsolve = linsolve! )
48
+ error ( " Uncaught case " )
87
49
end
88
50
end
0 commit comments