https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Moose::MFEM::ComplexEquationSystem Class Reference

Class to store weak form components (bilinear and linear forms, and optionally mixed and nonlinear forms) and build methods. More...

#include <ComplexEquationSystem.h>

Inheritance diagram for Moose::MFEM::ComplexEquationSystem:
[legend]

Public Member Functions

 ComplexEquationSystem ()=default
 
 ~ComplexEquationSystem ()=default
 
virtual void Init (GridFunctions &gridfunctions, ComplexGridFunctions &cmplx_gridfunctions, mfem::AssemblyLevel assembly_level) override
 Initialise.
 
virtual void Mult (const mfem::Vector &x, mfem::Vector &y) const override
 Nonlinear Mult (Used by Newton-solver not necessarily nonlinear)
 
virtual void BuildLinearForms () override
 Build linear forms and eliminate constrained DoFs.
 
virtual void BuildBilinearForms () override
 Build bilinear forms (diagonal Jacobian contributions)
 
virtual void BuildMixedBilinearForms () override
 Build mixed bilinear forms (off-diagonal Jacobian contributions)
 
virtual void ApplyEssentialBCs () override
 Update all essentially constrained true DoF markers and values on boundaries.
 
virtual void ApplyComplexEssentialBC (const std::string &var_name, mfem::ParComplexGridFunction &trial_gf, mfem::Array< int > &global_ess_markers)
 Applies complex BCs to a single trial variable.
 
void AddComplexKernel (std::shared_ptr< MFEMComplexKernel > kernel)
 Add complex kernels.
 
void AddComplexIntegratedBC (std::shared_ptr< MFEMComplexIntegratedBC > bc)
 Add complex integrated BCs.
 
void AddComplexEssentialBCs (std::shared_ptr< MFEMComplexEssentialBC > bc)
 Add complex essential BCs.
 
void EliminateCoupledVariables () override
 Perform trivial eliminations of coupled variables lacking corresponding test variables.
 
virtual void FormSystemOperator (mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS) override
 Form matrix-free representation of system operator.
 
virtual void FormSystemMatrix (mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS) override
 Form matrix representation of system operator as a HypreParMatrix.
 
virtual void SetTrialVariablesFromTrueVectors (const mfem::BlockVector &trueX) const override
 Update variable from solution vector after solve.
 
template<class FormType >
void ApplyDomainBLFIntegrators (const std::string &trial_var_name, const std::string &test_var_name, std::shared_ptr< FormType > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > &kernels_map)
 Template method for applying BilinearFormIntegrators on domains from kernels to a SesquilinearForm.
 
void ApplyDomainLFIntegrators (const std::string &test_var_name, std::shared_ptr< mfem::ParComplexLinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > &kernels_map)
 Method for applying LinearFormIntegrators on domains from kernels to a ParComplexLinearForm.
 
template<class FormType >
void ApplyBoundaryBLFIntegrators (const std::string &trial_var_name, const std::string &test_var_name, std::shared_ptr< FormType > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > &integrated_bc_map)
 Template method for applying BilinearFormIntegrators on boudaries from kernels to a SesquilinearForm.
 
void ApplyBoundaryLFIntegrators (const std::string &test_var_name, std::shared_ptr< mfem::ParComplexLinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > &integrated_bc_map)
 Method for applying LinearFormIntegrators on boundaries from kernels to a ParComplexLinearForm.
 
bool IsComplex () const override
 
virtual void AddKernel (std::shared_ptr< MFEMKernel > kernel)
 Add kernels.
 
virtual void AddIntegratedBC (std::shared_ptr< MFEMIntegratedBC > kernel)
 
virtual void AddEssentialBC (std::shared_ptr< MFEMEssentialBC > bc)
 Add BC associated with essentially constrained DoFs on boundaries.
 
