ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/primitives/Molecule.cpp
Revision: 3520
Committed: Mon Sep 7 16:31:51 2009 UTC (15 years, 10 months ago) by cli2
File size: 10102 byte(s)
Log Message:
Added new restraint infrastructure
Added MolecularRestraints
Added ObjectRestraints
Added RestraintStamp
Updated thermodynamic integration to use ObjectRestraints
Added Quaternion mathematics for twist swing decompositions
Significantly updated RestWriter and RestReader to use dump-like files
Added selections for x, y, and z coordinates of atoms
Removed monolithic Restraints class
Fixed a few bugs in gradients of Euler angles in DirectionalAtom and RigidBody
Added some rotational capabilities to prinicpalAxisCalculator

File Contents

# User Rev Content
1 gezelter 2204 /*
2 gezelter 1930 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9     * 1. Acknowledgement of the program authors must be made in any
10     * publication of scientific results based in part on use of the
11     * program. An acceptable form of acknowledgement is citation of
12     * the article in which the program was described (Matthew
13     * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14     * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15     * Parallel Simulation Engine for Molecular Dynamics,"
16     * J. Comput. Chem. 26, pp. 252-271 (2005))
17     *
18     * 2. Redistributions of source code must retain the above copyright
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 3. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in the
23     * documentation and/or other materials provided with the
24     * distribution.
25     *
26     * This software is provided "AS IS," without a warranty of any
27     * kind. All express or implied conditions, representations and
28     * warranties, including any implied warranty of merchantability,
29     * fitness for a particular purpose or non-infringement, are hereby
30     * excluded. The University of Notre Dame and its licensors shall not
31     * be liable for any damages suffered by licensee as a result of
32     * using, modifying or distributing the software or its
33     * derivatives. In no event will the University of Notre Dame or its
34     * licensors be liable for any lost revenue, profit or data, or for
35     * direct, indirect, special, consequential, incidental or punitive
36     * damages, however caused and regardless of the theory of liability,
37     * arising out of the use of or inability to use software, even if the
38     * University of Notre Dame has been advised of the possibility of
39     * such damages.
40     */
41    
42     /**
43     * @file Molecule.cpp
44     * @author tlin
45     * @date 10/28/2004
46     * @version 1.0
47     */
48 gezelter 1490
49 gezelter 1930 #include <algorithm>
50     #include <set>
51 gezelter 1490
52 tim 1492 #include "primitives/Molecule.hpp"
53 gezelter 1930 #include "utils/MemoryUtils.hpp"
54 tim 1492 #include "utils/simError.h"
55 gezelter 1490
56 gezelter 1930 namespace oopse {
57 gezelter 2204 Molecule::Molecule(int stampId, int globalIndex, const std::string& molName)
58 gezelter 1930 : stampId_(stampId), globalIndex_(globalIndex), moleculeName_(molName) {
59 gezelter 3320 }
60    
61 gezelter 2204 Molecule::~Molecule() {
62 gezelter 3320
63 tim 2082 MemoryUtils::deletePointers(atoms_);
64     MemoryUtils::deletePointers(bonds_);
65     MemoryUtils::deletePointers(bends_);
66     MemoryUtils::deletePointers(torsions_);
67 gezelter 3432 MemoryUtils::deletePointers(inversions_);
68 tim 2082 MemoryUtils::deletePointers(rigidBodies_);
69     MemoryUtils::deletePointers(cutoffGroups_);
70     MemoryUtils::deletePointers(constraintPairs_);
71     MemoryUtils::deletePointers(constraintElems_);
72 gezelter 3320 // integrableObjects_ don't own the objects
73 gezelter 1930 integrableObjects_.clear();
74    
75 gezelter 2204 }
76 gezelter 3320
77 gezelter 2204 void Molecule::addAtom(Atom* atom) {
78 gezelter 1930 if (std::find(atoms_.begin(), atoms_.end(), atom) == atoms_.end()) {
79 gezelter 2204 atoms_.push_back(atom);
80 gezelter 1930 }
81 gezelter 2204 }
82 gezelter 3320
83 gezelter 2204 void Molecule::addBond(Bond* bond) {
84 gezelter 1930 if (std::find(bonds_.begin(), bonds_.end(), bond) == bonds_.end()) {
85 gezelter 2204 bonds_.push_back(bond);
86 gezelter 1930 }
87 gezelter 2204 }
88 gezelter 3320
89 gezelter 2204 void Molecule::addBend(Bend* bend) {
90 gezelter 1930 if (std::find(bends_.begin(), bends_.end(), bend) == bends_.end()) {
91 gezelter 2204 bends_.push_back(bend);
92 gezelter 1930 }
93 gezelter 2204 }
94 gezelter 3320
95 gezelter 2204 void Molecule::addTorsion(Torsion* torsion) {
96 gezelter 3320 if (std::find(torsions_.begin(), torsions_.end(), torsion) ==
97     torsions_.end()) {
98 gezelter 2204 torsions_.push_back(torsion);
99 gezelter 1930 }
100 gezelter 2204 }
101 gezelter 3432
102     void Molecule::addInversion(Inversion* inversion) {
103     if (std::find(inversions_.begin(), inversions_.end(), inversion) ==
104     inversions_.end()) {
105     inversions_.push_back(inversion);
106     }
107     }
108 gezelter 3320
109 gezelter 2204 void Molecule::addRigidBody(RigidBody *rb) {
110 gezelter 3320 if (std::find(rigidBodies_.begin(), rigidBodies_.end(), rb) ==
111     rigidBodies_.end()) {
112 gezelter 2204 rigidBodies_.push_back(rb);
113 gezelter 1930 }
114 gezelter 2204 }
115 gezelter 3320
116 gezelter 2204 void Molecule::addCutoffGroup(CutoffGroup* cp) {
117 gezelter 3320 if (std::find(cutoffGroups_.begin(), cutoffGroups_.end(), cp) ==
118     cutoffGroups_.end()) {
119 gezelter 2204 cutoffGroups_.push_back(cp);
120 gezelter 3320 }
121 gezelter 2204 }
122 gezelter 3320
123 gezelter 2204 void Molecule::addConstraintPair(ConstraintPair* cp) {
124 gezelter 3320 if (std::find(constraintPairs_.begin(), constraintPairs_.end(), cp) ==
125     constraintPairs_.end()) {
126 gezelter 2204 constraintPairs_.push_back(cp);
127 gezelter 3320 }
128 gezelter 2204 }
129 gezelter 3320
130 gezelter 2204 void Molecule::addConstraintElem(ConstraintElem* cp) {
131 gezelter 3320 if (std::find(constraintElems_.begin(), constraintElems_.end(), cp) ==
132     constraintElems_.end()) {
133 gezelter 2204 constraintElems_.push_back(cp);
134 gezelter 1930 }
135 gezelter 2204 }
136 gezelter 3320
137 gezelter 2204 void Molecule::complete() {
138 gezelter 1930
139     std::set<Atom*> rigidAtoms;
140     RigidBody* rb;
141     std::vector<RigidBody*>::iterator rbIter;
142 gezelter 1490
143 gezelter 1930
144     for (rb = beginRigidBody(rbIter); rb != NULL; rb = nextRigidBody(rbIter)) {
145 gezelter 2204 rigidAtoms.insert(rb->getBeginAtomIter(), rb->getEndAtomIter());
146 gezelter 1930 }
147 gezelter 3320
148 gezelter 1930 Atom* atom;
149     AtomIterator ai;
150     for (atom = beginAtom(ai); atom != NULL; atom = nextAtom(ai)) {
151 gezelter 3320
152 gezelter 2204 if (rigidAtoms.find(*ai) == rigidAtoms.end()) {
153 gezelter 3320
154     // If an atom does not belong to a rigid body, it is an
155     // integrable object
156    
157 gezelter 2204 integrableObjects_.push_back(*ai);
158     }
159 gezelter 1930 }
160 gezelter 3320
161 gezelter 1930 //find all free atoms (which do not belong to rigid bodies)
162 gezelter 3320 // performs the "difference" operation from set theory, the output
163     // range contains a copy of every element that is contained in
164     // [allAtoms.begin(), allAtoms.end()) and not contained in
165     // [rigidAtoms.begin(), rigidAtoms.end()).
166 gezelter 1930 //std::set_difference(allAtoms.begin(), allAtoms.end(), rigidAtoms.begin(), rigidAtoms.end(),
167     // std::back_inserter(integrableObjects_));
168 gezelter 1490
169 gezelter 1930 //if (integrableObjects_.size() != allAtoms.size() - rigidAtoms.size()) {
170     // //Some atoms in rigidAtoms are not in allAtoms, something must be wrong
171     // sprintf(painCave.errMsg, "Atoms in rigidbody are not in the atom list of the same molecule");
172     //
173     // painCave.isFatal = 1;
174     // simError();
175     //}
176 tim 2056 for (rb = beginRigidBody(rbIter); rb != NULL; rb = nextRigidBody(rbIter)) {
177     integrableObjects_.push_back(rb);
178     }
179     //integrableObjects_.insert(integrableObjects_.end(), rigidBodies_.begin(), rigidBodies_.end());
180 gezelter 2204 }
181 gezelter 1490
182 tim 2759 RealType Molecule::getMass() {
183 gezelter 1930 StuntDouble* sd;
184     std::vector<StuntDouble*>::iterator i;
185 tim 2759 RealType mass = 0.0;
186 gezelter 3320
187     for (sd = beginIntegrableObject(i); sd != NULL; sd =
188     nextIntegrableObject(i)){
189 gezelter 2204 mass += sd->getMass();
190 gezelter 1930 }
191 gezelter 3320
192     return mass;
193 gezelter 2204 }
194 gezelter 1490
195 gezelter 2204 Vector3d Molecule::getCom() {
196 gezelter 1930 StuntDouble* sd;
197     std::vector<StuntDouble*>::iterator i;
198     Vector3d com;
199 tim 2759 RealType totalMass = 0;
200     RealType mass;
201 gezelter 1930
202 gezelter 3320 for (sd = beginIntegrableObject(i); sd != NULL; sd =
203     nextIntegrableObject(i)){
204 gezelter 2204 mass = sd->getMass();
205     totalMass += mass;
206     com += sd->getPos() * mass;
207 gezelter 1490 }
208 gezelter 3320
209 gezelter 1930 com /= totalMass;
210 gezelter 1490
211 gezelter 1930 return com;
212 gezelter 2204 }
213 gezelter 1490
214 gezelter 2204 void Molecule::moveCom(const Vector3d& delta) {
215 gezelter 1930 StuntDouble* sd;
216     std::vector<StuntDouble*>::iterator i;
217    
218 gezelter 3320 for (sd = beginIntegrableObject(i); sd != NULL; sd =
219     nextIntegrableObject(i)){
220 gezelter 2204 sd->setPos(sd->getPos() + delta);
221 gezelter 3320 }
222 gezelter 2204 }
223 gezelter 1490
224 gezelter 2204 Vector3d Molecule::getComVel() {
225 gezelter 1930 StuntDouble* sd;
226     std::vector<StuntDouble*>::iterator i;
227     Vector3d velCom;
228 tim 2759 RealType totalMass = 0;
229     RealType mass;
230 gezelter 1930
231 gezelter 3320 for (sd = beginIntegrableObject(i); sd != NULL; sd =
232     nextIntegrableObject(i)){
233 gezelter 2204 mass = sd->getMass();
234     totalMass += mass;
235     velCom += sd->getVel() * mass;
236 gezelter 1930 }
237 gezelter 3320
238 gezelter 1930 velCom /= totalMass;
239 gezelter 3320
240 gezelter 1930 return velCom;
241 gezelter 2204 }
242 gezelter 1490
243 tim 2759 RealType Molecule::getPotential() {
244 gezelter 1490
245 gezelter 1930 Bond* bond;
246     Bend* bend;
247     Torsion* torsion;
248 gezelter 3432 Inversion* inversion;
249 gezelter 1930 Molecule::BondIterator bondIter;;
250     Molecule::BendIterator bendIter;
251     Molecule::TorsionIterator torsionIter;
252 gezelter 3432 Molecule::InversionIterator inversionIter;
253 gezelter 1490
254 tim 2759 RealType potential = 0.0;
255 gezelter 1490
256 gezelter 1930 for (bond = beginBond(bondIter); bond != NULL; bond = nextBond(bondIter)) {
257 gezelter 2204 potential += bond->getPotential();
258 gezelter 1930 }
259 gezelter 1490
260 gezelter 1930 for (bend = beginBend(bendIter); bend != NULL; bend = nextBend(bendIter)) {
261 gezelter 2204 potential += bend->getPotential();
262 gezelter 1490 }
263    
264 gezelter 3320 for (torsion = beginTorsion(torsionIter); torsion != NULL; torsion =
265     nextTorsion(torsionIter)) {
266 gezelter 2204 potential += torsion->getPotential();
267 gezelter 1490 }
268 gezelter 3320
269 gezelter 3432 for (inversion = beginInversion(inversionIter); torsion != NULL;
270     inversion = nextInversion(inversionIter)) {
271     potential += inversion->getPotential();
272     }
273    
274 gezelter 1930 return potential;
275 gezelter 3320
276 gezelter 2204 }
277 gezelter 3320
278 cli2 3520 void Molecule::addProperty(GenericData* genData) {
279     properties_.addProperty(genData);
280     }
281    
282     void Molecule::removeProperty(const std::string& propName) {
283     properties_.removeProperty(propName);
284     }
285    
286     void Molecule::clearProperties() {
287     properties_.clearProperties();
288     }
289    
290     std::vector<std::string> Molecule::getPropertyNames() {
291     return properties_.getPropertyNames();
292     }
293    
294     std::vector<GenericData*> Molecule::getProperties() {
295     return properties_.getProperties();
296     }
297    
298     GenericData* Molecule::getPropertyByName(const std::string& propName) {
299     return properties_.getPropertyByName(propName);
300     }
301    
302    
303    
304    
305 gezelter 2204 std::ostream& operator <<(std::ostream& o, Molecule& mol) {
306 gezelter 1930 o << std::endl;
307     o << "Molecule " << mol.getGlobalIndex() << "has: " << std::endl;
308     o << mol.getNAtoms() << " atoms" << std::endl;
309     o << mol.getNBonds() << " bonds" << std::endl;
310     o << mol.getNBends() << " bends" << std::endl;
311     o << mol.getNTorsions() << " torsions" << std::endl;
312 gezelter 3432 o << mol.getNInversions() << " inversions" << std::endl;
313 gezelter 1930 o << mol.getNRigidBodies() << " rigid bodies" << std::endl;
314     o << mol.getNIntegrableObjects() << "integrable objects" << std::endl;
315     o << mol.getNCutoffGroups() << "cutoff groups" << std::endl;
316     o << mol.getNConstraintPairs() << "constraint pairs" << std::endl;
317     return o;
318 gezelter 2204 }
319 gezelter 3320
320 gezelter 1930 }//end namespace oopse