diff --git a/gen/solver_options.jl b/gen/solver_options.jl index 082c2f1..89b3c19 100644 --- a/gen/solver_options.jl +++ b/gen/solver_options.jl @@ -55,6 +55,7 @@ open(joinpath(@__DIR__, "..", "src", "solver_options.jl"), "w") do io generate_options(io, "BiCGSTAB", "HYPRE_ParCSRBiCGSTABSet", "HYPRE_BiCGSTABSet") generate_options(io, "BoomerAMG", "HYPRE_BoomerAMGSet") + # generate_options(io, "FSAI", "HYPRE_FSAISet") generate_options(io, "GMRES", "HYPRE_ParCSRGMRESSet", "HYPRE_GMRESSet") generate_options(io, "PCG", "HYPRE_ParCSRPCGSet", "HYPRE_PCGSet") end diff --git a/src/solvers.jl b/src/solvers.jl index 116532b..bcb28d4 100644 --- a/src/solvers.jl +++ b/src/solvers.jl @@ -106,8 +106,8 @@ function solve!(bicg::BiCGSTAB, x::HYPREVector, A::HYPREMatrix, b::HYPREVector) return x end -Internals.solve_func(::BiCGSTAB) = HYPRE_ParCSRBiCGSTABSolve Internals.setup_func(::BiCGSTAB) = HYPRE_ParCSRBiCGSTABSetup +Internals.solve_func(::BiCGSTAB) = HYPRE_ParCSRBiCGSTABSolve function Internals.set_precond(bicg::BiCGSTAB, p::HYPRESolver) solve_f = Internals.solve_func(p) @@ -142,8 +142,8 @@ function solve!(amg::BoomerAMG, x::HYPREVector, A::HYPREMatrix, b::HYPREVector) return x end -Internals.solve_func(::BoomerAMG) = HYPRE_BoomerAMGSolve Internals.setup_func(::BoomerAMG) = HYPRE_BoomerAMGSetup +Internals.solve_func(::BoomerAMG) = HYPRE_BoomerAMGSolve function Internals.set_precond_defaults(amg::BoomerAMG) defaults = (; Tol = 0.0, MaxIter = 1) @@ -152,6 +152,43 @@ function Internals.set_precond_defaults(amg::BoomerAMG) end +######### +## FSAI # +######### + +# Requires version 2.25 + +#mutable struct FSAI <: HYPRESolver +# solver::HYPRE_Solver +# function FSAI(; kwargs...) +# solver = new(C_NULL) +# solver_ref = Ref{HYPRE_Solver}(C_NULL) +# @check HYPRE_FSAICreate(solver_ref) +# solver.solver = solver_ref[] +# # Attach a finalizer +# finalizer(x -> HYPRE_FSAIDestroy(x.solver), solver) +# # Set the options +# Internals.set_options(solver, kwargs) +# return solver +# end +#end + +#function solve!(fsai::FSAI, x::HYPREVector, A::HYPREMatrix, b::HYPREVector) +# @check HYPRE_FSAISetup(fsai.solver, A.parmatrix, b.parvector, x.parvector) +# @check HYPRE_FSAISolve(fsai.solver, A.parmatrix, b.parvector, x.parvector) +# return x +#end + +#Internals.setup_func(::FSAI) = HYPRE_FSAISetup +#Internals.solve_func(::FSAI) = HYPRE_FSAISolve + +#function Internals.set_precond_defaults(fsai::FSAI) +# defaults = (; Tolerance = 0.0) +# Internals.set_options(fsai, pairs(defaults)) +# return nothing +#end + + ######### # GMRES # ######### @@ -179,8 +216,8 @@ function solve!(gmres::GMRES, x::HYPREVector, A::HYPREMatrix, b::HYPREVector) return x end -Internals.solve_func(::GMRES) = HYPRE_ParCSRGMRESSetup -Internals.setup_func(::GMRES) = HYPRE_ParCSRGMRESSolve +Internals.setup_func(::GMRES) = HYPRE_ParCSRGMRESSetup +Internals.solve_func(::GMRES) = HYPRE_ParCSRGMRESSolve function Internals.set_precond(gmres::GMRES, p::HYPRESolver) solve_f = Internals.solve_func(p) @@ -219,8 +256,8 @@ function solve!(pcg::PCG, x::HYPREVector, A::HYPREMatrix, b::HYPREVector) return x end -Internals.solve_func(::PCG) = HYPRE_ParCSRPCGSolve Internals.setup_func(::PCG) = HYPRE_ParCSRPCGSetup +Internals.solve_func(::PCG) = HYPRE_ParCSRPCGSolve function Internals.set_precond(pcg::PCG, p::HYPRESolver) solve_f = Internals.solve_func(p)