SST 16.0.0
Structural Simulation Toolkit
statoutputhdf5.h
1// Copyright 2009-2026 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-2026, 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
19DISABLE_WARN_MISSING_OVERRIDE
20#include "H5Cpp.h"
21REENABLE_WARNING
22
23#include <cstddef>
24#include <cstdint>
25#include <map>
26#include <string>
27#include <vector>
28
29namespace SST::Statistics {
30
31/**
32 \class StatisticOutputHDF5
33
34 The class for statistics output to a comma separated file.
35*/
37{
38public:
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
62private:
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
116protected:
117 StatisticOutputHDF5(); // For serialization
118
119private:
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:43
Parameter store.
Definition params.h:65
Forms the base class for statistics gathering within SST.
Definition statbase.h:51
ImplementVirtualSerializable(SST::Statistics::StatisticFieldsOutput) protected StatisticFieldsOutput()
Construct a base StatisticOutput.
Definition statoutput.h:294
Definition statgroup.h:32
The class for statistics output to a comma separated file.
Definition statoutputhdf5.h:37
StatisticOutputHDF5(Params &outputParameters)
Construct a StatOutputHDF5.
Definition statoutputhdf5.cc:26
ImplementSerializable(SST::Statistics::StatisticOutputHDF5) private void startRegisterFields(StatisticBase *stat) override
Perform a check of provided parameters.
Definition statoutputhdf5.cc:65
void endOfSimulation() override
Indicate to Statistic Output that simulation ended.
Definition statoutputhdf5.cc:114
void startOfSimulation() override
Indicate to Statistic Output that simulation started.
Definition statoutputhdf5.cc:110
void implStartOutputEntries(StatisticBase *statistic) override
Implementation function for the start of output.
Definition statoutputhdf5.cc:123
void outputField(fieldHandle_t fieldHandle, int32_t data) override
Implementation functions for output.
Definition statoutputhdf5.cc:153
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
Forms the base class for statistics output generation within the SST core.
Definition statoutput.h:54
virtual bool checkOutputParameters()=0
Have the Statistic Output check its parameters.