NAMD
Classes | Macros | Functions
LjPmeBase.h File Reference
#include <math.h>

Go to the source code of this file.

Classes

struct  LjPmeGrid
 

Macros

#define M_PI   3.14159265358979323846
 
#define SQRT_PI   1.7724538509055160273 /* mathematica 15 digits*/
 

Functions

template<int order>
static void compute_LjPme_b_spline (double *frac, double *M, double *dM)
 

Macro Definition Documentation

◆ M_PI

#define M_PI   3.14159265358979323846

Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 by The Board of Trustees of the University of Illinois. All rights reserved.

Definition at line 13 of file LjPmeBase.h.

◆ SQRT_PI

#define SQRT_PI   1.7724538509055160273 /* mathematica 15 digits*/

Definition at line 17 of file LjPmeBase.h.

Function Documentation

◆ compute_LjPme_b_spline()

template<int order>
static void compute_LjPme_b_spline ( double *  frac,
double *  M,
double *  dM 
)
inlinestatic

Definition at line 28 of file LjPmeBase.h.

References order.

28  {
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 }
#define order
Definition: PmeRealSpace.C:235