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 : #include "Eigenvalues.h" 11 : 12 : // MOOSE includes 13 : #include "NonlinearEigenSystem.h" 14 : 15 : #include "libmesh/libmesh_config.h" 16 : 17 : #include <complex> 18 : 19 : registerMooseObject("MooseApp", Eigenvalues); 20 : 21 : InputParameters 22 15301 : Eigenvalues::validParams() 23 : { 24 15301 : InputParameters params = GeneralVectorPostprocessor::validParams(); 25 15301 : params.addClassDescription("Returns the Eigen values from the nonlinear Eigen system."); 26 15301 : params.addParam<bool>("inverse_eigenvalue", false, "True to evaluate the inverse of eigenvalues"); 27 15301 : return params; 28 0 : } 29 : 30 516 : Eigenvalues::Eigenvalues(const InputParameters & parameters) 31 : : GeneralVectorPostprocessor(parameters), 32 516 : _inverse(getParam<bool>("inverse_eigenvalue")), 33 516 : _eigen_values_real(declareVector("eigen_values_real")), 34 516 : _eigen_values_imag(declareVector("eigen_values_imag")), 35 1032 : _nl_eigen(dynamic_cast<const NonlinearEigenSystem *>(&_sys)) 36 : { 37 516 : if (!_nl_eigen) 38 0 : mooseError("Given system is not a NonlinearEigenSystem \n"); 39 516 : } 40 : 41 : void 42 673 : Eigenvalues::initialize() 43 : { 44 673 : _eigen_values_real.clear(); 45 673 : _eigen_values_imag.clear(); 46 673 : } 47 : 48 : void 49 673 : Eigenvalues::execute() 50 : { 51 : #ifdef LIBMESH_HAVE_SLEPC 52 673 : const std::vector<std::pair<Real, Real>> & eigenvalues = _nl_eigen->getAllConvergedEigenvalues(); 53 673 : unsigned int n_converged_eigenvalues = eigenvalues.size(); 54 673 : _eigen_values_real.resize(n_converged_eigenvalues); 55 673 : _eigen_values_imag.resize(n_converged_eigenvalues); 56 1401 : for (unsigned int n = 0; n < n_converged_eigenvalues; n++) 57 : { 58 728 : std::complex<Real> e(eigenvalues[n].first, eigenvalues[n].second); 59 728 : std::complex<Real> inv = _inverse ? 1. / e : e; 60 728 : _eigen_values_real[n] = inv.real(); 61 728 : _eigen_values_imag[n] = inv.imag(); 62 : } 63 : #else 64 : _eigen_values_real.clear(); 65 : _eigen_values_imag.clear(); 66 : #endif 67 673 : }