GEOS
WrapperBase.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
18 #ifndef GEOS_DATAREPOSITORY_WRAPPERBASE_HPP_
19 #define GEOS_DATAREPOSITORY_WRAPPERBASE_HPP_
20 
21 #include "common/DataTypes.hpp"
22 #include "common/GEOS_RAJA_Interface.hpp"
23 #include "common/Span.hpp"
24 #include "InputFlags.hpp"
25 #include "xmlWrapper.hpp"
26 #include "RestartFlags.hpp"
27 #include "HistoryDataSpec.hpp"
28 #include "DataContext.hpp"
29 
30 #if defined(GEOS_USE_PYGEOSX)
31 #include "LvArray/src/python/python.hpp"
32 #endif
33 
34 #include <string>
35 #include <memory>
36 #include <set>
37 
38 namespace conduit
39 {
40 class Node;
41 }
42 
43 
44 namespace geos
45 {
46 namespace dataRepository
47 {
48 
49 class Group;
50 
56 {
57 public:
58 
63 
70  explicit WrapperBase( string const & name,
71  Group & parent,
72  string const & rtTypeName );
73 
75  WrapperBase() = delete;
76  WrapperBase( WrapperBase const & ) = delete;
77  WrapperBase( WrapperBase && ) = delete;
78  WrapperBase & operator=( WrapperBase const & ) = delete;
79  WrapperBase & operator=( WrapperBase && ) = delete;
81 
85  virtual ~WrapperBase();
86 
88 
96 
101  virtual localIndex size() const = 0;
102 
106  virtual void const * voidPointer() const = 0;
107 
112  virtual localIndex elementByteSize() const = 0;
113 
117  virtual size_t bytesAllocated() const = 0;
118 
119 
125  virtual void resize( int num_dims, localIndex const * const dims ) = 0;
126 
131  virtual void reserve( localIndex const newCapacity ) = 0;
132 
136  virtual localIndex capacity() const = 0;
137 
142  virtual void resize( localIndex newsize ) = 0;
143 
147  void resize();
148 
154  virtual void copy( localIndex const sourceIndex, localIndex const destIndex ) = 0;
155 
160  virtual void erase( std::set< localIndex > const & indicesToErase ) = 0;
161 
167  virtual void move( LvArray::MemorySpace const space, bool const touch ) const = 0;
168 
172  virtual Regex const & getTypeRegex() const = 0;
173 
177  string const & getRTTypeName() const
178  { return m_rtTypeName; }
179 
187  {
188  m_rtTypeName = rtTypeName;
189  return *this;
190  }
191 
193 
198  virtual bool hasDefaultValue() const = 0;
199 
204  virtual string getDefaultValueString() const = 0;
205 
212  virtual bool processInputFile( xmlWrapper::xmlNode const & targetNode,
213  xmlWrapper::xmlNodePos const & nodePos ) = 0;
214 
223  virtual void addBlueprintField( conduit::Node & fields,
224  string const & name,
225  string const & topology,
226  std::vector< string > const & componentNames = {} ) const = 0;
227 
234  virtual void populateMCArray( conduit::Node & node, std::vector< string > const & componentNames = {} ) const = 0;
235 
244  virtual std::unique_ptr< WrapperBase > averageOverSecondDim( string const & name, Group & group ) const = 0;
245 
250 
254  virtual void registerToWrite() const = 0;
255 
259  virtual void finishWriting() const = 0;
260 
265  virtual bool loadFromConduit() = 0;
266 
268 
274  virtual HistoryMetadata getHistoryMetadata( localIndex const packCount ) const = 0;
275 
282 
288  virtual bool isPackable( bool onDevice ) const = 0;
289 
302  template< bool DO_PACKING >
304  bool withMetadata,
305  bool onDevice,
306  parallelDeviceEvents & events ) const
307  {
308  return DO_PACKING ? packPrivate( buffer, withMetadata, onDevice, events ) : packSizePrivate( withMetadata, onDevice, events );
309  }
310 
324  template< bool DO_PACKING >
326  arrayView1d< localIndex const > const & packList,
327  bool withMetadata,
328  bool onDevice,
329  parallelDeviceEvents & events ) const
330  {
331  return DO_PACKING ? packByIndexPrivate( buffer, packList, withMetadata, onDevice, events ) : packByIndexSizePrivate( packList, withMetadata, onDevice, events );
332  }
333 
345  virtual localIndex unpack( buffer_unit_type const * & buffer,
346  bool withMetadata,
347  bool onDevice,
348  parallelDeviceEvents & events ) = 0;
349 
363  virtual localIndex unpackByIndex( buffer_unit_type const * & buffer,
364  arrayView1d< localIndex const > const & unpackIndices,
365  bool withMetadata,
366  bool onDevice,
367  parallelDeviceEvents & events,
368  MPI_Op op=MPI_REPLACE ) = 0;
369 
371 
376 
381  int sizedFromParent() const
382  {
383  return m_sizedFromParent;
384  }
385 
392  {
393  m_sizedFromParent = val;
394  return *this;
395  }
396 
402 
409  {
410  m_restart_flags = flags;
411  return *this;
412  }
413 
418  PlotLevel getPlotLevel() const { return m_plotLevel; }
419 
426  {
427  m_plotLevel = flag;
428  return *this;
429  }
430 
435  string const & getName() const
436  {
437  return m_name;
438  }
439 
444  string getPath() const;
445 
450  DataContext const & getDataContext() const
451  { return *m_dataContext; }
452 
457  { return *m_parent; }
458 
462  Group const & getParent() const
463  { return *m_parent; }
464 
471  {
472  if( input == InputFlags::OPTIONAL || input == InputFlags::REQUIRED )
473  {
474  this->setSizedFromParent( 0 );
476  }
477  m_inputFlag = input;
478 
479  return *this;
480  }
481 
487  {
488  return m_inputFlag;
489  }
490 
497  {
499  }
500 
506  WrapperBase & setDescription( string const & description )
507  {
508  m_description = description;
509  return *this;
510  }
511 
517  WrapperBase & appendDescription( string const & description )
518  {
519  m_description += description;
520  return *this;
521  }
522 
527  string const & getDescription() const
528  {
529  return m_description;
530  }
531 
536  std::set< string > const & getRegisteringObjects() const
537  {
538  return m_registeringObjects;
539  }
540 
546  WrapperBase & setRegisteringObjects( string const & objectName )
547  {
548  m_registeringObjects.insert( objectName );
549  return *this;
550  }
551 
553 
558 
563  virtual void copyWrapperAttributes( WrapperBase const & source );
564 
574  virtual std::unique_ptr< WrapperBase > clone( string const & name, Group & parent ) = 0;
575 
580  virtual void copyData( WrapperBase const & source ) = 0;
581 
586  virtual void copyWrapper( WrapperBase const & source ) = 0;
587 
592  virtual std::type_info const & getTypeId() const = 0;
593 
598  virtual int numArrayDims() const = 0;
599 
604  virtual localIndex numArrayComp() const = 0;
605 
619  virtual WrapperBase & setDimLabels( integer dim, Span< string const > labels ) = 0;
620 
628  virtual Span< string const > getDimLabels( integer dim ) const = 0;
629 
631 
632 #if defined(USE_TOTALVIEW_OUTPUT)
638  virtual string totalviewTypeName() const = 0;
639 
645  virtual int setTotalviewDisplay() const;
646 // static int TV_ttf_display_type( const WrapperBase * wrapper);
647 #endif
648 
649 #if defined(GEOS_USE_PYGEOSX)
654  virtual PyObject * createPythonObject( ) = 0;
655 #endif
656 
657 protected:
658 
660 
661  conduit::Node & getConduitNode()
662  {
663  return m_conduitNode;
664  }
665 
667 
673  void createDataContext( xmlWrapper::xmlNode const & targetNode,
674  xmlWrapper::xmlNodePos const & nodePos );
675 
676 protected:
677 
679  string m_name;
680 
683 
686 
689 
692 
695 
698 
701 
703  string m_rtTypeName;
704 
706  std::set< string > m_registeringObjects;
707 
709  conduit::Node & m_conduitNode;
710 
712  std::unique_ptr< DataContext > m_dataContext;
713 
714 private:
715 
727  virtual localIndex packPrivate( buffer_unit_type * & buffer, bool withMetadata, bool onDevice, parallelDeviceEvents & events ) const = 0;
728 
740  virtual localIndex packSizePrivate( bool withMetadata, bool onDevice, parallelDeviceEvents & events ) const = 0;
741 
742 
755  virtual localIndex packByIndexPrivate( buffer_unit_type * & buffer,
756  arrayView1d< localIndex const > const & packList,
757  bool withMetadata,
758  bool onDevice,
759  parallelDeviceEvents & events ) const = 0;
760 
772  virtual localIndex packByIndexSizePrivate( arrayView1d< localIndex const > const & packList,
773  bool withMetadata,
774  bool onDevice,
775  parallelDeviceEvents & events ) const = 0;
776 };
777 
778 }
779 }
780 
781 #endif /* GEOS_DATAREPOSITORY_WRAPPERBASE_HPP_ */
A minimal class to specify information about time history information being collected and output.
Lightweight non-owning wrapper over a contiguous range of elements.
Definition: Span.hpp:42
Base class for all wrappers containing common operations.
Definition: WrapperBase.hpp:56
InputFlags getInputFlag() const
Get the InputFlag of the wrapper.
virtual localIndex unpack(buffer_unit_type const *&buffer, bool withMetadata, bool onDevice, parallelDeviceEvents &events)=0
Unpack the entire wrapped object from a buffer.
virtual bool hasDefaultValue() const =0
Return true iff this wrapper has a valid default value.
string const & getName() const
Get name of the wrapper.
string const & getDescription() const
Get the description string of the wrapper.
virtual localIndex size() const =0
Calls T::size()
virtual localIndex numArrayComp() const =0
Return the number of components in a multidimensional array.
localIndex packByIndex(buffer_unit_type *&buffer, arrayView1d< localIndex const > const &packList, bool withMetadata, bool onDevice, parallelDeviceEvents &events) const
Concrete implementation of the packing by index method.
PlotLevel m_plotLevel
Flag to store the plotLevel.
std::set< string > const & getRegisteringObjects() const
Get the list of names of groups that registered this wrapper.
string const & getRTTypeName() const
virtual void populateMCArray(conduit::Node &node, std::vector< string > const &componentNames={}) const =0
Push the data in the wrapper into a Conduit Blueprint mcarray.
virtual bool processInputFile(xmlWrapper::xmlNode const &targetNode, xmlWrapper::xmlNodePos const &nodePos)=0
Initialize the wrapper from the input xml node.
int sizedFromParent() const
Check whether this wrapper is resized when its parent is resized.
RestartFlags getRestartFlags() const
Get the RestartFlags of the wrapper.
WrapperBase & setInputFlag(InputFlags const input)
Set the InputFlag of the wrapper.
virtual void resize(localIndex newsize)=0
Calls T::resize(newsize) if it exists.
WrapperBase(string const &name, Group &parent, string const &rtTypeName)
Constructor.
conduit::Node & m_conduitNode
A reference to the corresponding conduit::Node.
virtual void move(LvArray::MemorySpace const space, bool const touch) const =0
Calls T::move(space, touch)
Group * m_parent
Pointer to Group that holds this WrapperBase.
virtual void erase(std::set< localIndex > const &indicesToErase)=0
Calls T::erase(indicesToErase)
virtual void finishWriting() const =0
Write the wrapped data into Conduit.
int m_sizedFromParent
Integer to indicate whether or not this wrapped object should be resized when m_parent is resized.
DataContext const & getDataContext() const
WrapperBase & setDescription(string const &description)
Set the description string of the wrapper.
virtual void reserve(localIndex const newCapacity)=0
Calls T::reserve( newCapacity ) if it exists, otherwise a no-op.
virtual WrapperBase & setDimLabels(integer dim, Span< string const > labels)=0
Set dimension labels for an array.
virtual void copyData(WrapperBase const &source)=0
Copy the the data contained in another wrapper into this wrapper.
virtual bool loadFromConduit()=0
Read the wrapped data from Conduit.
WrapperBase & setSizedFromParent(int val)
Set whether this wrapper is resized when its parent is resized.
virtual void resize(int num_dims, localIndex const *const dims)=0
Calls T::resize( num_dims, dims )
virtual localIndex elementByteSize() const =0
virtual void copyWrapperAttributes(WrapperBase const &source)
Copy attributes from another wrapper.
WrapperBase & setRegisteringObjects(string const &objectName)
Add a new name to the list of groups that register this wrapper.
virtual void registerToWrite() const =0
Register the wrapper's data for writing with Conduit.
WrapperBase & setRestartFlags(RestartFlags flags)
Set the RestartFlags of the wrapper.
Group const & getParent() const
string m_rtTypeName
A string regex to validate the input values string to parse for the wrapped object.
WrapperBase & appendDescription(string const &description)
Add up more text to the existing description string of the wrapper.
virtual localIndex unpackByIndex(buffer_unit_type const *&buffer, arrayView1d< localIndex const > const &unpackIndices, bool withMetadata, bool onDevice, parallelDeviceEvents &events, MPI_Op op=MPI_REPLACE)=0
For indexable types, unpack selected indices of wrapped object from a buffer.
virtual localIndex capacity() const =0
std::unique_ptr< DataContext > m_dataContext
A DataContext object that can helps to contextualize this Group.
virtual std::unique_ptr< WrapperBase > averageOverSecondDim(string const &name, Group &group) const =0
Create a new Wrapper with values averaged over the second dimension.
void createDataContext(xmlWrapper::xmlNode const &targetNode, xmlWrapper::xmlNodePos const &nodePos)
Sets the m_dataContext to a DataFileContext by retrieving the attribute file line.
bool getSuccessfulReadFromInput() const
Returns flag that indicates whether the contents of the wrapper have been successfully read from the ...
virtual size_t bytesAllocated() const =0
string m_description
A string description of the wrapped object.
PlotLevel getPlotLevel() const
Get PlotLevel for this wrapper.
void resize()
Calls resize(newsize) where newsize is taken from the parent Group.
virtual ~WrapperBase()
Default destructor.
virtual void copy(localIndex const sourceIndex, localIndex const destIndex)=0
Calls T::copy(sourceIndex, destIndex)
bool m_successfulReadFromInput
Flag to indicate if wrapped object was successfully read from input.
virtual bool isPackable(bool onDevice) const =0
Check whether wrapped type is can be packed into a buffer on host or device.
std::set< string > m_registeringObjects
A vector of the names of the objects that created this Wrapper.
virtual Regex const & getTypeRegex() const =0
virtual string getDefaultValueString() const =0
Return a string representing the default value.
virtual std::type_info const & getTypeId() const =0
Get the typeid of T.
virtual void const * voidPointer() const =0
virtual void copyWrapper(WrapperBase const &source)=0
Copies the contents of a Wrapper into *this.
virtual int numArrayDims() const =0
Return the number of dimensions of the array.
WrapperBase & setRTTypeName(string_view rtTypeName)
override the rtType to use when parsing an input value to the wrapped object. It can be useful to cha...
virtual HistoryMetadata getHistoryMetadata(localIndex const packCount) const =0
Get a description of the wrapped data for time history collection/output.
virtual Span< string const > getDimLabels(integer dim) const =0
Get dimension labels of an array.
localIndex pack(buffer_unit_type *&buffer, bool withMetadata, bool onDevice, parallelDeviceEvents &events) const
Concrete implementation of the packing method.
InputFlags m_inputFlag
Flag to store if this wrapped object should be read from input.
string m_name
Name of the object that is being wrapped.
WrapperBase & setPlotLevel(PlotLevel const flag)
Set the PlotLevel of the wrapper.
virtual void addBlueprintField(conduit::Node &fields, string const &name, string const &topology, std::vector< string > const &componentNames={}) const =0
Push the data in the wrapper into a Conduit blueprint field.
RestartFlags m_restart_flags
Flag to determine the restart behavior for this wrapped object.
string getPath() const
Return the path to this Wrapper in the data repository.
virtual std::unique_ptr< WrapperBase > clone(string const &name, Group &parent)=0
Creates a clone of *this WrapperBase.
@ OPTIONAL
Optional in input.
@ REQUIRED
Required in input.
pugi::xml_node xmlNode
Definition: xmlWrapper.hpp:59
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:180
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:85
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
@ Node
location is node (like displacements in finite elements)
signed char buffer_unit_type
Type stored in communication buffers.
Definition: DataTypes.hpp:109
std::string_view string_view
String type.
Definition: DataTypes.hpp:94