# | Line 36 | Line 36 | |
---|---|---|
36 | * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). | |
37 | * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). | |
38 | * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). | |
39 | < | * [4] Vardeman & Gezelter, in progress (2009). |
39 | > | * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). |
40 | > | * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). |
41 | */ | |
42 | ||
43 | #define _LARGEFILE_SOURCE64 | |
44 | #define _FILE_OFFSET_BITS 64 | |
45 | + | #ifdef _MSC_VER |
46 | + | #define isnan(x) _isnan((x)) |
47 | + | #define isinf(x) (!_finite(x) && !_isnan(x)) |
48 | + | #endif |
49 | ||
50 | #include "io/StatWriter.hpp" | |
51 | + | #include "brains/Stats.hpp" |
52 | #include "utils/simError.h" | |
53 | ||
54 | using namespace std; | |
55 | ||
56 | namespace OpenMD { | |
51 | – | StatsBitSet parseStatFileFormat(const std::string& format) { |
52 | – | StringTokenizer tokenizer(format, " ,;|\t\n\r"); |
53 | – | StatsBitSet mask; |
54 | – | while(tokenizer.hasMoreTokens()) { |
55 | – | std::string token(tokenizer.nextToken()); |
56 | – | toUpper(token); |
57 | – | Stats::StatsMapType::iterator i = Stats::statsMap.find(token); |
58 | – | if (i != Stats::statsMap.end()) { |
59 | – | mask.set(i->second); |
60 | – | } else { |
61 | – | sprintf( painCave.errMsg, |
62 | – | "%s is not a valid statFileFormat keyword.\n", token.c_str() ); |
63 | – | painCave.isFatal = 0; |
64 | – | painCave.severity = OPENMD_ERROR; |
65 | – | simError(); |
66 | – | } |
67 | – | } |
68 | – | |
69 | – | return mask; |
70 | – | } |
57 | ||
58 | < | StatWriter::StatWriter( const std::string& filename, const StatsBitSet& mask) : mask_(mask){ |
59 | < | |
58 | > | StatWriter::StatWriter( const std::string& filename, Stats* stats) : stats_(stats){ |
59 | > | |
60 | #ifdef IS_MPI | |
61 | if(worldRank == 0 ){ | |
62 | #endif // is_mpi | |
63 | < | |
63 | > | |
64 | statfile_.open(filename.c_str(), std::ios::out | std::ios::trunc ); | |
65 | ||
66 | if( !statfile_ ){ | |
# | Line 111 | Line 97 | namespace OpenMD { | |
97 | #endif // is_mpi | |
98 | } | |
99 | ||
100 | + | |
101 | void StatWriter::writeTitle() { | |
102 | ||
103 | + | Stats::StatsBitSet mask = stats_->getStatsMask(); |
104 | ||
105 | #ifdef IS_MPI | |
106 | if(worldRank == 0 ){ | |
# | Line 120 | Line 108 | namespace OpenMD { | |
108 | ||
109 | //write title | |
110 | statfile_ << "#"; | |
111 | < | for (int i =0; i < mask_.size(); ++i) { |
112 | < | if (mask_[i]) { |
113 | < | statfile_ << "\t" << Stats::getTitle(i) << "(" << Stats::getUnits(i) << ")"; |
111 | > | for (unsigned int i = 0; i <mask.size(); ++i) { |
112 | > | if (mask[i]) { |
113 | > | statfile_ << "\t" << stats_->getTitle(i) << |
114 | > | "(" << stats_->getUnits(i) << ")"; |
115 | } | |
116 | } | |
117 | statfile_ << std::endl; | |
# | Line 132 | Line 121 | namespace OpenMD { | |
121 | #endif // is_mpi | |
122 | } | |
123 | ||
124 | < | void StatWriter::writeStat(const Stats& s){ |
125 | < | |
124 | > | void StatWriter::writeStat() { |
125 | > | |
126 | #ifdef IS_MPI | |
127 | if(worldRank == 0 ){ | |
128 | #endif // is_mpi | |
129 | ||
130 | + | Stats::StatsBitSet mask = stats_->getStatsMask(); |
131 | statfile_.precision(8); | |
132 | < | for (int i =0; i < mask_.size(); ++i) { |
133 | < | if (mask_[i]) { |
134 | < | if (! isinf(s[i]) && ! isnan(s[i])){ |
135 | < | statfile_ << "\t" << s[i]; |
136 | < | } |
137 | < | else{ |
132 | > | for (unsigned int i = 0; i < mask.size(); ++i) { |
133 | > | if (mask[i]) { |
134 | > | if (stats_->getDataType(i) == "RealType") |
135 | > | writeReal(i); |
136 | > | else if (stats_->getDataType(i) == "Vector3d") |
137 | > | writeVector(i); |
138 | > | else if (stats_->getDataType(i) == "Mat3x3d") |
139 | > | writeMatrix(i); |
140 | > | else { |
141 | sprintf( painCave.errMsg, | |
142 | < | "StatWriter detected a numerical error writing: %s ", |
143 | < | Stats::getTitle(i).c_str()); |
142 | > | "StatWriter found an unknown data type for: %s ", |
143 | > | stats_->getTitle(i).c_str()); |
144 | painCave.isFatal = 1; | |
145 | simError(); | |
146 | < | } |
147 | < | } |
146 | > | } |
147 | > | } |
148 | } | |
149 | + | |
150 | statfile_ << std::endl; | |
157 | – | |
151 | statfile_.flush(); | |
152 | ||
153 | #ifdef IS_MPI | |
# | Line 163 | Line 156 | namespace OpenMD { | |
156 | #endif // is_mpi | |
157 | } | |
158 | ||
159 | + | void StatWriter::writeReal(int i) { |
160 | + | |
161 | + | RealType s = stats_->getRealData(i); |
162 | + | |
163 | + | if (! isinf(s) && ! isnan(s)) { |
164 | + | statfile_ << "\t" << s; |
165 | + | } else{ |
166 | + | sprintf( painCave.errMsg, |
167 | + | "StatWriter detected a numerical error writing: %s ", |
168 | + | stats_->getTitle(i).c_str()); |
169 | + | painCave.isFatal = 1; |
170 | + | simError(); |
171 | + | } |
172 | + | } |
173 | + | |
174 | + | void StatWriter::writeVector(int i) { |
175 | + | |
176 | + | Vector3d s = stats_->getVectorData(i); |
177 | + | if (isinf(s[0]) || isnan(s[0]) || |
178 | + | isinf(s[1]) || isnan(s[1]) || |
179 | + | isinf(s[2]) || isnan(s[2]) ) { |
180 | + | sprintf( painCave.errMsg, |
181 | + | "StatWriter detected a numerical error writing: %s", |
182 | + | stats_->getTitle(i).c_str()); |
183 | + | painCave.isFatal = 1; |
184 | + | simError(); |
185 | + | } else { |
186 | + | statfile_ << "\t" << s[0] << "\t" << s[1] << "\t" << s[2]; |
187 | + | } |
188 | + | } |
189 | + | |
190 | + | void StatWriter::writeMatrix(int i) { |
191 | + | |
192 | + | Mat3x3d s = stats_->getMatrixData(i); |
193 | + | |
194 | + | for (unsigned int i = 0; i < 3; i++) { |
195 | + | for (unsigned int j = 0; j < 3; j++) { |
196 | + | if (isinf(s(i,j)) || isnan(s(i,j))) { |
197 | + | sprintf( painCave.errMsg, |
198 | + | "StatWriter detected a numerical error writing: %s", |
199 | + | stats_->getTitle(i).c_str()); |
200 | + | painCave.isFatal = 1; |
201 | + | simError(); |
202 | + | } else { |
203 | + | statfile_ << "\t" << s(i,j); |
204 | + | } |
205 | + | } |
206 | + | } |
207 | + | } |
208 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |