Line data Source code
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 "MFEMHypreBoomerAMG.h" 13 : #include "MFEMFESpace.h" 14 : #include "MFEMProblem.h" 15 : 16 : registerMooseObject("MooseApp", MFEMHypreBoomerAMG); 17 : 18 : InputParameters 19 3726 : MFEMHypreBoomerAMG::validParams() 20 : { 21 3726 : InputParameters params = Moose::MFEM::LORLinearSolverBase<mfem::HypreBoomerAMG>::validParams(); 22 7452 : params.addClassDescription("Hypre BoomerAMG solver and preconditioner for the iterative solution " 23 : "of MFEM equation systems."); 24 14904 : params.addParam<mfem::real_t>("l_tol", 1e-5, "Set the relative tolerance."); 25 14904 : params.addParam<int>("l_max_its", 10000, "Set the maximum number of iterations."); 26 14904 : params.addParam<int>("print_level", 2, "Set the solver verbosity."); 27 14904 : params.addParam<MFEMFESpaceName>( 28 : "fespace", "H1 FESpace to use in HypreBoomerAMG setup for elasticity problems."); 29 11178 : params.addParam<mfem::real_t>( 30 7452 : "strength_threshold", 0.25, "HypreBoomerAMG strong threshold. Defaults to 0.25."); 31 14904 : MooseEnum errmode("ignore=0 warn=1 abort=2", "abort", false); 32 11178 : params.addParam<MooseEnum>("error_mode", errmode, "Set the behavior for treating hypre errors."); 33 7452 : return params; 34 3726 : } 35 : 36 797 : MFEMHypreBoomerAMG::MFEMHypreBoomerAMG(const InputParameters & parameters) 37 : : Moose::MFEM::LORLinearSolverBase<mfem::HypreBoomerAMG>(parameters), 38 780 : _mfem_fespace( 39 797 : isParamSetByUser("fespace") 40 797 : ? getMFEMProblem() 41 865 : .getMFEMObject<MFEMFESpace>("MFEMFESpace", getParam<MFEMFESpaceName>("fespace")) 42 : .getFESpace() 43 797 : : nullptr) 44 : { 45 797 : ConstructSolver(); 46 797 : } 47 : 48 789 : MFEMHypreBoomerAMG::~MFEMHypreBoomerAMG() { _solver.reset(); } 49 : 50 : void 51 823 : MFEMHypreBoomerAMG::ConstructSolver() 52 : { 53 823 : auto solver = std::make_unique<mfem::HypreBoomerAMG>(); 54 823 : SetSolverParameters(*solver); 55 823 : _solver = std::move(solver); 56 823 : } 57 : 58 : void 59 825 : MFEMHypreBoomerAMG::SetSolverParameters(mfem::HypreBoomerAMG & solver) 60 : { 61 1650 : solver.iterative_mode = getParam<bool>("use_initial_guess"); 62 1650 : solver.SetTol(getParam<mfem::real_t>("l_tol")); 63 1650 : solver.SetMaxIter(getParam<int>("l_max_its")); 64 1650 : solver.SetPrintLevel(getParam<int>("print_level")); 65 1650 : solver.SetStrengthThresh(getParam<mfem::real_t>("strength_threshold")); 66 1650 : solver.SetErrorMode(mfem::HypreSolver::ErrorMode(int(getParam<MooseEnum>("error_mode")))); 67 : 68 825 : if (_mfem_fespace && !mfem::HypreUsingGPU()) 69 11 : solver.SetElasticityOptions(_mfem_fespace.get()); 70 825 : } 71 : 72 : #endif