https://mooseframework.inl.gov
NLScaleIntegrator.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 NLScaleIntegrator : public mfem::NonlinearFormIntegrator
25 {
26 private:
27  mfem::NonlinearFormIntegrator * _integrator{nullptr};
28  mfem::real_t _scale;
30 
31 public:
32  NLScaleIntegrator(mfem::NonlinearFormIntegrator * integ)
33  : _integrator{integ}, _scale{1}, _own_integrator{true}
34  {
35  }
36  NLScaleIntegrator(mfem::NonlinearFormIntegrator * integ, mfem::real_t scale)
37  : _integrator{integ}, _scale{scale}, _own_integrator{true}
38  {
39  }
40  NLScaleIntegrator(mfem::NonlinearFormIntegrator * integ, mfem::real_t scale, bool own)
41  : _integrator{integ}, _scale{scale}, _own_integrator{own}
42  {
43  }
44 
45  void SetIntegrator(mfem::NonlinearFormIntegrator * 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  void SetIntegrationMode(mfem::NonlinearFormIntegrator::Mode m)
66  {
67  integrationMode = m;
68  _integrator->SetIntegrationMode(m);
69  }
70 
71  bool Patchwise() const { return integrationMode != Mode::ELEMENTWISE; }
72 
75  void SetPAMemoryType(mfem::MemoryType mt)
76  {
77  pa_mt = mt;
78  _integrator->SetPAMemoryType(mt);
79  }
80 
81  virtual void AssembleElementVector(const mfem::FiniteElement & el,
82  mfem::ElementTransformation & Tr,
83  const mfem::Vector & elfun,
84  mfem::Vector & elvect) override;
85 
86  virtual void AssembleFaceVector(const mfem::FiniteElement & el1,
87  const mfem::FiniteElement & el2,
88  mfem::FaceElementTransformations & Tr,
89  const mfem::Vector & elfun,
90  mfem::Vector & elvect) override;
91 
92  virtual void AssembleElementGrad(const mfem::FiniteElement & el,
93  mfem::ElementTransformation & Tr,
94  const mfem::Vector & elfun,
95  mfem::DenseMatrix & elmat) override;
96 
97  virtual void AssembleFaceGrad(const mfem::FiniteElement & el1,
98  const mfem::FiniteElement & el2,
99  mfem::FaceElementTransformations & Tr,
100  const mfem::Vector & elfun,
101  mfem::DenseMatrix & elmat) override;
102 
103  virtual mfem::real_t GetElementEnergy(const mfem::FiniteElement & el,
104  mfem::ElementTransformation & Tr,
105  const mfem::Vector & elfun) override;
106 
108  {
109  if (_own_integrator)
110  delete _integrator;
111  };
112 };
113 } // namespace Moose::MFEM
114 
115 #endif
virtual void AssembleFaceGrad(const mfem::FiniteElement &el1, const mfem::FiniteElement &el2, mfem::FaceElementTransformations &Tr, const mfem::Vector &elfun, mfem::DenseMatrix &elmat) override
mfem::NonlinearFormIntegrator * _integrator
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.)
NonlinearFormIntegrator which scales its results by a constant value.
virtual void AssembleFaceVector(const mfem::FiniteElement &el1, const mfem::FiniteElement &el2, mfem::FaceElementTransformations &Tr, const mfem::Vector &elfun, mfem::Vector &elvect) override
void SetIntegrationMode(mfem::NonlinearFormIntegrator::Mode m)
virtual void AssembleElementGrad(const mfem::FiniteElement &el, mfem::ElementTransformation &Tr, const mfem::Vector &elfun, mfem::DenseMatrix &elmat) override
void SetIntegrator(mfem::NonlinearFormIntegrator *integ)
void SetPAMemoryType(mfem::MemoryType mt)
Set the memory type used for GeometricFactors and other large allocations in PA extensions.
NLScaleIntegrator(mfem::NonlinearFormIntegrator *integ, mfem::real_t scale)
virtual void AssembleElementVector(const mfem::FiniteElement &el, mfem::ElementTransformation &Tr, const mfem::Vector &elfun, mfem::Vector &elvect) override
NLScaleIntegrator(mfem::NonlinearFormIntegrator *integ)
virtual mfem::real_t GetElementEnergy(const mfem::FiniteElement &el, mfem::ElementTransformation &Tr, const mfem::Vector &elfun) override
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).
NLScaleIntegrator(mfem::NonlinearFormIntegrator *integ, mfem::real_t scale, bool own)
void SetScale(mfem::real_t scale)