Ejemplo n.º 1
0
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;
    }
}
Ejemplo n.º 2
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) );
}
Ejemplo n.º 3
0
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);
}