37 MFEM_VERIFY(trial_el != NULL,
"Only VectorTensorFiniteElement is supported!");
42 MFEM_VERIFY(test_el != NULL,
"Only VectorTensorFiniteElement is supported!");
47 const int dims = trial_el->
GetDim();
48 MFEM_VERIFY(dims == 2 || dims == 3,
"");
50 const int symmDims = (dims * (dims + 1)) / 2;
53 MFEM_VERIFY(
dim == 2 ||
dim == 3,
"");
56 MFEM_VERIFY(
ne == test_fes.
GetNE(),
57 "Different meshes for test and trial spaces");
85 const int coeff_dim = coeff.
GetVDim();
88 if ((trial_curl && test_div) || (trial_div && test_curl))
98 if (trial_curl && test_curl &&
dim == 3)
103 else if (trial_curl && test_curl &&
dim == 2)
108 else if (trial_div && test_div &&
dim == 3)
113 else if (trial_div && test_div &&
dim == 2)
118 else if (((trial_curl && test_div) || (trial_div && test_curl)) &&
127 const bool tr = (trial_div && test_curl);
142 MFEM_ABORT(
"Unknown kernel.");
158 return internal::SmemPAHcurlMassAssembleDiagonal3D<2,3>(
162 return internal::SmemPAHcurlMassAssembleDiagonal3D<3,4>(
166 return internal::SmemPAHcurlMassAssembleDiagonal3D<4,5>(
170 return internal::SmemPAHcurlMassAssembleDiagonal3D<5,6>(
174 return internal::SmemPAHcurlMassAssembleDiagonal3D(
193 MFEM_ABORT(
"Unknown kernel.");
211 MFEM_ABORT(
"Unknown kernel.");
225 if (trial_curl && test_curl)
233 return internal::SmemPAHcurlMassApply3D<2,3>(
238 return internal::SmemPAHcurlMassApply3D<3,4>(
243 return internal::SmemPAHcurlMassApply3D<4,5>(
248 return internal::SmemPAHcurlMassApply3D<5,6>(
253 return internal::SmemPAHcurlMassApply3D(
265 else if (trial_div && test_div)
270 else if (trial_curl && test_div)
272 const bool scalarCoeff = !(
DQ ||
MQ);
277 else if (trial_div && test_curl)
279 const bool scalarCoeff = !(
DQ ||
MQ);
286 MFEM_ABORT(
"Unknown kernel.");
291 if (trial_curl && test_curl)
296 else if (trial_div && test_div)
302 else if ((trial_curl && test_div) || (trial_div && test_curl))
304 const bool scalarCoeff = !(
DQ ||
MQ);
311 MFEM_ABORT(
"Unknown kernel.");
324 bool symmetricSpaces =
true;
325 if (
dim == 3 && ((trial_div && test_curl) || (trial_curl && test_div)))
327 const bool scalarCoeff = !(
DQ ||
MQ);
331 symmetricSpaces =
false;
333 else if (
dim == 2 && ((trial_curl && test_div) || (trial_div && test_curl)))
335 const bool scalarCoeff = !(
DQ ||
MQ);
339 symmetricSpaces =
false;
345 MFEM_ABORT(
"VectorFEMassIntegrator transpose not implemented for asymmetric MatrixCoefficient");
Class to represent a coefficient evaluated at quadrature points.
void SetConstant(real_t constant)
Set this vector to the given constant.
void Project(Coefficient &coeff)
Evaluate the given Coefficient at the quadrature points defined by qs.
int GetVDim() const
Return the number of values per quadrature point.
void ProjectTranspose(MatrixCoefficient &coeff)
Project the transpose of coeff.
static MemoryType GetMemoryType()
(DEPRECATED) Equivalent to GetDeviceMemoryType().
static bool Allows(unsigned long b_mask)
Return true if any of the backends in the backend mask, b_mask, are allowed.
@ TENSOR
Tensor product representation using 1D matrices/tensors with dimensions using 1D number of quadrature...
Array< real_t > B
Basis functions evaluated at quadrature points.
int ndof
Number of degrees of freedom = number of basis functions. When mode is TENSOR, this is the 1D number.
int nqpt
Number of quadrature points. When mode is TENSOR, this is the 1D number.
Array< real_t > Bt
Transpose of B.
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
int GetNE() const
Returns number of elements in the mesh.
Mesh * GetMesh() const
Returns the mesh.
const FiniteElement * GetTypicalFE() const
Return GetFE(0) if the local mesh is not empty; otherwise return a typical FE based on the Geometry t...
Abstract class for all finite elements.
int GetOrder() const
Returns the order of the finite element. In the case of anisotropic orders, returns the maximum order...
int GetDerivType() const
Returns the FiniteElement::DerivType of the element describing the spatial derivative method implemen...
int GetDim() const
Returns the reference space dimension for the finite element.
@ DIV
Implements CalcDivShape methods.
@ CURL
Implements CalcCurlShape methods.
Vector J
Jacobians of the element transformations at all quadrature points.
Class for an integration rule - an Array of IntegrationPoint.
int GetNPoints() const
Returns the number of the points in the integration rule.
const Array< real_t > & GetWeights() const
Return the quadrature weights in a contiguous array.
const IntegrationRule * IntRule
static const IntegrationRule & GetRule(const FiniteElement &trial_fe, const FiniteElement &test_fe, const ElementTransformation &Trans)
int Dimension() const
Dimension of the reference space used within the elements.
ElementTransformation * GetTypicalElementTransformation()
If the local mesh is not empty return GetElementTransformation(0); otherwise, return the identity tra...
const GeometricFactors * GetGeometricFactors(const IntegrationRule &ir, const int flags, MemoryType d_mt=MemoryType::DEFAULT)
Return the mesh geometric factors corresponding to the given integration rule.
Class representing the storage layout of a QuadratureFunction.
Base class for symmetric matrix coefficients that optionally depend on time and space.
void AddMultPA(const Vector &x, Vector &y) const override
Method for partially assembled action.
void AssembleDiagonalPA(Vector &diag) override
Assemble diagonal and add it to Vector diag.
const DofToQuad * mapsO
Not owned. DOF-to-quad map, open.
const DofToQuad * mapsOtest
Not owned. DOF-to-quad map, open.
void AssemblePA(const FiniteElementSpace &fes) override
Method defining partial assembly.
bool symmetric
False if using a nonsymmetric matrix coefficient.
void AddMultTransposePA(const Vector &x, Vector &y) const override
Method for partially assembled transposed action.
DiagonalMatrixCoefficient * DQ
const DofToQuad * mapsCtest
Not owned. DOF-to-quad map, closed.
const GeometricFactors * geom
Not owned.
const DofToQuad * mapsC
Not owned. DOF-to-quad map, closed.
const DofToQuad & GetDofToQuadOpen(const IntegrationRule &ir, DofToQuad::Mode mode) const
const DofToQuad & GetDofToQuad(const IntegrationRule &ir, DofToQuad::Mode mode) const override
Return a DofToQuad structure corresponding to the given IntegrationRule using the given DofToQuad::Mo...
void SetSize(int s)
Resize the vector to size s.
@ SYMMETRIC
Store the triangular part of symmetric matrices.
@ DEVICE_MASK
Biwise-OR of all device backends.