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)