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