13 #include "libmesh/ignore_warnings.h" 14 #include "mfem/miniapps/common/pfem_extras.hpp" 15 #include "libmesh/restore_warnings.h" 45 virtual void AddKernel(std::shared_ptr<MFEMKernel> kernel);
53 mfem::AssemblyLevel assembly_level);
61 mfem::BlockVector & trueX,
62 mfem::BlockVector & trueRHS);
65 FormSystem(mfem::OperatorHandle & op, mfem::BlockVector & trueX, mfem::BlockVector & trueRHS);
67 mfem::BlockVector & trueX,
68 mfem::BlockVector & trueRHS);
71 virtual void BuildJacobian(mfem::BlockVector & trueX, mfem::BlockVector & trueRHS);
74 void Mult(
const mfem::Vector & u, mfem::Vector & residual)
const override;
77 mfem::Operator &
GetGradient(
const mfem::Vector & u)
const override;
80 using mfem::Operator::RecoverFEMSolution;
96 const std::string & name)
const;
122 template <
class FormType>
124 const std::string & trial_var_name,
125 const std::string & test_var_name,
126 std::shared_ptr<FormType> form,
131 const std::string & test_var_name,
132 std::shared_ptr<mfem::ParLinearForm> form,
136 template <
class FormType>
138 const std::string & trial_var_name,
139 const std::string & test_var_name,
140 std::shared_ptr<FormType> form,
146 const std::string & test_var_name,
147 std::shared_ptr<mfem::ParLinearForm> form,
153 std::vector<std::unique_ptr<mfem::ParGridFunction>>
_xs;
154 std::vector<std::unique_ptr<mfem::ParGridFunction>>
_dxdts;
172 template <
class FormType>
175 const std::string & trial_var_name,
176 const std::string & test_var_name,
177 std::shared_ptr<FormType> form,
181 if (kernels_map.Has(test_var_name) && kernels_map.Get(test_var_name)->Has(trial_var_name))
183 auto kernels = kernels_map.GetRef(test_var_name).GetRef(trial_var_name);
184 for (
auto & kernel : kernels)
186 mfem::BilinearFormIntegrator * integ = kernel->createBFIntegrator();
187 if (integ !=
nullptr)
189 kernel->isSubdomainRestricted()
190 ? form->AddDomainIntegrator(std::move(integ), kernel->getSubdomainMarkers())
191 : form->AddDomainIntegrator(std::move(integ));
199 const std::string & test_var_name,
200 std::shared_ptr<mfem::ParLinearForm> form,
204 if (kernels_map.Has(test_var_name))
206 auto kernels = kernels_map.GetRef(test_var_name).GetRef(test_var_name);
207 for (
auto & kernel : kernels)
209 mfem::LinearFormIntegrator * integ = kernel->createLFIntegrator();
210 if (integ !=
nullptr)
212 kernel->isSubdomainRestricted()
213 ? form->AddDomainIntegrator(std::move(integ), kernel->getSubdomainMarkers())
214 : form->AddDomainIntegrator(std::move(integ));
220 template <
class FormType>
223 const std::string & trial_var_name,
224 const std::string & test_var_name,
225 std::shared_ptr<FormType> form,
230 if (integrated_bc_map.Has(test_var_name) &&
231 integrated_bc_map.Get(test_var_name)->Has(trial_var_name))
233 auto bcs = integrated_bc_map.GetRef(test_var_name).GetRef(trial_var_name);
234 for (
auto & bc : bcs)
236 mfem::BilinearFormIntegrator * integ = bc->createBFIntegrator();
237 if (integ !=
nullptr)
239 bc->isBoundaryRestricted()
240 ? form->AddBoundaryIntegrator(std::move(integ), bc->getBoundaryMarkers())
241 : form->AddBoundaryIntegrator(std::move(integ));
249 const std::string & test_var_name,
250 std::shared_ptr<mfem::ParLinearForm> form,
255 if (integrated_bc_map.Has(test_var_name))
257 auto bcs = integrated_bc_map.GetRef(test_var_name).GetRef(test_var_name);
258 for (
auto & bc : bcs)
260 mfem::LinearFormIntegrator * integ = bc->createLFIntegrator();
261 if (integ !=
nullptr)
263 bc->isBoundaryRestricted()
264 ? form->AddBoundaryIntegrator(std::move(integ), bc->getBoundaryMarkers())
265 : form->AddBoundaryIntegrator(std::move(integ));
284 virtual void AddKernel(std::shared_ptr<MFEMKernel> kernel)
override;
287 mfem::BlockVector & truedXdt,
288 mfem::BlockVector & trueRHS)
override;
289 virtual void FormSystem(mfem::OperatorHandle & op,
290 mfem::BlockVector & truedXdt,
291 mfem::BlockVector & trueRHS)
override;
305 inline const std::vector<std::string> &
void ApplyDomainBLFIntegrators(const std::string &trial_var_name, const std::string &test_var_name, std::shared_ptr< FormType > form, Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel >>>> &kernels_map)
Template method for applying BilinearFormIntegrators on domains from kernels to a BilinearForm...
mfem::ConstantCoefficient _dt_coef
virtual void AddKernel(std::shared_ptr< MFEMKernel > kernel) override
virtual void AddTestVariableNameIfMissing(const std::string &test_var_name)
virtual void AddKernel(std::shared_ptr< MFEMKernel > kernel)
virtual void RecoverFEMSolution(mfem::BlockVector &trueX, Moose::MFEM::GridFunctions &gridfunctions)
virtual void BuildBilinearForms()
Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > _td_kernels_map
const std::vector< std::string > & TestVarNames() const
Moose::MFEM::NamedFieldsMap< mfem::ParNonlinearForm > _nlfs
virtual void FormSystem(mfem::OperatorHandle &op, mfem::BlockVector &truedXdt, mfem::BlockVector &trueRHS) override
const std::vector< std::string > & TrialVarNames() const
void ApplyBoundaryLFIntegrators(const std::string &test_var_name, std::shared_ptr< mfem::ParLinearForm > form, Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC >>>> &integrated_bc_map)
bool VectorContainsName(const std::vector< std::string > &the_vector, const std::string &name) const
std::vector< std::unique_ptr< mfem::ParGridFunction > > _xs
virtual void UpdateEquationSystem()
~EquationSystem() override
Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< mfem::ParMixedBilinearForm > > _mblfs
std::vector< std::unique_ptr< mfem::ParGridFunction > > _dxdts
TimeDependentEquationSystem()
virtual void AddEssentialBC(std::shared_ptr< MFEMEssentialBC > bc)
Problem operator for time-dependent problems with an equation system.
std::vector< mfem::Array< int > > _ess_tdof_lists
mfem::AssemblyLevel _assembly_level
void AddTrialVariableNameIfMissing(const std::string &trial_var_name) override
Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMEssentialBC > > > _essential_bc_map
std::vector< mfem::ParFiniteElementSpace * > _test_pfespaces
const std::vector< std::string > & TrialVarTimeDerivativeNames() const
void Mult(const mfem::Vector &u, mfem::Vector &residual) const override
Compute residual y = Mu.
std::vector< std::string > _trial_var_names
virtual void FormLegacySystem(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
mfem::OperatorHandle _jacobian
virtual void AddTrialVariableNameIfMissing(const std::string &trial_var_name)
std::vector< std::string > _test_var_names
Steady-state problem operator with an equation system.
virtual void BuildEquationSystem()
virtual void Init(Moose::MFEM::GridFunctions &gridfunctions, const Moose::MFEM::FESpaces &fespaces, mfem::AssemblyLevel assembly_level)
virtual void FormLegacySystem(mfem::OperatorHandle &op, mfem::BlockVector &truedXdt, mfem::BlockVector &trueRHS) override
virtual void BuildMixedBilinearForms()
mfem::Array2D< const mfem::HypreParMatrix * > _h_blocks
virtual void FormLinearSystem(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
std::vector< std::string > _trial_var_time_derivative_names
Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC > > > > _integrated_bc_map
Moose::MFEM::NamedFieldsMap< mfem::ParBilinearForm > _td_blfs
Moose::MFEM::GridFunctions _trial_variables
virtual void BuildLinearForms()
virtual void BuildJacobian(mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
void ApplyDomainLFIntegrators(const std::string &test_var_name, std::shared_ptr< mfem::ParLinearForm > form, Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel >>>> &kernels_map)
virtual void ApplyEssentialBCs()
Moose::MFEM::NamedFieldsMap< mfem::ParLinearForm > _lfs
virtual void BuildBilinearForms() override
Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMKernel > > > > _kernels_map
virtual void SetTimeStep(double dt)
mfem::Operator & GetGradient(const mfem::Vector &u) const override
Compute J = M + grad_H(u)
virtual void FormSystem(mfem::OperatorHandle &op, mfem::BlockVector &trueX, mfem::BlockVector &trueRHS)
Moose::MFEM::NamedFieldsMap< mfem::ParBilinearForm > _blfs
void ApplyBoundaryBLFIntegrators(const std::string &trial_var_name, const std::string &test_var_name, std::shared_ptr< FormType > form, Moose::MFEM::NamedFieldsMap< Moose::MFEM::NamedFieldsMap< std::vector< std::shared_ptr< MFEMIntegratedBC >>>> &integrated_bc_map)
virtual void AddIntegratedBC(std::shared_ptr< MFEMIntegratedBC > kernel)