LCOV - code coverage report
Current view: top level - src/mfem/solvers - MFEMSolverBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 419b9d Lines: 30 34 88.2 %
Date: 2025-08-08 20:01:16 Functions: 8 8 100.0 %
Legend: Lines: hit not hit

          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       87196 : MFEMSolverBase::validParams()
      16             : {
      17       87196 :   InputParameters params = MFEMGeneralUserObject::validParams();
      18       87196 :   params.addClassDescription("Base class for defining mfem::Solver derived classes for Moose.");
      19       87196 :   params.registerBase("MFEMSolverBase");
      20       87196 :   params.addParam<bool>("low_order_refined", false, "Set usage of Low-Order Refined solver.");
      21             : 
      22       87196 :   return params;
      23           0 : }
      24             : 
      25         448 : MFEMSolverBase::MFEMSolverBase(const InputParameters & parameters)
      26             :   : MFEMGeneralUserObject(parameters),
      27         448 :     _lor{getParam<bool>("low_order_refined")},
      28         448 :     _solver{nullptr},
      29         448 :     _preconditioner{nullptr}
      30             : {
      31         448 : }
      32             : 
      33             : template <typename T>
      34             : void
      35         453 : MFEMSolverBase::setPreconditioner(T & solver)
      36             : {
      37         453 :   if (isParamSetByUser("preconditioner"))
      38             :   {
      39         435 :     if (!_preconditioner)
      40         172 :       _preconditioner =
      41         172 :           &const_cast<MFEMSolverBase &>(getUserObject<MFEMSolverBase>("preconditioner"));
      42             : 
      43         435 :     auto & mfem_pre = _preconditioner->getSolver();
      44             :     if constexpr (std::is_base_of_v<mfem::HypreSolver, T>)
      45         266 :       if (auto * const hypre_pre = dynamic_cast<mfem::HypreSolver *>(&mfem_pre))
      46         266 :         solver.SetPreconditioner(*hypre_pre);
      47             :       else
      48           0 :         mooseError("hypre solver preconditioners must themselves be hypre solvers");
      49             :     else
      50         169 :       solver.SetPreconditioner(mfem_pre);
      51             :   }
      52         453 : }
      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          63 : MFEMSolverBase::checkSpectralEquivalence(mfem::ParBilinearForm & blf) const
      62             : {
      63          63 :   bool equiv = true;
      64             : 
      65          63 :   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          54 :   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          63 :   return equiv;
      79             : }
      80             : 
      81             : #endif

Generated by: LCOV version 1.14