53#include "applications/staticProps/OrderParameterProbZ.hpp"
58#include "brains/Thermo.hpp"
63#include "types/FixedChargeAdapter.hpp"
64#include "types/FluctuatingChargeAdapter.hpp"
65#include "utils/simError.h"
69 OrderParameterProbZ::OrderParameterProbZ(
70 SimInfo* info,
const std::string& filename,
const std::string& sele,
71 const RealType dipoleX,
const RealType dipoleY,
const RealType dipoleZ,
72 int nbins,
int axis) :
74 selectionScript_(sele), evaluator_(info), seleMan_(info), thermo_(info),
75 nbins_(nbins), axis_(axis) {
76 evaluator_.loadScriptString(sele);
77 if (!evaluator_.isDynamic()) {
78 seleMan_.setSelectionSet(evaluator_.evaluate());
83 std::fill(Count_.begin(), Count_.end(), 0);
88 refAxis_ = Vector3d(1, 0, 0);
92 refAxis_ = Vector3d(0, 1, 0);
97 refAxis_ = Vector3d(0, 0, 1);
101 dipoleVector_ = Vector3d(dipoleX, dipoleY, dipoleZ);
102 dipoleVector_.normalize();
104 setOutputName(
getPrefix(filename) +
".OrderProb");
107 void OrderParameterProbZ::process() {
110 RealType orderMin = -1.0;
111 RealType orderMax = 1.0;
112 RealType deltaOrder = (orderMax - orderMin) / nbins_;
114 bool usePeriodicBoundaryConditions_ =
115 info_->getSimParams()->getUsePeriodicBoundaryConditions();
117 DumpReader reader(info_, dumpFilename_);
118 int nFrames = reader.getNFrames();
120 for (
int istep = 0; istep < nFrames; istep += step_) {
121 reader.readFrame(istep);
122 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
124 if (evaluator_.isDynamic()) {
125 seleMan_.setSelectionSet(evaluator_.evaluate());
130 for (sd = seleMan_.beginSelected(ii); sd != NULL;
131 sd = seleMan_.nextSelected(ii)) {
132 Vector3d pos = sd->getPos();
133 if (usePeriodicBoundaryConditions_) currentSnapshot_->wrapVector(pos);
136 SquareMatrix3<RealType> rotMat;
137 Vector3d rotatedDipoleVector;
139 for (sd = seleMan_.beginSelected(ii); sd != NULL;
140 sd = seleMan_.nextSelected(ii)) {
141 if (sd->isDirectional() || sd->isRigidBody()) {
143 rotatedDipoleVector = rotMat * dipoleVector_;
144 rotatedDipoleVector.normalize();
145 ctheta =
dot(rotatedDipoleVector, refAxis_);
146 int index = int((ctheta - orderMin) / deltaOrder);
156 void OrderParameterProbZ::writeOrderCount() {
157 std::ofstream rdfStream(outputFilename_.c_str());
158 if (rdfStream.is_open()) {
159 rdfStream <<
"#Order count probablity "
161 rdfStream <<
"#selection: (" << selectionScript_ <<
")\n";
162 rdfStream <<
"# Prefered Axis:" << axisLabel_
163 <<
"\n##Order\tProbOrderCount\n";
164 for (
unsigned int i = 0; i < Count_.size(); ++i) {
165 RealType order = i * (2.0 / Count_.size());
167 if (totalCount_ == 0)
170 prop = Count_[i] / totalCount_;
171 rdfStream << order <<
"\t" << prop <<
"\n";
175 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
176 "OrderProb: unable to open %s\n", outputFilename_.c_str());
177 painCave.isFatal = 1;
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
Real dot(const DynamicVector< Real > &v1, const DynamicVector< Real > &v2)
Returns the dot product of two DynamicVectors.
std::string getPrefix(const std::string &str)