diff --git a/gen/solver_options.jl b/gen/solver_options.jl index 79f480c..8d1768b 100644 --- a/gen/solver_options.jl +++ b/gen/solver_options.jl @@ -1,18 +1,30 @@ using HYPRE.LibHYPRE -function generate_options(io, structname, prefix) +function generate_options(io, structname, prefixes...) println(io, "") println(io, "function Internals.set_options(s::$(structname), kwargs)") println(io, " solver = s.solver") println(io, " for (k, v) in kwargs") - r = Regex("^" * prefix * "([A-Z].*)\$") - ns = sort!(filter!(x -> occursin(r, string(x)), names(LibHYPRE))) + + ns = Tuple{Symbol,String}[] + for prefix in prefixes, n in names(LibHYPRE) + r = Regex("^" * prefix * "([A-Z].*)\$") + if (m = match(r, string(n)); m !== nothing) + m1 = String(m[1]) + if (idx = findfirst(x -> x[2] == m1, ns); idx === nothing) + push!(ns, (n, m1)) + else + @info "Ignoring $(n) since $(ns[idx][1]) already used." + end + end + end + sort!(ns; by = Base.first) + first = true - for n in ns + for (n, k) in ns m = get(methods(getfield(LibHYPRE, n)), 1, nothing) m === nothing && continue nargs = m.nargs - 1 - k = String(match(r, string(n))[1]) print(io, " $(first ? "" : "else")if k === :$(k)") println(io) if k == "Precond" @@ -39,5 +51,5 @@ open(joinpath(@__DIR__, "..", "src", "solver_options.jl"), "w") do io println(io, "Internals.set_options(::HYPRESolver, kwargs) = nothing") generate_options(io, "BoomerAMG", "HYPRE_BoomerAMGSet") - generate_options(io, "PCG", "HYPRE_PCGSet") + generate_options(io, "PCG", "HYPRE_ParCSRPCGSet", "HYPRE_PCGSet") end diff --git a/src/solver_options.jl b/src/solver_options.jl index 4c30ea8..af97578 100644 --- a/src/solver_options.jl +++ b/src/solver_options.jl @@ -262,34 +262,34 @@ end function Internals.set_options(s::PCG, kwargs) solver = s.solver for (k, v) in kwargs - if k === :AbsoluteTol - @check HYPRE_PCGSetAbsoluteTol(solver, v) - elseif k === :AbsoluteTolFactor + if k === :AbsoluteTolFactor @check HYPRE_PCGSetAbsoluteTolFactor(solver, v) elseif k === :ConvergenceFactorTol @check HYPRE_PCGSetConvergenceFactorTol(solver, v) - elseif k === :Logging - @check HYPRE_PCGSetLogging(solver, v) - elseif k === :MaxIter - @check HYPRE_PCGSetMaxIter(solver, v) - elseif k === :Precond - Internals.set_precond(s, v) - elseif k === :PrintLevel - @check HYPRE_PCGSetPrintLevel(solver, v) elseif k === :RecomputeResidual @check HYPRE_PCGSetRecomputeResidual(solver, v) elseif k === :RecomputeResidualP @check HYPRE_PCGSetRecomputeResidualP(solver, v) - elseif k === :RelChange - @check HYPRE_PCGSetRelChange(solver, v) elseif k === :ResidualTol @check HYPRE_PCGSetResidualTol(solver, v) + elseif k === :AbsoluteTol + @check HYPRE_ParCSRPCGSetAbsoluteTol(solver, v) + elseif k === :Logging + @check HYPRE_ParCSRPCGSetLogging(solver, v) + elseif k === :MaxIter + @check HYPRE_ParCSRPCGSetMaxIter(solver, v) + elseif k === :Precond + Internals.set_precond(s, v) + elseif k === :PrintLevel + @check HYPRE_ParCSRPCGSetPrintLevel(solver, v) + elseif k === :RelChange + @check HYPRE_ParCSRPCGSetRelChange(solver, v) elseif k === :StopCrit - @check HYPRE_PCGSetStopCrit(solver, v) + @check HYPRE_ParCSRPCGSetStopCrit(solver, v) elseif k === :Tol - @check HYPRE_PCGSetTol(solver, v) + @check HYPRE_ParCSRPCGSetTol(solver, v) elseif k === :TwoNorm - @check HYPRE_PCGSetTwoNorm(solver, v) + @check HYPRE_ParCSRPCGSetTwoNorm(solver, v) end end end