| 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 "config.h" | 
| 44 | 
+ | 
 | 
| 45 | 
+ | 
#ifdef IS_MPI | 
| 46 | 
+ | 
#include <mpi.h> | 
| 47 | 
+ | 
#endif | 
| 48 | 
  | 
  | 
| 49 | 
  | 
#include "io/DumpWriter.hpp" | 
| 50 | 
  | 
#include "primitives/Molecule.hpp" | 
| 60 | 
  | 
#define isinf(x) (!_finite(x) && !_isnan(x)) | 
| 61 | 
  | 
#endif | 
| 62 | 
  | 
 | 
| 57 | 
– | 
#ifdef IS_MPI | 
| 58 | 
– | 
#include <mpi.h> | 
| 59 | 
– | 
#endif | 
| 60 | 
– | 
 | 
| 63 | 
  | 
using namespace std; | 
| 64 | 
  | 
namespace OpenMD { | 
| 65 | 
  | 
 | 
| 304 | 
  | 
  void DumpWriter::writeFrame(std::ostream& os) { | 
| 305 | 
  | 
 | 
| 306 | 
  | 
#ifdef IS_MPI | 
| 307 | 
< | 
    MPI::Status istatus; | 
| 307 | 
> | 
    MPI_Status istatus; | 
| 308 | 
  | 
#endif | 
| 309 | 
  | 
 | 
| 310 | 
  | 
    Molecule* mol; | 
| 362 | 
  | 
#else | 
| 363 | 
  | 
 | 
| 364 | 
  | 
    const int masterNode = 0; | 
| 365 | 
< | 
    int worldRank = MPI::COMM_WORLD.Get_rank(); | 
| 366 | 
< | 
    int nProc = MPI::COMM_WORLD.Get_size(); | 
| 365 | 
> | 
    int worldRank; | 
| 366 | 
> | 
    int nProc; | 
| 367 | 
  | 
 | 
| 368 | 
+ | 
    MPI_Comm_size( MPI_COMM_WORLD, &nProc); | 
| 369 | 
+ | 
    MPI_Comm_rank( MPI_COMM_WORLD, &worldRank); | 
| 370 | 
+ | 
 | 
| 371 | 
+ | 
 | 
| 372 | 
  | 
    if (worldRank == masterNode) {       | 
| 373 | 
  | 
      os << "  <Snapshot>\n";    | 
| 374 | 
  | 
      writeFrameProperties(os,  | 
| 391 | 
  | 
       | 
| 392 | 
  | 
      for (int i = 1; i < nProc; ++i) { | 
| 393 | 
  | 
        // tell processor i to start sending us data: | 
| 394 | 
< | 
        MPI::COMM_WORLD.Bcast(&i, 1, MPI::INT, masterNode); | 
| 394 | 
> | 
        MPI_Bcast(&i, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 395 | 
  | 
 | 
| 396 | 
  | 
        // receive the length of the string buffer that was | 
| 397 | 
  | 
        // prepared by processor i:         | 
| 398 | 
  | 
        int recvLength; | 
| 399 | 
< | 
        MPI::COMM_WORLD.Recv(&recvLength, 1, MPI::INT, i, MPI::ANY_TAG,  | 
| 400 | 
< | 
                             istatus); | 
| 399 | 
> | 
        MPI_Recv(&recvLength, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD,  | 
| 400 | 
> | 
                 &istatus); | 
| 401 | 
  | 
 | 
| 402 | 
  | 
        // create a buffer to receive the data | 
| 403 | 
  | 
        char* recvBuffer = new char[recvLength]; | 
| 404 | 
  | 
        if (recvBuffer == NULL) { | 
| 405 | 
  | 
        } else { | 
| 406 | 
  | 
          // receive the data: | 
| 407 | 
< | 
          MPI::COMM_WORLD.Recv(recvBuffer, recvLength, MPI::CHAR, i,  | 
| 408 | 
< | 
                               MPI::ANY_TAG, istatus); | 
| 407 | 
> | 
          MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i,  | 
| 408 | 
> | 
                               MPI_ANY_TAG, MPI_COMM_WORLD, &istatus); | 
| 409 | 
  | 
          // send it to the file: | 
| 410 | 
  | 
          os << recvBuffer; | 
| 411 | 
  | 
          // get rid of the receive buffer: | 
| 417 | 
  | 
      int myturn = 0; | 
| 418 | 
  | 
      for (int i = 1; i < nProc; ++i){ | 
| 419 | 
  | 
        // wait for the master node to call our number: | 
| 420 | 
< | 
        MPI::COMM_WORLD.Bcast(&myturn, 1, MPI::INT, masterNode); | 
| 420 | 
> | 
        MPI_Bcast(&myturn, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 421 | 
  | 
        if (myturn == worldRank){ | 
| 422 | 
  | 
          // send the length of our buffer: | 
| 423 | 
< | 
          MPI::COMM_WORLD.Send(&sendBufferLength, 1, MPI::INT, masterNode, 0); | 
| 423 | 
> | 
          MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD); | 
| 424 | 
  | 
 | 
| 425 | 
  | 
          // send our buffer: | 
| 426 | 
< | 
          MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength,  | 
| 427 | 
< | 
                               MPI::CHAR, masterNode, 0); | 
| 426 | 
> | 
          MPI_Send((void *)buffer.c_str(), sendBufferLength,  | 
| 427 | 
> | 
                   MPI_CHAR, masterNode, 0, MPI_COMM_WORLD); | 
| 428 | 
  | 
 | 
| 429 | 
  | 
        } | 
| 430 | 
  | 
      } | 
| 468 | 
  | 
        for (int i = 1; i < nProc; ++i) { | 
| 469 | 
  | 
           | 
| 470 | 
  | 
          // tell processor i to start sending us data: | 
| 471 | 
< | 
          MPI::COMM_WORLD.Bcast(&i, 1, MPI::INT, masterNode); | 
| 471 | 
> | 
          MPI_Bcast(&i, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 472 | 
  | 
           | 
| 473 | 
  | 
          // receive the length of the string buffer that was | 
| 474 | 
  | 
          // prepared by processor i:         | 
| 475 | 
  | 
          int recvLength; | 
| 476 | 
< | 
          MPI::COMM_WORLD.Recv(&recvLength, 1, MPI::INT, i, MPI::ANY_TAG,  | 
| 477 | 
< | 
                               istatus); | 
| 476 | 
> | 
          MPI_Recv(&recvLength, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD,  | 
| 477 | 
> | 
                   &istatus); | 
| 478 | 
  | 
           | 
| 479 | 
  | 
          // create a buffer to receive the data | 
| 480 | 
  | 
          char* recvBuffer = new char[recvLength]; | 
| 481 | 
  | 
          if (recvBuffer == NULL) { | 
| 482 | 
  | 
          } else { | 
| 483 | 
  | 
            // receive the data: | 
| 484 | 
< | 
            MPI::COMM_WORLD.Recv(recvBuffer, recvLength, MPI::CHAR, i,  | 
| 485 | 
< | 
                                 MPI::ANY_TAG, istatus); | 
| 484 | 
> | 
            MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i,  | 
| 485 | 
> | 
                     MPI_ANY_TAG, MPI_COMM_WORLD, &istatus); | 
| 486 | 
  | 
            // send it to the file: | 
| 487 | 
  | 
            os << recvBuffer; | 
| 488 | 
  | 
            // get rid of the receive buffer: | 
| 494 | 
  | 
        int myturn = 0; | 
| 495 | 
  | 
        for (int i = 1; i < nProc; ++i){ | 
| 496 | 
  | 
          // wait for the master node to call our number: | 
| 497 | 
< | 
          MPI::COMM_WORLD.Bcast(&myturn, 1, MPI::INT, masterNode); | 
| 497 | 
> | 
          MPI_Bcast(&myturn, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 498 | 
  | 
          if (myturn == worldRank){ | 
| 499 | 
  | 
            // send the length of our buffer: | 
| 500 | 
< | 
            MPI::COMM_WORLD.Send(&sendBufferLength, 1, MPI::INT, masterNode, 0); | 
| 500 | 
> | 
            MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD); | 
| 501 | 
  | 
            // send our buffer: | 
| 502 | 
< | 
            MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength,  | 
| 503 | 
< | 
                                 MPI::CHAR, masterNode, 0); | 
| 502 | 
> | 
            MPI_Send((void *)buffer.c_str(), sendBufferLength,  | 
| 503 | 
> | 
                     MPI_CHAR, masterNode, 0, MPI_COMM_WORLD); | 
| 504 | 
  | 
          } | 
| 505 | 
  | 
        } | 
| 506 | 
  | 
      } | 
| 737 | 
  | 
  } | 
| 738 | 
  | 
 | 
| 739 | 
  | 
  void DumpWriter::writeEor() { | 
| 740 | 
< | 
    std::ostream* eorStream; | 
| 741 | 
< | 
     | 
| 740 | 
> | 
 | 
| 741 | 
> | 
    std::ostream* eorStream = NULL; | 
| 742 | 
> | 
 | 
| 743 | 
  | 
#ifdef IS_MPI | 
| 744 | 
  | 
    if (worldRank == 0) { | 
| 745 | 
  | 
#endif // is_mpi | 
| 772 | 
  | 
#ifdef IS_MPI | 
| 773 | 
  | 
    if (worldRank == 0) { | 
| 774 | 
  | 
#endif // is_mpi | 
| 768 | 
– | 
 | 
| 775 | 
  | 
      buffers.push_back(dumpFile_->rdbuf()); | 
| 770 | 
– | 
 | 
| 776 | 
  | 
      eorStream = createOStream(eorFilename_); | 
| 772 | 
– | 
 | 
| 777 | 
  | 
      buffers.push_back(eorStream->rdbuf()); | 
| 774 | 
– | 
         | 
| 778 | 
  | 
#ifdef IS_MPI | 
| 779 | 
  | 
    } | 
| 780 | 
  | 
#endif // is_mpi     | 
| 781 | 
  | 
 | 
| 782 | 
  | 
    TeeBuf tbuf(buffers.begin(), buffers.end()); | 
| 783 | 
  | 
    std::ostream os(&tbuf); | 
| 781 | 
– | 
 | 
| 784 | 
  | 
    writeFrame(os); | 
| 785 | 
  | 
 | 
| 786 | 
  | 
#ifdef IS_MPI | 
| 790 | 
  | 
      delete eorStream; | 
| 791 | 
  | 
#ifdef IS_MPI | 
| 792 | 
  | 
    } | 
| 793 | 
< | 
#endif // is_mpi   | 
| 792 | 
< | 
     | 
| 793 | 
> | 
#endif // is_mpi       | 
| 794 | 
  | 
  } | 
| 795 | 
  | 
 | 
| 796 | 
  | 
  std::ostream* DumpWriter::createOStream(const std::string& filename) { |