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