https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MFEMVectorFESpace.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 "MFEMVectorFESpace.h"
13
15
18{
21 "Convenience class to construct vector finite element spaces, abstracting away some of the "
22 "mathematical complexity of specifying the dimensions.");
23 MooseEnum fec_types("H1 ND RT L2 L2Int", "H1");
24 params.addParam<MooseEnum>("fec_type", fec_types, "Specifies the family of FE shape functions.");
25 MooseEnum closed_basis_types("GaussLobatto=1 ClosedUniform=4 Serendipity=6 ClosedGL=7",
26 "GaussLobatto");
27 params.addParam<MooseEnum>("closed_basis",
28 closed_basis_types,
29 "Specifies the closed basis used for ND and RT elements.");
30 MooseEnum basis_types("GaussLegendre GaussLobatto Positive OpenUniform ClosedUniform "
31 "OpenHalfUniform Serendipity ClosedGL IntegratedGLL",
32 "GaussLegendre");
33 params.addParam<MooseEnum>(
34 "open_basis", basis_types, "Specifies the open basis used for ND and RT elements.");
35 basis_types = "GaussLobatto";
36 params.addParam<MooseEnum>(
37 "basis",
38 basis_types,
39 "Specifies the basis used for H1 and L2(Int) vector elements. H1 spaces require a closed "
40 "basis (GaussLobatto Positive ClosedUniform Serendipity ClosedGL)");
41 params.addParam<int>("range_dim",
42 0,
43 "The number of components of the vectors in reference space. Zero "
44 "(the default) means it will be the same as the problem dimension. "
45 "Note that MFEM does not currently support 2D vectors in 1D space "
46 "for ND and RT elements.");
47
48 return params;
49}
50
52 : MFEMSimplifiedFESpace(parameters),
53 _fec_type(getParam<MooseEnum>("fec_type")),
54 _range_dim(getParam<int>("range_dim"))
55{
56}
57
58std::string
60{
61 const int pdim = getProblemDim();
62 std::string actual_type = _fec_type;
63 if ((_fec_type == "ND" || _fec_type == "RT") && _range_dim != 0 && _range_dim != pdim)
64 {
65 if (_range_dim != 3)
66 mooseError("No " + _fec_type + " finite element collection available for " +
67 std::to_string(_range_dim) + "D vectors in " + std::to_string(pdim) + "D space.");
68 actual_type += "_R" + std::to_string(pdim) + "D";
69 }
70
71 std::string basis = _fec_type == "L2" || _fec_type == "L2Int" ? "_T" : "@";
72
73 if (_fec_type == "ND" || _fec_type == "RT")
74 {
75 if (isParamSetByUser("basis"))
76 mooseWarning("basis parameter ignored, using closed_basis/open_basis parameters instead");
77 basis += mfem::BasisType::GetChar(getParam<MooseEnum>("closed_basis"));
78 basis += mfem::BasisType::GetChar(getParam<MooseEnum>("open_basis"));
79 }
80 else if (_fec_type == "H1" || _fec_type == "L2" || _fec_type == "L2Int")
81 {
82 if (isParamSetByUser("closed_basis") || isParamSetByUser("open_basis"))
83 mooseWarning("closed_basis/open_basis parameter ignored, using basis parameter instead");
84 basis += _fec_type == "L2" || _fec_type == "L2Int"
85 ? std::to_string(getParam<MooseEnum>("basis"))
86 : std::string({mfem::BasisType::GetChar(getParam<MooseEnum>("basis"))});
87 }
88
89 return actual_type + basis + "_" + std::to_string(pdim) + "D_P" + std::to_string(_fec_order);
90}
91
92int
94{
95 if (_fec_type == "H1" || _fec_type == "L2" || _fec_type == "L2Int")
96 {
97 return _range_dim == 0 ? getProblemDim() : _range_dim;
98 }
99 else
100 {
101 return 1;
102 }
103}
104
105#endif
registerMooseObject("MooseApp", MFEMVectorFESpace)
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
void ErrorVector unsigned int
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
Class with common parameters for MFEMVectorFESpace and MFEMScalarFESpace.
static InputParameters validParams()
int getProblemDim() const
Returns the dimension of the problem (i.e., the highest dimension of the reference elements in the me...
const int _fec_order
Order of the basis functions in the finite element collection.
MFEMVectorFESpace(const InputParameters &parameters)
const std::string _fec_type
Name of the family of finite element collections to use.
const int _range_dim
The number of vector components in the reference space.
virtual int getVDim() const override
Get the number of degrees of freedom per basis function needed in this finite element space.
virtual std::string getFECName() const override
Get the name of the desired FECollection.
static InputParameters validParams()
bool isParamSetByUser(const std::string &name) const
Test if the supplied parameter is set by a user, as opposed to not set or set to default.
Definition MooseBase.h:205
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition MooseEnum.h:55