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