1 #ifndef CUDACOMPUTENONBONDEDINTERACTIONS_H 2 #define CUDACOMPUTENONBONDEDINTERACTIONS_H 6 #if defined(NAMD_CUDA) || defined(NAMD_HIP) 37 template<
bool doEnergy>
38 __device__ __forceinline__
41 float& f_vdw,
float& energyVdw) {
43 const float ab_r6 = ljab.x * rinv6 - ljab.y;
44 const float w = ab_r6 * rinv6;
45 const float dw_r = (ljab.x * rinv6 + ab_r6) * -6.0f * rinv8;
50 const float delta_r = (c.
lj_4 - r2);
51 const float s = delta_r * delta_r * (c.
lj_0 + c.
lj_1 * r2);
52 const float ds_r = delta_r * (c.
lj_3 + c.
lj_2 * r2);
53 f_vdw = w * ds_r + dw_r * s;
54 if (doEnergy) e_vdw = w * s;
57 if (doEnergy) e_vdw = w;
60 if (doEnergy) energyVdw += e_vdw;
71 template<
bool doEnergy>
72 __device__ __forceinline__
74 const float rinv2,
const float rinv3,
77 float& f_elec,
float& energyElec,
float& energySlow
79 const float elec_fast = -1.0f * rinv3 + c.
e_0;
80 const float r = sqrtf(r2);
81 const float elec_a = r * c.
ewald_0;
82 const float elec_exp = expf(-1.0f * elec_a * elec_a);
83 const float elec_b = erfcf(elec_a);
84 const float corr_grad = elec_b + c.
ewald_1 * r * elec_exp;
86 const float elec_slow = -1.0f * c.
e_0 * r;
87 const float scor_grad = (elec_slow - (corr_grad - 1.0f) * rinv2)*rinv;
90 float slow_energy = 0.5f * c.
e_2 * (3.0f - r2 * c.
e_1);
91 float fast_energy = rinv - slow_energy;
92 energyElec += charge * fast_energy;
93 const float corr_energy = elec_b;
94 const float scor_energy = slow_energy + (corr_energy - 1.0f) * rinv;
95 energySlow += charge * scor_energy;
97 f_elec = charge * (elec_fast + scor_grad * c.
slowScale);
107 template<
bool doEnergy>
108 __device__ __forceinline__
110 const float rinv2,
const float rinv3,
113 float& f_elec,
float& energyElec
115 const float elec_fast = -1.0f * rinv3 + c.
e_0;
116 f_elec = charge * elec_fast;
119 float slow_energy = 0.5f * c.
e_2 * (3.0f - r2 * c.
e_1);
120 float fast_energy = rinv - slow_energy;
121 energyElec += charge * fast_energy;
131 template<
bool doEnergy>
132 __device__ __forceinline__
134 const float rinv2,
const float rinv3,
137 float& fSlow,
float& energySlow
141 const float r = sqrtf(r2);
142 const float elec_a = r * c.
ewald_0;
144 const float elec_b = erfcf(elec_a);
145 const float elec_exp = expf(-1.0f * elec_a * elec_a);
146 const float corr_grad = elec_b + c.
ewald_1 * r * elec_exp;
148 const float elec_slow = -1.0f * c.
e_0 * r;
149 const float scor_grad = (elec_slow - (corr_grad - 1.0f) * rinv2)*rinv;
152 float slow_energy = 0.5f * c.
e_2 * (3.0f - r2 * c.
e_1);
153 const float corr_energy = elec_b;
154 const float scor_energy = slow_energy + (corr_energy - 1.0f) * rinv;
155 energySlow += fSlow * scor_energy;
168 template<
bool doEnergy>
169 __device__ __forceinline__
171 const float rinv2,
const float rinv3,
174 float& f_elec,
float& energySlow
176 const float elec_slow = -1.0f * c.
e_0;
177 f_elec = charge * elec_slow;
180 float slow_energy = 0.5f * c.
e_2 * (3.0f - r2 * c.
e_1);
181 energySlow += charge * slow_energy;
190 template<
bool doEnergy,
bool doSlow>
191 __device__ __forceinline__
194 float& f,
float& fSlow,
195 float& energyVdw,
float& energyElec,
float& energySlow) {
197 const float rinv2 = rinv * rinv;
198 const float rinv3 = rinv * rinv2;
199 const float rinv6 = rinv3 * rinv3;
200 const float rinv8 = rinv6 * rinv2;
203 cudaNBForce_Vdw_EnergySwitch<doEnergy>(r2, rinv6, rinv8, ljab, c, f_vdw, energyVdw);
208 cudaNBForce_PMEFast_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, f_elec, energyElec);
210 cudaNBForce_PMEFast_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, f_elec, energyElec);
211 cudaNBForce_PMESlow_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, fSlow, energySlow);
221 template<
bool doEnergy>
222 __device__ __forceinline__
224 const int doSlow,
const int doElec,
225 const float r2,
const float rinv,
227 float& f,
float& fSlow,
228 float& energyVdw,
float& energyElec,
float& energySlow) {
230 const float rinv2 = rinv * rinv;
231 const float rinv3 = rinv * rinv2;
232 const float rinv6 = rinv3 * rinv3;
233 const float rinv8 = rinv6 * rinv2;
236 cudaNBForce_Vdw_EnergySwitch<doEnergy>(r2, rinv6, rinv8, ljab, c, f_vdw, energyVdw);
244 cudaNBForce_PMEFast_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, f_elec, energyElec);
250 cudaModExclForce_PMESlow_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, fSlow, energySlow);
258 #endif // CUDACOMPUTENONBONDEDINTERACTIONS_H
__device__ __forceinline__ void cudaNBForce_PMEFast_C1(const float r2, const float rinv, const float rinv2, const float rinv3, const float charge, const CudaNBConstants c, float &f_elec, float &energyElec)
__device__ __forceinline__ void cudaNBForceMagCalc_VdwEnergySwitch_PMEC1(const float r2, const float rinv, const float charge, const float2 ljab, const CudaNBConstants c, float &f, float &fSlow, float &energyVdw, float &energyElec, float &energySlow)
__device__ __forceinline__ void cudaNBForce_PMESlowAndFast_C1(const float r2, const float rinv, const float rinv2, const float rinv3, const float charge, const CudaNBConstants c, float &f_elec, float &energyElec, float &energySlow)
__device__ __forceinline__ void cudaModExclForce_PMESlow_C1(const float r2, const float rinv, const float rinv2, const float rinv3, const float charge, const CudaNBConstants c, float &f_elec, float &energySlow)
__device__ __forceinline__ void cudaNBForce_Vdw_EnergySwitch(const float r2, const float rinv6, const float rinv8, const float2 ljab, const CudaNBConstants c, float &f_vdw, float &energyVdw)
__device__ __forceinline__ void cudaNBForce_PMESlow_C1(const float r2, const float rinv, const float rinv2, const float rinv3, const float charge, const CudaNBConstants c, float &fSlow, float &energySlow)
__device__ __forceinline__ void cudaModExclForceMagCalc_VdwEnergySwitch_PMEC1(const int doSlow, const int doElec, const float r2, const float rinv, const float charge, const float2 ljab, const CudaNBConstants c, float &f, float &fSlow, float &energyVdw, float &energyElec, float &energySlow)