10 #ifdef MOOSE_MFEM_ENABLED 27 using MapType = std::map<std::string, std::shared_ptr<T>>;
37 template <
class FieldType,
class... FieldArgs>
38 void Register(
const std::string & field_name, FieldArgs &&... args)
40 Register(field_name, std::make_shared<FieldType>(std::forward<FieldArgs>(args)...));
44 void Register(
const std::string & field_name, std::shared_ptr<T> field)
57 [[nodiscard]]
inline bool Has(
const std::string & field_name)
const 63 [[nodiscard]]
inline std::shared_ptr<T>
GetShared(
const std::string & field_name)
const 73 [[nodiscard]]
inline T &
GetRef(
const std::string & field_name)
const 79 [[nodiscard]]
inline T *
Get(
const std::string & field_name)
const 85 template <
typename TDerived>
86 [[nodiscard]]
inline TDerived *
Get(
const std::string & field_name)
const 88 auto ptr =
Get(field_name);
90 return EnsurePointerCastIsNonNull<TDerived>(ptr);
94 [[nodiscard]] std::vector<T *>
Get(
const std::vector<std::string> & keys)
const 96 std::vector<T *> values;
98 for (
const auto & key : keys)
100 values.push_back(
Get(key));
103 values.shrink_to_fit();
127 [[maybe_unused]] T * field)
const 129 mooseAssert(field,
"Cannot register NULL field with name '" + field_name +
"'.");
130 mooseAssert(!
Has(field_name) ||
Get(field_name) != field,
131 "The field '" + field_name +
"' is already registered.");
137 if (!
Has(field_name))
138 mooseError(
"The field '" + field_name +
"' has not been registered.");
144 auto owned_ptr = iterator->second;
145 mooseAssert(owned_ptr,
"The field '" + iterator->first +
"' is NULL.");
150 template <
typename TDerived>
153 auto derived_ptr =
dynamic_cast<TDerived *
>(ptr);
154 mooseAssert(derived_ptr,
"The dynamic cast performed on the field pointer failed.");
170 using MapType = std::map<std::string, std::string>;
174 const std::string & time_derivative_var_name)
176 _field_map.emplace(var_name, time_derivative_var_name);
181 for (
auto const & [map_var_name, map_time_derivative_var_name] :
_field_map)
183 if (map_time_derivative_var_name == time_derivative_var_name)
201 mooseError(
"No variable representing the time derivative of ", var_name,
" found.");
208 for (
auto const & [map_var_name, map_time_derivative_var_name] : _field_map)
210 if (map_time_derivative_var_name == time_derivative_var_name)
214 "No variable representing the time integral of ", time_derivative_var_name,
" found.");
220 return std::string(
"d") + std::string(
name) + std::string(
"_dt");
std::string name(const ElemQuality q)
static std::string createTimeDerivativeName(std::string_view name)
std::map< std::string, std::string > MapType
void CheckFieldIsRegistrable([[maybe_unused]] const std::string &field_name, [[maybe_unused]] T *field) const
Check that the field pointer is valid and the field has not already been registered.
bool Has(const std::string &field_name) const
Predicate to check if a field is registered with name field_name.
bool isTimeDerivative(const std::string &time_derivative_var_name) const
typename MapType::const_iterator const_iterator
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
bool hasTimeDerivative(const std::string &var_name) const
void CheckFieldIsRegistered(const std::string &field_name) const
Check that a field exists in the map.
const_iterator FindField(const std::string &field_name) const
Returns a const iterator to the field.
std::shared_ptr< T > EnsureFieldPointerIsNonNull(const_iterator &iterator) const
Ensure that a returned shared pointer is valid.
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
Lightweight adaptor over an std::map from strings to pointer to T.
typename MapType::const_iterator const_iterator
const_iterator end() const
Returns an end const iterator to the registered fields.
std::map< std::string, std::shared_ptr< mfem::ParNonlinearForm > > MapType
~NamedFieldsMap()
Destructor.
TDerived * EnsurePointerCastIsNonNull(T *ptr) const
Ensure that a dynamic cast is successful.
const std::string null_str
void addTimeDerivativeAssociation(const std::string &var_name, const std::string &time_derivative_var_name)
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...
const_iterator begin() const
Returns a begin const iterator to the registered fields.
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...
NamedFieldsMap()=default
Default initializer.
void Register(const std::string &field_name, std::shared_ptr< T > field)
Register association between field and field_name.
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...
void Deregister(const std::string &field_name)
Unregister association between a field and the field_name.
void Register(const std::string &field_name, FieldArgs &&... args)
Construct new field with name field_name and register.
int size()
Returns the number of elements in the map.
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).
T & GetRef(const std::string &field_name) const
Returns a reference to a field.
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.
const std::string & getTimeDerivativeName(const std::string &var_name) const