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.
Fredrik Ekre 3 years ago
parent
commit
8e4d2a7252
  1. 22
      gen/solver_options.jl
  2. 32
      src/solver_options.jl

22
gen/solver_options.jl

@ -1,18 +1,30 @@
using HYPRE.LibHYPRE using HYPRE.LibHYPRE
function generate_options(io, structname, prefix) function generate_options(io, structname, prefixes...)
println(io, "") println(io, "")
println(io, "function Internals.set_options(s::$(structname), kwargs)") println(io, "function Internals.set_options(s::$(structname), kwargs)")
println(io, " solver = s.solver") println(io, " solver = s.solver")
println(io, " for (k, v) in kwargs") println(io, " for (k, v) in kwargs")
ns = Tuple{Symbol,String}[]
for prefix in prefixes, n in names(LibHYPRE)
r = Regex("^" * prefix * "([A-Z].*)\$") r = Regex("^" * prefix * "([A-Z].*)\$")
ns = sort!(filter!(x -> occursin(r, string(x)), names(LibHYPRE))) 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 first = true
for n in ns for (n, k) in ns
m = get(methods(getfield(LibHYPRE, n)), 1, nothing) m = get(methods(getfield(LibHYPRE, n)), 1, nothing)
m === nothing && continue m === nothing && continue
nargs = m.nargs - 1 nargs = m.nargs - 1
k = String(match(r, string(n))[1])
print(io, " $(first ? "" : "else")if k === :$(k)") print(io, " $(first ? "" : "else")if k === :$(k)")
println(io) println(io)
if k == "Precond" 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") println(io, "Internals.set_options(::HYPRESolver, kwargs) = nothing")
generate_options(io, "BoomerAMG", "HYPRE_BoomerAMGSet") generate_options(io, "BoomerAMG", "HYPRE_BoomerAMGSet")
generate_options(io, "PCG", "HYPRE_PCGSet") generate_options(io, "PCG", "HYPRE_ParCSRPCGSet", "HYPRE_PCGSet")
end end

32
src/solver_options.jl

@ -262,34 +262,34 @@ end
function Internals.set_options(s::PCG, kwargs) function Internals.set_options(s::PCG, kwargs)
solver = s.solver solver = s.solver
for (k, v) in kwargs for (k, v) in kwargs
if k === :AbsoluteTol if k === :AbsoluteTolFactor
@check HYPRE_PCGSetAbsoluteTol(solver, v)
elseif k === :AbsoluteTolFactor
@check HYPRE_PCGSetAbsoluteTolFactor(solver, v) @check HYPRE_PCGSetAbsoluteTolFactor(solver, v)
elseif k === :ConvergenceFactorTol elseif k === :ConvergenceFactorTol
@check HYPRE_PCGSetConvergenceFactorTol(solver, v) @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 elseif k === :RecomputeResidual
@check HYPRE_PCGSetRecomputeResidual(solver, v) @check HYPRE_PCGSetRecomputeResidual(solver, v)
elseif k === :RecomputeResidualP elseif k === :RecomputeResidualP
@check HYPRE_PCGSetRecomputeResidualP(solver, v) @check HYPRE_PCGSetRecomputeResidualP(solver, v)
elseif k === :RelChange
@check HYPRE_PCGSetRelChange(solver, v)
elseif k === :ResidualTol elseif k === :ResidualTol
@check HYPRE_PCGSetResidualTol(solver, v) @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 elseif k === :StopCrit
@check HYPRE_PCGSetStopCrit(solver, v) @check HYPRE_ParCSRPCGSetStopCrit(solver, v)
elseif k === :Tol elseif k === :Tol
@check HYPRE_PCGSetTol(solver, v) @check HYPRE_ParCSRPCGSetTol(solver, v)
elseif k === :TwoNorm elseif k === :TwoNorm
@check HYPRE_PCGSetTwoNorm(solver, v) @check HYPRE_ParCSRPCGSetTwoNorm(solver, v)
end end
end end
end end

Loading…
Cancel
Save