mirror of https://github.com/fredrikekre/HYPRE.jl
4 changed files with 65 additions and 1 deletions
@ -0,0 +1,35 @@ |
|||||||
|
import LinearAlgebra |
||||||
|
|
||||||
|
struct BoomerAMGPrecWrapper{MatType} |
||||||
|
P::HYPRE.BoomerAMG |
||||||
|
A::MatType |
||||||
|
end |
||||||
|
|
||||||
|
function LinearAlgebra.ldiv!(y::AbstractVector, prec::BoomerAMGPrecWrapper, x::AbstractVector) |
||||||
|
fill!(y, eltype(y)(0.0)) |
||||||
|
HYPRE.solve!(prec.P, y, prec.A, x) |
||||||
|
end |
||||||
|
|
||||||
|
""" |
||||||
|
BoomerAMGPrecBuilder(settings_fun; kwargs...) |
||||||
|
""" |
||||||
|
struct BoomerAMGPrecBuilder{SFun, Tk} |
||||||
|
settings_fun!::SFun |
||||||
|
kwargs::Tk |
||||||
|
end |
||||||
|
|
||||||
|
# Syntactic sugar wth some defaults |
||||||
|
function BoomerAMGPrecBuilder(settings_fun! = (amg, A, p) -> nothing; MaxIter = 1, Tol = 0.0, kwargs...) |
||||||
|
return construct_boomeramg_prec_builder(settings_fun!; MaxIter, Tol, kwargs) |
||||||
|
end |
||||||
|
|
||||||
|
# Helper to package kwargs |
||||||
|
function construct_boomeramg_prec_builder(settings_fun!; kwargs...) |
||||||
|
return BoomerAMGPrecBuilder(settings_fun!, kwargs) |
||||||
|
end |
||||||
|
|
||||||
|
function (b::BoomerAMGPrecBuilder)(A::AbstractSparseMatrixCSC, p) |
||||||
|
amg = HYPRE.BoomerAMG(; b.kwargs) |
||||||
|
settings_fun!(amg, A, p) |
||||||
|
return (BoomerAMGPrecWrapper(amg, A), I) |
||||||
|
end |
||||||
Loading…
Reference in new issue