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 "MFEMHypreADS.h" 13 : 14 : registerMooseObject("MooseApp", MFEMHypreADS); 15 : 16 : InputParameters 17 9268 : MFEMHypreADS::validParams() 18 : { 19 9268 : InputParameters params = MFEMSolverBase::validParams(); 20 18536 : params.addClassDescription("Hypre auxiliary-space divergence solver and preconditioner for the " 21 : "iterative solution of MFEM equation systems."); 22 37072 : params.addParam<UserObjectName>("fespace", "H(div) FESpace to use in HypreADS setup."); 23 27804 : params.addParam<int>("print_level", 2, "Set the solver verbosity."); 24 : 25 9268 : return params; 26 0 : } 27 : 28 18 : MFEMHypreADS::MFEMHypreADS(const InputParameters & parameters) 29 36 : : MFEMSolverBase(parameters), _mfem_fespace(getUserObject<MFEMFESpace>("fespace")) 30 : { 31 18 : constructSolver(parameters); 32 18 : } 33 : 34 : void 35 18 : MFEMHypreADS::constructSolver(const InputParameters &) 36 : { 37 18 : auto solver = std::make_unique<mfem::HypreADS>(_mfem_fespace.getFESpace().get()); 38 36 : solver->SetPrintLevel(getParam<int>("print_level")); 39 : 40 18 : _solver = std::move(solver); 41 18 : } 42 : 43 : void 44 16 : MFEMHypreADS::updateSolver(mfem::ParBilinearForm & a, mfem::Array<int> & tdofs) 45 : { 46 16 : if (_lor) 47 : { 48 8 : checkSpectralEquivalence(a); 49 8 : if (_mfem_fespace.getFESpace()->GetMesh()->GetElement(0)->GetGeometryType() != 50 : mfem::Geometry::Type::CUBE) 51 0 : mooseError("LOR HypreADS Solver only supports hex meshes."); 52 : 53 8 : auto lor_solver = new mfem::LORSolver<mfem::HypreADS>(a, tdofs); 54 16 : lor_solver->GetSolver().SetPrintLevel(getParam<int>("print_level")); 55 8 : _solver.reset(lor_solver); 56 : } 57 16 : } 58 : 59 : #endif