ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/integrators/Velocitizer.cpp
(Generate patch)

Comparing trunk/OOPSE-4/src/integrators/Velocitizer.cpp (file contents):
Revision 2077 by tim, Wed Mar 2 16:28:20 2005 UTC vs.
Revision 2204 by gezelter, Fri Apr 15 22:04:00 2005 UTC

# Line 1 | Line 1
1 < /*
1 > /*
2   * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4   * The University of Notre Dame grants you ("Licensee") a
# Line 38 | Line 38
38   * University of Notre Dame has been advised of the possibility of
39   * such damages.
40   */
41 <  
41 >
42   #include "integrators/Velocitizer.hpp"
43   #include "math/SquareMatrix3.hpp"
44   #include "primitives/Molecule.hpp"
# Line 51 | Line 51 | namespace oopse {
51   #endif
52  
53   namespace oopse {
54 <
55 < Velocitizer::Velocitizer(SimInfo* info) : info_(info) {
56 <
54 >  
55 >  Velocitizer::Velocitizer(SimInfo* info) : info_(info) {
56 >    
57      int seedValue;
58      Globals * simParams = info->getSimParams();
59 <
59 >    
60   #ifndef IS_MPI
61      if (simParams->haveSeed()) {
62 <        seedValue = simParams->getSeed();
63 <        randNumGen_ = new SeqRandNumGen(seedValue);
62 >      seedValue = simParams->getSeed();
63 >      randNumGen_ = new SeqRandNumGen(seedValue);
64      }else {
65 <        randNumGen_ = new SeqRandNumGen();
65 >      randNumGen_ = new SeqRandNumGen();
66      }    
67   #else
68      if (simParams->haveSeed()) {
69 <        seedValue = simParams->getSeed();
70 <        randNumGen_ = new ParallelRandNumGen(seedValue);
69 >      seedValue = simParams->getSeed();
70 >      randNumGen_ = new ParallelRandNumGen(seedValue);
71      }else {
72 <        randNumGen_ = new ParallelRandNumGen();
72 >      randNumGen_ = new ParallelRandNumGen();
73      }    
74   #endif
75 < }
76 <
77 < Velocitizer::~Velocitizer() {
75 >  }
76 >  
77 >  Velocitizer::~Velocitizer() {
78      delete randNumGen_;
79 < }
80 <
81 < void Velocitizer::velocitize(double temperature) {
79 >  }
80 >  
81 >  void Velocitizer::velocitize(double temperature) {
82      Vector3d aVel;
83      Vector3d aJ;
84      Mat3x3d I;
# Line 91 | Line 91 | void Velocitizer::velocitize(double temperature) {
91      const double kb = 8.31451e-7; // kb in amu, angstroms, fs, etc.
92      double av2;
93      double kebar;
94 <
94 >    
95      SimInfo::MoleculeIterator i;
96      Molecule::IntegrableObjectIterator j;
97      Molecule * mol;
98      StuntDouble * integrableObject;
99 <
100 <
101 <
99 >    
100 >    
101 >    
102      kebar = kb * temperature * info_->getNdfRaw() / (2.0 * info_->getNdf());
103 <
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 <                aVel[k] = vbar * randNumGen_->randNorm(0.0, 1.0);
120 <            }
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 <                    aJ[m] = vbar * randNumGen_->randNorm(0.0, 1.0);
135 <                    vbar = sqrt(2.0 * kebar * I(n, n));
136 <                    aJ[n] = vbar * randNumGen_->randNorm(0.0, 1.0);
137 <                } else {
138 <                    for( int k = 0; k < 3; k++ ) {
139 <                        vbar = sqrt(2.0 * kebar * I(k, k));
140 <                        aJ[k] = vbar *randNumGen_->randNorm(0.0, 1.0);
141 <                    }
142 <                } // else isLinear
143 <
144 <                integrableObject->setJ(aJ);
145 <            }     //isDirectional
146 <        }
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 >          aVel[k] = vbar * randNumGen_->randNorm(0.0, 1.0);
120 >        }
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 >            aJ[m] = vbar * randNumGen_->randNorm(0.0, 1.0);
135 >            vbar = sqrt(2.0 * kebar * I(n, n));
136 >            aJ[n] = vbar * randNumGen_->randNorm(0.0, 1.0);
137 >          } else {
138 >            for( int k = 0; k < 3; k++ ) {
139 >              vbar = sqrt(2.0 * kebar * I(k, k));
140 >              aJ[k] = vbar *randNumGen_->randNorm(0.0, 1.0);
141 >            }
142 >          } // else isLinear
143 >          
144 >          integrableObject->setJ(aJ);
145 >        }     //isDirectional
146 >      }
147      }             //end for (mol = beginMolecule(i); ...)
148 <
149 <
150 <
148 >    
149 >    
150 >    
151      removeComDrift();
152 <
153 < }
154 <
155 <
156 <
157 < void Velocitizer::removeComDrift() {
152 >    
153 >  }
154 >  
155 >  
156 >  
157 >  void Velocitizer::removeComDrift() {
158      // Get the Center of Mass drift velocity.
159      Vector3d vdrift = info_->getComVel();
160      
# Line 166 | Line 166 | void Velocitizer::removeComDrift() {
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 <        }
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 <
176 >    
177 >  }
178 >  
179   }
178
179 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines