50 template<
unsigned dim,
unsigned w
idth,
typename fcn> std::tuple<double, double, unsigned>
integrate_fp(
const fcn& F,
const std::array<double,dim>& ctr,
const std::array<double, dim>& wth )
53 auto eval = [&F](
auto z,
const auto& p,
const unsigned& ind )
58 auto eval_2 = [&F](
auto z,
const auto& p,
const unsigned& ind,
const auto& p2,
const unsigned int& ind2 )
65 std::array<real_v, dim> z;
66 double rgnvol = get_power<2,dim>::value;
67 for (
unsigned j=0; j<dim; j++){
71 double sum1{0}, sum2{0}, sum3{0}, sum4{0}, sum5{0};
74 const real_v xl ( -xl4, -xl2, +xl2, +xl4);
75 const real_v dxp ( -xl4, +xl4, -xl4, +xl4);
76 const real_v dxp2( -xl4, -xl4, +xl4, +xl4);
79 for (
unsigned j=0; j != dim; j++)
81 auto fb = eval(z, xl * wth[j], j ).to_array();
82 auto f2 = fb[1] + fb[2];
83 auto f3 = fb[0] + fb[3];
86 double dif = std::abs(7*f2-f3-12*sum1);
87 idvaxn = dif >= difmax ? j : idvaxn;
88 difmax = dif >= difmax ? dif : difmax;
89 for(
unsigned k = j+1; k <dim; ++k )
92 for(
int j = 0 ; j < get_power<2, dim>::value; j+=4 )
95 for(
int k = 0; k != dim; ++k ) z[k] =
real_v(
96 ctr[k] + ( 0x1 & ( (j+0) >> k ) ? +1 : -1 ) * xl5*wth[k],
97 ctr[k] + ( 0x1 & ( (j+1) >> k ) ? +1 : -1 ) * xl5*wth[k],
98 ctr[k] + ( 0x1 & ( (j+2) >> k ) ? +1 : -1 ) * xl5*wth[k],
99 ctr[k] + ( 0x1 & ( (j+3) >> k ) ? +1 : -1 ) * xl5*wth[k] );
103 auto rgncmp = rgnvol*(wpn1[dim-2]*sum1+wp2*sum2+wpn3[dim-2]*sum3+wp4*sum4);
104 auto rgnval = rgnvol*(wn1[dim-2]*sum1+w2*sum2+wn3[dim-2]*sum3+w4*sum4+wn5[dim-2]*sum5);
105 auto rgnerr = std::abs(rgnval-rgncmp);
106 return {rgnval, rgnerr, idvaxn};
109 template<
unsigned dim,
typename fcn> std::tuple<double, double, unsigned>
integrate_fp_scalar(
const fcn& F,
const std::array<double,dim>& ctr,
const std::array<double, dim>& wth )
112 auto eval = [&F](
auto& z,
const auto& p,
const unsigned& ind )
120 auto eval_2 = [&F](
auto& z,
const auto& p,
const unsigned& ind,
const auto& p2,
const unsigned int& ind2 )
133 std::array<double, dim> z = ctr;
134 double rgnvol = get_power<2,dim>::value;
135 for (
unsigned j=0; j<dim; j++) rgnvol *= wth[j];
145 for (
unsigned j=0; j != dim; j++)
147 auto f2 = eval(z, -xl2*wth[j], j) + eval(z, +xl2*wth[j], j);
148 auto f3 = eval(z, -xl4*wth[j], j) + eval(z, +xl4*wth[j], j );
152 double dif = std::abs(7*f2-f3-12*sum1);
153 idvaxn = dif >= difmax ? j : idvaxn;
154 difmax = dif >= difmax ? dif : difmax;
155 for(
unsigned k = j+1; k <dim; ++k )
157 sum4 += eval_2(z, xl4*wth[j], j, xl4*wth[k], k);
158 sum4 += eval_2(z, xl4*wth[j], j, -xl4*wth[k], k);
159 sum4 += eval_2(z, -xl4*wth[j], j, xl4*wth[k], k);
160 sum4 += eval_2(z, -xl4*wth[j], j, -xl4*wth[k], k);
163 for(
int j = 0 ; j != get_power<2, dim>::value; ++j )
165 for(
int k = 0; k != dim; ++k ) z[k] = ctr[k] + ( 0x1 & ( j >> k ) ? +1 : -1 ) * xl5*wth[k];
169 auto rgncmp = rgnvol*(wpn1[dim-2]*sum1+wp2*sum2+wpn3[dim-2]*sum3+wp4*sum4);
170 auto rgnval = rgnvol*(wn1[dim-2]*sum1+w2*sum2+wn3[dim-2]*sum3+w4*sum4+wn5[dim-2]*sum5);
171 auto rgnerr = std::abs(rgnval-rgncmp);
172 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)