CLASS MANUAL
hermite4_interpolation_csource.h
1 
10 int l = pHIS->l[lnum];
11 double ym=0, yp=0, dym=0, dyp=0, x;
12 double z[3]={0.,0.,0.};
13 #ifdef HERMITE_DO_PHI
14 double a[3]={0.,0.,0.};
15 #endif
16 #ifdef HERMITE_DO_DPHI
17 double b[3]={0.,0.,0.};
18 #endif
19 #ifdef HERMITE_DO_D2PHI
20 double c[3]={0.,0.,0.};
21 double d3ym=0, d3yp=0;
22 #endif
23 #if defined (HERMITE_DO_DPHI) || defined (HERMITE_DO_D2PHI)
24 double *sinK = pHIS->sinK;
25 double *cotK = pHIS->cotK;
26 double cotKm=0,cotKp=0,sinKm=0,sinKp=0;
27 double sinKm2, sinKp2;
28 double d2ym = 0, d2yp=0;
29 int K = pHIS->K;
30 double lxlp1 = l*(l+1.0);
31 double beta = pHIS->beta;
32 double beta2 = beta*beta;
33 #endif
34 double *xvec;
35 double xmin, xmax, deltax;
36 double left_border, right_border, next_border;
37 int j, nx, current_border_idx=0;
38 double *Phi_l, *dPhi_l;
39 int phisign = 1, dphisign = 1;
40 
46 xvec = pHIS->x;
47 deltax = pHIS->delta_x;
48 nx = pHIS->x_size;
49 Phi_l = pHIS->phi+lnum*nx;
50 dPhi_l = pHIS->dphi+lnum*nx;
51 
52 xmin = xvec[0];
53 xmax = xvec[nx-1];
54 
55 left_border = xmax;
56 right_border = xmin;
57 next_border = xmin;
58 
59 for (j=0; j<nxi; j++){
60  x = xinterp[j];
61  //take advantage of periodicity of functions in closed case
62  if (pHIS->K==1)
63  ClosedModY(l, (int)(pHIS->beta+0.2), &x, &phisign, &dphisign);
64  //Loop over output values
65  if ((x<xmin)||(x>xmax)){
66  //Outside interpolation region, set to zero.
67 #ifdef HERMITE_DO_PHI
68  Phi[j] = 0.0;
69 #endif
70 #ifdef HERMITE_DO_DPHI
71  dPhi[j] = 0.0;
72 #endif
73 #ifdef HERMITE_DO_D2PHI
74  d2Phi[j] = 0.0;
75 #endif
76  continue;
77  }
78  if ((x>right_border)||(x<left_border)){
79  if ((x>next_border)||(x<left_border)){
80  current_border_idx = ((int) ((x-xmin)/deltax))+1;
81  current_border_idx = MAX(1,current_border_idx);
82  current_border_idx = MIN(nx-1,current_border_idx);
83  //printf("Current border index at jump: %d\n",current_border_idx);
84  //max operation takes care of case x = xmin,
85  //min operation takes care of case x = xmax.
86  //Calculate left derivatives:
87  ym = Phi_l[current_border_idx-1];
88  dym = dPhi_l[current_border_idx-1];
89 #if defined HERMITE_DO_DPHI || defined HERMITE_DO_D2PHI
90  cotKm = cotK[current_border_idx-1];
91  sinKm = sinK[current_border_idx-1];
92  sinKm2 = sinKm*sinKm;
93  d2ym = -2*dym*cotKm+ym*(lxlp1/sinKm2-beta2+K);
94 #endif
95 #ifdef HERMITE_DO_D2PHI
96  d3ym = -2*cotKm*d2ym-2*ym*lxlp1*cotKm/sinKm2+
97  dym*(K-beta2+(2+lxlp1)/sinKm2);
98 #endif
99  }
100  else{
101  //x>current_border but not next border: I have moved to next block.
102  current_border_idx++;
103  //printf("Current border index at else: %d\n",current_border_idx);
104  //Copy former right derivatives to left derivatives.
105  ym = yp;
106  dym = dyp;
107 #if defined HERMITE_DO_DPHI || defined HERMITE_DO_D2PHI
108  d2ym = d2yp;
109  sinKm = sinKp;
110  cotKm = cotKp;
111 #endif
112 #ifdef HERMITE_DO_D2PHI
113  d3ym = d3yp;
114 #endif
115  }
116  left_border = xvec[MAX(0,current_border_idx-1)];
117  right_border = xvec[current_border_idx];
118  next_border = xvec[MIN(nx-1,current_border_idx+1)];
119  //Evaluate right derivatives and calculate coefficients:
120  yp = Phi_l[current_border_idx];
121  dyp = dPhi_l[current_border_idx];
122 #if defined HERMITE_DO_DPHI || defined HERMITE_DO_D2PHI
123  cotKp = cotK[current_border_idx];
124  sinKp = sinK[current_border_idx];
125  sinKp2 = sinKp*sinKp;
126  d2yp = -2*dyp*cotKp+yp*(lxlp1/sinKp2-beta2+K);
127 #endif
128 #ifdef HERMITE_DO_D2PHI
129  d3yp = -2*cotKp*d2yp-2*yp*lxlp1*cotKp/sinKp2+
130  dyp*(K-beta2+(2+lxlp1)/sinKp2);
131 #endif
132 
133 #ifdef HERMITE_DO_PHI
134  a[0] = dym*deltax;
135  a[1] = -2*dym*deltax-dyp*deltax-3*ym+3*yp;
136  a[2] = dym*deltax+dyp*deltax+2*ym-2*yp;
137 #endif
138 #ifdef HERMITE_DO_DPHI
139  b[0] = d2ym*deltax;
140  b[1] = -2*d2ym*deltax-d2yp*deltax-3*dym+3*dyp;
141  b[2] = d2ym*deltax+d2yp*deltax+2*dym-2*dyp;
142 #endif
143 #ifdef HERMITE_DO_D2PHI
144  c[0] = d3ym*deltax;
145  c[1] = -2*d3ym*deltax-d3yp*deltax-3*d2ym+3*d2yp;
146  c[2] = d3ym*deltax+d3yp*deltax+2*d2ym-2*d2yp;
147 #endif
148  }
149  //Evaluate polynomial:
150  z[0] = (x-left_border)/deltax;
151  z[1] = z[0]*z[0];
152  z[2] = z[1]*z[0];
153 #ifdef HERMITE_DO_PHI
154  Phi[j] = (ym+a[0]*z[0]+a[1]*z[1]+a[2]*z[2])*phisign;
155 #endif
156 #ifdef HERMITE_DO_DPHI
157  dPhi[j] = (dym+b[0]*z[0]+b[1]*z[1]+b[2]*z[2])*dphisign;
158 #endif
159 #ifdef HERMITE_DO_D2PHI
160  d2Phi[j] = (d2ym+c[0]*z[0]+c[1]*z[1]+c[2]*z[2])*phisign;
161 #endif
162  }
163