Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

ComputeNonbondedBase2.h

Go to the documentation of this file.
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   // get alchemical nonbonded scaling parameters (once per pairlist)
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;  // table_i >= 0 
00045       const int j = pairlisti[k];
00046       register const CompAtom *p_j = p_1 + j;
00047       // const CompAtomExt *pExt_j = pExt_1 + j;
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       //Power PC aliasing and alignment constraints
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   //Short + fast
00086 #endif   //Full
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 //Short + Fast
00094 
00095 #endif   //ARCH_POWERPC
00096 
00097       /*
00098       BigReal modf = 0.0;
00099       int atom2 = p_j->id;
00100       register char excl_flag = ( (atom2 >= excl_min && atom2 <= excl_max) ?
00101                                         excl_flags[atom2-excl_min] : 0 );
00102       if ( excl_flag ) { ++exclChecksum; }
00103       SELF( if ( j < j_hgroup ) { excl_flag = EXCHCK_FULL; } )
00104       if ( excl_flag ) {
00105         if ( excl_flag == EXCHCK_FULL ) {
00106           lj_pars = lj_null_pars;
00107           modf = 1.0;
00108         } else {
00109           ++lj_pars;
00110           modf = modf_mod;
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         // Alchemical free energy calculation
00134         // Pairlists are separated so that lambda-coupled pairs are handled
00135         // independently from normal nonbonded (inside ALCHPAIR macro).
00136         // The separation-shifted van der Waals potential and a shifted 
00137         // electrostatics potential for decoupling are calculated explicitly.
00138         // Would be faster with lookup tables but because only a small minority
00139         // of nonbonded pairs are lambda-coupled the impact is minimal. 
00140         // Explicit calculation also makes things easier to modify.
00141         
00142         const BigReal r2 = r2list[k] - r2_delta;
00143 
00144         // These are now inline functions (in ComputeNonbondedFep.C) to 
00145         // tidy the code
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           //CkPrintf("%i %i %f %f %i\n", npertype, tabtype, r1, table_spacing, (int) (mynearbyint(r1 / table_spacing)));
00160           eneraddress = 2 * ((npertype * tabtype) + ((int) mynearbyint(r1 / table_spacing)));
00161           //CkPrintf("Using distance bin %i for distance %f\n", eneraddress, r1);
00162           ENERGY(
00163             register BigReal vdw_val = table_ener[eneraddress];
00164             //CkPrintf("Found vdw energy of %f\n", vdw_val);
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( } ) /* endif (tabtype >= 0) */
00177       ) // NOT_ALCHPAIR
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       ) // ALCHPAIR
00184       
00185 #endif // FAST
00186 
00187 #if ( FAST(1+) 0 )
00188       register BigReal vdw_dir;
00189 #if ( TABENERGY(1+) 0 )
00190       if (tabtype >= 0) {
00191         //CkPrintf("Getting force from bin %i\n", eneraddress+1);
00192         vdw_dir = table_ener[eneraddress + 1];
00193         //CkPrintf("Values we're combining: vdw_dir: %f\n", vdw_dir);
00194         vdw_dir /= r1;
00195         INT(
00196         //CkPrintf("Found vdw value of %f\n", vdw_dir);
00197         reduction[pairVDWForceIndex_X] -= force_sign * vdw_dir * p_ij_x;
00198         //CkPrintf("X component is %f (from %f %f %f %f)\n", force_sign * vdw_dir * p_ij_x, force_sign, vdw_dir, p_ij_x, r1);
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 //      printf("Initial calculation of fast_dir: %f\n", fast_dir);
00230           // force_r -= -1.0 * LAM(lambda_pair *) fast_dir;
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 //      fast_d += vdw_d;
00238 //      fast_c += vdw_c;
00239 //      fast_b += vdw_b;
00240 //      fast_a += vdw_a;
00241       //CkPrintf("Values we're combining: fast_dir: %f vdw_dir: %f\n", fast_dir, vdw_dir);
00242         fast_dir -= vdw_dir;
00243 //      ( diffa * fast_d + fast_c ) * diffa + fast_b;
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       //CkPrintf("Pre-pressure: %f %f %f | %f %f %f | %f %f\n", tmp_x, tmp_y, tmp_z, p_ij_x, p_ij_y, p_ij_z, vdw_dir, fast_dir);
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         //CkPrintf("Pressure stats: %i | %i | %i | %f | %f | %i | %f %f | %f %f | %f %f\n", pressureProfileSlabs, n1, n2, p_i_partition, p_j_partition, pressureProfileAtomTypes, tmp_x, p_ij_x, tmp_y, p_ij_y, tmp_z, p_ij_z);
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 // SHORT
00280       } else {
00281 #endif // TABENERGY
00282      INT( 
00283       vdw_dir = ( diffa * vdw_d + vdw_c ) * diffa + vdw_b;
00284       //BigReal force_r =  LAM(lambda_pair *) vdw_dir;
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 ) // Short-range electrostatics
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       ) //ENERGY
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       // force_r -= -1.0 * LAM(lambda_pair *) fast_dir;
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       // Combined short-range electrostatics and VdW force:
00336       NOT_ALCHPAIR(
00337         fast_d += vdw_d;
00338         fast_c += vdw_c;
00339         fast_b += vdw_b;
00340         fast_a += vdw_a;  // not used!
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         // special ALCH forces already multiplied by relevant lambda
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 // SHORT
00386       TABENERGY( } )
00387 #endif // FAST
00388 
00389 #if ( FULL (EXCLUDED( SHORT ( 1+ ) ) ) 0 ) 
00390       const BigReal* const slow_i = slow_table + 4*table_i;
00391 
00392 #ifdef ARCH_POWERPC  //Alignment and aliasing constraints
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  //ARCH_POWERPC
00399 
00400 #endif //FULL 
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 //Alignment and aliasing constraints
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 //ARCH_POWERPC
00413 
00414 #endif //FULL
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       ) // ENERGY
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; // unused!
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; // unused!
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    } // for pairlist
00566 

Generated on Mon Nov 23 04:59:19 2009 for NAMD by  doxygen 1.3.9.1