45#include "applications/staticProps/TwoDGofR.hpp" 
   50#include "utils/simError.h" 
   54  TwoDGofR::TwoDGofR(SimInfo* info, 
const std::string& filename,
 
   55                     const std::string& sele1, 
const std::string& sele2,
 
   56                     RealType len, RealType dz, 
int nrbins) :
 
   57      RadialDistrFunc(info, filename, sele1, sele2, nrbins),
 
   59    deltaR_ = len_ / nBins_;
 
   63    histogram_.resize(nBins_);
 
   64    avgTwoDGofR_.resize(nBins_);
 
   66    setOutputName(
getPrefix(filename) + 
".TwoDGofR");
 
   69  void TwoDGofR::preProcess() {
 
   70    std::fill(avgTwoDGofR_.begin(), avgTwoDGofR_.end(), 0.0);
 
   73  void TwoDGofR::initializeHistogram() {
 
   74    std::fill(histogram_.begin(), histogram_.end(), 0);
 
   77  void TwoDGofR::processHistogram() {
 
   78    int nPairs = getNPairs();
 
   80    Mat3x3d hmat = info_->getSnapshotManager()->getCurrentSnapshot()->getHmat();
 
   82    RealType volume = hmat(0, 0) * hmat(1, 1) * deltaZ_;
 
   84    RealType pairDensity  = nPairs / volume * 2.0;
 
   85    RealType pairConstant = (Constants::PI * pairDensity);
 
   87    for (
unsigned int i = 0; i < histogram_.size(); ++i) {
 
   88      RealType rLower   = i * deltaR_;
 
   89      RealType rUpper   = rLower + deltaR_;
 
   90      RealType volSlice = deltaZ_ * ((rUpper * rUpper) - (rLower * rLower));
 
   91      RealType nIdeal   = volSlice * pairConstant;
 
   93      avgTwoDGofR_[i] += histogram_[i] / nIdeal;
 
   97  void TwoDGofR::collectHistogram(StuntDouble* sd1, StuntDouble* sd2) {
 
   98    if (sd1 == sd2) { 
return; }
 
   99    bool usePeriodicBoundaryConditions_ =
 
  100        info_->getSimParams()->getUsePeriodicBoundaryConditions();
 
  102    Vector3d pos1 = sd1->getPos();
 
  103    Vector3d pos2 = sd2->getPos();
 
  104    Vector3d r12  = pos2 - pos1;
 
  105    if (usePeriodicBoundaryConditions_) currentSnapshot_->wrapVector(r12);
 
  107    RealType 
distance = sqrt(r12.x() * r12.x() + r12.y() * r12.y());
 
  109    if (distance < len_) {
 
  110      int whichBin = int(distance / deltaR_);
 
  111      histogram_[whichBin] += 2;
 
  115  void TwoDGofR::writeRdf() {
 
  116    std::ofstream rdfStream(outputFilename_.c_str());
 
  117    if (rdfStream.is_open()) {
 
  118      rdfStream << 
"#2D radial distribution function\n";
 
  119      rdfStream << 
"#selection1: (" << selectionScript1_ << 
")\t";
 
  120      rdfStream << 
"selection2: (" << selectionScript2_ << 
")\n";
 
  121      rdfStream << 
"#r\tcorrValue\n";
 
  122      for (
unsigned int i = 0; i < avgTwoDGofR_.size(); ++i) {
 
  123        RealType r = deltaR_ * (i + 0.5);
 
  124        rdfStream << r << 
"\t" << avgTwoDGofR_[i] / nProcessed_ << 
"\n";
 
  128      snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
 
  129               "TwoDGofR: unable to open %s\n", outputFilename_.c_str());
 
  130      painCave.isFatal = 1;
 
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
 
std::string getPrefix(const std::string &str)
 
Real distance(const DynamicVector< Real > &v1, const DynamicVector< Real > &v2)
Returns the distance between two DynamicVectors.