12 #ifndef COMPUTEGBIS_INL 13 #define COMPUTEGBIS_INL 28 #define COULOMB 332.0636f 32 #define TA 0.333333333333333f // 1/3 33 #define TB 0.4f // 2/5 34 #define TC 0.428571428571428f // 3/7 35 #define TD 0.444444444444444f // 4/9 36 #define TE 0.454545454545454f // 5/11 37 #define DA 1.333333333333333f // 4* 1/3 38 #define DB 2.4f // 6* 2/5 39 #define DC 3.428571428571428f // 8* 3/7 40 #define DD 4.444444444444444f // 10*4/9 41 #define DE 5.454545454545454f // 12*5/11 45 float a = 2.f*x+0.02f;;
46 a *= (6.f + a*(3.f + a));
57 (mi < 2.50f ) ? 1.20f :
58 (mi < 5.47f ) ? 1.40f :
59 (mi < 7.98f ) ? 1.82f :
60 (mi < 9.91f ) ? 2.13f :
61 (mi < 11.41f ) ? 2.13f :
62 (mi < 13.01f ) ? 1.70f :
63 (mi < 15.00f ) ? 1.55f :
64 (mi < 17.49f ) ? 1.50f :
65 (mi < 19.58f ) ? 1.50f :
66 (mi < 21.58f ) ? 1.54f :
67 (mi < 23.64f ) ? 2.27f :
68 (mi < 25.64f ) ? 1.73f :
69 (mi < 27.53f ) ? 2.51f :
70 (mi < 29.53f ) ? 2.10f :
71 (mi < 31.52f ) ? 1.85f :
72 (mi < 33.76f ) ? 1.80f :
73 (mi < 37.28f ) ? 1.70f :
74 (mi < 39.29f ) ? 2.75f :
75 (mi < 49.09f ) ? 1.88f :
76 (mi < 61.12f ) ? 1.63f :
77 (mi < 64.46f ) ? 1.40f :
78 (mi < 67.55f ) ? 1.39f :
79 (mi < 71.18f ) ? 1.87f :
80 (mi < 73.78f ) ? 2.19f :
81 (mi < 76.94f ) ? 1.85f :
82 (mi < 79.43f ) ? 1.90f :
83 (mi < 81.85f ) ? 1.85f :
84 (mi < 95.11f ) ? 2.02f :
85 (mi < 107.14f ) ? 1.63f :
86 (mi < 110.14f ) ? 1.72f :
87 (mi < 113.61f ) ? 1.58f :
88 (mi < 116.76f ) ? 1.93f :
89 (mi < 120.24f ) ? 2.17f :
90 (mi < 124.33f ) ? 2.09f :
91 (mi < 127.25f ) ? 1.98f :
92 (mi < 129.45f ) ? 2.06f :
93 (mi < 163.19f ) ? 2.16f :
94 (mi < 196.02f ) ? 1.75f :
95 (mi < 198.78f ) ? 1.66f :
96 (mi < 202.49f ) ? 1.55f :
97 (mi < 205.79f ) ? 1.96f :
98 (mi < 222.61f ) ? 2.02f :
99 (mi < 119.01f ) ? 1.86f :
114 (mi < 1.500f) ? 0.85f :
115 (mi < 12.500f) ? 0.72f :
116 (mi < 14.500f) ? 0.79f :
117 (mi < 16.500f) ? 0.85f :
118 (mi < 19.500f) ? 0.88f :
119 (mi < 31.500f) ? 0.86f :
120 (mi < 32.500f) ? 0.96f :
137 __device__ __forceinline__
void h0 139 static inline void h0 141 (
float r,
float r2,
float ri,
142 float rc,
float r0,
float rs,
float & h ) {
146 __device__ __forceinline__
void dh0 148 static inline void dh0 150 (
float r,
float r2,
float ri,
151 float rc,
float r0,
float rs,
float & dh ) {
156 __device__ __forceinline__
void h1 158 static inline void h1 160 (
float r,
float r2,
float ri,
161 float rc,
float r0,
float rs,
float & h ) {
165 float rmrsi = 1.f/rmrs;
168 float logr = log(rmrs*rci);
169 float rci2 = rci*rci;
170 h = 0.125f*ri*(1.f + 2.f*r*rmrsi + rci2*(r2 - 4.f*rc*r - rs2) + 2.f*logr);
173 __device__ __forceinline__
void dh1 175 static inline void dh1 177 (
float r,
float r2,
float ri,
178 float rc,
float r0,
float rs,
float & dh ) {
182 float rmrsi = 1.f/rmrs;
183 float rmrs2 = rmrs*rmrs;
185 float logr = log(rmrs*rci);
186 float rci2 = rci*rci;
187 dh = ri*ri*(-0.25f*logr - (rc*rc - rmrs2)*(rs2 + r2)*0.125f*rci2*rmrsi*rmrsi);
191 __device__ __forceinline__
void h2 193 static inline void h2 195 (
float r,
float r2,
float ri,
196 float rc,
float r0,
float rs,
float & h ) {
198 float k = rs*ri; k*=k;
199 h = rs*ri*ri*k*(
TA+k*(
TB+k*(
TC+k*(
TD+k*
TE))));
202 __device__ __forceinline__
void dh2 204 static inline void dh2 206 (
float r,
float r2,
float ri,
207 float rc,
float r0,
float rs,
float & dh ) {
209 float k = rs*ri; k*=k;
210 dh = -rs*ri*ri*ri*k*(
DA+k*(
DB+k*(
DC+k*(
DD+k*
DE))));
214 __device__ __forceinline__
void h3 216 static inline void h3 218 (
float r,
float r2,
float ri,
219 float rc,
float r0,
float rs,
float & h ) {
220 float r2mrs2i = 1.f/(r2-rs*rs);
221 h = 0.5f * ( rs*r2mrs2i + 0.5f * log((r-rs)/(r+rs))*ri );
224 __device__ __forceinline__
void dh3 226 static inline void dh3 228 (
float r,
float r2,
float ri,
229 float rc,
float r0,
float rs,
float & dh ) {
231 float r2mrs2i = 1.f/(r2-rs2);
232 dh = -0.25f*ri*(2.f*(r2+rs2)*rs*r2mrs2i*r2mrs2i + ri*log((r-rs)/(r+rs)));
236 __device__ __forceinline__
void h4 238 static inline void h4 240 (
float r,
float r2,
float ri,
241 float rc,
float r0,
float rs,
float & h ) {
246 float rspri = 1.f/(r+rs);
247 float logr = log(r0*rspri);
249 float rilogr = ri*logr;
250 h = 0.25f*( r0i*(2.f- 0.5f*(r0i*ri*(r2 + r02 - rs2))) - rspri + rilogr );
253 __device__ __forceinline__
void dh4 255 static inline void dh4 257 (
float r,
float r2,
float ri,
258 float rc,
float r0,
float rs,
float & dh ) {
263 float rspri = 1.f/(r+rs);
264 float logr = log(r0*rspri);
265 float r02mrs2 = r02-rs2;
266 float rilogr = ri*logr;
267 dh = 0.25f*( (- 0.5f +(r2*r02mrs2 - 2.f*r*rs*rs2+rs2*r02mrs2)
268 * 0.5f *ri2*rspri*rspri)*r0i*r0i - ri*rilogr );
272 __device__ __forceinline__
void h5 274 static inline void h5 276 (
float r,
float r2,
float ri,
277 float rc,
float r0,
float rs,
float & h ) {
279 float r2mrs2i = 1.f/(r2-rs2);
280 float rsr2mrs2i = rs*r2mrs2i;
283 float logr = 0.5f*ri*log(-rmrs/rprs);
284 h = 0.5f*( rsr2mrs2i + 2.f/r0 + logr );
287 __device__ __forceinline__
void dh5 289 static inline void dh5 291 (
float r,
float r2,
float ri,
292 float rc,
float r0,
float rs,
float & dh ) {
294 float r2mrs2i = 1.f/(r2-rs2);
295 float rsr2mrs2i = rs*r2mrs2i;
298 float logr = 0.5f*ri*log(-rmrs/rprs);
299 dh = -0.5f*ri*((rs2+r2)*rsr2mrs2i*r2mrs2i+logr );
303 __device__ __forceinline__
void h6 305 static inline void h6 307 (
float r,
float r2,
float ri,
308 float rc,
float r0,
float rs,
float & h ) {
312 __device__ __forceinline__
void dh6 314 static inline void dh6 316 (
float r,
float r2,
float ri,
317 float rc,
float r0,
float rs,
float & dh ) {
322 __device__ __forceinline__
void CalcH 324 static inline void CalcH 326 (
float r,
float r2,
float ri,
327 float rc,
float r0,
float rs,
float & h,
int & d) {
337 h2(r,r2,ri,rc,r0,rs,h); d = 2;
338 }
else if (r < rc + rs) {
339 h1(r,r2,ri,rc,r0,rs,h); d = 1;
341 h0(r,r2,ri,rc,r0,rs,h); d = 0;
345 h3(r,r2,ri,rc,r0,rs,h); d = 3;
346 }
else if ( r > (r0>rs?r0-rs:rs-r0) ) {
347 h4(r,r2,ri,rc,r0,rs,h); d = 4;
348 }
else if (r0 < rs ) {
349 h5(r,r2,ri,rc,r0,rs,h); d = 5;
351 h6(r,r2,ri,rc,r0,rs,h); d = 6;
356 __device__ __forceinline__
void CalcDH 360 (
float r,
float r2,
float ri,
361 float rc,
float r0,
float rs,
float & dh,
int & d) {
364 dh2(r,r2,ri,rc,r0,rs,dh); d = 2;
365 }
else if (r < rc + rs) {
366 dh1(r,r2,ri,rc,r0,rs,dh); d = 1;
368 dh0(r,r2,ri,rc,r0,rs,dh); d = 0;
372 dh3(r,r2,ri,rc,r0,rs,dh); d = 3;
373 }
else if (r > (r0>rs?r0-rs:rs-r0) ) {
374 dh4(r,r2,ri,rc,r0,rs,dh); d = 4;
375 }
else if (r0 < rs ) {
376 dh5(r,r2,ri,rc,r0,rs,dh); d = 5;
378 dh6(r,r2,ri,rc,r0,rs,dh); d = 6;
383 __device__ __forceinline__
void CalcHPair 401 CalcH(r,r2,ri,rc,ri0,rjs,hij,dij);
402 CalcH(r,r2,ri,rc,rj0,ris,hji,dji);
423 CalcDH(r,r2,ri,rc,ri0,rjs,dhij,dij);
424 CalcDH(r,r2,ri,rc,rj0,ris,dhji,dji);
443 const float & epsilon_p_i,
444 const float & epsilon_s_i,
455 float aiaj4,ddrDij,ddrf_i,ddrfij;
461 expr2aiaj4 = exp(-r2/aiaj4);
462 fij = sqrt(r2+aiaj*expr2aiaj4);
464 expkappa = (kappa > 0.f) ? exp(-kappa*fij) : 1.f;
465 Dij = epsilon_p_i - expkappa*epsilon_s_i;
470 ddrfij = r*f_i*(1.f - 0.25f*expr2aiaj4);
471 ddrf_i = -ddrfij*f_i*f_i;
472 ddrDij = kappa*expkappa*ddrfij*epsilon_s_i;
474 ddrGbE = qiqj*(ddrDij*f_i+Dij*ddrf_i);
492 const float & expkappa,
493 const float & expr2aiaj4,
497 const float & epsilon_s_i,
503 float tmp_dEda = 0.5f*qiqj*f_i*f_i
504 *(kappa*epsilon_s_i*expkappa-Dij*f_i)
505 *(aiaj+0.25f*r2)*expr2aiaj4;
528 const float & epsilon_p_i,
529 const float & epsilon_s_i,
531 const int & doFullElect,
541 float aiaj,expr2aiaj4,fij,f_i,expkappa,Dij;
543 kappa,epsilon_p_i,epsilon_s_i,
544 aiaj,expr2aiaj4,fij,f_i,expkappa,
550 aiaj,expkappa,expr2aiaj4,
551 fij,f_i,Dij,epsilon_s_i,dEdai,dEdaj);
559 static inline void init_gbisTable (
565 float *table = *tablePtr;
567 int numPts = (maxX-minX) * numEntriesPerX;
static void h4(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static void h2(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static void dh0(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static void Phase2_Pair(const float &r, const float &r2, const float &r_i, const float &qiqj, const float &ai, const float &aj, const float &epsilon_p_i, const float &epsilon_s_i, const float &kappa, const int &doFullElect, float &gbEij, float &ddrGbEij, float &dEdai, float &dEdaj)
static void dh3(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static void h5(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static void CalcDHPair(float r, float r2, float ri, float rc, float ri0, float rjs, float rj0, float ris, int &dij, int &dji, float &dhij, float &dhji)
static void dh1(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static void h1(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static void CalcDH(float r, float r2, float ri, float rc, float r0, float rs, float &dh, int &d)
static void dh5(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static void Calc_dEdr_Pair(const float &r, const float &r2, const float &qiqj, const float &ai, const float &aj, const float &kappa, const float &epsilon_p_i, const float &epsilon_s_i, float &aiaj, float &expr2aiaj4, float &fij, float &f_i, float &expkappa, float &Dij, float &gbE, float &ddrGbE)
static void dh2(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static void h3(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static void CalcHPair(float r, float r2, float ri, float rc, float ri0, float rjs, float rj0, float ris, int &dij, int &dji, float &hij, float &hji)
static void h6(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static float MassToRadius(Mass mi)
static float MassToScreen(Mass mi)
static void CalcH(float r, float r2, float ri, float rc, float r0, float rs, float &h, int &d)
static void h0(float r, float r2, float ri, float rc, float r0, float rs, float &h)
static void dh6(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static void Calc_dEda_Pair(const float &r2, const float &ai, const float &aj, const float &qiqj, const float &kappa, const float &aiaj, const float &expkappa, const float &expr2aiaj4, const float &fij, const float &f_i, const float &Dij, const float &epsilon_s_i, float &dEdai, float &dEdaj)
static void dh4(float r, float r2, float ri, float rc, float r0, float rs, float &dh)
static float FastTanH(float x)