Example #1
0
 def jac(mg2, v2, mn2, temp, vb2, lam, N):
     """ Jacobian for the mg2 gap equation rootfinder """
     eps = 1e-12
     if mg2 <= 0:
         mg2 = eps  # regulator for mg=0 case
     mg = sc.sqrt(mg2)
     return np.array([
         1.0 - (lam / (6. * mg)) *
         (thermal_tadpole(mg + eps, temp, MU) -
          thermal_tadpole(mg, temp, MU)) / eps,
     ])
Example #2
0
 def jac(mn2, v2, temp, vb2, lam, N):
     """ Jacobian for the mn2 gap equation rootfinder """
     eps = 1e-12
     if mn2 <= 0:
         mn2 = eps  # regulator for mg=0 case
     mn = sc.sqrt(mn2)
     return np.array([
         1.0 - (lam * (N + 2.) / (12. * mn)) *
         (thermal_tadpole(mn + eps, temp, MU) -
          thermal_tadpole(mn, temp, MU)) / eps,
     ])
Example #3
0
def si_3pi_hartree_rhs(v2,
                       mg2,
                       mn2,
                       temp,
                       vb2,
                       lam,
                       N,
                       symmetric_branch=False):
    """
    Right hand side of the equations of motion for the 2PIEA at the
    Hartree-Fock level with 3PI symmetry improvement. More precisely,
    the vertex Ward identity is enforced in place of the Higgs equation
    of motion.

    Arguments:
    v2   = the Higgs vev squared
    mg2  = the Goldstone mass squared
    mn2  = the Higgs mass squared
    temp    = the temperature
    vb2  = the Higgs vev squared at zero temperature
    lam  = the quartic coupling constant at zero temperature
    N    = the number of field components (i.e., O(N) symmetry)

    The units do not matter as long as they are all the same, e.g. GeV.

    Returns:
    A tuple (v2, mg2, mn2) of updated estimates, suitable for iteration.
    """
    assert v2 >= 0
    assert mg2 >= 0
    assert mn2 >= 0
    assert temp >= 0
    assert vb2 >= 0
    assert lam > 0
    assert N >= 1
    assert np.floor(N) == N, "N must be an integer"

    if temp > 0:
        tg = thermal_tadpole(sc.sqrt(mg2), temp, MU)
        tn = thermal_tadpole(sc.sqrt(mn2), temp, MU)
    else:
        tg = 0
        tn = 0

    if not symmetric_branch:
        # broken symmetry branch
        return (vb2 - ((N + 1.) * temp**2.) / 12. - tn, 0., lam * v2 / 3.)
    else:
        # symmetric branch
        return (0., (lam / 6.) * (-vb2 + (N + 1) * tg + tn),
                (lam / 6.) * (-vb2 + (N + 1) * tg + tn))
Example #4
0
def si_2pi_hartree_solution(temp,
                            vb2,
                            lam,
                            N,
                            maxsteps=20,
                            tol=1e-3,
                            update_weight=0.2):
    """
    Solution of the equations of motion for the 2PIEA with
    symmetry improvement. This is the same procedure used in:

    A. Pilaftsis and D. Teresi, Symmetry-Improved CJT Effective Action.
    Nucl. Phys. B 874, 594 (2013) http://arxiv.org/abs/1305.3221.

    Arguments:
    temp    = the temperature
    vb2  = the Higgs vev squared at zero temperature
    lam  = the quartic coupling constant at zero temperature
    N    = the number of field components (i.e., O(N) symmetry)
    maxsteps = maximum number of iteration steps (defaults to 20)
    tol  = the absolute tolerance goal for the solution (component-wise)
    symmetric_branch = whether or not to solve for the symmetric or broken
            symmetry phase solution (defaults to False)
    update_weight = the weighting given to new updates in the iterative
            procedure (defaults to 0.2, must be between 0 and 1)

    The units do not matter as long as they are all the same, e.g. GeV.

    Returns:
    A tuple (v2, mg2, mn2) of
    v2  = the Higgs vev squared
    mg2 = the Goldstone mass squared
    mn2 = the Higgs mass squared
    """
    assert temp >= 0
    assert vb2 >= 0
    assert lam > 0
    assert N >= 1
    assert np.floor(N) == N, "N must be an integer"
    assert maxsteps > 1
    assert np.floor(maxsteps) == maxsteps, "maxsteps must be an integer"

    crit_T2 = 12. * vb2 / (N + 2.)
    mn2 = (lam * vb2 / 3.) * (1. - temp**2. / crit_T2)
    if temp == 0:
        return (vb2, 0., mn2)
    elif 0 < temp**2. <= crit_T2:
        # analytical solution exists!
        tn = thermal_tadpole(sc.sqrt(mn2), temp, MU)
        return ((3. * mn2 / lam) + ((temp**2.) / 12.) - tn, 0., mn2)
    else:
        # symmetric phase - same solution as the unimproved case
        return no_si_solution(temp,
                              vb2,
                              lam,
                              N,
                              maxsteps=maxsteps,
                              tol=tol,
                              symmetric_branch=True,
                              update_weight=update_weight)
Example #5
0
def no_si_rhs(v2, mg2, mn2, temp, vb2, lam, N, symmetric_branch=False):
    """
    TODO: Currently breaks near the critical temperature!
    Right hand side of the equations of motion for the 2PIEA without symmetry
    improvement.

    Arguments:
    v2   = the Higgs vev squared
    mg2  = the Goldstone mass squared
    mn2  = the Higgs mass squared
    temp    = the temperature
    vb2  = the Higgs vev squared at zero temperature
    lam  = the quartic coupling constant at zero temperature
    N    = the number of field components (i.e., O(N) symmetry)
    symmetric_branch = Boolean indicating whether to compute for the symmetric
            or broken symmetry phase. Defaults to False. Note that this routine
            does not do the checking to make sure that the specified phase
            exists for the given parameter values.

    The units do not matter as long as they are all the same, e.g. GeV.

    Returns:
    A tuple (v2, mg2, mn2) of updated estimates, suitable for iteration.
    """
    assert v2 >= 0
    assert mg2 >= 0
    assert mn2 >= 0
    assert temp >= 0
    assert vb2 >= 0
    assert lam > 0
    assert N >= 1
    assert np.floor(N) == N, "N must be an integer"

    if temp > 0:
        tg = thermal_tadpole(sc.sqrt(mg2), temp, MU)
        tn = thermal_tadpole(sc.sqrt(mn2), temp, MU)
    else:
        tg = 0
        tn = 0

    if symmetric_branch:
        return (0., (lam / 6.) * (-vb2 + (N + 1) * tg + tn),
                (lam / 6.) * (-vb2 + (N + 1) * tg + tn))  # mn == mg in sym.
    else:
        return (vb2 - (N - 1) * tg - 3. * tn, lam * (tg - tn) / 3.,
                lam * v2 / 3.)