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