15 #ifndef BSPLINE_ONEDIM_SOLVERS 16 #define BSPLINE_ONEDIM_SOLVERS 32 std::vector<T> d(
N), gamma(
N), mu(
N);
34 for (
int i = 0; i <
N; i++)
41 for (
int row = 1; row < (
N - 1); row++)
43 double diag = 1.0 - mu[row - 1] * ratio;
44 double diagInv = 1.0 / diag;
45 gamma[row] = -ratio * gamma[row - 1] * diagInv;
46 mu[row] = diagInv * ratio;
47 d[row] = diagInv * (d[row] - ratio * d[row - 1]);
49 d[
N - 1] -= mu[
N - 1] * d[row - 1];
50 gamma[
N - 1] -= mu[
N - 1] * gamma[row - 1];
51 mu[
N - 1] = -mu[
N - 1] * mu[row - 1];
55 gamma[
N - 1] -= mu[
N - 1] * (mu[
N - 2] + gamma[
N - 2]);
56 d[
N - 1] -= mu[
N - 1] * d[
N - 2];
57 p[
N - 1] = d[
N - 1] / gamma[
N - 1];
59 for (
int row =
N - 2; row >= 0; row--)
60 p[row] = d[row] - mu[row] * p[row + 1] - gamma[row] * p[
N - 1];
66 static inline void apply(
const std::vector<double>& data, std::vector<double>& p)
72 static inline void apply(
const CT& data, CT& p,
int N)
74 const double ratio = 0.25;
75 CT d(
N), gamma(
N), mu(
N);
76 for (
int i = 0; i <
N; i++)
83 for (
int row = 1; row < (
N - 1); row++)
85 double diag = 1.0 - mu[row - 1] * ratio;
86 double diagInv = 1.0 / diag;
87 gamma[row] = -ratio * gamma[row - 1] * diagInv;
88 mu[row] = diagInv * ratio;
89 d[row] = diagInv * (d[row] - ratio * d[row - 1]);
91 d[
N - 1] -= mu[
N - 1] * d[row - 1];
92 gamma[
N - 1] -= mu[
N - 1] * gamma[row - 1];
93 mu[
N - 1] = -mu[
N - 1] * mu[row - 1];
97 gamma[
N - 1] -= mu[
N - 1] * (mu[
N - 2] + gamma[
N - 2]);
98 d[
N - 1] -= mu[
N - 1] * d[
N - 2];
99 p[
N] = d[
N - 1] / gamma[
N - 1];
101 for (
int row =
N - 2; row >= 0; row--)
102 p[row + 1] = d[row] - mu[row] * p[row + 2] - gamma[row] * p[
N];
112 static inline void apply(
const std::vector<value_type>& data, std::vector<value_type>& p)
115 std::vector<real_type> dataReal(
N), dataImag(
N), pReal(
N), pImag(
N);
116 for (
int i = 0; i <
N; i++)
118 dataReal[i] = data[i].real();
119 dataImag[i] = data[i].imag();
123 for (
int i = 0; i <
N; i++)
137 static inline void apply(
const CT& data, CT& p,
int N,
double* bcLower,
double* bcUpper)
139 const double ratio = 0.25;
140 CT d(
N + 2), mu(
N + 2, ratio);
141 for (
int i = 1; i <=
N; i++)
142 d[i] = 1.5 * data[i - 1];
143 double al = 0.25 * bcLower[0];
144 double bl = 0.25 * bcLower[1];
145 double cl = 0.25 * bcLower[2];
146 double dl = 1.5 * bcLower[3];
147 double ar = 0.25 * bcUpper[0];
148 double br = 0.25 * bcUpper[1];
149 double cr = 0.25 * bcUpper[2];
150 double dr = 1.5 * bcUpper[3];
152 double alInv = 1.0 / al;
158 mu[1] = ratio - ratio * cl;
159 for (
int row = 1; row <=
N; row++)
161 double diag = 1.0 - mu[row - 1] * ratio;
162 double diagInv = 1.0 / diag;
164 d[row] = diagInv * (d[row] - ratio * d[row - 1]);
166 br -= ar * mu[
N - 1];
172 for (
int row =
N; row >= 1; row--)
173 p[row] = d[row] - mu[row] * p[row + 1];
175 p[0] = dl - bl * p[1] - cl * p[2];
186 static inline void apply(
const CT& data, CT& p,
int N,
double* bcLower,
double* bcUpper)
188 std::vector<real_type> dataReal(
N), dataImag(
N), pReal(
N), pImag(
N);
189 for (
int i = 0; i <
N; i++)
191 dataReal[i] = data[i].real();
192 dataImag[i] = data[i].imag();
196 for (
int i = 0; i <
N; i++)
205 static inline void apply(
const CT& data, CT& p,
int N,
float* bcLower,
float* bcUpper)
207 std::vector<double> data_d(
N), p_d(
N);
208 std::copy(data.begin(), data.end(), data_d.begin());
211 std::copy(bcLower, bcLower + 4, bcLower_d);
212 std::copy(bcUpper, bcUpper + 4, bcUpper_d);
216 std::copy(p_d.begin(), p_d.end(), p.begin());
227 static inline void apply(
const CT& data, CT& p,
int N,
float* bcLower,
float* bcUpper)
229 std::vector<double> dataReal(
N), dataImag(
N), pReal(
N), pImag(
N);
230 for (
int i = 0; i <
N; i++)
232 dataReal[i] = data[i].real();
233 dataImag[i] = data[i].imag();
238 std::copy(bcLower, bcLower + 4, bcLower_d);
239 std::copy(bcUpper, bcUpper + 4, bcUpper_d);
243 for (
int i = 0; i <
N; i++)
244 p[i] =
value_type(static_cast<float>(pReal[i]), static_cast<float>(pImag[i]));
void FuncSolvePeriodicInterp1D(const std::vector< T > &data, std::vector< T > &p)
static void apply(const std::vector< double > &data, std::vector< double > &p)
dummy declaration to be specialized
std::complex< float > value_type
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
static void apply(const CT &data, CT &p, int N, double *bcLower, double *bcUpper)
static void apply(const std::vector< value_type > &data, std::vector< value_type > &p)
static void apply(const CT &data, CT &p, int N, double *bcLower, double *bcUpper)
static void apply(const CT &data, CT &p, int N)
std::complex< double > value_type
static void apply(const CT &data, CT &p, int N, float *bcLower, float *bcUpper)
std::complex< double > value_type
static void apply(const CT &data, CT &p, int N, float *bcLower, float *bcUpper)
QMCTraits::FullPrecRealType value_type