OpenMPCD
HarmonicTrimers.cpp
2 
5 
6 using namespace OpenMPCD;
8 
10  const Simulation* const sim, DeviceMemoryManager* const devMemMgr,
11  const MPCFluid::HarmonicTrimers* const mpcFluid_)
12  : Base(sim->getConfiguration(), mpcFluid_),
13  simulation(sim), mpcFluid(mpcFluid_),
14 
15  bond1LengthHistogram("harmonicTrimers.bond1LengthHistogram", sim->getConfiguration()),
16  bond2LengthHistogram("harmonicTrimers.bond2LengthHistogram", sim->getConfiguration()),
17 
18  bond1LengthSquaredHistogram("harmonicTrimers.bond1LengthSquaredHistogram", sim->getConfiguration()),
19  bond2LengthSquaredHistogram("harmonicTrimers.bond2LengthSquaredHistogram", sim->getConfiguration()),
20 
21  bond1XXHistogram("harmonicTrimers.bond1XXHistogram", sim->getConfiguration()),
22  bond2XXHistogram("harmonicTrimers.bond2XXHistogram", sim->getConfiguration()),
23 
24  bond1YYHistogram("harmonicTrimers.bond1YYHistogram", sim->getConfiguration()),
25  bond2YYHistogram("harmonicTrimers.bond2YYHistogram", sim->getConfiguration()),
26 
27  bond1ZZHistogram("harmonicTrimers.bond1ZZHistogram", sim->getConfiguration()),
28  bond2ZZHistogram("harmonicTrimers.bond2ZZHistogram", sim->getConfiguration()),
29 
30  bond1XYHistogram("harmonicTrimers.bond1XYHistogram", sim->getConfiguration()),
31  bond2XYHistogram("harmonicTrimers.bond2XYHistogram", sim->getConfiguration()),
32 
33  bond1XYAngleWithFlowDirectionHistogram("harmonicTrimers.bond1XYAngleWithFlowDirectionHistogram", sim->getConfiguration()),
34  bond2XYAngleWithFlowDirectionHistogram("harmonicTrimers.bond2XYAngleWithFlowDirectionHistogram", sim->getConfiguration()),
35 
36  trimerCenterOfMassesSnapshotTime(-1)
37 {
38  sim->getConfiguration().read(
39  "instrumentation.selfDiffusionCoefficient.measurementTime",
40  &selfDiffusionCoefficientMeasurementTime);
41 
43  velocityAutocorrelation = new VelocityAutocorrelation::Triplets(sim, devMemMgr, mpcFluid_);
44 }
45 
47 {
48  static const Vector3D<MPCParticleVelocityType> flowDirection(1, 0, 0);
49 
50  for(unsigned int i=0; i<mpcFluid->getParticleCount(); i+=3)
51  {
55 
56  const Vector3D<MPCParticlePositionType> R_1 = r_2 - r_1;
57  const Vector3D<MPCParticlePositionType> R_2 = r_3 - r_2;
58 
59  bond1LengthHistogram.fill(R_1.getMagnitude());
60  bond2LengthHistogram.fill(R_2.getMagnitude());
61 
62  bond1LengthSquaredHistogram.fill(R_1.getMagnitudeSquared());
63  bond2LengthSquaredHistogram.fill(R_2.getMagnitudeSquared());
64 
65  const FP xx1 = R_1.getX()*R_1.getX();
66  const FP yy1 = R_1.getY()*R_1.getY();
67  const FP zz1 = R_1.getZ()*R_1.getZ();
68  const FP xy1 = R_1.getX()*R_1.getY();
69 
70  const FP xx2 = R_2.getX()*R_2.getX();
71  const FP yy2 = R_2.getY()*R_2.getY();
72  const FP zz2 = R_2.getZ()*R_2.getZ();
73  const FP xy2 = R_1.getX()*R_2.getY();
74 
75  bond1XXHistogram.fill(xx1);
76  bond2XXHistogram.fill(xx2);
77 
78  bond1YYHistogram.fill(yy1);
79  bond2YYHistogram.fill(yy2);
80 
81  bond1ZZHistogram.fill(zz1);
82  bond2ZZHistogram.fill(zz2);
83 
84  bond1XYHistogram.fill(xy1);
85  bond2XYHistogram.fill(xy2);
86 
87  const Vector3D<MPCParticlePositionType> R_1_xy(R_1.getX(), R_1.getY(), 0);
88  const Vector3D<MPCParticlePositionType> R_2_xy(R_2.getX(), R_2.getY(), 0);
89 
90  bond1XYAngleWithFlowDirectionHistogram.fill(R_1_xy.getAngle(flowDirection));
91  bond2XYAngleWithFlowDirectionHistogram.fill(R_2_xy.getAngle(flowDirection));
92  }
93 
94 
95  const unsigned int trimerCount = getTrimerCount();
96 
97  if(trimerCenterOfMassesSnapshotTime < 0)
98  {
99  trimerCenterOfMassesSnapshot.reserve(trimerCount);
100 
101  for(unsigned int i=0; i<trimerCount; ++i)
102  trimerCenterOfMassesSnapshot.push_back(getTrimerCenterOfMass(i));
103 
104  trimerCenterOfMassesSnapshotTime = simulation->getMPCTime();
105  }
106 
107  const FP timeSinceLastCenterOfMassSnapshot = simulation->getMPCTime() - trimerCenterOfMassesSnapshotTime;
108  if(timeSinceLastCenterOfMassSnapshot >= selfDiffusionCoefficientMeasurementTime)
109  {
110  FP accumulatedSquares = 0;
111  for(unsigned int i=0; i<trimerCount; ++i)
112  {
113  const Vector3D<MPCParticlePositionType>& oldPosition = trimerCenterOfMassesSnapshot[i];
114  const Vector3D<MPCParticlePositionType> newPosition = getTrimerCenterOfMass(i);
115 
116  const Vector3D<MPCParticlePositionType> difference = newPosition - oldPosition;
117 
118  accumulatedSquares += difference.getMagnitudeSquared();
119 
120  trimerCenterOfMassesSnapshot[i] = newPosition;
121  }
122 
123  const FP selfDiffusionCoefficient =
124  accumulatedSquares / (6 * timeSinceLastCenterOfMassSnapshot * trimerCount);
125 
126  selfDiffusionCoefficients.addPoint(trimerCenterOfMassesSnapshotTime, selfDiffusionCoefficient);
127 
128  trimerCenterOfMassesSnapshotTime = simulation->getMPCTime();
129  }
130 }
131 
132 void HarmonicTrimers::saveSpecific(const std::string& rundir) const
133 {
134  bond1LengthHistogram.save(rundir+"/harmonicTrimers/bond1/lengthHistogram.data");
135  bond2LengthHistogram.save(rundir+"/harmonicTrimers/bond2/lengthHistogram.data");
136 
137  bond1LengthSquaredHistogram.save(rundir+"/harmonicTrimers/bond1/lengthSquaredHistogram.data");
138  bond2LengthSquaredHistogram.save(rundir+"/harmonicTrimers/bond2/lengthSquaredHistogram.data");
139 
140  bond1XXHistogram.save(rundir+"/harmonicTrimers/bond1/XXHistogram.data");
141  bond2XXHistogram.save(rundir+"/harmonicTrimers/bond2/XXHistogram.data");
142 
143  bond1YYHistogram.save(rundir+"/harmonicTrimers/bond1/YYHistogram.data");
144  bond2YYHistogram.save(rundir+"/harmonicTrimers/bond2/YYHistogram.data");
145 
146  bond1ZZHistogram.save(rundir+"/harmonicTrimers/bond1/ZZHistogram.data");
147  bond2ZZHistogram.save(rundir+"/harmonicTrimers/bond2/ZZHistogram.data");
148 
149  bond1XYHistogram.save(rundir+"/harmonicTrimers/bond1/XYHistogram.data");
150  bond2XYHistogram.save(rundir+"/harmonicTrimers/bond2/XYHistogram.data");
151 
152  bond1XYHistogram.save(rundir+"/harmonicTrimers/bond1/XYHistogram.data");
153  bond2XYHistogram.save(rundir+"/harmonicTrimers/bond2/XYHistogram.data");
154 
155  bond1XYAngleWithFlowDirectionHistogram.save(rundir+"/harmonicTrimers/bond1/angleWithFlowDirectionHistogram.data");
156  bond2XYAngleWithFlowDirectionHistogram.save(rundir+"/harmonicTrimers/bond2/angleWithFlowDirectionHistogram.data");
157 
158  selfDiffusionCoefficients.save(rundir+"/selfDiffusionCoefficient.data", false);
159 }
160 
161 const Vector3D<MPCParticlePositionType> HarmonicTrimers::getTrimerCenterOfMass(const unsigned int trimerID) const
162 {
163  #ifdef OPENMPCD_DEBUG
164  if(trimerID >= getTrimerCount())
166  #endif
167 
168  const unsigned int particle1ID = trimerID * 3;
169 
170  const RemotelyStoredVector<const MPCParticlePositionType> r_1 = mpcFluid->getPosition(particle1ID + 0);
171  const RemotelyStoredVector<const MPCParticlePositionType> r_2 = mpcFluid->getPosition(particle1ID + 1);
172  const RemotelyStoredVector<const MPCParticlePositionType> r_3 = mpcFluid->getPosition(particle1ID + 2);
173 
174  return (r_1 + r_2 + r_3) / 3.0;
175 }
OpenMPCD::RemotelyStoredVector
Represents a vector whose data is stored elsewhere.
Definition: RemotelyStoredVector.hpp:26
OpenMPCD::CUDA::MPCFluid::Instrumentation::HarmonicTrimers::HarmonicTrimers
HarmonicTrimers(const Simulation *const sim, DeviceMemoryManager *const devMemMgr, const MPCFluid::HarmonicTrimers *const mpcFluid_)
The constructor.
Definition: HarmonicTrimers.cpp:9
OpenMPCD::Vector3D::getZ
OPENMPCD_CUDA_HOST_AND_DEVICE T getZ() const
Returns the z coordinate.
Definition: Vector3D.hpp:119
OpenMPCD::Graph::save
void save(const std::string &path, const bool prependGnuplotCommands) const
Saves the graph data to the given file path.
Definition: Graph.cpp:8
OPENMPCD_THROW
#define OPENMPCD_THROW(ExceptionType, message)
Throws the given ExceptionType, passing the given message along with file and line number information...
Definition: Exceptions.hpp:22
OpenMPCD::CUDA::DeviceMemoryManager
Class for managing memory on the CUDA Device.
Definition: DeviceMemoryManager.hpp:21
OpenMPCD::Vector3D
3-dimensional vector.
Definition: Vector3D.hpp:38
OpenMPCD::Vector3D::getX
OPENMPCD_CUDA_HOST_AND_DEVICE T getX() const
Returns the x coordinate.
Definition: Vector3D.hpp:61
OpenMPCD::CUDA::MPCFluid::Instrumentation::FourierTransformedVelocity::Triplets
Class for measurements of Fourier-transformed velocities in MPC fluids that consist of triplets of pa...
Definition: Instrumentation/FourierTransformedVelocity/Triplets.hpp:28
Triplets.hpp
OpenMPCD::CUDA::MPCFluid::Instrumentation
Namespace for instrumentation classes for MPC fluids.
Definition: CUDA/MPCFluid/Instrumentation/Base.hpp:29
OpenMPCD::Vector3D::getY
OPENMPCD_CUDA_HOST_AND_DEVICE T getY() const
Returns the y coordinate.
Definition: Vector3D.hpp:90
OpenMPCD::Configuration::read
void read(const std::pair< const char *, ValueType * >(&settingsAndValues)[settingsCount]) const
Reads the specified settings from the given configuration file and stores them in the given location.
Definition: Configuration.hpp:523
OpenMPCD::CUDA::MPCFluid::Instrumentation::Base::fourierTransformedVelocity
FourierTransformedVelocity::Base * fourierTransformedVelocity
Measures Fourier-transformed velocities.
Definition: CUDA/MPCFluid/Instrumentation/Base.hpp:160
OpenMPCD::CUDA::Simulation::getConfiguration
const Configuration & getConfiguration() const
Returns the configuration.
Definition: CUDA/Simulation.hpp:81
OpenMPCD::CUDA::MPCFluid::HarmonicTrimers
Fluid consisting of three particles, with two harmonic springs coupling them.
Definition: HarmonicTrimers.hpp:41
OpenMPCD::CUDA::Simulation::getMPCTime
FP getMPCTime() const
Returns the MPC time that has passed since the start of the simulation.
Definition: CUDA/Simulation.hpp:200
OpenMPCD::Vector3D::getAngle
T getAngle(const Vector3D &rhs) const
Returns the the angle between this vector and the given one.
Definition: Vector3D.hpp:200
OpenMPCD::CUDA::Simulation
MPCD simulation with Molecular Dynamics on CUDA-capable GPUs.
Definition: CUDA/Simulation.hpp:48
OpenMPCD::Histogram::save
void save(const std::string &filename, const FP binPoint=0.5) const
Saves the histogram at the given path.
Definition: Histogram.cpp:75
Triplets.hpp
OpenMPCD::CUDA::MPCFluid::Base::getParticleCount
unsigned int getParticleCount() const
Returns the number of MPC fluid particles.
Definition: CUDA/MPCFluid/Base.hpp:72
OpenMPCD::FP
double FP
Default floating point type.
Definition: Types.hpp:13
OpenMPCD::CUDA::MPCFluid::Instrumentation::HarmonicTrimers::measureSpecific
virtual void measureSpecific()
Performs measurements.
Definition: HarmonicTrimers.cpp:46
OpenMPCD::Histogram::fill
void fill(const FP val)
Adds an entry to the histogram.
Definition: Histogram.cpp:21
OpenMPCD::CUDA::MPCFluid::Instrumentation::Base
Base class for MPC fluids instrumentation.
Definition: CUDA/MPCFluid/Instrumentation/Base.hpp:34
OpenMPCD::CUDA::MPCFluid::Instrumentation::VelocityAutocorrelation::Triplets
Class for measurements of velocity autocorrelation in MPC fluids that consist of triplets of particle...
Definition: Instrumentation/VelocityAutocorrelation/Triplets.hpp:27
OpenMPCD::OutOfBoundsException
Exception for out-of-bounds access.
Definition: Exceptions.hpp:112
OpenMPCD::Graph::addPoint
void addPoint(const FP x, const FP y)
Adds a data point.
Definition: Graph.hpp:30
HarmonicTrimers.hpp
OpenMPCD::CUDA::MPCFluid::Base::getPosition
const RemotelyStoredVector< const MPCParticlePositionType > getPosition(const unsigned int particleID) const
Returns a MPC fluid particle's position vector.
OpenMPCD::Vector3D::getMagnitude
OPENMPCD_CUDA_HOST_AND_DEVICE RealType getMagnitude() const
Returns the magnitude of this vector.
Definition: Vector3D.hpp:227
OpenMPCD::CUDA::MPCFluid::Instrumentation::HarmonicTrimers::saveSpecific
virtual void saveSpecific(const std::string &rundir) const
Saves the data to the given run directory.
Definition: HarmonicTrimers.cpp:132
OpenMPCD::Vector3D::getMagnitudeSquared
OPENMPCD_CUDA_HOST_AND_DEVICE RealType getMagnitudeSquared() const
Returns the square of the magnitude of this vector.
Definition: Vector3D.hpp:209
OpenMPCD::CUDA::MPCFluid::Instrumentation::Base::velocityAutocorrelation
VelocityAutocorrelation::Base * velocityAutocorrelation
Measures velocity autocorrelation.
Definition: CUDA/MPCFluid/Instrumentation/Base.hpp:169