https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MFEMContainers.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 "MooseError.h"
15
16#include <map>
17#include <string>
18#include <vector>
19
20namespace mfem
21{
22class FiniteElementCollection;
23class ParFiniteElementSpace;
24class ParSubMesh;
25class ParGridFunction;
26class ParComplexGridFunction;
27class ParFiniteElementSpaceHierarchy;
28}
29
30class MFEMKernel;
32
33namespace Moose::MFEM
34{
35class EquationSystem;
36
38template <typename T>
40{
41public:
42 using MapType = std::map<std::string, std::shared_ptr<T>>;
43 using const_iterator = typename MapType::const_iterator;
44
46 NamedFieldsMap() = default;
47
50
52 template <class FieldType, class... FieldArgs>
53 void Register(const std::string & field_name, FieldArgs &&... args)
54 {
55 Register(field_name, std::make_shared<FieldType>(std::forward<FieldArgs>(args)...));
56 }
57
59 void Register(const std::string & field_name, std::shared_ptr<T> field)
60 {
61 CheckFieldIsRegistrable(field_name, field.get());
62
63 Deregister(field_name);
64
65 _field_map[field_name] = std::move(field);
66 }
67
69 void Deregister(const std::string & field_name) { _field_map.erase(field_name); }
70
72 [[nodiscard]] inline bool Has(const std::string & field_name) const
73 {
74 return FindField(field_name) != end();
75 }
76
78 [[nodiscard]] inline std::shared_ptr<T> GetShared(const std::string & field_name) const
79 {
80 CheckFieldIsRegistered(field_name);
81
82 auto it = FindField(field_name);
83
85 }
86
88 [[nodiscard]] inline T & GetRef(const std::string & field_name) const
89 {
90 return *GetShared(field_name);
91 }
92
94 [[nodiscard]] inline T * Get(const std::string & field_name) const
95 {
96 return GetShared(field_name).get();
97 }
98
100 template <typename TDerived>
101 [[nodiscard]] inline TDerived * Get(const std::string & field_name) const
102 {
103 auto ptr = Get(field_name);
104
105 return EnsurePointerCastIsNonNull<TDerived>(ptr);
106 }
107
109 [[nodiscard]] std::vector<T *> Get(const std::vector<std::string> & keys) const
110 {
111 std::vector<T *> values;
112
113 for (const auto & key : keys)
114 {
115 values.push_back(Get(key));
116 }
117
118 values.shrink_to_fit();
119 return values;
120 }
121
123 // NOLINTNEXTLINE(readability-identifier-naming)
124 [[nodiscard]] inline const_iterator begin() const { return _field_map.begin(); }
125
127 // NOLINTNEXTLINE(readability-identifier-naming)
128 [[nodiscard]] inline const_iterator end() const { return _field_map.end(); }
129
131 int size() const { return _field_map.size(); }
132
133protected:
135 [[nodiscard]] inline const_iterator FindField(const std::string & field_name) const
136 {
137 return _field_map.find(field_name);
138 }
139
141 void CheckFieldIsRegistrable([[maybe_unused]] const std::string & field_name,
142 [[maybe_unused]] T * field) const
143 {
144 mooseAssert(field, "Cannot register NULL field with name '" + field_name + "'.");
145 mooseAssert(!Has(field_name) || Get(field_name) != field,
146 "The field '" + field_name + "' is already registered.");
147 }
148
150 void CheckFieldIsRegistered(const std::string & field_name) const
151 {
152 if (!Has(field_name))
153 mooseError("The field '" + field_name + "' has not been registered.");
154 }
155
157 inline std::shared_ptr<T> EnsureFieldPointerIsNonNull(const_iterator & iterator) const
158 {
159 auto owned_ptr = iterator->second;
160 mooseAssert(owned_ptr, "The field '" + iterator->first + "' is NULL.");
161 return owned_ptr;
162 }
163
165 template <typename TDerived>
166 inline TDerived * EnsurePointerCastIsNonNull(T * ptr) const
167 {
168 auto derived_ptr = dynamic_cast<TDerived *>(ptr);
169 mooseAssert(derived_ptr, "The dynamic cast performed on the field pointer failed.");
170 return derived_ptr;
171 }
172
174 void DeregisterAll() { _field_map.clear(); }
175
176private:
178};
179
183{
184public:
185 using MapType = std::map<std::string, std::string>;
186 using const_iterator = typename MapType::const_iterator;
187
188 inline void addTimeDerivativeAssociation(const std::string & var_name,
189 const std::string & time_derivative_var_name)
190 {
191 _field_map.emplace(var_name, time_derivative_var_name);
192 }
193
194 inline bool isTimeDerivative(const std::string & time_derivative_var_name) const
195 {
196 for (auto const & [map_var_name, map_time_derivative_var_name] : _field_map)
197 {
198 if (map_time_derivative_var_name == time_derivative_var_name)
199 return true;
200 }
201 return false;
202 }
203
204 inline bool hasTimeDerivative(const std::string & var_name) const
205 {
206 return _field_map.count(var_name);
207 }
208
209 inline const std::string & getTimeDerivativeName(const std::string & var_name) const
210 {
211 auto it = _field_map.find(var_name);
212 if (it != _field_map.end())
213 return it->second;
214 else
215 {
216 mooseError("No variable representing the time derivative of ", var_name, " found.");
217 return null_str;
218 }
219 }
220
221 inline const std::string & getTimeIntegralName(const std::string & time_derivative_var_name) const
222 {
223 for (auto const & [map_var_name, map_time_derivative_var_name] : _field_map)
224 {
225 if (map_time_derivative_var_name == time_derivative_var_name)
226 return map_var_name;
227 }
229 "No variable representing the time integral of ", time_derivative_var_name, " found.");
230 return null_str;
231 }
232
233 inline static std::string createTimeDerivativeName(std::string_view name)
234 {
235 return std::string("d") + std::string(name) + std::string("_dt");
236 }
237
238private:
240 const std::string null_str;
241};
242
252
253} // namespace Moose::MFEM
254
255#endif
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
std::array< Real, 2 > values
Definition MortarUtils.C:52
Class to construct an MFEM integrator to apply to the equation system.
Definition MFEMKernel.h:22
Lightweight adaptor over an std::map from strings to pointer to T.
std::shared_ptr< T > EnsureFieldPointerIsNonNull(const_iterator &iterator) const
Ensure that a returned shared pointer is valid.
void Register(const std::string &field_name, FieldArgs &&... args)
Construct new field with name field_name and register.
const_iterator end() const
Returns an end const iterator to the registered fields.
void CheckFieldIsRegistered(const std::string &field_name) const
Check that a field exists in the map.
TDerived * EnsurePointerCastIsNonNull(T *ptr) const
Ensure that a dynamic cast is successful.
const_iterator begin() const
Returns a begin const iterator to the registered fields.
void Register(const std::string &field_name, std::shared_ptr< T > field)
Register association between field and field_name.
bool Has(const std::string &field_name) const
Predicate to check if a field is registered with name field_name.
void DeregisterAll()
Clear all associations between names and fields.
std::vector< T * > Get(const std::vector< std::string > &keys) const
Returns a vector containing all values for supplied keys.
std::map< std::string, std::shared_ptr< T > > MapType
T * Get(const std::string &field_name) const
Returns a non-owning pointer to the field. This is guaranteed to return a non-null pointer.
std::shared_ptr< T > GetShared(const std::string &field_name) const
Returns a shared pointer to the field. This is guaranteed to return a non-null shared pointer.
int size() const
Returns the number of elements in the map.
NamedFieldsMap()=default
Default initializer.
void CheckFieldIsRegistrable(const std::string &field_name, T *field) const
Check that the field pointer is valid and the field has not already been registered.
TDerived * Get(const std::string &field_name) const
Returns a non-owning pointer to the field where TDerived is a derived class of class T.
T & GetRef(const std::string &field_name) const
Returns a reference to a field.
void Deregister(const std::string &field_name)
Unregister association between a field and the field_name.
typename MapType::const_iterator const_iterator
const_iterator FindField(const std::string &field_name) const
Returns a const iterator to the field.
Lightweight adaptor over a std::map relating names of GridFunctions with the name of their time deriv...
const std::string & getTimeIntegralName(const std::string &time_derivative_var_name) const
std::map< std::string, std::string > MapType
typename MapType::const_iterator const_iterator
bool isTimeDerivative(const std::string &time_derivative_var_name) const
void addTimeDerivativeAssociation(const std::string &var_name, const std::string &time_derivative_var_name)
bool hasTimeDerivative(const std::string &var_name) const
static std::string createTimeDerivativeName(std::string_view name)
const std::string & getTimeDerivativeName(const std::string &var_name) const
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).