160 if (!initialized_) initialize();
163 MixingMap[Stids[idat.
atid1]][Stids[idat.
atid2]];
165 RealType w0 = mixer.w0;
166 RealType v0 = mixer.v0;
167 RealType v0p = mixer.v0p;
168 RealType rl = mixer.rl;
169 RealType ru = mixer.ru;
170 RealType rlp = mixer.rlp;
171 RealType rup = mixer.rup;
172 RealType rbig = mixer.rbig;
173 bool isPower = mixer.isPower;
175 if (idat.
rij <= rbig) {
176 RealType r3 = idat.
r2 * idat.
rij;
177 RealType r5 = r3 * idat.
r2;
179 RotMat3x3d A1trans = idat.
A1.transpose();
180 RotMat3x3d A2trans = idat.
A2.transpose();
185 Vector3d ri = idat.
A1 * idat.
d;
189 Vector3d rj = -idat.
A2 * idat.
d;
191 RealType xi = ri.
x();
192 RealType yi = ri.
y();
193 RealType zi = ri.
z();
195 RealType xj = rj.
x();
196 RealType yj = rj.
y();
197 RealType zj = rj.
z();
199 RealType xi2 = xi * xi;
200 RealType yi2 = yi * yi;
201 RealType zi2 = zi * zi;
203 RealType xj2 = xj * xj;
204 RealType yj2 = yj * yj;
205 RealType zj2 = zj * zj;
212 RealType dspdr = 0.0;
220 mixer.s->getValueAndDerivativeAt(idat.
rij, s, dsdr);
224 if (idat.
rij < rup) {
225 if (idat.
rij < rlp) {
230 mixer.sp->getValueAndDerivativeAt(idat.
rij, sp, dspdr);
234 RealType wi = 2.0 * (xi2 - yi2) * zi / r3;
235 RealType wj = 2.0 * (xj2 - yj2) * zj / r3;
236 RealType w = wi + wj;
238 RealType zif = zi / idat.
rij - 0.6;
239 RealType zis = zi / idat.
rij + 0.8;
241 RealType zjf = zj / idat.
rij - 0.6;
242 RealType zjs = zj / idat.
rij + 0.8;
244 RealType wip = zif * zif * zis * zis - w0;
245 RealType wjp = zjf * zjf * zjs * zjs - w0;
246 RealType wp = wip + wjp;
248 Vector3d dwi(4.0 * xi * zi / r3 - 6.0 * xi * zi * (xi2 - yi2) / r5,
249 -4.0 * yi * zi / r3 - 6.0 * yi * zi * (xi2 - yi2) / r5,
250 2.0 * (xi2 - yi2) / r3 - 6.0 * zi2 * (xi2 - yi2) / r5);
252 Vector3d dwj(4.0 * xj * zj / r3 - 6.0 * xj * zj * (xj2 - yj2) / r5,
253 -4.0 * yj * zj / r3 - 6.0 * yj * zj * (xj2 - yj2) / r5,
254 2.0 * (xj2 - yj2) / r3 - 6.0 * zj2 * (xj2 - yj2) / r5);
256 RealType uglyi = zif * zif * zis + zif * zis * zis;
257 RealType uglyj = zjf * zjf * zjs + zjf * zjs * zjs;
259 Vector3d dwip(-2.0 * xi * zi * uglyi / r3, -2.0 * yi * zi * uglyi / r3,
260 2.0 * (1.0 / idat.
rij - zi2 / r3) * uglyi);
262 Vector3d dwjp(-2.0 * xj * zj * uglyj / r3, -2.0 * yj * zj * uglyj / r3,
263 2.0 * (1.0 / idat.
rij - zj2 / r3) * uglyj);
265 Vector3d dwidu(4.0 * (yi * zi2 + 0.5 * yi * (xi2 - yi2)) / r3,
266 4.0 * (xi * zi2 - 0.5 * xi * (xi2 - yi2)) / r3,
267 -8.0 * xi * yi * zi / r3);
269 Vector3d dwjdu(4.0 * (yj * zj2 + 0.5 * yj * (xj2 - yj2)) / r3,
270 4.0 * (xj * zj2 - 0.5 * xj * (xj2 - yj2)) / r3,
271 -8.0 * xj * yj * zj / r3);
273 Vector3d dwipdu(2.0 * yi * uglyi / idat.
rij, -2.0 * xi * uglyi / idat.
rij,
276 Vector3d dwjpdu(2.0 * yj * uglyj / idat.
rij, -2.0 * xj * uglyj / idat.
rij,
280 cerr <<
"This is probably an error!\n";
281 RealType frac1 = 0.25;
282 RealType frac2 = 0.75;
283 RealType wi2 = wi * wi;
284 RealType wj2 = wj * wj;
286 w = frac1 * wi * wi2 + frac2 * wi + frac1 * wj * wj2 + frac2 * wj + v0p;
288 dwi = frac1 * RealType(3.0) * wi2 * dwi + frac2 * dwi;
289 dwj = frac1 * RealType(3.0) * wj2 * dwi + frac2 * dwi;
292 dwidu = frac1 * RealType(3.0) * wi2 * dwidu + frac2 * dwidu;
293 dwidu = frac1 * RealType(3.0) * wj2 * dwjdu + frac2 * dwjdu;
300 idat.
vpair += 0.5 * (v0 * s * w + v0p * sp * wp);
302 0.5 * (v0 * s * w + v0p * sp * wp) * idat.
sw;
305 0.5 * (v0 * s * w + v0p * sp * wp) * idat.
sw;
310 Vector3d ti = 0.5 * idat.
sw * (v0 * s * dwidu + v0p * sp * dwipdu);
311 Vector3d tj = 0.5 * idat.
sw * (v0 * s * dwjdu + v0p * sp * dwjpdu);
315 idat.
t1 += A1trans * ti;
316 idat.
t2 += A2trans * tj;
322 Vector3d radcomi = (v0 * s * dwi + v0p * sp * dwip) * idat.
sw;
323 Vector3d radcomj = (v0 * s * dwj + v0p * sp * dwjp) * idat.
sw;
325 Vector3d fii = A1trans * radcomi;
326 Vector3d fjj = A2trans * radcomj;
330 idat.
f1 += 0.5 * ((v0 * dsdr * w + v0p * dspdr * wp) * idat.
d / idat.
rij +