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( 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  const BigReal aR2 = r2 * alphaLJ * alphaLJ;
161  const BigReal aR4 = aR2 * aR2;
162  const BigReal screen_dr = (1 - (1 + aR2 + aR4/2 + aR4*aR2/6)*exp(-aR2));
163  ENERGY(
164  const BigReal screen_r = (1 - (1 + aR2 + aR4/2)*exp(-aR2));
165  )
166  )
167 
168 #if ( FAST(1+) 0 )
169  const BigReal A = scaling * lj_pars->A;
170  const BigReal B = scaling * lj_pars->B;
171  BigReal vdw_d = A * table_four_i[0] - B * table_four_i[4];
172  BigReal vdw_c = A * table_four_i[1] - B * table_four_i[5];
173  BigReal vdw_b = A * table_four_i[2] - B * table_four_i[6];
174  BigReal vdw_a = A * table_four_i[3] - B * table_four_i[7];
175 
176  ALCHPAIR (
177  // Alchemical free energy calculation
178  // Pairlist 1 and 2 are for softcore atoms, while 3 and 4 are single topology atoms.
179  // Pairlists are separated so that lambda-coupled pairs are handled
180  // independently from normal nonbonded (inside ALCHPAIR macro).
181  // The separation-shifted van der Waals potential and a shifted
182  // electrostatics potential for decoupling are calculated explicitly.
183  // Would be faster with lookup tables but because only a small minority
184  // of nonbonded pairs are lambda-coupled the impact is minimal.
185  // Explicit calculation also makes things easier to modify.
186  // These are now inline functions (in ComputeNonbondedFep.C) to
187  // tidy the code
188 
189  const BigReal r2 = r2list[k] - r2_delta;
190 
191  // These are now inline functions (in ComputeNonbondedFep.C) to
192  // tidy the code
193 
194  FEP(
195  ALCH1 ( // Don't merge/recombine the ALCH 1, 2, 3 ,4. Their functions might be modified for future algorithm changes.
196  fep_vdw_forceandenergies(A, B, r2, myVdwShift, myVdwShift2,
197  switchdist2, cutoff2, switchfactor, vdwForceSwitching, myVdwLambda,
198  myVdwLambda2, alchWCAOn, myRepLambda, myRepLambda2, &alch_vdw_energy,
199  &alch_vdw_force, &alch_vdw_energy_2);)
200  ALCH2 (
201  fep_vdw_forceandenergies(A, B, r2, myVdwShift, myVdwShift2,
202  switchdist2, cutoff2, switchfactor, vdwForceSwitching, myVdwLambda,
203  myVdwLambda2, alchWCAOn, myRepLambda, myRepLambda2, &alch_vdw_energy,
204  &alch_vdw_force, &alch_vdw_energy_2);)
205  ALCH3 ( // In single topology region ALCH3 & 4, all atoms are paired so softcore potential is unnecessary.
206  ENERGY(alch_vdw_energy = -myVdwLambda * (( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a);)
207  alch_vdw_energy_2 = -myVdwLambda2 * (( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a);
208  alch_vdw_force = myVdwLambda * ((diffa * vdw_d + vdw_c) * diffa + vdw_b);)
209  ALCH4 (
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  )
214  TI(ti_vdw_force_energy_dUdl(A, B, r2, myVdwShift, switchdist2, cutoff2,
215  switchfactor, vdwForceSwitching, myVdwLambda, alchVdwShiftCoeff,
216  alchWCAOn, myRepLambda, &alch_vdw_energy, &alch_vdw_force,
217  &alch_vdw_dUdl);)
218  )
219 
220  //NOT_ALCHPAIR(
221  //TABENERGY(
222 #if (NOT_ALCHPAIR(1+) 0)
223 #if (TABENERGY(1+) 0)
224  if (tabtype >= 0) {
225  register BigReal r1;
226  r1 = sqrt(p_ij_x*p_ij_x + p_ij_y*p_ij_y + p_ij_z*p_ij_z);
227 
228  //CkPrintf("%i %i %f %f %i\n", npertype, tabtype, r1, table_spacing, (int) (namdnearbyint(r1 / table_spacing)));
229  register int eneraddress;
230  eneraddress = 2 * ((npertype * tabtype) + ((int) namdnearbyint(r1 / table_spacing)));
231  //CkPrintf("Using distance bin %i for distance %f\n", eneraddress, r1);
232  vdw_d = 0.;
233  vdw_c = 0.;
234  vdw_b = table_ener[eneraddress + 1] / r1;
235  vdw_a = (-1/2.) * diffa * vdw_b;
236  ENERGY(
237  register BigReal vdw_val = table_ener[eneraddress];
238  //CkPrintf("Found vdw energy of %f\n", vdw_val);
239  vdwEnergy += LAM(lambda_pair *) vdw_val;
240  FEP( vdwEnergy_s += d_lambda_pair * vdw_val; )
241  )
242  } else {
243  //)
244 #endif
245  ENERGY(
246  register BigReal vdw_val = 0;
247  vdw_val -=
248  ( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a;
249  DISP(
250  vdw_val += c6 * screen_r * r6inv;
251  // continuous potential at the cutoff by subtracting a constant
252  BigReal potentialShift = (A*rcut12inv - B*rcut6inv);
253  potentialShift += c6 * screen_rc * rcut6inv;
254  vdw_val -= potentialShift;
255  )
256 
257  vdwEnergy += LAM(lambda_pair *) vdw_val;
258 
259  FEP(vdwEnergy_s += vdw_val;)
260  )
261  //TABENERGY( } ) /* endif (tabtype >= 0) */
262 #if (TABENERGY (1+) 0)
263  }
264 #endif
265  //) // NOT_ALCHPAIR
266 #endif
267 
268  ALCHPAIR(
269  ENERGY(vdwEnergy += alch_vdw_energy;)
270  FEP(vdwEnergy_s += alch_vdw_energy_2;)
271  TI(ALCH1(vdwEnergy_ti_1 += alch_vdw_dUdl;) ALCH2(vdwEnergy_ti_2 += alch_vdw_dUdl;))
272  ) // ALCHPAIR
273 
274 #endif // FAST
275 
276 #if ( FAST(1+) 0 )
277  INT(
278  register BigReal vdw_dir;
279  vdw_dir = ( diffa * vdw_d + vdw_c ) * diffa + vdw_b;
280  //BigReal force_r = LAM(lambda_pair *) vdw_dir;
281  reduction[pairVDWForceIndex_X] += force_sign * vdw_dir * p_ij_x;
282  reduction[pairVDWForceIndex_Y] += force_sign * vdw_dir * p_ij_y;
283  reduction[pairVDWForceIndex_Z] += force_sign * vdw_dir * p_ij_z;
284  )
285 
286 #if ( SHORT(1+) 0 ) // Short-range electrostatics
287 
288  NORMAL(
289  BigReal fast_d = kqq * table_four_i[8];
290  BigReal fast_c = kqq * table_four_i[9];
291  BigReal fast_b = kqq * table_four_i[10];
292  BigReal fast_a = kqq * table_four_i[11];
293  )
294  MODIFIED(
295  BigReal modfckqq = (1.0-modf_mod) * kqq;
296  BigReal fast_d = modfckqq * table_four_i[8];
297  BigReal fast_c = modfckqq * table_four_i[9];
298  BigReal fast_b = modfckqq * table_four_i[10];
299  BigReal fast_a = modfckqq * table_four_i[11];
300  )
301 
302  {
303  ENERGY(
304  register BigReal fast_val =
305  ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;
306  NOT_ALCHPAIR (
307  electEnergy -= LAM(lambda_pair *) fast_val;
308  FEP(electEnergy_s -= fast_val;)
309  )
310  ) //ENERGY
311  ALCHPAIR(
312  ENERGY(electEnergy -= myElecLambda * fast_val;)
313  FEP(electEnergy_s -= myElecLambda2 * fast_val;)
314  TI(
315  NOENERGY(register BigReal fast_val =
316  ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;)
317  ALCH1(electEnergy_ti_1 -= fast_val;) ALCH2(electEnergy_ti_2 -= fast_val;)
318  )
319  )
320 
321  INT(
322  register BigReal fast_dir =
323  ( diffa * fast_d + fast_c ) * diffa + fast_b;
324  // force_r -= -1.0 * LAM(lambda_pair *) fast_dir;
325  reduction[pairElectForceIndex_X] += force_sign * fast_dir * p_ij_x;
326  reduction[pairElectForceIndex_Y] += force_sign * fast_dir * p_ij_y;
327  reduction[pairElectForceIndex_Z] += force_sign * fast_dir * p_ij_z;
328  )
329  }
330 
331 
332  /***** JE - Go *****/
333  // Now Go energy should appear in VDW place -- put vdw_b back into place
334 #if ( NORMAL (1+) 0)
335 #if ( GO (1+) 0)
336 
337 
338 // JLai
339 #ifndef CODE_REDUNDANT
340 #define CODE_REDUNDANT 0
341 #endif
342 #if CODE_REDUNDANT
344  // Explicit goGroPair calculation; only calculates goGroPair if goGroPair is turned on
345  //
346  // get_gro_force has an internal checklist that sees if atom_i and atom_j are
347  // in the explicit pairlist. This is done because there is no guarantee that a
348  // processor will have atom_i and atom_j so we cannot loop over the explict atom pairs.
349  // We can only loop over all pairs.
350  //
351  // NOTE: It does not look like fast_b is not normalized by the r vector.
352  //
353  // JLai
354  BigReal groLJe = 0.0;
355  BigReal groGausse = 0.0;
356  const CompAtomExt *pExt_z = pExt_1 + j;
357  BigReal groForce = mol->get_gro_force2(p_ij_x, p_ij_y, p_ij_z,pExt_i.id,pExt_z->id,&groLJe,&groGausse);
358  NAMD_die("Failsafe. This line should never be reached\n");
359  fast_b += groForce;
360  ENERGY(
361  NOT_ALCHPAIR (
362  // JLai
363  groLJEnergy += groLJe;
364  groGaussEnergy += groGausse;
365  )
366  ) //ENERGY
367  }
368 #endif
369  BigReal goNative = 0;
370  BigReal goNonnative = 0;
371  BigReal goForce = 0;
372  register const CompAtomExt *pExt_j = pExt_1 + j;
374  goForce = mol->get_go_force2(p_ij_x, p_ij_y, p_ij_z, pExt_i.id, pExt_j->id,&goNative,&goNonnative);
375  } else {
376  // Ported by JLai -- JE - added (
377  const BigReal r2go = square(p_ij_x, p_ij_y, p_ij_z);
378  const BigReal rgo = sqrt(r2go);
379 
381  goForce = mol->get_go_force(rgo, pExt_i.id, pExt_j->id, &goNative, &goNonnative);
382  } else if (ComputeNonbondedUtil::goMethod == 3) {
383  goForce = mol->get_go_force_new(rgo, pExt_i.id, pExt_j->id, &goNative, &goNonnative);
384  } else {
385  NAMD_die("I SHOULDN'T BE HERE. DYING MELODRAMATICALLY.\n");
386  }
387  }
388 
389  fast_b += goForce;
390  {
391  ENERGY(
392  NOT_ALCHPAIR (
393  // JLai
394  goEnergyNative += goNative;
395  goEnergyNonnative += goNonnative;
396  )
397  ) //ENERGY
398  INT(
399  reduction[pairVDWForceIndex_X] += force_sign * goForce * p_ij_x;
400  reduction[pairVDWForceIndex_Y] += force_sign * goForce * p_ij_y;
401  reduction[pairVDWForceIndex_Z] += force_sign * goForce * p_ij_z;
402  )
403  }
404  // End of INT
405 
406  //DebugM(3,"rgo:" << rgo << ", pExt_i.id:" << pExt_i.id << ", pExt_j->id:" << pExt_j->id << \
407  // ", goForce:" << goForce << ", fast_b:" << fast_b << std::endl);
408 #endif // ) // End of GO macro
409  /***** JE - End Go *****/
410  // End of port JL
411 #endif //) // End of Normal MACRO
412 
413  // Combined short-range electrostatics and VdW force:
414 #if ( NOT_ALCHPAIR(1+) 0 )
415  fast_d += vdw_d;
416  fast_c += vdw_c;
417  fast_b += vdw_b;
418  fast_a += vdw_a; // not used!
419 #endif
420 
421  register BigReal fast_dir =
422  (diffa * fast_d + fast_c) * diffa + fast_b;
423  DISP(
424  fast_dir += 6 * c6 * screen_dr * r6inv * r2inv;
425  )
426  BigReal force_r = LAM(lambda_pair *) fast_dir;
427  ALCHPAIR(
428  force_r *= myElecLambda;
429  force_r += alch_vdw_force;
430  // special ALCH forces already multiplied by relevant lambda
431  )
432 
433  register BigReal tmp_x = force_r * p_ij_x;
434  f_i_x += tmp_x;
435  f_j->x -= tmp_x;
436 
437  register BigReal tmp_y = force_r * p_ij_y;
438  f_i_y += tmp_y;
439  f_j->y -= tmp_y;
440 
441  register BigReal tmp_z = force_r * p_ij_z;
442  f_i_z += tmp_z;
443  f_j->z -= tmp_z;
444 
445  PPROF(
446  const BigReal p_j_z = p_j->position.z;
447  int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
448  pp_clamp(n2, pressureProfileSlabs);
449  int p_j_partition = p_j->partition;
450 
451  pp_reduction(pressureProfileSlabs, n1, n2,
452  p_i_partition, p_j_partition, pressureProfileAtomTypes,
453  tmp_x*p_ij_x, tmp_y * p_ij_y, tmp_z*p_ij_z,
454  pressureProfileReduction);
455  )
456 
457 #endif // SHORT
458 #endif // FAST
459 
460 #if ( FULL (EXCLUDED( SHORT ( 1+ ) ) ) 0 )
461  //const BigReal* const slow_i = slow_table + 4*table_i;
462 #define slow_i (slow_table + 4*table_i)
463 
464 #ifdef ARCH_POWERPC //Alignment and aliasing constraints
465  __alignx (32, slow_table);
466 #if ( SHORT( FAST( 1+ ) ) 0 )
467 #pragma disjoint (*slow_table, *f_1)
468 #endif
469 #pragma disjoint (*slow_table, *fullf_1)
470 #endif //ARCH_POWERPC
471 
472 #endif //FULL
473 
474 
475 #if ( FULL (MODIFIED( SHORT ( 1+ ) ) ) 0 )
476  //const BigReal* const slow_i = slow_table + 4*table_i;
477 #define slow_i (slow_table + 4*table_i)
478 
479 #ifdef ARCH_POWERPC //Alignment and aliasing constraints
480  __alignx (32, slow_table);
481 #if ( SHORT( FAST( 1+ ) ) 0 )
482 #pragma disjoint (*slow_table, *f_1)
483 #endif
484 #pragma disjoint (*slow_table, *fullf_1)
485 #endif //ARCH_POWERPC
486 
487 #endif //FULL
488 
489 #if ( FULL( 1+ ) 0 )
490  BigReal slow_d = table_four_i[8 SHORT(+ 4)];
491  BigReal slow_c = table_four_i[9 SHORT(+ 4)];
492  BigReal slow_b = table_four_i[10 SHORT(+ 4)];
493  BigReal slow_a = table_four_i[11 SHORT(+ 4)];
494  EXCLUDED(
495  SHORT(
496  slow_a += slow_i[3];
497  slow_b += 2.*slow_i[2];
498  slow_c += 4.*slow_i[1];
499  slow_d += 6.*slow_i[0];
500  )
501  NOSHORT(
502  slow_d -= table_four_i[12];
503  slow_c -= table_four_i[13];
504  slow_b -= table_four_i[14];
505  slow_a -= table_four_i[15];
506  )
507  )
508  MODIFIED(
509  SHORT(
510  slow_a += modf_mod * slow_i[3];
511  slow_b += 2.*modf_mod * slow_i[2];
512  slow_c += 4.*modf_mod * slow_i[1];
513  slow_d += 6.*modf_mod * slow_i[0];
514  )
515  NOSHORT(
516  slow_d -= modf_mod * table_four_i[12];
517  slow_c -= modf_mod * table_four_i[13];
518  slow_b -= modf_mod * table_four_i[14];
519  slow_a -= modf_mod * table_four_i[15];
520  )
521  )
522  slow_d *= kqq;
523  slow_c *= kqq;
524  slow_b *= kqq;
525  slow_a *= kqq;
526 
527  ENERGY(
528  register BigReal slow_val =
529  ( ( diffa * slow_d *(1/6.)+ slow_c * (1/4.)) * diffa + slow_b *(1/2.)) * diffa + slow_a;
530 
531  NOT_ALCHPAIR (
532  fullElectEnergy -= LAM(lambda_pair *) slow_val;
533  FEP(fullElectEnergy_s -= slow_val;)
534  )
535  ) // ENERGY
536 
537  ALCHPAIR(
538  ENERGY(fullElectEnergy -= myElecLambda * slow_val;)
539  FEP(fullElectEnergy_s -= myElecLambda2 * slow_val;)
540  TI(
541  NOENERGY(register BigReal slow_val =
542  ( ( diffa * slow_d *(1/6.)+ slow_c * (1/4.)) * diffa + slow_b *(1/2.)) * diffa + slow_a;)
543  ALCH1(fullElectEnergy_ti_1 -= slow_val;) ALCH2(fullElectEnergy_ti_2 -= slow_val;)
544  )
545  )
546 
547  INT( {
548  register BigReal slow_dir =
549  ( diffa * slow_d + slow_c ) * diffa + slow_b;
550  reduction[pairElectForceIndex_X] += force_sign * slow_dir * p_ij_x;
551  reduction[pairElectForceIndex_Y] += force_sign * slow_dir * p_ij_y;
552  reduction[pairElectForceIndex_Z] += force_sign * slow_dir * p_ij_z;
553  } )
554 
555 
556 #if (NOT_ALCHPAIR (1+) 0)
557 #if (FAST(1+) 0)
558 #if (NOSHORT(1+) 0)
559  slow_d += vdw_d;
560  slow_c += vdw_c;
561  slow_b += vdw_b;
562  slow_a += vdw_a; // unused!
563 #endif
564 #endif
565 #endif
566 
567  register BigReal slow_dir = (diffa * slow_d + slow_c) * diffa + slow_b;
568  DISP(
569  #if (EXCLUDED(1+) 0) || (NOSHORT(1+) 0)
570  // add screened dispersion force term for either
571  // excluded interaction (subtract out long-range contribution)
572  // or when using merged force buffer (NOSHORT)
573  slow_dir += 6 * c6 * screen_dr * r6inv * r2inv;
574  #endif
575  #if (EXCLUDED(1+) 0)
576  ENERGY(
577  // add screened dispersion energy term for
578  // excluded interaction (subtract out long-range contribution)
579  BigReal slow_disp_val = c6 * screen_r * r6inv;
580  fullVdwEnergy += LAM(lambda_pair *) slow_disp_val;
581  ) // ENERGY
582  #endif
583  )
584  BigReal fullforce_r = slow_dir LAM(* lambda_pair);
585  ALCHPAIR (
586  fullforce_r *= myElecLambda;
587  FAST( NOSHORT(
588  fullforce_r += alch_vdw_force;
589  ))
590  )
591 
592  {
593  register BigReal ftmp_x = fullforce_r * p_ij_x;
594  fullf_i_x += ftmp_x;
595  fullf_j->x -= ftmp_x;
596  register BigReal ftmp_y = fullforce_r * p_ij_y;
597  fullf_i_y += ftmp_y;
598  fullf_j->y -= ftmp_y;
599  register BigReal ftmp_z = fullforce_r * p_ij_z;
600  fullf_i_z += ftmp_z;
601  fullf_j->z -= ftmp_z;
602 
603  PPROF(
604  const BigReal p_j_z = p_j->position.z;
605  int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
606  pp_clamp(n2, pressureProfileSlabs);
607  int p_j_partition = p_j->partition;
608 
609  pp_reduction(pressureProfileSlabs, n1, n2,
610  p_i_partition, p_j_partition, pressureProfileAtomTypes,
611  ftmp_x*p_ij_x, ftmp_y * p_ij_y, ftmp_z*p_ij_z,
612  pressureProfileReduction);
613 
614  )
615  }
616 #endif //FULL
617 
618  } // for pairlist
619 
620 #undef p_j
621 #undef lj_pars
622 #undef table_four_i
623 #undef slow_i
624 #undef f_j
625 #undef fullf_j
626 
#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 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:148
#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)