# | 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 314 | Line 355 | namespace OpenMD { | |
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]); | |
# | Line 325 | Line 388 | namespace OpenMD { | |
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]); | |
# | Line 333 | Line 419 | namespace OpenMD { | |
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 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |