https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
20namespace Moose::MFEM
21{
22
24class NLScaleIntegrator : public mfem::NonlinearFormIntegrator
25{
26private:
27 mfem::NonlinearFormIntegrator * _integrator{nullptr};
28 mfem::real_t _scale;
30
31public:
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)
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
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
Real scale
Definition MortarUtils.C:62
NonlinearFormIntegrator which scales its results by a constant value.
void SetIntegrator(mfem::NonlinearFormIntegrator *integ)
virtual void AssembleElementVector(const mfem::FiniteElement &el, mfem::ElementTransformation &Tr, const mfem::Vector &elfun, mfem::Vector &elvect) override
virtual void AssembleFaceVector(const mfem::FiniteElement &el1, const mfem::FiniteElement &el2, mfem::FaceElementTransformations &Tr, const mfem::Vector &elfun, mfem::Vector &elvect) override
virtual void AssembleElementGrad(const mfem::FiniteElement &el, mfem::ElementTransformation &Tr, const mfem::Vector &elfun, mfem::DenseMatrix &elmat) override
virtual mfem::real_t GetElementEnergy(const mfem::FiniteElement &el, mfem::ElementTransformation &Tr, const mfem::Vector &elfun) override
NLScaleIntegrator(mfem::NonlinearFormIntegrator *integ, mfem::real_t scale, bool own)
void SetPAMemoryType(mfem::MemoryType mt)
Set the memory type used for GeometricFactors and other large allocations in PA extensions.
void SetScale(mfem::real_t scale)
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
NLScaleIntegrator(mfem::NonlinearFormIntegrator *integ)
void SetIntegrationMode(mfem::NonlinearFormIntegrator::Mode m)
NLScaleIntegrator(mfem::NonlinearFormIntegrator *integ, mfem::real_t scale)
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).