21 #ifndef GEOS_DATAREPOSITORY_GROUP_HPP_
22 #define GEOS_DATAREPOSITORY_GROUP_HPP_
36 #ifndef NOCHARTOSTRING_KEYLOOKUP
38 #define NOCHARTOSTRING_KEYLOOKUP 0
50 namespace dataRepository
88 explicit Group(
string const & name,
89 Group *
const parent );
97 explicit Group(
string const & name,
98 conduit::Node & rootNode );
199 template<
typename T = Group >
202 newObject->m_parent =
this;
203 return dynamicCast< T & >( *m_subGroups.
insert( name, newObject.release(),
true ) );
216 template<
typename T = Group >
218 {
return dynamicCast< T & >( *m_subGroups.
insert( name, newObject,
false ) ); }
230 template<
typename T = Group >
232 {
return registerGroup< T >( name, std::make_unique< T >( name,
this ) ); }
244 template<
typename T = Group >
247 T & rval = registerGroup< T >( keyIndex.
key(), std::make_unique< T >( keyIndex.
key(),
this ) );
263 template<
typename T = Group,
typename TBASE = Group >
266 std::unique_ptr< TBASE > newGroup = TBASE::CatalogInterface::Factory( catalogName, name,
this );
267 return registerGroup< T >( name, std::move( newGroup ) );
316 template<
typename T = Group,
typename KEY =
void >
318 {
return dynamicCast< T * >( m_subGroups[ key ] ); }
323 template<
typename T = Group,
typename KEY =
void >
325 {
return dynamicCast< T const * >( m_subGroups[ key ] ); }
335 template<
typename T = Group,
typename KEY =
void >
338 Group *
const child = m_subGroups[ key ];
340 "Group " <<
getDataContext() <<
" has no child named " << key << std::endl
343 T *
const castedChild = dynamicCast< T * >( child );
345 GEOS_FMT(
"{} was expected to be a '{}'.",
354 template<
typename T = Group,
typename KEY =
void >
357 Group const *
const child = m_subGroups[ key ];
359 "Group " <<
getDataContext() <<
" has no child named " << key << std::endl
362 T
const *
const castedChild = dynamicCast< T const * >( child );
364 GEOS_FMT(
"{} was expected to be a '{}'.",
379 template<
typename T = Group >
381 {
return dynamicCast< T & >(
const_cast< Group &
>( getBaseGroupByPath( path ) ) ); }
386 template<
typename T = Group >
388 {
return dynamicCast< T const & >( getBaseGroupByPath( path ) ); }
397 {
return m_subGroups; }
404 {
return m_subGroups; }
422 template<
typename T = Group >
424 {
return dynamicCast< T const * >( m_subGroups[ name ] ) !=
nullptr; }
431 template<
typename T >
434 bool hasSubGroup =
false;
437 forSubGroups< T >( [&]( T
const & ){ hasSubGroup =
true; } );
455 template<
typename CASTTYPE,
typename CONTAINERTYPE,
typename LAMBDA >
458 using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, CASTTYPE
const, CASTTYPE >;
459 T *
const castedContainer =
dynamic_cast< T *
>( &container );
460 if( castedContainer !=
nullptr )
462 lambda( *castedContainer );
481 template<
typename T0,
typename T1,
typename ... CASTTYPES,
typename CONTAINERTYPE,
typename LAMBDA >
484 using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, T0
const, T0 >;
485 T *
const castedContainer =
dynamic_cast< T *
>( &container );
487 if( castedContainer !=
nullptr )
489 lambda( *castedContainer );
517 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
520 for(
auto & subGroupIter : m_subGroups )
524 lambda( castedSubGroup );
532 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
535 for(
auto const & subGroupIter : m_subGroups )
537 applyLambdaToContainer< GROUPTYPE, GROUPTYPES... >( *subGroupIter.second, [&](
auto const & castedSubGroup )
539 lambda( castedSubGroup );
552 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
556 for(
auto & subGroupIter : m_subGroups )
559 [&](
auto & castedSubGroup )
561 lambda( counter, castedSubGroup );
570 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
574 for(
auto const & subGroupIter : m_subGroups )
577 [&](
auto const & castedSubGroup )
579 lambda( counter, castedSubGroup );
596 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LOOKUP_CONTAINER,
typename LAMBDA >
597 void forSubGroups( LOOKUP_CONTAINER
const & subGroupKeys, LAMBDA && lambda )
601 for(
auto const & subgroup : subGroupKeys )
605 lambda( counter, castedSubGroup );
622 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LOOKUP_CONTAINER,
typename LAMBDA >
623 void forSubGroups( LOOKUP_CONTAINER
const & subGroupKeys, LAMBDA && lambda )
const
626 for(
auto const & subgroup : subGroupKeys )
630 lambda( counter, castedSubGroup );
654 template<
typename LAMBDA >
657 for(
auto & wrapperIter : m_wrappers )
659 lambda( *wrapperIter.second );
666 template<
typename LAMBDA >
669 for(
auto const & wrapperIter : m_wrappers )
671 lambda( *wrapperIter.second );
682 template<
typename TYPE,
typename ... TYPES,
typename LAMBDA >
685 for(
auto & wrapperIter : m_wrappers )
687 applyLambdaToContainer< Wrapper< TYPE >,
Wrapper< TYPES >... >( *wrapperIter.second,
688 std::forward< LAMBDA >( lambda ));
699 template<
typename TYPE,
typename ... TYPES,
typename LAMBDA >
702 for(
auto const & wrapperIter : m_wrappers )
704 applyLambdaToContainer< Wrapper< TYPE >,
Wrapper< TYPES >... >( *wrapperIter.second,
705 std::forward< LAMBDA >( lambda ));
815 template<
typename T,
typename TBASE=T >
826 template<
typename T,
typename TBASE=T >
837 template<
typename T >
848 template<
typename T >
874 template<
typename LOG_LEVEL_INFO >
875 std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >,
void >
890 string indent( level*2,
' ' );
892 for(
auto const & subGroupIter : m_subGroups )
894 std::cout << indent << subGroupIter.second->getName() << std::endl;
895 subGroupIter.second->generateDataStructureSkeleton( level + 1 );
965 parallelDeviceEvents & events )
const;
983 parallelDeviceEvents & events )
const;
999 parallelDeviceEvents & events )
const;
1023 parallelDeviceEvents & events )
const;
1048 parallelDeviceEvents & events )
const;
1071 parallelDeviceEvents & events )
const;
1096 parallelDeviceEvents & events,
1097 MPI_Op op=MPI_REPLACE );
1120 template<
typename KEY >
1123 WrapperBase const *
const wrapper = m_wrappers[ key ];
1125 "Group " <<
getDataContext() <<
" has no wrapper named " << key << std::endl
1127 std::domain_error );
1135 template<
typename KEY >
1140 "Group " <<
getDataContext() <<
" has no wrapper named " << key << std::endl
1142 std::domain_error );
1153 {
return m_wrappers.
getIndex( name ); }
1160 {
return m_wrappers; }
1166 {
return m_wrappers; }
1173 {
return m_wrappers.
size(); }
1201 template<
typename LOOKUP_TYPE >
1203 {
return m_wrappers[ lookup ] !=
nullptr; }
1213 template<
typename T,
typename LOOKUP_TYPE >
1217 return dynamicCast< Wrapper< T >
const & >( wrapper );
1223 template<
typename T,
typename LOOKUP_TYPE >
1227 return dynamicCast< Wrapper< T > & >( wrapper );
1238 template<
typename T,
typename LOOKUP_TYPE >
1240 {
return dynamicCast< Wrapper< T >
const * >( m_wrappers[ index ] ); }
1245 template<
typename T,
typename LOOKUP_TYPE >
1247 {
return dynamicCast< Wrapper< T > * >( m_wrappers[ index ] ); }
1271 template<
typename T,
typename LOOKUP_TYPE >
1274 {
return getWrapper< T >( lookup ).reference(); }
1279 template<
typename T,
typename LOOKUP_TYPE >
1281 {
return getWrapper< T >( lookup ).reference(); }
1309 {
return m_capacity; }
1344 {
return *m_dataContext; }
1353 template<
typename KEY >
1355 {
return getWrapperBase< KEY >( key ).getDataContext(); }
1381 {
return m_parent !=
nullptr; }
1402 {
return m_sizedFromParent; }
1411 m_sizedFromParent = val;
1472 {
return m_conduitNode; }
1476 {
return m_conduitNode; }
1517 #if defined(GEOS_USE_PYGEOSX)
1518 virtual PyTypeObject * getPythonType()
const;
1582 Group const & getBaseGroupByPath(
string const & path )
const;
1598 template<
bool DO_PACKING >
1604 parallelDeviceEvents & events )
const;
1608 Group * m_parent =
nullptr;
1643 conduit::Node & m_conduitNode;
1646 std::unique_ptr< LogLevelsRegistry > m_logLevelsRegistry;
1650 std::unique_ptr< DataContext > m_dataContext;
1666 template<
typename T,
typename TBASE >
1668 ViewKey::index_type *
const rkey )
1670 std::unique_ptr< TBASE > newObj = std::make_unique< T >();
1675 if( rkey !=
nullptr )
1677 *rkey = m_wrappers.
getIndex( name );
1689 template<
typename T,
typename TBASE >
1692 ViewKey::index_type index;
1693 Wrapper< TBASE > & rval = registerWrapper< T, TBASE >( viewKey.key(), &index );
1694 viewKey.setIndex( index );
1700 template<
typename T >
1702 std::unique_ptr< T > newObject )
1704 static_assert( !std::is_base_of< WrapperBase, T >::value,
"This function should not be used for `WrapperBase`. Use the dedicated `registerWrapper` instead." );
1706 new Wrapper< T >( name, *
this, std::move( newObject ) ),
1717 template<
typename T >
1721 static_assert( !std::is_base_of< WrapperBase, T >::value,
"This function should not be used for `WrapperBase`. Use the dedicated `registerWrapper` instead." );
1734 template<
typename LOG_LEVEL_INFO >
1735 std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >,
void >
1738 GEOS_ERROR_IF( m_logLevelsRegistry ==
nullptr,
"You cannot call addLogLevel after schema generation" );
1741 if( wrapper ==
nullptr )
1747 m_logLevelsRegistry->addEntry( LOG_LEVEL_INFO::getMinLogLevel(),
1748 LOG_LEVEL_INFO::getDescription() );
1749 wrapper->
setDescription( m_logLevelsRegistry->buildLogLevelDescription());
#define GEOS_DECLTYPE_AUTO_RETURN
Doxygen can't parse a decltype( auto ) return type, using this gets around that.
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
#define GEOS_ERROR_IF(EXP, msg)
Conditionally raise a hard error and terminate the program.
#define GEOS_THROW_IF(EXP, msg, TYPE)
Conditionally throw an exception.
INDEX_TYPE index_type
the type used for the index
void setIndex(INDEX_TYPE const &index) const
Set the index.
KEY_TYPE const & key() const
Access for the key.
INDEX_TYPE size() const
function to return the number of entries stored
KeyIndexT< keyType const, indexType > KeyIndex
alias for the KeyIndex itself
T * insert(KEY_TYPE const &keyName, T_PTR source, bool takeOwnership, bool overwrite=false)
insert new entry into MappedVector
INDEX_TYPE getIndex(KEY_TYPE const &key) const
This class provides the base class/interface for the catalog value objects.
std::unordered_map< std::string, std::unique_ptr< CatalogInterface< BASETYPE, ARGS... > > > CatalogType
This is the type that will be used for the catalog. The catalog is actually instantiated in the BASET...
T & getGroupByPath(string const &path)
Retrieve a group from the hierarchy using a path.
void forSubGroups(LOOKUP_CONTAINER const &subGroupKeys, LAMBDA &&lambda) const
Apply the given functor to subgroups that can be casted to one of specified types.
T const & getGroupByPath(string const &path) const
Retrieve a group from the hierarchy using a path.
virtual void initializePreSubGroups()
Called by Initialize() prior to initializing sub-Groups.
virtual void initialize_postMeshGeneration()
initialization post generation of the mesh.
localIndex capacity() const
Get the "capacity" of the group, which determines the capacity of resizable wrappers.
virtual void postInputInitialization()
virtual localIndex packSize(string_array const &wrapperNames, arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Get the size required to pack a list of indices within a list of wrappers.
void setInputFlags(InputFlags flags)
Set input flags for schema generation.
int sizedFromParent() const
Check whether this Group is resized when its parent is resized.
localIndex pack(buffer_unit_type *&buffer, arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Pack a list of indices for all registered wrappers.
void deregisterGroup(string const &name)
Removes a child group from this group.
Wrapper< TBASE > & registerWrapper(string const &name, wrapperMap::KeyIndex::index_type *const rkey=nullptr)
Create and register a Wrapper around a new object.
T * getGroupPointer(KEY const &key)
Return a pointer to a sub-group of the current Group.
localIndex packSize(arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Get the size required to pack a list of indices for all registered wrappers.
virtual localIndex unpack(buffer_unit_type const *&buffer, arrayView1d< localIndex > &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events, MPI_Op op=MPI_REPLACE)
Unpack a buffer.
InputFlags getInputFlags() const
Get input flags for schema generation.
DataContext const & getDataContext() const
bool hasWrapper(LOOKUP_TYPE const &lookup) const
Check if a wrapper exists.
T & registerGroup(string const &name, T *newObject)
Register a new Group as a sub-group of current Group.
void postInputInitializationRecursive()
Recursively call postInputInitialization() to apply post processing after reading input values.
void processInputFileRecursive(xmlWrapper::xmlDocument &xmlDocument, xmlWrapper::xmlNode &targetNode, xmlWrapper::xmlNodePos const &nodePos)
Same as processInputFileRecursive(xmlWrapper::xmlDocument &, xmlWrapper::xmlNode &) but allow to reus...
Group(Group &&source)=default
Move constructor.
wrapperMap & wrappers()
Get access to the internal wrapper storage.
localIndex getIndexInParent() const
Get the group's index within its parent group.
void processInputFileRecursive(xmlWrapper::xmlDocument &xmlDocument, xmlWrapper::xmlNode &targetNode)
Recursively read values using ProcessInputFile() from the input file and put them into the wrapped va...
T & registerGroup(string const &name, std::unique_ptr< T > newObject)
Register a new Group as a sub-group of current Group.
string dumpWrappersNames() const
Group(string const &name, Group *const parent)
Constructor.
void forWrappers(LAMBDA &&lambda)
Apply the given functor to wrappers that can be cast to one of specified types.
virtual void expandObjectCatalogs()
Expand any catalogs in the data structure.
MappedVector< WrapperBase, WrapperBase *, keyType, indexType > wrapperMap
The template specialization of MappedVector to use for the collection wrappers objects.
virtual void initializePostSubGroups()
Called by Initialize() after to initializing sub-Groups.
virtual void reinit()
Performs re-initialization of certain variable depending on the solver being used.
void setRestartFlags(RestartFlags flags)
Set flags that control restart output of this group.
void enableLogLevelInput()
Wrapper< T > & getWrapper(LOOKUP_TYPE const &index)
Retrieve a Wrapper stored in this group.
WrapperBase & registerWrapper(std::unique_ptr< WrapperBase > wrapper)
Register and take ownership of an existing Wrapper.
void forSubGroupsIndex(LAMBDA &&lambda) const
Apply the given functor to subgroups that can be casted to one of specified types.
string const & getName() const
Get group name.
string dumpSubGroupsNames() const
GEOS_DECLTYPE_AUTO_RETURN getReference(LOOKUP_TYPE const &lookup) const
Look up a wrapper and get reference to wrapped object.
WrapperBase & getWrapperBase(KEY const &key)
Return a reference to a WrapperBase stored in this group.
WrapperBase const & getWrapperBase(KEY const &key) const
Return a reference to a WrapperBase stored in this group.
virtual void registerDataOnMeshRecursive(Group &meshBodies)
Calls RegisterDataOnMesh() recursively.
conduit::Node & getConduitNode()
Return the Conduit node object associated with this group.
void forSubGroups(LAMBDA &&lambda) const
Apply the given functor to subgroups that can be casted to one of specified types.
virtual void initializePostInitialConditionsPostSubGroups()
Called by InitializePostInitialConditions() after to initializing sub-Groups.
void initialize()
Run initialization functions on this and all subgroups.
Group(Group const &)=delete
Deleted copy constructor.
T & registerGroup(subGroupMap::KeyIndex const &keyIndex)
Register a new Group as a sub-group of current Group.
static CatalogInterface::CatalogType & getCatalog()
Get the singleton catalog for this Group.
void forSubGroupsIndex(LAMBDA &&lambda)
Apply the given functor to subgroups that can be casted to one of specified types.
virtual void initializationOrder(string_array &order)
Sets the initialization order for sub-Groups.
RestartFlags getRestartFlags() const
Get flags that control restart output of this group.
void deregisterWrapper(string const &name)
Removes a Wrapper from this group.
std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >, void > addLogLevel()
Append a levelCondition and a log description to the description of the wrapped object given a log in...
void initializePostInitialConditions()
Initialization routine to be called after calling ApplyInitialConditions().
localIndex numSubGroups() const
return the number of sub groups in this Group
indexType numWrappers() const
Return the number of wrappers.
virtual void reserve(indexType const newsize)
Set the new capacity and reserve it in all wrappers that resize with parent.
string dumpInputOptions() const
T & getGroup(KEY const &key)
Return a reference to a sub-group of the current Group.
void loadFromConduit()
Read the group and its wrappers from Conduit.
MappedVector< Group, Group *, keyType, indexType > subGroupMap
The template specialization of MappedVector to use for the collection of sub-Group objects.
Group & getParent()
Access the group's parent.
void finishWriting()
Write the group and its wrappers into Conduit.
virtual void postRestartInitialization()
Performs initialization required after reading from a restart file.
Group(string const &name, conduit::Node &rootNode)
Constructor.
bool hasGroup(string const &name) const
Check whether a sub-group exists.
indexType getWrapperIndex(string const &name) const
bool hasSubGroupOfType() const
Check whether a sub-group exists by type.
static bool applyLambdaToContainer(CONTAINERTYPE &container, LAMBDA &&lambda)
Apply a given functor to a container if the container can be cast to one of the specified types.
void prepareToWrite()
Register the group and its wrappers with Conduit.
T const * getGroupPointer(KEY const &key) const
Return a pointer to a sub-group of the current Group.
virtual bool registerCallback(void *func, const std::type_info &funcType)
Register a callback function on the group.
void forWrappers(LAMBDA &&lambda) const
Apply the given functor to wrappers.
virtual localIndex pack(buffer_unit_type *&buffer, string_array const &wrapperNames, arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Pack a list of indices within a list of wrappers.
localIndex getSubGroupIndex(keyType const &key) const
Get the index of a sub-Group within this group.
Wrapper< T > const & getWrapper(LOOKUP_TYPE const &index) const
Retrieve a Wrapper stored in this group.
T & getReference(LOOKUP_TYPE const &lookup)
Look up a wrapper and get reference to wrapped object.
virtual void registerDataOnMesh(Group &meshBodies)
Register data on mesh entities.
localIndex size() const
Get the "size" of the group, which determines the number of elements in resizable wrappers.
virtual localIndex packSize(string_array const &wrapperNames, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Get the size required to pack a list of wrappers.
Group()=delete
Deleted default constructor.
Wrapper< T > * getWrapperPointer(LOOKUP_TYPE const &index)
Retrieve a Wrapper stored in this group.
T const & getGroup(KEY const &key) const
Return a reference to a sub-group of the current Group.
void forSubGroups(LAMBDA &&lambda)
Apply the given functor to subgroups that can be casted to one of specified types.
std::vector< string > getWrappersNames() const
T & registerGroup(string const &name, string const &catalogName)
Register a new Group as a sub-group of current Group.
integer getLogLevel() const
virtual Group * createChild(string const &childKey, string const &childName)
Creates a new sub-Group using the ObjectCatalog functionality.
void forWrappers(LAMBDA &&lambda) const
Apply the given functor to wrappers that can be cast to one of specified types.
std::vector< string > getSubGroupsNames() const
string getPath() const
Return the path of this Group in the data repository. Starts with '/' followed by the hierarchy of th...
Group & operator=(Group const &)=delete
Deleted copy assignment operator.
void setLogLevel(integer const logLevel)
Set verbosity level.
Group const & getParent() const
Access the group's parent.
conduit::Node const & getConduitNode() const
Return the Conduit node object associated with this group.
void postRestartInitializationRecursive()
Initialization routine to be called after calling reading a restart file.
Group & setSizedFromParent(int val)
Set whether this wrapper is resized when its parent is resized.
DataContext const & getWrapperDataContext(KEY key) const
Group & operator=(Group &&)=delete
Deleted move assignment operator.
virtual localIndex pack(buffer_unit_type *&buffer, string_array const &wrapperNames, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Pack a list of wrappers to a buffer.
virtual ~Group()
Destructor, deletes all Groups and Wrappers owned by this Group.
void forWrappers(LAMBDA &&lambda)
Apply the given functor to wrappers.
subGroupMap const & getSubGroups() const
Get the subgroups object.
void forSubGroups(LOOKUP_CONTAINER const &subGroupKeys, LAMBDA &&lambda)
Apply the given functor to subgroups that can be casted to one of specified types.
void generateDataStructureSkeleton(integer const level)
Build a complete datastructure for schema generation.
virtual void setSchemaDeviations(xmlWrapper::xmlNode schemaRoot, xmlWrapper::xmlNode schemaParent, integer documentationType)
Inform the schema generator of any deviations between the xml and GEOS data structures.
void printDataHierarchy(integer indent=0) const
Prints the data hierarchy recursively.
wrapperMap const & wrappers() const
Get access to the internal wrapper storage.
T & registerGroup(string const &name)
Register a new Group as a sub-group of current Group.
virtual void initializePostInitialConditionsPreSubGroups()
Called by InitializePostInitialConditions() prior to initializing sub-Groups.
Wrapper< T > const * getWrapperPointer(LOOKUP_TYPE const &index) const
Retrieve a Wrapper stored in this group.
subGroupMap & getSubGroups()
Get the subgroups object.
virtual void resize(localIndex const newSize)
Resize the group and all contained wrappers that resize with parent.
Base class for all wrappers containing common operations.
int sizedFromParent() const
Check whether this wrapper is resized when its parent is resized.
Wrapper< T > & setInputFlag(InputFlags const input)
Set the InputFlag of the wrapper.
std::enable_if_t< !traits::is_array< U > &&DefaultValue< U >::has_default_value, Wrapper< T > & > setApplyDefaultValue(typename DefaultValue< U >::value_type const &defaultVal)
Set and apply for default value.
Wrapper< T > & setDescription(string const &description)
Set the description string of the wrapper.
virtual void resize(int ndims, localIndex const *const dims) override
Calls T::resize( num_dims, dims )
@ OPTIONAL
Optional in input.
Group::wrapperMap::KeyIndex ViewKey
Type alias for KeyIndexT type used for wrapper lookups.
localIndex indexType
The default index type for entries the hierarchy.
string keyType
The default key type for entries in the hierarchy.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
array1d< string > string_array
A 1-dimensional array of geos::string types.
std::string string
String type.
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
std::int32_t integer
Signed integer type.
signed char buffer_unit_type
Type stored in communication buffers.
Array< T, 1 > array1d
Alias for 1D array.
Exception class used to report errors from type conversion.
Structure to hold scoped key names.
static constexpr char const * logLevelString()