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 : #pragma once 13 : #include "MFEMSolverBase.h" 14 : #include "libmesh/ignore_warnings.h" 15 : #include <mfem.hpp> 16 : #include "libmesh/restore_warnings.h" 17 : #include <memory> 18 : 19 : namespace Moose::MFEM 20 : { 21 : 22 : /** 23 : * Wrapper for mfem::SuperLUSolver that creates a SuperLURowLocMatrix from the operator when set. 24 : */ 25 : class SuperLUSolver : public mfem::SuperLUSolver 26 : { 27 : public: 28 9 : SuperLUSolver(MPI_Comm comm, int npdep = 1) 29 9 : : mfem::SuperLUSolver(comm), _s_superlu(std::make_unique<mfem::SuperLUSolver>(comm, npdep)) {}; 30 9 : void SetOperator(const mfem::Operator & op) override 31 : { 32 9 : _a_superlu = std::make_unique<mfem::SuperLURowLocMatrix>(op); 33 9 : _s_superlu->SetOperator(*_a_superlu.get()); 34 9 : } 35 9 : void Mult(const mfem::Vector & x, mfem::Vector & y) const override { _s_superlu->Mult(x, y); } 36 : 37 : private: 38 : std::unique_ptr<mfem::SuperLURowLocMatrix> _a_superlu{nullptr}; 39 : std::unique_ptr<mfem::SuperLUSolver> _s_superlu{nullptr}; 40 : }; 41 : } // namespace Moose::MFEM 42 : 43 : /** 44 : * Wrapper for Moose::MFEM::SuperLUSolver. 45 : */ 46 : class MFEMSuperLU : public MFEMSolverBase 47 : { 48 : public: 49 : static InputParameters validParams(); 50 : 51 : MFEMSuperLU(const InputParameters & parameters); 52 : 53 : protected: 54 : void constructSolver(const InputParameters & parameters) override; 55 : 56 : /// Updates the solver with the bilinear form in case LOR solve is required 57 : void updateSolver(mfem::ParBilinearForm & a, mfem::Array<int> & tdofs) override; 58 : }; 59 : 60 : #endif