ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/integrators/Velocitizer.cpp
Revision: 2077
Committed: Wed Mar 2 16:28:20 2005 UTC (19 years, 4 months ago) by tim
File size: 6080 byte(s)
Log Message:
info_ in Velocitizer is not initialized which causes a seg fault

File Contents

# User Rev Content
1 tim 2065 /*
2     * 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     #include "integrators/Velocitizer.hpp"
43     #include "math/SquareMatrix3.hpp"
44     #include "primitives/Molecule.hpp"
45     #include "primitives/StuntDouble.hpp"
46 tim 2068
47 tim 2076 #ifndef IS_MPI
48     #include "math/SeqRandNumGen.hpp"
49     #else
50     #include "math/ParallelRandNumGen.hpp"
51     #endif
52    
53 tim 2065 namespace oopse {
54    
55 tim 2077 Velocitizer::Velocitizer(SimInfo* info) : info_(info) {
56 tim 2068
57     int seedValue;
58     Globals * simParams = info->getSimParams();
59    
60 tim 2072 #ifndef IS_MPI
61 tim 2068 if (simParams->haveSeed()) {
62     seedValue = simParams->getSeed();
63 tim 2076 randNumGen_ = new SeqRandNumGen(seedValue);
64 tim 2068 }else {
65 tim 2076 randNumGen_ = new SeqRandNumGen();
66 tim 2068 }
67 tim 2072 #else
68     if (simParams->haveSeed()) {
69     seedValue = simParams->getSeed();
70     randNumGen_ = new ParallelRandNumGen(seedValue);
71     }else {
72     randNumGen_ = new ParallelRandNumGen();
73     }
74     #endif
75 tim 2068 }
76    
77     Velocitizer::~Velocitizer() {
78     delete randNumGen_;
79     }
80    
81 tim 2065 void Velocitizer::velocitize(double temperature) {
82     Vector3d aVel;
83     Vector3d aJ;
84     Mat3x3d I;
85     int l;
86     int m;
87     int n;
88     Vector3d vdrift;
89     double vbar;
90     /**@todo refactory kb */
91     const double kb = 8.31451e-7; // kb in amu, angstroms, fs, etc.
92     double av2;
93     double kebar;
94    
95     SimInfo::MoleculeIterator i;
96     Molecule::IntegrableObjectIterator j;
97     Molecule * mol;
98     StuntDouble * integrableObject;
99    
100    
101 tim 2068
102 tim 2065 kebar = kb * temperature * info_->getNdfRaw() / (2.0 * info_->getNdf());
103    
104     for( mol = info_->beginMolecule(i); mol != NULL;
105     mol = info_->nextMolecule(i) ) {
106     for( integrableObject = mol->beginIntegrableObject(j);
107     integrableObject != NULL;
108     integrableObject = mol->nextIntegrableObject(j) ) {
109    
110     // uses equipartition theory to solve for vbar in angstrom/fs
111    
112     av2 = 2.0 * kebar / integrableObject->getMass();
113     vbar = sqrt(av2);
114    
115     // picks random velocities from a gaussian distribution
116     // centered on vbar
117    
118     for( int k = 0; k < 3; k++ ) {
119 tim 2068 aVel[k] = vbar * randNumGen_->randNorm(0.0, 1.0);
120 tim 2065 }
121    
122     integrableObject->setVel(aVel);
123    
124     if (integrableObject->isDirectional()) {
125     I = integrableObject->getI();
126    
127     if (integrableObject->isLinear()) {
128     l = integrableObject->linearAxis();
129     m = (l + 1) % 3;
130     n = (l + 2) % 3;
131    
132     aJ[l] = 0.0;
133     vbar = sqrt(2.0 * kebar * I(m, m));
134 tim 2068 aJ[m] = vbar * randNumGen_->randNorm(0.0, 1.0);
135 tim 2065 vbar = sqrt(2.0 * kebar * I(n, n));
136 tim 2068 aJ[n] = vbar * randNumGen_->randNorm(0.0, 1.0);
137 tim 2065 } else {
138     for( int k = 0; k < 3; k++ ) {
139     vbar = sqrt(2.0 * kebar * I(k, k));
140 tim 2068 aJ[k] = vbar *randNumGen_->randNorm(0.0, 1.0);
141 tim 2065 }
142     } // else isLinear
143    
144     integrableObject->setJ(aJ);
145     } //isDirectional
146     }
147     } //end for (mol = beginMolecule(i); ...)
148    
149    
150    
151     removeComDrift();
152    
153     }
154    
155    
156    
157     void Velocitizer::removeComDrift() {
158     // Get the Center of Mass drift velocity.
159     Vector3d vdrift = info_->getComVel();
160    
161     SimInfo::MoleculeIterator i;
162     Molecule::IntegrableObjectIterator j;
163     Molecule * mol;
164     StuntDouble * integrableObject;
165    
166     // Corrects for the center of mass drift.
167     // sums all the momentum and divides by total mass.
168     for( mol = info_->beginMolecule(i); mol != NULL;
169     mol = info_->nextMolecule(i) ) {
170     for( integrableObject = mol->beginIntegrableObject(j);
171     integrableObject != NULL;
172     integrableObject = mol->nextIntegrableObject(j) ) {
173     integrableObject->setVel(integrableObject->getVel() - vdrift);
174     }
175     }
176    
177     }
178    
179     }