@@ -287,33 +287,38 @@ class Spline1DSpec<DataT, YdimT, 0> : public Spline1DContainer<DataT>
287287 // / Get interpolated value S(x)
288288 GPUd () void interpolate (DataT x, GPUgeneric() DataT S[/* mYdim*/ ]) const
289289 {
290- interpolateU <SafetyLevel::kSafe >(mYdim , mParameters , convXtoU (x), S);
290+ interpolateAtU <SafetyLevel::kSafe >(mYdim , mParameters , convXtoU (x), S);
291291 }
292292
293293 // / Get interpolated value for an nYdim-dimensional S(u) using spline parameters Parameters.
294294 template <SafetyLevel SafeT = SafetyLevel::kSafe >
295- GPUd () void interpolateU (int32_t inpYdim, GPUgeneric() const DataT Parameters[],
296- DataT u, GPUgeneric() DataT S[/* nYdim*/ ]) const
295+ GPUd () void interpolateAtU (int32_t inpYdim, GPUgeneric() const DataT Parameters[],
296+ DataT u, GPUgeneric() DataT S[/* nYdim*/ ]) const
297297 {
298298 const auto nYdimTmp = SplineUtil::getNdim<YdimT>(inpYdim);
299299 const auto nYdim = nYdimTmp.get ();
300300 int32_t iknot = TBase::template getLeftKnotIndexForU<SafeT>(u);
301301 const DataT* d = Parameters + (2 * nYdim) * iknot;
302- interpolateU (nYdim, getKnots ()[iknot], &(d[0 ]), &(d[nYdim]), &(d[2 * nYdim]), &(d[3 * nYdim]), u, S);
302+ interpolateAtU (nYdim, getKnots ()[iknot], &(d[0 ]), &(d[nYdim]), &(d[2 * nYdim]), &(d[3 * nYdim]), u, S);
303303 }
304304
305305 // / The main mathematical utility.
306306 // / Get interpolated value {S(u): 1D -> nYdim} at the segment [knotL, next knotR]
307307 // / using the spline values Sl, Sr and the slopes Dl, Dr
308308 template <typename T>
309- GPUd () void interpolateU (int32_t inpYdim, const Knot& knotL,
310- GPUgeneric () const T Sl[/* mYdim*/ ], GPUgeneric() const T Dl[/* mYdim*/ ],
311- GPUgeneric() const T Sr[/* mYdim*/ ], GPUgeneric() const T Dr[/* mYdim*/ ],
312- DataT u, GPUgeneric() T S[/* mYdim*/ ]) const
309+ GPUd () void interpolateAtU (int32_t inpYdim, const Knot& knotL,
310+ GPUgeneric () const T Sl[/* mYdim*/ ], GPUgeneric() const T Dl[/* mYdim*/ ],
311+ GPUgeneric() const T Sr[/* mYdim*/ ], GPUgeneric() const T Dr[/* mYdim*/ ],
312+ DataT u, GPUgeneric() T S[/* mYdim*/ ]) const
313313 {
314314 const auto nYdimTmp = SplineUtil::getNdim<YdimT>(inpYdim);
315315 const auto nYdim = nYdimTmp.get ();
316316
317+ auto [dSdSl, dSdDl, dSdSr, dSdDr] = getSderivativesOverParsAtU<T>(knotL, u);
318+ for (int32_t dim = 0 ; dim < nYdim; ++dim) {
319+ S[dim] = dSdSr * Sr[dim] + dSdSl * Sl[dim] + dSdDl * Dl[dim] + dSdDr * Dr[dim];
320+ }
321+ /*
317322 if (u < (DataT)0) {
318323 u = (DataT)0;
319324 }
@@ -330,6 +335,7 @@ class Spline1DSpec<DataT, YdimT, 0> : public Spline1DContainer<DataT>
330335 T b = df - Dl[dim] - a;
331336 S[dim] = ((a * v + b) * v + Dl[dim]) * uu + Sl[dim];
332337 }
338+ */
333339 /*
334340 another way to calculate f(u):
335341 T uu = T(u - knotL.u);
@@ -345,11 +351,10 @@ class Spline1DSpec<DataT, YdimT, 0> : public Spline1DContainer<DataT>
345351 }
346352
347353 template <typename T>
348- GPUd () void getUderivatives(const Knot& knotL, DataT u,
349- T& dSl, T& dDl, T& dSr, T& dDr) const
354+ GPUd () std::tuple<T, T, T, T> getSderivativesOverParsAtU(const Knot& knotL, DataT u) const
350355 {
351356 // / Get derivatives of the interpolated value {S(u): 1D -> nYdim} at the segment [knotL, next knotR]
352- // / over the spline values Sl, Sr and the slopes Dl, Dr
357+ // / over the spline parameters Sl(eft) , Sr(ight) and the slopes Dl, Dr
353358
354359 if (u < (DataT)0 ) {
355360 u = (DataT)0 ;
@@ -363,11 +368,12 @@ class Spline1DSpec<DataT, YdimT, 0> : public Spline1DContainer<DataT>
363368 T vm1 = v - 1 .;
364369 T a = u * vm1;
365370 T v2 = v * v;
366- dSr = v2 * (3 . - 2 * v);
367- dSl = 1 . - dSr;
368- dDl = vm1 * a;
369- dDr = v * a;
370- // F(u) = dSl * Sl + dSr * Sr + dDl * Dl + dDr * Dr;
371+ T dSdSr = v2 * (3 . - 2 * v);
372+ T dSdSl = 1 . - dSdSr;
373+ T dSdDl = vm1 * a;
374+ T dSdDr = v * a;
375+ // S(u) = dSdSl * Sl + dSdSr * Sr + dSdDl * Dl + dSdDr * Dr;
376+ return std::make_tuple (dSdSl, dSdDl, dSdSr, dSdDr);
371377 }
372378 /*
373379 template <typename T>
@@ -480,21 +486,21 @@ class Spline1DSpec<DataT, YdimT, 1>
480486
481487 // / Get interpolated value for an YdimT-dimensional S(u) using spline parameters Parameters.
482488 template <SafetyLevel SafeT = SafetyLevel::kSafe >
483- GPUd () void interpolateU (GPUgeneric() const DataT Parameters[],
484- DataT u, GPUgeneric() DataT S[/* nYdim*/ ]) const
489+ GPUd () void interpolateAtU (GPUgeneric() const DataT Parameters[],
490+ DataT u, GPUgeneric() DataT S[/* nYdim*/ ]) const
485491 {
486- TBase::template interpolateU <SafeT>(YdimT, Parameters, u, S);
492+ TBase::template interpolateAtU <SafeT>(YdimT, Parameters, u, S);
487493 }
488494
489495 // / Get interpolated value for an YdimT-dimensional S(u) at the segment [knotL, next knotR]
490496 // / using the spline values Sl, Sr and the slopes Dl, Dr
491497 template <typename T>
492- GPUd () void interpolateU (const typename TBase::Knot& knotL,
493- GPUgeneric () const T Sl[/* mYdim*/ ], GPUgeneric() const T Dl[/* mYdim*/ ],
494- GPUgeneric() const T Sr[/* mYdim*/ ], GPUgeneric() const T Dr[/* mYdim*/ ],
495- DataT u, GPUgeneric() T S[/* mYdim*/ ]) const
498+ GPUd () void interpolateAtU (const typename TBase::Knot& knotL,
499+ GPUgeneric () const T Sl[/* mYdim*/ ], GPUgeneric() const T Dl[/* mYdim*/ ],
500+ GPUgeneric() const T Sr[/* mYdim*/ ], GPUgeneric() const T Dr[/* mYdim*/ ],
501+ DataT u, GPUgeneric() T S[/* mYdim*/ ]) const
496502 {
497- TBase::interpolateU (YdimT, knotL, Sl, Dl, Sr, Dr, u, S);
503+ TBase::interpolateAtU (YdimT, knotL, Sl, Dl, Sr, Dr, u, S);
498504 }
499505
500506 using TBase::getNumberOfKnots;
@@ -504,7 +510,7 @@ class Spline1DSpec<DataT, YdimT, 1>
504510#if !defined(GPUCA_GPUCODE)
505511 using TBase::recreate;
506512#endif
507- using TBase::interpolateU ;
513+ using TBase::interpolateAtU ;
508514};
509515
510516// / ==================================================================================================
@@ -552,7 +558,7 @@ class Spline1DSpec<DataT, YdimT, 2>
552558
553559 // / _______ Expert tools: interpolation with given nYdim and external Parameters _______
554560
555- using TBase::interpolateU ;
561+ using TBase::interpolateAtU ;
556562 ClassDefNV (Spline1DSpec, 0 );
557563};
558564
0 commit comments