https://mooseframework.inl.gov
Loading...
Searching...
No Matches
EigenproblemESProblemOperator.C
Go to the documentation of this file.
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
13#include "MFEMEigensolverBase.h"
14#include "MFEMEigenproblem.h"
15
16namespace Moose::MFEM
17{
18
20 const std::string & weak_form_name)
21 : EquationSystemProblemOperator(problem, weak_form_name)
22{
23 if (!std::dynamic_pointer_cast<EigenproblemEquationSystem>(
24 problem.getEquationSystem(weak_form_name)))
25 mooseError("The weak form supplying this operator does not provide an "
26 "EigenproblemEquationSystem, which is required by "
27 "EigenproblemESProblemOperator.");
28}
29
30void
32{
33 {
34 TIME_SECTION("EigenproblemESProblemOperator::FormSystem", 2, "Assembling MFEM Eigenproblem");
36 }
37
38 auto * const es = GetEquationSystem();
39 if (es->GetTestVarNames().size() > 1)
40 mooseError("Eigenproblems are only supported in single-variable systems");
41
42 auto eigensolver =
43 std::dynamic_pointer_cast<Moose::MFEM::EigensolverBase>(_problem_data.jacobian_solver);
44
45 {
46 TIME_SECTION("EigenproblemESProblemOperator::SolveSystem", 2, "Solving MFEM Eigenproblem");
47 es->PrepareEigensolver(*eigensolver);
48 eigensolver->Solve();
49 }
51}
52
53void
60
61void
63 Moose::MFEM::GridFunctions & gridfunctions, Moose::MFEM::EigensolverBase * eigensolver)
64{
65 mfem::Array<mfem::real_t> eigenvalues;
66 eigensolver->GetEigenvalues(eigenvalues);
67
68 const auto & trial_var_name = _trial_var_names.at(0);
69 const auto & sep = _problem_data.mode_separator;
70
71 // Distribute the zeroth mode onto the base variable
72 gridfunctions.Get(trial_var_name)->Distribute(eigensolver->GetEigenvector(0));
73
74 for (int i = 0; i < eigenvalues.Size(); ++i)
75 gridfunctions.Get(trial_var_name + sep + std::to_string(i))
76 ->Distribute(eigensolver->GetEigenvector(i));
77}
78
79} // namespace Moose::MFEM
80
81#endif
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
std::shared_ptr< Moose::MFEM::EquationSystem > getEquationSystem(const std::string &weak_form_name="") const
Return the EquationSystem built by the weak form named weak_form_name.
EigenproblemESProblemOperator(MFEMProblem &problem, const std::string &weak_form_name="")
EigenproblemEquationSystem * GetEquationSystem() const override
Returns a pointer to the operator's equation system.
void FormEquationSystemOperator()
Form the equation-system operator used by the eigensolver.
void RecoverEigenproblemSolution(GridFunctions &gridfunctions, EigensolverBase *eigensolver)
void BuildEigenproblemJacobian(mfem::BlockVector &trueX, EigenRHSCoefficient rhs_coefficient)
Build eigenproblem system, with essential boundary conditions accounted for.
Base class for eigensolvers.
virtual void GetEigenvalues(mfem::Array< mfem::real_t > &eigenvalues) const =0
Retrieves the computed eigenvalues.
virtual const mfem::HypreParVector & GetEigenvector(int index) const =0
Retrieves the computed eigenvector corresponding to the given index.
Steady-state ProblemOperator that prepares and solves a single EquationSystem.
virtual void BuildEquationSystem()
Build all forms comprising this EquationSystem.
T * Get(const std::string &field_name) const
Returns a non-owning pointer to the field. This is guaranteed to return a non-null pointer.
MFEMProblem & _problem
Reference to the current problem.
std::vector< std::string > _trial_var_names
Vector of names of state gridfunctions used in formulation, ordered by appearance in block vector dur...
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).
std::shared_ptr< Moose::MFEM::LinearSolverBase > jacobian_solver
std::string mode_separator
Moose::MFEM::GridFunctions gridfunctions