OpenMD
3.2
Molecular Dynamics in the Open
Toggle main menu visibility
Loading...
Searching...
No Matches
ActionCorrFunc.cpp
1
/*
2
* Copyright (c) 2004-present, The University of Notre Dame. All rights
3
* reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions are met:
7
*
8
* 1. Redistributions of source code must retain the above copyright notice,
9
* this list of conditions and the following disclaimer.
10
*
11
* 2. Redistributions in binary form must reproduce the above copyright notice,
12
* this list of conditions and the following disclaimer in the documentation
13
* and/or other materials provided with the distribution.
14
*
15
* 3. Neither the name of the copyright holder nor the names of its
16
* contributors may be used to endorse or promote products derived from
17
* this software without specific prior written permission.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
* POSSIBILITY OF SUCH DAMAGE.
30
*
31
* SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
32
* research, please cite the following paper when you publish your work:
33
*
34
* [1] Drisko et al., J. Open Source Softw. 9, 7004 (2024).
35
*
36
* Good starting points for code and simulation methodology are:
37
*
38
* [2] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
39
* [3] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
40
* [4] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
41
* [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
42
* [6] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
43
* [7] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
44
* [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
45
* [9] Drisko & Gezelter, J. Chem. Theory Comput. 20, 4986-4997 (2024).
46
*/
47
48
#include "applications/dynamicProps/ActionCorrFunc.hpp"
49
50
#include <string>
51
52
#include "applications/dynamicProps/TimeCorrFunc.hpp"
53
#include "
brains/ForceManager.hpp
"
54
#include "
brains/SimInfo.hpp
"
55
#include "brains/Thermo.hpp"
56
#include "
math/SquareMatrix3.hpp
"
57
#include "
math/Vector3.hpp
"
58
#include "
primitives/StuntDouble.hpp
"
59
#include "utils/Constants.hpp"
60
#include "utils/Revision.hpp"
61
#include "
utils/StringUtils.hpp
"
62
63
namespace
OpenMD
{
64
65
// We need all of the positions, velocities, etc. so that we can
66
// recalculate pressures and actions on the fly:
67
ActionCorrFunc::ActionCorrFunc(
SimInfo
* info,
const
std::string& filename,
68
const
std::string& sele1,
69
const
std::string& sele2) :
70
SystemACF<Mat3x3d>
(info, filename, sele1, sele2) {
71
setCorrFuncType(
"ActionCorrFunc"
);
72
setOutputName(
getPrefix
(dumpFilename_) +
".action"
);
73
setLabelString(
"Txx\tTxy\tTxz\tTyx\tTyy\tTyz\tTzx\tTzy\tTzz"
);
74
75
// We'll need the force manager to compute forces for the average pressure
76
forceMan_ =
new
ForceManager
(info);
77
78
// We'll need thermo to compute the pressures from the virial
79
thermo_ =
new
Thermo
(info);
80
81
action_.resize(nTimeBins_);
82
time_.resize(nTimeBins_);
83
}
84
85
void
ActionCorrFunc::computeProperty1(
int
frame) {
86
forceMan_->calcForces();
87
RealType vol = thermo_->getVolume();
88
RealType pressure = thermo_->getPressure() / Constants::pressureConvert;
89
90
int
i;
91
StuntDouble
* sd;
92
93
for
(sd = seleMan1_.
beginSelected
(i); sd != NULL;
94
sd = seleMan1_.
nextSelected
(i)) {
95
Vector3d r = sd->
getPos
(frame);
96
Vector3d v = sd->
getVel
(frame);
97
RealType m = sd->
getMass
();
98
99
action_[frame] += m * outProduct(r, v);
100
}
101
action_[frame] /= vol;
102
time_[frame] = info_->
getSnapshotManager
()->
getCurrentSnapshot
()->getTime();
103
pressure_.add(pressure);
104
}
105
106
Mat3x3d ActionCorrFunc::calcCorrVal(
int
frame1,
int
frame2) {
107
Mat3x3d corrTensor(0.0);
108
RealType thisTerm;
109
110
RealType pAve = pressure_.getAverage();
111
112
for
(
unsigned
int
i = 0; i < 3; i++) {
113
for
(
unsigned
int
j = 0; j < 3; j++) {
114
if
(i == j) {
115
thisTerm = (action_[frame2](i, j) - action_[frame1](i, j) -
116
pAve * (time_[frame2] - time_[frame1]));
117
}
else
{
118
thisTerm = (action_[frame2](i, j) - action_[frame1](i, j));
119
}
120
corrTensor(i, j) += thisTerm * thisTerm;
121
}
122
}
123
return
corrTensor;
124
}
125
}
// namespace OpenMD
ForceManager.hpp
SimInfo.hpp
SquareMatrix3.hpp
StringUtils.hpp
StuntDouble.hpp
Vector3.hpp
OpenMD::ForceManager
ForceManager is responsible for calculating both the short range (bonded) interactions and long range...
Definition
ForceManager.hpp:83
OpenMD::SelectionManager::nextSelected
StuntDouble * nextSelected(int &i)
Finds the next selected StuntDouble in the selection.
Definition
SelectionManager.cpp:138
OpenMD::SelectionManager::beginSelected
StuntDouble * beginSelected(int &i)
Finds the first selected StuntDouble in the selection.
Definition
SelectionManager.cpp:121
OpenMD::SimInfo
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Definition
SimInfo.hpp:96
OpenMD::SimInfo::getSnapshotManager
SnapshotManager * getSnapshotManager()
Returns the snapshot manager.
Definition
SimInfo.hpp:251
OpenMD::SnapshotManager::getCurrentSnapshot
Snapshot * getCurrentSnapshot()
Returns the pointer of current snapshot.
Definition
SnapshotManager.hpp:92
OpenMD::StuntDouble
"Don't move, or you're dead! Stand up! Captain, we've got them!"
Definition
StuntDouble.hpp:94
OpenMD::StuntDouble::getVel
Vector3d getVel()
Returns the current velocity of this stuntDouble.
Definition
StuntDouble.hpp:259
OpenMD::StuntDouble::getMass
RealType getMass()
Returns the mass of this stuntDouble.
Definition
StuntDouble.hpp:1509
OpenMD::StuntDouble::getPos
Vector3d getPos()
Returns the current position of this stuntDouble.
Definition
StuntDouble.hpp:199
OpenMD::SystemACF
Definition
TimeCorrFunc.hpp:191
OpenMD::Thermo
Definition
Thermo.hpp:57
OpenMD
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
Definition
ActionCorrFunc.cpp:63
OpenMD::getPrefix
std::string getPrefix(const std::string &str)
Definition
StringUtils.cpp:207
applications
dynamicProps
ActionCorrFunc.cpp
Generated on
for OpenMD by
1.17.0