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 1333 by gezelter, Thu Apr 2 18:11:59 2009 UTC vs.
Revision 1339 by gezelter, Thu Apr 23 18:31:05 2009 UTC

# Line 62 | 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 77 | Line 77 | namespace oopse {
77  
78      std::cerr << "calling  evaluator with " << rnemdObjectSelection_ << "\n";
79      evaluator_.loadScriptString(rnemdObjectSelection_);
80 <    std::cerr << "done";
80 >    std::cerr << "done\n";
81      
82      const std::string st = simParams->getRNEMD_swapType();
83  
# Line 88 | Line 88 | namespace oopse {
88      set_RNEMD_swapTime(simParams->getRNEMD_swapTime());
89      set_RNEMD_nBins(simParams->getRNEMD_nBins());
90      exchangeSum_ = 0.0;
91 <    
91 >    counter_ = 0; //added by shenyu
92 >    //profile_.open("profile", std::ios::out);
93 >
94   #ifndef IS_MPI
95      if (simParams->haveSeed()) {
96        seedValue = simParams->getSeed();
# Line 108 | Line 110 | namespace oopse {
110    
111    RNEMD::~RNEMD() {
112      delete randNumGen_;
113 +    //profile_.close();
114    }
115  
116    void RNEMD::doSwap() {
117 <    std::cerr << "in RNEMD!\n";  
118 <    std::cerr << "nBins = " << nBins_ << "\n";
117 >    //std::cerr << "in RNEMD!\n";  
118 >    //std::cerr << "nBins = " << nBins_ << "\n";
119      int midBin = nBins_ / 2;
120 <    std::cerr << "midBin = " << midBin << "\n";
121 <    std::cerr << "swapTime = " << swapTime_ << "\n";
122 <    std::cerr << "exchangeSum = " << exchangeSum_ << "\n";
123 <    std::cerr << "swapType = " << rnemdType_ << "\n";
121 <    std::cerr << "selection = " << rnemdObjectSelection_ << "\n";
120 >    //std::cerr << "midBin = " << midBin << "\n";
121 >    //std::cerr << "swapTime = " << swapTime_ << "\n";
122 >    //std::cerr << "swapType = " << rnemdType_ << "\n";
123 >    //std::cerr << "selection = " << rnemdObjectSelection_ << "\n";
124  
125      Snapshot* currentSnap_ = info_->getSnapshotManager()->getCurrentSnapshot();
126      Mat3x3d hmat = currentSnap_->getHmat();
127  
128 <    std::cerr << "hmat = " << hmat << "\n";
128 >    //std::cerr << "hmat = " << hmat << "\n";
129  
130      seleMan_.setSelectionSet(evaluator_.evaluate());
131  
132 <    std::cerr << "selectionCount = " << seleMan_.getSelectionCount() << "\n\n";
132 >    //std::cerr << "selectionCount = " << seleMan_.getSelectionCount() << "\n\n";
133  
134      int selei;
135      StuntDouble* sd;
136      int idx;
137  
138 <    std::vector<tuple3<RealType, int, StuntDouble* > > endSlice;
139 <    std::vector<tuple3<RealType, int, StuntDouble* > > midSlice;
140 <    
138 >    RealType min_val;
139 >    bool min_found = false;  
140 >    StuntDouble* min_sd;
141 >
142 >    RealType max_val;
143 >    bool max_found = false;
144 >    StuntDouble* max_sd;
145 >
146      for (sd = seleMan_.beginSelected(selei); sd != NULL;
147           sd = seleMan_.nextSelected(selei)) {
148  
# Line 143 | Line 150 | namespace oopse {
150  
151        Vector3d pos = sd->getPos();
152  
146      std::cerr << "idx = " << idx << "pos = " << pos << "\n";
153        // wrap the stuntdouble's position back into the box:
154  
155        if (usePeriodicBoundaryConditions_)
156          currentSnap_->wrapVector(pos);
151      std::cerr << "new pos.z = " << pos.z() << "\n";
157  
158        // which bin is this stuntdouble in?
159 +      // wrapped positions are in the range [-0.5*hmat(2,2), +0.5*hmat(2,2)]
160  
161 <      int binNo = int(nBins_ * (pos.z()) / hmat(2,2));
161 >      int binNo = int((nBins_-1) * (pos.z() + 0.5*hmat(2,2)) / hmat(2,2));
162  
163 <      std::cerr << "bin = " << binNo << "\n";
163 >      //std::cerr << "pos.z() = " << pos.z() << " bin = " << binNo << "\n";
164  
165        // if we're in bin 0 or the middleBin
166        if (binNo == 0 || binNo == midBin) {
# Line 201 | Line 207 | namespace oopse {
207            break;
208          }
209          
210 <        if (binNo == 0)
211 <          endSlice.push_back( make_tuple3(value, idx, sd));
212 <        
213 <        if (binNo == midBin)
214 <          midSlice.push_back( make_tuple3(value, idx, sd));              
210 >        if (binNo == 0) {
211 >          if (!min_found) {
212 >            min_val = value;
213 >            min_sd = sd;
214 >            min_found = true;
215 >          } else {
216 >            if (min_val > value) {
217 >              min_val = value;
218 >              min_sd = sd;
219 >            }
220 >          }
221 >        } else {
222 >          if (!max_found) {
223 >            max_val = value;
224 >            max_sd = sd;
225 >            max_found = true;
226 >          } else {
227 >            if (max_val < value) {
228 >              max_val = value;
229 >              max_sd = sd;
230 >            }
231 >          }      
232 >        }
233        }
234 +    }
235 +    //std::cerr << "smallest value = " << min_val  << "\n";
236 +    //std::cerr << "largest value = " << max_val << "\n";
237 +    
238 +    // missing:  swap information in parallel
239  
240 <      // find smallest value in endSlice:
241 <      std::sort(endSlice.begin(), endSlice.end());    
242 <      RealType min_val = endSlice[0].first;
243 <      int min_idx = endSlice[0].second;
244 <      StuntDouble* min_sd = endSlice[0].third;
245 <
246 <      std::cerr << "smallest value = " << min_val << " idx = " << min_idx << "\n";
247 <
248 <      // find largest value in midSlice:
249 <      std::sort(midSlice.rbegin(), midSlice.rend());
250 <      RealType max_val = midSlice[0].first;
251 <      int max_idx = midSlice[0].second;
252 <      StuntDouble* max_sd = midSlice[0].third;
240 >    if (max_found && min_found) {
241 >      if (min_val< max_val) {
242 >        Vector3d min_vel = min_sd->getVel();
243 >        Vector3d max_vel = max_sd->getVel();
244 >        RealType temp_vel;
245 >        switch(rnemdType_) {
246 >        case rnemdKinetic :
247 >          min_sd->setVel(max_vel);
248 >          max_sd->setVel(min_vel);                
249 >          if (min_sd->isDirectional() && max_sd->isDirectional()) {
250 >            Vector3d min_angMom = min_sd->getJ();
251 >            Vector3d max_angMom = max_sd->getJ();
252 >            min_sd->setJ(max_angMom);
253 >            max_sd->setJ(min_angMom);
254 >          }
255 >          break;
256 >        case rnemdPx :
257 >          temp_vel = min_vel.x();
258 >          min_vel.x() = max_vel.x();
259 >          max_vel.x() = temp_vel;
260 >          min_sd->setVel(min_vel);
261 >          max_sd->setVel(max_vel);
262 >          break;
263 >        case rnemdPy :
264 >          temp_vel = min_vel.y();
265 >          min_vel.y() = max_vel.y();
266 >          max_vel.y() = temp_vel;
267 >          min_sd->setVel(min_vel);
268 >          max_sd->setVel(max_vel);
269 >          break;
270 >        case rnemdPz :
271 >          temp_vel = min_vel.z();
272 >          min_vel.z() = max_vel.z();
273 >          max_vel.z() = temp_vel;
274 >          min_sd->setVel(min_vel);
275 >          max_sd->setVel(max_vel);
276 >          break;
277 >        case rnemdUnknown :
278 >        default :
279 >          break;
280 >        }
281 >      exchangeSum_ += max_val - min_val;
282 >      } else {
283 >        std::cerr << "exchange NOT performed.\nmin_val > max_val.\n";
284 >      }
285 >    } else {
286 >      std::cerr << "exchange NOT performed.\none of the two slabs empty.\n";
287 >    }
288 >    std::cerr << "exchangeSum = " << exchangeSum_ << "\n";
289 >  }
290  
291 <      std::cerr << "largest value = " << max_val << " idx = " << max_idx << "\n";
291 >  void RNEMD::getStatus() {
292 >    //std::cerr << "in RNEMD!\n";  
293 >    //std::cerr << "nBins = " << nBins_ << "\n";
294 >    int midBin = nBins_ / 2;
295 >    //std::cerr << "midBin = " << midBin << "\n";
296 >    //std::cerr << "swapTime = " << swapTime_ << "\n";
297 >    //std::cerr << "exchangeSum = " << exchangeSum_ << "\n";
298 >    //std::cerr << "swapType = " << rnemdType_ << "\n";
299 >    //std::cerr << "selection = " << rnemdObjectSelection_ << "\n";
300  
301 +    Snapshot* currentSnap_ = info_->getSnapshotManager()->getCurrentSnapshot();
302 +    Mat3x3d hmat = currentSnap_->getHmat();
303 +
304 +    //std::cerr << "hmat = " << hmat << "\n";
305 +
306 +    seleMan_.setSelectionSet(evaluator_.evaluate());
307 +
308 +    //std::cerr << "selectionCount = " << seleMan_.getSelectionCount() << "\n\n";
309 +
310 +    int selei;
311 +    StuntDouble* sd;
312 +    int idx;
313 +    /*
314 +    RealType min_val;
315 +    bool min_found = false;  
316 +    StuntDouble* min_sd;
317 +
318 +    RealType max_val;
319 +    bool max_found = false;
320 +    StuntDouble* max_sd;
321 +    */
322 +    std::vector<RealType> valueHist;  // keeps track of what's being averaged
323 +    std::vector<int> valueCount; // keeps track of the number of degrees of
324 +                                 // freedom being averaged
325 +    valueHist.resize(nBins_);
326 +    valueCount.resize(nBins_);
327 +    //do they initialize themselves to zero automatically?
328 +    for (sd = seleMan_.beginSelected(selei); sd != NULL;
329 +         sd = seleMan_.nextSelected(selei)) {
330 +      
331 +      idx = sd->getLocalIndex();
332 +      
333 +      Vector3d pos = sd->getPos();
334 +
335 +      // wrap the stuntdouble's position back into the box:
336 +      
337 +      if (usePeriodicBoundaryConditions_)
338 +        currentSnap_->wrapVector(pos);
339 +      
340 +      // which bin is this stuntdouble in?
341 +      // wrapped positions are in the range [-0.5*hmat(2,2), +0.5*hmat(2,2)]
342 +      
343 +      int binNo = int((nBins_-1) * (pos.z()+0.5*hmat(2,2)) / hmat(2,2));
344 +      
345 +      //std::cerr << "pos.z() = " << pos.z() << " bin = " << binNo << "\n";
346 +      
347 +      RealType mass = sd->getMass();
348 +      Vector3d vel = sd->getVel();
349 +      //std::cerr << "mass = " << mass << " vel = " << vel << "\n";
350 +      RealType value;
351 +
352 +      switch(rnemdType_) {
353 +      case rnemdKinetic :
354 +        
355 +        value = mass * (vel[0]*vel[0] + vel[1]*vel[1] +
356 +                        vel[2]*vel[2]);
357 +        
358 +        valueCount[binNo] += 3;
359 +
360 +        if (sd->isDirectional()) {
361 +          Vector3d angMom = sd->getJ();
362 +          Mat3x3d I = sd->getI();
363 +          
364 +          if (sd->isLinear()) {
365 +            int i = sd->linearAxis();
366 +            int j = (i + 1) % 3;
367 +            int k = (i + 2) % 3;
368 +            value += angMom[j] * angMom[j] / I(j, j) +
369 +              angMom[k] * angMom[k] / I(k, k);
370 +
371 +            valueCount[binNo] +=2;
372 +
373 +          } else {                        
374 +            value += angMom[0]*angMom[0]/I(0, 0)
375 +              + angMom[1]*angMom[1]/I(1, 1)
376 +              + angMom[2]*angMom[2]/I(2, 2);
377 +            valueCount[binNo] +=3;
378 +
379 +          }
380 +        }
381 +        //std::cerr <<"this value = " << value << "\n";
382 +        value *= 0.5 / OOPSEConstant::energyConvert;  // get it in kcal / mol
383 +        value *= 2.0 / OOPSEConstant::kb;             // convert to temperature
384 +        //std::cerr <<"this value = " << value << "\n";
385 +        break;
386 +      case rnemdPx :
387 +        value = mass * vel[0];
388 +        valueCount[binNo]++;
389 +        break;
390 +      case rnemdPy :
391 +        value = mass * vel[1];
392 +        valueCount[binNo]++;
393 +        break;
394 +      case rnemdPz :
395 +        value = mass * vel[2];
396 +        valueCount[binNo]++;
397 +        break;
398 +      case rnemdUnknown :
399 +      default :
400 +        break;
401 +      }
402 +      //std::cerr << "bin = " << binNo << " value = " << value ;
403 +      valueHist[binNo] += value;
404 +      //std::cerr << " hist = " << valueHist[binNo] << " count = " << valueCount[binNo] << "\n";
405      }
406 <  }  
406 >    
407 >    std::cout << counter_++;
408 >    for (int j = 0; j < nBins_; j++)
409 >      std::cout << "\t" << valueHist[j] / (RealType)valueCount[j];
410 >    std::cout << "\n";
411 >  }
412   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines