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