18 #ifdef MEM_OPT_VERSION 19 NAMD_die(
"Should not be called in OneFourNbTholeElem::getMoleculePointers in memory optimized version!");
22 *byatom = mol->oneFourNbTholesByAtom;
23 *structarray = mol->oneFourNbTholes;
57 #if defined (NAMD_CUDA) || defined(NAMD_HIP) 65 NAMD_die(
"Alchemical calculation for 1-4 atom pairs with nonbonded " 66 "Thole parameters is not supported.");
68 for (
int ituple=0; ituple<ntuple; ++ituple) {
102 const BigReal auaa = aa / raa_invlen;
103 const BigReal auad = aa / rad_invlen;
104 const BigReal auda = aa / rda_invlen;
105 const BigReal audd = aa / rdd_invlen;
108 const BigReal expauaa = exp(-auaa);
109 const BigReal expauad = exp(-auad);
110 const BigReal expauda = exp(-auda);
111 const BigReal expaudd = exp(-audd);
114 BigReal polyauaa = 1 + 0.5*auaa;
115 BigReal polyauad = 1 + 0.5*auad;
116 BigReal polyauda = 1 + 0.5*auda;
117 BigReal polyaudd = 1 + 0.5*audd;
122 ethole += qqaa * raa_invlen * (-polyauaa * expauaa);
123 ethole += qqad * rad_invlen * (-polyauad * expauad);
124 ethole += qqda * rda_invlen * (-polyauda * expauda);
125 ethole += qqdd * rdd_invlen * (-polyaudd * expaudd);
128 polyauaa = 1 + auaa*polyauaa;
129 polyauad = 1 + auad*polyauad;
130 polyauda = 1 + auda*polyauda;
131 polyaudd = 1 + audd*polyaudd;
133 const BigReal raa_invlen3 = raa_invlen * raa_invlen * raa_invlen;
134 const BigReal rad_invlen3 = rad_invlen * rad_invlen * rad_invlen;
135 const BigReal rda_invlen3 = rda_invlen * rda_invlen * rda_invlen;
136 const BigReal rdd_invlen3 = rdd_invlen * rdd_invlen * rdd_invlen;
138 const BigReal dfaa = qqaa * raa_invlen3 * (polyauaa*expauaa);
139 const BigReal dfad = qqad * rad_invlen3 * (polyauad*expauad);
140 const BigReal dfda = qqda * rda_invlen3 * (polyauda*expauda);
141 const BigReal dfdd = qqdd * rdd_invlen3 * (polyaudd*expaudd);
143 const Vector faa = -dfaa * raa;
144 const Vector fad = -dfad * rad;
145 const Vector fda = -dfda * rda;
146 const Vector fdd = -dfdd * rdd;
158 reduction[virialIndex_XX] += faa.
x * raa.x + fad.x * rad.x
159 + fda.x * rda.x + fdd.x * rdd.x;
160 reduction[virialIndex_XY] += faa.x * raa.y + fad.x * rad.y
161 + fda.x * rda.y + fdd.x * rdd.y;
162 reduction[virialIndex_XZ] += faa.x * raa.z + fad.x * rad.z
163 + fda.x * rda.z + fdd.x * rdd.z;
164 reduction[virialIndex_YX] += faa.y * raa.x + fad.y * rad.x
165 + fda.y * rda.x + fdd.y * rdd.x;
166 reduction[virialIndex_YY] += faa.y * raa.y + fad.y * rad.y
167 + fda.y * rda.y + fdd.y * rdd.y;
168 reduction[virialIndex_YZ] += faa.y * raa.z + fad.y * rad.z
169 + fda.y * rda.z + fdd.y * rdd.z;
170 reduction[virialIndex_ZX] += faa.z * raa.x + fad.z * rad.x
171 + fda.z * rda.x + fdd.z * rdd.x;
172 reduction[virialIndex_ZY] += faa.z * raa.y + fad.z * rad.y
173 + fda.z * rda.y + fdd.z * rdd.y;
174 reduction[virialIndex_ZZ] += faa.z * raa.z + fad.z * rad.z
175 + fda.z * rda.z + fdd.z * rdd.z;
178 if (pressureProfileData) {
197 pai, paj, pn, faa.x * raa.x, faa.y * raa.y, faa.z * raa.z,
198 pressureProfileData);
200 pai, pdj, pn, fad.x * rad.x, fad.y * rad.y, fad.z * rad.z,
201 pressureProfileData);
203 pdi, paj, pn, fda.x * rda.x, fda.y * rda.y, fda.z * rda.z,
204 pressureProfileData);
206 pdi, pdj, pn, fdd.x * rdd.x, fdd.y * rdd.y, fdd.z * rdd.z,
207 pressureProfileData);
218 ADD_TENSOR(reduction,REDUCTION_VIRIAL_NORMAL,data,virialIndex);
230 NAMD_die(
"Can't use OneFourNbThole with memory optimized version of NAMD.");
static void getParameterPointers(Parameters *, const OneFourNbTholeValue **)
static BigReal dielectric_1
#define ADD_TENSOR(R, RL, D, DL)
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
static BigReal pressureProfileThickness
void swap(Array< T > &s, Array< T > &t)
Molecule stores the structural information for the system.
const OneFourNbTholeValue * value
void pp_clamp(int &n, int nslabs)
static void getMoleculePointers(Molecule *, int *, int32 ***, OneFourNbThole **)
void NAMD_die(const char *err_msg)
int operator<(const OneFourNbTholeElem &a) const
static int pressureProfileAtomTypes
static int pressureProfileSlabs
int operator==(const OneFourNbTholeElem &a) const
NAMD_HOST_DEVICE BigReal rlength(void) const
static void computeForce(OneFourNbTholeElem *, int, BigReal *, BigReal *)
static void submitReductionData(BigReal *, SubmitReduction *)
NAMD_HOST_DEVICE Vector delta(const Position &pos1, const Position &pos2) const
static BigReal pressureProfileMin