Browse Source

Add FSAI solver/preconditioner.

pull/5/head
Fredrik Ekre 3 years ago
parent
commit
1732948146
  1. 1
      gen/solver_options.jl
  2. 47
      src/solvers.jl

1
gen/solver_options.jl

@ -55,6 +55,7 @@ open(joinpath(@__DIR__, "..", "src", "solver_options.jl"), "w") do io @@ -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

47
src/solvers.jl

@ -106,8 +106,8 @@ function solve!(bicg::BiCGSTAB, x::HYPREVector, A::HYPREMatrix, b::HYPREVector) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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)

Loading…
Cancel
Save