void FormSystem (mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
 Build all weak-form components via BuildEquationSystem(), form the constrained linear part of the system, and populate the true-DoF vectors used by the solve.
 
virtual void ComputeNonlinearResidual (const mfem::Vector &u, mfem::Vector &residual) const
 Compute the contribution to the residual from nonlinear forms only.
 
mfem::Operator & GetGradient (const mfem::Vector &u) const override
 Get Jacobian at the provided vector of true DoFs of trial variables.
 
mfem::OperatorHandle & GetLinearOperator () const
 Get operator handle for linear component of system operator.
 
void SetGradientRequired (bool requires_gradient)
 Set whether an external object (such as a nonlinear solver) requires Jacobian information for this EquationSystem.
 
void SetCoefficientManager (CoefficientManager &coefficients)
 Set the coefficient manager to notify when trial variables are updated, so that stored projections of solution-dependent coefficients are invalidated.
 
const std::vector< std::string > & GetTrialVarNames () const
 
const std::vector< std::string > & GetTestVarNames () const
 
const mfem::Array< int > & GetBlockOffsets () const
 Getter for block true offsets associated with the EquationSystem operator.
 
mfem::ParBilinearForm & GetBilinearForm (const std::string &test_var_name)
 
mfem::ParGridFunction & GetGridFunction (const std::string &trial_var_name)
 
const mfem::Vector & GetLinearizationPoint () const
 The true-DoF vector used for the most recent Jacobian linearization.
 
std::shared_ptr< mfem::ParBilinearForm > BuildBilinearFormForFESpace (const std::string &var_name, mfem::ParFiniteElementSpace &fespace, mfem::AssemblyLevel assembly_level)
 Build a fresh ParBilinearForm on the given FESpace using the same kernels as the main system's bilinear form for var_name.
 
std::shared_ptr< mfem::ParNonlinearForm > BuildNonlinearFormForFESpace (const std::string &var_name, mfem::ParFiniteElementSpace &fespace, mfem::AssemblyLevel assembly_level)
 Build a fresh ParNonlinearForm on the given FESpace using the same kernels as the main system's nonlinear form for var_name.
 
mfem::Array< int > & GetEssentialBoundaryMarkers (const std::string &var_name)
 Return the essential boundary attribute marker array for a given trial variable.
 
virtual bool IsEigen () const
 
virtual bool IsTimeDependent () const
 
bool IsMultivariate () const
 
bool IsNonlinear () const
 
virtual void BuildEquationSystem ()
 Build all forms comprising this EquationSystem.
 

Protected Member Functions

virtual void AddCoupledVariableNameIfMissing (const std::string &coupled_var_name)
 Add coupled variable to EquationSystem.
 
virtual void AddEliminatedVariableNameIfMissing (const std::string &eliminated_var_name)
 Add eliminated variable to EquationSystem.
 
virtual void AddTestVariableNameIfMissing (const std::string &test_var_name)
 Add test variable to EquationSystem.
 
virtual void SetTrialVariableNames ()
 Set trial variable names from subset of coupled variables that have an associated test variable.
 
void DeleteHBlocks ()
 Deletes the HypreParMatrix associated with any pointer stored in _h_blocks, and then proceeds to delete all dynamically allocated memory for _h_blocks itself, resetting all dimensions to zero.
 
void DeleteJacobianBlocks ()
 Deletes the HypreParMatrix associated with any pointer stored in _jacobian_blocks, and then proceeds to delete all dynamically allocated memory for _jacobian_blocks itself, resetting all dimensions to zero.
 
bool VectorContainsName (const std::vector< std::string > &the_vector, const std::string &name) const
 
virtual void ApplyEssentialBC (const std::string &var_name, mfem::ParGridFunction &trial_gf, mfem::Array< int > &global_ess_markers)
 Apply essential BC(s) associated with var_name to set true DoFs of trial_gf and update markers of all essential boundaries.
 
virtual void BuildNonlinearForms ()
 Build non-linear action forms.
 
virtual void FormLinearSystem (mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
 Form linear components of system based on on- and off-diagonal bilinear form contributions, populate solution and RHS vectors of true DoFs, and apply constraints.
 
void FormJacobianMatrix (const mfem::Vector &u)
 Compute Jacobian matrix at the provided vector of true DoFs of trial variables.
 
template<class FormType >
void ApplyDomainBLFIntegrators (const std::string &trial_var_name, const std::string &test_var_name, std::shared_ptr< FormType > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &kernels_map, std::optional< mfem::real_t > scale_factor=std::nullopt)
 Template method for applying BilinearFormIntegrators on domains from kernels to a BilinearForm, or MixedBilinearForm.
 
void ApplyDomainLFIntegrators (const std::string &test_var_name, std::shared_ptr< mfem::ParLinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &kernels_map)
 Apply domain LinearFormIntegrators from kernels to the linear form associated with the supplied test variable.
 
void ApplyDomainNLFIntegrators (const std::string &test_var_name, std::shared_ptr< mfem::ParNonlinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &kernels_map, std::optional< mfem::real_t > scale_factor=std::nullopt)
 Apply domain NonlinearFormIntegrators from kernels to the nonlinear form associated with the supplied test variable.
 
template<class FormType >
void ApplyBoundaryBLFIntegrators (const std::string &trial_var_name, const std::string &test_var_name, std::shared_ptr< FormType > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &integrated_bc_map, std::optional< mfem::real_t > scale_factor=std::nullopt)
 Template method for applying BilinearFormIntegrators on boundaries from integrated boundary conditions to a BilinearForm, or MixedBilinearForm.
 
void ApplyBoundaryLFIntegrators (const std::string &test_var_name, std::shared_ptr< mfem::ParLinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &integrated_bc_map)
 Apply boundary LinearFormIntegrators from integrated boundary conditions to the linear form associated with the supplied test variable.
 
void ApplyBoundaryNLFIntegrators (const std::string &test_var_name, std::shared_ptr< mfem::ParNonlinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &integrated_bc_map, std::optional< mfem::real_t > scale_factor=std::nullopt)
 Apply boundary NonlinearFormIntegrators from integrated boundary conditions to the nonlinear form associated with the supplied test variable.
 

Protected Attributes

NamedFieldsMap< mfem::ParSesquilinearForm > _slfs
 
NamedFieldsMap< mfem::ParComplexLinearForm > _clfs
 
NamedFieldsMap< NamedFieldsMap< mfem::ParMixedSesquilinearForm > > _mslfs
 
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > _cmplx_kernels_map
 
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > _cmplx_integrated_bc_map
 
NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexEssentialBC > > > _cmplx_essential_bc_map
 
ComplexGridFunctions _cmplx_eliminated_variables
 Pointers to coupled variables not part of the reduced ComplexEquationSystem.
 
std::vector< std::unique_ptr< mfem::ParComplexGridFunction > > _cmplx_var_ess_constraints
 Complex Gridfunctions holding essential constraints from Dirichlet BCs.
 
Moose::MFEM::ComplexGridFunctions * _complex_gfuncs
 
std::vector< std::string > _coupled_var_names
 Names of all trial variables of kernels and boundary conditions added to this EquationSystem.
 
std::vector< std::string > _trial_var_names
 Subset of _coupled_var_names of all variables corresponding to gridfunctions with degrees of freedom that comprise the state vector of this EquationSystem.
 
std::vector< std::string > _eliminated_var_names
 Names of all coupled variables without a corresponding test variable.
 
Moose::MFEM::GridFunctions _eliminated_variables
 Pointers to coupled variables not part of the reduced EquationSystem.
 
std::vector< std::string > _test_var_names
 Names of all test variables corresponding to linear forms in this equation system.
 
std::vector< mfem::ParFiniteElementSpace * > _test_pfespaces
 Pointers to finite element spaces associated with test variables.
 
std::vector< mfem::ParFiniteElementSpace * > _coupled_pfespaces
 Pointers to finite element spaces associated with coupled variables.
 
NamedFieldsMap< mfem::ParBilinearForm > _blfs
 
NamedFieldsMap< mfem::ParLinearForm > _lfs
 
NamedFieldsMap< mfem::ParNonlinearForm > _nlfs
 
NamedFieldsMap< NamedFieldsMap< mfem::ParMixedBilinearForm > > _mblfs
 
std::vector< std::unique_ptr< mfem::ParGridFunction > > _var_ess_constraints
 Gridfunctions holding essential constraints from Dirichlet BCs.
 
std::vector< mfem::Array< int > > _ess_tdof_lists
 
std::vector< mfem::Array< int > > _ess_markers
 
mfem::Array2D< const mfem::HypreParMatrix * > _h_blocks
 
mfem::Array2D< const mfem::HypreParMatrix * > _jacobian_blocks
 
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > _kernels_map
 Arrays to store kernels to act on each component of weak form.
 
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > _integrated_bc_map
 Arrays to store integrated BCs to act on each component of weak form.
 
NamedFieldsMap< std::vector< std::shared_ptr< MFEMEssentialBC > > > _essential_bc_map
 Arrays to store essential BCs to act on each component of weak form.
 
mfem::OperatorHandle _jacobian
 
mfem::OperatorHandle _linear_operator
 
mfem::AssemblyLevel _assembly_level
 
Moose::MFEM::GridFunctions * _gfuncs
 
mfem::Array< int > _block_true_offsets
 
const mfem::Vector * _linearization_point = nullptr
 
bool _non_linear = false
 
bool _gradient_required = false
 
CoefficientManager * _coefficient_manager = nullptr
 

Detailed Description

Class to store weak form components (bilinear and linear forms, and optionally mixed and nonlinear forms) and build methods.

Definition at line 29 of file ComplexEquationSystem.h.

Constructor & Destructor Documentation

◆ ComplexEquationSystem()

Moose::MFEM::ComplexEquationSystem::ComplexEquationSystem ( )
default

◆ ~ComplexEquationSystem()

Moose::MFEM::ComplexEquationSystem::~ComplexEquationSystem ( )
default

Member Function Documentation

◆ AddComplexEssentialBCs()

void Moose::MFEM::ComplexEquationSystem::AddComplexEssentialBCs ( std::shared_ptr< MFEMComplexEssentialBC >  bc)

Add complex essential BCs.

Definition at line 247 of file ComplexEquationSystem.C.

248{
249 const auto & test_var_name = bc->getTestVariableName();
250 AddTestVariableNameIfMissing(test_var_name);
251 // Register new complex essential bc map if not present for the test variable
252 if (!_cmplx_essential_bc_map.Has(test_var_name))
253 {
254 auto bcs = std::make_shared<std::vector<std::shared_ptr<MFEMComplexEssentialBC>>>();
255 _cmplx_essential_bc_map.Register(test_var_name, std::move(bcs));
256 }
257 _cmplx_essential_bc_map.GetRef(test_var_name).push_back(std::move(bc));
258}
NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexEssentialBC > > > _cmplx_essential_bc_map
virtual void AddTestVariableNameIfMissing(const std::string &test_var_name)
Add test variable to EquationSystem.
void Register(const std::string &field_name, FieldArgs &&... args)
Construct new field with name field_name and register.
bool Has(const std::string &field_name) const
Predicate to check if a field is registered with name field_name.
T & GetRef(const std::string &field_name) const
Returns a reference to a field.

Referenced by MFEMComplexWeakForm::addBoundaryCondition().

◆ AddComplexIntegratedBC()

void Moose::MFEM::ComplexEquationSystem::AddComplexIntegratedBC ( std::shared_ptr< MFEMComplexIntegratedBC >  bc)

Add complex integrated BCs.

Definition at line 224 of file ComplexEquationSystem.C.

225{
226 const auto & trial_var_name = bc->getTrialVariableName();
227 const auto & test_var_name = bc->getTestVariableName();
228 AddCoupledVariableNameIfMissing(trial_var_name);
229 AddTestVariableNameIfMissing(test_var_name);
230 // Register new complex integrated bc map if not present for the test variable
231 if (!_cmplx_integrated_bc_map.Has(test_var_name))
232 {
233 auto integrated_bc_field_map =
234 std::make_shared<NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexIntegratedBC>>>>();
235 _cmplx_integrated_bc_map.Register(test_var_name, std::move(integrated_bc_field_map));
236 }
237 // Register new complex integrated bc map if not present for the test/trial variable pair
238 if (!_cmplx_integrated_bc_map.Get(test_var_name)->Has(trial_var_name))
239 {
240 auto bcs = std::make_shared<std::vector<std::shared_ptr<MFEMComplexIntegratedBC>>>();
241 _cmplx_integrated_bc_map.Get(test_var_name)->Register(trial_var_name, std::move(bcs));
242 }
243 _cmplx_integrated_bc_map.GetRef(test_var_name).Get(trial_var_name)->push_back(std::move(bc));
244}
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > _cmplx_integrated_bc_map
virtual void AddCoupledVariableNameIfMissing(const std::string &coupled_var_name)
Add coupled variable to EquationSystem.

Referenced by MFEMComplexWeakForm::addBoundaryCondition().

◆ AddComplexKernel()

void Moose::MFEM::ComplexEquationSystem::AddComplexKernel ( std::shared_ptr< MFEMComplexKernel >  kernel)

Add complex kernels.

Definition at line 201 of file ComplexEquationSystem.C.

202{
203 const auto & trial_var_name = kernel->getTrialVariableName();
204 const auto & test_var_name = kernel->getTestVariableName();
205 AddCoupledVariableNameIfMissing(trial_var_name);
206 AddTestVariableNameIfMissing(test_var_name);
207 // Register new complex kernels map if not present for the test variable
208 if (!_cmplx_kernels_map.Has(test_var_name))
209 {
210 auto kernel_field_map =
211 std::make_shared<NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexKernel>>>>();
212 _cmplx_kernels_map.Register(test_var_name, std::move(kernel_field_map));
213 }
214 // Register new complex kernels map if not present for the test/trial variable pair
215 if (!_cmplx_kernels_map.Get(test_var_name)->Has(trial_var_name))
216 {
217 auto kernels = std::make_shared<std::vector<std::shared_ptr<MFEMComplexKernel>>>();
218 _cmplx_kernels_map.Get(test_var_name)->Register(trial_var_name, std::move(kernels));
219 }
220 _cmplx_kernels_map.GetRef(test_var_name).Get(trial_var_name)->push_back(std::move(kernel));
221}
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > _cmplx_kernels_map

Referenced by MFEMComplexWeakForm::addKernel().

◆ AddCoupledVariableNameIfMissing()

void Moose::MFEM::EquationSystem::AddCoupledVariableNameIfMissing ( const std::string &  coupled_var_name)
protectedvirtualinherited

Add coupled variable to EquationSystem.

Definition at line 57 of file EquationSystem.C.

58{
59 if (!VectorContainsName(_coupled_var_names, coupled_var_name))
60 _coupled_var_names.push_back(coupled_var_name);
61}
std::vector< std::string > _coupled_var_names
Names of all trial variables of kernels and boundary conditions added to this EquationSystem.
bool VectorContainsName(const std::vector< std::string > &the_vector, const std::string &name) const

Referenced by AddComplexIntegratedBC(), AddComplexKernel(), Moose::MFEM::EquationSystem::AddIntegratedBC(), and Moose::MFEM::EquationSystem::AddKernel().

◆ AddEliminatedVariableNameIfMissing()

void Moose::MFEM::EquationSystem::AddEliminatedVariableNameIfMissing ( const std::string &  eliminated_var_name)
protectedvirtualinherited

Add eliminated variable to EquationSystem.

Definition at line 64 of file EquationSystem.C.

65{
66 if (!VectorContainsName(_eliminated_var_names, eliminated_var_name))
67 _eliminated_var_names.push_back(eliminated_var_name);
68}
std::vector< std::string > _eliminated_var_names
Names of all coupled variables without a corresponding test variable.

Referenced by Moose::MFEM::TimeDependentEquationSystem::AddKernel().

◆ AddEssentialBC()

void Moose::MFEM::EquationSystem::AddEssentialBC ( std::shared_ptr< MFEMEssentialBC >  bc)
virtualinherited

Add BC associated with essentially constrained DoFs on boundaries.

Definition at line 139 of file EquationSystem.C.

140{
141 const auto & test_var_name = bc->getTestVariableName();
142 AddTestVariableNameIfMissing(test_var_name);
143 // Register new essential bc map if not present for the test variable
144 if (!_essential_bc_map.Has(test_var_name))
145 {
146 auto bcs = std::make_shared<std::vector<std::shared_ptr<MFEMEssentialBC>>>();
147 _essential_bc_map.Register(test_var_name, std::move(bcs));
148 }
149 _essential_bc_map.GetRef(test_var_name).push_back(std::move(bc));
150}
NamedFieldsMap< std::vector< std::shared_ptr< MFEMEssentialBC > > > _essential_bc_map
Arrays to store essential BCs to act on each component of weak form.

◆ AddIntegratedBC()

void Moose::MFEM::EquationSystem::AddIntegratedBC ( std::shared_ptr< MFEMIntegratedBC >  kernel)
virtualinherited

Definition at line 116 of file EquationSystem.C.

117{
118 const auto & trial_var_name = bc->getTrialVariableName();
119 const auto & test_var_name = bc->getTestVariableName();
120 AddCoupledVariableNameIfMissing(trial_var_name);
121 AddTestVariableNameIfMissing(test_var_name);
122 // Register new integrated bc map if not present for the test variable
123 if (!_integrated_bc_map.Has(test_var_name))
124 {
125 auto integrated_bc_field_map = std::make_shared<
127 _integrated_bc_map.Register(test_var_name, std::move(integrated_bc_field_map));
128 }
129 // Register new integrated bc map if not present for the test/trial variable pair
130 if (!_integrated_bc_map.Get(test_var_name)->Has(trial_var_name))
131 {
132 auto bcs = std::make_shared<std::vector<std::shared_ptr<MFEMIntegratedBC>>>();
133 _integrated_bc_map.Get(test_var_name)->Register(trial_var_name, std::move(bcs));
134 }
135 _integrated_bc_map.GetRef(test_var_name).Get(trial_var_name)->push_back(std::move(bc));
136}
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > _integrated_bc_map
Arrays to store integrated BCs to act on each component of weak form.
Lightweight adaptor over an std::map from strings to pointer to T.

◆ AddKernel()

void Moose::MFEM::EquationSystem::AddKernel ( std::shared_ptr< MFEMKernel >  kernel)
virtualinherited

Add kernels.

Reimplemented in Moose::MFEM::TimeDependentEquationSystem.

Definition at line 93 of file EquationSystem.C.

94{
95 const auto & trial_var_name = kernel->getTrialVariableName();
96 const auto & test_var_name = kernel->getTestVariableName();
97 AddCoupledVariableNameIfMissing(trial_var_name);
98 AddTestVariableNameIfMissing(test_var_name);
99 // Register new kernels map if not present for the test variable
100 if (!_kernels_map.Has(test_var_name))
101 {
102 auto kernel_field_map =
103 std::make_shared<Moose::MFEM::NamedFieldsMap<std::vector<std::shared_ptr<MFEMKernel>>>>();
104 _kernels_map.Register(test_var_name, std::move(kernel_field_map));
105 }
106 // Register new kernels map if not present for the test/trial variable pair
107 if (!_kernels_map.Get(test_var_name)->Has(trial_var_name))
108 {
109 auto kernels = std::make_shared<std::vector<std::shared_ptr<MFEMKernel>>>();
110 _kernels_map.Get(test_var_name)->Register(trial_var_name, std::move(kernels));
111 }
112 _kernels_map.GetRef(test_var_name).Get(trial_var_name)->push_back(std::move(kernel));
113}
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > _kernels_map
Arrays to store kernels to act on each component of weak form.

Referenced by Moose::MFEM::TimeDependentEquationSystem::AddKernel().

◆ AddTestVariableNameIfMissing()

void Moose::MFEM::EquationSystem::AddTestVariableNameIfMissing ( const std::string &  test_var_name)
protectedvirtualinherited

Add test variable to EquationSystem.

Definition at line 71 of file EquationSystem.C.

72{
73 if (!VectorContainsName(_test_var_names, test_var_name))
74 _test_var_names.push_back(test_var_name);
75}
std::vector< std::string > _test_var_names
Names of all test variables corresponding to linear forms in this equation system.

Referenced by AddComplexEssentialBCs(), AddComplexIntegratedBC(), AddComplexKernel(), Moose::MFEM::EquationSystem::AddEssentialBC(), Moose::MFEM::EquationSystem::AddIntegratedBC(), Moose::MFEM::EquationSystem::AddKernel(), and Moose::MFEM::TimeDependentEquationSystem::AddKernel().

◆ ApplyBoundaryBLFIntegrators() [1/2]

template<class FormType >
void Moose::MFEM::ComplexEquationSystem::ApplyBoundaryBLFIntegrators ( const std::string &  trial_var_name,
const std::string &  test_var_name,
std::shared_ptr< FormType >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > &  integrated_bc_map 
)

Template method for applying BilinearFormIntegrators on boudaries from kernels to a SesquilinearForm.

Definition at line 200 of file ComplexEquationSystem.h.

206{
207 if (integrated_bc_map.Has(test_var_name) &&
208 integrated_bc_map.Get(test_var_name)->Has(trial_var_name))
209 {
210 auto bcs = integrated_bc_map.GetRef(test_var_name).GetRef(trial_var_name);
211 for (auto & bc : bcs)
212 {
213 mfem::BilinearFormIntegrator * integ_real = bc->getRealBFIntegrator();
214 mfem::BilinearFormIntegrator * integ_imag = bc->getImagBFIntegrator();
215
216 if (integ_real || integ_imag)
217 {
218 bc->isBoundaryRestricted()
219 ? form->AddBoundaryIntegrator(
220 std::move(integ_real), std::move(integ_imag), bc->getBoundaryMarkers())
221 : form->AddBoundaryIntegrator(std::move(integ_real), std::move(integ_imag));
222 }
223 }
224 }
225}

◆ ApplyBoundaryBLFIntegrators() [2/2]

template<class FormType >
void Moose::MFEM::EquationSystem::ApplyBoundaryBLFIntegrators ( const std::string &  trial_var_name,
const std::string &  test_var_name,
std::shared_ptr< FormType >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &  integrated_bc_map,
std::optional< mfem::real_t >  scale_factor = std::nullopt 
)
protectedinherited

Template method for applying BilinearFormIntegrators on boundaries from integrated boundary conditions to a BilinearForm, or MixedBilinearForm.

Definition at line 381 of file EquationSystem.h.

388{
389 if (integrated_bc_map.Has(test_var_name) &&
390 integrated_bc_map.Get(test_var_name)->Has(trial_var_name))
391 {
392 auto bcs = integrated_bc_map.GetRef(test_var_name).GetRef(trial_var_name);
393 for (auto & bc : bcs)
394 {
395 mfem::BilinearFormIntegrator * integ = bc->createBFIntegrator();
396
397 if (integ)
398 {
399 if (scale_factor.has_value())
400 integ = new ScaleIntegrator(integ, scale_factor.value(), true);
401 bc->isDGBC() ? bc->isBoundaryRestricted()
402 ? form->AddBdrFaceIntegrator(std::move(integ), bc->getBoundaryMarkers())
403 : form->AddBdrFaceIntegrator(std::move(integ))
404 : bc->isBoundaryRestricted()
405 ? form->AddBoundaryIntegrator(std::move(integ), bc->getBoundaryMarkers())
406 : form->AddBoundaryIntegrator(std::move(integ));
407 }
408 }
409 }
410}

◆ ApplyBoundaryLFIntegrators() [1/2]

void Moose::MFEM::ComplexEquationSystem::ApplyBoundaryLFIntegrators ( const std::string &  test_var_name,
std::shared_ptr< mfem::ParComplexLinearForm >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > &  integrated_bc_map 
)
inline

Method for applying LinearFormIntegrators on boundaries from kernels to a ParComplexLinearForm.

Definition at line 228 of file ComplexEquationSystem.h.

233{
234 if (integrated_bc_map.Has(test_var_name))
235 {
236 auto bcs = integrated_bc_map.GetRef(test_var_name).GetRef(test_var_name);
237 for (auto & bc : bcs)
238 {
239 mfem::LinearFormIntegrator * integ_real = bc->getRealLFIntegrator();
240 mfem::LinearFormIntegrator * integ_imag = bc->getImagLFIntegrator();
241
242 if (integ_real || integ_imag)
243 {
244 bc->isBoundaryRestricted()
245 ? form->AddBoundaryIntegrator(
246 std::move(integ_real), std::move(integ_imag), bc->getBoundaryMarkers())
247 : form->AddBoundaryIntegrator(std::move(integ_real), std::move(integ_imag));
248 }
249 }
250 }
251}

Referenced by BuildLinearForms().

◆ ApplyBoundaryLFIntegrators() [2/2]

void Moose::MFEM::EquationSystem::ApplyBoundaryLFIntegrators ( const std::string &  test_var_name,
std::shared_ptr< mfem::ParLinearForm >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &  integrated_bc_map 
)
protectedinherited

Apply boundary LinearFormIntegrators from integrated boundary conditions to the linear form associated with the supplied test variable.

Definition at line 643 of file EquationSystem.C.

648{
649 if (integrated_bc_map.Has(test_var_name) &&
650 integrated_bc_map.Get(test_var_name)->Has(test_var_name))
651 {
652 auto bcs = integrated_bc_map.GetRef(test_var_name).GetRef(test_var_name);
653 for (auto & bc : bcs)
654 {
655 mfem::LinearFormIntegrator * integ = bc->createLFIntegrator();
656
657 if (integ)
658 {
659 bc->isDGBC() ? bc->isBoundaryRestricted()
660 ? form->AddBdrFaceIntegrator(std::move(integ), bc->getBoundaryMarkers())
661 : form->AddBdrFaceIntegrator(std::move(integ))
662 : bc->isBoundaryRestricted()
663 ? form->AddBoundaryIntegrator(std::move(integ), bc->getBoundaryMarkers())
664 : form->AddBoundaryIntegrator(std::move(integ));
665 }
666 }
667 }
668}

Referenced by Moose::MFEM::EquationSystem::BuildLinearForms().

◆ ApplyBoundaryNLFIntegrators()

void Moose::MFEM::EquationSystem::ApplyBoundaryNLFIntegrators ( const std::string &  test_var_name,
std::shared_ptr< mfem::ParNonlinearForm >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &  integrated_bc_map,
std::optional< mfem::real_t >  scale_factor = std::nullopt 
)
protectedinherited

Apply boundary NonlinearFormIntegrators from integrated boundary conditions to the nonlinear form associated with the supplied test variable.

Definition at line 671 of file EquationSystem.C.

677{
678 if (integrated_bc_map.Has(test_var_name))
679 for (const auto & [trial_var_name, bcs] : integrated_bc_map.GetRef(test_var_name))
680 for (auto & bc : *bcs)
681 if (auto * integ = bc->createNLIntegrator())
682 {
683 if (_gradient_required && (test_var_name != trial_var_name))
685 "Support for Off-diagonal MFEM nonlinear boundary integrators in conjunction with "
686 "a nonlinear solver that requires a gradient is not currently "
687 "implemented. Boundary condition '",
688 bc->name(),
689 "' contributes to test variable '",
690 test_var_name,
691 "' from trial variable '",
692 trial_var_name,
693 "'.");
694
695 _non_linear = true;
696 if (scale_factor.has_value())
697 integ = new NLScaleIntegrator(integ, scale_factor.value(), true);
698 bc->isBoundaryRestricted()
699 ? form->AddBoundaryIntegrator(std::move(integ), bc->getBoundaryMarkers())
700 : form->AddBoundaryIntegrator(std::move(integ));
701 }
702}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
for(PetscInt i=0;i< nvars;++i)
if(!dmm->_nl) SETERRQ(PETSC_COMM_WORLD

Referenced by Moose::MFEM::EquationSystem::BuildNonlinearFormForFESpace(), Moose::MFEM::EquationSystem::BuildNonlinearForms(), and Moose::MFEM::TimeDependentEquationSystem::BuildNonlinearForms().

◆ ApplyComplexEssentialBC()

void Moose::MFEM::ComplexEquationSystem::ApplyComplexEssentialBC ( const std::string &  var_name,
mfem::ParComplexGridFunction &  trial_gf,
mfem::Array< int > &  global_ess_markers 
)
virtual

Applies complex BCs to a single trial variable.

Definition at line 157 of file ComplexEquationSystem.C.

160{
161 if (_cmplx_essential_bc_map.Has(var_name))
162 for (auto & bc : _cmplx_essential_bc_map.GetRef(var_name))
163 {
164 // Set constrained DoFs values on essential boundaries
165 bc->ApplyBC(trial_gf);
166 // Fetch marker array labelling essential boundaries of current BC
167 mfem::Array<int> ess_bdrs(bc->getBoundaryMarkers());
168 // Add these boundary markers to the set of markers labelling all essential boundaries
169 for (const auto i : make_range(ess_bdrs.Size()))
170 global_ess_markers[i] |= ess_bdrs[i];
171 }
172}
IntRange< T > make_range(T beg, T end)

Referenced by ApplyEssentialBCs().

◆ ApplyDomainBLFIntegrators() [1/2]

template<class FormType >
void Moose::MFEM::ComplexEquationSystem::ApplyDomainBLFIntegrators ( const std::string &  trial_var_name,
const std::string &  test_var_name,
std::shared_ptr< FormType >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > &  kernels_map 
)

Template method for applying BilinearFormIntegrators on domains from kernels to a SesquilinearForm.

Definition at line 148 of file ComplexEquationSystem.h.

153{
154 if (kernels_map.Has(test_var_name) && kernels_map.Get(test_var_name)->Has(trial_var_name))
155 {
156 auto kernels = kernels_map.GetRef(test_var_name).GetRef(trial_var_name);
157 for (auto & kernel : kernels)
158 {
159 mfem::BilinearFormIntegrator * integ_real = kernel->getRealBFIntegrator();
160 mfem::BilinearFormIntegrator * integ_imag = kernel->getImagBFIntegrator();
161
162 if (integ_real || integ_imag)
163 {
164 kernel->isSubdomainRestricted()
165 ? form->AddDomainIntegrator(
166 std::move(integ_real), std::move(integ_imag), kernel->getSubdomainMarkers())
167 : form->AddDomainIntegrator(std::move(integ_real), std::move(integ_imag));
168 }
169 }
170 }
171}

◆ ApplyDomainBLFIntegrators() [2/2]

template<class FormType >
void Moose::MFEM::EquationSystem::ApplyDomainBLFIntegrators ( const std::string &  trial_var_name,
const std::string &  test_var_name,
std::shared_ptr< FormType >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &  kernels_map,
std::optional< mfem::real_t >  scale_factor = std::nullopt 
)
protectedinherited

Template method for applying BilinearFormIntegrators on domains from kernels to a BilinearForm, or MixedBilinearForm.

Definition at line 352 of file EquationSystem.h.

358{
359 if (kernels_map.Has(test_var_name) && kernels_map.Get(test_var_name)->Has(trial_var_name))
360 {
361 auto kernels = kernels_map.GetRef(test_var_name).GetRef(trial_var_name);
362 for (auto & kernel : kernels)
363 {
364 mfem::BilinearFormIntegrator * integ = kernel->createBFIntegrator();
365
366 if (integ)
367 {
368 if (scale_factor.has_value())
369 integ = new ScaleIntegrator(integ, scale_factor.value(), true);
370 kernel->isDGKernel() ? form->AddInteriorFaceIntegrator(std::move(integ))
371 : kernel->isSubdomainRestricted()
372 ? form->AddDomainIntegrator(std::move(integ), kernel->getSubdomainMarkers())
373 : form->AddDomainIntegrator(std::move(integ));
374 }
375 }
376 }
377}

◆ ApplyDomainLFIntegrators() [1/2]

void Moose::MFEM::ComplexEquationSystem::ApplyDomainLFIntegrators ( const std::string &  test_var_name,
std::shared_ptr< mfem::ParComplexLinearForm >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > &  kernels_map 
)
inline

Method for applying LinearFormIntegrators on domains from kernels to a ParComplexLinearForm.

Definition at line 174 of file ComplexEquationSystem.h.

178{
179 if (kernels_map.Has(test_var_name))
180 {
181 auto kernels = kernels_map.GetRef(test_var_name).GetRef(test_var_name);
182 for (auto & kernel : kernels)
183 {
184 mfem::LinearFormIntegrator * integ_real = kernel->getRealLFIntegrator();
185 mfem::LinearFormIntegrator * integ_imag = kernel->getImagLFIntegrator();
186
187 if (integ_real || integ_imag)
188 {
189 kernel->isSubdomainRestricted()
190 ? form->AddDomainIntegrator(
191 std::move(integ_real), std::move(integ_imag), kernel->getSubdomainMarkers())
192 : form->AddDomainIntegrator(std::move(integ_real), std::move(integ_imag));
193 }
194 }
195 }
196}

Referenced by BuildLinearForms().

◆ ApplyDomainLFIntegrators() [2/2]

void Moose::MFEM::EquationSystem::ApplyDomainLFIntegrators ( const std::string &  test_var_name,
std::shared_ptr< mfem::ParLinearForm >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &  kernels_map 
)
protectedinherited

Apply domain LinearFormIntegrators from kernels to the linear form associated with the supplied test variable.

Definition at line 588 of file EquationSystem.C.

592{
593 if (kernels_map.Has(test_var_name) && kernels_map.Get(test_var_name)->Has(test_var_name))
594 {
595 auto kernels = kernels_map.GetRef(test_var_name).GetRef(test_var_name);
596 for (auto & kernel : kernels)
597 {
598 mfem::LinearFormIntegrator * integ = kernel->createLFIntegrator();
599
600 if (integ)
601 {
602 kernel->isSubdomainRestricted()
603 ? form->AddDomainIntegrator(std::move(integ), kernel->getSubdomainMarkers())
604 : form->AddDomainIntegrator(std::move(integ));
605 }
606 }
607 }
608}

Referenced by Moose::MFEM::EquationSystem::BuildLinearForms().

◆ ApplyDomainNLFIntegrators()

void Moose::MFEM::EquationSystem::ApplyDomainNLFIntegrators ( const std::string &  test_var_name,
std::shared_ptr< mfem::ParNonlinearForm >  form,
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &  kernels_map,
std::optional< mfem::real_t >  scale_factor = std::nullopt 
)
protectedinherited

Apply domain NonlinearFormIntegrators from kernels to the nonlinear form associated with the supplied test variable.

Definition at line 611 of file EquationSystem.C.

616{
617 if (kernels_map.Has(test_var_name))
618 for (const auto & [trial_var_name, kernels] : kernels_map.GetRef(test_var_name))
619 for (auto & kernel : *kernels)
620 if (auto * integ = kernel->createNLIntegrator())
621 {
622 if (_gradient_required && (trial_var_name != test_var_name))
623 mooseError("Support for off-diagonal MFEM nonlinear domain integrators in conjunction "
624 "with a nonlinear solver that requires a gradient is not currently "
625 "implemented. Kernel '",
626 kernel->name(),
627 "' contributes to test variable '",
628 test_var_name,
629 "' from trial variable '",
630 trial_var_name,
631 "'.");
632
633 _non_linear = true;
634 if (scale_factor.has_value())
635 integ = new NLScaleIntegrator(integ, scale_factor.value(), true);
636 kernel->isSubdomainRestricted()
637 ? form->AddDomainIntegrator(std::move(integ), kernel->getSubdomainMarkers())
638 : form->AddDomainIntegrator(std::move(integ));
639 }
640}

Referenced by Moose::MFEM::EquationSystem::BuildNonlinearFormForFESpace(), Moose::MFEM::EquationSystem::BuildNonlinearForms(), and Moose::MFEM::TimeDependentEquationSystem::BuildNonlinearForms().

◆ ApplyEssentialBC()

void Moose::MFEM::EquationSystem::ApplyEssentialBC ( const std::string &  var_name,
mfem::ParGridFunction &  trial_gf,
mfem::Array< int > &  global_ess_markers 
)
protectedvirtualinherited

Apply essential BC(s) associated with var_name to set true DoFs of trial_gf and update markers of all essential boundaries.

Definition at line 204 of file EquationSystem.C.

207{
208 if (_essential_bc_map.Has(var_name))
209 for (auto & bc : _essential_bc_map.GetRef(var_name))
210 {
211 // Set constrained DoFs values on essential boundaries
212 bc->ApplyBC(trial_gf);
213 // Fetch marker array labelling essential boundaries of current BC
214 mfem::Array<int> ess_bdrs(bc->getBoundaryMarkers());
215 // Add these boundary markers to the set of markers labelling all essential boundaries
216 for (const auto i : make_range(ess_bdrs.Size()))
217 global_ess_markers[i] |= ess_bdrs[i];
218 }
219}

Referenced by Moose::MFEM::EquationSystem::ApplyEssentialBCs(), and Moose::MFEM::EigenproblemEquationSystem::ApplyEssentialBCs().

◆ ApplyEssentialBCs()

void Moose::MFEM::ComplexEquationSystem::ApplyEssentialBCs ( )
overridevirtual

Update all essentially constrained true DoF markers and values on boundaries.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 175 of file ComplexEquationSystem.C.

176{
177 _ess_tdof_lists.resize(_trial_var_names.size());
178 _ess_markers.resize(_trial_var_names.size());
179 for (const auto i : index_range(_trial_var_names))
180 {
181 const auto & trial_var_name = _trial_var_names.at(i);
182 mfem::ParComplexGridFunction & trial_gf = *_cmplx_var_ess_constraints.at(i);
183
184 // Make sure we update the size, if this mesh has changed recently for instance
185 trial_gf.Update();
186
187 // Initial guess for iterative solvers (initial condition or the previous time step solution)
188 cast_ref<mfem::Vector &>(trial_gf) = _complex_gfuncs->GetRef(trial_var_name);
189
190 // A mesh without boundary elements, such as a periodic one, has no boundary attributes
191 const auto & bdr_attributes = trial_gf.ParFESpace()->GetParMesh()->bdr_attributes;
192 _ess_markers.at(i).SetSize(bdr_attributes.Size() ? bdr_attributes.Max() : 0, 0);
193 // Set strongly constrained DoFs of trial_gf on essential boundaries and add markers for all
194 // essential boundaries to the _ess_markers array
195 ApplyComplexEssentialBC(trial_var_name, trial_gf, _ess_markers.at(i));
196 trial_gf.ParFESpace()->GetEssentialTrueDofs(_ess_markers.at(i), _ess_tdof_lists.at(i));
197 }
198}
std::vector< std::unique_ptr< mfem::ParComplexGridFunction > > _cmplx_var_ess_constraints
Complex Gridfunctions holding essential constraints from Dirichlet BCs.
Moose::MFEM::ComplexGridFunctions * _complex_gfuncs
virtual void ApplyComplexEssentialBC(const std::string &var_name, mfem::ParComplexGridFunction &trial_gf, mfem::Array< int > &global_ess_markers)
Applies complex BCs to a single trial variable.
std::vector< mfem::Array< int > > _ess_tdof_lists
std::vector< std::string > _trial_var_names
Subset of _coupled_var_names of all variables corresponding to gridfunctions with degrees of freedom ...
std::vector< mfem::Array< int > > _ess_markers
auto index_range(const T &sizable)

Referenced by BuildLinearForms().

◆ BuildBilinearFormForFESpace()

std::shared_ptr< mfem::ParBilinearForm > Moose::MFEM::EquationSystem::BuildBilinearFormForFESpace ( const std::string &  var_name,
mfem::ParFiniteElementSpace &  fespace,
mfem::AssemblyLevel  assembly_level 
)
inherited

Build a fresh ParBilinearForm on the given FESpace using the same kernels as the main system's bilinear form for var_name.

Caller owns the returned form.

Definition at line 713 of file EquationSystem.C.

716{
717 auto blf = std::make_shared<mfem::ParBilinearForm>(&fespace);
718 blf->SetAssemblyLevel(assembly_level);
719 ApplyBoundaryBLFIntegrators<mfem::ParBilinearForm>(var_name, var_name, blf, _integrated_bc_map);
720 ApplyDomainBLFIntegrators<mfem::ParBilinearForm>(var_name, var_name, blf, _kernels_map);
721 blf->Assemble();
722 blf->Finalize();
723 return blf;
724}

◆ BuildBilinearForms()

void Moose::MFEM::ComplexEquationSystem::BuildBilinearForms ( )
overridevirtual

Build bilinear forms (diagonal Jacobian contributions)

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 91 of file ComplexEquationSystem.C.

92{
93 // Register bilinear forms
94 for (const auto i : index_range(_test_var_names))
95 {
96 auto test_var_name = _test_var_names.at(i);
97 _slfs.Register(test_var_name,
98 std::make_shared<mfem::ParSesquilinearForm>(_test_pfespaces.at(i)));
99
100 // Apply kernels
101 auto slf = _slfs.GetShared(test_var_name);
102 slf->SetAssemblyLevel(_assembly_level);
103 ApplyBoundaryBLFIntegrators<mfem::ParSesquilinearForm>(
104 test_var_name, test_var_name, slf, _cmplx_integrated_bc_map);
105 ApplyDomainBLFIntegrators<mfem::ParSesquilinearForm>(
106 test_var_name, test_var_name, slf, _cmplx_kernels_map);
107 // Assemble
108 slf->Assemble();
109 slf->Finalize();
110 }
111}
NamedFieldsMap< mfem::ParSesquilinearForm > _slfs
std::vector< mfem::ParFiniteElementSpace * > _test_pfespaces
Pointers to finite element spaces associated with test variables.
mfem::AssemblyLevel _assembly_level
std::shared_ptr< T > GetShared(const std::string &field_name) const
Returns a shared pointer to the field. This is guaranteed to return a non-null shared pointer.

◆ BuildEquationSystem()

void Moose::MFEM::EquationSystem::BuildEquationSystem ( )
virtualinherited

Build all forms comprising this EquationSystem.

Definition at line 579 of file EquationSystem.C.

580{
585}
virtual void BuildBilinearForms()
Build bilinear forms (diagonal Jacobian contributions)
virtual void BuildNonlinearForms()
Build non-linear action forms.
virtual void BuildMixedBilinearForms()
Build mixed bilinear forms (off-diagonal Jacobian contributions)
virtual void BuildLinearForms()
Build linear forms and eliminate constrained DoFs.

Referenced by Moose::MFEM::EigenproblemESProblemOperator::FormEquationSystemOperator(), and Moose::MFEM::EquationSystem::FormSystem().

◆ BuildLinearForms()

void Moose::MFEM::ComplexEquationSystem::BuildLinearForms ( )
overridevirtual

Build linear forms and eliminate constrained DoFs.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 63 of file ComplexEquationSystem.C.

64{
65 // Register linear forms
66 for (const auto i : index_range(_test_var_names))
67 {
68 auto test_var_name = _test_var_names.at(i);
69 _clfs.Register(test_var_name,
70 std::make_shared<mfem::ParComplexLinearForm>(_test_pfespaces.at(i)));
71 _clfs.GetRef(test_var_name) = 0.0;
72 }
73
74 for (auto & test_var_name : _test_var_names)
75 {
76 // Apply kernels
77 auto clf = _clfs.GetShared(test_var_name);
80 clf->Assemble();
81 }
82
83 // Apply boundary conditions
85
86 // Eliminate trivially eliminated variables by subtracting contributions from linear forms
88}
void EliminateCoupledVariables() override
Perform trivial eliminations of coupled variables lacking corresponding test variables.
void ApplyBoundaryLFIntegrators(const std::string &test_var_name, std::shared_ptr< mfem::ParComplexLinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > &integrated_bc_map)
Method for applying LinearFormIntegrators on boundaries from kernels to a ParComplexLinearForm.
virtual void ApplyEssentialBCs() override
Update all essentially constrained true DoF markers and values on boundaries.
void ApplyDomainLFIntegrators(const std::string &test_var_name, std::shared_ptr< mfem::ParComplexLinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > &kernels_map)
Method for applying LinearFormIntegrators on domains from kernels to a ParComplexLinearForm.
NamedFieldsMap< mfem::ParComplexLinearForm > _clfs

◆ BuildMixedBilinearForms()

void Moose::MFEM::ComplexEquationSystem::BuildMixedBilinearForms ( )
overridevirtual

Build mixed bilinear forms (off-diagonal Jacobian contributions)

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 114 of file ComplexEquationSystem.C.

115{
116 // Register mixed sesquilinear forms. Note that not all combinations may
117 // have a kernel.
118
119 // Create mslf for each test/coupled variable pair with an added kernel.
120 // Mixed sesquilinear forms with coupled variables that are not trial variables are
121 // associated with contributions from eliminated variables.
122 for (const auto i : index_range(_test_var_names))
123 {
124 auto test_var_name = _test_var_names.at(i);
125 auto test_mslfs =
126 std::make_shared<Moose::MFEM::NamedFieldsMap<mfem::ParMixedSesquilinearForm>>();
127 for (const auto j : index_range(_coupled_var_names))
128 {
129 const auto & coupled_var_name = _coupled_var_names.at(j);
130 auto mslf = std::make_shared<mfem::ParMixedSesquilinearForm>(_coupled_pfespaces.at(j),
131 _test_pfespaces.at(i));
132 // Register MixedSesquilinearForm if kernels exist for it, and assemble
133 // kernels
134 if (_cmplx_kernels_map.Has(test_var_name) &&
135 _cmplx_kernels_map.Get(test_var_name)->Has(coupled_var_name) &&
136 test_var_name != coupled_var_name)
137 {
138 mslf->SetAssemblyLevel(_assembly_level);
139 // Apply all mixed kernels with this test/trial pair
140 ApplyDomainBLFIntegrators<mfem::ParMixedSesquilinearForm>(
141 coupled_var_name, test_var_name, mslf, _cmplx_kernels_map);
142 // Assemble mixed bilinear forms
143 mslf->Assemble();
144 mslf->Finalize();
145 // Register mixed bilinear forms associated with a single trial variable
146 // for the current test variable
147 test_mslfs->Register(coupled_var_name, mslf);
148 }
149 }
150 // Register all mixed bilinear form sets associated with a single test
151 // variable
152 _mslfs.Register(test_var_name, test_mslfs);
153 }
154}
NamedFieldsMap< NamedFieldsMap< mfem::ParMixedSesquilinearForm > > _mslfs
std::vector< mfem::ParFiniteElementSpace * > _coupled_pfespaces
Pointers to finite element spaces associated with coupled variables.

◆ BuildNonlinearFormForFESpace()

std::shared_ptr< mfem::ParNonlinearForm > Moose::MFEM::EquationSystem::BuildNonlinearFormForFESpace ( const std::string &  var_name,
mfem::ParFiniteElementSpace &  fespace,
mfem::AssemblyLevel  assembly_level 
)
inherited

Build a fresh ParNonlinearForm on the given FESpace using the same kernels as the main system's nonlinear form for var_name.

Caller owns the returned form.

Definition at line 727 of file EquationSystem.C.

730{
731 auto nlf = std::make_shared<mfem::ParNonlinearForm>(&fespace);
732 ApplyDomainNLFIntegrators(var_name, nlf, _kernels_map, std::nullopt);
733 ApplyBoundaryNLFIntegrators(var_name, nlf, _integrated_bc_map, std::nullopt);
734 return nlf;
735}
void ApplyDomainNLFIntegrators(const std::string &test_var_name, std::shared_ptr< mfem::ParNonlinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > &kernels_map, std::optional< mfem::real_t > scale_factor=std::nullopt)
Apply domain NonlinearFormIntegrators from kernels to the nonlinear form associated with the supplied...
void ApplyBoundaryNLFIntegrators(const std::string &test_var_name, std::shared_ptr< mfem::ParNonlinearForm > form, NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > &integrated_bc_map, std::optional< mfem::real_t > scale_factor=std::nullopt)
Apply boundary NonlinearFormIntegrators from integrated boundary conditions to the nonlinear form ass...

◆ BuildNonlinearForms()

void Moose::MFEM::EquationSystem::BuildNonlinearForms ( )
protectedvirtualinherited

Build non-linear action forms.

Reimplemented in Moose::MFEM::TimeDependentEquationSystem.

Definition at line 501 of file EquationSystem.C.

502{
503 // Register non-linear Action forms
504 for (const auto i : index_range(_test_var_names))
505 {
506 auto test_var_name = _test_var_names.at(i);
507 _nlfs.Register(test_var_name, std::make_shared<mfem::ParNonlinearForm>(_test_pfespaces.at(i)));
508 // Apply kernels
509 auto nlf = _nlfs.GetShared(test_var_name);
510 nlf->SetEssentialTrueDofs(_ess_tdof_lists.at(i));
511 ApplyDomainNLFIntegrators(test_var_name, nlf, _kernels_map, std::nullopt);
512 ApplyBoundaryNLFIntegrators(test_var_name, nlf, _integrated_bc_map, std::nullopt);
513 }
514}
NamedFieldsMap< mfem::ParNonlinearForm > _nlfs

Referenced by Moose::MFEM::EquationSystem::BuildEquationSystem().

◆ ComputeNonlinearResidual()

void Moose::MFEM::EquationSystem::ComputeNonlinearResidual ( const mfem::Vector &  u,
mfem::Vector &  residual 
) const
virtualinherited

Compute the contribution to the residual from nonlinear forms only.

Definition at line 393 of file EquationSystem.C.

394{
395 mooseAssert(IsNonlinear(), "Should not be calling this method if our forms are not nonlinear");
396
397 const mfem::BlockVector block_solution(const_cast<mfem::Vector &>(sol), _block_true_offsets);
398 SetTrialVariablesFromTrueVectors(block_solution);
399
400 mfem::BlockVector block_residual(residual, _block_true_offsets);
401 for (unsigned int i = 0; i < _test_var_names.size(); i++)
402 {
403 auto & test_var_name = _test_var_names.at(i);
404 auto nlf = _nlfs.GetShared(test_var_name);
405 nlf->AddMult(block_solution.GetBlock(i), block_residual.GetBlock(i));
406 block_residual.GetBlock(i).SyncAliasMemory(block_residual);
407 }
408}
mfem::Array< int > _block_true_offsets
virtual void SetTrialVariablesFromTrueVectors(const mfem::BlockVector &trueX) const
Update variable from solution vector after solve.

Referenced by Moose::MFEM::EquationSystem::Mult().

◆ DeleteHBlocks()

void Moose::MFEM::EquationSystem::DeleteHBlocks ( )
protectedinherited

Deletes the HypreParMatrix associated with any pointer stored in _h_blocks, and then proceeds to delete all dynamically allocated memory for _h_blocks itself, resetting all dimensions to zero.

Definition at line 27 of file EquationSystem.C.

28{
29 for (const auto i : make_range(_h_blocks.NumRows()))
30 for (const auto j : make_range(_h_blocks.NumCols()))
31 {
32 if (_jacobian_blocks.NumRows() && _jacobian_blocks(i, j) == _h_blocks(i, j))
33 _jacobian_blocks(i, j) = nullptr;
34 delete _h_blocks(i, j);
35 }
36 _h_blocks.DeleteAll();
37}
mfem::Array2D< const mfem::HypreParMatrix * > _h_blocks
mfem::Array2D< const mfem::HypreParMatrix * > _jacobian_blocks

Referenced by Moose::MFEM::EquationSystem::FormSystemMatrix(), FormSystemMatrix(), and Moose::MFEM::EquationSystem::~EquationSystem().

◆ DeleteJacobianBlocks()

void Moose::MFEM::EquationSystem::DeleteJacobianBlocks ( )
protectedinherited

Deletes the HypreParMatrix associated with any pointer stored in _jacobian_blocks, and then proceeds to delete all dynamically allocated memory for _jacobian_blocks itself, resetting all dimensions to zero.

Definition at line 40 of file EquationSystem.C.

41{
42 for (const auto i : make_range(_jacobian_blocks.NumRows()))
43 for (const auto j : make_range(_jacobian_blocks.NumCols()))
44 if (!_h_blocks.NumRows() || _jacobian_blocks(i, j) != _h_blocks(i, j))
45 delete _jacobian_blocks(i, j);
46 _jacobian_blocks.DeleteAll();
47}

Referenced by Moose::MFEM::EquationSystem::FormJacobianMatrix(), and Moose::MFEM::EquationSystem::~EquationSystem().

◆ EliminateCoupledVariables()

void Moose::MFEM::ComplexEquationSystem::EliminateCoupledVariables ( )
overridevirtual

Perform trivial eliminations of coupled variables lacking corresponding test variables.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 261 of file ComplexEquationSystem.C.

262{
263 for (const auto & test_var_name : _test_var_names)
264 for (const auto & eliminated_var_name : _eliminated_var_names)
265 if (_mslfs.Has(test_var_name) && _mslfs.Get(test_var_name)->Has(eliminated_var_name) &&
266 !VectorContainsName(_test_var_names, eliminated_var_name))
267 {
268 auto & mslf = *_mslfs.Get(test_var_name)->Get(eliminated_var_name);
269 auto & clf = *_clfs.Get(test_var_name);
270 const mfem::real_t scale = -1.0;
271 const mfem::real_t conv =
272 (mslf.GetConvention() == mfem::ComplexOperator::HERMITIAN) ? 1.0 : -1.0;
273
274 // y += scale * (A_r + i * A_i) * (x_r + i * x_i)
275 // and take the complex conjugate of the result if convention is BLOCK_SYMMETRIC
276 mslf.real().AddMult(
277 _cmplx_eliminated_variables.Get(eliminated_var_name)->real(), clf.real(), scale);
278 mslf.real().AddMult(
279 _cmplx_eliminated_variables.Get(eliminated_var_name)->imag(), clf.imag(), conv * scale);
280 mslf.imag().AddMult(
281 _cmplx_eliminated_variables.Get(eliminated_var_name)->imag(), clf.real(), -scale);
282 mslf.imag().AddMult(
283 _cmplx_eliminated_variables.Get(eliminated_var_name)->real(), clf.imag(), conv * scale);
284 clf.SyncAlias();
285 }
286}
Real scale
Definition MortarUtils.C:62
ComplexGridFunctions _cmplx_eliminated_variables
Pointers to coupled variables not part of the reduced ComplexEquationSystem.
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.

Referenced by BuildLinearForms().

◆ FormJacobianMatrix()

void Moose::MFEM::EquationSystem::FormJacobianMatrix ( const mfem::Vector &  u)
protectedinherited

Compute Jacobian matrix at the provided vector of true DoFs of trial variables.

Definition at line 411 of file EquationSystem.C.

412{
414 _jacobian_blocks.SetSize(_test_var_names.size(), _trial_var_names.size());
415 _jacobian_blocks = nullptr;
416
417 const mfem::BlockVector update_vector(const_cast<mfem::Vector &>(u), _block_true_offsets);
418 for (const auto i : index_range(_test_var_names))
419 {
420 auto test_var_name = _test_var_names.at(i);
421 if (_nlfs.Has(test_var_name))
422 {
423 auto nlf = _nlfs.Get(test_var_name);
424 mfem::HypreParMatrix * nlf_jac =
425 dynamic_cast<mfem::HypreParMatrix *>(&nlf->GetGradient(update_vector.GetBlock(i)));
426 mooseAssert(nlf_jac,
427 "Jacobian contribution of nonlinear form associated with " + test_var_name +
428 " is not castable into a HypreParMatrix");
429 _jacobian_blocks(i, i) = mfem::ParAdd(_h_blocks(i, i), nlf_jac);
430 }
431 else
432 _jacobian_blocks(i, i) = _h_blocks(i, i);
433 for (const auto j : index_range(_trial_var_names))
434 if (i != j) // nlf->GetGradient only contributes to on-diagonal blocks
435 _jacobian_blocks(i, j) = _h_blocks(i, j);
436 }
437 // Create monolithic matrix
438 _jacobian.Reset(mfem::HypreParMatrixFromBlocks(_jacobian_blocks));
439}
mfem::OperatorHandle _jacobian
void DeleteJacobianBlocks()
Deletes the HypreParMatrix associated with any pointer stored in _jacobian_blocks,...

Referenced by Moose::MFEM::EquationSystem::GetGradient().

◆ FormLinearSystem()

void Moose::MFEM::EquationSystem::FormLinearSystem ( mfem::OperatorHandle &  op,
mfem::BlockVector &  trueX,
mfem::BlockVector &  trueRHS 
)
protectedvirtualinherited

Form linear components of system based on on- and off-diagonal bilinear form contributions, populate solution and RHS vectors of true DoFs, and apply constraints.

Definition at line 261 of file EquationSystem.C.

264{
265 mooseAssert(_test_var_names.size() == _trial_var_names.size(),
266 "Number of test and trial variables must be the same for block matrix assembly.");
267
268 if (_assembly_level == mfem::AssemblyLevel::LEGACY)
269 FormSystemMatrix(op, trueX, trueRHS);
270 else
271 FormSystemOperator(op, trueX, trueRHS);
272}
virtual void FormSystemOperator(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
Form matrix-free representation of linear components of system operator.
virtual void FormSystemMatrix(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
Form matrix representation of linear components of system operator as a HypreParMatrix.

Referenced by Moose::MFEM::EquationSystem::FormSystem().

◆ FormSystem()

void Moose::MFEM::EquationSystem::FormSystem ( mfem::BlockVector &  trueX,
mfem::BlockVector &  trueRHS 
)
inherited

Build all weak-form components via BuildEquationSystem(), form the constrained linear part of the system, and populate the true-DoF vectors used by the solve.

For nonlinear problems, nonlinear forms are registered here but are not folded into the assembled linear operator. Their residual action is evaluated by Mult(), and any Jacobian contribution is formed at the current nonlinear iterate by GetGradient().

This is the single public entry point for callers that want the equation system prepared for a solve. Subclasses customize the form-building step by overriding BuildEquationSystem().

Definition at line 369 of file EquationSystem.C.

370{
372 height = trueX.Size();
373 width = trueRHS.Size();
374 // Store block offsets
375 _block_true_offsets.SetSize(trueX.NumBlocks() + 1);
376 _block_true_offsets[0] = 0;
377 for (unsigned i = 0; i < _trial_var_names.size(); i++)
378 _block_true_offsets[i + 1] = trueX.BlockSize(i);
379 _block_true_offsets.PartialSum();
380 FormLinearSystem(_linear_operator, trueX, trueRHS);
381}
virtual void BuildEquationSystem()
Build all forms comprising this EquationSystem.
mfem::OperatorHandle _linear_operator
virtual void FormLinearSystem(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
Form linear components of system based on on- and off-diagonal bilinear form contributions,...

Referenced by Moose::MFEM::EquationSystemProblemOperator::FormEquationSystemOperator(), and Moose::MFEM::TimeDependentEquationSystemProblemOperator::FormEquationSystemOperator().

◆ FormSystemMatrix()

void Moose::MFEM::ComplexEquationSystem::FormSystemMatrix ( mfem::OperatorHandle &  op,
mfem::BlockVector &  trueX,
mfem::BlockVector &  trueRHS 
)
overridevirtual

Form matrix representation of system operator as a HypreParMatrix.

Used when EquationSystem assembly level is set to 'LEGACY'.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 316 of file ComplexEquationSystem.C.

319{
320 // Allocate block operator
322 _h_blocks.SetSize(_test_var_names.size(), _trial_var_names.size());
323 _h_blocks = nullptr;
324 // Zero out RHS and sync memory
325 trueRHS = 0.0;
326 trueRHS.SyncToBlocks();
327
328 for (const auto i : index_range(_test_var_names))
329 {
330 auto test_var_name = _test_var_names.at(i);
331
332 for (const auto j : index_range(_trial_var_names))
333 {
334 auto trial_var_name = _trial_var_names.at(j);
335
336 mfem::Vector aux_x, aux_rhs;
337 mfem::ParComplexLinearForm aux_lf(_test_pfespaces.at(i));
338 std::unique_ptr<mfem::OperatorHandle> aux_a = std::make_unique<mfem::OperatorHandle>();
339
340 if (test_var_name == trial_var_name)
341 {
342 mooseAssert(i == j, "Trial and test variables must have the same ordering.");
343 auto slf = _slfs.Get(test_var_name);
344 slf->FormLinearSystem(_ess_tdof_lists.at(j),
346 *_clfs.Get(test_var_name),
347 *aux_a,
348 aux_x,
349 aux_rhs,
350 /*copy_interior=*/true);
351 trueX.GetBlock(i) = aux_x;
352 }
353 else if (_mslfs.Has(test_var_name) && _mslfs.Get(test_var_name)->Has(trial_var_name))
354 {
355 auto mslf = _mslfs.Get(test_var_name)->Get(trial_var_name);
356 mslf->FormRectangularLinearSystem(_ess_tdof_lists.at(j),
357 _ess_tdof_lists.at(i),
359 aux_lf = 0.,
360 *aux_a,
361 aux_x,
362 aux_rhs);
363 }
364 else
365 continue;
366
367 trueRHS.GetBlock(i) += aux_rhs;
368 _h_blocks(i, j) = aux_a->As<mfem::ComplexHypreParMatrix>()->GetSystemMatrix();
369 }
370 }
371
372 // Sync memory
373 trueX.SyncFromBlocks();
374 trueRHS.SyncFromBlocks();
375
376 // Create monolithic matrix
377 op.Reset(mfem::HypreParMatrixFromBlocks(_h_blocks));
378}
void DeleteHBlocks()
Deletes the HypreParMatrix associated with any pointer stored in _h_blocks, and then proceeds to dele...

◆ FormSystemOperator()

void Moose::MFEM::ComplexEquationSystem::FormSystemOperator ( mfem::OperatorHandle &  op,
mfem::BlockVector &  trueX,
mfem::BlockVector &  trueRHS 
)
overridevirtual

Form matrix-free representation of system operator.

Used when EquationSystem assembly level is set to 'FULL', 'ELEMENT', 'PARTIAL', or 'NONE'.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 289 of file ComplexEquationSystem.C.

292{
293 auto & test_var_name = _test_var_names.at(0);
294 mfem::Vector aux_x, aux_rhs;
295 mfem::OperatorPtr aux_a;
296
297 auto slf = _slfs.Get(test_var_name);
298 slf->FormLinearSystem(_ess_tdof_lists.at(0),
300 *_clfs.Get(test_var_name),
301 aux_a,
302 aux_x,
303 aux_rhs,
304 /*copy_interior=*/true);
305
306 trueX.GetBlock(0) = aux_x;
307 trueRHS.GetBlock(0) = aux_rhs;
308 trueX.SyncFromBlocks();
309 trueRHS.SyncFromBlocks();
310
311 op.Reset(aux_a.Ptr());
312 aux_a.SetOperatorOwner(false);
313}

◆ GetBilinearForm()

mfem::ParBilinearForm & Moose::MFEM::EquationSystem::GetBilinearForm ( const std::string &  test_var_name)
inlineinherited
Returns
a reference to the MFEM ParBilinearForm corresponding to test_var_name

Definition at line 106 of file EquationSystem.h.

107 {
108 return _blfs.GetRef(test_var_name);
109 }
NamedFieldsMap< mfem::ParBilinearForm > _blfs

◆ GetBlockOffsets()

const mfem::Array< int > & Moose::MFEM::EquationSystem::GetBlockOffsets ( ) const
inlineinherited

Getter for block true offsets associated with the EquationSystem operator.

Definition at line 101 of file EquationSystem.h.

101{ return _block_true_offsets; }

◆ GetEssentialBoundaryMarkers()

mfem::Array< int > & Moose::MFEM::EquationSystem::GetEssentialBoundaryMarkers ( const std::string &  var_name)
inherited

Return the essential boundary attribute marker array for a given trial variable.

The returned array has size == pmesh.bdr_attributes.Max() with 1 at essential boundaries.

Definition at line 738 of file EquationSystem.C.

739{
740 for (const auto i : index_range(_trial_var_names))
741 if (_trial_var_names.at(i) == var_name)
742 return _ess_markers.at(i);
743
744 mooseError("No essential boundary markers found for variable '", var_name, "'.");
745}

◆ GetGradient()

mfem::Operator & Moose::MFEM::EquationSystem::GetGradient ( const mfem::Vector &  u) const
overrideinherited

Get Jacobian at the provided vector of true DoFs of trial variables.

Definition at line 442 of file EquationSystem.C.

443{
445
446 if (IsNonlinear())
447 {
448 if (_assembly_level != mfem::AssemblyLevel::LEGACY)
449 mooseError("MFEM nonlinear solvers that require GetGradient() currently require legacy "
450 "assembly in EquationSystem.");
451 const_cast<EquationSystem *>(this)->FormJacobianMatrix(u);
452 }
453 else
455
456 return *_jacobian;
457}
void FormJacobianMatrix(const mfem::Vector &u)
Compute Jacobian matrix at the provided vector of true DoFs of trial variables.
const mfem::Vector * _linearization_point

◆ GetGridFunction()

mfem::ParGridFunction & Moose::MFEM::EquationSystem::GetGridFunction ( const std::string &  trial_var_name)
inlineinherited
Returns
a reference to the MFEM ParGridFunction corresponding to trial_var_name

Definition at line 114 of file EquationSystem.h.

115 {
116 return _gfuncs->GetRef(trial_var_name);
117 }
Moose::MFEM::GridFunctions * _gfuncs

◆ GetLinearizationPoint()

const mfem::Vector & Moose::MFEM::EquationSystem::GetLinearizationPoint ( ) const
inherited

The true-DoF vector used for the most recent Jacobian linearization.

Definition at line 705 of file EquationSystem.C.

706{
708 mooseError("EquationSystem::GetLinearizationPoint() called before GetGradient().");
709 return *_linearization_point;
710}

◆ GetLinearOperator()

mfem::OperatorHandle & Moose::MFEM::EquationSystem::GetLinearOperator ( ) const
inlineinherited

Get operator handle for linear component of system operator.

Definition at line 80 of file EquationSystem.h.

80{ return _linear_operator; };

◆ GetTestVarNames()

const std::vector< std::string > & Moose::MFEM::EquationSystem::GetTestVarNames ( ) const
inlineinherited

◆ GetTrialVarNames()

const std::vector< std::string > & Moose::MFEM::EquationSystem::GetTrialVarNames ( ) const
inlineinherited

◆ Init()

void Moose::MFEM::ComplexEquationSystem::Init ( GridFunctions &  gridfunctions,
ComplexGridFunctions &  cmplx_gridfunctions,
mfem::AssemblyLevel  assembly_level 
)
overridevirtual

Initialise.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 20 of file ComplexEquationSystem.C.

23{
24 _assembly_level = assembly_level;
25
26 if (gridfunctions.size())
27 mooseError("Mixing real and complex variables is currently not supported.");
28
29 for (auto & test_var_name : _test_var_names)
30 {
31 if (!cmplx_gridfunctions.Has(test_var_name))
32 {
33 mooseError("MFEM complex variable ",
34 test_var_name,
35 " requested by equation system during initialization was "
36 "not found in gridfunctions");
37 }
38 // Store pointers to test FESpaces
39 _test_pfespaces.push_back(cmplx_gridfunctions.Get(test_var_name)->ParFESpace());
40 // Create auxiliary gridfunctions for storing essential constraints from Dirichlet conditions
41 _cmplx_var_ess_constraints.emplace_back(std::make_unique<mfem::ParComplexGridFunction>(
42 cmplx_gridfunctions.Get(test_var_name)->ParFESpace()));
43 }
44
45 // Store pointers to FESpaces of all coupled variables
46 for (auto & coupled_var_name : _coupled_var_names)
47 _coupled_pfespaces.push_back(cmplx_gridfunctions.Get(coupled_var_name)->ParFESpace());
48
49 // Extract which coupled variables are to be trivially eliminated and which are trial variables
51
52 // Store pointers to coupled variable ComplexGridFunctions that are to be eliminated prior to
53 // forming the jacobian
54 for (auto & eliminated_var_name : _eliminated_var_names)
55 _cmplx_eliminated_variables.Register(eliminated_var_name,
56 cmplx_gridfunctions.GetShared(eliminated_var_name));
57
58 // Get a reference to the complex GridFunctions
59 _complex_gfuncs = &cmplx_gridfunctions;
60}
virtual void SetTrialVariableNames()
Set trial variable names from subset of coupled variables that have an associated test variable.

◆ IsComplex()

bool Moose::MFEM::ComplexEquationSystem::IsComplex ( ) const
inlineoverridevirtual
Returns
Whether this EquationSystem includes complex components

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 119 of file ComplexEquationSystem.h.

119{ return true; }

◆ IsEigen()

virtual bool Moose::MFEM::EquationSystem::IsEigen ( ) const
inlinevirtualinherited
Returns
Whether this EquationSystem represents an eigenproblem

Reimplemented in Moose::MFEM::EigenproblemEquationSystem.

Definition at line 149 of file EquationSystem.h.

149{ return false; }

◆ IsMultivariate()

bool Moose::MFEM::EquationSystem::IsMultivariate ( ) const
inlineinherited
Returns
Whether this is a multivariate (maybe mixed) equation system

Definition at line 153 of file EquationSystem.h.

153{ return _test_var_names.size() > 1; }

◆ IsNonlinear()

bool Moose::MFEM::EquationSystem::IsNonlinear ( ) const
inlineinherited
Returns
Whether nonlinear integrators are present in the equation system

Definition at line 155 of file EquationSystem.h.

155{ return _non_linear; }

Referenced by Moose::MFEM::EquationSystem::ComputeNonlinearResidual(), Moose::MFEM::EquationSystem::GetGradient(), and Moose::MFEM::EquationSystem::Mult().

◆ IsTimeDependent()

virtual bool Moose::MFEM::EquationSystem::IsTimeDependent ( ) const
inlinevirtualinherited
Returns
Whether this EquationSystem has time-dependent components

Reimplemented in Moose::MFEM::TimeDependentEquationSystem.

Definition at line 151 of file EquationSystem.h.

151{ return false; }

◆ Mult()

void Moose::MFEM::ComplexEquationSystem::Mult ( const mfem::Vector &  x,
mfem::Vector &  y 
) const
overridevirtual

Nonlinear Mult (Used by Newton-solver not necessarily nonlinear)

Definition at line 382 of file ComplexEquationSystem.C.

383{
384 _linear_operator->Mult(x, residual);
385 x.HostRead();
386 residual.HostRead();
387}

◆ SetCoefficientManager()

void Moose::MFEM::EquationSystem::SetCoefficientManager ( CoefficientManager &  coefficients)
inlineinherited

Set the coefficient manager to notify when trial variables are updated, so that stored projections of solution-dependent coefficients are invalidated.

Definition at line 90 of file EquationSystem.h.

91 {
92 _coefficient_manager = &coefficients;
93 }
CoefficientManager * _coefficient_manager

◆ SetGradientRequired()

void Moose::MFEM::EquationSystem::SetGradientRequired ( bool  requires_gradient)
inlineinherited

Set whether an external object (such as a nonlinear solver) requires Jacobian information for this EquationSystem.

Definition at line 86 of file EquationSystem.h.

86{ _gradient_required = requires_gradient; }

◆ SetTrialVariableNames()

void Moose::MFEM::EquationSystem::SetTrialVariableNames ( )
protectedvirtualinherited

Set trial variable names from subset of coupled variables that have an associated test variable.

Definition at line 78 of file EquationSystem.C.

79{
80 // If a coupled variable has an equation associated with it,
81 // add it to the set of trial variables.
82 for (const auto & test_var_name : _test_var_names)
84 _trial_var_names.push_back(test_var_name);
85
86 // Otherwise, add it to the set of eliminated variables.
87 for (const auto & coupled_var_name : _coupled_var_names)
88 if (!VectorContainsName(_test_var_names, coupled_var_name))
89 _eliminated_var_names.push_back(coupled_var_name);
90}

Referenced by Moose::MFEM::EquationSystem::Init(), and Init().

◆ SetTrialVariablesFromTrueVectors()

void Moose::MFEM::ComplexEquationSystem::SetTrialVariablesFromTrueVectors ( const mfem::BlockVector &  trueX) const
overridevirtual

Update variable from solution vector after solve.

Reimplemented from Moose::MFEM::EquationSystem.

Definition at line 390 of file ComplexEquationSystem.C.

391{
392 for (const auto i : index_range(_trial_var_names))
393 {
394 auto & trial_var_name = _trial_var_names.at(i);
395 trueX.GetBlock(i).SyncMemory(trueX);
396 _complex_gfuncs->Get(trial_var_name)->Distribute(&(trueX.GetBlock(i)));
397 }
398 // Solution variables changed: stored projections of solution-dependent coefficients are stale.
401}
void markSolutionChanged()
Notify quadrature function coefficients that solution variables have changed, marking the stored valu...

◆ VectorContainsName()

bool Moose::MFEM::EquationSystem::VectorContainsName ( const std::vector< std::string > &  the_vector,
const std::string &  name 
) const
protectedinherited

Member Data Documentation

◆ _assembly_level

mfem::AssemblyLevel Moose::MFEM::EquationSystem::_assembly_level
protectedinherited

◆ _blfs

NamedFieldsMap<mfem::ParBilinearForm> Moose::MFEM::EquationSystem::_blfs
protectedinherited

◆ _block_true_offsets

mfem::Array<int> Moose::MFEM::EquationSystem::_block_true_offsets
protectedinherited

◆ _clfs

NamedFieldsMap<mfem::ParComplexLinearForm> Moose::MFEM::ComplexEquationSystem::_clfs
protected

◆ _cmplx_eliminated_variables

ComplexGridFunctions Moose::MFEM::ComplexEquationSystem::_cmplx_eliminated_variables
protected

Pointers to coupled variables not part of the reduced ComplexEquationSystem.

Definition at line 137 of file ComplexEquationSystem.h.

Referenced by EliminateCoupledVariables(), and Init().

◆ _cmplx_essential_bc_map

NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexEssentialBC> > > Moose::MFEM::ComplexEquationSystem::_cmplx_essential_bc_map
protected

Definition at line 134 of file ComplexEquationSystem.h.

Referenced by AddComplexEssentialBCs(), and ApplyComplexEssentialBC().

◆ _cmplx_integrated_bc_map

NamedFieldsMap<NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexIntegratedBC> > > > Moose::MFEM::ComplexEquationSystem::_cmplx_integrated_bc_map
protected

◆ _cmplx_kernels_map

NamedFieldsMap<NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexKernel> > > > Moose::MFEM::ComplexEquationSystem::_cmplx_kernels_map
protected

◆ _cmplx_var_ess_constraints

std::vector<std::unique_ptr<mfem::ParComplexGridFunction> > Moose::MFEM::ComplexEquationSystem::_cmplx_var_ess_constraints
protected

Complex Gridfunctions holding essential constraints from Dirichlet BCs.

Definition at line 140 of file ComplexEquationSystem.h.

Referenced by ApplyEssentialBCs(), FormSystemMatrix(), FormSystemOperator(), and Init().

◆ _coefficient_manager

CoefficientManager* Moose::MFEM::EquationSystem::_coefficient_manager = nullptr
protectedinherited

◆ _complex_gfuncs

Moose::MFEM::ComplexGridFunctions* Moose::MFEM::ComplexEquationSystem::_complex_gfuncs
protected

◆ _coupled_pfespaces

std::vector<mfem::ParFiniteElementSpace *> Moose::MFEM::EquationSystem::_coupled_pfespaces
protectedinherited

◆ _coupled_var_names

std::vector<std::string> Moose::MFEM::EquationSystem::_coupled_var_names
protectedinherited

◆ _eliminated_var_names

std::vector<std::string> Moose::MFEM::EquationSystem::_eliminated_var_names
protectedinherited

◆ _eliminated_variables

Moose::MFEM::GridFunctions Moose::MFEM::EquationSystem::_eliminated_variables
protectedinherited

◆ _ess_markers

std::vector<mfem::Array<int> > Moose::MFEM::EquationSystem::_ess_markers
protectedinherited

◆ _ess_tdof_lists

std::vector<mfem::Array<int> > Moose::MFEM::EquationSystem::_ess_tdof_lists
protectedinherited

◆ _essential_bc_map

NamedFieldsMap<std::vector<std::shared_ptr<MFEMEssentialBC> > > Moose::MFEM::EquationSystem::_essential_bc_map
protectedinherited

Arrays to store essential BCs to act on each component of weak form.

Named according to test variable.

Definition at line 323 of file EquationSystem.h.

Referenced by Moose::MFEM::EquationSystem::AddEssentialBC(), and Moose::MFEM::EquationSystem::ApplyEssentialBC().

◆ _gfuncs

Moose::MFEM::GridFunctions* Moose::MFEM::EquationSystem::_gfuncs
protectedinherited

◆ _gradient_required

bool Moose::MFEM::EquationSystem::_gradient_required = false
protectedinherited

◆ _h_blocks

mfem::Array2D<const mfem::HypreParMatrix *> Moose::MFEM::EquationSystem::_h_blocks
protectedinherited

◆ _integrated_bc_map

NamedFieldsMap<NamedFieldsMap<std::vector<std::shared_ptr<MFEMIntegratedBC> > > > Moose::MFEM::EquationSystem::_integrated_bc_map
protectedinherited

◆ _jacobian

mfem::OperatorHandle Moose::MFEM::EquationSystem::_jacobian
mutableprotectedinherited

◆ _jacobian_blocks

mfem::Array2D<const mfem::HypreParMatrix *> Moose::MFEM::EquationSystem::_jacobian_blocks
protectedinherited

◆ _kernels_map

NamedFieldsMap<NamedFieldsMap<std::vector<std::shared_ptr<MFEMKernel> > > > Moose::MFEM::EquationSystem::_kernels_map
protectedinherited

◆ _lfs

NamedFieldsMap<mfem::ParLinearForm> Moose::MFEM::EquationSystem::_lfs
protectedinherited

◆ _linear_operator

mfem::OperatorHandle Moose::MFEM::EquationSystem::_linear_operator
mutableprotectedinherited

◆ _linearization_point

const mfem::Vector* Moose::MFEM::EquationSystem::_linearization_point = nullptr
mutableprotectedinherited

◆ _mblfs

NamedFieldsMap<NamedFieldsMap<mfem::ParMixedBilinearForm> > Moose::MFEM::EquationSystem::_mblfs
protectedinherited

◆ _mslfs

NamedFieldsMap<NamedFieldsMap<mfem::ParMixedSesquilinearForm> > Moose::MFEM::ComplexEquationSystem::_mslfs
protected

◆ _nlfs

NamedFieldsMap<mfem::ParNonlinearForm> Moose::MFEM::EquationSystem::_nlfs
protectedinherited

◆ _non_linear

bool Moose::MFEM::EquationSystem::_non_linear = false
protectedinherited

◆ _slfs

NamedFieldsMap<mfem::ParSesquilinearForm> Moose::MFEM::ComplexEquationSystem::_slfs
protected

◆ _test_pfespaces

std::vector<mfem::ParFiniteElementSpace *> Moose::MFEM::EquationSystem::_test_pfespaces
protectedinherited

◆ _test_var_names

std::vector<std::string> Moose::MFEM::EquationSystem::_test_var_names
protectedinherited

◆ _trial_var_names

std::vector<std::string> Moose::MFEM::EquationSystem::_trial_var_names
protectedinherited

◆ _var_ess_constraints

std::vector<std::unique_ptr<mfem::ParGridFunction> > Moose::MFEM::EquationSystem::_var_ess_constraints
protectedinherited

The documentation for this class was generated from the following files: