# | Line 44 | Line 44 | |
---|---|---|
44 | #define _FILE_OFFSET_BITS 64 | |
45 | ||
46 | #include "io/StatWriter.hpp" | |
47 | + | #include "brains/Stats.hpp" |
48 | #include "utils/simError.h" | |
49 | ||
50 | using namespace std; | |
51 | ||
52 | namespace OpenMD { | |
52 | – | StatsBitSet parseStatFileFormat(const std::string& format) { |
53 | – | StringTokenizer tokenizer(format, " ,;|\t\n\r"); |
54 | – | StatsBitSet mask; |
55 | – | while(tokenizer.hasMoreTokens()) { |
56 | – | std::string token(tokenizer.nextToken()); |
57 | – | toUpper(token); |
58 | – | Stats::StatsMapType::iterator i = Stats::statsMap.find(token); |
59 | – | if (i != Stats::statsMap.end()) { |
60 | – | mask.set(i->second); |
61 | – | } else { |
62 | – | sprintf( painCave.errMsg, |
63 | – | "%s is not a valid statFileFormat keyword.\n", token.c_str() ); |
64 | – | painCave.isFatal = 0; |
65 | – | painCave.severity = OPENMD_ERROR; |
66 | – | simError(); |
67 | – | } |
68 | – | } |
69 | – | |
70 | – | return mask; |
71 | – | } |
53 | ||
54 | < | StatWriter::StatWriter( const std::string& filename, const StatsBitSet& mask) : mask_(mask){ |
55 | < | |
54 | > | StatWriter::StatWriter( const std::string& filename, Stats* stats) : stats_(stats){ |
55 | > | |
56 | #ifdef IS_MPI | |
57 | if(worldRank == 0 ){ | |
58 | #endif // is_mpi | |
59 | < | |
59 | > | |
60 | statfile_.open(filename.c_str(), std::ios::out | std::ios::trunc ); | |
61 | ||
62 | if( !statfile_ ){ | |
# | Line 112 | Line 93 | namespace OpenMD { | |
93 | #endif // is_mpi | |
94 | } | |
95 | ||
96 | + | |
97 | void StatWriter::writeTitle() { | |
98 | ||
99 | + | Stats::StatsBitSet mask = stats_->getStatsMask(); |
100 | ||
101 | #ifdef IS_MPI | |
102 | if(worldRank == 0 ){ | |
# | Line 121 | Line 104 | namespace OpenMD { | |
104 | ||
105 | //write title | |
106 | statfile_ << "#"; | |
107 | < | for (int i =0; i < mask_.size(); ++i) { |
108 | < | if (mask_[i]) { |
109 | < | statfile_ << "\t" << Stats::getTitle(i) << "(" << Stats::getUnits(i) << ")"; |
107 | > | for (int i = 0; i <mask.size(); ++i) { |
108 | > | if (mask[i]) { |
109 | > | statfile_ << "\t" << stats_->getTitle(i) << |
110 | > | "(" << stats_->getUnits(i) << ")"; |
111 | } | |
112 | } | |
113 | statfile_ << std::endl; | |
# | Line 133 | Line 117 | namespace OpenMD { | |
117 | #endif // is_mpi | |
118 | } | |
119 | ||
120 | < | void StatWriter::writeStat(const Stats& s){ |
121 | < | |
120 | > | void StatWriter::writeStat() { |
121 | > | |
122 | #ifdef IS_MPI | |
123 | if(worldRank == 0 ){ | |
124 | #endif // is_mpi | |
125 | ||
126 | + | Stats::StatsBitSet mask = stats_->getStatsMask(); |
127 | statfile_.precision(8); | |
128 | < | for (int i =0; i < mask_.size(); ++i) { |
129 | < | if (mask_[i]) { |
130 | < | if (! isinf(s[i]) && ! isnan(s[i])){ |
131 | < | statfile_ << "\t" << s[i]; |
132 | < | } |
133 | < | else{ |
128 | > | for (int i = 0; i < mask.size(); ++i) { |
129 | > | if (mask[i]) { |
130 | > | if (stats_->getDataType(i) == "RealType") |
131 | > | writeReal(i); |
132 | > | else if (stats_->getDataType(i) == "Vector3d") |
133 | > | writeVector(i); |
134 | > | else if (stats_->getDataType(i) == "Mat3x3d") |
135 | > | writeMatrix(i); |
136 | > | else { |
137 | sprintf( painCave.errMsg, | |
138 | < | "StatWriter detected a numerical error writing: %s ", |
139 | < | Stats::getTitle(i).c_str()); |
138 | > | "StatWriter found an unknown data type for: %s ", |
139 | > | stats_->getTitle(i).c_str()); |
140 | painCave.isFatal = 1; | |
141 | simError(); | |
142 | < | } |
143 | < | } |
142 | > | } |
143 | > | } |
144 | } | |
145 | + | |
146 | statfile_ << std::endl; | |
158 | – | |
147 | statfile_.flush(); | |
148 | ||
149 | #ifdef IS_MPI | |
# | Line 164 | Line 152 | namespace OpenMD { | |
152 | #endif // is_mpi | |
153 | } | |
154 | ||
155 | + | void StatWriter::writeReal(int i) { |
156 | + | |
157 | + | RealType s = stats_->getRealData(i); |
158 | + | |
159 | + | if (! isinf(s) && ! isnan(s)) { |
160 | + | statfile_ << "\t" << s; |
161 | + | } else{ |
162 | + | sprintf( painCave.errMsg, |
163 | + | "StatWriter detected a numerical error writing: %s ", |
164 | + | stats_->getTitle(i).c_str()); |
165 | + | painCave.isFatal = 1; |
166 | + | simError(); |
167 | + | } |
168 | + | } |
169 | + | |
170 | + | void StatWriter::writeVector(int i) { |
171 | + | |
172 | + | Vector3d s = stats_->getVectorData(i); |
173 | + | if (isinf(s[0]) || isnan(s[0]) || |
174 | + | isinf(s[1]) || isnan(s[1]) || |
175 | + | isinf(s[2]) || isnan(s[2]) ) { |
176 | + | sprintf( painCave.errMsg, |
177 | + | "StatWriter detected a numerical error writing: %s", |
178 | + | stats_->getTitle(i).c_str()); |
179 | + | painCave.isFatal = 1; |
180 | + | simError(); |
181 | + | } else { |
182 | + | statfile_ << "\t" << s[0] << "\t" << s[1] << "\t" << s[2]; |
183 | + | } |
184 | + | } |
185 | + | |
186 | + | void StatWriter::writeMatrix(int i) { |
187 | + | |
188 | + | Mat3x3d s = stats_->getMatrixData(i); |
189 | + | |
190 | + | for (unsigned int i = 0; i < 3; i++) { |
191 | + | for (unsigned int j = 0; j < 3; j++) { |
192 | + | if (isinf(s(i,j)) || isnan(s(i,j))) { |
193 | + | sprintf( painCave.errMsg, |
194 | + | "StatWriter detected a numerical error writing: %s", |
195 | + | stats_->getTitle(i).c_str()); |
196 | + | painCave.isFatal = 1; |
197 | + | simError(); |
198 | + | } else { |
199 | + | statfile_ << "\t" << s(i,j); |
200 | + | } |
201 | + | } |
202 | + | } |
203 | + | } |
204 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |