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 "MFEMLinearSolverBase.h" 13 : #include "MFEMProblem.h" 14 : #include "MFEMEigensolverBase.h" 15 : 16 : namespace Moose::MFEM 17 : { 18 : InputParameters 19 38364 : LinearSolverBase::validParams() 20 : { 21 38364 : InputParameters params = SolverBase::validParams(); 22 38364 : params.addClassDescription( 23 : "Base class for defining linear mfem::Solver derived classes for Moose."); 24 38364 : return params; 25 0 : } 26 : 27 2138 : LinearSolverBase::LinearSolverBase(const InputParameters & parameters) 28 : : SolverBase(parameters), 29 2138 : _preconditioner{nullptr}, 30 2138 : _equation_system(getMFEMProblem().getProblemData().eqn_system) 31 : { 32 2138 : } 33 : 34 : template <typename T> 35 : void 36 2877 : LinearSolverBase::SetPreconditioner(T & solver) 37 : { 38 8631 : if (isParamSetByUser("preconditioner")) 39 : { 40 2847 : if (!_preconditioner) 41 : { 42 1976 : auto & pre = getMFEMProblem().getMFEMObject<LinearSolverBase>( 43 2964 : "Moose::MFEM::SolverBase", getParam<MFEMSolverName>("preconditioner")); 44 : // Take shared ownership so the preconditioner outlives the solver 45 988 : _preconditioner = std::static_pointer_cast<LinearSolverBase>(pre.shared_from_this()); 46 : } 47 : 48 2847 : if (dynamic_cast<const EigensolverBase *>(GetPreconditioner())) 49 0 : mooseError("Eigensolvers cannot be used as preconditioners."); 50 : 51 2847 : auto & mfem_pre = _preconditioner->GetSolver(); 52 : if constexpr (std::is_base_of_v<mfem::HypreSolver, T> || std::is_same_v<mfem::HypreAME, T>) 53 2615 : if (auto * const hypre_pre = dynamic_cast<mfem::HypreSolver *>(&mfem_pre)) 54 2615 : solver.SetPreconditioner(*hypre_pre); 55 : else 56 0 : mooseError("hypre solver preconditioners must themselves be hypre solvers"); 57 : else 58 232 : solver.SetPreconditioner(mfem_pre); 59 : } 60 2877 : } 61 : 62 : template void LinearSolverBase::SetPreconditioner(mfem::CGSolver &); 63 : template void LinearSolverBase::SetPreconditioner(mfem::GMRESSolver &); 64 : template void LinearSolverBase::SetPreconditioner(mfem::HypreFGMRES &); 65 : template void LinearSolverBase::SetPreconditioner(mfem::HypreGMRES &); 66 : template void LinearSolverBase::SetPreconditioner(mfem::HyprePCG &); 67 : template void LinearSolverBase::SetPreconditioner(mfem::HypreLOBPCG &); 68 : template void LinearSolverBase::SetPreconditioner(mfem::HypreAME &); 69 : 70 : void 71 4570 : LinearSolverBase::UpdateEquationSystemContext() 72 : { 73 4570 : if (_preconditioner) 74 1859 : _preconditioner->UpdateEquationSystemContext(); 75 4570 : } 76 : 77 : } // namespace Moose::MFEM 78 : 79 : #endif