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 "MFEMSolverBase.h" 13 : 14 : InputParameters 15 87502 : MFEMSolverBase::validParams() 16 : { 17 87502 : InputParameters params = MFEMGeneralUserObject::validParams(); 18 175004 : params.addClassDescription("Base class for defining mfem::Solver derived classes for Moose."); 19 175004 : params.registerBase("MFEMSolverBase"); 20 262506 : params.addParam<bool>("low_order_refined", false, "Set usage of Low-Order Refined solver."); 21 : 22 87502 : return params; 23 0 : } 24 : 25 601 : MFEMSolverBase::MFEMSolverBase(const InputParameters & parameters) 26 : : MFEMGeneralUserObject(parameters), 27 601 : _lor{getParam<bool>("low_order_refined")}, 28 601 : _solver{nullptr}, 29 601 : _preconditioner{nullptr} 30 : { 31 601 : } 32 : 33 : template <typename T> 34 : void 35 1019 : MFEMSolverBase::setPreconditioner(T & solver) 36 : { 37 3057 : if (isParamSetByUser("preconditioner")) 38 : { 39 1001 : if (!_preconditioner) 40 247 : _preconditioner = 41 741 : &const_cast<MFEMSolverBase &>(getUserObject<MFEMSolverBase>("preconditioner")); 42 : 43 1001 : auto & mfem_pre = _preconditioner->getSolver(); 44 : if constexpr (std::is_base_of_v<mfem::HypreSolver, T>) 45 842 : if (auto * const hypre_pre = dynamic_cast<mfem::HypreSolver *>(&mfem_pre)) 46 842 : solver.SetPreconditioner(*hypre_pre); 47 : else 48 0 : mooseError("hypre solver preconditioners must themselves be hypre solvers"); 49 : else 50 159 : solver.SetPreconditioner(mfem_pre); 51 : } 52 1019 : } 53 : 54 : template void MFEMSolverBase::setPreconditioner(mfem::CGSolver &); 55 : template void MFEMSolverBase::setPreconditioner(mfem::GMRESSolver &); 56 : template void MFEMSolverBase::setPreconditioner(mfem::HypreFGMRES &); 57 : template void MFEMSolverBase::setPreconditioner(mfem::HypreGMRES &); 58 : template void MFEMSolverBase::setPreconditioner(mfem::HyprePCG &); 59 : 60 : bool 61 59 : MFEMSolverBase::checkSpectralEquivalence(mfem::ParBilinearForm & blf) const 62 : { 63 59 : bool equiv = true; 64 : 65 59 : if (auto fec = dynamic_cast<const mfem::ND_FECollection *>(blf.FESpace()->FEColl())) 66 : { 67 18 : if (fec->GetClosedBasisType() != mfem::BasisType::GaussLobatto || 68 9 : fec->GetOpenBasisType() != mfem::BasisType::IntegratedGLL) 69 0 : equiv = false; 70 : } 71 50 : else if (auto fec = dynamic_cast<const mfem::RT_FECollection *>(blf.FESpace()->FEColl())) 72 : { 73 16 : if (fec->GetClosedBasisType() != mfem::BasisType::GaussLobatto || 74 8 : fec->GetOpenBasisType() != mfem::BasisType::IntegratedGLL) 75 0 : equiv = false; 76 : } 77 : 78 59 : return equiv; 79 : } 80 : 81 : #endif