46#include "applications/staticProps/RhoR.hpp"
52#include "brains/Thermo.hpp"
55#include "utils/Constants.hpp"
56#include "utils/simError.h"
60 RhoR::RhoR(SimInfo* info,
const std::string& filename,
61 const std::string& sele, RealType len,
int nrbins,
63 StaticAnalyser(info, filename, nrbins),
64 selectionScript_(sele), evaluator_(info), seleMan_(info), len_(len) {
65 evaluator_.loadScriptString(sele);
66 if (!evaluator_.isDynamic()) {
67 seleMan_.setSelectionSet(evaluator_.evaluate());
70 deltaR_ = len_ / nBins_;
72 histogram_.resize(nBins_);
73 avgRhoR_.resize(nBins_);
74 particleR_ = particleR;
75 setOutputName(
getPrefix(filename) +
".RhoR");
78 void RhoR::process() {
80 DumpReader reader(info_, dumpFilename_);
81 int nFrames = reader.getNFrames();
82 nProcessed_ = nFrames / step_;
84 std::fill(avgRhoR_.begin(), avgRhoR_.end(), 0.0);
85 std::fill(histogram_.begin(), histogram_.end(), 0);
87 for (
int istep = 0; istep < nFrames; istep += step_) {
90 reader.readFrame(istep);
91 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
92 Vector3d CenterOfMass = thermo.getCom();
94 if (evaluator_.isDynamic()) {
95 seleMan_.setSelectionSet(evaluator_.evaluate());
99 for (sd = seleMan_.beginSelected(i); sd != NULL;
100 sd = seleMan_.nextSelected(i)) {
101 Vector3d pos = sd->getPos();
102 Vector3d r12 = CenterOfMass - pos;
106 if (distance < len_) {
107 int whichBin = int(distance / deltaR_);
108 histogram_[whichBin] += 1;
117 void RhoR::processHistogram() {
118 RealType particleDensity = 3.0 * info_->getNGlobalMolecules() /
119 (4.0 * Constants::PI * pow(particleR_, 3));
120 RealType pairConstant = (4.0 * Constants::PI * particleDensity) / 3.0;
122 for (
unsigned int i = 0; i < histogram_.size(); ++i) {
123 RealType rLower = i * deltaR_;
124 RealType rUpper = rLower + deltaR_;
126 (rUpper * rUpper * rUpper) - (rLower * rLower * rLower);
127 RealType nIdeal = volSlice * pairConstant;
129 avgRhoR_[i] += histogram_[i] / nIdeal;
133 void RhoR::writeRhoR() {
134 std::ofstream rdfStream(outputFilename_.c_str());
135 if (rdfStream.is_open()) {
136 rdfStream <<
"#radial density function rho(r)\n";
137 rdfStream <<
"#r\tcorrValue\n";
138 for (
unsigned int i = 0; i < avgRhoR_.size(); ++i) {
139 RealType r = deltaR_ * (i + 0.5);
140 rdfStream << r <<
"\t" << avgRhoR_[i] / nProcessed_ <<
"\n";
144 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
145 "RhoR: unable to open %s\n", outputFilename_.c_str());
146 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.