OpenMD
3.2
Molecular Dynamics in the Open
Toggle main menu visibility
Loading...
Searching...
No Matches
NVE.cpp
Go to the documentation of this file.
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
/**
49
* @file NVE.cpp
50
* @author tlin
51
* @date 11/08/2004
52
* @version 1.0
53
*/
54
55
#include "
integrators/NVE.hpp
"
56
57
#include "
primitives/Molecule.hpp
"
58
#include "utils/Constants.hpp"
59
60
namespace
OpenMD
{
61
62
NVE::NVE(
SimInfo
* info) :
VelocityVerletIntegrator
(info) {}
63
64
void
NVE::moveA() {
65
SimInfo::MoleculeIterator i;
66
Molecule::IntegrableObjectIterator j;
67
Molecule* mol;
68
StuntDouble* sd;
69
Vector3d vel;
70
Vector3d pos;
71
Vector3d frc;
72
Vector3d Tb;
73
Vector3d ji;
74
RealType mass;
75
76
for
(mol = info_->beginMolecule(i); mol != NULL;
77
mol = info_->nextMolecule(i)) {
78
for
(sd = mol->beginIntegrableObject(j); sd != NULL;
79
sd = mol->nextIntegrableObject(j)) {
80
vel = sd->getVel();
81
pos = sd->getPos();
82
frc = sd->getFrc();
83
mass = sd->getMass();
84
85
// velocity half step
86
vel += (dt2 / mass * Constants::energyConvert) * frc;
87
88
// position whole step
89
pos += dt * vel;
90
91
sd->setVel(vel);
92
sd->setPos(pos);
93
94
if
(sd->isDirectional()) {
95
// get and convert the torque to body frame
96
97
Tb = sd->lab2Body(sd->getTrq());
98
99
// get the angular momentum, and propagate a half step
100
101
ji = sd->getJ();
102
103
ji += (dt2 * Constants::energyConvert) * Tb;
104
105
rotAlgo_->rotate(sd, ji, dt);
106
107
sd->setJ(ji);
108
}
109
}
110
}
111
flucQ_->moveA();
112
rattle_->constraintA();
113
}
114
115
void
NVE::moveB() {
116
SimInfo::MoleculeIterator i;
117
Molecule::IntegrableObjectIterator j;
118
Molecule* mol;
119
StuntDouble* sd;
120
Vector3d vel;
121
Vector3d frc;
122
Vector3d Tb;
123
Vector3d ji;
124
RealType mass;
125
126
for
(mol = info_->beginMolecule(i); mol != NULL;
127
mol = info_->nextMolecule(i)) {
128
for
(sd = mol->beginIntegrableObject(j); sd != NULL;
129
sd = mol->nextIntegrableObject(j)) {
130
vel = sd->getVel();
131
frc = sd->getFrc();
132
mass = sd->getMass();
133
134
// velocity half step
135
vel += (dt2 / mass * Constants::energyConvert) * frc;
136
137
sd->setVel(vel);
138
139
if
(sd->isDirectional()) {
140
// get and convert the torque to body frame
141
142
Tb = sd->lab2Body(sd->getTrq());
143
144
// get the angular momentum, and propagate a half step
145
146
ji = sd->getJ();
147
148
ji += (dt2 * Constants::energyConvert) * Tb;
149
150
sd->setJ(ji);
151
}
152
}
153
}
154
155
flucQ_->moveB();
156
rattle_->constraintB();
157
}
158
159
RealType NVE::calcConservedQuantity() {
return
thermo.getTotalEnergy(); }
160
161
}
// namespace OpenMD
Molecule.hpp
NVE.hpp
OpenMD::SimInfo
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Definition
SimInfo.hpp:96
OpenMD::VelocityVerletIntegrator
Definition
VelocityVerletIntegrator.hpp:55
OpenMD
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
Definition
ActionCorrFunc.cpp:63
integrators
NVE.cpp
Generated on
for OpenMD by
1.17.0