69 for (
int ituple=0; ituple<ntuple; ++ituple ) {
87 double cos_phi,cos_psi;
88 double sin_phi,sin_psi;
95 Force f1(0,0,0),f2(0,0,0),f3(0,0,0);
96 Force f4(0,0,0),f5(0,0,0),f6(0,0,0);
133 cos_phi = A*B/(rA*rB);
134 sin_phi = C*B/(rC*rB);
135 cos_psi = D*E/(rD*rE);
136 sin_psi = F*E/(rF*rE);
144 phi= -atan2(sin_phi,cos_phi);
145 psi= -atan2(sin_psi,cos_psi);
147 if (fabs(sin_phi) > 0.1) {
151 dcosdA = rA*(cos_phi*A-B);
152 dcosdB = rB*(cos_phi*B-A);
157 dsindC = rC*(sin_phi*C-B);
158 dsindB = rB*(sin_phi*B-C);
161 if (fabs(sin_psi) > 0.1) {
165 dcosdD = rD*(cos_psi*D-E);
166 dcosdE = rE*(cos_psi*E-D);
171 dsindF = rF*(sin_psi*F-E);
172 dsindE = rE*(sin_psi*E-F);
178 const double h_1 = 1.0 / h;
180 const double six_h = 6.0 * h_1;
186 double xa[2], xb[2], dxa[2], dxb[2];
187 double ya[2], yb[2], dya[2], dyb[2];
188 double t, dx_h, dy_h;
190 double s1, s2, s3, s4, s5;
192 double f = 0, fx = 0, fy = 0;
194 int i, j, ilo, jlo, ij;
197 dx_h = (phi - phi_0) * h_1;
198 dy_h = (psi - psi_0) * h_1;
201 ilo = (int) floor(dx_h);
202 if ( ilo < 0 ) ilo = 0;
204 jlo = (int) floor(dy_h);
205 if ( jlo < 0 ) jlo = 0;
211 t = dx_h - (double) ilo;
212 xa[0] = (1 - t) * (1 - t) * (1 + 2*t);
213 xb[0] = h * t * (1 - t) * (1 - t);
214 dxa[0] = -6 * t * (1 - t) * h_1;
215 dxb[0] = (1 - t) * (1 - 3*t);
217 xa[1] = (1 + t) * (1 + t) * (1 - 2*t);
218 xb[1] = h * t * (1 + t) * (1 + t);
219 dxa[1] = -6 * t * (1 + t) * h_1;
220 dxb[1] = (1 + t) * (1 + 3*t);
223 t = dy_h - (double) jlo;
224 ya[0] = (1 - t) * (1 - t) * (1 + 2*t);
225 yb[0] = h * t * (1 - t) * (1 - t);
226 dya[0] = -6 * t * (1 - t) * h_1;
227 dyb[0] = (1 - t) * (1 - 3*t);
229 ya[1] = (1 + t) * (1 + t) * (1 - 2*t);
230 yb[1] = h * t * (1 + t) * (1 + t);
231 dya[1] = -6 * t * (1 + t) * h_1;
232 dyb[1] = (1 + t) * (1 + 3*t);
237 t = dx_h - (double) ilo;
243 xa[0] = s1*s1*(1+s2);
253 t = dy_h - (double) jlo;
259 ya[0] = s1*s1*(1+s2);
270 for (i = 0; i < 2; i++) {
271 for (j = 0; j < 2; j++) {
272 ij =
INDEX(D,i+ilo,j+jlo);
276 f += xa[i] * ya[j] * table[ij].
d00 277 + xb[i] * ya[j] * table[ij].
d10 278 + xa[i] * yb[j] * table[ij].
d01 279 + xb[i] * yb[j] * table[ij].
d11;
281 fx += dxa[i] * ya[j] * table[ij].
d00 282 + dxb[i] * ya[j] * table[ij].
d10 283 + dxa[i] * yb[j] * table[ij].
d01 284 + dxb[i] * yb[j] * table[ij].
d11;
286 fy += xa[i] * dya[j] * table[ij].
d00 287 + xb[i] * dya[j] * table[ij].
d10 288 + xa[i] * dyb[j] * table[ij].
d01 289 + xb[i] * dyb[j] * table[ij].
d11;
293 s1=ya[j]*table[ij].
d00;
294 s2=yb[j]*table[ij].
d01;
295 s3=ya[j]*table[ij].
d10;
296 s4=yb[j]*table[ij].
d11;
298 f+=xa[i]*(s1+s2)+xb[i]*(s3+s4);
299 fx+=dxa[i]*(s1+s2)+dxb[i]*(s3+s4);
300 fy+=xa[i]*(dya[j]*table[ij].
d00+dyb[j]*table[ij].
d01)
301 +xb[i]*(dya[j]*table[ij].d10+dyb[j]*table[ij].d11);
331 if (fabs(sin_phi) > 0.1)
334 U_phi = U_phi/sin_phi;
336 f1.x += U_phi*(r23.
y*dcosdA.
z - r23.
z*dcosdA.
y);
337 f1.y += U_phi*(r23.
z*dcosdA.
x - r23.
x*dcosdA.
z);
338 f1.z += U_phi*(r23.
x*dcosdA.
y - r23.
y*dcosdA.
x);
340 f3.x += U_phi*(r23.
z*dcosdB.
y - r23.
y*dcosdB.
z);
341 f3.y += U_phi*(r23.
x*dcosdB.
z - r23.
z*dcosdB.
x);
342 f3.z += U_phi*(r23.
y*dcosdB.
x - r23.
x*dcosdB.
y);
344 f2.x += U_phi*(r12.
z*dcosdA.
y - r12.
y*dcosdA.
z 345 + r34.
y*dcosdB.
z - r34.
z*dcosdB.
y);
346 f2.y += U_phi*(r12.
x*dcosdA.
z - r12.
z*dcosdA.
x 347 + r34.
z*dcosdB.
x - r34.
x*dcosdB.
z);
348 f2.z += U_phi*(r12.
y*dcosdA.
x - r12.
x*dcosdA.
y 349 + r34.
x*dcosdB.
y - r34.
y*dcosdB.
x);
355 U_phi = -U_phi/cos_phi;
357 f1.x += U_phi*((r23.
y*r23.
y + r23.
z*r23.
z)*dsindC.
x 358 - r23.
x*r23.
y*dsindC.
y 359 - r23.
x*r23.
z*dsindC.
z);
360 f1.y += U_phi*((r23.
z*r23.
z + r23.
x*r23.
x)*dsindC.
y 361 - r23.
y*r23.
z*dsindC.
z 362 - r23.
y*r23.
x*dsindC.
x);
363 f1.z += U_phi*((r23.
x*r23.
x + r23.
y*r23.
y)*dsindC.
z 364 - r23.
z*r23.
x*dsindC.
x 365 - r23.
z*r23.
y*dsindC.
y);
367 f3 += cross(U_phi,dsindB,r23);
369 f2.x += U_phi*(-(r23.
y*r12.
y + r23.
z*r12.
z)*dsindC.
x 370 +(2.0*r23.
x*r12.
y - r12.
x*r23.
y)*dsindC.
y 371 +(2.0*r23.
x*r12.
z - r12.
x*r23.
z)*dsindC.
z 372 +dsindB.
z*r34.
y - dsindB.
y*r34.
z);
373 f2.y += U_phi*(-(r23.
z*r12.
z + r23.
x*r12.
x)*dsindC.
y 374 +(2.0*r23.
y*r12.
z - r12.
y*r23.
z)*dsindC.
z 375 +(2.0*r23.
y*r12.
x - r12.
y*r23.
x)*dsindC.
x 376 +dsindB.
x*r34.
z - dsindB.
z*r34.
x);
377 f2.z += U_phi*(-(r23.
x*r12.
x + r23.
y*r12.
y)*dsindC.
z 378 +(2.0*r23.
z*r12.
x - r12.
z*r23.
x)*dsindC.
x 379 +(2.0*r23.
z*r12.
y - r12.
z*r23.
y)*dsindC.
y 380 +dsindB.
y*r34.
x - dsindB.
x*r34.
y);
383 if (fabs(sin_psi) > 0.1)
386 U_psi = U_psi/sin_psi;
388 f4.x += U_psi*(r67.
y*dcosdD.
z - r67.
z*dcosdD.
y);
389 f4.y += U_psi*(r67.
z*dcosdD.
x - r67.
x*dcosdD.
z);
390 f4.z += U_psi*(r67.
x*dcosdD.
y - r67.
y*dcosdD.
x);
392 f6.x += U_psi*(r67.
z*dcosdE.
y - r67.
y*dcosdE.
z);
393 f6.y += U_psi*(r67.
x*dcosdE.
z - r67.
z*dcosdE.
x);
394 f6.z += U_psi*(r67.
y*dcosdE.
x - r67.
x*dcosdE.
y);
396 f5.x += U_psi*(r56.
z*dcosdD.
y - r56.
y*dcosdD.
z 397 + r78.
y*dcosdE.
z - r78.
z*dcosdE.
y);
398 f5.y += U_psi*(r56.
x*dcosdD.
z - r56.
z*dcosdD.
x 399 + r78.
z*dcosdE.
x - r78.
x*dcosdE.
z);
400 f5.z += U_psi*(r56.
y*dcosdD.
x - r56.
x*dcosdD.
y 401 + r78.
x*dcosdE.
y - r78.
y*dcosdE.
x);
407 U_psi = -U_psi/cos_psi;
409 f4.x += U_psi*((r67.
y*r67.
y + r67.
z*r67.
z)*dsindF.
x 410 - r67.
x*r67.
y*dsindF.
y 411 - r67.
x*r67.
z*dsindF.
z);
412 f4.y += U_psi*((r67.
z*r67.
z + r67.
x*r67.
x)*dsindF.
y 413 - r67.
y*r67.
z*dsindF.
z 414 - r67.
y*r67.
x*dsindF.
x);
415 f4.z += U_psi*((r67.
x*r67.
x + r67.
y*r67.
y)*dsindF.
z 416 - r67.
z*r67.
x*dsindF.
x 417 - r67.
z*r67.
y*dsindF.
y);
419 f6 += cross(U_psi,dsindE,r67);
421 f5.x += U_psi*(-(r67.
y*r56.
y + r67.
z*r56.
z)*dsindF.
x 422 +(2.0*r67.
x*r56.
y - r56.
x*r67.
y)*dsindF.
y 423 +(2.0*r67.
x*r56.
z - r56.
x*r67.
z)*dsindF.
z 424 +dsindE.
z*r78.
y - dsindE.
y*r78.
z);
425 f5.y += U_psi*(-(r67.
z*r56.
z + r67.
x*r56.
x)*dsindF.
y 426 +(2.0*r67.
y*r56.
z - r56.
y*r67.
z)*dsindF.
z 427 +(2.0*r67.
y*r56.
x - r56.
y*r67.
x)*dsindF.
x 428 +dsindE.
x*r78.
z - dsindE.
z*r78.
x);
429 f5.z += U_psi*(-(r67.
x*r56.
x + r67.
y*r56.
y)*dsindF.
z 430 +(2.0*r67.
z*r56.
x - r56.
z*r67.
x)*dsindF.
x 431 +(2.0*r67.
z*r56.
y - r56.
z*r67.
y)*dsindF.
y 432 +dsindE.
y*r78.
x - dsindE.
x*r78.
y);
438 int typeSum1, typeSum2;
439 typeSum1 = typeSum2 = 0;
440 for (
int i=0; i < 4; ++i ) {
442 mol->get_fep_type(
atomID[i]));
444 mol->get_fep_type(
atomID[i+4]));
447 if ( (0 < typeSum1 && typeSum1 <
order) ||
448 (0 < typeSum2 && typeSum2 <
order) ) {
451 energy *= bond_lambda_1;
458 }
else if ( (0 > typeSum1 && typeSum1 > -
order) ||
459 (0 > typeSum2 && typeSum2 > -
order) ) {
462 energy *= bond_lambda_2;
494 DebugM(3,
"::computeForce() -- ending with delta energy " << energy << std::endl);
496 reduction[virialIndex_XX] += ( f1.x * r12.
x + f2.x * r23.
x + f3.x * r34.
x );
497 reduction[virialIndex_XY] += ( f1.x * r12.
y + f2.x * r23.
y + f3.x * r34.
y );
498 reduction[virialIndex_XZ] += ( f1.x * r12.
z + f2.x * r23.
z + f3.x * r34.
z );
499 reduction[virialIndex_YX] += ( f1.y * r12.
x + f2.y * r23.
x + f3.y * r34.
x );
500 reduction[virialIndex_YY] += ( f1.y * r12.
y + f2.y * r23.
y + f3.y * r34.
y );
501 reduction[virialIndex_YZ] += ( f1.y * r12.
z + f2.y * r23.
z + f3.y * r34.
z );
502 reduction[virialIndex_ZX] += ( f1.z * r12.
x + f2.z * r23.
x + f3.z * r34.
x );
503 reduction[virialIndex_ZY] += ( f1.z * r12.
y + f2.z * r23.
y + f3.z * r34.
y );
504 reduction[virialIndex_ZZ] += ( f1.z * r12.
z + f2.z * r23.
z + f3.z * r34.
z );
506 reduction[virialIndex_XX] += ( f4.x * r56.
x + f5.x * r67.
x + f6.x * r78.
x );
507 reduction[virialIndex_XY] += ( f4.x * r56.
y + f5.x * r67.
y + f6.x * r78.
y );
508 reduction[virialIndex_XZ] += ( f4.x * r56.
z + f5.x * r67.
z + f6.x * r78.
z );
509 reduction[virialIndex_YX] += ( f4.y * r56.
x + f5.y * r67.
x + f6.y * r78.
x );
510 reduction[virialIndex_YY] += ( f4.y * r56.
y + f5.y * r67.
y + f6.y * r78.
y );
511 reduction[virialIndex_YZ] += ( f4.y * r56.
z + f5.y * r67.
z + f6.y * r78.
z );
512 reduction[virialIndex_ZX] += ( f4.z * r56.
x + f5.z * r67.
x + f6.z * r78.
x );
513 reduction[virialIndex_ZY] += ( f4.z * r56.
y + f5.z * r67.
y + f6.z * r78.
y );
514 reduction[virialIndex_ZZ] += ( f4.z * r56.
z + f5.z * r67.
z + f6.z * r78.
z );
516 if (pressureProfileData) {
551 f1.x * r12.
x, f1.y * r12.
y, f1.z * r12.
z,
552 pressureProfileData);
554 f2.x * r23.
x, f2.y * r23.
y, f2.z * r23.
z,
555 pressureProfileData);
557 f3.x * r34.
x, f3.y * r34.
y, f3.z * r34.
z,
558 pressureProfileData);
560 f4.x * r56.
x, f4.y * r56.
y, f4.z * r56.
z,
561 pressureProfileData);
563 f5.x * r67.
x, f5.y * r67.
y, f5.z * r67.
z,
564 pressureProfileData);
566 f6.x * r78.
x, f6.y * r78.
y, f6.z * r78.
z,
567 pressureProfileData);
const CrosstermValue * value
CrosstermData c[dim][dim]
void pp_reduction(int nslabs, int n1, int n2, int atype1, int atype2, int numtypes, BigReal vxx, BigReal vyy, BigReal vzz, BigReal *reduction)
SimParameters * simParameters
#define INDEX(ncols, i, j)
static int pressureProfileSlabs
Molecule stores the structural information for the system.
static int pressureProfileAtomTypes
void pp_clamp(int &n, int nslabs)
NAMD_HOST_DEVICE BigReal length(void) const
static BigReal pressureProfileMin
unsigned char get_fep_type(int anum) const
static BigReal pressureProfileThickness
NAMD_HOST_DEVICE Vector delta(const Position &pos1, const Position &pos2) const