ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/io/DumpReader.cpp
Revision: 1871
Committed: Fri May 10 14:59:13 2013 UTC (11 years, 11 months ago) by gezelter
File size: 21383 byte(s)
Log Message:
Bugs in the FQ samples, fixed for Dump2XYZ to print out charges and electric fields

File Contents

# User Rev Content
1 gezelter 1390 /*
2     * Copyright (c) 2009 The University of Notre Dame. All Rights Reserved.
3     *
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     * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     *
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * 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     *
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 gezelter 1850 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (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 1390 */
42 chrisfen 721
43     #define _LARGEFILE_SOURCE64
44     #define _FILE_OFFSET_BITS 64
45    
46     #include <sys/types.h>
47     #include <sys/stat.h>
48    
49     #include <iostream>
50     #include <math.h>
51    
52     #include <stdio.h>
53     #include <stdlib.h>
54     #include <string.h>
55    
56     #include "io/DumpReader.hpp"
57     #include "primitives/Molecule.hpp"
58     #include "utils/simError.h"
59     #include "utils/MemoryUtils.hpp"
60     #include "utils/StringTokenizer.hpp"
61 gezelter 1764 #include "brains/Thermo.hpp"
62 chrisfen 721
63     #ifdef IS_MPI
64     #include <mpi.h>
65 gezelter 1764 #endif
66 chrisfen 721
67    
68 gezelter 1390 namespace OpenMD {
69 chrisfen 721
70     DumpReader::DumpReader(SimInfo* info, const std::string& filename)
71 gezelter 1104 : info_(info), filename_(filename), isScanned_(false), nframes_(0), needCOMprops_(false) {
72 chrisfen 996
73 chrisfen 721 #ifdef IS_MPI
74 chrisfen 996
75     if (worldRank == 0) {
76 chrisfen 721 #endif
77 chrisfen 996
78 gezelter 1794 inFile_ = new std::ifstream(filename_.c_str(),
79     ifstream::in | ifstream::binary);
80 chrisfen 996
81     if (inFile_->fail()) {
82     sprintf(painCave.errMsg,
83     "DumpReader: Cannot open file: %s\n",
84     filename_.c_str());
85     painCave.isFatal = 1;
86     simError();
87     }
88    
89 chrisfen 721 #ifdef IS_MPI
90 chrisfen 996
91     }
92    
93     strcpy(checkPointMsg, "Dump file opened for reading successfully.");
94 gezelter 1241 errorCheckPoint();
95 chrisfen 996
96 chrisfen 721 #endif
97 chrisfen 996
98     return;
99     }
100    
101 chrisfen 721 DumpReader::~DumpReader() {
102 chrisfen 996
103 chrisfen 721 #ifdef IS_MPI
104 chrisfen 996
105 chrisfen 721 if (worldRank == 0) {
106     #endif
107 chrisfen 996
108 chrisfen 721 delete inFile_;
109 chrisfen 996
110 chrisfen 721 #ifdef IS_MPI
111 chrisfen 996
112 chrisfen 721 }
113 chrisfen 996
114 chrisfen 721 strcpy(checkPointMsg, "Dump file closed successfully.");
115 gezelter 1241 errorCheckPoint();
116 chrisfen 996
117 chrisfen 721 #endif
118 chrisfen 996
119 chrisfen 721 return;
120     }
121 chrisfen 996
122 chrisfen 721 int DumpReader::getNFrames(void) {
123    
124     if (!isScanned_)
125     scanFile();
126    
127     return nframes_;
128     }
129    
130     void DumpReader::scanFile(void) {
131 tim 1024 int lineNo = 0;
132     std::streampos prevPos;
133 chrisfen 721 std::streampos currPos;
134 tim 1024
135 chrisfen 721 #ifdef IS_MPI
136 tim 1024
137 chrisfen 721 if (worldRank == 0) {
138     #endif // is_mpi
139 tim 1024
140     currPos = inFile_->tellg();
141     prevPos = currPos;
142     bool foundOpenSnapshotTag = false;
143     bool foundClosedSnapshotTag = false;
144 gezelter 1825
145 tim 1024 while(inFile_->getline(buffer, bufferSize)) {
146     ++lineNo;
147    
148     std::string line = buffer;
149     currPos = inFile_->tellg();
150     if (line.find("<Snapshot>")!= std::string::npos) {
151     if (foundOpenSnapshotTag) {
152 chrisfen 721 sprintf(painCave.errMsg,
153 tim 1024 "DumpReader:<Snapshot> is multiply nested at line %d in %s \n", lineNo,
154     filename_.c_str());
155 chrisfen 721 painCave.isFatal = 1;
156 tim 1024 simError();
157     }
158     foundOpenSnapshotTag = true;
159     foundClosedSnapshotTag = false;
160     framePos_.push_back(prevPos);
161    
162     } else if (line.find("</Snapshot>") != std::string::npos){
163     if (!foundOpenSnapshotTag) {
164     sprintf(painCave.errMsg,
165     "DumpReader:</Snapshot> appears before <Snapshot> at line %d in %s \n", lineNo,
166     filename_.c_str());
167     painCave.isFatal = 1;
168 chrisfen 721 simError();
169 tim 1024 }
170    
171     if (foundClosedSnapshotTag) {
172     sprintf(painCave.errMsg,
173     "DumpReader:</Snapshot> appears multiply nested at line %d in %s \n", lineNo,
174     filename_.c_str());
175     painCave.isFatal = 1;
176     simError();
177     }
178     foundClosedSnapshotTag = true;
179     foundOpenSnapshotTag = false;
180     }
181     prevPos = currPos;
182     }
183    
184     // only found <Snapshot> for the last frame means the file is corrupted, we should discard
185     // it and give a warning message
186     if (foundOpenSnapshotTag) {
187     sprintf(painCave.errMsg,
188     "DumpReader: last frame in %s is invalid\n", filename_.c_str());
189     painCave.isFatal = 0;
190     simError();
191     framePos_.pop_back();
192     }
193    
194 chrisfen 721 nframes_ = framePos_.size();
195 tim 1024
196     if (nframes_ == 0) {
197     sprintf(painCave.errMsg,
198     "DumpReader: %s does not contain a valid frame\n", filename_.c_str());
199     painCave.isFatal = 1;
200     simError();
201     }
202 chrisfen 721 #ifdef IS_MPI
203     }
204    
205 gezelter 1798 MPI::COMM_WORLD.Bcast(&nframes_, 1, MPI::INT, 0);
206 tim 1024
207 chrisfen 721 #endif // is_mpi
208 tim 1024
209 chrisfen 721 isScanned_ = true;
210     }
211    
212     void DumpReader::readFrame(int whichFrame) {
213     if (!isScanned_)
214     scanFile();
215    
216     int storageLayout = info_->getSnapshotManager()->getStorageLayout();
217    
218     if (storageLayout & DataStorage::dslPosition) {
219     needPos_ = true;
220     } else {
221     needPos_ = false;
222     }
223    
224     if (storageLayout & DataStorage::dslVelocity) {
225     needVel_ = true;
226     } else {
227     needVel_ = false;
228     }
229    
230 gezelter 1787 if (storageLayout & DataStorage::dslAmat ||
231     storageLayout & DataStorage::dslDipole ||
232     storageLayout & DataStorage::dslQuadrupole) {
233 chrisfen 721 needQuaternion_ = true;
234     } else {
235     needQuaternion_ = false;
236     }
237    
238     if (storageLayout & DataStorage::dslAngularMomentum) {
239     needAngMom_ = true;
240     } else {
241     needAngMom_ = false;
242     }
243    
244     readSet(whichFrame);
245 gezelter 1104
246     if (needCOMprops_) {
247     Snapshot* s = info_->getSnapshotManager()->getCurrentSnapshot();
248 gezelter 1764 Thermo thermo(info_);
249 gezelter 1104 Vector3d com;
250 gezelter 1764
251     if (needPos_ && needVel_) {
252     Vector3d comvel;
253     Vector3d comw;
254     thermo.getComAll(com, comvel);
255     comw = thermo.getAngularMomentum();
256     } else {
257     com = thermo.getCom();
258     }
259 gezelter 1104 }
260 chrisfen 721 }
261    
262 tim 1024 void DumpReader::readSet(int whichFrame) {
263     std::string line;
264    
265 chrisfen 721 #ifndef IS_MPI
266     inFile_->clear();
267     inFile_->seekg(framePos_[whichFrame]);
268 tim 1024
269     std::istream& inputStream = *inFile_;
270    
271     #else
272     int masterNode = 0;
273     std::stringstream sstream;
274     if (worldRank == masterNode) {
275     std::string sendBuffer;
276    
277     inFile_->clear();
278     inFile_->seekg(framePos_[whichFrame]);
279    
280     while (inFile_->getline(buffer, bufferSize)) {
281    
282     line = buffer;
283     sendBuffer += line;
284     sendBuffer += '\n';
285     if (line.find("</Snapshot>") != std::string::npos) {
286     break;
287     }
288     }
289    
290     int sendBufferSize = sendBuffer.size();
291 gezelter 1798 MPI::COMM_WORLD.Bcast(&sendBufferSize, 1, MPI::INT, masterNode);
292     MPI::COMM_WORLD.Bcast((void *)sendBuffer.c_str(), sendBufferSize,
293     MPI::CHAR, masterNode);
294 tim 1024
295     sstream.str(sendBuffer);
296     } else {
297     int sendBufferSize;
298 gezelter 1798 MPI::COMM_WORLD.Bcast(&sendBufferSize, 1, MPI::INT, masterNode);
299 tim 1024 char * recvBuffer = new char[sendBufferSize+1];
300 gezelter 1313 assert(recvBuffer);
301     recvBuffer[sendBufferSize] = '\0';
302 gezelter 1798 MPI::COMM_WORLD.Bcast(recvBuffer, sendBufferSize, MPI::CHAR, masterNode);
303 tim 1024 sstream.str(recvBuffer);
304 gezelter 1313 delete [] recvBuffer;
305 tim 1024 }
306    
307     std::istream& inputStream = sstream;
308     #endif
309    
310     inputStream.getline(buffer, bufferSize);
311    
312     line = buffer;
313     if (line.find("<Snapshot>") == std::string::npos) {
314 chrisfen 721 sprintf(painCave.errMsg,
315 tim 1024 "DumpReader Error: can not find <Snapshot>\n");
316 chrisfen 721 painCave.isFatal = 1;
317     simError();
318     }
319 tim 1024
320     //read frameData
321     readFrameProperties(inputStream);
322    
323     //read StuntDoubles
324     readStuntDoubles(inputStream);
325    
326     inputStream.getline(buffer, bufferSize);
327     line = buffer;
328 gezelter 1752
329     if (line.find("<SiteData>") != std::string::npos) {
330     //read SiteData
331     readSiteData(inputStream);
332     } else {
333     if (line.find("</Snapshot>") == std::string::npos) {
334     sprintf(painCave.errMsg,
335     "DumpReader Error: can not find </Snapshot>\n");
336     painCave.isFatal = 1;
337     simError();
338     }
339     }
340 chrisfen 721 }
341    
342 tim 1024 void DumpReader::parseDumpLine(const std::string& line) {
343    
344    
345 chrisfen 721 StringTokenizer tokenizer(line);
346     int nTokens;
347    
348     nTokens = tokenizer.countTokens();
349    
350 gezelter 1450 if (nTokens < 2) {
351 chrisfen 721 sprintf(painCave.errMsg,
352 tim 1024 "DumpReader Error: Not enough Tokens.\n%s\n", line.c_str());
353 chrisfen 721 painCave.isFatal = 1;
354     simError();
355     }
356 tim 1024
357     int index = tokenizer.nextTokenAsInt();
358    
359 gezelter 1769 StuntDouble* sd = info_->getIOIndexToIntegrableObject(index);
360 tim 1024
361 gezelter 1769 if (sd == NULL) {
362 tim 1024 return;
363     }
364     std::string type = tokenizer.nextToken();
365     int size = type.size();
366 gezelter 1037
367 gezelter 1450 size_t found;
368    
369     if (needPos_) {
370     found = type.find("p");
371     if (found == std::string::npos) {
372     sprintf(painCave.errMsg,
373     "DumpReader Error: StuntDouble %d has no Position\n"
374     "\tField (\"p\") specified.\n%s\n", index,
375     line.c_str());
376     painCave.isFatal = 1;
377     simError();
378     }
379     }
380    
381 gezelter 1769 if (sd->isDirectional()) {
382 gezelter 1450 if (needQuaternion_) {
383     found = type.find("q");
384     if (found == std::string::npos) {
385     sprintf(painCave.errMsg,
386     "DumpReader Error: Directional StuntDouble %d has no\n"
387     "\tQuaternion Field (\"q\") specified.\n%s\n", index,
388     line.c_str());
389     painCave.isFatal = 1;
390     simError();
391     }
392     }
393     }
394    
395 tim 1024 for(int i = 0; i < size; ++i) {
396     switch(type[i]) {
397    
398     case 'p': {
399     Vector3d pos;
400     pos[0] = tokenizer.nextTokenAsDouble();
401     pos[1] = tokenizer.nextTokenAsDouble();
402     pos[2] = tokenizer.nextTokenAsDouble();
403     if (needPos_) {
404 gezelter 1769 sd->setPos(pos);
405 tim 1024 }
406     break;
407     }
408     case 'v' : {
409     Vector3d vel;
410     vel[0] = tokenizer.nextTokenAsDouble();
411     vel[1] = tokenizer.nextTokenAsDouble();
412     vel[2] = tokenizer.nextTokenAsDouble();
413     if (needVel_) {
414 gezelter 1769 sd->setVel(vel);
415 tim 1024 }
416     break;
417     }
418    
419     case 'q' : {
420     Quat4d q;
421 gezelter 1769 if (sd->isDirectional()) {
422 tim 1024
423     q[0] = tokenizer.nextTokenAsDouble();
424     q[1] = tokenizer.nextTokenAsDouble();
425     q[2] = tokenizer.nextTokenAsDouble();
426     q[3] = tokenizer.nextTokenAsDouble();
427    
428     RealType qlen = q.length();
429 gezelter 1390 if (qlen < OpenMD::epsilon) { //check quaternion is not equal to 0
430 tim 1024
431     sprintf(painCave.errMsg,
432     "DumpReader Error: initial quaternion error (q0^2 + q1^2 + q2^2 + q3^2) ~ 0\n");
433     painCave.isFatal = 1;
434     simError();
435    
436     }
437    
438     q.normalize();
439     if (needQuaternion_) {
440 gezelter 1769 sd->setQ(q);
441 tim 1024 }
442     }
443     break;
444     }
445     case 'j' : {
446     Vector3d ji;
447 gezelter 1769 if (sd->isDirectional()) {
448 tim 1024 ji[0] = tokenizer.nextTokenAsDouble();
449     ji[1] = tokenizer.nextTokenAsDouble();
450     ji[2] = tokenizer.nextTokenAsDouble();
451     if (needAngMom_) {
452 gezelter 1769 sd->setJ(ji);
453 tim 1024 }
454     }
455 gezelter 1037 break;
456 tim 1024 }
457     case 'f': {
458    
459     Vector3d force;
460     force[0] = tokenizer.nextTokenAsDouble();
461     force[1] = tokenizer.nextTokenAsDouble();
462     force[2] = tokenizer.nextTokenAsDouble();
463 gezelter 1769 sd->setFrc(force);
464 tim 1024 break;
465     }
466     case 't' : {
467    
468     Vector3d torque;
469     torque[0] = tokenizer.nextTokenAsDouble();
470     torque[1] = tokenizer.nextTokenAsDouble();
471     torque[2] = tokenizer.nextTokenAsDouble();
472 gezelter 1769 sd->setTrq(torque);
473 tim 1024 break;
474     }
475 gezelter 1629 case 'u' : {
476    
477     RealType particlePot;
478     particlePot = tokenizer.nextTokenAsDouble();
479 gezelter 1769 sd->setParticlePot(particlePot);
480 gezelter 1629 break;
481     }
482 gezelter 1714 case 'c' : {
483    
484     RealType flucQPos;
485     flucQPos = tokenizer.nextTokenAsDouble();
486 gezelter 1769 sd->setFlucQPos(flucQPos);
487 gezelter 1714 break;
488     }
489     case 'w' : {
490    
491     RealType flucQVel;
492     flucQVel = tokenizer.nextTokenAsDouble();
493 gezelter 1769 sd->setFlucQVel(flucQVel);
494 gezelter 1714 break;
495     }
496     case 'g' : {
497    
498     RealType flucQFrc;
499     flucQFrc = tokenizer.nextTokenAsDouble();
500 gezelter 1769 sd->setFlucQFrc(flucQFrc);
501 gezelter 1714 break;
502     }
503     case 'e' : {
504    
505     Vector3d eField;
506     eField[0] = tokenizer.nextTokenAsDouble();
507     eField[1] = tokenizer.nextTokenAsDouble();
508     eField[2] = tokenizer.nextTokenAsDouble();
509 gezelter 1769 sd->setElectricField(eField);
510 gezelter 1714 break;
511     }
512 tim 1024 default: {
513     sprintf(painCave.errMsg,
514     "DumpReader Error: %s is an unrecognized type\n", type.c_str());
515     painCave.isFatal = 1;
516     simError();
517     break;
518     }
519    
520     }
521     }
522 chrisfen 721
523 tim 1024 }
524    
525    
526 gezelter 1752 void DumpReader::parseSiteLine(const std::string& line) {
527    
528     StringTokenizer tokenizer(line);
529     int nTokens;
530 gezelter 1871
531 gezelter 1752 nTokens = tokenizer.countTokens();
532    
533     if (nTokens < 2) {
534     sprintf(painCave.errMsg,
535     "DumpReader Error: Not enough Tokens.\n%s\n", line.c_str());
536     painCave.isFatal = 1;
537     simError();
538     }
539    
540     /**
541     * The first token is the global integrable object index.
542     */
543    
544     int index = tokenizer.nextTokenAsInt();
545 gezelter 1769 StuntDouble* sd = info_->getIOIndexToIntegrableObject(index);
546     if (sd == NULL) {
547 gezelter 1752 return;
548     }
549    
550     /**
551     * Test to see if the next token is an integer or not. If not,
552     * we've got data on the integrable object itself. If there is an
553     * integer, we're parsing data for a site on a rigid body.
554     */
555    
556     std::string indexTest = tokenizer.peekNextToken();
557     std::istringstream i(indexTest);
558     int siteIndex;
559     if (i >> siteIndex) {
560     // chew up this token and parse as an int:
561     siteIndex = tokenizer.nextTokenAsInt();
562 gezelter 1769 RigidBody* rb = static_cast<RigidBody*>(sd);
563 gezelter 1752 sd = rb->getAtoms()[siteIndex];
564     }
565    
566     /**
567     * The next token contains information on what follows.
568     */
569     std::string type = tokenizer.nextToken();
570     int size = type.size();
571    
572     for(int i = 0; i < size; ++i) {
573     switch(type[i]) {
574    
575     case 'u' : {
576    
577     RealType particlePot;
578     particlePot = tokenizer.nextTokenAsDouble();
579     sd->setParticlePot(particlePot);
580     break;
581     }
582     case 'c' : {
583    
584     RealType flucQPos;
585     flucQPos = tokenizer.nextTokenAsDouble();
586     sd->setFlucQPos(flucQPos);
587     break;
588     }
589     case 'w' : {
590    
591     RealType flucQVel;
592     flucQVel = tokenizer.nextTokenAsDouble();
593     sd->setFlucQVel(flucQVel);
594     break;
595     }
596     case 'g' : {
597    
598     RealType flucQFrc;
599     flucQFrc = tokenizer.nextTokenAsDouble();
600     sd->setFlucQFrc(flucQFrc);
601     break;
602     }
603     case 'e' : {
604    
605     Vector3d eField;
606     eField[0] = tokenizer.nextTokenAsDouble();
607     eField[1] = tokenizer.nextTokenAsDouble();
608     eField[2] = tokenizer.nextTokenAsDouble();
609     sd->setElectricField(eField);
610     break;
611     }
612     default: {
613     sprintf(painCave.errMsg,
614     "DumpReader Error: %s is an unrecognized type\n", type.c_str());
615     painCave.isFatal = 1;
616     simError();
617     break;
618     }
619     }
620     }
621     }
622    
623    
624 tim 1024 void DumpReader::readStuntDoubles(std::istream& inputStream) {
625 gezelter 1752
626 tim 1024 inputStream.getline(buffer, bufferSize);
627     std::string line(buffer);
628    
629     if (line.find("<StuntDoubles>") == std::string::npos) {
630 chrisfen 721 sprintf(painCave.errMsg,
631 tim 1024 "DumpReader Error: Missing <StuntDoubles>\n");
632 chrisfen 721 painCave.isFatal = 1;
633 tim 1024 simError();
634     }
635    
636     while(inputStream.getline(buffer, bufferSize)) {
637     line = buffer;
638    
639     if(line.find("</StuntDoubles>") != std::string::npos) {
640     break;
641     }
642    
643     parseDumpLine(line);
644     }
645    
646     }
647    
648 gezelter 1752 void DumpReader::readSiteData(std::istream& inputStream) {
649    
650     std::string line(buffer);
651 gezelter 1871
652     // We already found the starting <SiteData> tag or we wouldn't be
653     // here, so just start parsing until we get to the ending
654     // </SiteData> tag:
655 gezelter 1752
656     while(inputStream.getline(buffer, bufferSize)) {
657     line = buffer;
658    
659     if(line.find("</SiteData>") != std::string::npos) {
660     break;
661     }
662    
663     parseSiteLine(line);
664     }
665    
666     }
667    
668 tim 1024 void DumpReader::readFrameProperties(std::istream& inputStream) {
669    
670     Snapshot* s = info_->getSnapshotManager()->getCurrentSnapshot();
671     inputStream.getline(buffer, bufferSize);
672     std::string line(buffer);
673    
674     if (line.find("<FrameData>") == std::string::npos) {
675     sprintf(painCave.errMsg,
676     "DumpReader Error: Missing <FrameData>\n");
677     painCave.isFatal = 1;
678     simError();
679     }
680    
681     while(inputStream.getline(buffer, bufferSize)) {
682     line = buffer;
683    
684     if(line.find("</FrameData>") != std::string::npos) {
685     break;
686     }
687    
688     StringTokenizer tokenizer(line, " ;\t\n\r{}:,");
689     if (!tokenizer.hasMoreTokens()) {
690 chrisfen 721 sprintf(painCave.errMsg,
691 tim 1024 "DumpReader Error: Not enough Tokens.\n%s\n", line.c_str());
692 chrisfen 721 painCave.isFatal = 1;
693 tim 1024 simError();
694     }
695    
696     std::string propertyName = tokenizer.nextToken();
697     if (propertyName == "Time") {
698     RealType currTime = tokenizer.nextTokenAsDouble();
699     s->setTime(currTime);
700     } else if (propertyName == "Hmat"){
701     Mat3x3d hmat;
702     hmat(0, 0) = tokenizer.nextTokenAsDouble();
703     hmat(0, 1) = tokenizer.nextTokenAsDouble();
704     hmat(0, 2) = tokenizer.nextTokenAsDouble();
705     hmat(1, 0) = tokenizer.nextTokenAsDouble();
706     hmat(1, 1) = tokenizer.nextTokenAsDouble();
707     hmat(1, 2) = tokenizer.nextTokenAsDouble();
708     hmat(2, 0) = tokenizer.nextTokenAsDouble();
709     hmat(2, 1) = tokenizer.nextTokenAsDouble();
710     hmat(2, 2) = tokenizer.nextTokenAsDouble();
711     s->setHmat(hmat);
712     } else if (propertyName == "Thermostat") {
713 gezelter 1764 pair<RealType, RealType> thermostat;
714     thermostat.first = tokenizer.nextTokenAsDouble();
715     thermostat.second = tokenizer.nextTokenAsDouble();
716     s->setThermostat(thermostat);
717 tim 1024 } else if (propertyName == "Barostat") {
718     Mat3x3d eta;
719     eta(0, 0) = tokenizer.nextTokenAsDouble();
720     eta(0, 1) = tokenizer.nextTokenAsDouble();
721     eta(0, 2) = tokenizer.nextTokenAsDouble();
722     eta(1, 0) = tokenizer.nextTokenAsDouble();
723     eta(1, 1) = tokenizer.nextTokenAsDouble();
724     eta(1, 2) = tokenizer.nextTokenAsDouble();
725     eta(2, 0) = tokenizer.nextTokenAsDouble();
726     eta(2, 1) = tokenizer.nextTokenAsDouble();
727     eta(2, 2) = tokenizer.nextTokenAsDouble();
728 gezelter 1764 s->setBarostat(eta);
729 tim 1024 } else {
730     sprintf(painCave.errMsg,
731     "DumpReader Error: %s is an invalid property in <FrameData>\n", propertyName.c_str());
732     painCave.isFatal = 0;
733     simError();
734     }
735    
736     }
737    
738     }
739    
740 chrisfen 721
741 gezelter 1390 }//end namespace OpenMD

Properties

Name Value
svn:keywords Author Id Revision Date