Browse Source

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.
fe/copyto
Fredrik Ekre 3 years ago
parent
commit
fc53daa829
  1. 24
      gen/solver_options.jl
  2. 32
      src/solver_options.jl

24
gen/solver_options.jl

@ -1,18 +1,30 @@ @@ -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 @@ -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

32
src/solver_options.jl

@ -262,34 +262,34 @@ end @@ -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

Loading…
Cancel
Save