29 #ifdef MEM_OPT_VERSION 30 NAMD_die(
"Should not be called in ExclElem::getMoleculePointers in memory optimized version!");
33 *byatom = mol->exclusionsByAtom;
34 *structarray = mol->exclusions;
74 BigReal lambdaUp, lambdaDown, lambda2Up, lambda2Down, switchfactor;
75 BigReal vdwLambdaUp, vdwLambdaDown, elecLambdaUp, elecLambdaDown;
76 BigReal elecLambda2Up, elecLambda2Down, vdwLambda2Up, vdwLambda2Down;
77 BigReal vdwShiftUp, vdwShift2Up, vdwShiftDown, vdwShift2Down;
78 BigReal myVdwLambda, myVdwLambda2, myElecLambda, myElecLambda2, myVdwShift, myVdwShift2;
80 int pswitch, ref, alch, dec, up, down;
85 BigReal lambdaDown = 1 - lambdaUp;
86 BigReal lambda2Down = 1 - lambda2Up;
89 vdwLambdaUp =
simParams->getVdwLambda(lambdaUp);
90 vdwLambdaDown =
simParams->getVdwLambda(lambdaDown);
91 elecLambdaUp =
simParams->getElecLambda(lambdaUp);
92 elecLambdaDown =
simParams->getElecLambda(lambdaDown);
93 elecLambda2Up =
simParams->getElecLambda(lambda2Up);
94 elecLambda2Down =
simParams->getElecLambda(lambda2Down);
95 vdwLambda2Up =
simParams->getVdwLambda(lambda2Up);
96 vdwLambda2Down =
simParams->getVdwLambda(lambda2Down);
113 for (
int ituple=0; ituple<ntuple; ++ituple ) {
115 BigReal energyVdw = 0.0, energyElec = 0.0, energySlow = 0.0;
117 BigReal energyVdw_s = 0.0, energyElec_s = 0.0, energySlow_s = 0.0;
119 const ExclElem &tup = tuples[ituple];
131 const unsigned char p2 =
p_j.partition;
134 BigReal alch_vdw_energy_2 = 0.0;
144 if (
modified && r2 < 1.0 ) r2 = 1.0;
152 myVdwLambda = 1.0; myElecLambda = 1.0;
153 myVdwLambda2 = 1.0; myElecLambda2 = 1.0;
156 myVdwLambda = vdwLambdaUp; myElecLambda = elecLambdaUp; myVdwShift = vdwShiftUp;
157 myVdwLambda2 = vdwLambda2Up; myElecLambda2 = elecLambda2Up; myVdwShift2 = vdwShift2Up;
160 myVdwLambda = vdwLambdaDown; myElecLambda = elecLambdaDown; myVdwShift = vdwShiftDown;
161 myVdwLambda2 = vdwLambda2Down; myElecLambda2 = elecLambda2Down; myVdwShift2 = vdwShift2Down;
164 myVdwLambda = 0.0; myElecLambda = 0.0;
165 myVdwLambda2 = 0.0; myElecLambda2 = 0.0;
170 myVdwLambda = 1.0; myElecLambda = 1.0;
171 myVdwLambda2 = 1.0; myElecLambda2 = 1.0;
174 union {
double f;
int64 i; } r2i;
177 int table_i = (r2i.i >> (32+14)) + r2_delta_expc;
183 BigReal fast_a = 0., fast_b = 0., fast_c = 0., fast_d = 0.;
184 BigReal slow_a, slow_b, slow_c, slow_d;
216 energyElec = (( ( diffa * (1./6.)*fast_d + 0.25*fast_c ) * diffa
217 + 0.5*fast_b ) * diffa + fast_a);
219 energySlow = (( ( diffa * (1./6.)*slow_d + 0.25*slow_c ) * diffa
220 + 0.5*slow_b ) * diffa + slow_a);
230 energyVdw = (( ( diffa * (1./6.)*vdw_d + 0.25*vdw_c ) * diffa
231 + 0.5*vdw_b ) * diffa + vdw_a);
234 else if(pswitch != 99) {
237 const BigReal r2_1 = 1./(r2 + myVdwShift);
238 const BigReal r2_2 = 1./(r2 + myVdwShift2);
239 const BigReal r6_1 = r2_1*r2_1*r2_1;
240 const BigReal r6_2 = r2_2*r2_2*r2_2;
241 const BigReal U1 = A*r6_1*r6_1 - B*r6_1;
242 const BigReal U2 = A*r6_2*r6_2 - B*r6_2;
251 alch_vdw_energy = myVdwLambda*switchmul*U1;
252 alch_vdw_energy_2 = myVdwLambda2*switchmul*U2;
253 alch_vdw_force = myVdwLambda*((switchmul*(12.*U1 + 6.*B*r6_1)*r2_1 +
260 const BigReal r2_1 = 1./(r2 + myVdwShift);
261 const BigReal r6_1 = r2_1*r2_1*r2_1;
267 12.*switchfactor*(
cutoff2 - r2) \
271 const BigReal U = A*r6_1*r6_1 - B*r6_1;
272 alch_vdw_energy = myVdwLambda*switchmul*U;
273 alch_vdw_force = (myVdwLambda*(switchmul*(12.*U + 6.*B*r6_1)*r2_1 \
276 *(6.*U + 3.*B*r6_1)*r2_1));
296 energySlow = (( ( diffa * (1./6.)*slow_d + 0.25*slow_c ) * diffa
297 + 0.5*slow_b ) * diffa + slow_a);
301 register BigReal fast_dir = (diffa * fast_d + fast_c) * diffa + fast_b;
303 fast_dir = (fast_dir*myElecLambda) + alch_vdw_force*(pswitch == 1 || pswitch == 2);
304 const Force f12 = fast_dir * r12;
311 reduction[virialIndex_XX] += f12.
x * r12.x;
314 reduction[virialIndex_YX] += f12.
y * r12.x;
315 reduction[virialIndex_YY] += f12.
y * r12.y;
317 reduction[virialIndex_ZX] += f12.
z * r12.x;
318 reduction[virialIndex_ZY] += f12.
z * r12.y;
319 reduction[virialIndex_ZZ] += f12.
z * r12.z;
322 register BigReal slow_dir = (diffa * slow_d + slow_c) * diffa + slow_b;
324 slow_dir = (slow_dir * myElecLambda);
325 const Force slow_f12 = slow_dir * r12;
331 reduction[slowVirialIndex_XX] += slow_f12.
x * r12.x;
334 reduction[slowVirialIndex_YX] += slow_f12.
y * r12.x;
335 reduction[slowVirialIndex_YY] += slow_f12.
y * r12.y;
337 reduction[slowVirialIndex_ZX] += slow_f12.
z * r12.x;
338 reduction[slowVirialIndex_ZY] += slow_f12.
z * r12.y;
339 reduction[slowVirialIndex_ZZ] += slow_f12.
z * r12.z;
362 else if (pswitch == 2){
393 data[virialIndex_XY] = data[virialIndex_YX];
394 data[virialIndex_XZ] = data[virialIndex_ZX];
395 data[virialIndex_YZ] = data[virialIndex_ZY];
397 data[slowVirialIndex_XY] = data[slowVirialIndex_YX];
398 data[slowVirialIndex_XZ] = data[slowVirialIndex_ZX];
399 data[slowVirialIndex_YZ] = data[slowVirialIndex_ZY];
401 ADD_TENSOR(reduction,REDUCTION_VIRIAL_NBOND,data,virialIndex);
402 ADD_TENSOR(reduction,REDUCTION_VIRIAL_SLOW,data,slowVirialIndex);
static BigReal * fast_table
static int pressureProfileAtomTypes
const TableEntry * table_row(unsigned int i) const
static BigReal dielectric_1
#define ADD_TENSOR(R, RL, D, DL)
static void submitReductionData(BigReal *, SubmitReduction *)
SimParameters * simParameters
static void computeForce(ExclElem *, int, BigReal *, BigReal *)
static void getParameterPointers(Parameters *, const int **)
static Bool alchThermIntOn
Molecule stores the structural information for the system.
static BigReal * r2_table
static BigReal * table_noshort
static int pswitchTable[3 *3]
NAMD_HOST_DEVICE BigReal length2(void) const
void NAMD_die(const char *err_msg)
static int pressureProfileSlabs
static BigReal * slow_table
static const LJTable * ljTable
static BigReal pressureProfileThickness
static BigReal alchVdwShiftCoeff
static BigReal pressureProfileMin
static void getMoleculePointers(Molecule *, int *, int32 ***, Exclusion **)
NAMD_HOST_DEVICE Vector delta(const Position &pos1, const Position &pos2) const