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 1332 by gezelter, Thu Apr 2 17:25:59 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 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      seleMan_.setSelectionSet(evaluator_.evaluate());
127  
128      std::cerr << "selectionCount = " << seleMan_.getSelectionCount() << "\n\n";
129  
130      int i;
131      StuntDouble* sd;
132 +    int idx = sd->getLocalIndex();
133  
134 <    for (sd = seleMan_.beginSelected(i); sd != NULL; sd = seleMan_.nextSelected(i)) {
134 >    std::vector<tuple3<RealType, int, StuntDouble* > > endSlice;
135 >    std::vector<tuple3<RealType, int, StuntDouble* > > midSlice;
136 >    
137 >    for (sd = seleMan_.beginSelected(i); sd != NULL;
138 >         sd = seleMan_.nextSelected(i)) {
139 >
140        Vector3d pos = sd->getPos();
141 <      //wrap the stuntdoubles into a cell      
141 >
142 >      // wrap the stuntdouble's position back into the box:
143 >
144        if (usePeriodicBoundaryConditions_)
145 <        info_->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos);
145 >        currentSnap_->wrapVector(pos);
146 >
147 >      // which bin is this stuntdouble in?
148 >
149        int binNo = int(nBins_ * (pos.z()) / hmat(2,2));
131      sliceSDLists_[binNo].push_back(sd);
132    }
150  
151 +      // if we're in bin 0 or the middleBin
152 +      if (binNo == 0 || binNo == midBin) {
153 +        
154 +        RealType mass = sd->getMass();
155 +        Vector3d vel = sd->getVel();
156 +        RealType value;
157 +
158 +        switch(rnemdType_) {
159 +        case rnemdKinetic :
160 +          
161 +          value = mass * (vel[0]*vel[0] + vel[1]*vel[1] +
162 +                          vel[2]*vel[2]);
163 +          
164 +          if (sd->isDirectional()) {
165 +            Vector3d angMom = sd->getJ();
166 +            Mat3x3d I = sd->getI();
167 +            
168 +            if (sd->isLinear()) {
169 +              int i = sd->linearAxis();
170 +              int j = (i + 1) % 3;
171 +              int k = (i + 2) % 3;
172 +              value += angMom[j] * angMom[j] / I(j, j) +
173 +                angMom[k] * angMom[k] / I(k, k);
174 +            } else {                        
175 +              value += angMom[0]*angMom[0]/I(0, 0)
176 +                + angMom[1]*angMom[1]/I(1, 1)
177 +                + angMom[2]*angMom[2]/I(2, 2);
178 +            }
179 +          }
180 +          value = value * 0.5 / OOPSEConstant::energyConvert;
181 +          break;
182 +        case rnemdPx :
183 +          value = mass * vel[0];
184 +          break;
185 +        case rnemdPy :
186 +          value = mass * vel[1];
187 +          break;
188 +        case rnemdPz :
189 +          value = mass * vel[2];
190 +          break;
191 +        case rnemdUnknown :
192 +        default :
193 +          break;
194 +        }
195 +        
196 +        if (binNo == 0)
197 +          endSlice.push_back( make_tuple3(value, idx, sd));
198 +        
199 +        if (binNo == midBin)
200 +          midSlice.push_back( make_tuple3(value, idx, sd));              
201 +      }
202 +
203 +      // find smallest value in endSlice:
204 +      std::sort(endSlice.begin(), endSlice.end());    
205 +      RealType min_val = endSlice[0].first;
206 +      int min_idx = endSlice[0].second;
207 +      StuntDouble* min_sd = endSlice[0].third;
208 +
209 +      std::cerr << "smallest value = " << min_val << " idx = " << min_idx << "\n";
210 +
211 +      // find largest value in midSlice:
212 +      std::sort(midSlice.rbegin(), midSlice.rend());
213 +      RealType max_val = midSlice[0].first;
214 +      int max_idx = midSlice[0].second;
215 +      StuntDouble* max_sd = midSlice[0].third;
216 +
217 +      std::cerr << "largest value = " << max_val << " idx = " << max_idx << "\n";
218 +
219 +    }
220    }  
221   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines