# | Line 43 | Line 43 | |
---|---|---|
43 | #include "primitives/Molecule.hpp" | |
44 | #include "utils/simError.h" | |
45 | #include "io/basic_teebuf.hpp" | |
46 | + | #include "io/gzstream.hpp" |
47 | + | #include "io/Globals.hpp" |
48 | + | |
49 | #ifdef IS_MPI | |
50 | #include <mpi.h> | |
51 | #endif //is_mpi | |
# | Line 51 | Line 54 | namespace oopse { | |
54 | ||
55 | DumpWriter::DumpWriter(SimInfo* info) | |
56 | : info_(info), filename_(info->getDumpFileName()), eorFilename_(info->getFinalConfigFileName()){ | |
57 | + | |
58 | + | Globals* simParams = info->getSimParams(); |
59 | + | needCompression_ = simParams->getCompressDumpFile(); |
60 | + | needForceVector_ = simParams->getOutputForceVector(); |
61 | + | createDumpFile_ = true; |
62 | + | #ifdef HAVE_LIBZ |
63 | + | if (needCompression_) { |
64 | + | filename_ += ".gz"; |
65 | + | eorFilename_ += ".gz"; |
66 | + | } |
67 | + | #endif |
68 | + | |
69 | #ifdef IS_MPI | |
70 | ||
71 | if (worldRank == 0) { | |
72 | #endif // is_mpi | |
73 | ||
74 | < | dumpFile_.open(filename_.c_str(), std::ios::out | std::ios::trunc); |
74 | > | |
75 | > | dumpFile_ = createOStream(filename_); |
76 | ||
77 | if (!dumpFile_) { | |
78 | sprintf(painCave.errMsg, "Could not open \"%s\" for dump output.\n", | |
# | Line 79 | Line 95 | namespace oopse { | |
95 | ||
96 | DumpWriter::DumpWriter(SimInfo* info, const std::string& filename) | |
97 | : info_(info), filename_(filename){ | |
98 | + | |
99 | + | Globals* simParams = info->getSimParams(); |
100 | + | eorFilename_ = filename_.substr(0, filename_.rfind(".")) + ".eor"; |
101 | + | |
102 | + | needCompression_ = simParams->getCompressDumpFile(); |
103 | + | needForceVector_ = simParams->getOutputForceVector(); |
104 | + | createDumpFile_ = true; |
105 | + | #ifdef HAVE_LIBZ |
106 | + | if (needCompression_) { |
107 | + | filename_ += ".gz"; |
108 | + | eorFilename_ += ".gz"; |
109 | + | } |
110 | + | #endif |
111 | + | |
112 | #ifdef IS_MPI | |
113 | ||
114 | if (worldRank == 0) { | |
115 | #endif // is_mpi | |
116 | ||
117 | < | eorFilename_ = filename_.substr(0, filename_.rfind(".")) + ".eor"; |
118 | < | dumpFile_.open(filename_.c_str(), std::ios::out | std::ios::trunc); |
117 | > | |
118 | > | dumpFile_ = createOStream(filename_); |
119 | ||
120 | if (!dumpFile_) { | |
121 | sprintf(painCave.errMsg, "Could not open \"%s\" for dump output.\n", | |
# | Line 104 | Line 134 | namespace oopse { | |
134 | #endif // is_mpi | |
135 | ||
136 | } | |
137 | + | |
138 | + | DumpWriter::DumpWriter(SimInfo* info, const std::string& filename, bool writeDumpFile) |
139 | + | : info_(info), filename_(filename){ |
140 | + | |
141 | + | Globals* simParams = info->getSimParams(); |
142 | + | eorFilename_ = filename_.substr(0, filename_.rfind(".")) + ".eor"; |
143 | + | |
144 | + | needCompression_ = simParams->getCompressDumpFile(); |
145 | + | needForceVector_ = simParams->getOutputForceVector(); |
146 | + | |
147 | + | #ifdef HAVE_LIBZ |
148 | + | if (needCompression_) { |
149 | + | filename_ += ".gz"; |
150 | + | eorFilename_ += ".gz"; |
151 | + | } |
152 | + | #endif |
153 | + | |
154 | + | #ifdef IS_MPI |
155 | + | |
156 | + | if (worldRank == 0) { |
157 | + | #endif // is_mpi |
158 | + | |
159 | + | createDumpFile_ = writeDumpFile; |
160 | + | if (createDumpFile_) { |
161 | + | dumpFile_ = createOStream(filename_); |
162 | + | |
163 | + | if (!dumpFile_) { |
164 | + | sprintf(painCave.errMsg, "Could not open \"%s\" for dump output.\n", |
165 | + | filename_.c_str()); |
166 | + | painCave.isFatal = 1; |
167 | + | simError(); |
168 | + | } |
169 | + | } |
170 | + | #ifdef IS_MPI |
171 | + | |
172 | + | } |
173 | + | |
174 | + | sprintf(checkPointMsg, "Sucessfully opened output file for dumping.\n"); |
175 | + | MPIcheckPoint(); |
176 | + | |
177 | + | #endif // is_mpi |
178 | + | |
179 | + | } |
180 | + | |
181 | + | |
182 | + | |
183 | + | |
184 | + | |
185 | ||
186 | DumpWriter::~DumpWriter() { | |
187 | ||
# | Line 111 | Line 189 | namespace oopse { | |
189 | ||
190 | if (worldRank == 0) { | |
191 | #endif // is_mpi | |
192 | < | |
193 | < | dumpFile_.close(); |
194 | < | |
192 | > | if (createDumpFile_){ |
193 | > | delete dumpFile_; |
194 | > | } |
195 | #ifdef IS_MPI | |
196 | ||
197 | } | |
# | Line 124 | Line 202 | namespace oopse { | |
202 | ||
203 | void DumpWriter::writeCommentLine(std::ostream& os, Snapshot* s) { | |
204 | ||
205 | < | double currentTime; |
205 | > | RealType currentTime; |
206 | Mat3x3d hmat; | |
207 | < | double chi; |
208 | < | double integralOfChiDt; |
207 | > | RealType chi; |
208 | > | RealType integralOfChiDt; |
209 | Mat3x3d eta; | |
210 | ||
211 | currentTime = s->getTime(); | |
# | Line 143 | Line 221 | namespace oopse { | |
221 | ||
222 | //write out additional parameters, such as chi and eta | |
223 | ||
224 | < | os << chi << "\t" << integralOfChiDt << "\t;"; |
224 | > | os << chi << "\t" << integralOfChiDt << ";\t"; |
225 | ||
226 | os << eta(0, 0) << "\t" << eta(1, 0) << "\t" << eta(2, 0) << ";\t" | |
227 | << eta(0, 1) << "\t" << eta(1, 1) << "\t" << eta(2, 1) << ";\t" | |
# | Line 163 | Line 241 | namespace oopse { | |
241 | Vector3d ji; | |
242 | Vector3d pos; | |
243 | Vector3d vel; | |
244 | + | Vector3d frc; |
245 | + | Vector3d trq; |
246 | ||
247 | Molecule* mol; | |
248 | StuntDouble* integrableObject; | |
# | Line 199 | Line 279 | namespace oopse { | |
279 | q = integrableObject->getQ(); | |
280 | ji = integrableObject->getJ(); | |
281 | ||
282 | < | sprintf(tempBuffer, "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", |
282 | > | sprintf(tempBuffer, "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
283 | q[0], q[1], q[2], q[3], | |
284 | ji[0], ji[1], ji[2]); | |
285 | strcat(writeLine, tempBuffer); | |
286 | } else { | |
287 | < | strcat(writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n"); |
287 | > | strcat(writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"); |
288 | } | |
289 | ||
290 | + | if (needForceVector_) { |
291 | + | frc = integrableObject->getFrc(); |
292 | + | trq = integrableObject->getTrq(); |
293 | + | |
294 | + | sprintf(tempBuffer, "\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
295 | + | frc[0], frc[1], frc[2], |
296 | + | trq[0], trq[1], trq[2]); |
297 | + | strcat(writeLine, tempBuffer); |
298 | + | } |
299 | + | |
300 | + | strcat(writeLine, "\n"); |
301 | os << writeLine; | |
302 | ||
303 | } | |
# | Line 256 | Line 347 | namespace oopse { | |
347 | int myPotato; | |
348 | int nProc; | |
349 | int which_node; | |
350 | < | double atomData[13]; |
350 | > | RealType atomData[19]; |
351 | int isDirectional; | |
352 | char MPIatomTypeString[MINIBUFFERSIZE]; | |
353 | int msgLen; // the length of message actually recieved at master nodes | |
# | Line 331 | Line 422 | namespace oopse { | |
422 | ||
423 | myPotato++; | |
424 | ||
425 | < | MPI_Recv(atomData, 13, MPI_DOUBLE, which_node, myPotato, |
425 | > | MPI_Recv(atomData, 19, MPI_REALTYPE, which_node, myPotato, |
426 | MPI_COMM_WORLD, &istatus); | |
427 | myPotato++; | |
428 | ||
429 | < | MPI_Get_count(&istatus, MPI_DOUBLE, &msgLen); |
429 | > | MPI_Get_count(&istatus, MPI_REALTYPE, &msgLen); |
430 | ||
431 | < | if (msgLen == 13) |
431 | > | if (msgLen == 13 || msgLen == 19) |
432 | isDirectional = 1; | |
433 | else | |
434 | isDirectional = 0; | |
# | Line 352 | Line 443 | namespace oopse { | |
443 | atomData[5]); | |
444 | ||
445 | strcat(writeLine, | |
446 | < | "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n"); |
446 | > | "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"); |
447 | } else { | |
448 | sprintf(writeLine, | |
449 | < | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", |
449 | > | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
450 | MPIatomTypeString, | |
451 | atomData[0], | |
452 | atomData[1], | |
# | Line 371 | Line 462 | namespace oopse { | |
462 | atomData[11], | |
463 | atomData[12]); | |
464 | } | |
465 | + | |
466 | + | if (needForceVector_) { |
467 | + | if (!isDirectional) { |
468 | + | sprintf(writeLine, "\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
469 | + | atomData[6], |
470 | + | atomData[7], |
471 | + | atomData[8], |
472 | + | atomData[9], |
473 | + | atomData[10], |
474 | + | atomData[11]); |
475 | + | } else { |
476 | + | sprintf(writeLine, "\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
477 | + | atomData[13], |
478 | + | atomData[14], |
479 | + | atomData[15], |
480 | + | atomData[16], |
481 | + | atomData[17], |
482 | + | atomData[18]); |
483 | + | } |
484 | + | } |
485 | ||
486 | + | sprintf(writeLine, "\n"); |
487 | os << writeLine; | |
488 | ||
489 | } // end for(int l =0) | |
# | Line 421 | Line 533 | namespace oopse { | |
533 | atomData[10] = ji[0]; | |
534 | atomData[11] = ji[1]; | |
535 | atomData[12] = ji[2]; | |
536 | + | } |
537 | + | |
538 | + | if (needForceVector_) { |
539 | + | frc = integrableObject->getFrc(); |
540 | + | trq = integrableObject->getTrq(); |
541 | + | |
542 | + | if (!isDirectional) { |
543 | + | atomData[6] = frc[0]; |
544 | + | atomData[7] = frc[1]; |
545 | + | atomData[8] = frc[2]; |
546 | + | atomData[9] = trq[0]; |
547 | + | atomData[10] = trq[1]; |
548 | + | atomData[11] = trq[2]; |
549 | + | } else { |
550 | + | atomData[13] = frc[0]; |
551 | + | atomData[14] = frc[1]; |
552 | + | atomData[15] = frc[2]; |
553 | + | atomData[16] = trq[0]; |
554 | + | atomData[17] = trq[1]; |
555 | + | atomData[18] = trq[2]; |
556 | + | } |
557 | } | |
558 | ||
559 | // If we've survived to here, format the line: | |
# | Line 433 | Line 566 | namespace oopse { | |
566 | atomData[5]); | |
567 | ||
568 | strcat(writeLine, | |
569 | < | "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n"); |
569 | > | "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"); |
570 | } else { | |
571 | sprintf(writeLine, | |
572 | < | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", |
572 | > | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
573 | integrableObject->getType().c_str(), | |
574 | atomData[0], | |
575 | atomData[1], | |
# | Line 453 | Line 586 | namespace oopse { | |
586 | atomData[12]); | |
587 | } | |
588 | ||
589 | + | if (needForceVector_) { |
590 | + | if (!isDirectional) { |
591 | + | sprintf(writeLine, "\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
592 | + | atomData[6], |
593 | + | atomData[7], |
594 | + | atomData[8], |
595 | + | atomData[9], |
596 | + | atomData[10], |
597 | + | atomData[11]); |
598 | + | } else { |
599 | + | sprintf(writeLine, "\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf", |
600 | + | atomData[13], |
601 | + | atomData[14], |
602 | + | atomData[15], |
603 | + | atomData[16], |
604 | + | atomData[17], |
605 | + | atomData[18]); |
606 | + | } |
607 | + | } |
608 | ||
609 | < | os << writeLine; |
609 | > | os << writeLine << "\n"; |
610 | ||
611 | } //end for(iter = integrableObject.begin()) | |
612 | } | |
# | Line 539 | Line 691 | namespace oopse { | |
691 | atomData[12] = ji[2]; | |
692 | } | |
693 | ||
694 | + | if (needForceVector_) { |
695 | + | frc = integrableObject->getFrc(); |
696 | + | trq = integrableObject->getTrq(); |
697 | + | |
698 | + | if (!isDirectional) { |
699 | + | atomData[6] = frc[0]; |
700 | + | atomData[7] = frc[1]; |
701 | + | atomData[8] = frc[2]; |
702 | + | |
703 | + | atomData[9] = trq[0]; |
704 | + | atomData[10] = trq[1]; |
705 | + | atomData[11] = trq[2]; |
706 | + | } else { |
707 | + | atomData[13] = frc[0]; |
708 | + | atomData[14] = frc[1]; |
709 | + | atomData[15] = frc[2]; |
710 | + | |
711 | + | atomData[16] = trq[0]; |
712 | + | atomData[17] = trq[1]; |
713 | + | atomData[18] = trq[2]; |
714 | + | } |
715 | + | } |
716 | + | |
717 | strncpy(MPIatomTypeString, integrableObject->getType().c_str(), MINIBUFFERSIZE); | |
718 | ||
719 | // null terminate the std::string before sending (just in case): | |
# | Line 549 | Line 724 | namespace oopse { | |
724 | ||
725 | myPotato++; | |
726 | ||
727 | < | if (isDirectional) { |
728 | < | MPI_Send(atomData, 13, MPI_DOUBLE, 0, myPotato, |
727 | > | if (isDirectional && needForceVector_) { |
728 | > | MPI_Send(atomData, 19, MPI_REALTYPE, 0, myPotato, |
729 | MPI_COMM_WORLD); | |
730 | + | } else if (isDirectional) { |
731 | + | MPI_Send(atomData, 13, MPI_REALTYPE, 0, myPotato, |
732 | + | MPI_COMM_WORLD); |
733 | + | } else if (needForceVector_) { |
734 | + | MPI_Send(atomData, 12, MPI_REALTYPE, 0, myPotato, |
735 | + | MPI_COMM_WORLD); |
736 | } else { | |
737 | < | MPI_Send(atomData, 6, MPI_DOUBLE, 0, myPotato, |
737 | > | MPI_Send(atomData, 6, MPI_REALTYPE, 0, myPotato, |
738 | MPI_COMM_WORLD); | |
739 | } | |
740 | ||
# | Line 572 | Line 753 | namespace oopse { | |
753 | } | |
754 | ||
755 | void DumpWriter::writeDump() { | |
756 | < | writeFrame(dumpFile_); |
576 | < | |
756 | > | writeFrame(*dumpFile_); |
757 | } | |
758 | ||
759 | void DumpWriter::writeEor() { | |
760 | < | std::ofstream eorStream; |
760 | > | std::ostream* eorStream; |
761 | ||
762 | #ifdef IS_MPI | |
763 | if (worldRank == 0) { | |
764 | #endif // is_mpi | |
765 | ||
766 | < | eorStream.open(eorFilename_.c_str()); |
587 | < | if (!eorStream.is_open()) { |
588 | < | sprintf(painCave.errMsg, "DumpWriter : Could not open \"%s\" for writing.\n", |
589 | < | eorFilename_.c_str()); |
590 | < | painCave.isFatal = 1; |
591 | < | simError(); |
592 | < | } |
766 | > | eorStream = createOStream(eorFilename_); |
767 | ||
768 | #ifdef IS_MPI | |
769 | } | |
770 | #endif // is_mpi | |
771 | ||
772 | < | writeFrame(eorStream); |
772 | > | writeFrame(*eorStream); |
773 | > | |
774 | > | #ifdef IS_MPI |
775 | > | if (worldRank == 0) { |
776 | > | #endif // is_mpi |
777 | > | delete eorStream; |
778 | > | |
779 | > | #ifdef IS_MPI |
780 | > | } |
781 | > | #endif // is_mpi |
782 | > | |
783 | } | |
784 | ||
785 | ||
786 | void DumpWriter::writeDumpAndEor() { | |
603 | – | std::ofstream eorStream; |
787 | std::vector<std::streambuf*> buffers; | |
788 | + | std::ostream* eorStream; |
789 | #ifdef IS_MPI | |
790 | if (worldRank == 0) { | |
791 | #endif // is_mpi | |
792 | ||
793 | < | buffers.push_back(dumpFile_.rdbuf()); |
793 | > | buffers.push_back(dumpFile_->rdbuf()); |
794 | ||
795 | < | eorStream.open(eorFilename_.c_str()); |
612 | < | if (!eorStream.is_open()) { |
613 | < | sprintf(painCave.errMsg, "DumpWriter : Could not open \"%s\" for writing.\n", |
614 | < | eorFilename_.c_str()); |
615 | < | painCave.isFatal = 1; |
616 | < | simError(); |
617 | < | } |
795 | > | eorStream = createOStream(eorFilename_); |
796 | ||
797 | < | buffers.push_back(eorStream.rdbuf()); |
797 | > | buffers.push_back(eorStream->rdbuf()); |
798 | ||
799 | #ifdef IS_MPI | |
800 | } | |
# | Line 626 | Line 804 | namespace oopse { | |
804 | std::ostream os(&tbuf); | |
805 | ||
806 | writeFrame(os); | |
807 | + | |
808 | + | #ifdef IS_MPI |
809 | + | if (worldRank == 0) { |
810 | + | #endif // is_mpi |
811 | + | delete eorStream; |
812 | + | |
813 | + | #ifdef IS_MPI |
814 | + | } |
815 | + | #endif // is_mpi |
816 | ||
817 | } | |
818 | ||
819 | + | std::ostream* DumpWriter::createOStream(const std::string& filename) { |
820 | ||
821 | + | std::ostream* newOStream; |
822 | + | #ifdef HAVE_LIBZ |
823 | + | if (needCompression_) { |
824 | + | newOStream = new ogzstream(filename.c_str()); |
825 | + | } else { |
826 | + | newOStream = new std::ofstream(filename.c_str()); |
827 | + | } |
828 | + | #else |
829 | + | newOStream = new std::ofstream(filename.c_str()); |
830 | + | #endif |
831 | + | return newOStream; |
832 | + | } |
833 | ||
834 | }//end namespace oopse |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |