# | Line 57 | Line 57 | namespace oopse { | |
---|---|---|
57 | ||
58 | Globals* simParams = info->getSimParams(); | |
59 | needCompression_ = simParams->getCompressDumpFile(); | |
60 | < | |
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 | < | |
74 | > | |
75 | dumpFile_ = createOStream(filename_); | |
76 | ||
77 | if (!dumpFile_) { | |
# | Line 97 | Line 100 | namespace oopse { | |
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 | < | |
117 | > | |
118 | dumpFile_ = createOStream(filename_); | |
119 | ||
120 | if (!dumpFile_) { | |
# | Line 127 | 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 134 | Line 189 | namespace oopse { | |
189 | ||
190 | if (worldRank == 0) { | |
191 | #endif // is_mpi | |
192 | < | |
193 | < | delete dumpFile_; |
194 | < | |
192 | > | if (createDumpFile_){ |
193 | > | delete dumpFile_; |
194 | > | } |
195 | #ifdef IS_MPI | |
196 | ||
197 | } | |
# | Line 147 | 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 166 | 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 186 | 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 222 | 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 279 | 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 354 | 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 375 | 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 393 | Line 461 | namespace oopse { | |
461 | atomData[10], | |
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 446 | 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 456 | 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 476 | 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 562 | 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 572 | Line 725 | namespace oopse { | |
725 | ||
726 | myPotato++; | |
727 | ||
728 | < | if (isDirectional) { |
729 | < | MPI_Send(atomData, 13, MPI_DOUBLE, 0, myPotato, |
728 | > | if (isDirectional && needForceVector_) { |
729 | > | MPI_Send(atomData, 19, MPI_REALTYPE, 0, myPotato, |
730 | MPI_COMM_WORLD); | |
731 | + | } else if (isDirectional) { |
732 | + | MPI_Send(atomData, 13, MPI_REALTYPE, 0, myPotato, |
733 | + | MPI_COMM_WORLD); |
734 | + | } else if (needForceVector_) { |
735 | + | MPI_Send(atomData, 12, MPI_REALTYPE, 0, myPotato, |
736 | + | MPI_COMM_WORLD); |
737 | } else { | |
738 | < | MPI_Send(atomData, 6, MPI_DOUBLE, 0, myPotato, |
738 | > | MPI_Send(atomData, 6, MPI_REALTYPE, 0, myPotato, |
739 | MPI_COMM_WORLD); | |
740 | } | |
741 | ||
# | Line 659 | Line 818 | std::ostream* DumpWriter::createOStream(const std::str | |
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 |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |