| 64 | 
  | 
namespace OpenMD { | 
| 65 | 
  | 
 | 
| 66 | 
  | 
  DumpWriter::DumpWriter(SimInfo* info)  | 
| 67 | 
< | 
    : info_(info), filename_(info->getDumpFileName()), eorFilename_(info->getFinalConfigFileName()){ | 
| 67 | 
> | 
    : info_(info), filename_(info->getDumpFileName()),  | 
| 68 | 
> | 
      eorFilename_(info->getFinalConfigFileName()){ | 
| 69 | 
  | 
 | 
| 70 | 
  | 
    Globals* simParams = info->getSimParams(); | 
| 71 | 
  | 
    needCompression_   = simParams->getCompressDumpFile(); | 
| 73 | 
  | 
    needParticlePot_   = simParams->getOutputParticlePotential(); | 
| 74 | 
  | 
    needFlucQ_         = simParams->getOutputFluctuatingCharges(); | 
| 75 | 
  | 
    needElectricField_ = simParams->getOutputElectricField(); | 
| 76 | 
+ | 
    needSitePotential_ = simParams->getOutputSitePotential(); | 
| 77 | 
  | 
 | 
| 78 | 
< | 
    if (needParticlePot_ || needFlucQ_ || needElectricField_) { | 
| 78 | 
> | 
    if (needParticlePot_ || needFlucQ_ || needElectricField_ ||  | 
| 79 | 
> | 
        needSitePotential_) { | 
| 80 | 
  | 
      doSiteData_ = true; | 
| 81 | 
  | 
    } else { | 
| 82 | 
  | 
      doSiteData_ = false; | 
| 124 | 
  | 
    needParticlePot_   = simParams->getOutputParticlePotential(); | 
| 125 | 
  | 
    needFlucQ_         = simParams->getOutputFluctuatingCharges(); | 
| 126 | 
  | 
    needElectricField_ = simParams->getOutputElectricField(); | 
| 127 | 
+ | 
    needSitePotential_ = simParams->getOutputSitePotential(); | 
| 128 | 
  | 
 | 
| 129 | 
< | 
    if (needParticlePot_ || needFlucQ_ || needElectricField_) { | 
| 129 | 
> | 
    if (needParticlePot_ || needFlucQ_ || needElectricField_ ||  | 
| 130 | 
> | 
        needSitePotential_) { | 
| 131 | 
  | 
      doSiteData_ = true; | 
| 132 | 
  | 
    } else { | 
| 133 | 
  | 
      doSiteData_ = false; | 
| 175 | 
  | 
    needParticlePot_   = simParams->getOutputParticlePotential(); | 
| 176 | 
  | 
    needFlucQ_         = simParams->getOutputFluctuatingCharges(); | 
| 177 | 
  | 
    needElectricField_ = simParams->getOutputElectricField(); | 
| 178 | 
+ | 
    needSitePotential_ = simParams->getOutputSitePotential(); | 
| 179 | 
  | 
 | 
| 180 | 
< | 
    if (needParticlePot_ || needFlucQ_ || needElectricField_) { | 
| 180 | 
> | 
    if (needParticlePot_ || needFlucQ_ || needElectricField_ ||  | 
| 181 | 
> | 
        needSitePotential_) { | 
| 182 | 
  | 
      doSiteData_ = true; | 
| 183 | 
  | 
    } else { | 
| 184 | 
  | 
      doSiteData_ = false; | 
| 311 | 
  | 
  void DumpWriter::writeFrame(std::ostream& os) { | 
| 312 | 
  | 
 | 
| 313 | 
  | 
#ifdef IS_MPI | 
| 314 | 
< | 
    MPI::Status istatus; | 
| 314 | 
> | 
    MPI_Status istatus; | 
| 315 | 
  | 
#endif | 
| 316 | 
  | 
 | 
| 317 | 
  | 
    Molecule* mol; | 
| 369 | 
  | 
#else | 
| 370 | 
  | 
 | 
| 371 | 
  | 
    const int masterNode = 0; | 
| 372 | 
< | 
    int worldRank = MPI::COMM_WORLD.Get_rank(); | 
| 373 | 
< | 
    int nProc = MPI::COMM_WORLD.Get_size(); | 
| 372 | 
> | 
    int worldRank; | 
| 373 | 
> | 
    int nProc; | 
| 374 | 
> | 
 | 
| 375 | 
> | 
    MPI_Comm_size( MPI_COMM_WORLD, &nProc); | 
| 376 | 
> | 
    MPI_Comm_rank( MPI_COMM_WORLD, &worldRank); | 
| 377 | 
  | 
 | 
| 378 | 
+ | 
 | 
| 379 | 
  | 
    if (worldRank == masterNode) {       | 
| 380 | 
  | 
      os << "  <Snapshot>\n";    | 
| 381 | 
  | 
      writeFrameProperties(os,  | 
| 398 | 
  | 
       | 
| 399 | 
  | 
      for (int i = 1; i < nProc; ++i) { | 
| 400 | 
  | 
        // tell processor i to start sending us data: | 
| 401 | 
< | 
        MPI::COMM_WORLD.Bcast(&i, 1, MPI::INT, masterNode); | 
| 401 | 
> | 
        MPI_Bcast(&i, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 402 | 
  | 
 | 
| 403 | 
  | 
        // receive the length of the string buffer that was | 
| 404 | 
  | 
        // prepared by processor i:         | 
| 405 | 
  | 
        int recvLength; | 
| 406 | 
< | 
        MPI::COMM_WORLD.Recv(&recvLength, 1, MPI::INT, i, MPI::ANY_TAG,  | 
| 407 | 
< | 
                             istatus); | 
| 406 | 
> | 
        MPI_Recv(&recvLength, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD,  | 
| 407 | 
> | 
                 &istatus); | 
| 408 | 
  | 
 | 
| 409 | 
  | 
        // create a buffer to receive the data | 
| 410 | 
  | 
        char* recvBuffer = new char[recvLength]; | 
| 411 | 
  | 
        if (recvBuffer == NULL) { | 
| 412 | 
  | 
        } else { | 
| 413 | 
  | 
          // receive the data: | 
| 414 | 
< | 
          MPI::COMM_WORLD.Recv(recvBuffer, recvLength, MPI::CHAR, i,  | 
| 415 | 
< | 
                               MPI::ANY_TAG, istatus); | 
| 414 | 
> | 
          MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i,  | 
| 415 | 
> | 
                               MPI_ANY_TAG, MPI_COMM_WORLD, &istatus); | 
| 416 | 
  | 
          // send it to the file: | 
| 417 | 
  | 
          os << recvBuffer; | 
| 418 | 
  | 
          // get rid of the receive buffer: | 
| 424 | 
  | 
      int myturn = 0; | 
| 425 | 
  | 
      for (int i = 1; i < nProc; ++i){ | 
| 426 | 
  | 
        // wait for the master node to call our number: | 
| 427 | 
< | 
        MPI::COMM_WORLD.Bcast(&myturn, 1, MPI::INT, masterNode); | 
| 427 | 
> | 
        MPI_Bcast(&myturn, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 428 | 
  | 
        if (myturn == worldRank){ | 
| 429 | 
  | 
          // send the length of our buffer: | 
| 430 | 
< | 
          MPI::COMM_WORLD.Send(&sendBufferLength, 1, MPI::INT, masterNode, 0); | 
| 430 | 
> | 
          MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD); | 
| 431 | 
  | 
 | 
| 432 | 
  | 
          // send our buffer: | 
| 433 | 
< | 
          MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength,  | 
| 434 | 
< | 
                               MPI::CHAR, masterNode, 0); | 
| 433 | 
> | 
          MPI_Send((void *)buffer.c_str(), sendBufferLength,  | 
| 434 | 
> | 
                   MPI_CHAR, masterNode, 0, MPI_COMM_WORLD); | 
| 435 | 
  | 
 | 
| 436 | 
  | 
        } | 
| 437 | 
  | 
      } | 
| 475 | 
  | 
        for (int i = 1; i < nProc; ++i) { | 
| 476 | 
  | 
           | 
| 477 | 
  | 
          // tell processor i to start sending us data: | 
| 478 | 
< | 
          MPI::COMM_WORLD.Bcast(&i, 1, MPI::INT, masterNode); | 
| 478 | 
> | 
          MPI_Bcast(&i, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 479 | 
  | 
           | 
| 480 | 
  | 
          // receive the length of the string buffer that was | 
| 481 | 
  | 
          // prepared by processor i:         | 
| 482 | 
  | 
          int recvLength; | 
| 483 | 
< | 
          MPI::COMM_WORLD.Recv(&recvLength, 1, MPI::INT, i, MPI::ANY_TAG,  | 
| 484 | 
< | 
                               istatus); | 
| 483 | 
> | 
          MPI_Recv(&recvLength, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD,  | 
| 484 | 
> | 
                   &istatus); | 
| 485 | 
  | 
           | 
| 486 | 
  | 
          // create a buffer to receive the data | 
| 487 | 
  | 
          char* recvBuffer = new char[recvLength]; | 
| 488 | 
  | 
          if (recvBuffer == NULL) { | 
| 489 | 
  | 
          } else { | 
| 490 | 
  | 
            // receive the data: | 
| 491 | 
< | 
            MPI::COMM_WORLD.Recv(recvBuffer, recvLength, MPI::CHAR, i,  | 
| 492 | 
< | 
                                 MPI::ANY_TAG, istatus); | 
| 491 | 
> | 
            MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i,  | 
| 492 | 
> | 
                     MPI_ANY_TAG, MPI_COMM_WORLD, &istatus); | 
| 493 | 
  | 
            // send it to the file: | 
| 494 | 
  | 
            os << recvBuffer; | 
| 495 | 
  | 
            // get rid of the receive buffer: | 
| 501 | 
  | 
        int myturn = 0; | 
| 502 | 
  | 
        for (int i = 1; i < nProc; ++i){ | 
| 503 | 
  | 
          // wait for the master node to call our number: | 
| 504 | 
< | 
          MPI::COMM_WORLD.Bcast(&myturn, 1, MPI::INT, masterNode); | 
| 504 | 
> | 
          MPI_Bcast(&myturn, 1, MPI_INT, masterNode, MPI_COMM_WORLD); | 
| 505 | 
  | 
          if (myturn == worldRank){ | 
| 506 | 
  | 
            // send the length of our buffer: | 
| 507 | 
< | 
            MPI::COMM_WORLD.Send(&sendBufferLength, 1, MPI::INT, masterNode, 0); | 
| 507 | 
> | 
            MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD); | 
| 508 | 
  | 
            // send our buffer: | 
| 509 | 
< | 
            MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength,  | 
| 510 | 
< | 
                                 MPI::CHAR, masterNode, 0); | 
| 509 | 
> | 
            MPI_Send((void *)buffer.c_str(), sendBufferLength,  | 
| 510 | 
> | 
                     MPI_CHAR, masterNode, 0, MPI_COMM_WORLD); | 
| 511 | 
  | 
          } | 
| 512 | 
  | 
        } | 
| 513 | 
  | 
      } | 
| 718 | 
  | 
      } | 
| 719 | 
  | 
    } | 
| 720 | 
  | 
 | 
| 721 | 
< | 
 | 
| 721 | 
> | 
    if (needSitePotential_) { | 
| 722 | 
> | 
      if (storageLayout & DataStorage::dslSitePotential) {           | 
| 723 | 
> | 
        type += "s"; | 
| 724 | 
> | 
        RealType sPot = sd->getSitePotential();         | 
| 725 | 
> | 
        if (isinf(sPot) || isnan(sPot) ) {       | 
| 726 | 
> | 
          sprintf( painCave.errMsg, | 
| 727 | 
> | 
                   "DumpWriter detected a numerical error writing the" | 
| 728 | 
> | 
                   " site potential for object %s", id.c_str());       | 
| 729 | 
> | 
          painCave.isFatal = 1; | 
| 730 | 
> | 
          simError(); | 
| 731 | 
> | 
        } | 
| 732 | 
> | 
        sprintf(tempBuffer, " %13e ", sPot);         | 
| 733 | 
> | 
        line += tempBuffer; | 
| 734 | 
> | 
      } | 
| 735 | 
> | 
    }     | 
| 736 | 
> | 
     | 
| 737 | 
  | 
    if (needParticlePot_) { | 
| 738 | 
  | 
      if (storageLayout & DataStorage::dslParticlePot) { | 
| 739 | 
  | 
        type += "u"; | 
| 759 | 
  | 
  } | 
| 760 | 
  | 
 | 
| 761 | 
  | 
  void DumpWriter::writeEor() { | 
| 762 | 
< | 
    std::ostream* eorStream; | 
| 763 | 
< | 
     | 
| 762 | 
> | 
 | 
| 763 | 
> | 
    std::ostream* eorStream = NULL; | 
| 764 | 
> | 
 | 
| 765 | 
  | 
#ifdef IS_MPI | 
| 766 | 
  | 
    if (worldRank == 0) { | 
| 767 | 
  | 
#endif // is_mpi | 
| 794 | 
  | 
#ifdef IS_MPI | 
| 795 | 
  | 
    if (worldRank == 0) { | 
| 796 | 
  | 
#endif // is_mpi | 
| 770 | 
– | 
 | 
| 797 | 
  | 
      buffers.push_back(dumpFile_->rdbuf()); | 
| 772 | 
– | 
 | 
| 798 | 
  | 
      eorStream = createOStream(eorFilename_); | 
| 774 | 
– | 
 | 
| 799 | 
  | 
      buffers.push_back(eorStream->rdbuf()); | 
| 776 | 
– | 
         | 
| 800 | 
  | 
#ifdef IS_MPI | 
| 801 | 
  | 
    } | 
| 802 | 
  | 
#endif // is_mpi     | 
| 803 | 
  | 
 | 
| 804 | 
  | 
    TeeBuf tbuf(buffers.begin(), buffers.end()); | 
| 805 | 
  | 
    std::ostream os(&tbuf); | 
| 783 | 
– | 
 | 
| 806 | 
  | 
    writeFrame(os); | 
| 807 | 
  | 
 | 
| 808 | 
  | 
#ifdef IS_MPI | 
| 812 | 
  | 
      delete eorStream; | 
| 813 | 
  | 
#ifdef IS_MPI | 
| 814 | 
  | 
    } | 
| 815 | 
< | 
#endif // is_mpi   | 
| 794 | 
< | 
     | 
| 815 | 
> | 
#endif // is_mpi       | 
| 816 | 
  | 
  } | 
| 817 | 
  | 
 | 
| 818 | 
  | 
  std::ostream* DumpWriter::createOStream(const std::string& filename) { |