1 #ifdef MOOSE_MFEM_ENABLED 4 #include "libmesh/int_range.h" 12 mfem::AssemblyLevel assembly_level)
16 if (gridfunctions.
size())
17 mooseError(
"Mixing real and complex variables is currently not supported.");
21 if (!cmplx_gridfunctions.
Has(test_var_name))
25 " requested by equation system during initialization was " 26 "not found in gridfunctions");
32 cmplx_gridfunctions.
Get(test_var_name)->ParFESpace()));
46 cmplx_gridfunctions.
GetShared(eliminated_var_name));
96 ApplyBoundaryBLFIntegrators<mfem::ParSesquilinearForm>(
98 ApplyDomainBLFIntegrators<mfem::ParSesquilinearForm>(
107 mfem::ParComplexGridFunction & trial_gf,
108 mfem::Array<int> & global_ess_markers)
113 for (
auto & bc : bcs)
116 bc->ApplyBC(trial_gf);
118 mfem::Array<int> ess_bdrs(bc->getBoundaryMarkers());
120 for (
const auto i :
make_range(trial_gf.ParFESpace()->GetParMesh()->bdr_attributes.Max()))
121 global_ess_markers[i] =
std::max(global_ess_markers[i], ess_bdrs[i]);
141 mfem::Array<int> global_ess_markers(trial_gf.ParFESpace()->GetParMesh()->bdr_attributes.Max());
142 global_ess_markers = 0;
146 trial_gf.FESpace()->GetEssentialTrueDofs(global_ess_markers,
_ess_tdof_lists.at(i));
153 const auto & trial_var_name = kernel->getTrialVariableName();
154 const auto & test_var_name = kernel->getTestVariableName();
160 auto kernel_field_map =
161 std::make_shared<NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexKernel>>>>();
167 auto kernels = std::make_shared<std::vector<std::shared_ptr<MFEMComplexKernel>>>();
170 _cmplx_kernels_map.GetRef(test_var_name).Get(trial_var_name)->push_back(std::move(kernel));
176 const auto & trial_var_name = bc->getTrialVariableName();
177 const auto & test_var_name = bc->getTestVariableName();
183 auto integrated_bc_field_map =
184 std::make_shared<NamedFieldsMap<std::vector<std::shared_ptr<MFEMComplexIntegratedBC>>>>();
190 auto bcs = std::make_shared<std::vector<std::shared_ptr<MFEMComplexIntegratedBC>>>();
199 const auto & test_var_name = bc->getTestVariableName();
204 auto bcs = std::make_shared<std::vector<std::shared_ptr<MFEMComplexEssentialBC>>>();
212 mfem::BlockVector & trueX,
213 mfem::BlockVector & trueRHS)
216 mfem::Vector aux_x, aux_rhs;
217 mfem::OperatorPtr aux_a;
219 auto slf =
_slfs.
Get(test_var_name);
228 trueX.GetBlock(0) = aux_x;
229 trueRHS.GetBlock(0) = aux_rhs;
230 trueX.SyncFromBlocks();
231 trueRHS.SyncFromBlocks();
233 op.Reset(aux_a.Ptr());
234 aux_a.SetOperatorOwner(
false);
239 mfem::BlockVector & trueX,
240 mfem::BlockVector & trueRHS)
249 trueRHS.SyncToBlocks();
256 mfem::Vector aux_x, aux_rhs;
257 mfem::OperatorHandle aux_a;
259 auto slf =
_slfs.
Get(test_var_name);
267 trueX.GetBlock(i) = aux_x;
268 trueRHS.GetBlock(i) = aux_rhs;
269 _h_blocks(i, i) = aux_a.As<mfem::ComplexHypreParMatrix>()->GetSystemMatrix();
272 trueX.SyncFromBlocks();
273 trueRHS.SyncFromBlocks();
276 op.Reset(mfem::HypreParMatrixFromBlocks(
_h_blocks));
294 trueX.GetBlock(i).SyncMemory(trueX);
virtual void Mult(const mfem::Vector &x, mfem::Vector &y) const override
Nonlinear Mult (Used by Newton-solver not necessarily nonlinear)
virtual void SetTrialVariablesFromTrueVectors(const mfem::BlockVector &trueX) const override
Update variable from solution vector after solve.
std::vector< std::unique_ptr< mfem::ParComplexGridFunction > > _cmplx_var_ess_constraints
Complex Gridfunctions holding essential constraints from Dirichlet BCs.
virtual void AddTestVariableNameIfMissing(const std::string &test_var_name)
Add test variable to EquationSystem.
bool Has(const std::string &field_name) const
Predicate to check if a field is registered with name field_name.
std::vector< mfem::ParFiniteElementSpace * > _coupled_pfespaces
Pointers to finite element spaces associated with coupled variables.
virtual void BuildLinearForms() override
Build linear forms and eliminate constrained DoFs.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
NamedFieldsMap< mfem::ParComplexLinearForm > _clfs
virtual void FormSystemOperator(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS) override
Form matrix-free representation of system operator.
std::vector< std::string > _eliminated_var_names
Names of all coupled variables without a corresponding test variable.
ComplexGridFunctions _cmplx_eliminated_variables
Pointers to coupled variables not part of the reduced EquationSystem.
virtual void ApplyComplexEssentialBC(const std::string &var_name, mfem::ParComplexGridFunction &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...
std::vector< mfem::Array< int > > _ess_tdof_lists
mfem::AssemblyLevel _assembly_level
auto max(const L &left, const R &right)
std::vector< mfem::ParFiniteElementSpace * > _test_pfespaces
Pointers to finite element spaces associated with test variables.
void AddComplexEssentialBCs(std::shared_ptr< MFEMComplexEssentialBC > bc)
Add complex essential BCs.
virtual void ApplyEssentialBCs() override
Update all essentially constrained true DoF markers and values on boundaries.
std::vector< std::string > _trial_var_names
Subset of _coupled_var_names of all variables corresponding to gridfunctions with degrees of freedom ...
NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexEssentialBC > > > _cmplx_essential_bc_map
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...
virtual void BuildEquationSystem() override
Build all forms comprising this EquationSystem.
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...
virtual void FormSystemMatrix(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS) override
Form matrix representation of system operator as a HypreParMatrix.
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexKernel > > > > _cmplx_kernels_map
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.
virtual void BuildBilinearForms() override
Build bilinear forms (diagonal Jacobian contributions)
std::vector< std::string > _test_var_names
Names of all test variables corresponding to linear forms in this equation system.
void AddComplexIntegratedBC(std::shared_ptr< MFEMComplexIntegratedBC > bc)
Add complex integrated BCs.
mfem::Array2D< const mfem::HypreParMatrix * > _h_blocks
virtual void SetTrialVariableNames()
Set trial variable names from subset of coupled variables that have an associated test variable...
virtual void AddCoupledVariableNameIfMissing(const std::string &coupled_var_name)
Add coupled variable to EquationSystem.
void DeleteHBlocks()
Deletes the HypreParMatrix associated with any pointer stored in _h_blocks, and then proceeds to dele...
std::vector< std::string > _coupled_var_names
Names of all trial variables of kernels and boundary conditions added to this EquationSystem.
void Register(const std::string &field_name, FieldArgs &&... args)
Construct new field with name field_name and register.
virtual void Init(GridFunctions &gridfunctions, ComplexGridFunctions &cmplx_gridfunctions, mfem::AssemblyLevel assembly_level) override
Initialise.
NamedFieldsMap< mfem::ParSesquilinearForm > _slfs
Moose::MFEM::ComplexGridFunctions * _complex_gfuncs
IntRange< T > make_range(T beg, T end)
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.
int size()
Returns the number of elements in the map.
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).
mfem::OperatorHandle _linear_operator
NamedFieldsMap< NamedFieldsMap< std::vector< std::shared_ptr< MFEMComplexIntegratedBC > > > > _cmplx_integrated_bc_map
T & GetRef(const std::string &field_name) const
Returns a reference to a field.
auto index_range(const T &sizable)
void AddComplexKernel(std::shared_ptr< MFEMComplexKernel > kernel)
Add complex kernels.