ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/io/DumpWriter.cpp
Revision: 1764
Committed: Tue Jul 3 18:32:27 2012 UTC (12 years, 9 months ago) by gezelter
File size: 20850 byte(s)
Log Message:
Refactored Snapshot and Stats to use the Accumulator classes.  Collected
a number of methods into Thermo that belonged there.

File Contents

# User Rev Content
1 gezelter 507 /*
2 gezelter 1390 * Copyright (c) 2009 The University of Notre Dame. All Rights Reserved.
3 gezelter 246 *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
28     * arising out of the use of or inability to use software, even if the
29     * University of Notre Dame has been advised of the possibility of
30     * such damages.
31 gezelter 1390 *
32     * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33     * research, please cite the appropriate papers when you publish your
34     * work. Good starting points are:
35     *
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 gezelter 1665 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 gezelter 246 */
42    
43     #include "io/DumpWriter.hpp"
44     #include "primitives/Molecule.hpp"
45     #include "utils/simError.h"
46 tim 376 #include "io/basic_teebuf.hpp"
47 tim 615 #include "io/gzstream.hpp"
48     #include "io/Globals.hpp"
49    
50 gezelter 1437
51 gezelter 2 #ifdef IS_MPI
52     #include <mpi.h>
53 gezelter 1764 #endif
54 gezelter 2
55 gezelter 1437 using namespace std;
56 gezelter 1390 namespace OpenMD {
57 gezelter 2
58 gezelter 507 DumpWriter::DumpWriter(SimInfo* info)
59     : info_(info), filename_(info->getDumpFileName()), eorFilename_(info->getFinalConfigFileName()){
60 tim 615
61     Globals* simParams = info->getSimParams();
62 gezelter 1714 needCompression_ = simParams->getCompressDumpFile();
63     needForceVector_ = simParams->getOutputForceVector();
64     needParticlePot_ = simParams->getOutputParticlePotential();
65     needFlucQ_ = simParams->getOutputFluctuatingCharges();
66     needElectricField_ = simParams->getOutputElectricField();
67    
68 gezelter 1752 if (needParticlePot_ || needFlucQ_ || needElectricField_) {
69     doSiteData_ = true;
70     } else {
71     doSiteData_ = false;
72     }
73    
74 chuckv 791 createDumpFile_ = true;
75 tim 619 #ifdef HAVE_LIBZ
76 tim 615 if (needCompression_) {
77 tim 1024 filename_ += ".gz";
78     eorFilename_ += ".gz";
79 tim 615 }
80 tim 619 #endif
81 tim 615
82 tim 376 #ifdef IS_MPI
83    
84 tim 1024 if (worldRank == 0) {
85 tim 376 #endif // is_mpi
86 chuckv 791
87 tim 1024 dumpFile_ = createOStream(filename_);
88 tim 615
89 tim 1024 if (!dumpFile_) {
90     sprintf(painCave.errMsg, "Could not open \"%s\" for dump output.\n",
91     filename_.c_str());
92     painCave.isFatal = 1;
93     simError();
94     }
95 tim 376
96     #ifdef IS_MPI
97    
98 tim 1024 }
99 tim 376
100     #endif // is_mpi
101    
102 tim 1024 }
103 tim 376
104    
105 gezelter 507 DumpWriter::DumpWriter(SimInfo* info, const std::string& filename)
106     : info_(info), filename_(filename){
107 tim 615
108     Globals* simParams = info->getSimParams();
109     eorFilename_ = filename_.substr(0, filename_.rfind(".")) + ".eor";
110    
111 gezelter 1714 needCompression_ = simParams->getCompressDumpFile();
112     needForceVector_ = simParams->getOutputForceVector();
113     needParticlePot_ = simParams->getOutputParticlePotential();
114     needFlucQ_ = simParams->getOutputFluctuatingCharges();
115     needElectricField_ = simParams->getOutputElectricField();
116    
117 gezelter 1752 if (needParticlePot_ || needFlucQ_ || needElectricField_) {
118     doSiteData_ = true;
119     } else {
120     doSiteData_ = false;
121     }
122    
123 chuckv 791 createDumpFile_ = true;
124 tim 619 #ifdef HAVE_LIBZ
125 tim 615 if (needCompression_) {
126 tim 1024 filename_ += ".gz";
127     eorFilename_ += ".gz";
128 tim 615 }
129 tim 619 #endif
130 tim 615
131 gezelter 246 #ifdef IS_MPI
132 gezelter 2
133 tim 1024 if (worldRank == 0) {
134 gezelter 246 #endif // is_mpi
135 gezelter 2
136 chuckv 791
137 tim 1024 dumpFile_ = createOStream(filename_);
138 tim 615
139 tim 1024 if (!dumpFile_) {
140     sprintf(painCave.errMsg, "Could not open \"%s\" for dump output.\n",
141     filename_.c_str());
142     painCave.isFatal = 1;
143     simError();
144     }
145 gezelter 2
146     #ifdef IS_MPI
147    
148 tim 1024 }
149 gezelter 2
150     #endif // is_mpi
151 gezelter 246
152 tim 1024 }
153 chuckv 791
154     DumpWriter::DumpWriter(SimInfo* info, const std::string& filename, bool writeDumpFile)
155 tim 1024 : info_(info), filename_(filename){
156 chuckv 791
157     Globals* simParams = info->getSimParams();
158     eorFilename_ = filename_.substr(0, filename_.rfind(".")) + ".eor";
159    
160 gezelter 1714 needCompression_ = simParams->getCompressDumpFile();
161     needForceVector_ = simParams->getOutputForceVector();
162     needParticlePot_ = simParams->getOutputParticlePotential();
163     needFlucQ_ = simParams->getOutputFluctuatingCharges();
164     needElectricField_ = simParams->getOutputElectricField();
165    
166 gezelter 1752 if (needParticlePot_ || needFlucQ_ || needElectricField_) {
167     doSiteData_ = true;
168     } else {
169     doSiteData_ = false;
170     }
171    
172 chuckv 791 #ifdef HAVE_LIBZ
173     if (needCompression_) {
174     filename_ += ".gz";
175     eorFilename_ += ".gz";
176     }
177     #endif
178    
179     #ifdef IS_MPI
180    
181     if (worldRank == 0) {
182     #endif // is_mpi
183    
184     createDumpFile_ = writeDumpFile;
185     if (createDumpFile_) {
186     dumpFile_ = createOStream(filename_);
187    
188     if (!dumpFile_) {
189     sprintf(painCave.errMsg, "Could not open \"%s\" for dump output.\n",
190     filename_.c_str());
191     painCave.isFatal = 1;
192     simError();
193     }
194     }
195     #ifdef IS_MPI
196    
197     }
198 tim 1024
199 chuckv 791
200     #endif // is_mpi
201    
202     }
203 gezelter 2
204 gezelter 507 DumpWriter::~DumpWriter() {
205 gezelter 2
206     #ifdef IS_MPI
207 gezelter 246
208     if (worldRank == 0) {
209 gezelter 2 #endif // is_mpi
210 chuckv 791 if (createDumpFile_){
211 tim 1024 writeClosing(*dumpFile_);
212 chuckv 791 delete dumpFile_;
213     }
214 gezelter 2 #ifdef IS_MPI
215 gezelter 246
216     }
217    
218 gezelter 2 #endif // is_mpi
219 gezelter 246
220 gezelter 507 }
221 gezelter 2
222 tim 1024 void DumpWriter::writeFrameProperties(std::ostream& os, Snapshot* s) {
223 gezelter 2
224 tim 1024 char buffer[1024];
225    
226     os << " <FrameData>\n";
227    
228     RealType currentTime = s->getTime();
229 gezelter 1437
230     if (isinf(currentTime) || isnan(currentTime)) {
231     sprintf( painCave.errMsg,
232     "DumpWriter detected a numerical error writing the time");
233     painCave.isFatal = 1;
234     simError();
235     }
236    
237 gezelter 1025 sprintf(buffer, " Time: %.10g\n", currentTime);
238 tim 1024 os << buffer;
239    
240 gezelter 246 Mat3x3d hmat;
241     hmat = s->getHmat();
242 gezelter 1437
243     for (unsigned int i = 0; i < 3; i++) {
244     for (unsigned int j = 0; j < 3; j++) {
245     if (isinf(hmat(i,j)) || isnan(hmat(i,j))) {
246     sprintf( painCave.errMsg,
247     "DumpWriter detected a numerical error writing the box");
248     painCave.isFatal = 1;
249     simError();
250     }
251     }
252     }
253    
254 tim 1024 sprintf(buffer, " Hmat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
255     hmat(0, 0), hmat(1, 0), hmat(2, 0),
256     hmat(0, 1), hmat(1, 1), hmat(2, 1),
257     hmat(0, 2), hmat(1, 2), hmat(2, 2));
258     os << buffer;
259 gezelter 2
260 gezelter 1764 pair<RealType, RealType> thermostat = s->getThermostat();
261    
262     if (isinf(thermostat.first) || isnan(thermostat.first) ||
263     isinf(thermostat.second) || isnan(thermostat.second)) {
264 gezelter 1437 sprintf( painCave.errMsg,
265     "DumpWriter detected a numerical error writing the thermostat");
266     painCave.isFatal = 1;
267     simError();
268     }
269 gezelter 1764 sprintf(buffer, " Thermostat: %.10g , %.10g\n", thermostat.first,
270     thermostat.second);
271 tim 1024 os << buffer;
272 gezelter 246
273 tim 1024 Mat3x3d eta;
274 gezelter 1764 eta = s->getBarostat();
275 gezelter 1437
276     for (unsigned int i = 0; i < 3; i++) {
277     for (unsigned int j = 0; j < 3; j++) {
278     if (isinf(eta(i,j)) || isnan(eta(i,j))) {
279     sprintf( painCave.errMsg,
280     "DumpWriter detected a numerical error writing the barostat");
281     painCave.isFatal = 1;
282     simError();
283     }
284     }
285     }
286    
287 tim 1024 sprintf(buffer, " Barostat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
288     eta(0, 0), eta(1, 0), eta(2, 0),
289     eta(0, 1), eta(1, 1), eta(2, 1),
290     eta(0, 2), eta(1, 2), eta(2, 2));
291     os << buffer;
292 gezelter 246
293 tim 1024 os << " </FrameData>\n";
294 gezelter 507 }
295 gezelter 2
296 gezelter 507 void DumpWriter::writeFrame(std::ostream& os) {
297 gezelter 246
298 tim 1024 #ifdef IS_MPI
299     MPI_Status istatus;
300     #endif
301 gezelter 246
302     Molecule* mol;
303     StuntDouble* integrableObject;
304     SimInfo::MoleculeIterator mi;
305     Molecule::IntegrableObjectIterator ii;
306 gezelter 1752 RigidBody::AtomIterator ai;
307     Atom* atom;
308 gezelter 2
309 gezelter 246 #ifndef IS_MPI
310 tim 1024 os << " <Snapshot>\n";
311 gezelter 1025
312 tim 1024 writeFrameProperties(os, info_->getSnapshotManager()->getCurrentSnapshot());
313 gezelter 2
314 tim 1024 os << " <StuntDoubles>\n";
315 gezelter 246 for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) {
316 gezelter 2
317 xsun 1217
318     for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL;
319 tim 1024 integrableObject = mol->nextIntegrableObject(ii)) {
320 xsun 1217 os << prepareDumpLine(integrableObject);
321    
322 tim 1024 }
323     }
324     os << " </StuntDoubles>\n";
325 gezelter 1752
326     if (doSiteData_) {
327     os << " <SiteData>\n";
328     for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) {
329    
330     for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL;
331     integrableObject = mol->nextIntegrableObject(ii)) {
332    
333     int ioIndex = integrableObject->getGlobalIntegrableObjectIndex();
334     // do one for the IO itself
335     os << prepareSiteLine(integrableObject, ioIndex, 0);
336    
337     if (integrableObject->isRigidBody()) {
338    
339     RigidBody* rb = static_cast<RigidBody*>(integrableObject);
340     int siteIndex = 0;
341     for (atom = rb->beginAtom(ai); atom != NULL;
342     atom = rb->nextAtom(ai)) {
343     os << prepareSiteLine(atom, ioIndex, siteIndex);
344     siteIndex++;
345     }
346     }
347     }
348     }
349     os << " </SiteData>\n";
350     }
351 tim 1024 os << " </Snapshot>\n";
352 gezelter 2
353 tim 1024 os.flush();
354     #else
355     //every node prepares the dump lines for integrable objects belong to itself
356     std::string buffer;
357     for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) {
358 xsun 1217
359    
360 tim 1024 for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL;
361     integrableObject = mol->nextIntegrableObject(ii)) {
362 xsun 1217 buffer += prepareDumpLine(integrableObject);
363 gezelter 507 }
364 gezelter 2 }
365 tim 1024
366 gezelter 246 const int masterNode = 0;
367 gezelter 1629 int nProc;
368     MPI_Comm_size(MPI_COMM_WORLD, &nProc);
369 tim 1024 if (worldRank == masterNode) {
370     os << " <Snapshot>\n";
371     writeFrameProperties(os, info_->getSnapshotManager()->getCurrentSnapshot());
372     os << " <StuntDoubles>\n";
373    
374 gezelter 1025 os << buffer;
375    
376 tim 1024 for (int i = 1; i < nProc; ++i) {
377 gezelter 2
378 tim 1024 // receive the length of the string buffer that was
379     // prepared by processor i
380 gezelter 2
381 gezelter 1629 MPI_Bcast(&i, 1, MPI_INT,masterNode,MPI_COMM_WORLD);
382 tim 1024 int recvLength;
383     MPI_Recv(&recvLength, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &istatus);
384     char* recvBuffer = new char[recvLength];
385     if (recvBuffer == NULL) {
386     } else {
387 gezelter 1025 MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i, 0, MPI_COMM_WORLD, &istatus);
388 tim 1024 os << recvBuffer;
389 gezelter 1313 delete [] recvBuffer;
390 tim 1024 }
391     }
392     os << " </StuntDoubles>\n";
393    
394     os << " </Snapshot>\n";
395 gezelter 507 os.flush();
396 gezelter 246 } else {
397 gezelter 1025 int sendBufferLength = buffer.size() + 1;
398 gezelter 1629 int myturn = 0;
399     for (int i = 1; i < nProc; ++i){
400     MPI_Bcast(&myturn,1, MPI_INT,masterNode,MPI_COMM_WORLD);
401     if (myturn == worldRank){
402     MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD);
403     MPI_Send((void *)buffer.c_str(), sendBufferLength, MPI_CHAR, masterNode, 0, MPI_COMM_WORLD);
404     }
405     }
406 tim 1024 }
407 gezelter 2
408 tim 1024 #endif // is_mpi
409 gezelter 2
410 tim 1024 }
411 gezelter 2
412 tim 1024 std::string DumpWriter::prepareDumpLine(StuntDouble* integrableObject) {
413    
414     int index = integrableObject->getGlobalIntegrableObjectIndex();
415     std::string type("pv");
416     std::string line;
417     char tempBuffer[4096];
418 gezelter 2
419 tim 1024 Vector3d pos;
420     Vector3d vel;
421     pos = integrableObject->getPos();
422 gezelter 1437
423     if (isinf(pos[0]) || isnan(pos[0]) ||
424     isinf(pos[1]) || isnan(pos[1]) ||
425     isinf(pos[2]) || isnan(pos[2]) ) {
426     sprintf( painCave.errMsg,
427     "DumpWriter detected a numerical error writing the position"
428     " for object %d", index);
429     painCave.isFatal = 1;
430     simError();
431     }
432    
433 tim 1024 vel = integrableObject->getVel();
434 gezelter 1437
435     if (isinf(vel[0]) || isnan(vel[0]) ||
436     isinf(vel[1]) || isnan(vel[1]) ||
437     isinf(vel[2]) || isnan(vel[2]) ) {
438     sprintf( painCave.errMsg,
439     "DumpWriter detected a numerical error writing the velocity"
440     " for object %d", index);
441     painCave.isFatal = 1;
442     simError();
443     }
444    
445 gezelter 1025 sprintf(tempBuffer, "%18.10g %18.10g %18.10g %13e %13e %13e",
446 tim 1024 pos[0], pos[1], pos[2],
447     vel[0], vel[1], vel[2]);
448     line += tempBuffer;
449 gezelter 2
450 tim 1024 if (integrableObject->isDirectional()) {
451     type += "qj";
452     Quat4d q;
453     Vector3d ji;
454     q = integrableObject->getQ();
455 gezelter 1437
456     if (isinf(q[0]) || isnan(q[0]) ||
457     isinf(q[1]) || isnan(q[1]) ||
458     isinf(q[2]) || isnan(q[2]) ||
459     isinf(q[3]) || isnan(q[3]) ) {
460     sprintf( painCave.errMsg,
461     "DumpWriter detected a numerical error writing the quaternion"
462     " for object %d", index);
463     painCave.isFatal = 1;
464     simError();
465     }
466    
467 tim 1024 ji = integrableObject->getJ();
468 gezelter 1437
469     if (isinf(ji[0]) || isnan(ji[0]) ||
470     isinf(ji[1]) || isnan(ji[1]) ||
471     isinf(ji[2]) || isnan(ji[2]) ) {
472     sprintf( painCave.errMsg,
473     "DumpWriter detected a numerical error writing the angular"
474     " momentum for object %d", index);
475     painCave.isFatal = 1;
476     simError();
477     }
478    
479 gezelter 1025 sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e %13e",
480 tim 1024 q[0], q[1], q[2], q[3],
481     ji[0], ji[1], ji[2]);
482     line += tempBuffer;
483     }
484 gezelter 2
485 tim 1024 if (needForceVector_) {
486 gezelter 1437 type += "f";
487 gezelter 1714 Vector3d frc = integrableObject->getFrc();
488 gezelter 1437 if (isinf(frc[0]) || isnan(frc[0]) ||
489     isinf(frc[1]) || isnan(frc[1]) ||
490     isinf(frc[2]) || isnan(frc[2]) ) {
491     sprintf( painCave.errMsg,
492     "DumpWriter detected a numerical error writing the force"
493     " for object %d", index);
494     painCave.isFatal = 1;
495     simError();
496     }
497     sprintf(tempBuffer, " %13e %13e %13e",
498     frc[0], frc[1], frc[2]);
499 tim 1024 line += tempBuffer;
500 gezelter 1437
501     if (integrableObject->isDirectional()) {
502     type += "t";
503 gezelter 1714 Vector3d trq = integrableObject->getTrq();
504 gezelter 1437 if (isinf(trq[0]) || isnan(trq[0]) ||
505     isinf(trq[1]) || isnan(trq[1]) ||
506     isinf(trq[2]) || isnan(trq[2]) ) {
507     sprintf( painCave.errMsg,
508     "DumpWriter detected a numerical error writing the torque"
509     " for object %d", index);
510     painCave.isFatal = 1;
511     simError();
512 gezelter 1714 }
513 gezelter 1437 sprintf(tempBuffer, " %13e %13e %13e",
514     trq[0], trq[1], trq[2]);
515     line += tempBuffer;
516     }
517 gezelter 246 }
518 gezelter 1714
519 gezelter 1752 sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str());
520     return std::string(tempBuffer);
521     }
522    
523     std::string DumpWriter::prepareSiteLine(StuntDouble* integrableObject, int ioIndex, int siteIndex) {
524    
525    
526     std::string id;
527     std::string type;
528     std::string line;
529     char tempBuffer[4096];
530    
531     if (integrableObject->isRigidBody()) {
532     sprintf(tempBuffer, "%10d ", ioIndex);
533     id = std::string(tempBuffer);
534     } else {
535     sprintf(tempBuffer, "%10d %10d", ioIndex, siteIndex);
536     id = std::string(tempBuffer);
537 gezelter 1629 }
538 gezelter 1752
539 gezelter 1714 if (needFlucQ_) {
540     type += "cw";
541     RealType fqPos = integrableObject->getFlucQPos();
542     if (isinf(fqPos) || isnan(fqPos) ) {
543     sprintf( painCave.errMsg,
544     "DumpWriter detected a numerical error writing the"
545 gezelter 1752 " fluctuating charge for object %s", id.c_str());
546 gezelter 1714 painCave.isFatal = 1;
547     simError();
548     }
549     sprintf(tempBuffer, " %13e ", fqPos);
550     line += tempBuffer;
551    
552     RealType fqVel = integrableObject->getFlucQVel();
553     if (isinf(fqVel) || isnan(fqVel) ) {
554     sprintf( painCave.errMsg,
555     "DumpWriter detected a numerical error writing the"
556 gezelter 1752 " fluctuating charge velocity for object %s", id.c_str());
557 gezelter 1714 painCave.isFatal = 1;
558     simError();
559     }
560     sprintf(tempBuffer, " %13e ", fqVel);
561     line += tempBuffer;
562    
563     if (needForceVector_) {
564     type += "g";
565     RealType fqFrc = integrableObject->getFlucQFrc();
566     if (isinf(fqFrc) || isnan(fqFrc) ) {
567     sprintf( painCave.errMsg,
568     "DumpWriter detected a numerical error writing the"
569 gezelter 1752 " fluctuating charge force for object %s", id.c_str());
570 gezelter 1714 painCave.isFatal = 1;
571     simError();
572     }
573     sprintf(tempBuffer, " %13e ", fqFrc);
574     line += tempBuffer;
575     }
576     }
577    
578     if (needElectricField_) {
579     type += "e";
580     Vector3d eField= integrableObject->getElectricField();
581     if (isinf(eField[0]) || isnan(eField[0]) ||
582     isinf(eField[1]) || isnan(eField[1]) ||
583     isinf(eField[2]) || isnan(eField[2]) ) {
584     sprintf( painCave.errMsg,
585     "DumpWriter detected a numerical error writing the electric"
586 gezelter 1752 " field for object %s", id.c_str());
587 gezelter 1714 painCave.isFatal = 1;
588     simError();
589     }
590     sprintf(tempBuffer, " %13e %13e %13e",
591     eField[0], eField[1], eField[2]);
592     line += tempBuffer;
593     }
594    
595 gezelter 1752
596     if (needParticlePot_) {
597     type += "u";
598     RealType particlePot = integrableObject->getParticlePot();
599     if (isinf(particlePot) || isnan(particlePot)) {
600     sprintf( painCave.errMsg,
601     "DumpWriter detected a numerical error writing the particle "
602     " potential for object %s", id.c_str());
603     painCave.isFatal = 1;
604     simError();
605     }
606     sprintf(tempBuffer, " %13e", particlePot);
607     line += tempBuffer;
608     }
609    
610    
611     sprintf(tempBuffer, "%s %7s %s\n", id.c_str(), type.c_str(), line.c_str());
612 tim 1024 return std::string(tempBuffer);
613 gezelter 507 }
614 gezelter 2
615 gezelter 507 void DumpWriter::writeDump() {
616 tim 615 writeFrame(*dumpFile_);
617 gezelter 507 }
618 tim 376
619 gezelter 507 void DumpWriter::writeEor() {
620 tim 615 std::ostream* eorStream;
621 tim 376
622     #ifdef IS_MPI
623     if (worldRank == 0) {
624     #endif // is_mpi
625    
626 tim 615 eorStream = createOStream(eorFilename_);
627 tim 376
628     #ifdef IS_MPI
629     }
630     #endif // is_mpi
631    
632 tim 615 writeFrame(*eorStream);
633    
634     #ifdef IS_MPI
635     if (worldRank == 0) {
636     #endif // is_mpi
637 tim 1024 writeClosing(*eorStream);
638     delete eorStream;
639 tim 615 #ifdef IS_MPI
640     }
641     #endif // is_mpi
642    
643 gezelter 507 }
644 tim 376
645    
646 gezelter 507 void DumpWriter::writeDumpAndEor() {
647 tim 376 std::vector<std::streambuf*> buffers;
648 tim 615 std::ostream* eorStream;
649 tim 376 #ifdef IS_MPI
650     if (worldRank == 0) {
651     #endif // is_mpi
652    
653 tim 615 buffers.push_back(dumpFile_->rdbuf());
654 tim 376
655 tim 615 eorStream = createOStream(eorFilename_);
656 tim 376
657 tim 615 buffers.push_back(eorStream->rdbuf());
658 tim 376
659     #ifdef IS_MPI
660     }
661     #endif // is_mpi
662    
663     TeeBuf tbuf(buffers.begin(), buffers.end());
664     std::ostream os(&tbuf);
665    
666     writeFrame(os);
667 tim 615
668     #ifdef IS_MPI
669     if (worldRank == 0) {
670     #endif // is_mpi
671 tim 1024 writeClosing(*eorStream);
672     delete eorStream;
673 tim 615 #ifdef IS_MPI
674     }
675     #endif // is_mpi
676 tim 376
677 gezelter 507 }
678 tim 376
679 tim 1024 std::ostream* DumpWriter::createOStream(const std::string& filename) {
680 tim 619
681 tim 615 std::ostream* newOStream;
682 tim 619 #ifdef HAVE_LIBZ
683 tim 615 if (needCompression_) {
684 tim 1024 newOStream = new ogzstream(filename.c_str());
685 tim 615 } else {
686 tim 1024 newOStream = new std::ofstream(filename.c_str());
687 tim 615 }
688 tim 619 #else
689     newOStream = new std::ofstream(filename.c_str());
690     #endif
691 tim 1024 //write out MetaData first
692 gezelter 1746 (*newOStream) << "<OpenMD version=2>" << std::endl;
693 tim 1024 (*newOStream) << " <MetaData>" << std::endl;
694     (*newOStream) << info_->getRawMetaData();
695     (*newOStream) << " </MetaData>" << std::endl;
696 tim 615 return newOStream;
697 tim 1024 }
698 tim 376
699 tim 1024 void DumpWriter::writeClosing(std::ostream& os) {
700    
701 gezelter 1390 os << "</OpenMD>\n";
702 tim 1024 os.flush();
703     }
704    
705 gezelter 1390 }//end namespace OpenMD

Properties

Name Value
svn:keywords Author Id Revision Date