|
1 | 1 |
|
| 2 | +#TODO: composed preconditioners, preconditioner setter for cache, |
| 3 | +# detailed tests for wrappers |
| 4 | + |
2 | 5 | ## Preconditioners
|
3 | 6 |
|
4 | 7 | struct ScaleVector{T}
|
@@ -127,14 +130,26 @@ function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...)
|
127 | 130 | cache = set_cacheval(cache, solver)
|
128 | 131 | end
|
129 | 132 |
|
130 |
| - abstol = (alg.abstol == 0) ? √eps(eltype(cache.b)) : alg.abstol |
131 |
| - reltol = (alg.reltol == 0) ? √eps(eltype(cache.b)) : alg.reltol |
132 |
| - maxiter = (alg.reltol == 0) ? length(cache.b) : alg.maxiter |
| 133 | + abstol = (alg.abstol == 0) ? √eps(eltype(cache.b)) : alg.abstol |
| 134 | + reltol = (alg.reltol == 0) ? √eps(eltype(cache.b)) : alg.reltol |
| 135 | + maxiter = (alg.maxiter == 0) ? length(cache.b) : alg.maxiter |
| 136 | + |
| 137 | + |
| 138 | + args = (cache.cacheval, cache.A, cache.b) |
| 139 | + kwargs = (atol=abstol, rtol=reltol, itmax=maxiter, alg.kwargs...) |
133 | 140 |
|
134 |
| - Krylov.solve!(cache.cacheval, cache.A, cache.b; |
135 |
| - M=alg.Pl, N=alg.Pr, |
136 |
| - atol = abstol, rtol = reltol, itmax = maxiter, |
137 |
| - alg.kwargs...) |
| 141 | + if cache.cacheval == Krylov.CgSolver |
| 142 | + alg.Pr != LinearAlgebra.I && |
| 143 | + @warn "$(alg.KrylovAlg) doesn't support right preconditioning." |
| 144 | + Krylov.solve!(args...; M=alg.Pl, |
| 145 | + kwargs...) |
| 146 | + elseif cache.cacheval == Krylov.GmresSolver |
| 147 | + Krylov.solve!(args...; M=alg.Pl, N=alg.Pr, |
| 148 | + kwargs...) |
| 149 | + else |
| 150 | + Krylov.solve!(args...; M=alg.Pl, N=alg.Pr, |
| 151 | + kwargs...) |
| 152 | + end |
138 | 153 |
|
139 | 154 | return cache.u
|
140 | 155 | end
|
@@ -177,20 +192,21 @@ function init_cacheval(alg::IterativeSolversJL, A, b, u)
|
177 | 192 | Pl = (alg.Pl == LinearAlgebra.I) ? IterativeSolvers.Identity() : alg.Pl
|
178 | 193 | Pr = (alg.Pr == LinearAlgebra.I) ? IterativeSolvers.Identity() : alg.Pr
|
179 | 194 |
|
180 |
| - abstol = (alg.abstol == 0) ? √eps(eltype(b)) : alg.abstol |
181 |
| - reltol = (alg.reltol == 0) ? √eps(eltype(b)) : alg.reltol |
182 |
| - maxiter = (alg.reltol == 0) ? length(b) : alg.maxiter |
| 195 | + abstol = (alg.abstol == 0) ? √eps(eltype(b)) : alg.abstol |
| 196 | + reltol = (alg.reltol == 0) ? √eps(eltype(b)) : alg.reltol |
| 197 | + maxiter = (alg.maxiter == 0) ? length(b) : alg.maxiter |
| 198 | + |
| 199 | +# args = (u, A, b) |
| 200 | + kwargs = (abstol=abstol, reltol=reltol, maxiter=maxiter, alg.kwargs...) |
183 | 201 |
|
184 | 202 | iterable = if alg.generate_iterator === IterativeSolvers.cg_iterator!
|
185 | 203 | Pr != IterativeSolvers.Identity() &&
|
186 | 204 | @warn "$(alg.generate_iterator) doesn't support right preconditioning"
|
187 | 205 | alg.generate_iterator(u, A, b, Pl;
|
188 |
| - abstol=abstol, reltol=reltol, maxiter=maxiter, |
189 |
| - alg.kwargs...) |
| 206 | + kwargs...) |
190 | 207 | elseif alg.generate_iterator === IterativeSolvers.gmres_iterable!
|
191 | 208 | alg.generate_iterator(u, A, b; Pl=Pl, Pr=Pr,
|
192 |
| - abstol=abstol, reltol=reltol, maxiter=maxiter, |
193 |
| - alg.kwargs...) |
| 209 | + kwargs...) |
194 | 210 | elseif alg.generate_iterator === IterativeSolvers.bicgstabl_iterator!
|
195 | 211 | Pr != IterativeSolvers.Identity() &&
|
196 | 212 | @warn "$(alg.generate_iterator) doesn't support right preconditioning"
|
|
0 commit comments