From fc53daa829dbbd062a943d625ff66ad0a378b043 Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Sun, 24 Jul 2022 01:52:56 +0200 Subject: [PATCH] Update option generator Some solvers have option from the specific ParCSR solver + options for the general solver. This updates the option generator to handle this such that the specific method is preferred over the generic one. This patch also include the result of the generator applied to PCG, which has some specific options for ParCSRPCG. --- gen/solver_options.jl | 24 ++++++++++++++++++------ src/solver_options.jl | 32 ++++++++++++++++---------------- 2 files changed, 34 insertions(+), 22 deletions(-) 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