43 SST_ELI_ELEMENT_VERSION(1,0,0),
44 "Output to an HDF5 file")
49 explicit StatisticOutputHDF5(
Params& outputParameters);
67 void implRegisteredField(fieldHandle_t fieldHandle)
override;
68 void stopRegisterFields()
override;
71 void stopRegisterGroup()
override;
99 void stopOutputGroup()
override;
107 void outputField(fieldHandle_t fieldHandle, int32_t data)
override;
108 void outputField(fieldHandle_t fieldHandle, uint32_t data)
override;
109 void outputField(fieldHandle_t fieldHandle, int64_t data)
override;
110 void outputField(fieldHandle_t fieldHandle, uint64_t data)
override;
111 void outputField(fieldHandle_t fieldHandle,
float data)
override;
112 void outputField(fieldHandle_t fieldHandle,
double data)
override;
130 explicit DataSet(H5::H5File* file) :
133 virtual ~DataSet() {}
134 H5::H5File* getFile() {
return file; }
135 virtual bool isGroup()
const = 0;
137 virtual void setCurrentStatistic(StatisticBase* UNUSED(stat)) {}
138 virtual void registerField(StatisticFieldInfo* fi) = 0;
139 virtual void finalizeCurrentStatistic() = 0;
141 virtual void beginGroupRegistration(StatisticGroup* UNUSED(group)) {}
142 virtual void finalizeGroupRegistration() {}
144 virtual void startNewGroupEntry(Cycle_t UNUSED(cycle)) {}
145 virtual void finishGroupEntry() {}
147 virtual void startNewEntry(StatisticBase* stat, Cycle_t cycle) = 0;
148 virtual StatData_u& getFieldLoc(fieldHandle_t fieldHandle) = 0;
149 virtual void finishEntry() = 0;
155 class StatisticInfo :
public DataSet
157 StatisticBase* statistic;
158 std::vector<fieldHandle_t> indexMap;
159 std::vector<StatData_u> currentData;
160 std::vector<fieldType_t> typeList;
161 std::vector<std::string> fieldNames;
163 H5::DataSet* dataset;
164 H5::CompType* memType;
169 StatisticInfo(StatisticBase* stat, H5::H5File* file) :
174 typeList.push_back(StatisticFieldType<uint64_t>::id());
175 indexMap.push_back(-1);
176 fieldNames.push_back(
"SimTime");
180 if ( dataset )
delete dataset;
181 if ( memType )
delete memType;
183 void registerField(StatisticFieldInfo* fi)
override;
184 void finalizeCurrentStatistic()
override;
186 bool isGroup()
const override {
return false; }
187 void startNewEntry(StatisticBase* stat, Cycle_t cycle)
override;
188 StatData_u& getFieldLoc(fieldHandle_t fieldHandle)
override;
189 void finishEntry()
override;
192 class GroupInfo :
public DataSet
197 std::string statPath;
199 H5::DataSet* dataset;
200 H5::CompType* memType;
204 std::vector<std::string> registeredFields;
205 std::vector<fieldType_t> typeList;
206 std::map<fieldHandle_t, size_t> handleIndexMap;
208 std::vector<StatData_u> currentData;
209 size_t currentCompOffset;
211 GroupStat(GroupInfo* group, StatisticBase* stat);
212 void finalizeRegistration();
213 static std::string getStatName(StatisticBase* stat);
215 void startNewGroupEntry();
217 void startNewEntry(
size_t componentIndex, StatisticBase* stat);
218 StatData_u& getFieldLoc(fieldHandle_t fieldHandle);
221 void finishGroupEntry();
225 std::map<std::string, GroupStat> m_statGroups;
226 GroupStat* m_currentStat;
227 StatisticGroup* m_statGroup;
228 std::vector<BaseComponent*> m_components;
229 H5::DataSet* timeDataSet;
232 GroupInfo(StatisticGroup* group, H5::H5File* file);
233 void beginGroupRegistration(StatisticGroup* UNUSED(group))
override {}
234 void setCurrentStatistic(StatisticBase* stat)
override;
235 void registerField(StatisticFieldInfo* fi)
override;
236 void finalizeCurrentStatistic()
override;
237 void finalizeGroupRegistration()
override;
239 bool isGroup()
const override {
return true; }
240 void startNewEntry(StatisticBase* stat, Cycle_t cycle)
override;
241 StatData_u& getFieldLoc(fieldHandle_t fieldHandle)
override {
return m_currentStat->getFieldLoc(fieldHandle); }
242 void finishEntry()
override;
244 void startNewGroupEntry(Cycle_t cycle)
override;
245 void finishGroupEntry()
override;
246 size_t getNumComponents()
const {
return m_components.size(); }
248 const std::string& getName()
const;
252 DataSet* m_currentDataSet;
253 std::map<StatisticBase*, StatisticInfo*> m_statistics;
254 std::map<std::string, GroupInfo> m_statGroups;
256 StatisticInfo* initStatistic(StatisticBase* statistic);
257 StatisticInfo* getStatisticInfo(StatisticBase* statistic);