85 BigReal lambdaUp, lambdaDown, lambda2Up, lambda2Down, switchfactor;
86 BigReal vdwLambdaUp, vdwLambdaDown, elecLambdaUp, elecLambdaDown;
87 BigReal elecLambda2Up, elecLambda2Down, vdwLambda2Up, vdwLambda2Down;
88 BigReal vdwShiftUp, vdwShift2Up, vdwShiftDown, vdwShift2Down;
89 BigReal myVdwLambda, myVdwLambda2, myElecLambda, myElecLambda2, myVdwShift, myVdwShift2;
91 int pswitch, ref, alch, dec, up, down;
96 BigReal lambdaDown = 1 - lambdaUp;
97 BigReal lambda2Down = 1 - lambda2Up;
98 switchfactor = 1./((cutoff2 - switchOn2)*
99 (cutoff2 - switchOn2)*(cutoff2 - switchOn2));
100 vdwLambdaUp =
simParams->getVdwLambda(lambdaUp);
101 vdwLambdaDown =
simParams->getVdwLambda(lambdaDown);
102 elecLambdaUp =
simParams->getElecLambda(lambdaUp);
103 elecLambdaDown =
simParams->getElecLambda(lambdaDown);
104 elecLambda2Up =
simParams->getElecLambda(lambda2Up);
105 elecLambda2Down =
simParams->getElecLambda(lambda2Down);
106 vdwLambda2Up =
simParams->getVdwLambda(lambda2Up);
107 vdwLambda2Down =
simParams->getVdwLambda(lambda2Down);
108 vdwShiftUp =
simParams->alchVdwShiftCoeff*(1 - vdwLambdaUp);
109 vdwShiftDown =
simParams->alchVdwShiftCoeff*(1 - vdwLambdaDown);
110 vdwShift2Up =
simParams->alchVdwShiftCoeff*(1 - vdwLambda2Up);
111 vdwShift2Down =
simParams->alchVdwShiftCoeff*(1 - vdwLambda2Down);
124 for (
int ituple=0; ituple<ntuple; ++ituple ) {
126 BigReal energyVdw = 0.0, energyElec = 0.0, energySlow = 0.0;
128 BigReal energyVdw_s = 0.0, energyElec_s = 0.0, energySlow_s = 0.0;
130 const ExclElem &tup = tuples[ituple];
142 const unsigned char p2 =
p_j.partition;
145 BigReal alch_vdw_energy_2 = 0.0;
153 if ( r2 > cutoff2 )
continue;
155 if (
modified && r2 < 1.0 ) r2 = 1.0;
163 myVdwLambda = 1.0; myElecLambda = 1.0;
164 myVdwLambda2 = 1.0; myElecLambda2 = 1.0;
167 myVdwLambda = vdwLambdaUp; myElecLambda = elecLambdaUp; myVdwShift = vdwShiftUp;
168 myVdwLambda2 = vdwLambda2Up; myElecLambda2 = elecLambda2Up; myVdwShift2 = vdwShift2Up;
171 myVdwLambda = vdwLambdaDown; myElecLambda = elecLambdaDown; myVdwShift = vdwShiftDown;
172 myVdwLambda2 = vdwLambda2Down; myElecLambda2 = elecLambda2Down; myVdwShift2 = vdwShift2Down;
175 myVdwLambda = 0.0; myElecLambda = 0.0;
176 myVdwLambda2 = 0.0; myElecLambda2 = 0.0;
181 myVdwLambda = 1.0; myElecLambda = 1.0;
182 myVdwLambda2 = 1.0; myElecLambda2 = 1.0;
185 union {
double f;
int64 i; } r2i;
187 const int r2_delta_expc = 64 * (r2_delta_exp - 1023);
188 int table_i = (r2i.i >> (32+14)) + r2_delta_expc;
192 BigReal diffa = r2 - r2_table[table_i];
194 BigReal fast_a = 0., fast_b = 0., fast_c = 0., fast_d = 0.;
195 BigReal slow_a, slow_b, slow_c, slow_d;
200 ljTable->table_row(p_i.
vdwType) + 2 *
p_j.vdwType;
211 const BigReal kqq = (1.0 - scale14) *
214 fast_a = kqq * fast_table[4*table_i+0];
215 fast_b = 2. * kqq * fast_table[4*table_i+1];
216 fast_c = 4. * kqq * fast_table[4*table_i+2];
217 fast_d = 6. * kqq * fast_table[4*table_i+3];
220 slow_a = kqq * slow_table[4*table_i+3];
221 slow_b = 2. * kqq * slow_table[4*table_i+2];
222 slow_c = 4. * kqq * slow_table[4*table_i+1];
223 slow_d = 6. * kqq * slow_table[4*table_i+0];
227 energyElec = (( ( diffa * (1./6.)*fast_d + 0.25*fast_c ) * diffa
228 + 0.5*fast_b ) * diffa + fast_a);
230 energySlow = (( ( diffa * (1./6.)*slow_d + 0.25*slow_c ) * diffa
231 + 0.5*slow_b ) * diffa + slow_a);
241 energyVdw = (( ( diffa * (1./6.)*vdw_d + 0.25*vdw_c ) * diffa
242 + 0.5*vdw_b ) * diffa + vdw_a);
245 else if(pswitch != 99) {
248 const BigReal r2_1 = 1./(r2 + myVdwShift);
249 const BigReal r2_2 = 1./(r2 + myVdwShift2);
250 const BigReal r6_1 = r2_1*r2_1*r2_1;
251 const BigReal r6_2 = r2_2*r2_2*r2_2;
252 const BigReal U1 = A*r6_1*r6_1 - B*r6_1;
253 const BigReal U2 = A*r6_2*r6_2 - B*r6_2;
255 const BigReal switchmul = (r2 > switchOn2 ?
256 switchfactor * (cutoff2 - r2) * (cutoff2 - r2) *
257 (cutoff2 - 3.*switchOn2 + 2.*r2) : 1.);
259 const BigReal switchmul2 = (r2 > switchOn2 ?
260 12.*switchfactor * (cutoff2 - r2) * (r2 - switchOn2) : 0.);
262 alch_vdw_energy = myVdwLambda*switchmul*U1;
263 alch_vdw_energy_2 = myVdwLambda2*switchmul*U2;
264 alch_vdw_force = myVdwLambda*((switchmul*(12.*U1 + 6.*B*r6_1)*r2_1 +
271 const BigReal r2_1 = 1./(r2 + myVdwShift);
272 const BigReal r6_1 = r2_1*r2_1*r2_1;
274 const BigReal switchmul = (r2 > switchOn2 ? switchfactor*(cutoff2 - r2) \
276 *(cutoff2 - 3.*switchOn2 + 2.*r2) : 1.);
277 const BigReal switchmul2 = (r2 > switchOn2 ? \
278 12.*switchfactor*(cutoff2 - r2) \
279 *(r2 - switchOn2) : 0.);
282 const BigReal U = A*r6_1*r6_1 - B*r6_1;
283 alch_vdw_energy = myVdwLambda*switchmul*U;
284 alch_vdw_force = (myVdwLambda*(switchmul*(12.*U + 6.*B*r6_1)*r2_1 \
286 alch_vdw_dUdl = (switchmul*(U + myVdwLambda*
simParams->alchVdwShiftCoeff \
287 *(6.*U + 3.*B*r6_1)*r2_1));
307 energySlow = (( ( diffa * (1./6.)*slow_d + 0.25*slow_c ) * diffa
308 + 0.5*slow_b ) * diffa + slow_a);
312 register BigReal fast_dir = (diffa * fast_d + fast_c) * diffa + fast_b;
314 fast_dir = (fast_dir*myElecLambda) + alch_vdw_force*(pswitch == 1 || pswitch == 2);
315 const Force f12 = fast_dir * r12;
322 reduction[virialIndex_XX] += f12.
x * r12.x;
325 reduction[virialIndex_YX] += f12.
y * r12.x;
326 reduction[virialIndex_YY] += f12.
y * r12.y;
328 reduction[virialIndex_ZX] += f12.
z * r12.x;
329 reduction[virialIndex_ZY] += f12.
z * r12.y;
330 reduction[virialIndex_ZZ] += f12.
z * r12.z;
333 register BigReal slow_dir = (diffa * slow_d + slow_c) * diffa + slow_b;
335 slow_dir = (slow_dir * myElecLambda);
336 const Force slow_f12 = slow_dir * r12;
342 reduction[slowVirialIndex_XX] += slow_f12.
x * r12.x;
345 reduction[slowVirialIndex_YX] += slow_f12.
y * r12.x;
346 reduction[slowVirialIndex_YY] += slow_f12.
y * r12.y;
348 reduction[slowVirialIndex_ZX] += slow_f12.
z * r12.x;
349 reduction[slowVirialIndex_ZY] += slow_f12.
z * r12.y;
350 reduction[slowVirialIndex_ZZ] += slow_f12.
z * r12.z;
373 else if (pswitch == 2){
static BigReal * fast_table
static BigReal dielectric_1
SimParameters * simParameters
static BigReal * r2_table
static BigReal * table_noshort
static int pswitchTable[3 *3]
NAMD_HOST_DEVICE BigReal length2(void) const
static BigReal * slow_table
static const LJTable * ljTable
NAMD_HOST_DEVICE Vector delta(const Position &pos1, const Position &pos2) const