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 1665 by gezelter, Tue Nov 22 20:38:56 2011 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      createDumpFile_ = true;
66   #ifdef HAVE_LIBZ
67      if (needCompression_) {
# Line 136 | Line 140 | namespace OpenMD {
140      
141      needCompression_ = simParams->getCompressDumpFile();
142      needForceVector_ = simParams->getOutputForceVector();
143 +    needParticlePot_ = simParams->getOutputParticlePotential();
144      
145   #ifdef HAVE_LIBZ
146      if (needCompression_) {
# Line 194 | Line 199 | namespace OpenMD {
199      os << "    <FrameData>\n";
200  
201      RealType currentTime = s->getTime();
202 +
203 +    if (isinf(currentTime) || isnan(currentTime)) {      
204 +      sprintf( painCave.errMsg,
205 +               "DumpWriter detected a numerical error writing the time");      
206 +      painCave.isFatal = 1;
207 +      simError();
208 +    }
209 +    
210      sprintf(buffer, "        Time: %.10g\n", currentTime);
211      os << buffer;
212  
213      Mat3x3d hmat;
214      hmat = s->getHmat();
215 +
216 +    for (unsigned int i = 0; i < 3; i++) {
217 +      for (unsigned int j = 0; j < 3; j++) {
218 +        if (isinf(hmat(i,j)) || isnan(hmat(i,j))) {      
219 +          sprintf( painCave.errMsg,
220 +                   "DumpWriter detected a numerical error writing the box");
221 +          painCave.isFatal = 1;
222 +          simError();
223 +        }        
224 +      }
225 +    }
226 +    
227      sprintf(buffer, "        Hmat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
228              hmat(0, 0), hmat(1, 0), hmat(2, 0),
229              hmat(0, 1), hmat(1, 1), hmat(2, 1),
# Line 207 | Line 232 | namespace OpenMD {
232  
233      RealType chi = s->getChi();
234      RealType integralOfChiDt = s->getIntegralOfChiDt();
235 +    if (isinf(chi) || isnan(chi) ||
236 +        isinf(integralOfChiDt) || isnan(integralOfChiDt)) {      
237 +      sprintf( painCave.errMsg,
238 +               "DumpWriter detected a numerical error writing the thermostat");
239 +      painCave.isFatal = 1;
240 +      simError();
241 +    }
242      sprintf(buffer, "  Thermostat: %.10g , %.10g\n", chi, integralOfChiDt);
243      os << buffer;
244  
245      Mat3x3d eta;
246      eta = s->getEta();
247 +
248 +    for (unsigned int i = 0; i < 3; i++) {
249 +      for (unsigned int j = 0; j < 3; j++) {
250 +        if (isinf(eta(i,j)) || isnan(eta(i,j))) {      
251 +          sprintf( painCave.errMsg,
252 +                   "DumpWriter detected a numerical error writing the barostat");
253 +          painCave.isFatal = 1;
254 +          simError();
255 +        }        
256 +      }
257 +    }
258 +
259      sprintf(buffer, "    Barostat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
260              eta(0, 0), eta(1, 0), eta(2, 0),
261              eta(0, 1), eta(1, 1), eta(2, 1),
# Line 265 | Line 309 | namespace OpenMD {
309      }
310      
311      const int masterNode = 0;
312 <
312 >    int nProc;
313 >    MPI_Comm_size(MPI_COMM_WORLD, &nProc);
314      if (worldRank == masterNode) {      
315        os << "  <Snapshot>\n";  
316        writeFrameProperties(os, info_->getSnapshotManager()->getCurrentSnapshot());
# Line 273 | Line 318 | namespace OpenMD {
318          
319        os << buffer;
320  
276      int nProc;
277      MPI_Comm_size(MPI_COMM_WORLD, &nProc);
321        for (int i = 1; i < nProc; ++i) {
322  
323          // receive the length of the string buffer that was
324          // prepared by processor i
325  
326 +        MPI_Bcast(&i, 1, MPI_INT,masterNode,MPI_COMM_WORLD);
327          int recvLength;
328          MPI_Recv(&recvLength, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &istatus);
329          char* recvBuffer = new char[recvLength];
# Line 296 | Line 340 | namespace OpenMD {
340        os.flush();
341      } else {
342        int sendBufferLength = buffer.size() + 1;
343 <      MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD);
344 <      MPI_Send((void *)buffer.c_str(), sendBufferLength, MPI_CHAR, masterNode, 0, MPI_COMM_WORLD);
343 >      int myturn = 0;
344 >      for (int i = 1; i < nProc; ++i){
345 >        MPI_Bcast(&myturn,1, MPI_INT,masterNode,MPI_COMM_WORLD);
346 >        if (myturn == worldRank){
347 >          MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD);
348 >          MPI_Send((void *)buffer.c_str(), sendBufferLength, MPI_CHAR, masterNode, 0, MPI_COMM_WORLD);
349 >        }
350 >      }
351      }
352  
353   #endif // is_mpi
# Line 314 | Line 364 | namespace OpenMD {
364      Vector3d pos;
365      Vector3d vel;
366      pos = integrableObject->getPos();
367 +
368 +    if (isinf(pos[0]) || isnan(pos[0]) ||
369 +        isinf(pos[1]) || isnan(pos[1]) ||
370 +        isinf(pos[2]) || isnan(pos[2]) ) {      
371 +      sprintf( painCave.errMsg,
372 +               "DumpWriter detected a numerical error writing the position"
373 +               " for object %d", index);      
374 +      painCave.isFatal = 1;
375 +      simError();
376 +    }
377 +
378      vel = integrableObject->getVel();          
379 +
380 +    if (isinf(vel[0]) || isnan(vel[0]) ||
381 +        isinf(vel[1]) || isnan(vel[1]) ||
382 +        isinf(vel[2]) || isnan(vel[2]) ) {      
383 +      sprintf( painCave.errMsg,
384 +               "DumpWriter detected a numerical error writing the velocity"
385 +               " for object %d", index);      
386 +      painCave.isFatal = 1;
387 +      simError();
388 +    }
389 +
390      sprintf(tempBuffer, "%18.10g %18.10g %18.10g %13e %13e %13e",
391              pos[0], pos[1], pos[2],
392              vel[0], vel[1], vel[2]);                    
# Line 325 | Line 397 | namespace OpenMD {
397        Quat4d q;
398        Vector3d ji;
399        q = integrableObject->getQ();
400 +
401 +      if (isinf(q[0]) || isnan(q[0]) ||
402 +          isinf(q[1]) || isnan(q[1]) ||
403 +          isinf(q[2]) || isnan(q[2]) ||
404 +          isinf(q[3]) || isnan(q[3]) ) {      
405 +        sprintf( painCave.errMsg,
406 +                 "DumpWriter detected a numerical error writing the quaternion"
407 +                 " for object %d", index);      
408 +        painCave.isFatal = 1;
409 +        simError();
410 +      }
411 +
412        ji = integrableObject->getJ();
413 +
414 +      if (isinf(ji[0]) || isnan(ji[0]) ||
415 +          isinf(ji[1]) || isnan(ji[1]) ||
416 +          isinf(ji[2]) || isnan(ji[2]) ) {      
417 +        sprintf( painCave.errMsg,
418 +                 "DumpWriter detected a numerical error writing the angular"
419 +                 " momentum for object %d", index);      
420 +        painCave.isFatal = 1;
421 +        simError();
422 +      }
423 +
424        sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e %13e",
425                q[0], q[1], q[2], q[3],
426                ji[0], ji[1], ji[2]);
# Line 333 | Line 428 | namespace OpenMD {
428      }
429  
430      if (needForceVector_) {
431 <      type += "ft";
431 >      type += "f";
432        Vector3d frc;
433 <      Vector3d trq;
433 >
434        frc = integrableObject->getFrc();
435 <      trq = integrableObject->getTrq();
436 <              
437 <      sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e",
438 <              frc[0], frc[1], frc[2],
439 <              trq[0], trq[1], trq[2]);
435 >
436 >      if (isinf(frc[0]) || isnan(frc[0]) ||
437 >          isinf(frc[1]) || isnan(frc[1]) ||
438 >          isinf(frc[2]) || isnan(frc[2]) ) {      
439 >        sprintf( painCave.errMsg,
440 >                 "DumpWriter detected a numerical error writing the force"
441 >                 " for object %d", index);      
442 >        painCave.isFatal = 1;
443 >        simError();
444 >      }
445 >      sprintf(tempBuffer, " %13e %13e %13e",
446 >              frc[0], frc[1], frc[2]);
447        line += tempBuffer;
448 +      
449 +      if (integrableObject->isDirectional()) {
450 +        type += "t";
451 +        Vector3d trq;
452 +        
453 +        trq = integrableObject->getTrq();
454 +        
455 +        if (isinf(trq[0]) || isnan(trq[0]) ||
456 +            isinf(trq[1]) || isnan(trq[1]) ||
457 +            isinf(trq[2]) || isnan(trq[2]) ) {      
458 +          sprintf( painCave.errMsg,
459 +                   "DumpWriter detected a numerical error writing the torque"
460 +                   " for object %d", index);      
461 +          painCave.isFatal = 1;
462 +          simError();
463 +        }
464 +        
465 +        sprintf(tempBuffer, " %13e %13e %13e",
466 +                trq[0], trq[1], trq[2]);
467 +        line += tempBuffer;
468 +      }      
469      }
470 <        
470 >    if (needParticlePot_) {
471 >      type += "u";
472 >      RealType particlePot;
473 >
474 >      particlePot = integrableObject->getParticlePot();
475 >
476 >      if (isinf(particlePot) || isnan(particlePot)) {      
477 >        sprintf( painCave.errMsg,
478 >                 "DumpWriter detected a numerical error writing the particle "
479 >                 " potential for object %d", index);      
480 >        painCave.isFatal = 1;
481 >        simError();
482 >      }
483 >      sprintf(tempBuffer, " %13e", particlePot);
484 >      line += tempBuffer;
485 >    }
486 >    
487      sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str());
488      return std::string(tempBuffer);
489    }

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 1665 by gezelter, Tue Nov 22 20:38:56 2011 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines