31 basis->periodic = periodic;
33 basis->xVals =
new double[N+5];
34 basis->dxInv =
new double[3*(N+2)];
35 for (
int i=0; i<N; i++)
36 basis->xVals[i+2] = grid->
points[i];
41 basis->xVals[0] = g[ 0 ] - 2.0*(g[1]-g[0]);
42 basis->xVals[1] = g[ 0 ] - 1.0*(g[1]-g[0]);
43 basis->xVals[N+2] = g[N-1] + 1.0*(g[N-1]-g[N-2]);
44 basis->xVals[N+3] = g[N-1] + 2.0*(g[N-1]-g[N-2]);
45 basis->xVals[N+4] = g[N-1] + 3.0*(g[N-1]-g[N-2]);
48 basis->xVals[1] = g[ 0 ] - (g[N-1] - g[N-2]);
49 basis->xVals[0] = g[ 0 ] - (g[N-1] - g[N-3]);
50 basis->xVals[N+2] = g[N-1] + (g[ 1 ] - g[ 0 ]);
51 basis->xVals[N+3] = g[N-1] + (g[ 2 ] - g[ 0 ]);
52 basis->xVals[N+4] = g[N-1] + (g[ 3 ] - g[ 0 ]);
54 for (
int i=0; i<N+2; i++)
55 for (
int j=0; j<3; j++)
57 1.0/(basis->xVals[i+j+1]-basis->xVals[i]);
64 delete[] (basis->
xVals);
65 delete[] (basis->
dxInv);
75 int i = (*basis->grid->reverse_map)(basis->grid, x);
77 double*
restrict dxInv = basis->dxInv;
78 double*
restrict xVals = basis->xVals;
80 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
81 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
82 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
83 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
84 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
85 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
86 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
87 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
88 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
89 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
90 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
91 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
102 double x = basis->grid->points[i];
103 double*
restrict dxInv = basis->dxInv;
104 double*
restrict xVals = basis->xVals;
106 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
107 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
108 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
109 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
110 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
111 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
112 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
113 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
114 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
115 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
116 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
117 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
122 float bfuncs[4],
float dbfuncs[4])
125 int i = (*basis->grid->reverse_map)(basis->grid, x);
127 double*
restrict dxInv = basis->dxInv;
128 double*
restrict xVals = basis->xVals;
130 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
131 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
132 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
133 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
134 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
135 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
136 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
137 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
138 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
139 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
140 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
141 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
143 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
144 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
145 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
146 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
154 float bfuncs[4],
float dbfuncs[4])
157 double x = basis->grid->points[i];
159 double*
restrict dxInv = basis->dxInv;
160 double*
restrict xVals = basis->xVals;
162 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
163 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
164 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
165 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
166 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
167 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
168 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
169 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
170 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
171 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
172 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
173 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
175 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
176 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
177 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
178 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
184 float bfuncs[4],
float dbfuncs[4],
float d2bfuncs[4])
187 int i = (*basis->grid->reverse_map)(basis->grid, x);
189 double*
restrict dxInv = basis->dxInv;
190 double*
restrict xVals = basis->xVals;
192 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
193 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
194 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
195 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
196 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
197 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
198 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
199 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
200 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
201 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
202 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
203 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
205 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
206 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
207 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
208 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
210 d2bfuncs[0] = 6.0f * (+dxInv[3*(i+0)+2]* dxInv[3*(i+1)+1]*b1[0]);
211 d2bfuncs[1] = 6.0f * (-dxInv[3*(i+1)+1]*(dxInv[3*(i+0)+2]+dxInv[3*(i+1)+2])*b1[0] +
212 dxInv[3*(i+1)+2]* dxInv[3*(i+2)+1]*b1[1]);
213 d2bfuncs[2] = 6.0f * (+dxInv[3*(i+1)+2]* dxInv[3*(i+1)+1]*b1[0] -
214 dxInv[3*(i+2)+1]*(dxInv[3*(i+1)+2] + dxInv[3*(i+2)+2])*b1[1]);
215 d2bfuncs[3] = 6.0f * (+dxInv[3*(i+2)+2]* dxInv[3*(i+2)+1]*b1[1]);
223 float bfuncs[4],
float dbfuncs[4],
float d2bfuncs[4])
226 double x = basis->grid->points[i];
228 double*
restrict dxInv = basis->dxInv;
229 double*
restrict xVals = basis->xVals;
231 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
232 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
233 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
234 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
235 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
236 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
237 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
238 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
239 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
240 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
241 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
242 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
244 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
245 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
246 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
247 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
249 d2bfuncs[0] = 6.0f * (+dxInv[3*(i+0)+2]* dxInv[3*(i+1)+1]*b1[0]);
250 d2bfuncs[1] = 6.0f * (-dxInv[3*(i+1)+1]*(dxInv[3*(i+0)+2]+dxInv[3*(i+1)+2])*b1[0] +
251 dxInv[3*(i+1)+2]* dxInv[3*(i+2)+1]*b1[1]);
252 d2bfuncs[2] = 6.0f * (+dxInv[3*(i+1)+2]* dxInv[3*(i+1)+1]*b1[0] -
253 dxInv[3*(i+2)+1]*(dxInv[3*(i+1)+2] + dxInv[3*(i+2)+2])*b1[1]);
254 d2bfuncs[3] = 6.0f * (+dxInv[3*(i+2)+2]* dxInv[3*(i+2)+1]*b1[1]);
266 int i = (*basis->grid->reverse_map)(basis->grid, x);
268 double*
restrict dxInv = basis->dxInv;
269 double*
restrict xVals = basis->xVals;
271 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
272 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
273 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
274 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
275 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
276 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
277 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
278 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
279 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
280 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
281 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
282 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
293 double x = basis->grid->points[i];
294 double*
restrict dxInv = basis->dxInv;
295 double*
restrict xVals = basis->xVals;
297 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
298 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
299 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
300 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
301 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
302 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
303 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
304 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
305 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
306 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
307 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
308 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
313 double bfuncs[4],
double dbfuncs[4])
316 int i = (*basis->grid->reverse_map)(basis->grid, x);
318 double*
restrict dxInv = basis->dxInv;
319 double*
restrict xVals = basis->xVals;
321 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
322 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
323 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
324 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
325 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
326 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
327 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
328 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
329 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
330 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
331 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
332 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
334 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
335 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
336 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
337 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
345 double bfuncs[4],
double dbfuncs[4])
348 double x = basis->grid->points[i];
350 double*
restrict dxInv = basis->dxInv;
351 double*
restrict xVals = basis->xVals;
353 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
354 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
355 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
356 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
357 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
358 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
359 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
360 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
361 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
362 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
363 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
364 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
366 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
367 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
368 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
369 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
375 double bfuncs[4],
double dbfuncs[4],
double d2bfuncs[4])
378 int i = (*basis->grid->reverse_map)(basis->grid, x);
380 double*
restrict dxInv = basis->dxInv;
381 double*
restrict xVals = basis->xVals;
383 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
384 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
385 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
386 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
387 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
388 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
389 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
390 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
391 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
392 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
393 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
394 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
396 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
397 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
398 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
399 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
401 d2bfuncs[0] = 6.0f * (+dxInv[3*(i+0)+2]* dxInv[3*(i+1)+1]*b1[0]);
402 d2bfuncs[1] = 6.0f * (-dxInv[3*(i+1)+1]*(dxInv[3*(i+0)+2]+dxInv[3*(i+1)+2])*b1[0] +
403 dxInv[3*(i+1)+2]* dxInv[3*(i+2)+1]*b1[1]);
404 d2bfuncs[2] = 6.0f * (+dxInv[3*(i+1)+2]* dxInv[3*(i+1)+1]*b1[0] -
405 dxInv[3*(i+2)+1]*(dxInv[3*(i+1)+2] + dxInv[3*(i+2)+2])*b1[1]);
406 d2bfuncs[3] = 6.0f * (+dxInv[3*(i+2)+2]* dxInv[3*(i+2)+1]*b1[1]);
414 double bfuncs[4],
double dbfuncs[4],
418 double x = basis->grid->points[i];
420 double*
restrict dxInv = basis->dxInv;
421 double*
restrict xVals = basis->xVals;
423 b1[0] = (xVals[i2+1]-x) * dxInv[3*(i+2)+0];
424 b1[1] = (x-xVals[i2]) * dxInv[3*(i+2)+0];
425 b2[0] = (xVals[i2+1]-x) * dxInv[3*(i+1)+1] * b1[0];
426 b2[1] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
427 (xVals[i2+2]-x) * dxInv[3*(i+2)+1] * b1[1]);
428 b2[2] = (x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
429 bfuncs[0] = (xVals[i2+1]-x) * dxInv[3*(i )+2] * b2[0];
430 bfuncs[1] = ((x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
431 (xVals[i2+2]-x) * dxInv[3*(i+1)+2] * b2[1]);
432 bfuncs[2] = ((x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
433 (xVals[i2+3]-x) * dxInv[3*(i+2)+2] * b2[2]);
434 bfuncs[3] = (x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
436 dbfuncs[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
437 dbfuncs[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
438 dbfuncs[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
439 dbfuncs[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
441 d2bfuncs[0] = 6.0f * (+dxInv[3*(i+0)+2]* dxInv[3*(i+1)+1]*b1[0]);
442 d2bfuncs[1] = 6.0f * (-dxInv[3*(i+1)+1]*(dxInv[3*(i+0)+2]+dxInv[3*(i+1)+2])*b1[0] +
443 dxInv[3*(i+1)+2]* dxInv[3*(i+2)+1]*b1[1]);
444 d2bfuncs[2] = 6.0f * (+dxInv[3*(i+1)+2]* dxInv[3*(i+1)+1]*b1[0] -
445 dxInv[3*(i+2)+1]*(dxInv[3*(i+1)+2] + dxInv[3*(i+2)+2])*b1[1]);
446 d2bfuncs[3] = 6.0f * (+dxInv[3*(i+2)+2]* dxInv[3*(i+2)+1]*b1[1]);
468 int i = (*basis->grid->reverse_map)(basis->grid, x);
470 double*
restrict dxInv = basis->dxInv;
471 double*
restrict xVals = basis->xVals;
476 b1[0] = (xVals[i2+1]-
x) * dxInv[3*(i+2)+0];
477 b1[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+0];
478 b2[0] = (xVals[i2+1]-
x) * dxInv[3*(i+1)+1] * b1[0];
479 b2[1] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
480 (xVals[i2+2]-
x) * dxInv[3*(i+2)+1] * b1[1]);
481 b2[2] = (
x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
482 bfuncs.s[0] = (xVals[i2+1]-
x) * dxInv[3*(i )+2] * b2[0];
483 bfuncs.s[1] = ((
x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
484 (xVals[i2+2]-
x) * dxInv[3*(i+1)+2] * b2[1]);
485 bfuncs.s[2] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
486 (xVals[i2+3]-
x) * dxInv[3*(i+2)+2] * b2[2]);
487 bfuncs.s[3] = (
x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
497 int i = (*basis->grid->reverse_map)(basis->grid, x);
499 double*
restrict dxInv = basis->dxInv;
500 double*
restrict xVals = basis->xVals;
501 uvec4 bfuncs, dbfuncs;
504 b1[0] = (xVals[i2+1]-
x) * dxInv[3*(i+2)+0];
505 b1[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+0];
506 b2[0] = (xVals[i2+1]-
x) * dxInv[3*(i+1)+1] * b1[0];
507 b2[1] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
508 (xVals[i2+2]-
x) * dxInv[3*(i+2)+1] * b1[1]);
509 b2[2] = (
x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
510 bfuncs.s[0] = (xVals[i2+1]-
x) * dxInv[3*(i )+2] * b2[0];
511 bfuncs.s[1] = ((
x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
512 (xVals[i2+2]-
x) * dxInv[3*(i+1)+2] * b2[1]);
513 bfuncs.s[2] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
514 (xVals[i2+3]-
x) * dxInv[3*(i+2)+2] * b2[2]);
515 bfuncs.s[3] = (
x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
517 dbfuncs.s[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
518 dbfuncs.s[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
519 dbfuncs.s[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
520 dbfuncs.s[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
533 int i = (*basis->grid->reverse_map)(basis->grid, x);
535 double*
restrict dxInv = basis->dxInv;
536 double*
restrict xVals = basis->xVals;
537 uvec4 bfuncs, dbfuncs, d2bfuncs;
539 b1[0] = (xVals[i2+1]-
x) * dxInv[3*(i+2)+0];
540 b1[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+0];
541 b2[0] = (xVals[i2+1]-
x) * dxInv[3*(i+1)+1] * b1[0];
542 b2[1] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
543 (xVals[i2+2]-
x) * dxInv[3*(i+2)+1] * b1[1]);
544 b2[2] = (
x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
545 bfuncs.s[0] = (xVals[i2+1]-
x) * dxInv[3*(i )+2] * b2[0];
546 bfuncs.s[1] = ((
x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
547 (xVals[i2+2]-
x) * dxInv[3*(i+1)+2] * b2[1]);
548 bfuncs.s[2] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
549 (xVals[i2+3]-
x) * dxInv[3*(i+2)+2] * b2[2]);
550 bfuncs.s[3] = (
x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
552 dbfuncs.s[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
553 dbfuncs.s[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
554 dbfuncs.s[2] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
555 dbfuncs.s[3] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
557 d2bfuncs.s[0] = 6.0f * (+dxInv[3*(i+0)+2]* dxInv[3*(i+1)+1]*b1[0]);
558 d2bfuncs.s[1] = 6.0f * (-dxInv[3*(i+1)+1]*(dxInv[3*(i+0)+2]+dxInv[3*(i+1)+2])*b1[0] +
559 dxInv[3*(i+1)+2]* dxInv[3*(i+2)+1]*b1[1]);
560 d2bfuncs.s[2] = 6.0f * (+dxInv[3*(i+1)+2]* dxInv[3*(i+1)+1]*b1[0] -
561 dxInv[3*(i+2)+1]*(dxInv[3*(i+1)+2] + dxInv[3*(i+2)+2])*b1[1]);
562 d2bfuncs.s[3] = 6.0f * (+dxInv[3*(i+2)+2]* dxInv[3*(i+2)+1]*b1[1]);
566 *d2funcs = d2bfuncs.v;
580 int i = (*basis->grid->reverse_map)(basis->grid, x);
582 double*
restrict dxInv = basis->dxInv;
583 double*
restrict xVals = basis->xVals;
584 uvec2 bf01, bf23, dbf01, dbf23;
586 b1[0] = (xVals[i2+1]-
x) * dxInv[3*(i+2)+0];
587 b1[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+0];
588 b2[0] = (xVals[i2+1]-
x) * dxInv[3*(i+1)+1] * b1[0];
589 b2[1] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
590 (xVals[i2+2]-
x) * dxInv[3*(i+2)+1] * b1[1]);
591 b2[2] = (
x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
592 bf01.s[0] = (xVals[i2+1]-
x) * dxInv[3*(i )+2] * b2[0];
593 bf01.s[1] = ((
x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
594 (xVals[i2+2]-
x) * dxInv[3*(i+1)+2] * b2[1]);
595 bf23.s[0] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
596 (xVals[i2+3]-
x) * dxInv[3*(i+2)+2] * b2[2]);
597 bf23.s[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
599 *f01 = bf01.v; *f23 = bf23.v;
610 int i = (*basis->grid->reverse_map)(basis->grid, x);
612 double*
restrict dxInv = basis->dxInv;
613 double*
restrict xVals = basis->xVals;
614 uvec2 bf01, bf23, dbf01, dbf23;
616 b1[0] = (xVals[i2+1]-
x) * dxInv[3*(i+2)+0];
617 b1[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+0];
618 b2[0] = (xVals[i2+1]-
x) * dxInv[3*(i+1)+1] * b1[0];
619 b2[1] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
620 (xVals[i2+2]-
x) * dxInv[3*(i+2)+1] * b1[1]);
621 b2[2] = (
x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
622 bf01.s[0] = (xVals[i2+1]-
x) * dxInv[3*(i )+2] * b2[0];
623 bf01.s[1] = ((
x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
624 (xVals[i2+2]-
x) * dxInv[3*(i+1)+2] * b2[1]);
625 bf23.s[0] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
626 (xVals[i2+3]-
x) * dxInv[3*(i+2)+2] * b2[2]);
627 bf23.s[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
629 dbf01.s[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
630 dbf01.s[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
631 dbf23.s[0] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
632 dbf23.s[1] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
634 *f01 = bf01.v; *f23 = bf23.v;
635 *df01 = dbf01.v; *df23 = dbf23.v;
647 int i = (*basis->grid->reverse_map)(basis->grid, x);
649 double*
restrict dxInv = basis->dxInv;
650 double*
restrict xVals = basis->xVals;
651 uvec2 bf01, bf23, dbf01, dbf23, d2bf01, d2bf23;
653 b1[0] = (xVals[i2+1]-
x) * dxInv[3*(i+2)+0];
654 b1[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+0];
655 b2[0] = (xVals[i2+1]-
x) * dxInv[3*(i+1)+1] * b1[0];
656 b2[1] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+1] * b1[0]+
657 (xVals[i2+2]-
x) * dxInv[3*(i+2)+1] * b1[1]);
658 b2[2] = (
x-xVals[i2]) * dxInv[3*(i+2)+1] * b1[1];
659 bf01.s[0] = (xVals[i2+1]-
x) * dxInv[3*(i )+2] * b2[0];
660 bf01.s[1] = ((
x-xVals[i2-2]) * dxInv[3*(i )+2] * b2[0] +
661 (xVals[i2+2]-
x) * dxInv[3*(i+1)+2] * b2[1]);
662 bf23.s[0] = ((
x-xVals[i2-1]) * dxInv[3*(i+1)+2] * b2[1] +
663 (xVals[i2+3]-
x) * dxInv[3*(i+2)+2] * b2[2]);
664 bf23.s[1] = (
x-xVals[i2]) * dxInv[3*(i+2)+2] * b2[2];
666 dbf01.s[0] = -3.0f * (dxInv[3*(i )+2] * b2[0]);
667 dbf01.s[1] = 3.0f * (dxInv[3*(i )+2] * b2[0] - dxInv[3*(i+1)+2] * b2[1]);
668 dbf23.s[0] = 3.0f * (dxInv[3*(i+1)+2] * b2[1] - dxInv[3*(i+2)+2] * b2[2]);
669 dbf23.s[1] = 3.0f * (dxInv[3*(i+2)+2] * b2[2]);
671 d2bf01.s[0] = 6.0f * (+dxInv[3*(i+0)+2]* dxInv[3*(i+1)+1]*b1[0]);
672 d2bf01.s[1] = 6.0f * (-dxInv[3*(i+1)+1]*(dxInv[3*(i+0)+2]+dxInv[3*(i+1)+2])*b1[0] +
673 dxInv[3*(i+1)+2]* dxInv[3*(i+2)+1]*b1[1]);
674 d2bf23.s[0] = 6.0f * (+dxInv[3*(i+1)+2]* dxInv[3*(i+1)+1]*b1[0] -
675 dxInv[3*(i+2)+1]*(dxInv[3*(i+1)+2] + dxInv[3*(i+2)+2])*b1[1]);
676 d2bf23.s[1] = 6.0f * (+dxInv[3*(i+2)+2]* dxInv[3*(i+2)+1]*b1[1]);
678 *f01 = bf01.v; *f23 = bf23.v;
679 *df01 = dbf01.v; *df23 = dbf23.v;
680 *d2f01 = d2bf01.v; *d2f23 = d2bf23.v;
void get_NUBasis_funcs_si(NUBasis *restrict basis, int i, float bfuncs[4])
void get_NUBasis_dfuncs_si(NUBasis *restrict basis, int i, float bfuncs[4], float dbfuncs[4])
void destroy_NUBasis(NUBasis *basis)
NUBasis * create_NUBasis(NUgrid *grid, bool periodic)
void get_NUBasis_d2funcs_di(NUBasis *restrict basis, int i, double bfuncs[4], double dbfuncs[4], double d2bfuncs[4])
void get_NUBasis_dfuncs_di(NUBasis *restrict basis, int i, double bfuncs[4], double dbfuncs[4])
int get_NUBasis_d2funcs_d(NUBasis *restrict basis, double x, double bfuncs[4], double dbfuncs[4], double d2bfuncs[4])
int get_NUBasis_dfuncs_d(NUBasis *restrict basis, double x, double bfuncs[4], double dbfuncs[4])
int get_NUBasis_dfuncs_s(NUBasis *restrict basis, double x, float bfuncs[4], float dbfuncs[4])
int get_NUBasis_funcs_d(NUBasis *restrict basis, double x, double bfuncs[4])
int get_NUBasis_funcs_s(NUBasis *restrict basis, double x, float bfuncs[4])
void get_NUBasis_funcs_di(NUBasis *restrict basis, int i, double bfuncs[4])
void get_NUBasis_d2funcs_si(NUBasis *restrict basis, int i, float bfuncs[4], float dbfuncs[4], float d2bfuncs[4])
int get_NUBasis_d2funcs_s(NUBasis *restrict basis, double x, float bfuncs[4], float dbfuncs[4], float d2bfuncs[4])