OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
StuntDouble.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 StuntDouble.cpp
50 * @author tlin
51 * @date 10/22/2004
52 * @version 1.0
53 */
54
56
57#include <cassert>
58#include <memory>
59
60namespace OpenMD {
61
62 StuntDouble::StuntDouble(ObjectType objType, DataStoragePointer storage) :
63 objType_(objType), storage_(storage), snapshotMan_(NULL), linear_(false),
64 linearAxis_(-1), globalIndex_(-1), globalIntegrableObjectIndex_(-1),
65 localIndex_(-1) {}
66
68 int sl = (snapshotMan_->getCurrentSnapshot()->*storage_).getStorageLayout();
69
70 if (sl & DataStorage::dslForce) setFrc(V3Zero);
71 if (sl & DataStorage::dslTorque) setTrq(V3Zero);
72 if (sl & DataStorage::dslParticlePot) setParticlePot(0.0);
73 if (sl & DataStorage::dslFlucQForce) setFlucQFrc(0.0);
74 if (sl & DataStorage::dslElectricField) setElectricField(V3Zero);
75 if (sl & DataStorage::dslSitePotential) setSitePotential(0.0);
76 }
77
79 RealType multA, RealType multB) {
80 int sl = (snapshotMan_->getCurrentSnapshot()->*storage_).getStorageLayout();
81
82 assert(sl == (snapA->*storage_).getStorageLayout());
83 assert(sl == (snapB->*storage_).getStorageLayout());
84
85 if (sl & DataStorage::dslForce) {
86 Vector3d forceA = (snapA->*storage_).force[localIndex_];
87 Vector3d forceB = (snapB->*storage_).force[localIndex_];
88
89 ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] =
90 multA * forceA + multB * forceB;
91 }
92
93 if (sl & DataStorage::dslTorque) {
94 Vector3d torqueA = (snapA->*storage_).torque[localIndex_];
95 Vector3d torqueB = (snapB->*storage_).torque[localIndex_];
96
97 ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] =
98 multA * torqueA + multB * torqueB;
99 }
100
101 if (sl & DataStorage::dslParticlePot) {
102 RealType particlePotA = (snapA->*storage_).particlePot[localIndex_];
103 RealType particlePotB = (snapB->*storage_).particlePot[localIndex_];
104
105 ((snapshotMan_->getCurrentSnapshot())->*storage_)
106 .particlePot[localIndex_] =
107 multA * particlePotA + multB * particlePotB;
108 }
109
110 if (sl & DataStorage::dslFlucQForce) {
111 RealType flucQFrcA = (snapA->*storage_).flucQFrc[localIndex_];
112 RealType flucQFrcB = (snapB->*storage_).flucQFrc[localIndex_];
113
114 ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQFrc[localIndex_] =
115 multA * flucQFrcA + multB * flucQFrcB;
116 }
117
118 if (sl & DataStorage::dslElectricField) {
119 Vector3d electricFieldA = (snapA->*storage_).electricField[localIndex_];
120 Vector3d electricFieldB = (snapB->*storage_).electricField[localIndex_];
121
122 ((snapshotMan_->getCurrentSnapshot())->*storage_)
123 .electricField[localIndex_] =
124 multA * electricFieldA + multB * electricFieldB;
125 }
126
127 if (sl & DataStorage::dslSitePotential) {
128 RealType sitePotentialA = (snapA->*storage_).sitePotential[localIndex_];
129 RealType sitePotentialB = (snapB->*storage_).sitePotential[localIndex_];
130
131 ((snapshotMan_->getCurrentSnapshot())->*storage_)
132 .sitePotential[localIndex_] =
133 multA * sitePotentialA + multB * sitePotentialB;
134 }
135 }
136
137 void StuntDouble::addProperty(std::shared_ptr<GenericData> genData) {
138 properties_.addProperty(genData);
139 }
140
141 void StuntDouble::removeProperty(const std::string& propName) {
142 properties_.removeProperty(propName);
143 }
144
145 std::vector<std::string> StuntDouble::getPropertyNames() {
146 return properties_.getPropertyNames();
147 }
148
149 std::vector<std::shared_ptr<GenericData>> StuntDouble::getProperties() {
150 return properties_.getProperties();
151 }
152
153 std::shared_ptr<GenericData> StuntDouble::getPropertyByName(
154 const std::string& propName) {
155 return properties_.getPropertyByName(propName);
156 }
157
158} // namespace OpenMD
The Snapshot class is a repository storing dynamic data during a Simulation.
Definition Snapshot.hpp:166
void combineForcesAndTorques(Snapshot *snapA, Snapshot *snapB, RealType multA, RealType multB)
Linearly combines the properties from two different snapshots.
void zeroForcesAndTorques()
Set the properties of this stuntDouble to zero.
std::vector< std::shared_ptr< GenericData > > getProperties()
Returns all of the properties in PropertyMap.
std::shared_ptr< GenericData > getPropertyByName(const std::string &propName)
Returns property.
void addProperty(std::shared_ptr< GenericData > genData)
Adds property into property map.
void setParticlePot(const RealType &particlePot)
Sets the current particlePot of this stuntDouble.
void setSitePotential(RealType spot)
Sets the current site potential of this stuntDouble.
void setTrq(const Vector3d &trq)
Sets the current torque of this stuntDouble.
std::vector< std::string > getPropertyNames()
Returns all names of properties.
void setElectricField(const Vector3d &eField)
Sets the current electric field of this stuntDouble.
void removeProperty(const std::string &propName)
Removes property from PropertyMap by name.
void setFrc(const Vector3d &frc)
Sets the current force of this stuntDouble.
void setFlucQFrc(RealType cfrc)
Sets the current charge force of this stuntDouble.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.