38 unsigned int nthreads = self->Threads>0 ? self->Threads : omp_get_num_procs();
39 #pragma omp parallel for num_threads(nthreads) schedule(dynamic, 1)
40 for(
int i=0; i<npts; i++) {
42 auto pbit = mpfr::digits2bits(self->MPDigits);
43 if(mpfr::mpreal::get_default_prec()!=pbit) mpfr::mpreal::set_default_prec(pbit);
44 self->IntegrandMP(xdim, x+i*xdim, ydim, y+i*ydim, self->mpParameter, self->mpLambda);
47 for(
int j=0; j<ydim; j++) {
49 if(isnan(ytmp) || isinf(ytmp)) { ok =
false;
break; }
51 if(!ok && (self->IntegrandMP!=NULL)) {
53 auto pbit = mpfr::digits2bits(self->MPDigits*10);
54 if(mpfr::mpreal::get_default_prec()!=pbit) mpfr::mpreal::set_default_prec(pbit);
55 self->IntegrandMP(xdim, x+i*xdim, ydim, y+i*ydim, self->mpParameter, self->mpLambda);
56 pbit = mpfr::digits2bits(self->MPDigits);
57 if(mpfr::mpreal::get_default_prec()!=pbit) mpfr::mpreal::set_default_prec(pbit);
61 for(
int j=0; j<ydim; j++) {
63 if(isnan(ytmp) || isinf(ytmp)) {
66 if(self->nNAN > self->NANMax) { NaNQ =
true;
break; }
71 if(self->ReIm == 1) y[i*ydim+1] = 0;
72 else if(self->ReIm == 2) y[i*ydim+0] = 0;
82 if(*nrun == self->MaxPTS + 1979)
return;
84 auto cur_timer = time(NULL);
85 auto used_time = difftime(cur_timer,self->StartTimer);
86 if(used_time>self->RunTime) {
88 *nrun = self->MaxPTS + 1979;
93 if(
Verbose>10 && (*nrun-self->NEval) >= self->RunPTS) {
97 auto e0 = epsabs[0].toString(3);
98 auto e1 = epsabs[1].toString(3);
99 cout <<
" N: " << (*nrun) <<
", ";
100 if(self->ReIm==3 || self->ReIm==1) cout <<
"[" << r0 <<
", " << e0 <<
"]";
101 if(self->ReIm==3 || self->ReIm==2) cout <<
"+I*[" << r1 <<
", " << e1 <<
"]";
104 for(
int j=0; j<self->YDim; j++) {
106 auto e = epsabs[j].toString(3);
107 if(j==0) cout <<
" N: " << (*nrun) <<
", ";
110 int ct = to_string(*nrun).length();
111 for(
int k=0; k<ct; k++) cout <<
" ";
113 cout <<
"[" << r <<
", " << e <<
"]";
118 if((*nrun-self->NEval) >= self->RunPTS) self->NEval = *nrun;
120 bool any_NAN_Inf =
false;
121 for(
int j=0; j<self->YDim; j++) {
122 if(isnan(result[j]) || isnan(epsabs[j]) || isinf(result[j]) || isinf(epsabs[j])) {
129 *nrun = self->MaxPTS + 1979;
130 if(self->LastState>0) self->LastState = -1;
135 bool any_Big =
false;
136 for(
int j=0; j<self->YDim; j++) {
137 if(epsabs[j] > 1E30*self->EpsAbs) {
144 *nrun = self->MaxPTS + 1979;
145 if(self->LastState>0) self->LastState = -1;
150 bool all_Done =
true;
151 for(
int j=0; j<self->YDim; j++) {
152 if(epsabs[j] > 2*self->LastAbsErr[j] ) {
157 if((self->LastState == 0) || all_Done) {
158 for(
int j=0; j<self->YDim; j++) {
159 self->LastResult[j] = result[j];
160 self->LastAbsErr[j] = epsabs[j];
163 self->lastNRUN = *nrun;
164 self->lastnNAN = self->nNAN;
168 for(
int j=0; j<self->YDim; j++) {
169 if((epsabs[j] > self->EpsAbs+1E-50Q) && (epsabs[j] > fabs(result[j])*self->EpsRel+1E-50Q)) {
174 if(bExit && (*nrun)>self->MinPTS) {
176 *nrun = self->MaxPTS + 1979;
182 fn << pid <<
".int.done";
185 *nrun = self->MaxPTS + 1979;
187 cmd <<
"rm " << fn.str();
188 auto rc = system(cmd.str().c_str());
189 if(
Verbose>10) cout <<
" Exit: " << fn.str() << endl;
194 if(LastResult.size()!=
YDim) LastResult.resize(
YDim);
195 if(LastAbsErr.size()!=
YDim) LastAbsErr.resize(
YDim);
196 if(mpfr_buildopt_tls_p()<=0)
throw Error(
"Integrate: mpfr_buildopt_tls_p()<=0.");
198 auto pbit = mpfr::digits2bits(
MPDigits);
199 if(mpfr::mpreal::get_default_prec()!=pbit) mpfr::mpreal::set_default_prec(pbit);
200 mpPi = mpfr::const_pi();
202 mpiEpsilon = complex<mpREAL>(0,mpfr::machine_epsilon()*100);
204 unsigned int xdim =
XDim;
205 unsigned int ydim =
YDim;
206 mpREAL result[ydim], estabs[ydim];
208 mpREAL xmin[xdim], xmax[xdim];
209 for(
int i=0; i<xdim; i++) {
217 size_t _MinPTS_, _RunPTS_;
231 Lib3_HCubatureMP::CPUCORES = omp_get_num_procs();
232 int nok = Lib3_HCubatureMP::hcubature_v(ydim,
Wrapper,
this, xdim, xmin, xmax, _MinPTS_, _RunPTS_,
MaxPTS,
EpsAbs,
EpsRel, result, estabs, tn==0 ?
PrintHooker : NULL);
236 for(
int j=0; j<ydim; j++) abs_res += result[j]*result[j];
237 abs_res = sqrt(abs_res);
239 for(
int j=0; j<ydim; j++) abs_est += estabs[j]*estabs[j];
240 abs_est = sqrt(abs_est);
241 mpREAL mpfr_eps = 10*mpfr::machine_epsilon();
242 if( (abs_res < mpfr_eps) && (abs_est < mpfr_eps) ) {
243 cout <<
ErrColor <<
"HCubatureMP Failed with 0 result returned!" <<
RESET << endl;
248 if(LastState==-1 && use_last) {
249 for(
int j=0; j<ydim; j++) {
250 result[j] = LastResult[j];
251 estabs[j] = LastAbsErr[j];
258 bool any_NAN =
false;
259 for(
int j=0; j<ydim; j++) {
260 if(isnan(result[j])) {
265 if(any_NAN) FResult =
NaN;
269 FResult = VE(mp2ex(result[0]), mp2ex(estabs[0])) + VE(mp2ex(result[1]), mp2ex(estabs[1])) * I;
272 for(
int j=0; j<ydim; j++) res.append(VE(mp2ex(result[j]), mp2ex(estabs[j])));