50#define _LARGEFILE_SOURCE64
51#define _FILE_OFFSET_BITS 64
53#include "brains/Stats.hpp"
54#include "io/StatWriter.hpp"
55#include "utils/Revision.hpp"
56#include "utils/simError.h"
62 StatWriter::StatWriter(
const std::string& filename,
Stats* stats) :
68 statfile_.open(filename.c_str(), std::ios::out | std::ios::trunc);
71 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
72 "Could not open \"%s\" for stat output.\n", filename.c_str());
78 version.assign(
"## Last run using OpenMD version: ");
79 version.append(OPENMD_VERSION_MAJOR);
81 version.append(OPENMD_VERSION_MINOR);
84 std::string rev(revision, strnlen(revision, 40));
85 rev.append(40 - rev.length(),
' ');
86 version.append(
" revision: ");
91 version.append(
"RELEASE");
99 snprintf(checkPointMsg, MAX_SIM_ERROR_MSG_LENGTH,
100 "Sucessfully opened output file for stating.\n");
105 StatWriter::~StatWriter() {
107 if (worldRank == 0) {
117 void StatWriter::writeTitle() {
118 Stats::StatsBitSet mask = stats_->getStatsMask();
121 if (worldRank == 0) {
125 statfile_ << version << std::endl;
128 for (
unsigned int i = 0; i < mask.size(); ++i) {
130 statfile_ <<
"\t" << stats_->getTitle(i) <<
"(" << stats_->getUnits(i)
134 statfile_ << std::endl;
141 void StatWriter::writeStat() {
143 if (worldRank == 0) {
146 Stats::StatsBitSet mask = stats_->getStatsMask();
147 statfile_.precision(stats_->getPrecision());
149 for (
unsigned int i = 0; i < mask.size(); ++i) {
151 if (stats_->getDataType(i) ==
"RealType")
153 else if (stats_->getDataType(i) ==
"Vector3d")
155 else if (stats_->getDataType(i) ==
"potVec")
157 else if (stats_->getDataType(i) ==
"Mat3x3d")
159 else if (stats_->getDataType(i) ==
"Array2d")
162 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
163 "StatWriter found an unknown data type for: %s ",
164 stats_->getTitle(i).c_str());
165 painCave.isFatal = 1;
171 statfile_ << std::endl;
172 statfile_.rdbuf()->pubsync();
180 void StatWriter::writeReal(
int i) {
181 RealType s = stats_->getRealData(i);
183 if (!std::isinf(s) && !std::isnan(s)) {
184 statfile_ <<
"\t" << s;
186 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
187 "StatWriter detected a numerical error writing: %s ",
188 stats_->getTitle(i).c_str());
189 painCave.isFatal = 1;
194 void StatWriter::writeVector(
int i) {
195 Vector3d s = stats_->getVectorData(i);
196 if (std::isinf(s[0]) || std::isnan(s[0]) || std::isinf(s[1]) ||
197 std::isnan(s[1]) || std::isinf(s[2]) || std::isnan(s[2])) {
198 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
199 "StatWriter detected a numerical error writing: %s",
200 stats_->getTitle(i).c_str());
201 painCave.isFatal = 1;
204 statfile_ <<
"\t" << s[0] <<
"\t" << s[1] <<
"\t" << s[2];
208 void StatWriter::writePotVec(
int i) {
209 potVec s = stats_->getPotVecData(i);
211 bool foundError =
false;
213 for (
unsigned int j = 0; j < N_INTERACTION_FAMILIES; j++) {
214 if (std::isinf(s[j]) || std::isnan(s[j])) foundError =
true;
217 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
218 "StatWriter detected a numerical error writing: %s",
219 stats_->getTitle(i).c_str());
220 painCave.isFatal = 1;
223 for (
unsigned int j = 0; j < N_INTERACTION_FAMILIES; j++) {
224 statfile_ <<
"\t" << s[j];
229 void StatWriter::writeMatrix(
int i) {
230 Mat3x3d s = stats_->getMatrixData(i);
232 for (
unsigned int i1 = 0; i1 < 3; i1++) {
233 for (
unsigned int j1 = 0; j1 < 3; j1++) {
234 if (std::isinf(s(i1, j1)) || std::isnan(s(i1, j1))) {
235 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
236 "StatWriter detected a numerical error writing: %s",
237 stats_->getTitle(i).c_str());
238 painCave.isFatal = 1;
241 statfile_ <<
"\t" << s(i1, j1);
247 void StatWriter::writeArray(
int i) {
248 std::vector<RealType> s = stats_->getArrayData(i);
250 for (
unsigned int j = 0; j < s.size(); ++j) {
251 if (std::isinf(s[j]) || std::isnan(s[j])) {
252 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
253 "StatWriter detected a numerical error writing: %s",
254 stats_->getTitle(i).c_str());
255 painCave.isFatal = 1;
258 statfile_ <<
"\t" << s[j];
263 void StatWriter::writeStatReport() {
265 if (worldRank == 0) {
267 reportfile_.open(reportFileName_.c_str(),
268 std::ios::out | std::ios::trunc);
271 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
272 "Could not open \"%s\" for report output.\n",
273 reportFileName_.c_str());
274 painCave.isFatal = 1;
278 reportfile_ << stats_->getStatsReport();
279 std::cout << stats_->getStatsReport();
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.