NAMD
Functions
CudaComputeNonbondedInteractions.h File Reference
#include "CudaUtils.h"

Go to the source code of this file.

Functions

template<bool doEnergy>
__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)
 
template<bool doEnergy>
__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)
 
template<bool doEnergy>
__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)
 
template<bool doEnergy>
__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)
 
template<bool doEnergy>
__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)
 
template<bool doEnergy, bool doSlow>
__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)
 
template<bool doEnergy>
__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)
 

Function Documentation

◆ cudaModExclForce_PMESlow_C1()

template<bool doEnergy>
__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 
)

Definition at line 170 of file CudaComputeNonbondedInteractions.h.

References CudaNBConstants::e_0, CudaNBConstants::e_1, and CudaNBConstants::e_2.

175  {
176  const float elec_slow = -1.0f * c.e_0;
177  f_elec = charge * elec_slow;
178 
179  if (doEnergy) {
180  float slow_energy = 0.5f * c.e_2 * (3.0f - r2 * c.e_1);
181  energySlow += charge * slow_energy;
182  }
183 }

◆ cudaModExclForceMagCalc_VdwEnergySwitch_PMEC1()

template<bool doEnergy>
__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 
)

Definition at line 223 of file CudaComputeNonbondedInteractions.h.

228  {
229 
230  const float rinv2 = rinv * rinv;
231  const float rinv3 = rinv * rinv2;
232  const float rinv6 = rinv3 * rinv3;
233  const float rinv8 = rinv6 * rinv2;
234 
235  float f_vdw;
236  cudaNBForce_Vdw_EnergySwitch<doEnergy>(r2, rinv6, rinv8, ljab, c, f_vdw, energyVdw);
237  // Sign corrections. The force tables are flipped and exclusions kernel uses xyz.i - xyz.j while
238  // the nonbonded kernel uses xyz.j - xyz.i
239  f = -1.0f * f_vdw;
240 
241  // Electrostatics
242  if (doElec) {
243  float f_elec;
244  cudaNBForce_PMEFast_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, f_elec, energyElec);
245 
246  f += f_elec;
247  energyElec *= -1.0f;
248 
249  if (doSlow) {
250  cudaModExclForce_PMESlow_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, fSlow, energySlow);
251  energySlow *= -1.0f;
252  }
253  }
254 }

◆ cudaNBForce_PMEFast_C1()

template<bool doEnergy>
__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 
)

Definition at line 109 of file CudaComputeNonbondedInteractions.h.

References CudaNBConstants::e_0, CudaNBConstants::e_1, and CudaNBConstants::e_2.

114  {
115  const float elec_fast = -1.0f * rinv3 + c.e_0;
116  f_elec = charge * elec_fast;
117 
118  if (doEnergy) {
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;
122  }
123 }

◆ cudaNBForce_PMESlow_C1()

template<bool doEnergy>
__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 
)

Definition at line 133 of file CudaComputeNonbondedInteractions.h.

References CudaNBConstants::e_0, CudaNBConstants::e_1, CudaNBConstants::e_2, CudaNBConstants::ewald_0, and CudaNBConstants::ewald_1.

138  {
139  fSlow = charge;
140 
141  const float r = sqrtf(r2);
142  const float elec_a = r * c.ewald_0;
143  // very expensive
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;
147 
148  const float elec_slow = -1.0f * c.e_0 * r;
149  const float scor_grad = (elec_slow - (corr_grad - 1.0f) * rinv2)*rinv;
150 
151  if (doEnergy) {
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;
156  }
157 
158  fSlow *= scor_grad;
159 }

◆ cudaNBForce_PMESlowAndFast_C1()

template<bool doEnergy>
__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 
)

Definition at line 73 of file CudaComputeNonbondedInteractions.h.

References CudaNBConstants::e_0, CudaNBConstants::e_1, CudaNBConstants::e_2, CudaNBConstants::ewald_0, CudaNBConstants::ewald_1, and CudaNBConstants::slowScale.

78  {
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;
85 
86  const float elec_slow = -1.0f * c.e_0 * r;
87  const float scor_grad = (elec_slow - (corr_grad - 1.0f) * rinv2)*rinv;
88 
89  if (doEnergy) {
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;
96  }
97  f_elec = charge * (elec_fast + scor_grad * c.slowScale);
98 }

◆ cudaNBForce_Vdw_EnergySwitch()

template<bool doEnergy>
__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 
)

Definition at line 39 of file CudaComputeNonbondedInteractions.h.

References CudaNBConstants::lj_0, CudaNBConstants::lj_1, CudaNBConstants::lj_2, CudaNBConstants::lj_3, CudaNBConstants::lj_4, and CudaNBConstants::lj_5.

41  {
42 
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;
46 
47  float e_vdw;
48 
49  if (r2 > c.lj_5) {
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;
55  } else {
56  f_vdw = dw_r;
57  if (doEnergy) e_vdw = w;
58  }
59 
60  if (doEnergy) energyVdw += e_vdw;
61 }

◆ cudaNBForceMagCalc_VdwEnergySwitch_PMEC1()

template<bool doEnergy, bool doSlow>
__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 
)

Definition at line 192 of file CudaComputeNonbondedInteractions.h.

195  {
196 
197  const float rinv2 = rinv * rinv;
198  const float rinv3 = rinv * rinv2;
199  const float rinv6 = rinv3 * rinv3;
200  const float rinv8 = rinv6 * rinv2;
201 
202  float f_vdw;
203  cudaNBForce_Vdw_EnergySwitch<doEnergy>(r2, rinv6, rinv8, ljab, c, f_vdw, energyVdw);
204 
205  // Electrostatics
206  float f_elec;
207  if (!doSlow) {
208  cudaNBForce_PMEFast_C1<doEnergy>(r2, rinv, rinv2, rinv3, charge, c, f_elec, energyElec);
209  } else {
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);
212  }
213  f = f_elec + f_vdw;
214 }