ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/io/DumpWriter.cpp
(Generate patch)

Comparing:
trunk/src/io/DumpWriter.cpp (file contents), Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
branches/development/src/io/DumpWriter.cpp (file contents), Revision 1712 by gezelter, Sat May 19 13:30:21 2012 UTC

# Line 36 | Line 36
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 < * [4]  Vardeman & Gezelter, in progress (2009).                        
39 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
42  
43   #include "io/DumpWriter.hpp"
# Line 46 | Line 47
47   #include "io/gzstream.hpp"
48   #include "io/Globals.hpp"
49  
50 +
51   #ifdef IS_MPI
52   #include <mpi.h>
53   #endif //is_mpi
54  
55 + using namespace std;
56   namespace OpenMD {
57  
58    DumpWriter::DumpWriter(SimInfo* info)
# Line 58 | Line 61 | namespace OpenMD {
61      Globals* simParams = info->getSimParams();
62      needCompression_ = simParams->getCompressDumpFile();
63      needForceVector_ = simParams->getOutputForceVector();
64 +    needParticlePot_ = simParams->getOutputParticlePotential();
65 +    cerr << "DW npp = " << needParticlePot_ << "\n";
66      createDumpFile_ = true;
67   #ifdef HAVE_LIBZ
68      if (needCompression_) {
# Line 97 | Line 102 | namespace OpenMD {
102  
103      needCompression_ = simParams->getCompressDumpFile();
104      needForceVector_ = simParams->getOutputForceVector();
105 +    needParticlePot_ = simParams->getOutputParticlePotential();
106      createDumpFile_ = true;
107   #ifdef HAVE_LIBZ
108      if (needCompression_) {
# Line 136 | Line 142 | namespace OpenMD {
142      
143      needCompression_ = simParams->getCompressDumpFile();
144      needForceVector_ = simParams->getOutputForceVector();
145 +    needParticlePot_ = simParams->getOutputParticlePotential();
146      
147   #ifdef HAVE_LIBZ
148      if (needCompression_) {
# Line 194 | Line 201 | namespace OpenMD {
201      os << "    <FrameData>\n";
202  
203      RealType currentTime = s->getTime();
204 +
205 +    if (isinf(currentTime) || isnan(currentTime)) {      
206 +      sprintf( painCave.errMsg,
207 +               "DumpWriter detected a numerical error writing the time");      
208 +      painCave.isFatal = 1;
209 +      simError();
210 +    }
211 +    
212      sprintf(buffer, "        Time: %.10g\n", currentTime);
213      os << buffer;
214  
215      Mat3x3d hmat;
216      hmat = s->getHmat();
217 +
218 +    for (unsigned int i = 0; i < 3; i++) {
219 +      for (unsigned int j = 0; j < 3; j++) {
220 +        if (isinf(hmat(i,j)) || isnan(hmat(i,j))) {      
221 +          sprintf( painCave.errMsg,
222 +                   "DumpWriter detected a numerical error writing the box");
223 +          painCave.isFatal = 1;
224 +          simError();
225 +        }        
226 +      }
227 +    }
228 +    
229      sprintf(buffer, "        Hmat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
230              hmat(0, 0), hmat(1, 0), hmat(2, 0),
231              hmat(0, 1), hmat(1, 1), hmat(2, 1),
# Line 207 | Line 234 | namespace OpenMD {
234  
235      RealType chi = s->getChi();
236      RealType integralOfChiDt = s->getIntegralOfChiDt();
237 +    if (isinf(chi) || isnan(chi) ||
238 +        isinf(integralOfChiDt) || isnan(integralOfChiDt)) {      
239 +      sprintf( painCave.errMsg,
240 +               "DumpWriter detected a numerical error writing the thermostat");
241 +      painCave.isFatal = 1;
242 +      simError();
243 +    }
244      sprintf(buffer, "  Thermostat: %.10g , %.10g\n", chi, integralOfChiDt);
245      os << buffer;
246  
247      Mat3x3d eta;
248      eta = s->getEta();
249 +
250 +    for (unsigned int i = 0; i < 3; i++) {
251 +      for (unsigned int j = 0; j < 3; j++) {
252 +        if (isinf(eta(i,j)) || isnan(eta(i,j))) {      
253 +          sprintf( painCave.errMsg,
254 +                   "DumpWriter detected a numerical error writing the barostat");
255 +          painCave.isFatal = 1;
256 +          simError();
257 +        }        
258 +      }
259 +    }
260 +
261      sprintf(buffer, "    Barostat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
262              eta(0, 0), eta(1, 0), eta(2, 0),
263              eta(0, 1), eta(1, 1), eta(2, 1),
# Line 265 | Line 311 | namespace OpenMD {
311      }
312      
313      const int masterNode = 0;
314 <
314 >    int nProc;
315 >    MPI_Comm_size(MPI_COMM_WORLD, &nProc);
316      if (worldRank == masterNode) {      
317        os << "  <Snapshot>\n";  
318        writeFrameProperties(os, info_->getSnapshotManager()->getCurrentSnapshot());
# Line 273 | Line 320 | namespace OpenMD {
320          
321        os << buffer;
322  
276      int nProc;
277      MPI_Comm_size(MPI_COMM_WORLD, &nProc);
323        for (int i = 1; i < nProc; ++i) {
324  
325          // receive the length of the string buffer that was
326          // prepared by processor i
327  
328 +        MPI_Bcast(&i, 1, MPI_INT,masterNode,MPI_COMM_WORLD);
329          int recvLength;
330          MPI_Recv(&recvLength, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &istatus);
331          char* recvBuffer = new char[recvLength];
# Line 296 | Line 342 | namespace OpenMD {
342        os.flush();
343      } else {
344        int sendBufferLength = buffer.size() + 1;
345 <      MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD);
346 <      MPI_Send((void *)buffer.c_str(), sendBufferLength, MPI_CHAR, masterNode, 0, MPI_COMM_WORLD);
345 >      int myturn = 0;
346 >      for (int i = 1; i < nProc; ++i){
347 >        MPI_Bcast(&myturn,1, MPI_INT,masterNode,MPI_COMM_WORLD);
348 >        if (myturn == worldRank){
349 >          MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD);
350 >          MPI_Send((void *)buffer.c_str(), sendBufferLength, MPI_CHAR, masterNode, 0, MPI_COMM_WORLD);
351 >        }
352 >      }
353      }
354  
355   #endif // is_mpi
# Line 314 | Line 366 | namespace OpenMD {
366      Vector3d pos;
367      Vector3d vel;
368      pos = integrableObject->getPos();
369 +
370 +    if (isinf(pos[0]) || isnan(pos[0]) ||
371 +        isinf(pos[1]) || isnan(pos[1]) ||
372 +        isinf(pos[2]) || isnan(pos[2]) ) {      
373 +      sprintf( painCave.errMsg,
374 +               "DumpWriter detected a numerical error writing the position"
375 +               " for object %d", index);      
376 +      painCave.isFatal = 1;
377 +      simError();
378 +    }
379 +
380      vel = integrableObject->getVel();          
381 +
382 +    if (isinf(vel[0]) || isnan(vel[0]) ||
383 +        isinf(vel[1]) || isnan(vel[1]) ||
384 +        isinf(vel[2]) || isnan(vel[2]) ) {      
385 +      sprintf( painCave.errMsg,
386 +               "DumpWriter detected a numerical error writing the velocity"
387 +               " for object %d", index);      
388 +      painCave.isFatal = 1;
389 +      simError();
390 +    }
391 +
392      sprintf(tempBuffer, "%18.10g %18.10g %18.10g %13e %13e %13e",
393              pos[0], pos[1], pos[2],
394              vel[0], vel[1], vel[2]);                    
# Line 325 | Line 399 | namespace OpenMD {
399        Quat4d q;
400        Vector3d ji;
401        q = integrableObject->getQ();
402 +
403 +      if (isinf(q[0]) || isnan(q[0]) ||
404 +          isinf(q[1]) || isnan(q[1]) ||
405 +          isinf(q[2]) || isnan(q[2]) ||
406 +          isinf(q[3]) || isnan(q[3]) ) {      
407 +        sprintf( painCave.errMsg,
408 +                 "DumpWriter detected a numerical error writing the quaternion"
409 +                 " for object %d", index);      
410 +        painCave.isFatal = 1;
411 +        simError();
412 +      }
413 +
414        ji = integrableObject->getJ();
415 +
416 +      if (isinf(ji[0]) || isnan(ji[0]) ||
417 +          isinf(ji[1]) || isnan(ji[1]) ||
418 +          isinf(ji[2]) || isnan(ji[2]) ) {      
419 +        sprintf( painCave.errMsg,
420 +                 "DumpWriter detected a numerical error writing the angular"
421 +                 " momentum for object %d", index);      
422 +        painCave.isFatal = 1;
423 +        simError();
424 +      }
425 +
426        sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e %13e",
427                q[0], q[1], q[2], q[3],
428                ji[0], ji[1], ji[2]);
# Line 333 | Line 430 | namespace OpenMD {
430      }
431  
432      if (needForceVector_) {
433 <      type += "ft";
433 >      type += "f";
434        Vector3d frc;
435 <      Vector3d trq;
435 >
436        frc = integrableObject->getFrc();
437 <      trq = integrableObject->getTrq();
438 <              
439 <      sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e",
440 <              frc[0], frc[1], frc[2],
441 <              trq[0], trq[1], trq[2]);
437 >
438 >      if (isinf(frc[0]) || isnan(frc[0]) ||
439 >          isinf(frc[1]) || isnan(frc[1]) ||
440 >          isinf(frc[2]) || isnan(frc[2]) ) {      
441 >        sprintf( painCave.errMsg,
442 >                 "DumpWriter detected a numerical error writing the force"
443 >                 " for object %d", index);      
444 >        painCave.isFatal = 1;
445 >        simError();
446 >      }
447 >      sprintf(tempBuffer, " %13e %13e %13e",
448 >              frc[0], frc[1], frc[2]);
449        line += tempBuffer;
450 +      
451 +      if (integrableObject->isDirectional()) {
452 +        type += "t";
453 +        Vector3d trq;
454 +        
455 +        trq = integrableObject->getTrq();
456 +        
457 +        if (isinf(trq[0]) || isnan(trq[0]) ||
458 +            isinf(trq[1]) || isnan(trq[1]) ||
459 +            isinf(trq[2]) || isnan(trq[2]) ) {      
460 +          sprintf( painCave.errMsg,
461 +                   "DumpWriter detected a numerical error writing the torque"
462 +                   " for object %d", index);      
463 +          painCave.isFatal = 1;
464 +          simError();
465 +        }
466 +        
467 +        sprintf(tempBuffer, " %13e %13e %13e",
468 +                trq[0], trq[1], trq[2]);
469 +        line += tempBuffer;
470 +      }      
471      }
472 <        
472 >    if (needParticlePot_) {
473 >      type += "u";
474 >      RealType particlePot;
475 >
476 >      particlePot = integrableObject->getParticlePot();
477 >
478 >      if (isinf(particlePot) || isnan(particlePot)) {      
479 >        sprintf( painCave.errMsg,
480 >                 "DumpWriter detected a numerical error writing the particle "
481 >                 " potential for object %d", index);      
482 >        painCave.isFatal = 1;
483 >        simError();
484 >      }
485 >      sprintf(tempBuffer, " %13e", particlePot);
486 >      line += tempBuffer;
487 >    }
488 >    
489      sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str());
490      return std::string(tempBuffer);
491    }

Comparing:
trunk/src/io/DumpWriter.cpp (property svn:keywords), Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
branches/development/src/io/DumpWriter.cpp (property svn:keywords), Revision 1712 by gezelter, Sat May 19 13:30:21 2012 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines