https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ScaleIntegrator.C
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#include "ScaleIntegrator.h"
13
14namespace Moose::MFEM
15{
16
17void
18ScaleIntegrator::SetIntRule(const mfem::IntegrationRule * ir)
19{
20 IntRule = ir;
21 _integrator->SetIntRule(ir);
22}
23
24void
25ScaleIntegrator::AssembleElementMatrix(const mfem::FiniteElement & el,
26 mfem::ElementTransformation & Trans,
27 mfem::DenseMatrix & elmat)
28{
30 _integrator->AssembleElementMatrix(el, Trans, elmat);
31 elmat *= _scale;
32}
33
34void
35ScaleIntegrator::AssembleElementMatrix2(const mfem::FiniteElement & el1,
36 const mfem::FiniteElement & el2,
37 mfem::ElementTransformation & Trans,
38 mfem::DenseMatrix & elmat)
39{
41 _integrator->AssembleElementMatrix2(el1, el2, Trans, elmat);
42 elmat *= _scale;
43}
44
45void
46ScaleIntegrator::AssembleFaceMatrix(const mfem::FiniteElement & el1,
47 const mfem::FiniteElement & el2,
48 mfem::FaceElementTransformations & Trans,
49 mfem::DenseMatrix & elmat)
50{
52 _integrator->AssembleFaceMatrix(el1, el2, Trans, elmat);
53 elmat *= _scale;
54}
55
56void
57ScaleIntegrator::AssemblePA(const mfem::FiniteElementSpace & fes)
58{
60 _integrator->AssemblePA(fes);
61}
62
63void
65{
66 _integrator->AssembleDiagonalPA(diag);
67 diag *= _scale;
68}
69
70void
71ScaleIntegrator::AssemblePAInteriorFaces(const mfem::FiniteElementSpace & fes)
72{
73 _integrator->AssemblePAInteriorFaces(fes);
74}
75
76void
77ScaleIntegrator::AssemblePABoundaryFaces(const mfem::FiniteElementSpace & fes)
78{
79 _integrator->AssemblePABoundaryFaces(fes);
80}
81
82void
83ScaleIntegrator::AddMultPA(const mfem::Vector & x, mfem::Vector & y) const
84{
85 // y += Mx*scale
86 mfem::Vector Mx(y.Size());
87 Mx = 0.0;
88 _integrator->AddMultPA(x, Mx);
89 Mx *= _scale;
90 y += Mx;
91}
92
93void
94ScaleIntegrator::AddMultTransposePA(const mfem::Vector & x, mfem::Vector & y) const
95{
96 // y += M^T x*scale
97 mfem::Vector MTx(y.Size());
98 MTx = 0.0;
99 _integrator->AddMultTransposePA(x, MTx);
100 MTx *= _scale;
101 y += MTx;
102}
103
104void
105ScaleIntegrator::AssembleEA(const mfem::FiniteElementSpace & fes,
106 mfem::Vector & emat,
107 const bool add)
108{
110 if (add)
111 {
112 mfem::Vector emat_scale(emat.Size());
113 _integrator->AssembleEA(fes, emat_scale, false);
114 emat_scale *= _scale;
115 emat += emat_scale;
116 }
117 else
118 {
119 _integrator->AssembleEA(fes, emat, add);
120 emat *= _scale;
121 }
122}
123
124void
125ScaleIntegrator::AssembleEABoundary(const mfem::FiniteElementSpace & fes,
126 mfem::Vector & emat,
127 const bool add)
128{
130 if (add)
131 {
132 mfem::Vector emat_scale(emat.Size());
133 _integrator->AssembleEABoundary(fes, emat_scale, false);
134 emat_scale *= _scale;
135 emat += emat_scale;
136 }
137 else
138 {
139 _integrator->AssembleEABoundary(fes, emat, add);
140 emat *= _scale;
141 }
142}
143
144void
145ScaleIntegrator::AssembleMF(const mfem::FiniteElementSpace & fes)
146{
148 _integrator->AssembleMF(fes);
149}
150
151void
152ScaleIntegrator::AddMultMF(const mfem::Vector & x, mfem::Vector & y) const
153{
154 // y += Mx*scale
155 mfem::Vector Mx(y.Size());
156 Mx = 0.0;
157 _integrator->AddMultMF(x, Mx);
158 Mx *= _scale;
159 y += Mx;
160}
161
162void
164{
165 _integrator->AssembleDiagonalMF(diag);
166 diag *= _scale;
167}
168
174
175} // namespace Moose::MFEM
176
177#endif
virtual void AssembleEA(const mfem::FiniteElementSpace &fes, mfem::Vector &emat, const bool add) override
virtual void AssembleElementMatrix(const mfem::FiniteElement &el, mfem::ElementTransformation &Trans, mfem::DenseMatrix &elmat) override
virtual void AddMultTransposePA(const mfem::Vector &x, mfem::Vector &y) const override
virtual void AssembleFaceMatrix(const mfem::FiniteElement &el1, const mfem::FiniteElement &el2, mfem::FaceElementTransformations &Trans, mfem::DenseMatrix &elmat) override
virtual void AssembleElementMatrix2(const mfem::FiniteElement &trial_fe, const mfem::FiniteElement &test_fe, mfem::ElementTransformation &Trans, mfem::DenseMatrix &elmat) override
virtual void AssemblePABoundaryFaces(const mfem::FiniteElementSpace &fes) override
virtual void AssembleDiagonalPA(mfem::Vector &diag) override
virtual void AssembleMF(const mfem::FiniteElementSpace &fes) override
virtual void AssemblePAInteriorFaces(const mfem::FiniteElementSpace &fes) override
mfem::BilinearFormIntegrator * _integrator
virtual void SetIntRule(const mfem::IntegrationRule *ir) override
virtual void AddMultPA(const mfem::Vector &x, mfem::Vector &y) const override
virtual void AssemblePA(const mfem::FiniteElementSpace &fes) override
virtual void AddMultMF(const mfem::Vector &x, mfem::Vector &y) const override
virtual void AssembleEABoundary(const mfem::FiniteElementSpace &fes, mfem::Vector &emat, const bool add) override
virtual void AssembleDiagonalMF(mfem::Vector &diag) override
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).