EWSMcache::EWSMcache(const StandardModel& SM_i) : SM(SM_i), PV(true) { FlagDebug = false; FlagCacheInEWSMcache = true; // use caches in the current class //FlagCacheInEWSMcache = false;// do not use caches in the current class (for test) log2 = log(2.0); /* zeta functions */ zeta2 = gsl_sf_zeta_int(2); zeta3 = gsl_sf_zeta_int(3); zeta4 = gsl_sf_zeta_int(4); zeta5 = gsl_sf_zeta_int(5); /* Constants for three-loop contribution */ double Cl2_Pi_3 = Clausen.Cl2(M_PI / 3.0); S2 = 4.0 / 9.0 / sqrt(3.0) * Cl2_Pi_3; D3 = 6.0 * zeta3 - 15.0 / 4.0 * zeta4 - 6.0 * Cl2_Pi_3*Cl2_Pi_3; B4 = -1.76280008707377; //double Li4_1_2 = ??; //B4 = 16.0*Li4_1_2 - 4.0*zeta2*log2*log2 + 2.0/3.0*pow(log2,4.0) - 13.0/2.0*zeta4; // Initializations of the cache for (int i = 0; i < 12; ++i) { mf_atMz_cache[i] = 0.0; for (int j = 0; j < StandardModel::NumSMParamsForEWPO; ++j) mf_atMz_params_cache[i][j] = 0.0; } }
double ClausenFunctions::Cl3(const double phi) const { if (phi < 0.0 || phi > M_PI) throw std::runtime_error("ClausenFunctions::Cl3(): phi is out of range!"); if (phi==0.0) return ( gsl_sf_zeta_int(3) ); double TMP = 0.0, l_double = 0.0, lfactorial = 1.0, sign = 1.0; for (int l=2; l<19; l++) { l_double = (double)l; lfactorial *= l_double; if (l%4) { sign = - 1.0; } else { sign = 1.0; } TMP += B[l]*pow(phi,l_double)/l_double/(l_double + 1.0)/(l_double + 2.0) /lfactorial * sign; } return ( gsl_sf_zeta_int(3) - phi*phi*(3.0/4.0 - log(phi)/2.0 - TMP) ); }
double Polylogarithms::Li3(const double x) const { double Li3 = 0.0; if (x < 0.0) Li3 = -gsl_sf_fermi_dirac_2(log(-x)); else if (x == 0.0) Li3 = 0.0; else if (x > 0.0 && x < 0.5) { double log_1mx = log(1.0 - x); double lfactorial = 1.0, kfactorial = 1.0; for (int l=0; l<19; l++) { if (l!=0) lfactorial *= (double)l; kfactorial = 1.0; for (int k=0; k<19; k++) { if (k!=0) kfactorial *= (double)k; Li3 += B[l]*B[k]/((double)l+1.0)/((double)l+(double)k+1.0) /lfactorial/kfactorial * pow(-log_1mx, (double)l+(double)k+1.0); } } } else if (x == 0.5) { double log2 = log(2.0); double zeta3 = gsl_sf_zeta_int(3); Li3 = (4.0*pow(log2, 3.0) - 2.0*M_PI*M_PI*log2 + 21.0*zeta3)/24.0; } else if (x > 0.5 && x < 1.0) { double log_x = log(x); double S12 = 0.0, lfactorial = 1.0; for (int l=0; l<19; l++) { if (l!=0) lfactorial *= (double)l; S12 += 0.5 * B[l]/((double)l+2.0)/lfactorial * pow(-log_x, (double)l+2.0); } Li3 = - S12 - log_x*gsl_sf_dilog(1.0-x) - 0.5*log_x*log_x*log(1.0-x) + gsl_sf_zeta_int(2)*log_x + gsl_sf_zeta_int(3); } else if (x == 1.0) Li3 = gsl_sf_zeta_int(3); else throw std::runtime_error("Polylogarithms::Li3(): x is out of range!"); return (Li3); }