OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
IndexFinder.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 "selection/IndexFinder.hpp"
49
50#ifdef IS_MPI
51#include <mpi.h>
52#endif
53
55
56namespace OpenMD {
57
58 IndexFinder::IndexFinder(SimInfo* info) : info_(info) {
59 nObjects_.push_back(info_->getNGlobalAtoms() +
60 info_->getNGlobalRigidBodies());
61 nObjects_.push_back(info_->getNGlobalBonds());
62 nObjects_.push_back(info_->getNGlobalBends());
63 nObjects_.push_back(info_->getNGlobalTorsions());
64 nObjects_.push_back(info_->getNGlobalInversions());
65 nObjects_.push_back(info_->getNGlobalMolecules());
66
67 selectionSets_.resize(info_->getNGlobalMolecules());
68 init();
69 }
70
71 void IndexFinder::init() {
72 SimInfo::MoleculeIterator mi;
73 Molecule::AtomIterator ai;
74 Molecule::RigidBodyIterator rbIter;
75 Molecule::BondIterator bondIter;
76 Molecule::BendIterator bendIter;
77 Molecule::TorsionIterator torsionIter;
78 Molecule::InversionIterator inversionIter;
79
80 Molecule* mol;
81 Atom* atom;
82 RigidBody* rb;
83 Bond* bond;
84 Bend* bend;
85 Torsion* torsion;
86 Inversion* inversion;
87
88 for (mol = info_->beginMolecule(mi); mol != NULL;
89 mol = info_->nextMolecule(mi)) {
90 SelectionSet ss(nObjects_);
91
92 ss.bitsets_[MOLECULE].setBitOn(mol->getGlobalIndex());
93
94 for (atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) {
95 ss.bitsets_[STUNTDOUBLE].setBitOn(atom->getGlobalIndex());
96 }
97 for (rb = mol->beginRigidBody(rbIter); rb != NULL;
98 rb = mol->nextRigidBody(rbIter)) {
99 ss.bitsets_[STUNTDOUBLE].setBitOn(rb->getGlobalIndex());
100 }
101 for (bond = mol->beginBond(bondIter); bond != NULL;
102 bond = mol->nextBond(bondIter)) {
103 ss.bitsets_[BOND].setBitOn(bond->getGlobalIndex());
104 }
105 for (bend = mol->beginBend(bendIter); bend != NULL;
106 bend = mol->nextBend(bendIter)) {
107 ss.bitsets_[BEND].setBitOn(bend->getGlobalIndex());
108 }
109 for (torsion = mol->beginTorsion(torsionIter); torsion != NULL;
110 torsion = mol->nextTorsion(torsionIter)) {
111 ss.bitsets_[TORSION].setBitOn(torsion->getGlobalIndex());
112 }
113 for (inversion = mol->beginInversion(inversionIter); inversion != NULL;
114 inversion = mol->nextInversion(inversionIter)) {
115 ss.bitsets_[INVERSION].setBitOn(inversion->getGlobalIndex());
116 }
117
118 selectionSets_[mol->getGlobalIndex()] = ss;
119 }
120 }
121
122 SelectionSet IndexFinder::find(int molIndex) {
123#ifdef IS_MPI
124 int proc;
125 int worldRank;
126 MPI_Comm_rank(MPI_COMM_WORLD, &worldRank);
127 proc = info_->getMolToProc(molIndex);
128
129 if (proc == worldRank) {
130#endif
131 return selectionSets_[molIndex];
132#ifdef IS_MPI
133 } else {
134 return SelectionSet(nObjects_);
135 }
136#endif
137 }
138
139 SelectionSet IndexFinder::find(int begMolIndex, int endMolIndex) {
140 SelectionSet ss(nObjects_);
141
142#ifdef IS_MPI
143 int proc;
144 int worldRank;
145 MPI_Comm_rank(MPI_COMM_WORLD, &worldRank);
146#endif
147
148 for (int i = begMolIndex; i < endMolIndex; ++i) {
149#ifdef IS_MPI
150 proc = info_->getMolToProc(i);
151
152 if (proc == worldRank) {
153#endif
154 ss |= selectionSets_[i];
155#ifdef IS_MPI
156 }
157#endif
158 }
159 return ss;
160 }
161} // namespace OpenMD
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Definition SimInfo.hpp:96
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
@ INVERSION
Inversions.
@ STUNTDOUBLE
StuntDoubles (Atoms & RigidBodies).
@ TORSION
Torsions.
@ BEND
Bends.
@ BOND
Bonds.
@ MOLECULE
Molecules.