NAMD
ComputeNonbondedBase2.h
Go to the documentation of this file.
1 
7 EXCLUDED( FAST( foo bar ) )
8 EXCLUDED( MODIFIED( foo bar ) )
9 EXCLUDED( NORMAL( foo bar ) )
10 NORMAL( MODIFIED( foo bar ) )
11 ALCHPAIR( NOT_ALCHPAIR( foo bar ) )
12 
13 ALCHPAIR(
14  // get alchemical nonbonded scaling parameters (once per pairlist)
15  myLambda = ALCH1(lambdaUp) ALCH2(lambdaDown) ALCH3(lambdaUp) ALCH4(lambdaDown);
16  FEP(myLambda2 = ALCH1(lambda2Up) ALCH2(lambda2Down) ALCH3(lambda2Up) ALCH4(lambda2Down);)
17  myElecLambda = ALCH1(elecLambdaUp) ALCH2(elecLambdaDown) ALCH3(elecLambdaUp) ALCH4(elecLambdaDown);
18  FEP(myElecLambda2 = ALCH1(elecLambda2Up) ALCH2(elecLambda2Down) ALCH3(elecLambda2Up) ALCH4(elecLambda2Down);)
19  myVdwLambda = ALCH1(vdwLambdaUp) ALCH2(vdwLambdaDown) ALCH3(vdwLambdaUp) ALCH4(vdwLambdaDown);
20  FEP(myVdwLambda2 = ALCH1(vdwLambda2Up) ALCH2(vdwLambda2Down) ALCH3(vdwLambda2Up) ALCH4(vdwLambda2Down);)
21  ALCH1(myRepLambda = repLambdaUp) ALCH2(myRepLambda = repLambdaDown);
22  FEP(ALCH1(myRepLambda2 = repLambda2Up) ALCH2(myRepLambda2 = repLambda2Down);)
23  ALCH1(myVdwShift = vdwShiftUp) ALCH2(myVdwShift = vdwShiftDown);
24  FEP(ALCH1(myVdwShift2 = vdwShift2Up) ALCH2(myVdwShift2 = vdwShift2Down);)
25 )
26 
27 #ifdef ARCH_POWERPC
28  __alignx(64, table_four);
29  __alignx(32, p_1);
30 #pragma unroll(1)
31 #pragma ibm independent_loop
32 #endif
33 
34 #ifndef ARCH_POWERPC
35 #ifndef __INTEL_LLVM_COMPILER
36 #pragma ivdep
37 #endif
38 #endif
39 
40 
41 
42 #if ( FULL( EXCLUDED( SHORT( 1+ ) ) ) 0 )
43 // avoid bug in Intel 15.0 compiler
44 #pragma novector
45 #else
46 #ifdef PRAGMA_SIMD
47 #ifndef TABENERGYFLAG
48 #ifndef GOFORCES
49 #pragma omp simd SHORT(FAST(reduction(+:f_i_x,f_i_y,f_i_z)) ENERGY(FAST(reduction(+:vdwEnergy) SHORT(reduction(+:electEnergy))))) \
50  FULL(reduction(+:fullf_i_x,fullf_i_y,fullf_i_z) ENERGY(reduction(+:fullElectEnergy)))
51 #endif
52 #endif
53 #pragma loop_count avg=100
54 #else // PRAGMA_SIMD
55 #pragma loop_count avg=4
56 #endif // PRAGMA_SIMD
57 #endif
58  for (k=0; k<npairi; ++k) {
59  TABENERGY(
60  const int numtypes = simParams->tableNumTypes;
61  const float table_spacing = simParams->tableSpacing;
62  const int npertype = (int) (namdnearbyint(simParams->tableMaxDist / simParams->tableSpacing) + 1);
63  )
64 
65  int table_i = (r2iilist[2*k] >> 14) + r2_delta_expc; // table_i >= 0
66  const int j = pairlisti[k];
67  //register const CompAtom *p_j = p_1 + j;
68 #define p_j (p_1+j)
69  // const CompAtomExt *pExt_j = pExt_1 + j;
70 #define pExt_j_m (pExt_1+j)
71 
72  BigReal diffa = r2list[k] - r2_table[table_i];
73  //const BigReal* const table_four_i = table_four + 16*table_i;
74 #define table_four_i (table_four + 16*table_i)
75 
76 #if ( FAST( 1 + ) TABENERGY( 1 + ) 0 ) // FAST or TABENERGY
77  //const LJTable::TableEntry * lj_pars =
78  // lj_row + 2 * p_j->vdwType MODIFIED(+ 1);
79  // DJH next line we select either A,B or A14,B14 based on MODIFIED
80  const int lj_index = 2 * p_j->vdwType MODIFIED(+ 1);
81 #define lj_pars (lj_row+lj_index)
82 #endif
83 
84  TABENERGY(
85  register const int tabtype = -1 - ( lj_pars->A < 0 ? lj_pars->A : 0 );
86  )
87 
88 #if ( SHORT( FAST( 1+ ) ) 0 )
89  //Force *f_j = f_1 + j;
90 #define f_j (f_1+j)
91 #endif
92 
93 #if ( FULL( 1+ ) 0 )
94  //Force *fullf_j = fullf_1 + j;
95 #define fullf_j (fullf_1+j)
96 #endif
97 
98  //Power PC aliasing and alignment constraints
99 #ifdef ARCH_POWERPC
100 #if ( FULL( 1+ ) 0 )
101 #pragma disjoint (*table_four, *fullf_1)
102 #pragma disjoint (*p_1, *fullf_1)
103 #pragma disjoint (*r2_table, *fullf_1)
104 #pragma disjoint (*r2list, *fullf_1)
105 #if ( SHORT( FAST( 1+ ) ) 0 )
106 #pragma disjoint (*f_1 , *fullf_1)
107 #pragma disjoint (*fullf_1, *f_1)
108 #endif //Short + fast
109 #endif //Full
110 
111 #if ( SHORT( FAST( 1+ ) ) 0 )
112 #pragma disjoint (*table_four, *f_1)
113 #pragma disjoint (*p_1, *f_1)
114 #pragma disjoint (*r2_table, *f_1)
115 #pragma disjoint (*r2list, *f_1)
116 #pragma disjoint (*lj_row, *f_1)
117 #endif //Short + Fast
118 
119  __alignx(64, table_four_i);
120  FAST (
121  __alignx(32, lj_pars);
122  )
123  __alignx(32, p_j);
124 #endif //ARCH_POWERPC
125 
126  /*
127  BigReal modf = 0.0;
128  int atom2 = p_j->id;
129  register char excl_flag = ( (atom2 >= excl_min && atom2 <= excl_max) ?
130  excl_flags[atom2-excl_min] : 0 );
131  if ( excl_flag ) { ++exclChecksum; }
132  SELF( if ( j < j_hgroup ) { excl_flag = EXCHCK_FULL; } )
133  if ( excl_flag ) {
134  if ( excl_flag == EXCHCK_FULL ) {
135  lj_pars = lj_null_pars;
136  modf = 1.0;
137  } else {
138  ++lj_pars;
139  modf = modf_mod;
140  }
141  }
142  */
143 
144  BigReal kqq = kq_i * p_j->charge;
145  DISP( FULL( const BigReal c6 = scaling * kd_i * pExt_j_m->dispcoef; ) )
146 
147  LES( BigReal lambda_pair = lambda_table_i[p_j->partition]; )
148 
149  register const BigReal p_ij_x = p_i_x - p_j->position.x;
150  register const BigReal p_ij_y = p_i_y - p_j->position.y;
151  register const BigReal p_ij_z = p_i_z - p_j->position.z;
152 
153  DISP(
154  // these definitions are loop dependent
155  const BigReal r2 = p_ij_x*p_ij_x + p_ij_y*p_ij_y + p_ij_z*p_ij_z;
156  if (r2 >= rcut2) continue;
157  const BigReal r2inv = 1/r2;
158  const BigReal r6inv = r2inv * r2inv * r2inv;
159  const BigReal r12inv = r6inv * r6inv;
160  FULL(
161  const BigReal aR2 = r2 * alphaLJ * alphaLJ;
162  const BigReal aR4 = aR2 * aR2;
163  const BigReal screen_dr = (1 - (1 + aR2 + aR4/2 + aR4*aR2/6)*exp(-aR2));
164  ENERGY(
165  const BigReal screen_r = (1 - (1 + aR2 + aR4/2)*exp(-aR2));
166  )
167  )
168  )
169 
170 #if ( FAST(1+) 0 )
171  const BigReal A = scaling * lj_pars->A;
172  const BigReal B = scaling * lj_pars->B;
173  NODISP(
174  BigReal vdw_d = A * table_four_i[0] - B * table_four_i[4];
175  BigReal vdw_c = A * table_four_i[1] - B * table_four_i[5];
176  BigReal vdw_b = A * table_four_i[2] - B * table_four_i[6];
177  BigReal vdw_a = A * table_four_i[3] - B * table_four_i[7];
178  ) // NODISP
179 
180  ALCHPAIR (
181  // Alchemical free energy calculation
182  // Pairlist 1 and 2 are for softcore atoms, while 3 and 4 are single topology atoms.
183  // Pairlists are separated so that lambda-coupled pairs are handled
184  // independently from normal nonbonded (inside ALCHPAIR macro).
185  // The separation-shifted van der Waals potential and a shifted
186  // electrostatics potential for decoupling are calculated explicitly.
187  // Would be faster with lookup tables but because only a small minority
188  // of nonbonded pairs are lambda-coupled the impact is minimal.
189  // Explicit calculation also makes things easier to modify.
190  // These are now inline functions (in ComputeNonbondedFep.C) to
191  // tidy the code
192 
193  const BigReal r2 = r2list[k] - r2_delta;
194 
195  // These are now inline functions (in ComputeNonbondedFep.C) to
196  // tidy the code
197 
198  FEP(
199  ALCH1 ( // Don't merge/recombine the ALCH 1, 2, 3 ,4. Their functions might be modified for future algorithm changes.
200  fep_vdw_forceandenergies(A, B, r2, myVdwShift, myVdwShift2,
201  switchdist2, cutoff2, switchfactor, vdwForceSwitching, myVdwLambda,
202  myVdwLambda2, alchWCAOn, myRepLambda, myRepLambda2, &alch_vdw_energy,
203  &alch_vdw_force, &alch_vdw_energy_2);)
204  ALCH2 (
205  fep_vdw_forceandenergies(A, B, r2, myVdwShift, myVdwShift2,
206  switchdist2, cutoff2, switchfactor, vdwForceSwitching, myVdwLambda,
207  myVdwLambda2, alchWCAOn, myRepLambda, myRepLambda2, &alch_vdw_energy,
208  &alch_vdw_force, &alch_vdw_energy_2);)
209  ALCH3 ( // In single topology region ALCH3 & 4, all atoms are paired so softcore potential is unnecessary.
210  ENERGY(alch_vdw_energy = -myVdwLambda * (( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a);)
211  alch_vdw_energy_2 = -myVdwLambda2 * (( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a);
212  alch_vdw_force = myVdwLambda * ((diffa * vdw_d + vdw_c) * diffa + vdw_b);)
213  ALCH4 (
214  ENERGY(alch_vdw_energy = -myVdwLambda * (( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a);)
215  alch_vdw_energy_2 = -myVdwLambda2 * (( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a);
216  alch_vdw_force = myVdwLambda * ((diffa * vdw_d + vdw_c) * diffa + vdw_b);)
217  )
218  TI(ti_vdw_force_energy_dUdl(A, B, r2, myVdwShift, switchdist2, cutoff2,
219  switchfactor, vdwForceSwitching, myVdwLambda, alchVdwShiftCoeff,
220  alchWCAOn, myRepLambda, &alch_vdw_energy, &alch_vdw_force,
221  &alch_vdw_dUdl);)
222  )
223 
224  //NOT_ALCHPAIR(
225  //TABENERGY(
226 #if (NOT_ALCHPAIR(1+) 0)
227 #if (TABENERGY(1+) 0)
228  if (tabtype >= 0) {
229  register BigReal r1;
230  r1 = sqrt(p_ij_x*p_ij_x + p_ij_y*p_ij_y + p_ij_z*p_ij_z);
231 
232  //CkPrintf("%i %i %f %f %i\n", npertype, tabtype, r1, table_spacing, (int) (namdnearbyint(r1 / table_spacing)));
233  register int eneraddress;
234  eneraddress = 2 * ((npertype * tabtype) + ((int) namdnearbyint(r1 / table_spacing)));
235  //CkPrintf("Using distance bin %i for distance %f\n", eneraddress, r1);
236  vdw_d = 0.;
237  vdw_c = 0.;
238  vdw_b = table_ener[eneraddress + 1] / r1;
239  vdw_a = (-1/2.) * diffa * vdw_b;
240  ENERGY(
241  register BigReal vdw_val = table_ener[eneraddress];
242  //CkPrintf("Found vdw energy of %f\n", vdw_val);
243  vdwEnergy += LAM(lambda_pair *) vdw_val;
244  FEP( vdwEnergy_s += d_lambda_pair * vdw_val; )
245  )
246  } else {
247  //)
248 #endif
249  ENERGY(
250  register BigReal vdw_val = 0;
251  NODISP(
252  vdw_val -=
253  ( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a;
254  )
255  DISP(
256  vdw_val += A * r12inv - B * r6inv;
257  {
258  // continuous potential at the cutoff by subtracting a constant
259  const BigReal potentialShift = (A*rcut12inv - B*rcut6inv);
260  vdw_val -= potentialShift;
261  }
262  )
263 
264  vdwEnergy += LAM(lambda_pair *) vdw_val;
265 
266  FEP(vdwEnergy_s += vdw_val;)
267  )
268  //TABENERGY( } ) /* endif (tabtype >= 0) */
269 #if (TABENERGY (1+) 0)
270  }
271 #endif
272  //) // NOT_ALCHPAIR
273 #endif
274 
275  ALCHPAIR(
276  ENERGY(vdwEnergy += alch_vdw_energy;)
277  FEP(vdwEnergy_s += alch_vdw_energy_2;)
278  TI(ALCH1(vdwEnergy_ti_1 += alch_vdw_dUdl;) ALCH2(vdwEnergy_ti_2 += alch_vdw_dUdl;))
279  ) // ALCHPAIR
280 
281 #endif // FAST
282 
283 #if ( FAST(1+) 0 )
284  INT(
285  register BigReal vdw_dir;
286  vdw_dir = ( diffa * vdw_d + vdw_c ) * diffa + vdw_b;
287  //BigReal force_r = LAM(lambda_pair *) vdw_dir;
288  reduction[pairVDWForceIndex_X] += force_sign * vdw_dir * p_ij_x;
289  reduction[pairVDWForceIndex_Y] += force_sign * vdw_dir * p_ij_y;
290  reduction[pairVDWForceIndex_Z] += force_sign * vdw_dir * p_ij_z;
291  )
292 
293 #if ( SHORT(1+) 0 ) // Short-range electrostatics
294 
295  NORMAL(
296  BigReal fast_d = kqq * table_four_i[8];
297  BigReal fast_c = kqq * table_four_i[9];
298  BigReal fast_b = kqq * table_four_i[10];
299  BigReal fast_a = kqq * table_four_i[11];
300  )
301  MODIFIED(
302  BigReal modfckqq = (1.0-modf_mod) * kqq;
303  BigReal fast_d = modfckqq * table_four_i[8];
304  BigReal fast_c = modfckqq * table_four_i[9];
305  BigReal fast_b = modfckqq * table_four_i[10];
306  BigReal fast_a = modfckqq * table_four_i[11];
307  )
308 
309  {
310  ENERGY(
311  register BigReal fast_val =
312  ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;
313  NOT_ALCHPAIR (
314  electEnergy -= LAM(lambda_pair *) fast_val;
315  FEP(electEnergy_s -= fast_val;)
316  )
317  ) //ENERGY
318  ALCHPAIR(
319  ENERGY(electEnergy -= myElecLambda * fast_val;)
320  FEP(electEnergy_s -= myElecLambda2 * fast_val;)
321  TI(
322  NOENERGY(register BigReal fast_val =
323  ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;)
324  ALCH1(electEnergy_ti_1 -= fast_val;) ALCH2(electEnergy_ti_2 -= fast_val;)
325  )
326  )
327 
328  INT(
329  register BigReal fast_dir =
330  ( diffa * fast_d + fast_c ) * diffa + fast_b;
331  // force_r -= -1.0 * LAM(lambda_pair *) fast_dir;
332  reduction[pairElectForceIndex_X] += force_sign * fast_dir * p_ij_x;
333  reduction[pairElectForceIndex_Y] += force_sign * fast_dir * p_ij_y;
334  reduction[pairElectForceIndex_Z] += force_sign * fast_dir * p_ij_z;
335  )
336  }
337 
338 
339  /***** JE - Go *****/
340  // Now Go energy should appear in VDW place -- put vdw_b back into place
341 #if ( NORMAL (1+) 0)
342 #if ( GO (1+) 0)
343 
344 
345 // JLai
346 #ifndef CODE_REDUNDANT
347 #define CODE_REDUNDANT 0
348 #endif
349 #if CODE_REDUNDANT
351  // Explicit goGroPair calculation; only calculates goGroPair if goGroPair is turned on
352  //
353  // get_gro_force has an internal checklist that sees if atom_i and atom_j are
354  // in the explicit pairlist. This is done because there is no guarantee that a
355  // processor will have atom_i and atom_j so we cannot loop over the explict atom pairs.
356  // We can only loop over all pairs.
357  //
358  // NOTE: It does not look like fast_b is not normalized by the r vector.
359  //
360  // JLai
361  BigReal groLJe = 0.0;
362  BigReal groGausse = 0.0;
363  const CompAtomExt *pExt_z = pExt_1 + j;
364  BigReal groForce = mol->get_gro_force2(p_ij_x, p_ij_y, p_ij_z,pExt_i.id,pExt_z->id,&groLJe,&groGausse);
365  NAMD_die("Failsafe. This line should never be reached\n");
366  fast_b += groForce;
367  ENERGY(
368  NOT_ALCHPAIR (
369  // JLai
370  groLJEnergy += groLJe;
371  groGaussEnergy += groGausse;
372  )
373  ) //ENERGY
374  }
375 #endif
376  BigReal goNative = 0;
377  BigReal goNonnative = 0;
378  BigReal goForce = 0;
379  register const CompAtomExt *pExt_j = pExt_1 + j;
381  goForce = mol->get_go_force2(p_ij_x, p_ij_y, p_ij_z, pExt_i.id, pExt_j->id,&goNative,&goNonnative);
382  } else {
383  // Ported by JLai -- JE - added (
384  const BigReal r2go = square(p_ij_x, p_ij_y, p_ij_z);
385  const BigReal rgo = sqrt(r2go);
386 
388  goForce = mol->get_go_force(rgo, pExt_i.id, pExt_j->id, &goNative, &goNonnative);
389  } else if (ComputeNonbondedUtil::goMethod == 3) {
390  goForce = mol->get_go_force_new(rgo, pExt_i.id, pExt_j->id, &goNative, &goNonnative);
391  } else {
392  NAMD_die("I SHOULDN'T BE HERE. DYING MELODRAMATICALLY.\n");
393  }
394  }
395 
396  fast_b += goForce;
397  {
398  ENERGY(
399  NOT_ALCHPAIR (
400  // JLai
401  goEnergyNative += goNative;
402  goEnergyNonnative += goNonnative;
403  )
404  ) //ENERGY
405  INT(
406  reduction[pairVDWForceIndex_X] += force_sign * goForce * p_ij_x;
407  reduction[pairVDWForceIndex_Y] += force_sign * goForce * p_ij_y;
408  reduction[pairVDWForceIndex_Z] += force_sign * goForce * p_ij_z;
409  )
410  }
411  // End of INT
412 
413  //DebugM(3,"rgo:" << rgo << ", pExt_i.id:" << pExt_i.id << ", pExt_j->id:" << pExt_j->id << \
414  // ", goForce:" << goForce << ", fast_b:" << fast_b << std::endl);
415 #endif // ) // End of GO macro
416  /***** JE - End Go *****/
417  // End of port JL
418 #endif //) // End of Normal MACRO
419 
420  // Combined short-range electrostatics and VdW force:
421 #if ( NOT_ALCHPAIR(1+) 0 )
422  NODISP(
423  fast_d += vdw_d;
424  fast_c += vdw_c;
425  fast_b += vdw_b;
426  fast_a += vdw_a; // not used!
427  ) // NODISP
428 #endif
429 
430  register BigReal fast_dir =
431  (diffa * fast_d + fast_c) * diffa + fast_b;
432  DISP(
433  fast_dir += (12*A * r12inv - 6*B * r6inv) * r2inv;
434  )
435  BigReal force_r = LAM(lambda_pair *) fast_dir;
436  ALCHPAIR(
437  force_r *= myElecLambda;
438  force_r += alch_vdw_force;
439  // special ALCH forces already multiplied by relevant lambda
440  )
441 
442  register BigReal tmp_x = force_r * p_ij_x;
443  f_i_x += tmp_x;
444  f_j->x -= tmp_x;
445 
446  register BigReal tmp_y = force_r * p_ij_y;
447  f_i_y += tmp_y;
448  f_j->y -= tmp_y;
449 
450  register BigReal tmp_z = force_r * p_ij_z;
451  f_i_z += tmp_z;
452  f_j->z -= tmp_z;
453 
454  PPROF(
455  const BigReal p_j_z = p_j->position.z;
456  int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
457  pp_clamp(n2, pressureProfileSlabs);
458  int p_j_partition = p_j->partition;
459 
460  pp_reduction(pressureProfileSlabs, n1, n2,
461  p_i_partition, p_j_partition, pressureProfileAtomTypes,
462  tmp_x*p_ij_x, tmp_y * p_ij_y, tmp_z*p_ij_z,
463  pressureProfileReduction);
464  )
465 
466 #endif // SHORT
467 #endif // FAST
468 
469 #if ( FULL (EXCLUDED( SHORT ( 1+ ) ) ) 0 )
470  //const BigReal* const slow_i = slow_table + 4*table_i;
471 #define slow_i (slow_table + 4*table_i)
472 
473 #ifdef ARCH_POWERPC //Alignment and aliasing constraints
474  __alignx (32, slow_table);
475 #if ( SHORT( FAST( 1+ ) ) 0 )
476 #pragma disjoint (*slow_table, *f_1)
477 #endif
478 #pragma disjoint (*slow_table, *fullf_1)
479 #endif //ARCH_POWERPC
480 
481 #endif //FULL
482 
483 
484 #if ( FULL (MODIFIED( SHORT ( 1+ ) ) ) 0 )
485  //const BigReal* const slow_i = slow_table + 4*table_i;
486 #define slow_i (slow_table + 4*table_i)
487 
488 #ifdef ARCH_POWERPC //Alignment and aliasing constraints
489  __alignx (32, slow_table);
490 #if ( SHORT( FAST( 1+ ) ) 0 )
491 #pragma disjoint (*slow_table, *f_1)
492 #endif
493 #pragma disjoint (*slow_table, *fullf_1)
494 #endif //ARCH_POWERPC
495 
496 #endif //FULL
497 
498 #if ( FULL( 1+ ) 0 )
499  BigReal slow_d = table_four_i[8 SHORT(+ 4)];
500  BigReal slow_c = table_four_i[9 SHORT(+ 4)];
501  BigReal slow_b = table_four_i[10 SHORT(+ 4)];
502  BigReal slow_a = table_four_i[11 SHORT(+ 4)];
503  EXCLUDED(
504  SHORT(
505  slow_a += slow_i[3];
506  slow_b += 2.*slow_i[2];
507  slow_c += 4.*slow_i[1];
508  slow_d += 6.*slow_i[0];
509  )
510  NOSHORT(
511  slow_d -= table_four_i[12];
512  slow_c -= table_four_i[13];
513  slow_b -= table_four_i[14];
514  slow_a -= table_four_i[15];
515  )
516  )
517  MODIFIED(
518  SHORT(
519  slow_a += modf_mod * slow_i[3];
520  slow_b += 2.*modf_mod * slow_i[2];
521  slow_c += 4.*modf_mod * slow_i[1];
522  slow_d += 6.*modf_mod * slow_i[0];
523  )
524  NOSHORT(
525  slow_d -= modf_mod * table_four_i[12];
526  slow_c -= modf_mod * table_four_i[13];
527  slow_b -= modf_mod * table_four_i[14];
528  slow_a -= modf_mod * table_four_i[15];
529  )
530  )
531  slow_d *= kqq;
532  slow_c *= kqq;
533  slow_b *= kqq;
534  slow_a *= kqq;
535 
536  ENERGY(
537  register BigReal slow_val =
538  ( ( diffa * slow_d *(1/6.)+ slow_c * (1/4.)) * diffa + slow_b *(1/2.)) * diffa + slow_a;
539 
540  NOT_ALCHPAIR (
541  fullElectEnergy -= LAM(lambda_pair *) slow_val;
542  FEP(fullElectEnergy_s -= slow_val;)
543  )
544  ) // ENERGY
545 
546  ALCHPAIR(
547  ENERGY(fullElectEnergy -= myElecLambda * slow_val;)
548  FEP(fullElectEnergy_s -= myElecLambda2 * slow_val;)
549  TI(
550  NOENERGY(register BigReal slow_val =
551  ( ( diffa * slow_d *(1/6.)+ slow_c * (1/4.)) * diffa + slow_b *(1/2.)) * diffa + slow_a;)
552  ALCH1(fullElectEnergy_ti_1 -= slow_val;) ALCH2(fullElectEnergy_ti_2 -= slow_val;)
553  )
554  )
555 
556  INT( {
557  register BigReal slow_dir =
558  ( diffa * slow_d + slow_c ) * diffa + slow_b;
559  reduction[pairElectForceIndex_X] += force_sign * slow_dir * p_ij_x;
560  reduction[pairElectForceIndex_Y] += force_sign * slow_dir * p_ij_y;
561  reduction[pairElectForceIndex_Z] += force_sign * slow_dir * p_ij_z;
562  } )
563 
564 
565 #if (NOT_ALCHPAIR (1+) 0)
566 #if (FAST(1+) 0)
567 #if (NOSHORT(1+) 0)
568  NODISP(
569  slow_d += vdw_d;
570  slow_c += vdw_c;
571  slow_b += vdw_b;
572  slow_a += vdw_a; // unused!
573  )
574 #endif
575 #endif
576 #endif
577 
578  register BigReal slow_dir = (diffa * slow_d + slow_c) * diffa + slow_b;
579  DISP(
580  #if NOSHORT(EXCLUDED(-1)+1)+0
581  // check if NOSHORT (i.e. MERGEELECT) but NOT EXCLUDED
582  // in that case we must sum the fast vdW force
583  slow_dir += (12*A * r12inv - 6*B * r6inv) * r2inv;
584  #endif
585  slow_dir += 6 * c6 * screen_dr * r6inv * r2inv;
586  ENERGY(
587  BigReal slow_disp_val = c6 * screen_r * r6inv;
588  #if EXCLUDED(-1)+1
589  // add shifted screening potential only if NOT EXCLUDED
590  {
591  BigReal potentialShift = c6 * screen_rc * rcut6inv;
592  slow_disp_val -= potentialShift;
593  }
594  #endif
595  fullVdwEnergy += LAM(lambda_pair *) slow_disp_val;
596  ) // ENERGY
597  )
598  BigReal fullforce_r = slow_dir LAM(* lambda_pair);
599  ALCHPAIR (
600  fullforce_r *= myElecLambda;
601  FAST( NOSHORT(
602  fullforce_r += alch_vdw_force;
603  ))
604  )
605 
606  {
607  register BigReal ftmp_x = fullforce_r * p_ij_x;
608  fullf_i_x += ftmp_x;
609  fullf_j->x -= ftmp_x;
610  register BigReal ftmp_y = fullforce_r * p_ij_y;
611  fullf_i_y += ftmp_y;
612  fullf_j->y -= ftmp_y;
613  register BigReal ftmp_z = fullforce_r * p_ij_z;
614  fullf_i_z += ftmp_z;
615  fullf_j->z -= ftmp_z;
616 
617  PPROF(
618  const BigReal p_j_z = p_j->position.z;
619  int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
620  pp_clamp(n2, pressureProfileSlabs);
621  int p_j_partition = p_j->partition;
622 
623  pp_reduction(pressureProfileSlabs, n1, n2,
624  p_i_partition, p_j_partition, pressureProfileAtomTypes,
625  ftmp_x*p_ij_x, ftmp_y * p_ij_y, ftmp_z*p_ij_z,
626  pressureProfileReduction);
627 
628  )
629  }
630 #endif //FULL
631 
632  } // for pairlist
633 
634 #undef p_j
635 #undef lj_pars
636 #undef table_four_i
637 #undef slow_i
638 #undef f_j
639 #undef fullf_j
640 
#define NORMAL(X)
#define namdnearbyint(x)
Definition: common.h:85
#define f_j
#define DISP(X)
#define LAM(X)
#define PPROF(X)
void pp_reduction(int nslabs, int n1, int n2, int atype1, int atype2, int numtypes, BigReal vxx, BigReal vyy, BigReal vzz, BigReal *reduction)
register BigReal electEnergy
#define NODISP(X)
#define NOSHORT(X)
#define lj_pars
#define TI(X)
uint32 id
Definition: NamdTypes.h:160
register const BigReal p_ij_z
#define INT(X)
void pp_clamp(int &n, int nslabs)
void fep_vdw_forceandenergies(BigReal A, BigReal B, BigReal r2, BigReal myVdwShift, BigReal myVdwShift2, BigReal switchdist2, BigReal cutoff2, BigReal switchfactor, Bool vdwForceSwitching, BigReal myVdwLambda, BigReal myVdwLambda2, Bool alchWCAOn, BigReal myRepLambda, BigReal myRepLambda2, BigReal *alch_vdw_energy, BigReal *alch_vdw_force, BigReal *alch_vdw_energy_2)
#define SHORT(X)
#define fullf_j
#define NOT_ALCHPAIR(X)
#define p_j
void NAMD_die(const char *err_msg)
Definition: common.C:147
#define table_four_i
#define FAST(X)
void ti_vdw_force_energy_dUdl(BigReal A, BigReal B, BigReal r2, BigReal myVdwShift, BigReal switchdist2, BigReal cutoff2, BigReal switchfactor, Bool vdwForceSwitching, BigReal myVdwLambda, BigReal alchVdwShiftCoeff, Bool alchWCAOn, BigReal myRepLambda, BigReal *alch_vdw_energy, BigReal *alch_vdw_force, BigReal *alch_vdw_dUdl)
#define FEP(X)
TABENERGY(register const int tabtype=-1 -(lj_pars->A< 0 ? lj_pars->A :0);) BigReal kqq
register const BigReal p_ij_x
#define simParams
Definition: Output.C:131
k< npairi;++k) { TABENERGY(const int numtypes=simParams->tableNumTypes;const float table_spacing=simParams->tableSpacing;const int npertype=(int)(namdnearbyint(simParams->tableMaxDist/simParams->tableSpacing)+1);) int table_i=(r2iilist[2 *k] >> 14)+r2_delta_expc;const int j=pairlisti[k];#define p_j #define pExt_j_m BigReal diffa=r2list[k] - r2_table[table_i];#define table_four_i const int lj_index=2 *p_j-> vdwType MODIFIED(+1)
#define ENERGY(X)
#define FULL(X)
#define pExt_j_m
#define LES(X)
#define NOENERGY(X)
ALCHPAIR(myLambda=ALCH1(lambdaUp) ALCH2(lambdaDown) ALCH3(lambdaUp) ALCH4(lambdaDown);FEP(myLambda2=ALCH1(lambda2Up) ALCH2(lambda2Down) ALCH3(lambda2Up) ALCH4(lambda2Down);) myElecLambda=ALCH1(elecLambdaUp) ALCH2(elecLambdaDown) ALCH3(elecLambdaUp) ALCH4(elecLambdaDown);FEP(myElecLambda2=ALCH1(elecLambda2Up) ALCH2(elecLambda2Down) ALCH3(elecLambda2Up) ALCH4(elecLambda2Down);) myVdwLambda=ALCH1(vdwLambdaUp) ALCH2(vdwLambdaDown) ALCH3(vdwLambdaUp) ALCH4(vdwLambdaDown);FEP(myVdwLambda2=ALCH1(vdwLambda2Up) ALCH2(vdwLambda2Down) ALCH3(vdwLambda2Up) ALCH4(vdwLambda2Down);) ALCH1(myRepLambda=repLambdaUp) ALCH2(myRepLambda=repLambdaDown);FEP(ALCH1(myRepLambda2=repLambda2Up) ALCH2(myRepLambda2=repLambda2Down);) ALCH1(myVdwShift=vdwShiftUp) ALCH2(myVdwShift=vdwShiftDown);FEP(ALCH1(myVdwShift2=vdwShift2Up) ALCH2(myVdwShift2=vdwShift2Down);)) for(k=0
register const BigReal p_ij_y
double BigReal
Definition: common.h:123
#define EXCLUDED(X)