| 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) | 
| 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), | 
| 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), | 
| 355 |  | Vector3d pos; | 
| 356 |  | Vector3d vel; | 
| 357 |  | pos = integrableObject->getPos(); | 
| 358 | + |  | 
| 359 | + | if (isinf(pos[0]) || isnan(pos[0]) || | 
| 360 | + | isinf(pos[1]) || isnan(pos[1]) || | 
| 361 | + | isinf(pos[2]) || isnan(pos[2]) ) { | 
| 362 | + | sprintf( painCave.errMsg, | 
| 363 | + | "DumpWriter detected a numerical error writing the position" | 
| 364 | + | " for object %d", index); | 
| 365 | + | painCave.isFatal = 1; | 
| 366 | + | simError(); | 
| 367 | + | } | 
| 368 | + |  | 
| 369 |  | vel = integrableObject->getVel(); | 
| 370 | + |  | 
| 371 | + | if (isinf(vel[0]) || isnan(vel[0]) || | 
| 372 | + | isinf(vel[1]) || isnan(vel[1]) || | 
| 373 | + | isinf(vel[2]) || isnan(vel[2]) ) { | 
| 374 | + | sprintf( painCave.errMsg, | 
| 375 | + | "DumpWriter detected a numerical error writing the velocity" | 
| 376 | + | " for object %d", index); | 
| 377 | + | painCave.isFatal = 1; | 
| 378 | + | simError(); | 
| 379 | + | } | 
| 380 | + |  | 
| 381 |  | sprintf(tempBuffer, "%18.10g %18.10g %18.10g %13e %13e %13e", | 
| 382 |  | pos[0], pos[1], pos[2], | 
| 383 |  | vel[0], vel[1], vel[2]); | 
| 388 |  | Quat4d q; | 
| 389 |  | Vector3d ji; | 
| 390 |  | q = integrableObject->getQ(); | 
| 391 | + |  | 
| 392 | + | if (isinf(q[0]) || isnan(q[0]) || | 
| 393 | + | isinf(q[1]) || isnan(q[1]) || | 
| 394 | + | isinf(q[2]) || isnan(q[2]) || | 
| 395 | + | isinf(q[3]) || isnan(q[3]) ) { | 
| 396 | + | sprintf( painCave.errMsg, | 
| 397 | + | "DumpWriter detected a numerical error writing the quaternion" | 
| 398 | + | " for object %d", index); | 
| 399 | + | painCave.isFatal = 1; | 
| 400 | + | simError(); | 
| 401 | + | } | 
| 402 | + |  | 
| 403 |  | ji = integrableObject->getJ(); | 
| 404 | + |  | 
| 405 | + | if (isinf(ji[0]) || isnan(ji[0]) || | 
| 406 | + | isinf(ji[1]) || isnan(ji[1]) || | 
| 407 | + | isinf(ji[2]) || isnan(ji[2]) ) { | 
| 408 | + | sprintf( painCave.errMsg, | 
| 409 | + | "DumpWriter detected a numerical error writing the angular" | 
| 410 | + | " momentum for object %d", index); | 
| 411 | + | painCave.isFatal = 1; | 
| 412 | + | simError(); | 
| 413 | + | } | 
| 414 | + |  | 
| 415 |  | sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e %13e", | 
| 416 |  | q[0], q[1], q[2], q[3], | 
| 417 |  | ji[0], ji[1], ji[2]); | 
| 419 |  | } | 
| 420 |  |  | 
| 421 |  | if (needForceVector_) { | 
| 422 | < | type += "ft"; | 
| 422 | > | type += "f"; | 
| 423 |  | Vector3d frc; | 
| 424 | < | Vector3d trq; | 
| 424 | > |  | 
| 425 |  | frc = integrableObject->getFrc(); | 
| 426 | < | trq = integrableObject->getTrq(); | 
| 427 | < |  | 
| 428 | < | sprintf(tempBuffer, " %13e %13e %13e %13e %13e %13e", | 
| 429 | < | frc[0], frc[1], frc[2], | 
| 430 | < | trq[0], trq[1], trq[2]); | 
| 426 | > |  | 
| 427 | > | if (isinf(frc[0]) || isnan(frc[0]) || | 
| 428 | > | isinf(frc[1]) || isnan(frc[1]) || | 
| 429 | > | isinf(frc[2]) || isnan(frc[2]) ) { | 
| 430 | > | sprintf( painCave.errMsg, | 
| 431 | > | "DumpWriter detected a numerical error writing the force" | 
| 432 | > | " for object %d", index); | 
| 433 | > | painCave.isFatal = 1; | 
| 434 | > | simError(); | 
| 435 | > | } | 
| 436 | > | sprintf(tempBuffer, " %13e %13e %13e", | 
| 437 | > | frc[0], frc[1], frc[2]); | 
| 438 |  | line += tempBuffer; | 
| 439 | + |  | 
| 440 | + | if (integrableObject->isDirectional()) { | 
| 441 | + | type += "t"; | 
| 442 | + | Vector3d trq; | 
| 443 | + |  | 
| 444 | + | trq = integrableObject->getTrq(); | 
| 445 | + |  | 
| 446 | + | if (isinf(trq[0]) || isnan(trq[0]) || | 
| 447 | + | isinf(trq[1]) || isnan(trq[1]) || | 
| 448 | + | isinf(trq[2]) || isnan(trq[2]) ) { | 
| 449 | + | sprintf( painCave.errMsg, | 
| 450 | + | "DumpWriter detected a numerical error writing the torque" | 
| 451 | + | " for object %d", index); | 
| 452 | + | painCave.isFatal = 1; | 
| 453 | + | simError(); | 
| 454 | + | } | 
| 455 | + |  | 
| 456 | + | sprintf(tempBuffer, " %13e %13e %13e", | 
| 457 | + | trq[0], trq[1], trq[2]); | 
| 458 | + | line += tempBuffer; | 
| 459 | + | } | 
| 460 |  | } | 
| 461 | < |  | 
| 461 | > |  | 
| 462 |  | sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str()); | 
| 463 |  | return std::string(tempBuffer); | 
| 464 |  | } |