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 1629 by gezelter, Wed Sep 14 21:15:17 2011 UTC

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

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 1629 by gezelter, Wed Sep 14 21:15:17 2011 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines