# | 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 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 | > | double 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_DOUBLE, which_node, myPotato, |
426 | MPI_COMM_WORLD, &istatus); | |
427 | myPotato++; | |
428 | ||
429 | MPI_Get_count(&istatus, MPI_DOUBLE, &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 423 | Line 535 | namespace oopse { | |
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: | |
560 | ||
561 | if (!isDirectional) { | |
# | 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 | + | sprintf(writeLine, "\n"); |
610 | os << writeLine; | |
611 | ||
612 | } //end for(iter = integrableObject.begin()) | |
# | Line 539 | Line 692 | namespace oopse { | |
692 | atomData[12] = ji[2]; | |
693 | } | |
694 | ||
695 | + | if (needForceVector_) { |
696 | + | frc = integrableObject->getFrc(); |
697 | + | trq = integrableObject->getTrq(); |
698 | + | |
699 | + | if (!isDirectional) { |
700 | + | atomData[6] = frc[0]; |
701 | + | atomData[7] = frc[1]; |
702 | + | atomData[8] = frc[2]; |
703 | + | |
704 | + | atomData[9] = trq[0]; |
705 | + | atomData[10] = trq[1]; |
706 | + | atomData[11] = trq[2]; |
707 | + | } else { |
708 | + | atomData[13] = frc[0]; |
709 | + | atomData[14] = frc[1]; |
710 | + | atomData[15] = frc[2]; |
711 | + | |
712 | + | atomData[16] = trq[0]; |
713 | + | atomData[17] = trq[1]; |
714 | + | atomData[18] = trq[2]; |
715 | + | } |
716 | + | } |
717 | + | |
718 | strncpy(MPIatomTypeString, integrableObject->getType().c_str(), MINIBUFFERSIZE); | |
719 | ||
720 | // null terminate the std::string before sending (just in case): | |
# | Line 549 | Line 725 | namespace oopse { | |
725 | ||
726 | myPotato++; | |
727 | ||
728 | < | if (isDirectional) { |
728 | > | if (isDirectional && needForceVector_) { |
729 | > | MPI_Send(atomData, 19, MPI_DOUBLE, 0, myPotato, |
730 | > | MPI_COMM_WORLD); |
731 | > | } else if (isDirectional) { |
732 | MPI_Send(atomData, 13, MPI_DOUBLE, 0, myPotato, | |
733 | MPI_COMM_WORLD); | |
734 | + | } else if (needForceVector_) { |
735 | + | MPI_Send(atomData, 12, MPI_DOUBLE, 0, myPotato, |
736 | + | MPI_COMM_WORLD); |
737 | } else { | |
738 | MPI_Send(atomData, 6, MPI_DOUBLE, 0, myPotato, | |
739 | MPI_COMM_WORLD); | |
# | Line 572 | Line 754 | namespace oopse { | |
754 | } | |
755 | ||
756 | void DumpWriter::writeDump() { | |
757 | < | writeFrame(dumpFile_); |
576 | < | |
757 | > | writeFrame(*dumpFile_); |
758 | } | |
759 | ||
760 | void DumpWriter::writeEor() { | |
761 | < | std::ofstream eorStream; |
761 | > | std::ostream* eorStream; |
762 | ||
763 | #ifdef IS_MPI | |
764 | if (worldRank == 0) { | |
765 | #endif // is_mpi | |
766 | ||
767 | < | 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 | < | } |
767 | > | eorStream = createOStream(eorFilename_); |
768 | ||
769 | #ifdef IS_MPI | |
770 | } | |
771 | #endif // is_mpi | |
772 | ||
773 | < | writeFrame(eorStream); |
773 | > | writeFrame(*eorStream); |
774 | > | |
775 | > | #ifdef IS_MPI |
776 | > | if (worldRank == 0) { |
777 | > | #endif // is_mpi |
778 | > | delete eorStream; |
779 | > | |
780 | > | #ifdef IS_MPI |
781 | > | } |
782 | > | #endif // is_mpi |
783 | > | |
784 | } | |
785 | ||
786 | ||
787 | void DumpWriter::writeDumpAndEor() { | |
603 | – | std::ofstream eorStream; |
788 | std::vector<std::streambuf*> buffers; | |
789 | + | std::ostream* eorStream; |
790 | #ifdef IS_MPI | |
791 | if (worldRank == 0) { | |
792 | #endif // is_mpi | |
793 | ||
794 | < | buffers.push_back(dumpFile_.rdbuf()); |
794 | > | buffers.push_back(dumpFile_->rdbuf()); |
795 | ||
796 | < | 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 | < | } |
796 | > | eorStream = createOStream(eorFilename_); |
797 | ||
798 | < | buffers.push_back(eorStream.rdbuf()); |
798 | > | buffers.push_back(eorStream->rdbuf()); |
799 | ||
800 | #ifdef IS_MPI | |
801 | } | |
# | Line 626 | Line 805 | namespace oopse { | |
805 | std::ostream os(&tbuf); | |
806 | ||
807 | writeFrame(os); | |
808 | + | |
809 | + | #ifdef IS_MPI |
810 | + | if (worldRank == 0) { |
811 | + | #endif // is_mpi |
812 | + | delete eorStream; |
813 | + | |
814 | + | #ifdef IS_MPI |
815 | + | } |
816 | + | #endif // is_mpi |
817 | ||
818 | } | |
819 | ||
820 | + | std::ostream* DumpWriter::createOStream(const std::string& filename) { |
821 | ||
822 | + | std::ostream* newOStream; |
823 | + | #ifdef HAVE_LIBZ |
824 | + | if (needCompression_) { |
825 | + | newOStream = new ogzstream(filename.c_str()); |
826 | + | } else { |
827 | + | newOStream = new std::ofstream(filename.c_str()); |
828 | + | } |
829 | + | #else |
830 | + | newOStream = new std::ofstream(filename.c_str()); |
831 | + | #endif |
832 | + | return newOStream; |
833 | + | } |
834 | ||
835 | }//end namespace oopse |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |