https://mooseframework.inl.gov
MFEMHypreGMRES.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #ifdef MOOSE_MFEM_ENABLED
11 
12 #include "MFEMHypreGMRES.h"
13 #include "MFEMProblem.h"
14 
16 
19 {
21  params.addClassDescription("Hypre solver for the iterative solution of MFEM equation systems "
22  "using the generalized minimal residual method.");
23 
24  params.addParam<mfem::real_t>("l_tol", 1e-5, "Set the relative tolerance.");
25  params.addParam<mfem::real_t>("l_abs_tol", 1e-50, "Set the absolute tolerance.");
26  params.addParam<int>("l_max_its", 10000, "Set the maximum number of iterations.");
27  params.addParam<int>("kdim", 10, "Set the k-dimension.");
28  params.addParam<int>("print_level", 2, "Set the solver verbosity.");
29  params.addParam<MFEMSolverName>("preconditioner", "Optional choice of preconditioner to use.");
30 
31  return params;
32 }
33 
35  : Moose::MFEM::LinearSolverBase(parameters)
36 {
38 }
39 
40 void
42 {
43  auto solver = std::make_unique<mfem::HypreGMRES>(getMFEMProblem().getComm());
44  solver->iterative_mode = getParam<bool>("use_initial_guess");
45  solver->SetTol(getParam<mfem::real_t>("l_tol"));
46  solver->SetAbsTol(getParam<mfem::real_t>("l_abs_tol"));
47  solver->SetMaxIter(getParam<int>("l_max_its"));
48  solver->SetKDim(getParam<int>("kdim"));
49  solver->SetPrintLevel(getParam<int>("print_level"));
50  SetPreconditioner(*solver);
51  _solver = std::move(solver);
52 }
53 
54 void
55 MFEMHypreGMRES::SetupLOR(mfem::ParBilinearForm & a, mfem::Array<int> & ess_bdr_markers)
56 {
57  if (_lor && _preconditioner)
58  mooseError("LOR solver cannot take a preconditioner");
59 
60  mfem::Array<int> ess_tdofs;
61  a.ParFESpace()->GetEssentialTrueDofs(ess_bdr_markers, ess_tdofs);
62  if (_preconditioner)
63  {
64  _preconditioner->SetupLOR(a, ess_tdofs);
65  SetPreconditioner(static_cast<mfem::HypreGMRES &>(*_solver));
66  }
67  else if (_lor)
68  {
70  mfem::ParLORDiscretization lor_disc(a, ess_tdofs);
71  auto lor_solver = new mfem::LORSolver<mfem::HypreGMRES>(lor_disc, getMFEMProblem().getComm());
72  lor_solver->GetSolver().SetTol(getParam<mfem::real_t>("l_tol"));
73  lor_solver->GetSolver().SetAbsTol(getParam<mfem::real_t>("l_abs_tol"));
74  lor_solver->GetSolver().SetMaxIter(getParam<int>("l_max_its"));
75  lor_solver->GetSolver().SetKDim(getParam<int>("kdim"));
76  lor_solver->GetSolver().SetPrintLevel(getParam<int>("print_level"));
77 
78  _solver.reset(lor_solver);
79  }
80 }
81 
82 #endif
static InputParameters validParams()
MFEMProblem & getMFEMProblem()
Return the owning MFEM problem.
Definition: MFEMObject.h:45
void SetupLOR(mfem::ParBilinearForm &a, mfem::Array< int > &ess_bdr_markers) override
Updates the solver with the bilinear form in case LOR solve is required.
std::unique_ptr< mfem::Solver > _solver
Solver to be used for the problem.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
registerMooseObject("MooseApp", MFEMHypreGMRES)
static InputParameters validParams()
std::shared_ptr< LinearSolverBase > _preconditioner
Preconditioner to be used for the problem.
MFEMHypreGMRES(const InputParameters &)
bool _lor
Variable defining whether to use LOR solver.
Wrapper for mfem::HypreGMRES solver.
MPI_Comm getComm()
Return the MPI communicator associated with this FE problem&#39;s mesh.
Definition: MFEMProblem.h:260
void SetPreconditioner(T &solver)
Retrieves the preconditioner userobject if present, sets the member pointer to said object if still u...
void ConstructSolver() override
Override in derived classes to construct and set the solver options.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:281
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object...
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
virtual void CheckSpectralEquivalence(mfem::ParBilinearForm &blf) const
Checks for the correct configuration of quadrature bases for LOR spectral equivalence.