ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/rnemd/RNEMD.cpp
(Generate patch)

Comparing trunk/src/integrators/RNEMD.cpp (file contents):
Revision 1331 by gezelter, Thu Apr 2 16:04:52 2009 UTC vs.
Revision 1334 by gezelter, Thu Apr 2 19:55:37 2009 UTC

# Line 40 | Line 40
40   */
41  
42   #include "integrators/RNEMD.hpp"
43 + #include "math/Vector3.hpp"
44   #include "math/SquareMatrix3.hpp"
45   #include "primitives/Molecule.hpp"
46   #include "primitives/StuntDouble.hpp"
47 + #include "utils/OOPSEConstant.hpp"
48 + #include "utils/Tuple.hpp"
49  
50   #ifndef IS_MPI
51   #include "math/SeqRandNumGen.hpp"
# Line 59 | Line 62 | namespace oopse {
62  
63   namespace oopse {
64    
65 <  RNEMD::RNEMD(SimInfo* info) : info_(info), evaluator_(info), seleMan_(info) {
65 >  RNEMD::RNEMD(SimInfo* info) : info_(info), evaluator_(info), seleMan_(info), usePeriodicBoundaryConditions_(info->getSimParams()->getUsePeriodicBoundaryConditions()) {
66      
67      int seedValue;
68      Globals * simParams = info->getSimParams();
# Line 110 | Line 113 | namespace oopse {
113    void RNEMD::doSwap() {
114      std::cerr << "in RNEMD!\n";  
115      std::cerr << "nBins = " << nBins_ << "\n";
116 +    int midBin = nBins_ / 2;
117 +    std::cerr << "midBin = " << midBin << "\n";
118      std::cerr << "swapTime = " << swapTime_ << "\n";
119      std::cerr << "exchangeSum = " << exchangeSum_ << "\n";
120      std::cerr << "swapType = " << rnemdType_ << "\n";
121      std::cerr << "selection = " << rnemdObjectSelection_ << "\n";
122  
123 +    Snapshot* currentSnap_ = info_->getSnapshotManager()->getCurrentSnapshot();
124 +    Mat3x3d hmat = currentSnap_->getHmat();
125 +
126 +    std::cerr << "hmat = " << hmat << "\n";
127 +
128      seleMan_.setSelectionSet(evaluator_.evaluate());
129  
130      std::cerr << "selectionCount = " << seleMan_.getSelectionCount() << "\n\n";
131  
132 <    int i;
132 >    int selei;
133      StuntDouble* sd;
134 +    int idx;
135  
136 <    for (sd = seleMan_.beginSelected(i); sd != NULL; sd = seleMan_.nextSelected(i)) {
136 >    std::vector<tuple3<RealType, int, StuntDouble* > > endSlice;
137 >    std::vector<tuple3<RealType, int, StuntDouble* > > midSlice;
138 >    
139 >    for (sd = seleMan_.beginSelected(selei); sd != NULL;
140 >         sd = seleMan_.nextSelected(selei)) {
141 >
142 >      idx = sd->getLocalIndex();
143 >
144        Vector3d pos = sd->getPos();
145 <      //wrap the stuntdoubles into a cell      
145 >
146 >      // wrap the stuntdouble's position back into the box:
147 >
148        if (usePeriodicBoundaryConditions_)
149 <        info_->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos);
130 <      int binNo = int(nBins_ * (pos.z()) / hmat(2,2));
131 <      sliceSDLists_[binNo].push_back(sd);
132 <    }
149 >        currentSnap_->wrapVector(pos);
150  
151 <  }  
152 < }
151 >      // which bin is this stuntdouble in?
152 >      // wrapped positions are in the range [-0.5*hmat(2,2), +0.5*hmat(2,2)]
153 >
154 >      int binNo = midBin + int(nBins_ * (pos.z()) / hmat(2,2));
155 >
156 >      std::cerr << "pos.z() = " << pos.z() << " bin = " << binNo << "\n";
157 >
158 >      // if we're in bin 0 or the middleBin
159 >      if (binNo == 0 || binNo == midBin) {
160 >        
161 >        RealType mass = sd->getMass();
162 >        Vector3d vel = sd->getVel();
163 >        RealType value;
164 >
165 >        switch(rnemdType_) {
166 >        case rnemdKinetic :
167 >          
168 >          value = mass * (vel[0]*vel[0] + vel[1]*vel[1] +
169 >                          vel[2]*vel[2]);
170 >          
171 >          if (sd->isDirectional()) {
172 >            Vector3d angMom = sd->getJ();
173 >            Mat3x3d I = sd->getI();
174 >            
175 >            if (sd->isLinear()) {
176 >              int i = sd->linearAxis();
177 >              int j = (i + 1) % 3;
178 >              int k = (i + 2) % 3;
179 >              value += angMom[j] * angMom[j] / I(j, j) +
180 >                angMom[k] * angMom[k] / I(k, k);
181 >            } else {                        
182 >              value += angMom[0]*angMom[0]/I(0, 0)
183 >                + angMom[1]*angMom[1]/I(1, 1)
184 >                + angMom[2]*angMom[2]/I(2, 2);
185 >            }
186 >          }
187 >          value = value * 0.5 / OOPSEConstant::energyConvert;
188 >          break;
189 >        case rnemdPx :
190 >          value = mass * vel[0];
191 >          break;
192 >        case rnemdPy :
193 >          value = mass * vel[1];
194 >          break;
195 >        case rnemdPz :
196 >          value = mass * vel[2];
197 >          break;
198 >        case rnemdUnknown :
199 >        default :
200 >          break;
201 >        }
202 >        
203 >        if (binNo == 0)
204 >          endSlice.push_back( make_tuple3(value, idx, sd));
205 >        
206 >        if (binNo == midBin)
207 >          midSlice.push_back( make_tuple3(value, idx, sd));              
208 >      }
209 >    }
210 >    
211 >    // find smallest value in endSlice:
212 >    std::sort(endSlice.begin(), endSlice.end());    
213 >    RealType min_val = endSlice[0].first;
214 >    int min_idx = endSlice[0].second;
215 >    StuntDouble* min_sd = endSlice[0].third;
216 >    
217 >    std::cerr << "smallest value = " << min_val << " idx = " << min_idx << "\n";
218 >    
219 >    // find largest value in midSlice:
220 >    std::sort(midSlice.rbegin(), midSlice.rend());
221 >    RealType max_val = midSlice[0].first;
222 >    int max_idx = midSlice[0].second;
223 >    StuntDouble* max_sd = midSlice[0].third;
224 >    
225 >    std::cerr << "largest value = " << max_val << " idx = " << max_idx << "\n";
226 >    
227 >  }
228 > }  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines