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.