OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
CutoffGroup.hpp
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#ifndef PRIMITIVES_CUTOFFGROUP_HPP
49
50#define PRIMITIVES_CUTOFFGROUP_HPP
51
52#include "math/Vector3.hpp"
53#include "primitives/Atom.hpp"
54
55namespace OpenMD {
56 class CutoffGroup {
57 public:
58 CutoffGroup() : globalIndex(-1), localIndex_(-1), snapshotMan_(NULL) {
59 storage_ = &Snapshot::cgData;
60 haveTotalMass = false;
61 totalMass = 0.0;
62 }
63
64 /**
65 * Sets the Snapshot Manager of this cutoffGroup
66 */
67 void setSnapshotManager(SnapshotManager* sman) { snapshotMan_ = sman; }
68
69 void addAtom(Atom* atom) { cutoffAtomList.push_back(atom); }
70
71 Atom* beginAtom(std::vector<Atom*>::iterator& i) {
72 i = cutoffAtomList.begin();
73 return i != cutoffAtomList.end() ? *i : NULL;
74 }
75
76 Atom* nextAtom(std::vector<Atom*>::iterator& i) {
77 i++;
78 return i != cutoffAtomList.end() ? *i : NULL;
79 }
80
81 std::vector<Atom*> getAtoms() { return cutoffAtomList; }
82 RealType getMass() {
83 if (!haveTotalMass) {
84 totalMass = 0.0;
85
86 std::vector<Atom*>::iterator i;
87 for (Atom* atom = beginAtom(i); atom != NULL; atom = nextAtom(i)) {
88 RealType mass = atom->getMass();
89 totalMass += mass;
90 }
91
92 haveTotalMass = true;
93 }
94
95 return totalMass;
96 }
97
98 void updateCOM() {
99 DataStorage& data = snapshotMan_->getCurrentSnapshot()->*storage_;
100 bool needsVel = false;
101 if (data.getStorageLayout() & DataStorage::dslVelocity) needsVel = true;
102
103 if (cutoffAtomList.size() == 1) {
104 data.position[localIndex_] = cutoffAtomList[0]->getPos();
105 if (needsVel) data.velocity[localIndex_] = cutoffAtomList[0]->getVel();
106 } else {
107 std::vector<Atom*>::iterator i;
108 Atom* atom;
109 RealType totalMass = getMass();
110 data.position[localIndex_] = V3Zero;
111 if (needsVel) data.velocity[localIndex_] = V3Zero;
112
113 for (atom = beginAtom(i); atom != NULL; atom = nextAtom(i)) {
114 data.position[localIndex_] += atom->getMass() * atom->getPos();
115 if (needsVel)
116 data.velocity[localIndex_] += atom->getMass() * atom->getVel();
117 }
118 data.position[localIndex_] /= totalMass;
119 if (needsVel) data.velocity[localIndex_] /= totalMass;
120 }
121 }
122
123 Vector3d getPos() {
124 return ((snapshotMan_->getCurrentSnapshot())->*storage_)
125 .position[localIndex_];
126 }
127 Vector3d getVel() {
128 return ((snapshotMan_->getCurrentSnapshot())->*storage_)
129 .velocity[localIndex_];
130 }
131
132 size_t getNumAtom() { return cutoffAtomList.size(); }
133
134 int getGlobalIndex() { return globalIndex; }
135
136 void setGlobalIndex(int id) { this->globalIndex = id; }
137
138 /**
139 * Returns the local index of this cutoffGroup
140 * @return the local index of this cutoffGroup
141 */
142 int getLocalIndex() { return localIndex_; }
143
144 /**
145 * Sets the local index of this cutoffGroup
146 * @param index new index to be set
147 */
148 void setLocalIndex(int index) { localIndex_ = index; }
149
150 private:
151 std::vector<Atom*> cutoffAtomList;
152 bool haveTotalMass;
153 RealType totalMass;
154 int globalIndex;
155
156 int localIndex_;
157 DataStoragePointer storage_;
158 SnapshotManager* snapshotMan_;
159 };
160} // namespace OpenMD
161
162#endif // PRIMITIVES_CUTOFFGROUP_HPP
void setLocalIndex(int index)
Sets the local index of this cutoffGroup.
int getLocalIndex()
Returns the local index of this cutoffGroup.
void setSnapshotManager(SnapshotManager *sman)
Sets the Snapshot Manager of this cutoffGroup.
SnapshotManager class is an abstract class which maintains a series of snapshots.
RealType getMass()
Returns the mass of this stuntDouble.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.