static unsigned long _stdlib_strto_l(const char *str, char **endptr, int base, int sflag) { unsigned long number, cutoff; const char *fail_char; #define SET_FAIL(X) fail_char = (X) unsigned char negative, digit, cutoff_digit; SET_FAIL(str); while(isspace(*str)) // Skip leading whitespace. ++str; // Handle optional sign. negative = 0; switch(*str) { case '-': negative = 1; // Fall through to increment str. case '+': ++str; } if (!(base & ~0x10)) { // Either dynamic (base = 0) or base 16. base += 10; // Default is 10 if (*str == '0') { SET_FAIL(++str); base -= 2; // Now base is 8 or 16 if ((0x20|(*str)) == 'x') { ++str; base += base; // Base is 16 } } if (base > 16) // Adjust in case base wasn't dynamic. base = 16; } number = 0; if (((unsigned)(base - 2)) < 35) { // Legal base. cutoff_digit = ULONG_MAX % base; cutoff = ULONG_MAX / base; do { digit = (((unsigned char)(*str - '0')) <= 9) ? (*str - '0') : ((*str >= 'A') ? (((0x20|(*str)) - 'a' + 10)) : 40); if (digit >= base) break; SET_FAIL(++str); if ((number > cutoff) || ((number == cutoff) && (digit > cutoff_digit))) { number = ULONG_MAX; negative &= sflag; SET_ERRNO(ERANGE); } else number = number * base + digit; } while (1); } if (endptr) *endptr = (char *) fail_char; { unsigned long tmp = ((negative) ? ((unsigned long)(-(1+LONG_MIN)))+1 : LONG_MAX); if (sflag && (number > tmp)) { number = tmp; SET_ERRNO(ERANGE); } } return negative ? (unsigned long)(-((long)number)) : number; }
void approx::approx_calc(){ // Calculate indices first // Perhaps make these k-dependent? but OK for now //double etaminval = 1.e52; // at most //double etamaxval = 1.e66; // at leas //double etalow = 9.e58; // where step in Gp starts //double etahi = 4.e59; // where step in Gp ends //no matching values double etaminval;// = 1.;//0.0001; //1.e-20; //at most double etamaxval;// = 1.e10;//1.e-9; //at least double Gmin; std::cout << "INDICES " << lneta->size() << " " << mybkg->indexetalo << " " << mybkg->indexetahi << std::endl; double etalo = exp((*lneta)[mybkg->indexetalo]); //180.; // make a function to calculate this but OK for now double etahi = exp((*lneta)[mybkg->indexetahi]);//1200.; std::cout << "etalo and etahi " << mybkg->indexetalo << " " << etalo << " " << mybkg->indexetahi << " " << etahi << " " << lneta->size() << std::endl; //Set Gmin //Gmin = (*G)[etaminindex]; //std::cout << "THIS IS Gmin " << (*G)[etaminindex -1] << " " << (*G)[etaminindex] << " " << (*G)[etaminindex+1] << std::endl; double kmpc; double kc; //double h = log((*a)[1]) - log((*a)[0]); double I0temp; double I1temp; double I0int; double I1int; double I0err; double I1err; Nag_QuadProgress I0qp; Nag_QuadProgress I1qp; Nag_User Icomm_osc; Nag_Comm Icomm; static double ruser[1] = {-1.0}; Icomm.user = ruser; NagError I0fail; NagError I1fail; gsr_params p(Gp, lneta); double iscale = p.get_scale(); //NLA variables double deltaI0temp, deltaI1temp; double Btemp, cosphitemp; printf("iscale = %g\n",iscale); //find the peak int pmaxindex = std::max_element(Gp->begin()+mybkg->indexetahi, Gp->begin()+mybkg->indexetalo) - (Gp->begin() + mybkg->indexetahi); int pminindex = std::min_element(Gp->begin()+mybkg->indexetahi, Gp->begin()+mybkg->indexetalo) - (Gp->begin() + mybkg->indexetahi); double Gpmax = *(Gp->begin() + mybkg->indexetahi + pmaxindex); double Gpmin = *(Gp->begin() + mybkg->indexetahi + pminindex); std::cout << "Peak indices " << pmaxindex << " " << pminindex << " " << (*(Gp->begin() + mybkg->indexetahi + pmaxindex)) << " " << Gpmax << " " << (*(Gp->begin() + mybkg->indexetahi + pminindex)) << " " << Gpmin << std::endl; int fineindexhi = -1; int fineindexlo = -1; for(int i = pmaxindex; i > 0; i--){ if( (*(Gp->begin() + mybkg->indexetahi + i)) < (Gpmax/100.) ){ fineindexhi = mybkg->indexetahi + i; break; } } for(int i = pminindex; i + mybkg->indexetahi < mybkg->indexetalo; i++){ if( (*(Gp->begin() + mybkg->indexetahi + i)) > (Gpmin/100.) ){ fineindexlo = mybkg->indexetahi + i; break; } } if (fineindexhi == -1) fineindexhi = mybkg->indexetahi; if (fineindexlo == -1) fineindexlo = mybkg->indexetalo; std::cout << "Fine indices " << fineindexlo << " " << fineindexhi << " " << ((*(Gp))[fineindexlo]) << " " << ((*(Gp))[fineindexhi]) << " " << exp((*lneta)[fineindexlo]) << " " << exp((*lneta)[fineindexhi]) << std::endl; //Divide the peak into this many intervals int nosc = 15.;//40; // make this depend on c and d but OK for now //reconstructing test double fineetalo = 0.2*etalo; //exp((*lneta)[fineindexlo]); double fineetahi = 1.8*etahi; //exp((*lneta)[fineindexhi]); double oscint = (fineetahi - fineetalo)/nosc; SET_FAIL(I0fail); SET_FAIL(I1fail); int lenks = ks->size(); //NAG library implementation for(Integer kin=0; kin<lenks; kin++){ //200 and above is case I if ( (kin+1)%(int(0.05*lenks)) == 0 ){ std::cout << "Done " << (100.*double(kin+1)/double(lenks)) << "%" << std::endl; } kmpc = (*ks)[kin]; kc = kmpc;// * mpcconv; no MPCCONV!! change the names.. but OK for now //lnetainterval = log(4.*M_PI/(2.*kc)); //4. is a guess but OK for now I0temp = 0.; I1temp = 0.; p.set_kc(kc); Icomm.p = (Pointer)&p; Icomm_osc.p = (Pointer)&p; //Calculate etaminval, etamaxval and Gmin etaminval = 0.001/kc; etamaxval = 1000./kc; Gmin = interp_G(log(etaminval)); /* //this is just for checking std::ofstream myfile_G; std::ofstream myfile_gsr; myfile_G.open("limits_Gpeak.dat"); myfile_gsr.open("limits.dat"); FILE * gpeakf; FILE * gsrerrf; gpeakf = fopen("Gpeak.dat", "w"); gsrerrf = fopen("trialgsr_err.dat", "w"); int etamaxindex, etaminindex; double lneta_in; double interval = (etahi-etalo)/5000.; for(int i=0; i!=eta->size(); i++){ if((*eta)[i] < etamaxval){ etamaxindex = i; break; } } for(int i=etamaxindex; i!=eta->size(); i++){ if((*eta)[i] < etaminval){ etaminindex = i; break; } } for(int i=etamaxindex; i<etaminindex; i=i+1){ //break; p.set_kc((*ks)[0]); // NO MPCCONV!!! lneta_in = (*lneta)[i]; //std::cout << "STUPID TRIAL " << p.get_kc() << " " << exp(lneta_in) << " " << std::endl; fprintf(gsrerrf, "%.9e %.9e %.9e %.9e %.9e\n", lneta_in, (p.get_kc()*exp(lneta_in)), I0integrand_osc(lneta_in, &Icomm_osc), win::W((p.get_kc()) *exp(lneta_in)), p.interp_Gp(lneta_in)); fflush(stdout); } for(int i=0; i<5000; i++){ //break; p.set_kc((*ks)[0]); fprintf(gpeakf, "%.9e %.9e\n", (log(etalo+(i*interval))),p.interp_Gp(log(etalo+(i*interval)))); } std::cout << "Gp at etalo and etahi " << p.interp_Gp(log(etalo)) << " " << p.interp_Gp(log(etahi)) << std::endl; for(int osci=0; osci<nosc; osci++){ myfile_G << ((etalo + (osci*oscint))) << std::endl; } for(int osci=0; osci<(mybkg->indexetalo - mybkg->indexetahi); osci++){ myfile_gsr << exp((*lneta)[(mybkg->indexetalo)-osci]) << std::endl; } myfile_G.close(); myfile_gsr.close(); fclose(gpeakf); fclose(gsrerrf); //end of chekcing code */ if (fineetalo > (1./kc)){ //Smooth integral nag_quad_1d_fin_smooth(I0integrand, log(etaminval), log(1./kc), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, log(etaminval), log(1./kc), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 11 " << I0int << "(+/-)" << I0err << " " << I1int<< "(+/-)" << I1err << std::endl; //old way nag_1d_quad_osc_1(I0integrand_osc, log(1./kc), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(1./kc), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 12 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); //end of old way /* //new way //Do oscillatory integral nag_1d_quad_osc_1(I0integrand_osc, log(1./kc), log(fineetalo), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(1./kc), log(fineetalo), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 12 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); //Fine integral for(int osci=0; osci<nosc; osci++){ nag_1d_quad_osc_1(I0integrand_osc2, fineetalo + (osci*oscint), fineetalo + ((osci+1)*oscint), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc2, fineetalo + (osci*oscint), fineetalo + ((osci+1)*oscint), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 13 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); } nag_1d_quad_osc_1(I0integrand_osc, log(fineetahi), log(etamaxval), 1.e-8, 1.e-8, 1.e7, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(fineetahi), log(etamaxval), 1.e-8, 1.e-8, 1.e7, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); //std::cout << "Case 14 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; I0temp = I0temp + I0int; I1temp = I1temp + I1int; nag_qp_free(I0qp); nag_qp_free(I1qp); //end of the new way */ } else if ( (fineetalo < (1./kc)) && (fineetahi > (1./kc)) ){ //Smooth integral nag_quad_1d_fin_smooth(I0integrand, log(etaminval), log(fineetalo), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, log(etaminval), log(fineetalo), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 21 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; //old way nag_1d_quad_osc_1(I0integrand_osc, log(fineetalo), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(fineetalo), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 12 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); /* //new way //Do oscillatory integral for(int osci=0; osci<nosc; osci++){ nag_1d_quad_osc_1(I0integrand_osc2, fineetalo + (osci*oscint), fineetalo + ((osci+1)*oscint), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc2, fineetalo + (osci*oscint), fineetalo + ((osci+1)*oscint), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 22 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); } nag_1d_quad_osc_1(I0integrand_osc, log(fineetahi), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(fineetahi), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; nag_qp_free(I0qp); nag_qp_free(I1qp); //end of new way */ } else if (fineetahi < (1./kc)) { //Smooth integral (until the fine division) nag_quad_1d_fin_smooth(I0integrand, log(etaminval), log(fineetalo), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, log(etaminval), log(fineetalo), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 31 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; //Do oscillatory integral //Old way for(int osci=0; osci<nosc; osci++){ nag_1d_quad_gen_1(I0integrand_gen, (fineetalo + (osci*oscint)), (fineetalo + ((osci+1)*oscint)), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_gen_1(I1integrand_gen, (fineetalo + (osci*oscint)), (fineetalo + ((osci+1)*oscint)), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 31.5 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; //printf("%.9e %.9e\n", (etalo + (osci*oscint)), (etalo + ((osci+1)*oscint))); nag_qp_free(I0qp); nag_qp_free(I1qp); } //std::cout << "checking limits " << (fineetalo + ((nosc)*oscint)) << " " << fineetahi << std::endl; //end of old way //new way /* //nag_1d_quad_gen_1(I0integrand_gen, etalo, exp((*lneta)[mybkg->indexetalo]), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); //nag_1d_quad_gen_1(I1integrand_gen, etalo, exp((*lneta)[mybkg->indexetalo]), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); //I0temp = I0temp + I0int; //I1temp = I1temp + I1int; //std::cout << "Case 31.5 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; //nag_qp_free(I0qp); //nag_qp_free(I1qp); //Fine-division integral for(int osci=0; osci<(mybkg->indexetalo - mybkg->indexetahi); osci++){ nag_1d_quad_gen_1(I0integrand_gen, exp((*lneta)[(mybkg->indexetalo)-osci]), exp((*lneta)[(mybkg->indexetalo) - osci - 1]), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_gen_1(I1integrand_gen, exp((*lneta)[(mybkg->indexetalo)+osci]), exp((*lneta)[(mybkg->indexetalo) - osci - 1]), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; std::cout << "Case 32 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); } //nag_1d_quad_gen_1(I0integrand_gen, exp((*lneta)[mybkg->indexetahi]), etahi, 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); //nag_1d_quad_gen_1(I1integrand_gen, exp((*lneta)[mybkg->indexetahi]), etahi, 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); //I0temp = I0temp + I0int; //I1temp = I1temp + I1int; //std::cout << "Case 32.5 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; //nag_qp_free(I0qp); //nag_qp_free(I1qp); */ //Smooth integral nag_quad_1d_fin_smooth(I0integrand, log(fineetahi), log(1./kc), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, log(fineetahi), log(1./kc), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 33 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; //Do oscillatory integral nag_1d_quad_osc_1(I0integrand_osc, log(1./kc), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(1./kc), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << "Case 34 " << I0int << "(+/-)" << I0err << " " << I1int << "(+/-)" << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); } // end of integration //Fill Delta2GSR and Delta2NLA... Delta2GSR.push_back( exp(Gmin + (iscale*I0temp) + log(1. + (iscale*iscale*I1temp*I1temp)/2.)) ); //std::cout << kmpc << " " << Delta2GSR.back() << " " << Gmin << " " << I0temp << " " << I1temp << std::endl; deltaI0temp = Gmin + (iscale*I0temp) - log(1./(fstar*fstar)) - ((ns-1.)*(log(kc/kp))); deltaI1temp = (iscale*I1temp/sqrt(2)) - I1_bar; Btemp = sqrt( (deltaI0temp*deltaI0temp) + (2.*deltaI1temp*deltaI1temp) ); cosphitemp = ( (sqrt(2)*deltaI1temp*sinphibar) - (deltaI0temp*cosphibar) )/Btemp; //deltaI0.push_back( deltaI0temp ); //deltaI1.push_back( deltaI1temp ); //B.push_back( Btemp ); //cosphi.push_back( cosphitemp ); Delta2NLA.push_back( (cosh(Btemp) - (sinh(Btemp)*cosphitemp) )*(pow(kc/kp, nsm1))/(fstar*fstar) ); //for(int i=etamaxindex; i<etaminindex; i++){ // break; // lneta_in = (*lneta)[i]; // printf("%.9e %.9e %.9e %.9e %.9e %.9e %.9e\n", lneta_in, I0integrand(lneta_in, &Icomm), I0integrand_osc(lneta_in, &Icomm_osc), win::W((p.get_kc()) *exp(lneta_in)), p.interp_Gp(lneta_in), gsl_I1integrand(lneta_in, &p), win::X((p.get_kc())*exp(lneta_in))); //} /* nag_quad_1d_fin_smooth(I0integrand, (*lneta)[etaminindex], log(1/kc), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, (*lneta)[etaminindex], log(1/kc), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //Do oscillatory integral nag_1d_quad_osc_1(I0integrand_osc, log(1/kc), (*lneta)[etamaxindex], 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(1/kc), (*lneta)[etamaxindex], 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; nag_qp_free(I0qp); nag_qp_free(I1qp); */ /* nag_quad_1d_fin_smooth(I0integrand, (*lneta)[etaminindex], log(etalo), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, (*lneta)[etaminindex], log(etalo), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << I0err << " " << I1err << std::endl; //Do oscillatory integral nag_1d_quad_osc_1(I0integrand_osc, log(etalo), log(etahi), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(etalo), log(etahi), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; //std::cout << I0err << " " << I1err << std::endl; nag_qp_free(I0qp); nag_qp_free(I1qp); nag_quad_1d_fin_smooth(I0integrand, log(etahi), log(1./kc), 1.e-8, 1.e-8, &I0int, &I0err, &Icomm); nag_quad_1d_fin_smooth(I1integrand, log(etahi), log(1./kc), 1.e-8, 1.e-8, &I1int, &I1err, &Icomm); //std::cout << I0err << " " << I1err << std::endl; I0temp = I0temp + I0int; I1temp = I1temp + I1int; nag_1d_quad_osc_1(I0integrand_osc, log(1./kc), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I0int, &I0err, &I0qp, &Icomm_osc, &I0fail); nag_1d_quad_osc_1(I1integrand_osc, log(1./kc), log(etamaxval), 1.e-6, 1.e-6, 1.e6, &I1int, &I1err, &I1qp, &Icomm_osc, &I1fail); //std::cout << I0err << " " << I1err << std::endl; I0temp = I0temp + I0int; I1temp = I1temp + I1int; nag_qp_free(I0qp); nag_qp_free(I1qp); */ //for(int kin=200; kin<501; kin++){ // break; // kmpc = (*ks)[kin]; // kc = kmpc;//*mpcconv; // p.set_kc(kc); // I0.params = &p; // I1.params = &p; // gsl_integration_qags (&I0, (*lneta)[etaminindex], log(etalo), 0, 1e-4, 1e6, w, &gslI0, &gslErr0); // gsl_integration_qags (&I1, (*lneta)[etaminindex], log(etalo), 0, 1e-4, 1e6, w, &gslI1, &gslErr1); // Delta2GSR.push_back( exp(Gmin + gslI0 + log(1. + gslI1*gslI1/2.)) ); // std::cout << kmpc << " " << Delta2GSR.back() << " " << I0temp << " " << I0err << std::endl; //}// end of GSL kin loop /* //This was commented out // Integral after 1/k for(int i=0; i<10; i++){ nag_1d_quad_gen_1(I0integrand, log(1/kc) + i, log(1/kc) + i+1, 1.e-6, 1.e-6, 1e7, &I0int, &I0err, &I0qp, &Icomm, &I0fail); nag_1d_quad_gen_1(I1integrand, log(1/kc) + i, log(1/kc) + i+1, 1.e-6, 1.e-6, 1e7, &I1int, &I1err, &I1qp, &Icomm, &I1fail); I0temp = I0temp + I0int; I1temp = I1temp + I1int; nag_qp_free(I0qp); nag_qp_free(I1qp); } // until here (end of inner comment) */ //Consider making lnetamin and lnetamax depend on k but OK for now //nag_1d_quad_osc_1(I0integrand, log(etaminval), log(etamaxval), 1.e-3, 1.e-3, 1e5, &I0temp, &I0err, &I0qp, &Icomm, &I0fail); //nag_1d_quad_osc_1(I1integrand, log(etaminval), log(etamaxval), 1.e-3, 1.e-3, 1e5, &I1temp, &I1err, &I1qp, &Icomm, &I1fail); //I0.push_back(I0temp); //I1.push_back(I1temp/sqrt(2.)); //double lnetainterval; //4. is a guess but OK for now //double gslI0, gslI1, gslErr0, gslErr1; //gsl_integration_workspace * w = gsl_integration_workspace_alloc (1e8); //gsl_function I0; //gsl_function I1; //I0.function = &gsl_I0integrand; //I1.function = &gsl_I1integrand; //GSL Library implementation //print integrand for a check //double lneta_in; //std::cout << "keta range = " << ((*ks)[0] * etaminval) << " " << ((*ks).rbegin()[0] * etamaxval) << std::endl; //for(int i=etamaxindex; i<etaminindex; i=i+1){ // break; // p.set_kc((*ks)[400]); // NO MPCCONV!!! // lneta_in = (*lneta)[i]; // //std::cout << "STUPID TRIAL " << p.get_kc() << " " << exp(lneta_in) << " " << std::endl; // printf("%.9e %.9e %.9e %.9e %.9e\n", lneta_in, (p.get_kc()*exp(lneta_in)), gsl_I0integrand(lneta_in, &p), win::W((p.get_kc()) *exp(lneta_in)), p.interp_Gp(lneta_in)); // fflush(stdout); //} } //end of NAG kin loop /* for(int kin=100; kin<101; kin++){ kmpc = (*ks)[kin]; kc = kmpc * mpcconv; //Calculate I0 and I1 //Write this in an integrator method in utils but OK for now I0temp=0.; I1temp=0.; if(((etaminindex-etamaxindex)%2) == 0){ //Use Simpson's Rule throughout for(int i=etamaxindex; i!=etaminindex; i+=2){ I0temp += h*( (2.*win::W(kc*(*eta)[i])*(*Gp)[i]/((*a)[i]*(*H)[i]*(*eta)[i])) + (4.*win::W(kc*(*eta)[i+1])*(*Gp)[i+1]/((*a)[i+1]*(*H)[i+1]*(*eta)[i+1])) )/3.; I1temp += h*( (2.*win::X(kc*(*eta)[i])*(*Gp)[i]/((*a)[i]*(*H)[i]*(*eta)[i])) + (4.*win::X(kc*(*eta)[i+1])*(*Gp)[i+1]/((*a)[i+1]*(*H)[i+1]*(*eta)[i+1])) )/3.; } I0temp += h*((-1.*win::W(kc*(*eta)[etamaxindex])*(*Gp)[etamaxindex]/((*a)[etamaxindex]*(*H)[etamaxindex]*(*eta)[etamaxindex])) + (win::W(kc*(*eta)[etaminindex])*(*Gp)[etaminindex]/((*a)[etaminindex]*(*H)[etaminindex]*(*eta)[etaminindex])))/3.; // correction for under/over counting in the above loop I1temp += h*((-1.*win::X(kc*(*eta)[etamaxindex])*(*Gp)[etamaxindex]/((*a)[etamaxindex]*(*H)[etamaxindex]*(*eta)[etamaxindex])) + (win::X(kc*(*eta)[etaminindex])*(*Gp)[etaminindex]/((*a)[etaminindex]*(*H)[etaminindex]*(*eta)[etaminindex])))/3.; // correction for under/over counting in the above loop } else { // Use trapezoidal rule for first interval and then Simpson's throughout I0temp += h*(( win::W(kc*(*eta)[etamaxindex])*(*Gp)[etamaxindex]/((*a)[etamaxindex]*(*H)[etamaxindex]*(*eta)[etamaxindex]) ) + ( win::W(kc*(*eta)[etamaxindex])*(*Gp)[etamaxindex]/((*a)[etamaxindex]*(*H)[etamaxindex]*(*eta)[etamaxindex]) ))/2.; I1temp += h*(( win::X(kc*(*eta)[etamaxindex])*(*Gp)[etamaxindex]/((*a)[etamaxindex]*(*H)[etamaxindex]*(*eta)[etamaxindex]) ) + ( win::X(kc*(*eta)[etamaxindex])*(*Gp)[etamaxindex]/((*a)[etamaxindex]*(*H)[etamaxindex]*(*eta)[etamaxindex]) ))/2.; std::cout << "THIS IS KETA " << (kc*(*eta)[etaminindex]) << " " << (kc*(*eta)[etamaxindex]) << std::endl; for(int i=etamaxindex+1; i!=etaminindex; i+=2){ I0temp += h*( (2.*win::W(kc*(*eta)[i])*(*Gp)[i]/((*a)[i]*(*H)[i]*(*eta)[i])) + (4.*win::W(kc*(*eta)[i+1])*(*Gp)[i+1]/((*a)[i+1]*(*H)[i+1]*(*eta)[i+1])) )/3.; I1temp += h*( (2.*win::X(kc*(*eta)[i])*(*Gp)[i]/((*a)[i]*(*H)[i]*(*eta)[i])) + (4.*win::X(kc*(*eta)[i+1])*(*Gp)[i+1]/((*a)[i+1]*(*H)[i+1]*(*eta)[i+1])) )/3.; std::cout << (*eta)[i] << " " << win::W(kc*(*eta)[i]) << " " << (*Gp)[i] << std::endl; } I0temp += h*((-1.*win::W(kc*(*eta)[etamaxindex+1])*(*Gp)[etamaxindex+1]/((*a)[etamaxindex+1]*(*H)[etamaxindex+1]*(*eta)[etamaxindex+1])) + (win::W(kc*(*eta)[etaminindex])*(*Gp)[etaminindex]/((*a)[etaminindex]*(*H)[etaminindex]*(*eta)[etaminindex])))/3.; // correction for under/over counting in the above loop I1temp += h*((-1.*win::X(kc*(*eta)[etamaxindex+1])*(*Gp)[etamaxindex+1]/((*a)[etamaxindex+1]*(*H)[etamaxindex+1]*(*eta)[etamaxindex+1])) + (win::X(kc*(*eta)[etaminindex])*(*Gp)[etaminindex]/((*a)[etaminindex]*(*H)[etaminindex]*(*eta)[etaminindex])))/3.; // correction for under/over counting in the above loop } //Write results to I0 and I1 I0.push_back(I0temp); I1.push_back(I1temp/sqrt(2.)); //Fill Delta2GSR and Delta2NLA... Delta2GSR.push_back( exp(Gmin + I0temp + log(1. + I1temp*I1temp/2.)) ); std::cout << kmpc << " " << Delta2GSR.back() << " " << I0temp << std::endl; } // end of kin loop */ } // end of approx_calc()