SST  15.1.0
StructuralSimulationToolkit
statoutputhdf5.h
1 // Copyright 2009-2025 NTESS. Under the terms
2 // of Contract DE-NA0003525 with NTESS, the U.S.
3 // Government retains certain rights in this software.
4 //
5 // Copyright (c) 2009-2025, NTESS
6 // All rights reserved.
7 //
8 // This file is part of the SST software package. For license
9 // information, see the LICENSE file in the top level directory of the
10 // distribution.
11 
12 #ifndef SST_CORE_STATAPI_STATOUTPUTHDF5_H
13 #define SST_CORE_STATAPI_STATOUTPUTHDF5_H
14 
15 #include "sst/core/sst_types.h"
16 #include "sst/core/statapi/statoutput.h"
17 #include "sst/core/warnmacros.h"
18 
19 DISABLE_WARN_MISSING_OVERRIDE
20 #include "H5Cpp.h"
21 REENABLE_WARNING
22 
23 #include <cstddef>
24 #include <cstdint>
25 #include <map>
26 #include <string>
27 #include <vector>
28 
29 namespace SST::Statistics {
30 
31 /**
32  \class StatisticOutputHDF5
33 
34  The class for statistics output to a comma separated file.
35 */
37 {
38 public:
39  SST_ELI_REGISTER_DERIVED(
42  "sst",
43  "statoutputhdf5",
44  SST_ELI_ELEMENT_VERSION(1,0,0),
45  "Output to an HDF5 file")
46 
47  SST_ELI_DOCUMENT_PARAMS(
48  { "filepath", "Filepath for the output file", "./StatisticOutput.h5"}
49  )
50 
51  /** Construct a StatOutputHDF5
52  * @param outputParameters - Parameters used for this Statistic Output
53  */
54  explicit StatisticOutputHDF5(Params& outputParameters);
55 
56  bool acceptsGroups() const override { return true; }
57 
58  void serialize_order(SST::Core::Serialization::serializer& ser) override;
59 
60  ImplementSerializable(SST::Statistics::StatisticOutputHDF5)
61 
62 private:
63  /** Perform a check of provided parameters
64  * @return True if all required parameters and options are acceptable
65  */
66  bool checkOutputParameters() override;
67 
68  void startRegisterFields(StatisticBase* stat) override;
69  void implRegisteredField(fieldHandle_t fieldHandle) override;
70  void stopRegisterFields() override;
71 
72  void startRegisterGroup(StatisticGroup* group) override;
73  void stopRegisterGroup() override;
74 
75  /** Indicate to Statistic Output that simulation started.
76  * Statistic output may perform any startup code here as necessary.
77  */
78  void startOfSimulation() override;
79 
80  /** Indicate to Statistic Output that simulation ended.
81  * Statistic output may perform any shutdown code here as necessary.
82  */
83  void endOfSimulation() override;
84 
85  /** Implementation function for the start of output.
86  * This will be called by the Statistic Processing Engine to indicate that
87  * a Statistic is about to send data to the Statistic Output for processing.
88  * @param statistic - Pointer to the statistic object than the output can
89  * retrieve data from.
90  */
91  void implStartOutputEntries(StatisticBase* statistic) override;
92 
93  /** Implementation function for the end of output.
94  * This will be called by the Statistic Processing Engine to indicate that
95  * a Statistic is finished sending data to the Statistic Output for processing.
96  * The Statistic Output can perform any output related functions here.
97  */
98  void implStopOutputEntries() override;
99 
100  void startOutputGroup(StatisticGroup* group) override;
101  void stopOutputGroup() override;
102 
103  /** Implementation functions for output.
104  * These will be called by the statistic to provide Statistic defined
105  * data to be output.
106  * @param fieldHandle - The handle to the registered statistic field.
107  * @param data - The data related to the registered field to be output.
108  */
109  void outputField(fieldHandle_t fieldHandle, int32_t data) override;
110  void outputField(fieldHandle_t fieldHandle, uint32_t data) override;
111  void outputField(fieldHandle_t fieldHandle, int64_t data) override;
112  void outputField(fieldHandle_t fieldHandle, uint64_t data) override;
113  void outputField(fieldHandle_t fieldHandle, float data) override;
114  void outputField(fieldHandle_t fieldHandle, double data) override;
115 
116 protected:
117  StatisticOutputHDF5(); // For serialization
118 
119 private:
120  union StatData_u {
121  int32_t i32;
122  uint32_t u32;
123  int64_t i64;
124  uint64_t u64;
125  float f;
126  double d;
127  };
128 
129  class DataSet
130  {
131  public:
132  explicit DataSet(H5::H5File* file) :
133  file(file)
134  {}
135  virtual ~DataSet() {}
136  H5::H5File* getFile() { return file; }
137  virtual bool isGroup() const = 0;
138 
139  virtual void setCurrentStatistic(StatisticBase* UNUSED(stat)) {}
140  virtual void registerField(StatisticFieldInfo* fi) = 0;
141  virtual void finalizeCurrentStatistic() = 0;
142 
143  virtual void beginGroupRegistration(StatisticGroup* UNUSED(group)) {}
144  virtual void finalizeGroupRegistration() {}
145 
146  virtual void startNewGroupEntry(Cycle_t UNUSED(cycle)) {}
147  virtual void finishGroupEntry() {}
148 
149  virtual void startNewEntry(StatisticBase* stat, Cycle_t cycle) = 0;
150  virtual StatData_u& getFieldLoc(fieldHandle_t fieldHandle) = 0;
151  virtual void finishEntry() = 0;
152 
153  protected:
154  H5::H5File* file;
155  };
156 
157  class StatisticInfo : public DataSet
158  {
159  StatisticBase* statistic;
160  std::vector<fieldHandle_t> indexMap;
161  std::vector<StatData_u> currentData;
162  std::vector<fieldType_t> typeList;
163  std::vector<std::string> fieldNames;
164 
165  H5::DataSet* dataset;
166  H5::CompType* memType;
167 
168  hsize_t nEntries;
169 
170  public:
171  StatisticInfo(StatisticBase* stat, H5::H5File* file) :
172  DataSet(file),
173  statistic(stat),
174  nEntries(0)
175  {
176  typeList.push_back(StatisticFieldType<uint64_t>::id());
177  indexMap.push_back(-1);
178  fieldNames.push_back("SimTime");
179  }
180  ~StatisticInfo()
181  {
182  if ( dataset ) delete dataset;
183  if ( memType ) delete memType;
184  }
185  void registerField(StatisticFieldInfo* fi) override;
186  void finalizeCurrentStatistic() override;
187 
188  bool isGroup() const override { return false; }
189  void startNewEntry(StatisticBase* stat, Cycle_t cycle) override;
190  StatData_u& getFieldLoc(fieldHandle_t fieldHandle) override;
191  void finishEntry() override;
192  };
193 
194  class GroupInfo : public DataSet
195  {
196  struct GroupStat
197  {
198  GroupInfo* gi;
199  std::string statPath;
200 
201  H5::DataSet* dataset;
202  H5::CompType* memType;
203 
204  hsize_t nEntries;
205 
206  std::vector<std::string> registeredFields; /* fi->uniqueName */
207  std::vector<fieldType_t> typeList;
208  std::map<fieldHandle_t, size_t> handleIndexMap;
209 
210  std::vector<StatData_u> currentData;
211  size_t currentCompOffset;
212 
213  GroupStat(GroupInfo* group, StatisticBase* stat);
214  void finalizeRegistration();
215  static std::string getStatName(StatisticBase* stat);
216 
217  void startNewGroupEntry();
218 
219  void startNewEntry(size_t componentIndex, StatisticBase* stat);
220  StatData_u& getFieldLoc(fieldHandle_t fieldHandle);
221  void finishEntry();
222 
223  void finishGroupEntry();
224  };
225 
226  hsize_t nEntries;
227  std::map<std::string, GroupStat> m_statGroups;
228  GroupStat* m_currentStat;
229  StatisticGroup* m_statGroup;
230  std::vector<BaseComponent*> m_components;
231  H5::DataSet* timeDataSet;
232 
233  public:
234  GroupInfo(StatisticGroup* group, H5::H5File* file);
235  void beginGroupRegistration(StatisticGroup* UNUSED(group)) override {}
236  void setCurrentStatistic(StatisticBase* stat) override;
237  void registerField(StatisticFieldInfo* fi) override;
238  void finalizeCurrentStatistic() override;
239  void finalizeGroupRegistration() override;
240 
241  bool isGroup() const override { return true; }
242  void startNewEntry(StatisticBase* stat, Cycle_t cycle) override;
243  StatData_u& getFieldLoc(fieldHandle_t fieldHandle) override { return m_currentStat->getFieldLoc(fieldHandle); }
244  void finishEntry() override;
245 
246  void startNewGroupEntry(Cycle_t cycle) override;
247  void finishGroupEntry() override;
248  size_t getNumComponents() const { return m_components.size(); }
249 
250  const std::string& getName() const;
251  };
252 
253  H5::H5File* m_hFile;
254  DataSet* m_currentDataSet;
255  std::map<StatisticBase*, StatisticInfo*> m_statistics;
256  std::map<std::string, GroupInfo> m_statGroups;
257 
258  StatisticInfo* initStatistic(StatisticBase* statistic);
259  StatisticInfo* getStatisticInfo(StatisticBase* statistic);
260 };
261 
262 } // namespace SST::Statistics
263 
264 #endif // SST_CORE_STATAPI_STATOUTPUTHDF5_H
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:42
void outputField(fieldHandle_t fieldHandle, int32_t data) override
Implementation functions for output.
Definition: statoutputhdf5.cc:153
Forms the base class for statistics output generation within the SST core.
Definition: statoutput.h:52
Forms the base class for statistics gathering within SST.
Definition: statbase.h:49
ImplementSerializable(SST::Statistics::StatisticOutputHDF5) private void startRegisterFields(StatisticBase *stat) override
Perform a check of provided parameters.
Definition: statoutputhdf5.cc:65
void implStartOutputEntries(StatisticBase *statistic) override
Implementation function for the start of output.
Definition: statoutputhdf5.cc:123
virtual bool checkOutputParameters()=0
Have the Statistic Output check its parameters.
fieldHandle_t registerField(const char *fieldName)
Register a field to be output (templated function)
Definition: statoutput.h:267
bool acceptsGroups() const override
True if this StatOutput can handle StatisticGroups.
Definition: statoutputhdf5.h:56
void implStopOutputEntries() override
Implementation function for the end of output.
Definition: statoutputhdf5.cc:130
Definition: statoutput.h:170
The class for statistics output to a comma separated file.
Definition: statoutputhdf5.h:36
void startOfSimulation() override
Indicate to Statistic Output that simulation started.
Definition: statoutputhdf5.cc:110
Parameter store.
Definition: params.h:63
void endOfSimulation() override
Indicate to Statistic Output that simulation ended.
Definition: statoutputhdf5.cc:114
Definition: elementinfo.h:44
Definition: statgroup.h:31