LCOV - code coverage report
Current view: top level - src/mfem/solvers - MFEMLinearSolverBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #33416 (b10b36) with base 9fbd27 Lines: 30 36 83.3 %
Date: 2026-07-23 16:15:30 Functions: 10 10 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 "MFEMLinearSolverBase.h"
      13             : #include "MFEMProblem.h"
      14             : #include "MFEMEigensolverBase.h"
      15             : 
      16             : namespace Moose::MFEM
      17             : {
      18             : InputParameters
      19       38172 : LinearSolverBase::validParams()
      20             : {
      21       38172 :   InputParameters params = SolverBase::validParams();
      22       76344 :   params.addClassDescription(
      23             :       "Base class for defining linear mfem::Solver derived classes for Moose.");
      24      114516 :   params.addParam<bool>("low_order_refined", false, "Set usage of Low-Order Refined solver.");
      25       38172 :   return params;
      26           0 : }
      27             : 
      28        2078 : LinearSolverBase::LinearSolverBase(const InputParameters & parameters)
      29        6234 :   : SolverBase(parameters), _lor{getParam<bool>("low_order_refined")}, _preconditioner{nullptr}
      30             : {
      31        2078 : }
      32             : 
      33             : template <typename T>
      34             : void
      35        1061 : LinearSolverBase::SetPreconditioner(T & solver)
      36             : {
      37        3183 :   if (isParamSetByUser("preconditioner"))
      38             :   {
      39        1041 :     if (!_preconditioner)
      40             :     {
      41        1926 :       auto & pre = getMFEMProblem().getMFEMObject<LinearSolverBase>(
      42        2889 :           "Moose::MFEM::SolverBase", getParam<MFEMSolverName>("preconditioner"));
      43             :       // Take shared ownership so the preconditioner outlives the solver
      44         963 :       _preconditioner = std::static_pointer_cast<LinearSolverBase>(pre.shared_from_this());
      45             :     }
      46             : 
      47        1041 :     if (dynamic_cast<const EigensolverBase *>(GetPreconditioner()))
      48           0 :       mooseError("Eigensolvers cannot be used as preconditioners.");
      49             : 
      50        1041 :     auto & mfem_pre = _preconditioner->GetSolver();
      51             :     if constexpr (std::is_base_of_v<mfem::HypreSolver, T> || std::is_same_v<mfem::HypreAME, T>)
      52         886 :       if (auto * const hypre_pre = dynamic_cast<mfem::HypreSolver *>(&mfem_pre))
      53         886 :         solver.SetPreconditioner(*hypre_pre);
      54             :       else
      55           0 :         mooseError("hypre solver preconditioners must themselves be hypre solvers");
      56             :     else
      57         155 :       solver.SetPreconditioner(mfem_pre);
      58             :   }
      59        1061 : }
      60             : 
      61             : template void LinearSolverBase::SetPreconditioner(mfem::CGSolver &);
      62             : template void LinearSolverBase::SetPreconditioner(mfem::GMRESSolver &);
      63             : template void LinearSolverBase::SetPreconditioner(mfem::HypreFGMRES &);
      64             : template void LinearSolverBase::SetPreconditioner(mfem::HypreGMRES &);
      65             : template void LinearSolverBase::SetPreconditioner(mfem::HyprePCG &);
      66             : template void LinearSolverBase::SetPreconditioner(mfem::HypreLOBPCG &);
      67             : template void LinearSolverBase::SetPreconditioner(mfem::HypreAME &);
      68             : 
      69             : void
      70          57 : LinearSolverBase::CheckSpectralEquivalence(mfem::ParBilinearForm & blf) const
      71             : {
      72          57 :   if (auto fec = dynamic_cast<const mfem::H1_FECollection *>(blf.FESpace()->FEColl()))
      73             :   {
      74          43 :     if (fec->GetBasisType() != mfem::BasisType::GaussLobatto)
      75           0 :       mooseError("Low-Order-Refined solver requires the FESpace basis to be GaussLobatto "
      76             :                  "for H1 elements.");
      77             :   }
      78          14 :   else if (auto fec = dynamic_cast<const mfem::ND_FECollection *>(blf.FESpace()->FEColl()))
      79             :   {
      80          14 :     if (fec->GetClosedBasisType() != mfem::BasisType::GaussLobatto ||
      81           7 :         fec->GetOpenBasisType() != mfem::BasisType::IntegratedGLL)
      82           0 :       mooseError("Low-Order-Refined solver requires the FESpace closed-basis to be GaussLobatto "
      83             :                  "and the open-basis to be IntegratedGLL for ND elements.");
      84             :   }
      85           7 :   else if (auto fec = dynamic_cast<const mfem::RT_FECollection *>(blf.FESpace()->FEColl()))
      86             :   {
      87          14 :     if (fec->GetClosedBasisType() != mfem::BasisType::GaussLobatto ||
      88           7 :         fec->GetOpenBasisType() != mfem::BasisType::IntegratedGLL)
      89           0 :       mooseError("Low-Order-Refined solver requires the FESpace closed-basis to be GaussLobatto "
      90             :                  "and the open-basis to be IntegratedGLL for RT elements.");
      91             :   }
      92          57 : }
      93             : } // namespace Moose::MFEM
      94             : 
      95             : #endif

Generated by: LCOV version 1.14