LCOV - code coverage report
Current view: top level - src/mfem/solvers - MFEMLinearSolverBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 329044 Lines: 24 27 88.9 %
Date: 2026-08-03 21:12:22 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       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

Generated by: LCOV version 1.14