@@ -10,6 +10,10 @@ function KrylovJL(args...; KrylovAlg = Krylov.gmres!, kwargs...)
10
10
return KrylovJL (KrylovAlg, args, kwargs)
11
11
end
12
12
13
+ KrylovJL_CG (args... ;kwargs... ) = KrylovJL (Krylov. cg!, args... ; kwargs... )
14
+ KrylovJL_GMRES (args... ;kwargs... ) = KrylovJL (Krylov. gmres!, args... ; kwargs... )
15
+ KrylovJL_BICGSTAB (args... ;kwargs... ) = KrylovJL (Krylov. bicgstab!, args... ; kwargs... )
16
+
13
17
function init_cacheval (alg:: KrylovJL , A, b, u)
14
18
cacheval = if alg. KrylovAlg === Krylov. cg!
15
19
Krylov. CgSolver (A,b)
@@ -36,34 +40,48 @@ function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...)
36
40
return cache. u
37
41
end
38
42
39
- KrylovJL_CG (args... ;kwargs... ) = KrylovJL (Krylov. cg!, args... ; kwargs... )
40
- KrylovJL_GMRES (args... ;kwargs... ) = KrylovJL (Krylov. gmres!, args... ; kwargs... )
41
- KrylovJL_BICGSTAB (args... ;kwargs... ) = KrylovJL (Krylov. bicgstab!, args... ; kwargs... )
42
-
43
43
# # IterativeSolvers.jl
44
44
45
45
struct IterativeSolversJL{F,A,K} <: SciMLLinearSolveAlgorithm
46
- solver :: F
46
+ generate_iterator :: F
47
47
args:: A
48
48
kwargs:: K
49
49
end
50
50
51
- # # KrylovKit.jl
52
-
53
- struct KrylovKitJL{F,A,K} <: SciMLLinearSolveAlgorithm
54
- solver:: F
55
- args:: A
56
- kwargs:: K
51
+ function IterativeSolversJL (args... ;
52
+ generate_iterator = IterativeSolvers. gmres_iterable!,
53
+ kwargs... )
54
+ return IterativeSolversJL (generate_iterator, args, kwargs)
57
55
end
58
56
59
- function KrylovKitJL (args... ; solver = KrylovKit. CG (), kwargs... )
60
- return KrylovKitJL (solver, args, kwargs)
57
+ # IterativeSolversJL_CG(args...; kwargs...)
58
+ # = IterativeSolversJL(IterativeSolvers.cg_iterator!, args...; kwargs...)
59
+ # IterativeSolversJL_GMRES(args...;kwargs...)
60
+ # = IterativeSolversJL(IterativeSolvers.gmres_iterable!, args...; kwargs...)
61
+ # IterativeSolversJL_BICGSTAB(args...;kwargs...)
62
+ # = IterativeSolversJL(IterativeSolvers.bicgstabl_iterator!, args...;kwargs...)
63
+
64
+ function init_cacheval (alg:: IterativeSolversJL , A, b, u)
65
+ cacheval = if alg. generate_iterator === IterativeSolvers. cg_iterator!
66
+ alg. generate_iterator (u, A, b)
67
+ elseif alg. generate_iterator === IterativeSolvers. gmres_iterable!
68
+ alg. generate_iterator (u, A, b)
69
+ elseif alg. generate_iterator === IterativeSolvers. bicgstabl_iterator!
70
+ alg. generate_iterator (u, A, b)
71
+ else
72
+ alg. generate_iterator (u, A, b)
73
+ end
74
+ return cacheval
61
75
end
62
76
63
- function SciMLBase. solve (cache:: LinearCache , alg:: KrylovKitJL ,args... ;kwargs... )
64
- @unpack A, b, u = cache
65
- @unpack solver = alg
66
- u = KrylovKit. linsolve (A, b, u, solver, args... ; kwargs... )[1 ] # no precond?!
67
- return u
77
+ function SciMLBase. solve (cache:: LinearCache , alg:: IterativeSolversJL ; kwargs... )
78
+ if cache. isfresh
79
+ solver = init_cacheval (alg, cache. A, cache. b, cache. u)
80
+ cache = set_cacheval (cache, solver)
81
+ end
82
+
83
+ for resi in cache. cacheval end
84
+
85
+ return cache. u
68
86
end
69
87
0 commit comments