45#include "applications/staticProps/GofR.hpp"
51#include "utils/Revision.hpp"
52#include "utils/simError.h"
56 GofR::GofR(SimInfo* info,
const std::string& filename,
57 const std::string& sele1,
const std::string& sele2, RealType len,
59 RadialDistrFunc(info, filename, sele1, sele2, nrbins),
61 setAnalysisType(
"Radial Distribution Function");
62 setOutputName(
getPrefix(filename) +
".gofr");
64 deltaR_ = len_ / nBins_;
66 histogram_.resize(nBins_);
67 avgGofr_.resize(nBins_);
68 sumGofr1_.resize(nBins_);
69 sumGofr2_.resize(nBins_);
70 std::stringstream params;
71 params <<
" len = " << len_ <<
", nrbins = " << nBins_;
72 const std::string paramString = params.str();
73 setParameterString(paramString);
76 void GofR::preProcess() {
77 std::fill(avgGofr_.begin(), avgGofr_.end(), 0.0);
78 std::fill(sumGofr1_.begin(), sumGofr1_.end(), 0.0);
79 std::fill(sumGofr2_.begin(), sumGofr2_.end(), 0.0);
82 void GofR::initializeHistogram() {
83 std::fill(histogram_.begin(), histogram_.end(), 0);
86 void GofR::processHistogram() {
87 int nPairs = getNPairs();
89 info_->getSnapshotManager()->getCurrentSnapshot()->getVolume();
90 RealType pairDensity = nPairs / volume * 2.0;
91 RealType pairConstant = (4.0 * Constants::PI * pairDensity) / 3.0;
93 for (
unsigned int i = 0; i < histogram_.size(); ++i) {
94 RealType rLower = i * deltaR_;
95 RealType rUpper = rLower + deltaR_;
97 (rUpper * rUpper * rUpper) - (rLower * rLower * rLower);
98 RealType nIdeal = volSlice * pairConstant;
100 avgGofr_[i] += histogram_[i] / nIdeal;
104 void GofR::postProcess() {
105 int nSelected1 = getNSelected1();
106 int nSelected2 = getNSelected2();
108 info_->getSnapshotManager()->getCurrentSnapshot()->getVolume();
109 RealType constant = (4.0 * Constants::PI) / (3.0 * volume);
112 for (
unsigned int i = 0; i < avgGofr_.size(); ++i) {
113 RealType rLower = i * deltaR_;
114 RealType rUpper = rLower + deltaR_;
116 sum += avgGofr_[i] * constant * (pow(rUpper, 3) - pow(rLower, 3));
117 sumGofr1_[i] = nSelected1 * sum;
118 sumGofr2_[i] = nSelected2 * sum;
122 void GofR::collectHistogram(StuntDouble* sd1, StuntDouble* sd2) {
123 if (sd1 == sd2) {
return; }
125 bool usePeriodicBoundaryConditions_ =
126 info_->getSimParams()->getUsePeriodicBoundaryConditions();
128 Vector3d pos1 = sd1->getPos();
129 Vector3d pos2 = sd2->getPos();
130 Vector3d r12 = pos2 - pos1;
131 if (usePeriodicBoundaryConditions_) currentSnapshot_->wrapVector(r12);
135 if (distance < len_) {
136 int whichBin = int(distance / deltaR_);
137 histogram_[whichBin] += 2;
141 void GofR::writeRdf() {
142 std::ofstream ofs(outputFilename_.c_str());
145 ofs <<
"# " << getAnalysisType() <<
"\n";
146 ofs <<
"# OpenMD " << r.getFullRevision() <<
"\n";
147 ofs <<
"# " << r.getBuildDate() <<
"\n";
148 ofs <<
"# selection script1: \"" << selectionScript1_;
149 ofs <<
"\"\tselection script2: \"" << selectionScript2_ <<
"\"\n";
150 if (!paramString_.empty())
151 ofs <<
"# parameters: " << paramString_ <<
"\n";
153 ofs <<
"#r\tcorrValue\tcumulativeSum1\tcumulativeSum2\n";
154 for (
unsigned int i = 0; i < avgGofr_.size(); ++i) {
155 RealType r = deltaR_ * (i + 0.5);
156 ofs << r <<
"\t" << avgGofr_[i] / nProcessed_ <<
"\t"
157 << sumGofr1_[i] / nProcessed_ <<
"\t" << sumGofr2_[i] / nProcessed_
161 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
162 "GofR: unable to open %s\n", outputFilename_.c_str());
163 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.