https://mooseframework.inl.gov
ScaleIntegrator.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #ifdef MOOSE_MFEM_ENABLED
11 
12 #pragma once
13 
14 #include "libmesh/ignore_warnings.h"
15 #include "mfem/miniapps/common/pfem_extras.hpp"
16 #include "libmesh/restore_warnings.h"
17 
18 #include "MooseError.h"
19 
20 namespace Moose::MFEM
21 {
22 
24 class ScaleIntegrator : public mfem::BilinearFormIntegrator
25 {
26 private:
27  mfem::BilinearFormIntegrator * _integrator{nullptr};
28  mfem::real_t _scale;
30 
31 public:
32  ScaleIntegrator(mfem::BilinearFormIntegrator * integ)
33  : _integrator{integ}, _scale{1}, _own_integrator{true}
34  {
35  }
36  ScaleIntegrator(mfem::BilinearFormIntegrator * integ, mfem::real_t scale)
37  : _integrator{integ}, _scale{scale}, _own_integrator{true}
38  {
39  }
40  ScaleIntegrator(mfem::BilinearFormIntegrator * integ, mfem::real_t scale, bool own)
41  : _integrator{integ}, _scale{scale}, _own_integrator{own}
42  {
43  }
44 
45  void SetIntegrator(mfem::BilinearFormIntegrator * integ)
46  {
48  {
49  delete _integrator;
50  }
51 
52  _integrator = integ;
53  }
54 
55  void SetScale(mfem::real_t scale) { _scale = scale; }
56 
57  void SetOwn(bool own) { _own_integrator = own; }
58 
60  {
61  if (!_integrator)
62  mooseError("Integrator not set");
63  }
64 
65  virtual void SetIntRule(const mfem::IntegrationRule * ir) override;
66 
67  virtual void AssembleElementMatrix(const mfem::FiniteElement & el,
68  mfem::ElementTransformation & Trans,
69  mfem::DenseMatrix & elmat) override;
70  virtual void AssembleElementMatrix2(const mfem::FiniteElement & trial_fe,
71  const mfem::FiniteElement & test_fe,
72  mfem::ElementTransformation & Trans,
73  mfem::DenseMatrix & elmat) override;
74 
75  using mfem::BilinearFormIntegrator::AssembleFaceMatrix;
76  virtual void AssembleFaceMatrix(const mfem::FiniteElement & el1,
77  const mfem::FiniteElement & el2,
78  mfem::FaceElementTransformations & Trans,
79  mfem::DenseMatrix & elmat) override;
80 
81  using mfem::BilinearFormIntegrator::AssemblePA;
82  virtual void AssemblePA(const mfem::FiniteElementSpace & fes) override;
83 
84  virtual void AssembleDiagonalPA(mfem::Vector & diag) override;
85 
86  virtual void AssemblePAInteriorFaces(const mfem::FiniteElementSpace & fes) override;
87 
88  virtual void AssemblePABoundaryFaces(const mfem::FiniteElementSpace & fes) override;
89 
90  virtual void AddMultTransposePA(const mfem::Vector & x, mfem::Vector & y) const override;
91 
92  virtual void AddMultPA(const mfem::Vector & x, mfem::Vector & y) const override;
93 
94  virtual void
95  AssembleEA(const mfem::FiniteElementSpace & fes, mfem::Vector & emat, const bool add) override;
96 
97  virtual void AssembleEABoundary(const mfem::FiniteElementSpace & fes,
98  mfem::Vector & emat,
99  const bool add) override;
100 
101  virtual void AssembleMF(const mfem::FiniteElementSpace & fes) override;
102 
103  virtual void AddMultMF(const mfem::Vector & x, mfem::Vector & y) const override;
104 
105  virtual void AssembleDiagonalMF(mfem::Vector & diag) override;
106 
107  virtual ~ScaleIntegrator();
108 };
109 } // namespace Moose::MFEM
110 
111 #endif
virtual void AssembleEA(const mfem::FiniteElementSpace &fes, mfem::Vector &emat, const bool add) override
virtual void AssembleDiagonalMF(mfem::Vector &diag) override
virtual void AssembleElementMatrix(const mfem::FiniteElement &el, mfem::ElementTransformation &Trans, mfem::DenseMatrix &elmat) override
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
void scale(MeshBase &mesh, const Real xs, const Real ys=0., const Real zs=0.)
virtual void AssemblePA(const mfem::FiniteElementSpace &fes) override
virtual void SetIntRule(const mfem::IntegrationRule *ir) override
mfem::BilinearFormIntegrator * _integrator
virtual void AssembleMF(const mfem::FiniteElementSpace &fes) override
void SetScale(mfem::real_t scale)
virtual void AssembleEABoundary(const mfem::FiniteElementSpace &fes, mfem::Vector &emat, const bool add) override
virtual void AddMultPA(const mfem::Vector &x, mfem::Vector &y) const override
virtual void AssemblePABoundaryFaces(const mfem::FiniteElementSpace &fes) override
virtual void AssemblePAInteriorFaces(const mfem::FiniteElementSpace &fes) override
ScaleIntegrator(mfem::BilinearFormIntegrator *integ)
ScaleIntegrator(mfem::BilinearFormIntegrator *integ, mfem::real_t scale, bool own)
virtual void AssembleDiagonalPA(mfem::Vector &diag) override
Integrator which scales its results by a constant value.
virtual void AssembleFaceMatrix(const mfem::FiniteElement &el1, const mfem::FiniteElement &el2, mfem::FaceElementTransformations &Trans, mfem::DenseMatrix &elmat) override
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).
virtual void AddMultTransposePA(const mfem::Vector &x, mfem::Vector &y) const override
void SetIntegrator(mfem::BilinearFormIntegrator *integ)
virtual void AddMultMF(const mfem::Vector &x, mfem::Vector &y) const override
ScaleIntegrator(mfem::BilinearFormIntegrator *integ, mfem::real_t scale)
virtual void AssembleElementMatrix2(const mfem::FiniteElement &trial_fe, const mfem::FiniteElement &test_fe, mfem::ElementTransformation &Trans, mfem::DenseMatrix &elmat) override