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 "EigenproblemESProblemOperator.h" 13 : #include "MFEMEigensolverBase.h" 14 : 15 : namespace Moose::MFEM 16 : { 17 : 18 : void 19 26 : EigenproblemESProblemOperator::Solve() 20 : { 21 26 : BuildEquationSystemOperator(); 22 : 23 26 : if (GetEquationSystem()->GetTestVarNames().size() > 1) 24 0 : mooseError("Eigenproblems are only supported in single-variable systems"); 25 : 26 26 : auto eigensolver = std::dynamic_pointer_cast<MFEMEigensolverBase>(_problem_data.jacobian_solver); 27 26 : eigensolver->setMassMatrix(_mass_rhs); 28 26 : eigensolver->setOperator(GetEquationSystem()->_jacobian); 29 26 : eigensolver->solve(); 30 26 : RecoverEigenproblemSolution(_problem_data.gridfunctions, eigensolver.get()); 31 26 : } 32 : 33 : void 34 26 : EigenproblemESProblemOperator::BuildEquationSystemOperator() 35 : { 36 26 : GetEquationSystem()->BuildEquationSystem(); 37 26 : GetEquationSystem()->BuildEigenproblemJacobian(_true_x, _mass_rhs); 38 26 : } 39 : 40 : void 41 26 : EigenproblemESProblemOperator::RecoverEigenproblemSolution( 42 : Moose::MFEM::GridFunctions & gridfunctions, MFEMEigensolverBase * eigensolver) 43 : { 44 26 : mfem::Array<mfem::real_t> eigenvalues; 45 26 : eigensolver->getEigenvalues(eigenvalues); 46 : 47 26 : const auto & trial_var_name = _trial_var_names.at(0); 48 26 : const auto & sep = _problem_data.mode_separator; 49 : 50 : // Distribute the zeroth mode onto the base variable 51 26 : gridfunctions.Get(trial_var_name)->Distribute(eigensolver->getEigenvector(0)); 52 : 53 156 : for (int i = 0; i < eigenvalues.Size(); ++i) 54 260 : gridfunctions.Get(trial_var_name + sep + std::to_string(i)) 55 130 : ->Distribute(eigensolver->getEigenvector(i)); 56 26 : } 57 : 58 : } // namespace Moose::MFEM 59 : 60 : #endif