00001
00007 EXCLUDED( FAST( foo bar ) )
00008 EXCLUDED( MODIFIED( foo bar ) )
00009 EXCLUDED( NORMAL( foo bar ) )
00010 NORMAL( MODIFIED( foo bar ) )
00011 ALCHPAIR( NOT_ALCHPAIR( foo bar ) )
00012
00013 ALCHPAIR(
00014
00015 myLambda = ALCH1(lambdaUp) ALCH2(lambdaDown);
00016 FEP(myLambda2 = ALCH1(lambda2Up) ALCH2(lambda2Down);)
00017 myElecLambda = ALCH1(elecLambdaUp) ALCH2(elecLambdaDown);
00018 FEP(myElecLambda2 = ALCH1(elecLambda2Up) ALCH2(elecLambda2Down);)
00019 myVdwLambda = ALCH1(vdwLambdaUp) ALCH2(vdwLambdaDown);
00020 FEP(myVdwLambda2 = ALCH1(vdwLambda2Up) ALCH2(vdwLambda2Down);)
00021 myVdwShift = ALCH1(vdwShiftUp) ALCH2(vdwShiftDown);
00022 FEP(myVdwShift2 = ALCH1(vdwShift2Up) ALCH2(vdwShift2Down);)
00023 )
00024
00025 #ifdef ARCH_POWERPC
00026 __alignx(16, table_four);
00027 __alignx(16, p_1);
00028 #pragma unroll(1)
00029 #endif
00030
00031 #ifndef ARCH_POWERPC
00032 #pragma ivdep
00033 #endif
00034
00035
00036
00037 for (k=0; k<npairi; ++k) {
00038 TABENERGY(
00039 const int numtypes = simParams->tableNumTypes;
00040 const float table_spacing = simParams->tableSpacing;
00041 const int npertype = (int) (mynearbyint(simParams->tableMaxDist / simParams->tableSpacing) + 1);
00042 )
00043
00044 int table_i = (r2iilist[2*k] >> 14) + r2_delta_expc;
00045 const int j = pairlisti[k];
00046 register const CompAtom *p_j = p_1 + j;
00047
00048
00049 BigReal diffa = r2list[k] - r2_table[table_i];
00050 const BigReal* const table_four_i = table_four + 16*table_i;
00051
00052 #if ( FAST( 1 + ) TABENERGY( 1 + ) 0 ) // FAST or TABENERGY
00053 const LJTable::TableEntry * lj_pars =
00054 lj_row + 2 * p_j->vdwType MODIFIED(+ 1);
00055 #endif
00056
00057 TABENERGY(
00058 register const int tabtype = lj_pars->tabletype;
00059 register int eneraddress;
00060 register BigReal r1;
00061 )
00062
00063 #if ( SHORT( FAST( 1+ ) ) 0 )
00064 Force *f_j = f_1 + j;
00065 #endif
00066
00067 #if ( FULL( 1+ ) 0 )
00068 Force *fullf_j = fullf_1 + j;
00069 #endif
00070
00071
00072 #ifdef ARCH_POWERPC
00073 __alignx(16, table_four_i);
00074 FAST (
00075 __alignx(16, lj_pars);
00076 )
00077 __alignx(16, p_j);
00078
00079 #if ( FULL( 1+ ) 0 )
00080 #pragma disjoint (*table_four_i, *fullf_j)
00081 #pragma disjoint (*p_j, *fullf_j)
00082 #if ( SHORT( FAST( 1+ ) ) 0 )
00083 #pragma disjoint (*f_j , *fullf_j)
00084 #pragma disjoint (*fullf_j, *f_j)
00085 #endif
00086 #endif
00087
00088 #if ( SHORT( FAST( 1+ ) ) 0 )
00089 #pragma disjoint (*table_four_i, *f_j)
00090 #pragma disjoint (*p_j, *f_j)
00091 #pragma disjoint (*lj_pars, *f_j)
00092 __prefetch_by_load ((void *)&f_j->x);
00093 #endif
00094
00095 #endif
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 BigReal kqq = kq_i * p_j->charge;
00116
00117 LES( BigReal lambda_pair = lambda_table_i[p_j->partition]; )
00118
00119 register const BigReal p_ij_x = p_i_x - p_j->position.x;
00120 register const BigReal p_ij_y = p_i_y - p_j->position.y;
00121 register const BigReal p_ij_z = p_i_z - p_j->position.z;
00122
00123 #if ( FAST(1+) 0 )
00124 const BigReal A = scaling * lj_pars->A;
00125 const BigReal B = scaling * lj_pars->B;
00126
00127 BigReal vdw_d = A * table_four_i[0] - B * table_four_i[2];
00128 BigReal vdw_c = A * table_four_i[1] - B * table_four_i[3];
00129 BigReal vdw_b = A * table_four_i[4] - B * table_four_i[6];
00130 BigReal vdw_a = A * table_four_i[5] - B * table_four_i[7];
00131
00132 ALCHPAIR (
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 const BigReal r2 = r2list[k] - r2_delta;
00143
00144
00145
00146
00147 FEP(fep_vdw_forceandenergies(A,B,r2,myVdwShift,myVdwShift2,switchdist2,
00148 cutoff2, myVdwLambda, myVdwLambda2, switchfactor, &alch_vdw_energy,
00149 &alch_vdw_force,&alch_vdw_energy_2);)
00150 TI(ti_vdw_force_energy_dUdl(A,B,r2,myVdwShift,switchdist2,
00151 cutoff2, myVdwLambda, alchVdwShiftCoeff, switchfactor,
00152 &alch_vdw_energy, &alch_vdw_force, &alch_vdw_dUdl);)
00153 )
00154
00155 NOT_ALCHPAIR(
00156 TABENERGY(
00157 if (tabtype >= 0) {
00158 r1 = sqrt(p_ij_x*p_ij_x + p_ij_y*p_ij_y + p_ij_z*p_ij_z);
00159
00160 eneraddress = 2 * ((npertype * tabtype) + ((int) mynearbyint(r1 / table_spacing)));
00161
00162 ENERGY(
00163 register BigReal vdw_val = table_ener[eneraddress];
00164
00165 vdwEnergy += LAM(lambda_pair *) vdw_val;
00166 FEP( vdwEnergy_s += d_lambda_pair * vdw_val; )
00167 )
00168 } else {
00169 )
00170 ENERGY(
00171 register BigReal vdw_val =
00172 ( ( diffa * vdw_d * (1/6.)+ vdw_c * (1/4.)) * diffa + vdw_b *(1/2.)) * diffa + vdw_a;
00173 vdwEnergy -= LAM(lambda_pair *) vdw_val;
00174 FEP(vdwEnergy_s -= vdw_val;)
00175 )
00176 TABENERGY( } )
00177 )
00178
00179 ALCHPAIR(
00180 ENERGY(vdwEnergy += alch_vdw_energy;)
00181 FEP(vdwEnergy_s += alch_vdw_energy_2;)
00182 TI(ALCH1(vdwEnergy_ti_1) ALCH2(vdwEnergy_ti_2) += alch_vdw_dUdl;)
00183 )
00184
00185 #endif
00186
00187 #if ( FAST(1+) 0 )
00188 register BigReal vdw_dir;
00189 #if ( TABENERGY(1+) 0 )
00190 if (tabtype >= 0) {
00191
00192 vdw_dir = table_ener[eneraddress + 1];
00193
00194 vdw_dir /= r1;
00195 INT(
00196
00197 reduction[pairVDWForceIndex_X] -= force_sign * vdw_dir * p_ij_x;
00198
00199 reduction[pairVDWForceIndex_Y] -= force_sign * vdw_dir * p_ij_y;
00200 reduction[pairVDWForceIndex_Z] -= force_sign * vdw_dir * p_ij_z;
00201 )
00202
00203 #if ( SHORT(1+) 0 )
00204 NORMAL(
00205 BigReal fast_d = kqq * table_four_i[8];
00206 BigReal fast_c = kqq * table_four_i[9];
00207 BigReal fast_b = kqq * table_four_i[10];
00208 BigReal fast_a = kqq * table_four_i[11];
00209 )
00210 MODIFIED(
00211 BigReal modfckqq = (1.0-modf_mod) * kqq;
00212 BigReal fast_d = modfckqq * table_four_i[8];
00213 BigReal fast_c = modfckqq * table_four_i[9];
00214 BigReal fast_b = modfckqq * table_four_i[10];
00215 BigReal fast_a = modfckqq * table_four_i[11];
00216 )
00217
00218 register BigReal fast_dir =
00219 ( diffa * fast_d + fast_c ) * diffa + fast_b;
00220 {
00221 ENERGY(
00222 register BigReal fast_val =
00223 ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;
00224 electEnergy -= LAM(lambda_pair *) fast_val;
00225 FEP( electEnergy_s -= d_lambda_pair * fast_val; )
00226 )
00227
00228 INT(
00229
00230
00231 reduction[pairElectForceIndex_X] += force_sign * fast_dir * p_ij_x;
00232 reduction[pairElectForceIndex_Y] += force_sign * fast_dir * p_ij_y;
00233 reduction[pairElectForceIndex_Z] += force_sign * fast_dir * p_ij_z;
00234 )
00235 }
00236
00237
00238
00239
00240
00241
00242 fast_dir -= vdw_dir;
00243
00244 BigReal force_r = LAM(lambda_pair *) fast_dir;
00245 register BigReal tmp_x = force_r * p_ij_x;
00246 PAIR( virial_xx += tmp_x * p_ij_x; )
00247 PAIR( virial_xy += tmp_x * p_ij_y; )
00248 PAIR( virial_xz += tmp_x * p_ij_z; )
00249
00250 f_i_x += tmp_x;
00251 f_1[j].x -= tmp_x;
00252
00253 register BigReal tmp_y = force_r * p_ij_y;
00254 PAIR( virial_yy += tmp_y * p_ij_y; )
00255 PAIR( virial_yz += tmp_y * p_ij_z; )
00256 f_i_y += tmp_y;
00257 f_1[j].y -= tmp_y;
00258
00259 register BigReal tmp_z = force_r * p_ij_z;
00260 PAIR( virial_zz += tmp_z * p_ij_z; )
00261 f_i_z += tmp_z;
00262 f_1[j].z -= tmp_z;
00263
00264
00265 PPROF(
00266 const BigReal p_j_z = p_j->position.z;
00267 int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
00268 pp_clamp(n2, pressureProfileSlabs);
00269 int p_j_partition = p_j->partition;
00270
00271
00272
00273 pp_reduction(pressureProfileSlabs, n1, n2,
00274 p_i_partition, p_j_partition, pressureProfileAtomTypes,
00275 tmp_x*p_ij_x, tmp_y * p_ij_y, tmp_z*p_ij_z,
00276 pressureProfileReduction);
00277
00278 )
00279 #endif
00280 } else {
00281 #endif // TABENERGY
00282 INT(
00283 vdw_dir = ( diffa * vdw_d + vdw_c ) * diffa + vdw_b;
00284
00285 reduction[pairVDWForceIndex_X] += force_sign * vdw_dir * p_ij_x;
00286 reduction[pairVDWForceIndex_Y] += force_sign * vdw_dir * p_ij_y;
00287 reduction[pairVDWForceIndex_Z] += force_sign * vdw_dir * p_ij_z;
00288 )
00289
00290 #if ( SHORT(1+) 0 )
00291
00292 NORMAL(
00293 BigReal fast_d = kqq * table_four_i[8];
00294 BigReal fast_c = kqq * table_four_i[9];
00295 BigReal fast_b = kqq * table_four_i[10];
00296 BigReal fast_a = kqq * table_four_i[11];
00297 )
00298 MODIFIED(
00299 BigReal modfckqq = (1.0-modf_mod) * kqq;
00300 BigReal fast_d = modfckqq * table_four_i[8];
00301 BigReal fast_c = modfckqq * table_four_i[9];
00302 BigReal fast_b = modfckqq * table_four_i[10];
00303 BigReal fast_a = modfckqq * table_four_i[11];
00304 )
00305
00306 {
00307 ENERGY(
00308 register BigReal fast_val =
00309 ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;
00310 NOT_ALCHPAIR (
00311 electEnergy -= LAM(lambda_pair *) fast_val;
00312 FEP(electEnergy_s -= fast_val;)
00313 )
00314 )
00315 ALCHPAIR(
00316 ENERGY(electEnergy -= myElecLambda * fast_val;)
00317 FEP(electEnergy_s -= myElecLambda2 * fast_val;)
00318 TI(
00319 NOENERGY(register BigReal fast_val =
00320 ( ( diffa * fast_d * (1/6.)+ fast_c * (1/4.)) * diffa + fast_b *(1/2.)) * diffa + fast_a;)
00321 ALCH1(electEnergy_ti_1) ALCH2(electEnergy_ti_2) -= fast_val;
00322 )
00323 )
00324
00325 INT(
00326 register BigReal fast_dir =
00327 ( diffa * fast_d + fast_c ) * diffa + fast_b;
00328
00329 reduction[pairElectForceIndex_X] += force_sign * fast_dir * p_ij_x;
00330 reduction[pairElectForceIndex_Y] += force_sign * fast_dir * p_ij_y;
00331 reduction[pairElectForceIndex_Z] += force_sign * fast_dir * p_ij_z;
00332 )
00333 }
00334
00335
00336 NOT_ALCHPAIR(
00337 fast_d += vdw_d;
00338 fast_c += vdw_c;
00339 fast_b += vdw_b;
00340 fast_a += vdw_a;
00341 )
00342 register BigReal fast_dir =
00343 (diffa * fast_d + fast_c) * diffa + fast_b;
00344 BigReal force_r = LAM(lambda_pair *) fast_dir;
00345 ALCHPAIR(
00346 force_r *= myElecLambda;
00347 force_r += alch_vdw_force;
00348
00349 )
00350
00351 #ifndef NAMD_CUDA
00352 register BigReal tmp_x = force_r * p_ij_x;
00353 PAIR( virial_xx += tmp_x * p_ij_x; )
00354 PAIR( virial_xy += tmp_x * p_ij_y; )
00355 PAIR( virial_xz += tmp_x * p_ij_z; )
00356
00357 f_i_x += tmp_x;
00358 f_j->x -= tmp_x;
00359
00360 register BigReal tmp_y = force_r * p_ij_y;
00361 PAIR( virial_yy += tmp_y * p_ij_y; )
00362 PAIR( virial_yz += tmp_y * p_ij_z; )
00363 f_i_y += tmp_y;
00364 f_j->y -= tmp_y;
00365
00366 register BigReal tmp_z = force_r * p_ij_z;
00367 PAIR( virial_zz += tmp_z * p_ij_z; )
00368 f_i_z += tmp_z;
00369 f_j->z -= tmp_z;
00370
00371 PPROF(
00372 const BigReal p_j_z = p_j->position.z;
00373 int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
00374 pp_clamp(n2, pressureProfileSlabs);
00375 int p_j_partition = p_j->partition;
00376
00377 pp_reduction(pressureProfileSlabs, n1, n2,
00378 p_i_partition, p_j_partition, pressureProfileAtomTypes,
00379 tmp_x*p_ij_x, tmp_y * p_ij_y, tmp_z*p_ij_z,
00380 pressureProfileReduction);
00381
00382 )
00383 #endif
00384
00385 #endif
00386 TABENERGY( } )
00387 #endif
00388
00389 #if ( FULL (EXCLUDED( SHORT ( 1+ ) ) ) 0 )
00390 const BigReal* const slow_i = slow_table + 4*table_i;
00391
00392 #ifdef ARCH_POWERPC
00393 __alignx (16, slow_i);
00394 #if ( SHORT( FAST( 1+ ) ) 0 )
00395 #pragma disjoint (*slow_i, *f_j)
00396 #endif
00397 #pragma disjoint (*slow_i, *fullf_j)
00398 #endif
00399
00400 #endif
00401
00402
00403 #if ( FULL (MODIFIED( SHORT ( 1+ ) ) ) 0 )
00404 const BigReal* const slow_i = slow_table + 4*table_i;
00405
00406 #ifdef ARCH_POWERPC
00407 __alignx (16, slow_i);
00408 #if ( SHORT( FAST( 1+ ) ) 0 )
00409 #pragma disjoint (*slow_i, *f_j)
00410 #endif
00411 #pragma disjoint (*slow_i, *fullf_j)
00412 #endif
00413
00414 #endif
00415
00416 #if ( FULL( 1+ ) 0 )
00417 BigReal slow_d = table_four_i[8 SHORT(+ 4)];
00418 BigReal slow_c = table_four_i[9 SHORT(+ 4)];
00419 BigReal slow_b = table_four_i[10 SHORT(+ 4)];
00420 BigReal slow_a = table_four_i[11 SHORT(+ 4)];
00421 EXCLUDED(
00422 SHORT(
00423 slow_a += slow_i[0];
00424 slow_b += 2.*slow_i[1];
00425 slow_c += 4.*slow_i[2];
00426 slow_d += 6.*slow_i[3];
00427 )
00428 NOSHORT(
00429 slow_d -= table_four_i[12];
00430 slow_c -= table_four_i[13];
00431 slow_b -= table_four_i[14];
00432 slow_a -= table_four_i[15];
00433 )
00434 )
00435 MODIFIED(
00436 SHORT(
00437 slow_a += modf_mod * slow_i[0];
00438 slow_b += 2.*modf_mod * slow_i[1];
00439 slow_c += 4.*modf_mod * slow_i[2];
00440 slow_d += 6.*modf_mod * slow_i[3];
00441 )
00442 NOSHORT(
00443 slow_d -= modf_mod * table_four_i[12];
00444 slow_c -= modf_mod * table_four_i[13];
00445 slow_b -= modf_mod * table_four_i[14];
00446 slow_a -= modf_mod * table_four_i[15];
00447 )
00448 )
00449 slow_d *= kqq;
00450 slow_c *= kqq;
00451 slow_b *= kqq;
00452 slow_a *= kqq;
00453
00454 ENERGY(
00455 register BigReal slow_val =
00456 ( ( diffa * slow_d *(1/6.)+ slow_c * (1/4.)) * diffa + slow_b *(1/2.)) * diffa + slow_a;
00457
00458 NOT_ALCHPAIR (
00459 fullElectEnergy -= LAM(lambda_pair *) slow_val;
00460 FEP(fullElectEnergy_s -= slow_val;)
00461 )
00462 )
00463
00464 ALCHPAIR(
00465 ENERGY(fullElectEnergy -= myElecLambda * slow_val;)
00466 FEP(fullElectEnergy_s -= myElecLambda2 * slow_val;)
00467 TI(
00468 NOENERGY(register BigReal slow_val =
00469 ( ( diffa * slow_d *(1/6.)+ slow_c * (1/4.)) * diffa + slow_b *(1/2.)) * diffa + slow_a;)
00470 ALCH1(fullElectEnergy_ti_1) ALCH2(fullElectEnergy_ti_2) -= slow_val;
00471 )
00472 )
00473
00474 INT( {
00475 register BigReal slow_dir =
00476 ( diffa * slow_d + slow_c ) * diffa + slow_b;
00477 reduction[pairElectForceIndex_X] += force_sign * slow_dir * p_ij_x;
00478 reduction[pairElectForceIndex_Y] += force_sign * slow_dir * p_ij_y;
00479 reduction[pairElectForceIndex_Z] += force_sign * slow_dir * p_ij_z;
00480 } )
00481
00482
00483 TABENERGY(
00484 register BigReal slow_dir;
00485 if (tabtype < 0) {
00486 NOT_ALCHPAIR (
00487 FAST(
00488 NOSHORT(
00489 slow_d += vdw_d;
00490 slow_c += vdw_c;
00491 slow_b += vdw_b;
00492 slow_a += vdw_a;
00493 )
00494 )
00495 )
00496 slow_dir = (diffa * slow_d + slow_c) * diffa + slow_b;
00497 } else {
00498 slow_dir =
00499 ( diffa * slow_d + slow_c ) * diffa + slow_b;
00500 NOT_ALCHPAIR (
00501 FAST(
00502 NOSHORT(
00503 slow_dir = vdw_dir + slow_dir;
00504 )
00505 )
00506 )
00507 }
00508 )
00509 NOTABENERGY(
00510 NOT_ALCHPAIR (
00511 FAST(
00512 NOSHORT(
00513 slow_d += vdw_d;
00514 slow_c += vdw_c;
00515 slow_b += vdw_b;
00516 slow_a += vdw_a;
00517 )
00518 )
00519 )
00520 register BigReal slow_dir = (diffa * slow_d + slow_c) * diffa + slow_b;
00521 )
00522 BigReal fullforce_r = slow_dir LAM(* lambda_pair);
00523 ALCHPAIR (
00524 fullforce_r *= myElecLambda;
00525 FAST( NOSHORT(
00526 fullforce_r += alch_vdw_force;
00527 ))
00528 )
00529
00530 #ifndef NAMD_CUDA
00531 {
00532 register BigReal tmp_x = fullforce_r * p_ij_x;
00533 PAIR( fullElectVirial_xx += tmp_x * p_ij_x; )
00534 PAIR( fullElectVirial_xy += tmp_x * p_ij_y; )
00535 PAIR( fullElectVirial_xz += tmp_x * p_ij_z; )
00536 fullf_i_x += tmp_x;
00537 fullf_j->x -= tmp_x;
00538 register BigReal tmp_y = fullforce_r * p_ij_y;
00539 PAIR( fullElectVirial_yy += tmp_y * p_ij_y; )
00540 PAIR( fullElectVirial_yz += tmp_y * p_ij_z; )
00541 fullf_i_y += tmp_y;
00542 fullf_j->y -= tmp_y;
00543 register BigReal tmp_z = fullforce_r * p_ij_z;
00544 PAIR( fullElectVirial_zz += tmp_z * p_ij_z; )
00545 fullf_i_z += tmp_z;
00546 fullf_j->z -= tmp_z;
00547
00548 PPROF(
00549 const BigReal p_j_z = p_j->position.z;
00550 int n2 = (int)floor((p_j_z-pressureProfileMin)*invThickness);
00551 pp_clamp(n2, pressureProfileSlabs);
00552 int p_j_partition = p_j->partition;
00553
00554 pp_reduction(pressureProfileSlabs, n1, n2,
00555 p_i_partition, p_j_partition, pressureProfileAtomTypes,
00556 tmp_x*p_ij_x, tmp_y * p_ij_y, tmp_z*p_ij_z,
00557 pressureProfileReduction);
00558
00559 )
00560
00561 }
00562 #endif
00563 #endif //FULL
00564
00565 }
00566