10#ifdef MOOSE_MFEM_ENABLED
21 params.
addClassDescription(
"Hypre solver for the iterative solution of MFEM equation systems "
22 "using the flexible generalized minimal residual method.");
23 params.
addParam<mfem::real_t>(
"l_tol", 1e-5,
"Set the relative tolerance.");
24 params.
addParam<
int>(
"l_max_its", 10000,
"Set the maximum number of iterations.");
25 params.
addParam<
int>(
"kdim", 10,
"Set the k-dimension.");
26 params.
addParam<
int>(
"print_level", 2,
"Set the solver verbosity.");
27 params.
addParam<MFEMSolverName>(
"preconditioner",
"Optional choice of preconditioner to use.");
33 :
Moose::MFEM::LORLinearSolverBase<
mfem::HypreFGMRES>(parameters)
41 auto solver = std::make_unique<mfem::HypreFGMRES>(
getMFEMProblem().getComm());
49 solver.iterative_mode = getParam<bool>(
"use_initial_guess");
50 solver.SetTol(getParam<mfem::real_t>(
"l_tol"));
51 solver.SetMaxIter(getParam<int>(
"l_max_its"));
52 solver.SetKDim(getParam<int>(
"kdim"));
53 solver.SetPrintLevel(getParam<int>(
"print_level"));
59 if (
auto * prec =
dynamic_cast<mfem::HypreSolver *
>(&
_preconditioner->GetSolver()))
60 cast_ref<mfem::HypreFGMRES &>(
GetSolver()).SetPreconditioner(*prec);
62 paramError(
"preconditioner",
"MFEMHypreFGMRES requires a hypre solver as its preconditioner");
registerMooseObject("MooseApp", MFEMHypreFGMRES)
Wrapper for mfem::HypreFGMRES solver.
static InputParameters validParams()
MFEMHypreFGMRES(const InputParameters ¶meters)
void ConstructSolver() override
Override in derived classes to construct and set the solver options.
virtual void SetPreconditionerImpl() override
Override in solvers that accept a preconditioner.
virtual void SetSolverParameters(mfem::HypreFGMRES &solver) override
Update the wrapped MFEM solver parameters.
MFEMProblem & getMFEMProblem()
Return the owning MFEM problem.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
static InputParameters validParams()
std::shared_ptr< LinearSolverBase > _preconditioner
Preconditioner to be used for the problem.
mfem::Solver & GetSolver()
Returns the wrapped MFEM solver.
std::unique_ptr< mfem::Solver > _solver
Solver to be used for the problem.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...