| 154 | 
  | 
    midBin_ = nBins_ / 2; | 
| 155 | 
  | 
    if (simParams->haveRNEMD_logWidth()) { | 
| 156 | 
  | 
      rnemdLogWidth_ = simParams->getRNEMD_logWidth(); | 
| 157 | 
< | 
      if (rnemdLogWidth_ != nBins_ || rnemdLogWidth_ != midBin_ + 1) { | 
| 157 | 
> | 
      if (rnemdLogWidth_ != nBins_ && rnemdLogWidth_ != midBin_ + 1) { | 
| 158 | 
  | 
        std::cerr << "WARNING! RNEMD_logWidth has abnormal value!\n"; | 
| 159 | 
  | 
        std::cerr << "Automaically set back to default.\n"; | 
| 160 | 
  | 
        rnemdLogWidth_ = nBins_; | 
| 194 | 
  | 
   | 
| 195 | 
  | 
  RNEMD::~RNEMD() { | 
| 196 | 
  | 
    delete randNumGen_; | 
| 197 | 
< | 
  | 
| 198 | 
< | 
    std::cerr << "total fail trials: " << failTrialCount_ << "\n"; | 
| 197 | 
> | 
     | 
| 198 | 
  | 
#ifdef IS_MPI | 
| 199 | 
  | 
    if (worldRank == 0) { | 
| 200 | 
  | 
#endif | 
| 201 | 
+ | 
      std::cerr << "total fail trials: " << failTrialCount_ << "\n"; | 
| 202 | 
  | 
      rnemdLog_.close(); | 
| 203 | 
  | 
      if (rnemdType_ == rnemdKineticScale || rnemdType_ == rnemdPxScale || rnemdType_ == rnemdPyScale) | 
| 204 | 
  | 
        std::cerr<< "total root-checking warnings: " << failRootCount_ << "\n"; | 
| 642 | 
  | 
      a001 = Kcx * px * px; | 
| 643 | 
  | 
    */ | 
| 644 | 
  | 
 | 
| 645 | 
< | 
      //scale all three dimensions, let x = y | 
| 645 | 
> | 
      //scale all three dimensions, let c_x = c_y | 
| 646 | 
  | 
      a000 = Kcx + Kcy; | 
| 647 | 
  | 
      a110 = Kcz; | 
| 648 | 
  | 
      c0 = targetFlux_ - Kcx - Kcy - Kcz; | 
| 678 | 
  | 
         + Khy * (fastpow(c * py - py - 1.0, 2) - 1.0); | 
| 679 | 
  | 
      break; | 
| 680 | 
  | 
    case rnemdPzScale ://we don't really do this, do we? | 
| 681 | 
+ | 
      c = 1 - targetFlux_ / Pcz; | 
| 682 | 
+ | 
      a000 = Kcx; | 
| 683 | 
+ | 
      a110 = Kcy; | 
| 684 | 
+ | 
      c0 = Kcz * c * c - Kcx - Kcy - Kcz; | 
| 685 | 
+ | 
      a001 = px * px * Khx; | 
| 686 | 
+ | 
      a111 = py * py * Khy; | 
| 687 | 
+ | 
      b01 = -2.0 * Khx * px * (1.0 + px); | 
| 688 | 
+ | 
      b11 = -2.0 * Khy * py * (1.0 + py); | 
| 689 | 
+ | 
      c1 = Khx * px * (2.0 + px) + Khy * py * (2.0 + py) | 
| 690 | 
+ | 
        + Khz * (fastpow(c * pz - pz - 1.0, 2) - 1.0); | 
| 691 | 
+ | 
      break;       | 
| 692 | 
  | 
    default : | 
| 693 | 
  | 
      break; | 
| 694 | 
  | 
    } | 
| 732 | 
  | 
      r2 = *ri; | 
| 733 | 
  | 
      //check if FindRealRoots() give the right answer | 
| 734 | 
  | 
      if ( fabs(u0 + r2 * (u1 + r2 * (u2 + r2 * (u3 + r2 * u4)))) > 1e-6 ) { | 
| 735 | 
< | 
        std::cerr << "WARNING! eq solvers might have mistakes!\n"; | 
| 735 | 
> | 
        sprintf(painCave.errMsg,  | 
| 736 | 
> | 
                "RNEMD Warning: polynomial solve seems to have an error!"); | 
| 737 | 
> | 
        painCave.isFatal = 0; | 
| 738 | 
> | 
        simError(); | 
| 739 | 
  | 
        failRootCount_++; | 
| 740 | 
  | 
      } | 
| 741 | 
  | 
      //might not be useful w/o rescaling coefficients | 
| 811 | 
  | 
          z = bestPair.second; | 
| 812 | 
  | 
          break; | 
| 813 | 
  | 
        case rnemdPzScale : | 
| 814 | 
+ | 
          x = bestPair.first; | 
| 815 | 
+ | 
          y = bestPair.second; | 
| 816 | 
+ | 
          z = c; | 
| 817 | 
+ | 
          break;           | 
| 818 | 
  | 
        default : | 
| 819 | 
  | 
          break; | 
| 820 | 
  | 
        } | 
| 841 | 
  | 
      exchangeSum_ += targetFlux_; | 
| 842 | 
  | 
      //we may want to check whether the exchange has been successful | 
| 843 | 
  | 
    } else { | 
| 844 | 
< | 
      std::cerr << "exchange NOT performed!\n"; | 
| 844 | 
> | 
      std::cerr << "exchange NOT performed!\n";//MPI incompatible | 
| 845 | 
  | 
      failTrialCount_++; | 
| 846 | 
  | 
    } | 
| 847 | 
  | 
 | 
| 983 | 
  | 
 | 
| 984 | 
  | 
    stat[Stats::RNEMD_EXCHANGE_TOTAL] = exchangeSum_; | 
| 985 | 
  | 
    //or to be more meaningful, define another item as exchangeSum_ / time | 
| 986 | 
+ | 
    int j; | 
| 987 | 
  | 
 | 
| 969 | 
– | 
 | 
| 988 | 
  | 
#ifdef IS_MPI | 
| 989 | 
  | 
 | 
| 990 | 
  | 
    // all processors have the same number of bins, and STL vectors pack their  | 
| 994 | 
  | 
                              rnemdLogWidth_, MPI::REALTYPE, MPI::SUM); | 
| 995 | 
  | 
    MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &valueCount_[0], | 
| 996 | 
  | 
                              rnemdLogWidth_, MPI::INT, MPI::SUM); | 
