41 std::tuple<double, double, unsigned>
integrate_fp(
const fcn &F,
const std::array<double, dim> &ctr,
const std::array<double, dim> &wth) {
43 auto eval = [&F](
auto z,
const auto &p,
const unsigned &ind) {
47 auto eval_2 = [&F](
auto z,
const auto &p,
const unsigned &ind,
const auto &p2,
const unsigned int &ind2) {
53 std::array<real_v, dim> z;
54 double rgnvol = get_power<2, dim>::value;
55 for(
unsigned j = 0; j < dim; j++) {
59 double sum1{0}, sum2{0}, sum3{0}, sum4{0}, sum5{0};
62 const real_v xl(-xl4, -xl2, +xl2, +xl4);
63 const real_v dxp(-xl4, +xl4, -xl4, +xl4);
64 const real_v dxp2(-xl4, -xl4, +xl4, +xl4);
67 for(
unsigned j = 0; j != dim; j++) {
68 auto fb = eval(z, xl * wth[j], j).to_array();
69 auto f2 = fb[1] + fb[2];
70 auto f3 = fb[0] + fb[3];
73 double dif = std::abs(7 * f2 - f3 - 12 * sum1);
74 idvaxn = dif >= difmax ? j : idvaxn;
75 difmax = dif >= difmax ? dif : difmax;
76 for(
unsigned k = j + 1; k < dim; ++k) sum4 +=
utils::sum_elements(eval_2(z, dxp * wth[j], j, dxp2 * wth[k], k));
78 for(
int j = 0; j < get_power<2, dim>::value; j += 4) {
80 for(
int k = 0; k != dim; ++k)
81 z[k] =
real_v(ctr[k] + (0x1 & ((j + 0) >> k) ? +1 : -1) * xl5 * wth[k], ctr[k] + (0x1 & ((j + 1) >> k) ? +1 : -1) * xl5 * wth[k],
82 ctr[k] + (0x1 & ((j + 2) >> k) ? +1 : -1) * xl5 * wth[k], ctr[k] + (0x1 & ((j + 3) >> k) ? +1 : -1) * xl5 * wth[k]);
86 auto rgncmp = rgnvol * (wpn1[dim - 2] * sum1 + wp2 * sum2 + wpn3[dim - 2] * sum3 + wp4 * sum4);
87 auto rgnval = rgnvol * (wn1[dim - 2] * sum1 + w2 * sum2 + wn3[dim - 2] * sum3 + w4 * sum4 + wn5[dim - 2] * sum5);
88 auto rgnerr = std::abs(rgnval - rgncmp);
89 return {rgnval, rgnerr, idvaxn};
93 std::tuple<double, double, unsigned>
integrate_fp_scalar(
const fcn &F,
const std::array<double, dim> &ctr,
const std::array<double, dim> &wth) {
95 auto eval = [&F](
auto &z,
const auto &p,
const unsigned &ind) {
102 auto eval_2 = [&F](
auto &z,
const auto &p,
const unsigned &ind,
const auto &p2,
const unsigned int &ind2) {
114 std::array<double, dim> z = ctr;
115 double rgnvol = get_power<2, dim>::value;
116 for(
unsigned j = 0; j < dim; j++) rgnvol *= wth[j];
126 for(
unsigned j = 0; j != dim; j++) {
127 auto f2 = eval(z, -xl2 * wth[j], j) + eval(z, +xl2 * wth[j], j);
128 auto f3 = eval(z, -xl4 * wth[j], j) + eval(z, +xl4 * wth[j], j);
132 double dif = std::abs(7 * f2 - f3 - 12 * sum1);
133 idvaxn = dif >= difmax ? j : idvaxn;
134 difmax = dif >= difmax ? dif : difmax;
135 for(
unsigned k = j + 1; k < dim; ++k) {
136 sum4 += eval_2(z, xl4 * wth[j], j, xl4 * wth[k], k);
137 sum4 += eval_2(z, xl4 * wth[j], j, -xl4 * wth[k], k);
138 sum4 += eval_2(z, -xl4 * wth[j], j, xl4 * wth[k], k);
139 sum4 += eval_2(z, -xl4 * wth[j], j, -xl4 * wth[k], k);
142 for(
int j = 0; j != get_power<2, dim>::value; ++j) {
143 for(
int k = 0; k != dim; ++k) z[k] = ctr[k] + (0x1 & (j >> k) ? +1 : -1) * xl5 * wth[k];
147 auto rgncmp = rgnvol * (wpn1[dim - 2] * sum1 + wp2 * sum2 + wpn3[dim - 2] * sum3 + wp4 * sum4);
148 auto rgnval = rgnvol * (wn1[dim - 2] * sum1 + w2 * sum2 + wn3[dim - 2] * sum3 + w4 * sum4 + wn5[dim - 2] * sum5);
149 auto rgnerr = std::abs(rgnval - rgncmp);
150 return {rgnval, rgnerr, idvaxn};
std::tuple< double, double, unsigned > integrate_fp(const fcn &F, const std::array< double, dim > &ctr, const std::array< double, dim > &wth)
std::tuple< double, double, unsigned > integrate_fp_scalar(const fcn &F, const std::array< double, dim > &ctr, const std::array< double, dim > &wth)