NAMD
LjPmeBase.h
Go to the documentation of this file.
1 
7 #ifndef LJ_PME_BASE_H__
8 #define LJ_PME_BASE_H__
9 
10 #include <math.h>
11 
12 #ifndef M_PI
13 #define M_PI 3.14159265358979323846
14 #endif
15 
16 #ifndef SQRT_PI
17 #define SQRT_PI 1.7724538509055160273 /* mathematica 15 digits*/
18 #endif
19 
20 struct LjPmeGrid {
21  int K1, K2, K3;
22  int dim2, dim3;
23  int order;
24  int block1, block2;
25 };
26 
27 template <int order>
28 static inline void compute_LjPme_b_spline(double *frac, double *M, double *dM){
29  int j, n;
30  double x,y,z,x1,y1,z1, div;
31  double *Mx, *My, *Mz, *dMx, *dMy, *dMz;
32  Mx=M-1; My=M+order-1; Mz=M+2*order-1;
33  dMx=dM-1; dMy =dM+order-1; dMz=dM+2*order-1;
34  x=frac[0];
35  y=frac[1];
36  z=frac[2];
37  x1=1.0-x; y1=1.0-y; z1=1.0-z;
38  /* Do n=3 case first */
39  Mx[1]=.5*x1*x1;
40  Mx[2]=x1*x + .5;
41  Mx[3]=0.5*x*x;
42  Mx[order]=0.0;
43  My[1]=.5*y1*y1;
44  My[2]=y1*y + .5;
45  My[3]=0.5*y*y;
46  My[order]=0.0;
47  Mz[1]=.5*z1*z1;
48  Mz[2]=z1*z + .5;
49  Mz[3]=0.5*z*z;
50  Mz[order]=0.0;
51 
52  /* Recursively fill in the rest. */
53  for (n=4; n<=order-1; n++) {
54  double div=1.0/(n-1);
55  int j;
56  Mx[n] = x*div*Mx[n-1];
57  My[n] = y*div*My[n-1];
58  Mz[n] = z*div*Mz[n-1];
59  for (j=1; j<=n-2; j++) {
60  Mx[n-j] = ((x+j)*Mx[n-j-1] + (n-x-j)*Mx[n-j])*div;
61  My[n-j] = ((y+j)*My[n-j-1] + (n-y-j)*My[n-j])*div;
62  Mz[n-j] = ((z+j)*Mz[n-j-1] + (n-z-j)*Mz[n-j])*div;
63  }
64  Mx[1] *= (1.0-x)*div;
65  My[1] *= (1.0-y)*div;
66  Mz[1] *= (1.0-z)*div;
67  }
68  /* Now do the derivatives */
69  dMx[1]=-Mx[1]; dMy[1]=-My[1]; dMz[1]=-Mz[1];
70  for (j=2; j <= order; j++) {
71  dMx[j] = Mx[j-1] - Mx[j];
72  dMy[j] = My[j-1] - My[j];
73  dMz[j] = Mz[j-1] - Mz[j];
74  }
75  /* Now finish the job! */
76  div=1.0/(order-1);
77  Mx[order] = x*div*Mx[order-1];
78  My[order] = y*div*My[order-1];
79  Mz[order] = z*div*Mz[order-1];
80  for (j=1; j<=order-2; j++) {
81  Mx[order-j] = ((x+j)*Mx[order-j-1] + (order-x-j)*Mx[order-j])*div;
82  My[order-j] = ((y+j)*My[order-j-1] + (order-y-j)*My[order-j])*div;
83  Mz[order-j] = ((z+j)*Mz[order-j-1] + (order-z-j)*Mz[order-j])*div;
84  }
85  Mx[1] *= (1.0-x)*div;
86  My[1] *= (1.0-y)*div;
87  Mz[1] *= (1.0-z)*div;
88 }
89 
90 #endif
int dim2
Definition: LjPmeBase.h:22
int dim3
Definition: LjPmeBase.h:22
#define order
Definition: PmeRealSpace.C:235
int K3
Definition: LjPmeBase.h:21
int block2
Definition: LjPmeBase.h:24
int block1
Definition: LjPmeBase.h:24
int K1
Definition: LjPmeBase.h:21
static void compute_LjPme_b_spline(double *frac, double *M, double *dM)
Definition: LjPmeBase.h:28
int K2
Definition: LjPmeBase.h:21
int order
Definition: LjPmeBase.h:23