| 997 | 
< | 
 | 
| 997 | 
> | 
    if (rnemdType_ == rnemdPx || rnemdType_ == rnemdPxScale) { | 
| 998 | 
> | 
      MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &xTempHist_[0], | 
| 999 | 
> | 
                                rnemdLogWidth_, MPI::REALTYPE, MPI::SUM); | 
| 1000 | 
> | 
      MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &yTempHist_[0], | 
| 1001 | 
> | 
                                rnemdLogWidth_, MPI::REALTYPE, MPI::SUM); | 
| 1002 | 
> | 
      MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &zTempHist_[0], | 
| 1003 | 
> | 
                                rnemdLogWidth_, MPI::REALTYPE, MPI::SUM); | 
| 1004 | 
> | 
    } | 
| 1005 | 
  | 
    // If we're the root node, should we print out the results | 
| 1006 | 
  | 
    int worldRank = MPI::COMM_WORLD.Get_rank(); | 
| 1007 | 
  | 
    if (worldRank == 0) { | 
| 1008 | 
  | 
#endif | 
| 984 | 
– | 
      int j; | 
| 1009 | 
  | 
      rnemdLog_ << time; | 
| 1010 | 
  | 
      for (j = 0; j < rnemdLogWidth_; j++) { | 
| 1011 | 
  | 
        rnemdLog_ << "\t" << valueHist_[j] / (RealType)valueCount_[j]; | 
| 988 | 
– | 
        valueHist_[j] = 0.0; | 
| 1012 | 
  | 
      } | 
| 1013 | 
  | 
      rnemdLog_ << "\n"; | 
| 1014 | 
  | 
      if (rnemdType_ == rnemdPx || rnemdType_ == rnemdPxScale ) { | 
| 1015 | 
  | 
        xTempLog_ << time;       | 
| 1016 | 
  | 
        for (j = 0; j < rnemdLogWidth_; j++) { | 
| 1017 | 
  | 
          xTempLog_ << "\t" << xTempHist_[j] / (RealType)valueCount_[j]; | 
| 995 | 
– | 
          xTempHist_[j] = 0.0; | 
| 1018 | 
  | 
        } | 
| 1019 | 
  | 
        xTempLog_ << "\n"; | 
| 1020 | 
  | 
        yTempLog_ << time; | 
| 1021 | 
  | 
        for (j = 0; j < rnemdLogWidth_; j++) { | 
| 1022 | 
  | 
          yTempLog_ << "\t" << yTempHist_[j] / (RealType)valueCount_[j]; | 
| 1001 | 
– | 
          yTempHist_[j] = 0.0; | 
| 1023 | 
  | 
        } | 
| 1024 | 
  | 
        yTempLog_ << "\n"; | 
| 1025 | 
  | 
        zTempLog_ << time; | 
| 1026 | 
  | 
        for (j = 0; j < rnemdLogWidth_; j++) { | 
| 1027 | 
  | 
          zTempLog_ << "\t" << zTempHist_[j] / (RealType)valueCount_[j]; | 
| 1007 | 
– | 
          zTempHist_[j] = 0.0; | 
| 1028 | 
  | 
        } | 
| 1029 | 
  | 
        zTempLog_ << "\n"; | 
| 1030 | 
  | 
      } | 
| 1011 | 
– | 
      for (j = 0; j < rnemdLogWidth_; j++) valueCount_[j] = 0; | 
| 1031 | 
  | 
#ifdef IS_MPI | 
| 1032 | 
< | 
    }     | 
| 1032 | 
> | 
    } | 
| 1033 | 
  | 
#endif | 
| 1034 | 
< | 
 | 
| 1035 | 
< | 
       | 
| 1034 | 
> | 
    for (j = 0; j < rnemdLogWidth_; j++) { | 
| 1035 | 
> | 
      valueCount_[j] = 0; | 
| 1036 | 
> | 
      valueHist_[j] = 0.0; | 
| 1037 | 
> | 
    } | 
| 1038 | 
> | 
    if (rnemdType_ == rnemdPx || rnemdType_ == rnemdPxScale) | 
| 1039 | 
> | 
      for (j = 0; j < rnemdLogWidth_; j++) { | 
| 1040 | 
> | 
        xTempHist_[j] = 0.0; | 
| 1041 | 
> | 
        yTempHist_[j] = 0.0; | 
| 1042 | 
> | 
        zTempHist_[j] = 0.0; | 
| 1043 | 
> | 
      } | 
| 1044 | 
  | 
  } | 
| 1018 | 
– | 
 | 
| 1045 | 
  | 
} |