27 #ifdef MEM_OPT_VERSION 28 NAMD_die(
"Should not be called in ImproperElem::getMoleculePointers in memory optimized version!");
31 *byatom = mol->impropersByAtom;
32 *structarray = mol->impropers;
37 *v =
p->improper_array;
57 for (
int ituple=0; ituple<ntuple; ++ituple ) {
66 #if defined(DEBUG_PROTOCELL) 82 CkPrintf(
"%11d %11d %11d %11d mult=%d", i, j, k, l, mult);
83 for (
int m=0; m < mult; m++) {
87 CkPrintf(
" k=%g delta=%g n=%d\n", kdelta, delta, n);
109 Force f1(0,0,0),f2(0,0,0),f3(0,0,0);
136 cos_phi = A*B/(rA*rB);
137 sin_phi = C*B/(rC*rB);
143 phi= -atan2(sin_phi,cos_phi);
145 if (fabs(sin_phi) > 0.1)
150 dcosdA = rA*(cos_phi*A-B);
151 dcosdB = rB*(cos_phi*B-A);
158 dsindC = rC*(sin_phi*C-B);
159 dsindB = rB*(sin_phi*B-C);
165 for (
int mult_num=0; mult_num<multiplicity; mult_num++)
176 K = k*(1+cos(n*phi - delta));
177 K1 = -n*k*sin(n*phi - delta);
184 else if (diff >
PI) diff -=
TWOPI;
197 if (fabs(sin_phi) > 0.1)
202 f1.x += K1*(r23.
y*dcosdA.
z - r23.
z*dcosdA.
y);
203 f1.y += K1*(r23.
z*dcosdA.
x - r23.
x*dcosdA.
z);
204 f1.z += K1*(r23.
x*dcosdA.
y - r23.
y*dcosdA.
x);
206 f3.
x += K1*(r23.
z*dcosdB.
y - r23.
y*dcosdB.
z);
207 f3.
y += K1*(r23.
x*dcosdB.
z - r23.
z*dcosdB.
x);
208 f3.
z += K1*(r23.
y*dcosdB.
x - r23.
x*dcosdB.
y);
210 f2.x += K1*(r12.
z*dcosdA.
y - r12.
y*dcosdA.
z 211 + r34.
y*dcosdB.
z - r34.
z*dcosdB.
y);
212 f2.y += K1*(r12.
x*dcosdA.
z - r12.
z*dcosdA.
x 213 + r34.
z*dcosdB.
x - r34.
x*dcosdB.
z);
214 f2.z += K1*(r12.
y*dcosdA.
x - r12.
x*dcosdA.
y 215 + r34.
x*dcosdB.
y - r34.
y*dcosdB.
x);
223 f1.x += K1*((r23.
y*r23.
y + r23.
z*r23.
z)*dsindC.
x 224 - r23.
x*r23.
y*dsindC.
y 225 - r23.
x*r23.
z*dsindC.
z);
226 f1.y += K1*((r23.
z*r23.
z + r23.
x*r23.
x)*dsindC.
y 227 - r23.
y*r23.
z*dsindC.
z 228 - r23.
y*r23.
x*dsindC.
x);
229 f1.z += K1*((r23.
x*r23.
x + r23.
y*r23.
y)*dsindC.
z 230 - r23.
z*r23.
x*dsindC.
x 231 - r23.
z*r23.
y*dsindC.
y);
233 f3 += cross(K1,dsindB,r23);
235 f2.x += K1*(-(r23.
y*r12.
y + r23.
z*r12.
z)*dsindC.
x 236 +(2.0*r23.
x*r12.
y - r12.
x*r23.
y)*dsindC.
y 237 +(2.0*r23.
x*r12.
z - r12.
x*r23.
z)*dsindC.
z 238 +dsindB.
z*r34.
y - dsindB.
y*r34.
z);
239 f2.y += K1*(-(r23.
z*r12.
z + r23.
x*r12.
x)*dsindC.
y 240 +(2.0*r23.
y*r12.
z - r12.
y*r23.
z)*dsindC.
z 241 +(2.0*r23.
y*r12.
x - r12.
y*r23.
x)*dsindC.
x 242 +dsindB.
x*r34.
z - dsindB.
z*r34.
x);
243 f2.z += K1*(-(r23.
x*r12.
x + r23.
y*r12.
y)*dsindC.
z 244 +(2.0*r23.
z*r12.
x - r12.
z*r23.
x)*dsindC.
x 245 +(2.0*r23.
z*r12.
y - r12.
z*r23.
y)*dsindC.
y 246 +dsindB.
y*r34.
x - dsindB.
x*r34.
y);
258 energy *= bond_lambda_1;
267 energy *= bond_lambda_2;
282 DebugM(3,
"::computeForce() -- ending with delta energy " << energy << std::endl);
284 reduction[virialIndex_XX] += ( f1.x * r12.
x + f2.x * r23.
x + f3.
x * r34.
x );
285 reduction[virialIndex_XY] += ( f1.x * r12.
y + f2.x * r23.
y + f3.
x * r34.
y );
286 reduction[virialIndex_XZ] += ( f1.x * r12.
z + f2.x * r23.
z + f3.
x * r34.
z );
287 reduction[virialIndex_YX] += ( f1.y * r12.
x + f2.y * r23.
x + f3.
y * r34.
x );
288 reduction[virialIndex_YY] += ( f1.y * r12.
y + f2.y * r23.
y + f3.
y * r34.
y );
289 reduction[virialIndex_YZ] += ( f1.y * r12.
z + f2.y * r23.
z + f3.
y * r34.
z );
290 reduction[virialIndex_ZX] += ( f1.z * r12.
x + f2.z * r23.
x + f3.
z * r34.
x );
291 reduction[virialIndex_ZY] += ( f1.z * r12.
y + f2.z * r23.
y + f3.
z * r34.
y );
292 reduction[virialIndex_ZZ] += ( f1.z * r12.
z + f2.z * r23.
z + f3.
z * r34.
z );
294 if (pressureProfileData) {
314 f1.x * r12.
x, f1.y * r12.
y, f1.z * r12.
z,
315 pressureProfileData);
318 f2.x * r23.
x, f2.y * r23.
y, f2.z * r23.
z,
319 pressureProfileData);
322 f3.
x * r34.
x, f3.
y * r34.
y, f3.
z * r34.
z,
323 pressureProfileData);
335 ADD_TENSOR(reduction,REDUCTION_VIRIAL_NORMAL,data,virialIndex);
static int pressureProfileAtomTypes
static void submitReductionData(BigReal *, SubmitReduction *)
static void getMoleculePointers(Molecule *, int *, int32 ***, Improper **)
const ImproperValue * value
#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 void getParameterPointers(Parameters *, const ImproperValue **)
Molecule stores the structural information for the system.
static BigReal pressureProfileMin
void pp_clamp(int &n, int nslabs)
static int pressureProfileSlabs
NAMD_HOST_DEVICE BigReal length(void) const
int get_fep_bonded_type(const int *atomID, unsigned int order) const
void NAMD_die(const char *err_msg)
FourBodyConsts values[MAX_MULTIPLICITY]
static void computeForce(ImproperElem *, int, BigReal *, BigReal *)
static BigReal pressureProfileThickness
NAMD_HOST_DEVICE Vector delta(const Position &pos1, const Position &pos2) const