13 #include "ComputeLjPmeSerialMgr.decl.h" 18 #include "ComputeMgr.decl.h" 20 #define MIN_DEBUG_LEVEL 3 76 CProxy_ComputeLjPmeSerialMgr ljPmeProxy;
91 double *ljForceNonbond;
93 double *ljParameter14;
94 double oldNonbondedScaling;
95 double oldSoluteScaling;
101 ljPmeProxy(thisgroup), ljPmeCompute(0), numSources(0), numArrived(0),
102 coordMsgs(0), coord(0), forceNonbond(0), forceSlow(0), oldmsg(0),
103 numAtoms(0), ljPmeCoord(0), ljForceSlow(0), ljForceNonbond(0),
104 ljParameter(0), ljParameter14(0), atomType(0)
107 CkpvAccess(BOCclass_group).computeLjPmeSerialMgr = thisgroup;
113 for (
int i=0; i < numSources; i++)
delete coordMsgs[i];
116 delete [] forceNonbond;
120 if (ljPmeCoord)
delete[] ljPmeCoord;
121 if (ljForceSlow)
delete[] ljForceSlow;
122 if (ljForceNonbond)
delete[] ljForceNonbond;
123 if (ljParameter)
delete[] ljParameter;
124 if (ljParameter14)
delete[] ljParameter14;
125 if (atomType)
delete[] atomType;
133 CProxy_ComputeLjPmeSerialMgr::ckLocalBranch(
134 CkpvAccess(BOCclass_group).computeLjPmeSerialMgr)->setCompute(
this);
143 int useGeom =
simParams->vdwGeometricSigma;
159 "LJPME::compute_vdw_params: energy table index is negative");
166 if ( tabulatedEnergies && ( A < 0 || A14 < 0 ) ) {
167 NAMD_die(
"LJ A is negative with tabulatedEnergies enabled");
173 Real sigma_i, sigma_i14, epsilon_i, epsilon_i14;
174 Real sigma_j, sigma_j14, epsilon_j, epsilon_j14;
176 if (!soluteScalingOn) {
182 int i_type = (i >= table_dim_org)? ss_vdw_type[i-table_dim_org]:i;
183 int j_type = (j >= table_dim_org)? ss_vdw_type[j-table_dim_org]:j;
185 &epsilon_i14,i_type);
187 &epsilon_j14,j_type);
191 useGeom ? sqrt(sigma_i*sigma_j) : 0.5*(sigma_i+sigma_j);
193 useGeom ? sqrt(sigma_i14*sigma_j14) : 0.5 * (sigma_i14+sigma_j14);
194 BigReal epsilon_ij = sqrt(epsilon_i*epsilon_j);
195 BigReal epsilon_ij14 = sqrt(epsilon_i14*epsilon_j14);
198 sigma_ij *= sigma_ij*sigma_ij;
199 sigma_ij *= sigma_ij;
200 sigma_ij14 *= sigma_ij14*sigma_ij14;
201 sigma_ij14 *= sigma_ij14;
204 B = 4.0 * sigma_ij * epsilon_ij;
206 B14 = 4.0 * sigma_ij14 * epsilon_ij14;
207 A14 = B14 * sigma_ij14;
209 if (soluteScalingOn) {
210 if (i >= table_dim_org && i < (table_dim_org+ss_dim) && j < table_dim_org) {
211 A *= sqrt(soluteScalingFactor);
212 B *= sqrt(soluteScalingFactor);
213 A14 *= sqrt(soluteScalingFactor);
214 B14 *= sqrt(soluteScalingFactor);
216 if (i < table_dim_org && j >= table_dim_org && j < (table_dim_org+ss_dim)) {
217 A *= sqrt(soluteScalingFactor);
218 B *= sqrt(soluteScalingFactor);
219 A14 *= sqrt(soluteScalingFactor);
220 B14 *= sqrt(soluteScalingFactor);
222 if (i >=table_dim_org && i < (table_dim_org+ss_dim) && j >= table_dim_org && j < (table_dim_org+ss_dim)) {
223 A *= soluteScalingFactor;
224 B *= soluteScalingFactor;
225 A14 *= soluteScalingFactor;
226 B14 *= soluteScalingFactor;
230 if ( tabulatedEnergies && ( A < 0 || A14 < 0 ) ) {
231 NAMD_die(
"LJPME: LJ A is negative with tabulatedEnergies enabled");
242 sigma = sqrt(
cbrt(A)) / sqrt(
cbrt(B));
243 epsilon = B*B / (4*A);
245 sigma14 = sqrt(
cbrt(A14)) / sqrt(
cbrt(B14));
246 epsilon14 = B14*B14 / (4*A14);
253 for (
int i = 0; i < table_dim; i++) {
254 for (
int j = i; j < table_dim; j++) {
255 int index_ij = 2*(i*table_dim+j);
256 int index_ji = 2*(j*table_dim+i);
259 ljParameter[index_ij] = scaling * A;
260 ljParameter[index_ij+1] = scaling * B;
261 ljParameter14[index_ij] = scaling * A14;
262 ljParameter14[index_ij+1] = scaling * B14;
264 ljParameter[index_ji] = ljParameter[index_ij];
265 ljParameter[index_ji+1] = ljParameter[index_ij+1];
266 ljParameter14[index_ji] = ljParameter14[index_ij];
267 ljParameter14[index_ji+1] = ljParameter14[index_ij+1];
275 for (
int i = 0; i < numAtoms; i++) {
276 Real sigma, sigma_14, epsilon, epsilon_14;
277 atomType[i] = coord[i].
vdwType;
279 epsilon_14, coord[i].vdwType);
284 ljPmeCoord[4*i+3] = 2.0*sigma*sigma*sigma*sqrt(scaling * epsilon);
308 int numLocalAtoms = 0;
309 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
310 numLocalAtoms += (*ap).p->getNumAtoms();
320 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
321 CompAtom *x = (*ap).positionBox->open();
324 (*ap).positionBox->close(&x);
325 x = (*ap).avgPositionBox->open();
327 int numAtoms = (*ap).p->getNumAtoms();
329 for(
int i=0; i < numAtoms; i++)
333 data_ptr->
id = xExt[i].
id;
337 if (
patchList[0].p->flags.doMolly ) { (*ap).avgPositionBox->close(&x); }
338 else { (*ap).positionBox->close(&x); }
341 CProxy_ComputeLjPmeSerialMgr ljPmeProxy(
342 CkpvAccess(BOCclass_group).computeLjPmeSerialMgr);
343 ljPmeProxy[0].recvCoord(msg);
350 if ( ! numSources ) {
353 for (
int i=0; i<numSources; ++i ) { coordMsgs[i] = 0; }
363 for (
int i=0; i < msg->
numAtoms; ++i) {
366 coordMsgs[numArrived] = msg;
369 if ( numArrived < numSources )
return;
380 ljParameter =
new double[2*table_dim*table_dim];
381 ljParameter14 =
new double[2*table_dim*table_dim];
382 ljPmeCoord =
new double[4*numAtoms];
383 ljForceSlow =
new double[3*numAtoms];
384 ljForceNonbond =
new double[3*numAtoms];
385 atomType =
new int[numAtoms];
387 if (ljPmeCoord==0 || ljForceSlow==0 || ljForceNonbond==0 || ljParameter==0
388 || ljParameter==0 || atomType == 0) {
389 NAMD_die(
"can't allocate LJ-PME atom buffers");
394 LjPme.
initialize(ljPmeCoord, ljParameter, ljParameter14, atomType,
395 ljForceNonbond, ljForceSlow, table_dim, numAtoms);
398 oldNonbondedScaling =
simParams->nonbondedScaling;
399 oldSoluteScaling =
simParams->soluteScalingFactorVdw;
403 if((
simParams->nonbondedScaling != oldNonbondedScaling) ||
404 (
simParams->soluteScalingOn && (
simParams->soluteScalingFactorVdw != oldSoluteScaling))) {
406 oldNonbondedScaling =
simParams->nonbondedScaling;
407 oldSoluteScaling =
simParams->soluteScalingFactorVdw;
411 for (
int i = 0; i < numAtoms; i++) {
416 ljForceSlow[3*i ] = 0.0;
417 ljForceSlow[3*i+1] = 0.0;
418 ljForceSlow[3*i+2] = 0.0;
419 ljForceNonbond[3*i ] = 0.0;
420 ljForceNonbond[3*i+1] = 0.0;
421 ljForceNonbond[3*i+2] = 0.0;
425 double energySlow, energyNonbond;
426 double virialSlow[3][3], virialNonbond[3][3];
438 printf(
"LJ-PME: E_nb: %6.12f, E_rec: %6.12f, E_sum: %6.12f! \n",
439 energyNonbond, energySlow, energyNonbond+energySlow);
440 printf(
"LJ-PME: virial_nb: [%3.6f, %3.6f, %3.6f, %3.6f, %3.6f, %3.6f] \n",
441 virialNonbond[0][0], virialNonbond[0][1], virialNonbond[0][2],
442 virialNonbond[1][1], virialNonbond[1][2], virialNonbond[2][2]);
443 printf(
"LJ-PME: virial_slow: [%3.6f, %3.6f, %3.6f, %3.6f, %3.6f, %3.6f] \n",
444 virialSlow[0][0], virialSlow[0][1], virialSlow[0][2],
445 virialSlow[1][1], virialSlow[1][2], virialSlow[2][2]);
448 for (
int i = 0; i < numAtoms; i++) {
449 forceSlow[i].
x = ljForceSlow[3*i ];
450 forceSlow[i].
y = ljForceSlow[3*i+1];
451 forceSlow[i].
z = ljForceSlow[3*i+2];
453 forceNonbond[i].
x = ljForceNonbond[3*i ];
454 forceNonbond[i].
y = ljForceNonbond[3*i+1];
455 forceNonbond[i].
z = ljForceNonbond[3*i+2];
458 forceNonbond[i].
x = 0.0;
459 forceNonbond[i].
y = 0.0;
460 forceNonbond[i].
z = 0.0;
461 double fx = forceNonbond[i].
x + forceSlow[i].
x;
462 double fy = forceNonbond[i].
y + forceSlow[i].
y;
463 double fz = forceNonbond[i].
z + forceSlow[i].
z;
464 printf(
"LJ-PME send: atom %5d<-> nb: (%3.6f,%3.6f,%3.6f), slow:(%3.6f,%3.6f,%3.6f), sum:(%3.6f,%3.6f,%3.6f)! \n", i,
465 forceNonbond[i].x, forceNonbond[i].y, forceNonbond[i].z,
466 forceSlow[i].x, forceSlow[i].y, forceSlow[i].z,
472 for (
int j=0; j < numSources; j++) {
477 for (
int i=0; i < cmsg->
numAtoms; i++) {
485 for (
int k=0; k < 3; k++) {
486 for (
int l=0; l < 3; l++) {
495 for (
int k=0; k < 3; k++) {
496 for (
int l=0; l < 3; l++) {
522 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
523 Results *r = (*ap).forceBox->open();
526 int numAtoms = (*ap).p->getNumAtoms();
528 for(
int i=0; i<numAtoms; ++i) {
529 fSlow[i].
x += results_Slow_ptr->
x;
530 fSlow[i].
y += results_Slow_ptr->
y;
531 fSlow[i].
z += results_Slow_ptr->
z;
532 fNonbond[i].
x += results_Nonbond_ptr->
x;
533 fNonbond[i].
y += results_Nonbond_ptr->
y;
534 fNonbond[i].
z += results_Nonbond_ptr->
z;
536 ++results_Nonbond_ptr;
539 (*ap).forceBox->close(&r);
579 #include "ComputeLjPmeSerialMgr.def.h"
void recvForce(LjPmeSerialForceMsg *)
void computeLJpotential(const double &alphaLJ, const double &cutoff, const Lattice &lattice, double virialNonbonded[][3], double virialSlow[][3], double &energyNonbond, double &energySlow, bool doEnergy, bool doSlow)
void setCompute(ComputeLjPmeSerial *c)
static PatchMap * Object()
SimParameters * simParameters
ComputeHomePatchList patchList
SubmitReduction * willSubmit(int setID, int size=-1)
LjPmeSerialForce * forceSlow
ResizeArrayIter< T > begin(void) const
static ReductionMgr * Object(void)
void saveResults(LjPmeSerialForceMsg *)
void NAMD_bug(const char *err_msg)
LjPmeSerialForce * forceNonbond
void get_vdw_parameters(Real &sigma, Real &epsilon, Real &sigma14, Real &epsilon14, Index index)
void getLJparameters(const int &i, const int &j, Real &A, Real &B, Real &A14, Real &B14)
void recvCoord(LjPmeSerialCoordMsg *)
int get_vdw_pair_params(Index ind1, Index ind2, Real *, Real *, Real *, Real *)
void NAMD_die(const char *err_msg)
ComputeLjPmeSerial(ComputeID c)
int get_num_vdw_params(void)
int get_table_pair_params(Index, Index, int *)
void initialize(const double *pmeCoord, const double *parameter, const double *parameter14, const int *type, double *forceNonbond, double *forceSlow, const int &ljTableDim, const int &nAtoms)
void get_vdw_params(Real *sigma, Real *epsilon, Real *sigma14, Real *epsilon14, Index index)
ResizeArrayIter< T > end(void) const
virtual ~ComputeLjPmeSerial()
BigReal virialNonbond[3][3]