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, ])
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, ])
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))
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)
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.)