ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/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.
Revision 1564 by chuckv, Wed May 18 19:28:52 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 194 | Line 196 | namespace OpenMD {
196      os << "    <FrameData>\n";
197  
198      RealType currentTime = s->getTime();
199 +
200 +    if (isinf(currentTime) || isnan(currentTime)) {      
201 +      sprintf( painCave.errMsg,
202 +               "DumpWriter detected a numerical error writing the time");      
203 +      painCave.isFatal = 1;
204 +      simError();
205 +    }
206 +    
207      sprintf(buffer, "        Time: %.10g\n", currentTime);
208      os << buffer;
209  
210      Mat3x3d hmat;
211      hmat = s->getHmat();
212 +
213 +    for (unsigned int i = 0; i < 3; i++) {
214 +      for (unsigned int j = 0; j < 3; j++) {
215 +        if (isinf(hmat(i,j)) || isnan(hmat(i,j))) {      
216 +          sprintf( painCave.errMsg,
217 +                   "DumpWriter detected a numerical error writing the box");
218 +          painCave.isFatal = 1;
219 +          simError();
220 +        }        
221 +      }
222 +    }
223 +    
224      sprintf(buffer, "        Hmat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
225              hmat(0, 0), hmat(1, 0), hmat(2, 0),
226              hmat(0, 1), hmat(1, 1), hmat(2, 1),
# Line 207 | Line 229 | namespace OpenMD {
229  
230      RealType chi = s->getChi();
231      RealType integralOfChiDt = s->getIntegralOfChiDt();
232 +    if (isinf(chi) || isnan(chi) ||
233 +        isinf(integralOfChiDt) || isnan(integralOfChiDt)) {      
234 +      sprintf( painCave.errMsg,
235 +               "DumpWriter detected a numerical error writing the thermostat");
236 +      painCave.isFatal = 1;
237 +      simError();
238 +    }
239      sprintf(buffer, "  Thermostat: %.10g , %.10g\n", chi, integralOfChiDt);
240      os << buffer;
241  
242      Mat3x3d eta;
243      eta = s->getEta();
244 +
245 +    for (unsigned int i = 0; i < 3; i++) {
246 +      for (unsigned int j = 0; j < 3; j++) {
247 +        if (isinf(eta(i,j)) || isnan(eta(i,j))) {      
248 +          sprintf( painCave.errMsg,
249 +                   "DumpWriter detected a numerical error writing the barostat");
250 +          painCave.isFatal = 1;
251 +          simError();
252 +        }        
253 +      }
254 +    }
255 +
256      sprintf(buffer, "    Barostat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n",
257              eta(0, 0), eta(1, 0), eta(2, 0),
258              eta(0, 1), eta(1, 1), eta(2, 1),
# Line 265 | Line 306 | namespace OpenMD {
306      }
307      
308      const int masterNode = 0;
309 <
309 >    int nProc;
310 >    MPI_Comm_size(MPI_COMM_WORLD, &nProc);
311      if (worldRank == masterNode) {      
312        os << "  <Snapshot>\n";  
313        writeFrameProperties(os, info_->getSnapshotManager()->getCurrentSnapshot());
# Line 273 | Line 315 | namespace OpenMD {
315          
316        os << buffer;
317  
318 <      int nProc;
277 <      MPI_Comm_size(MPI_COMM_WORLD, &nProc);
318 >    
319        for (int i = 1; i < nProc; ++i) {
320  
321          // receive the length of the string buffer that was
322          // prepared by processor i
323 <
323 >      
324 >        MPI_Bcast(&i, 1, MPI_INT,masterNode,MPI_COMM_WORLD);
325          int recvLength;
326          MPI_Recv(&recvLength, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &istatus);
327          char* recvBuffer = new char[recvLength];
# Line 296 | Line 338 | namespace OpenMD {
338        os.flush();
339      } else {
340        int sendBufferLength = buffer.size() + 1;
341 <      MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD);
342 <      MPI_Send((void *)buffer.c_str(), sendBufferLength, MPI_CHAR, masterNode, 0, MPI_COMM_WORLD);
341 >      int myturn = 0;
342 >      for (int i = 1; i < nProc; ++i){
343 >        MPI_Bcast(&myturn,1, MPI_INT,masterNode,MPI_COMM_WORLD);
344 >        if (myturn == worldRank){
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);
347 >        }
348 >      }
349      }
350  
351   #endif // is_mpi
# Line 314 | Line 362 | namespace OpenMD {
362      Vector3d pos;
363      Vector3d vel;
364      pos = integrableObject->getPos();
365 +
366 +    if (isinf(pos[0]) || isnan(pos[0]) ||
367 +        isinf(pos[1]) || isnan(pos[1]) ||
368 +        isinf(pos[2]) || isnan(pos[2]) ) {      
369 +      sprintf( painCave.errMsg,
370 +               "DumpWriter detected a numerical error writing the position"
371 +               " for object %d", index);      
372 +      painCave.isFatal = 1;
373 +      simError();
374 +    }
375 +
376      vel = integrableObject->getVel();          
377 +
378 +    if (isinf(vel[0]) || isnan(vel[0]) ||
379 +        isinf(vel[1]) || isnan(vel[1]) ||
380 +        isinf(vel[2]) || isnan(vel[2]) ) {      
381 +      sprintf( painCave.errMsg,
382 +               "DumpWriter detected a numerical error writing the velocity"
383 +               " for object %d", index);      
384 +      painCave.isFatal = 1;
385 +      simError();
386 +    }
387 +
388      sprintf(tempBuffer, "%18.10g %18.10g %18.10g %13e %13e %13e",
389              pos[0], pos[1], pos[2],
390              vel[0], vel[1], vel[2]);                    
# Line 325 | Line 395 | namespace OpenMD {
395        Quat4d q;
396        Vector3d ji;
397        q = integrableObject->getQ();
398 +
399 +      if (isinf(q[0]) || isnan(q[0]) ||
400 +          isinf(q[1]) || isnan(q[1]) ||
401 +          isinf(q[2]) || isnan(q[2]) ||
402 +          isinf(q[3]) || isnan(q[3]) ) {      
403 +        sprintf( painCave.errMsg,
404 +                 "DumpWriter detected a numerical error writing the quaternion"
405 +                 " for object %d", index);      
406 +        painCave.isFatal = 1;
407 +        simError();
408 +      }
409 +
410        ji = integrableObject->getJ();
411 +
412 +      if (isinf(ji[0]) || isnan(ji[0]) ||
413 +          isinf(ji[1]) || isnan(ji[1]) ||
414 +          isinf(ji[2]) || isnan(ji[2]) ) {      
415 +        sprintf( painCave.errMsg,
416 +                 "DumpWriter detected a numerical error writing the angular"
417 +                 " momentum for object %d", index);      
418 +        painCave.isFatal = 1;
419 +        simError();
420 +      }
421 +
422        sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e %13e",
423                q[0], q[1], q[2], q[3],
424                ji[0], ji[1], ji[2]);
# Line 333 | Line 426 | namespace OpenMD {
426      }
427  
428      if (needForceVector_) {
429 <      type += "ft";
429 >      type += "f";
430        Vector3d frc;
431 <      Vector3d trq;
431 >
432        frc = integrableObject->getFrc();
433 <      trq = integrableObject->getTrq();
434 <              
435 <      sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e",
436 <              frc[0], frc[1], frc[2],
437 <              trq[0], trq[1], trq[2]);
433 >
434 >      if (isinf(frc[0]) || isnan(frc[0]) ||
435 >          isinf(frc[1]) || isnan(frc[1]) ||
436 >          isinf(frc[2]) || isnan(frc[2]) ) {      
437 >        sprintf( painCave.errMsg,
438 >                 "DumpWriter detected a numerical error writing the force"
439 >                 " for object %d", index);      
440 >        painCave.isFatal = 1;
441 >        simError();
442 >      }
443 >      sprintf(tempBuffer, " %13e %13e %13e",
444 >              frc[0], frc[1], frc[2]);
445        line += tempBuffer;
446 +      
447 +      if (integrableObject->isDirectional()) {
448 +        type += "t";
449 +        Vector3d trq;
450 +        
451 +        trq = integrableObject->getTrq();
452 +        
453 +        if (isinf(trq[0]) || isnan(trq[0]) ||
454 +            isinf(trq[1]) || isnan(trq[1]) ||
455 +            isinf(trq[2]) || isnan(trq[2]) ) {      
456 +          sprintf( painCave.errMsg,
457 +                   "DumpWriter detected a numerical error writing the torque"
458 +                   " for object %d", index);      
459 +          painCave.isFatal = 1;
460 +          simError();
461 +        }
462 +        
463 +        sprintf(tempBuffer, " %13e %13e %13e",
464 +                trq[0], trq[1], trq[2]);
465 +        line += tempBuffer;
466 +      }      
467      }
468 <        
468 >    
469      sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str());
470      return std::string(tempBuffer);
471    }

Comparing trunk/src/io/DumpWriter.cpp (property svn:keywords):
Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1564 by chuckv, Wed May 18 19:28:52 2011 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines