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

Comparing branches/development/src/nonbonded/Morse.cpp (file contents):
Revision 1502 by gezelter, Sat Oct 2 19:53:32 2010 UTC vs.
Revision 1582 by gezelter, Tue Jun 14 20:41:44 2011 UTC

# Line 142 | Line 142 | namespace OpenMD {
142      }    
143    }
144    
145 <  void Morse::calcForce(InteractionData idat) {
145 >  void Morse::calcForce(InteractionData &idat) {
146  
147      if (!initialized_) initialize();
148      
149 <    RealType myPot = 0.0;
150 <    RealType myPotC = 0.0;
151 <    RealType myDeriv = 0.0;
152 <    RealType myDerivC = 0.0;
153 <
154 <    pair<AtomType*, AtomType*> key = make_pair(idat.atype1, idat.atype2);
155 <    MorseInteractionData mixer = MixingMap[key];
156 <
157 <    RealType De = mixer.De;
158 <    RealType Re = mixer.Re;
159 <    RealType beta = mixer.beta;
160 <    MorseInteractionType interactionType = mixer.interactionType;
161 <  
162 <    // V(r) = D_e exp(-a(r-re)(exp(-a(r-re))-2)
163 <    
164 <    RealType expt     = -beta*(idat.rij - Re);
165 <    RealType expfnc   = exp(expt);
166 <    RealType expfnc2  = expfnc*expfnc;
167 <
168 <    RealType exptC = 0.0;
169 <    RealType expfncC = 0.0;
170 <    RealType expfnc2C = 0.0;
171 <
172 <    if (Morse::shiftedPot_ || Morse::shiftedFrc_) {
173 <      exptC     = -beta*(idat.rcut - Re);
174 <      expfncC   = exp(exptC);
175 <      expfnc2C  = expfncC*expfncC;
176 <    }
177 <
178 <
179 <    switch(interactionType) {
180 <    case shiftedMorse : {
181 <
182 <      myPot  = De * (expfnc2  - 2.0 * expfnc);
183 <      myDeriv   = 2.0 * De * beta * (expfnc - expfnc2);
184 <
185 <      if (Morse::shiftedPot_) {
186 <        myPotC = De * (expfnc2C - 2.0 * expfncC);
187 <        myDerivC = 0.0;
188 <      } else if (Morse::shiftedFrc_) {
189 <        myPotC = De * (expfnc2C - 2.0 * expfncC);
190 <        myDerivC  = 2.0 * De * beta * (expfnc2C - expfnc2C);
191 <        myPotC += myDerivC * (idat.rij - idat.rcut);
192 <      } else {
193 <        myPotC = 0.0;
194 <        myDerivC = 0.0;
149 >    map<pair<AtomType*, AtomType*>, MorseInteractionData>::iterator it;
150 >    it = MixingMap.find( idat.atypes );
151 >    if (it != MixingMap.end()) {
152 >      MorseInteractionData mixer = (*it).second;
153 >      
154 >      RealType myPot = 0.0;
155 >      RealType myPotC = 0.0;
156 >      RealType myDeriv = 0.0;
157 >      RealType myDerivC = 0.0;
158 >      
159 >      RealType De = mixer.De;
160 >      RealType Re = mixer.Re;
161 >      RealType beta = mixer.beta;
162 >      MorseInteractionType interactionType = mixer.interactionType;
163 >      
164 >      // V(r) = D_e exp(-a(r-re)(exp(-a(r-re))-2)
165 >      
166 >      RealType expt     = -beta*( *(idat.rij) - Re);
167 >      RealType expfnc   = exp(expt);
168 >      RealType expfnc2  = expfnc*expfnc;
169 >      
170 >      RealType exptC = 0.0;
171 >      RealType expfncC = 0.0;
172 >      RealType expfnc2C = 0.0;
173 >      
174 >      if (Morse::shiftedPot_ || Morse::shiftedFrc_) {
175 >        exptC     = -beta*( *(idat.rcut) - Re);
176 >        expfncC   = exp(exptC);
177 >        expfnc2C  = expfncC*expfncC;
178        }
179 <
180 <      break;
181 <    }
182 <    case repulsiveMorse : {
183 <
184 <      myPot  = De * expfnc2;
185 <      myDeriv  = -2.0 * De * beta * expfnc2;
186 <
187 <      if (Morse::shiftedPot_) {
188 <        myPotC = De * expfnc2C;
189 <        myDerivC = 0.0;
190 <      } else if (Morse::shiftedFrc_) {
191 <        myPotC = De * expfnc2C;
192 <        myDerivC = -2.0 * De * beta * expfnc2C;
193 <        myPotC += myDerivC * (idat.rij - idat.rcut);
194 <      } else {
195 <        myPotC = 0.0;
196 <        myDerivC = 0.0;
179 >      
180 >      
181 >      switch(interactionType) {
182 >      case shiftedMorse : {
183 >        
184 >        myPot  = De * (expfnc2  - 2.0 * expfnc);
185 >        myDeriv   = 2.0 * De * beta * (expfnc - expfnc2);
186 >        
187 >        if (Morse::shiftedPot_) {
188 >          myPotC = De * (expfnc2C - 2.0 * expfncC);
189 >          myDerivC = 0.0;
190 >        } else if (Morse::shiftedFrc_) {
191 >          myPotC = De * (expfnc2C - 2.0 * expfncC);
192 >          myDerivC  = 2.0 * De * beta * (expfnc2C - expfnc2C);
193 >          myPotC += myDerivC * ( *(idat.rij) - *(idat.rcut) );
194 >        } else {
195 >          myPotC = 0.0;
196 >          myDerivC = 0.0;
197 >        }
198 >        
199 >        break;
200        }
201 <
202 <      break;
201 >      case repulsiveMorse : {
202 >        
203 >        myPot  = De * expfnc2;
204 >        myDeriv  = -2.0 * De * beta * expfnc2;
205 >        
206 >        if (Morse::shiftedPot_) {
207 >          myPotC = De * expfnc2C;
208 >          myDerivC = 0.0;
209 >        } else if (Morse::shiftedFrc_) {
210 >          myPotC = De * expfnc2C;
211 >          myDerivC = -2.0 * De * beta * expfnc2C;
212 >          myPotC += myDerivC * ( *(idat.rij) - *(idat.rcut));
213 >        } else {
214 >          myPotC = 0.0;
215 >          myDerivC = 0.0;
216 >        }
217 >        
218 >        break;
219 >      }
220 >      }
221 >      
222 >      RealType pot_temp = *(idat.vdwMult) * (myPot - myPotC);
223 >      *(idat.vpair) += pot_temp;
224 >      
225 >      RealType dudr = *(idat.sw) * *(idat.vdwMult) * (myDeriv - myDerivC);
226 >      
227 >      (*(idat.pot))[VANDERWAALS_FAMILY] += *(idat.sw) * pot_temp;
228 >      *(idat.f1) = *(idat.d) * dudr / *(idat.rij);
229      }
218    }
219
220    RealType pot_temp = idat.vdwMult * (myPot - myPotC);
221    idat.vpair += pot_temp;
222
223    RealType dudr = idat.sw * idat.vdwMult * (myDeriv - myDerivC);
224    
225    idat.pot += idat.sw * pot_temp;
226    idat.f1 = idat.d * dudr / idat.rij;
227
230      return;
231 <
231 >    
232    }
233      
234 +  RealType Morse::getSuggestedCutoffRadius(pair<AtomType*, AtomType*> atypes) {
235 +    if (!initialized_) initialize();  
236 +    map<pair<AtomType*, AtomType*>, MorseInteractionData>::iterator it;
237 +    it = MixingMap.find(atypes);
238 +    if (it == MixingMap.end())
239 +      return 0.0;
240 +    else  {
241 +      MorseInteractionData mixer = (*it).second;
242 +
243 +      RealType Re = mixer.Re;
244 +      RealType beta = mixer.beta;
245 +      // This value of the r corresponds to an energy about 1.48% of
246 +      // the energy at the bottom of the Morse well.  For comparison, the
247 +      // Lennard-Jones function is about 1.63% of it's minimum value at
248 +      // a distance of 2.5 sigma.
249 +      return (4.9 + beta * Re) / beta;
250 +    }
251 +  }
252   }
253  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines