rge_sm.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # evolve the RGEs of the standard model from electroweak scale up
  2. # by dpgeorge
  3. import math
  4. class RungeKutta(object):
  5. def __init__(self, functions, initConditions, t0, dh, save=True):
  6. self.Trajectory, self.save = [[t0] + initConditions], save
  7. self.functions = [lambda *args: 1.0] + list(functions)
  8. self.N, self.dh = len(self.functions), dh
  9. self.coeff = [1.0/6.0, 2.0/6.0, 2.0/6.0, 1.0/6.0]
  10. self.InArgCoeff = [0.0, 0.5, 0.5, 1.0]
  11. def iterate(self):
  12. step = self.Trajectory[-1][:]
  13. istep, iac = step[:], self.InArgCoeff
  14. k, ktmp = self.N * [0.0], self.N * [0.0]
  15. for ic, c in enumerate(self.coeff):
  16. for if_, f in enumerate(self.functions):
  17. arguments = [ (x + k[i]*iac[ic]) for i, x in enumerate(istep)]
  18. try:
  19. feval = f(*arguments)
  20. except OverflowError:
  21. return False
  22. if abs(feval) > 1e2: # stop integrating
  23. return False
  24. ktmp[if_] = self.dh * feval
  25. k = ktmp[:]
  26. step = [s + c*k[ik] for ik,s in enumerate(step)]
  27. if self.save:
  28. self.Trajectory += [step]
  29. else:
  30. self.Trajectory = [step]
  31. return True
  32. def solve(self, finishtime):
  33. while self.Trajectory[-1][0] < finishtime:
  34. if not self.iterate():
  35. break
  36. def solveNSteps(self, nSteps):
  37. for i in range(nSteps):
  38. if not self.iterate():
  39. break
  40. def series(self):
  41. return zip(*self.Trajectory)
  42. # 1-loop RGES for the main parameters of the SM
  43. # couplings are: g1, g2, g3 of U(1), SU(2), SU(3); yt (top Yukawa), lambda (Higgs quartic)
  44. # see arxiv.org/abs/0812.4950, eqs 10-15
  45. sysSM = (
  46. lambda *a: 41.0 / 96.0 / math.pi**2 * a[1]**3, # g1
  47. lambda *a: -19.0 / 96.0 / math.pi**2 * a[2]**3, # g2
  48. lambda *a: -42.0 / 96.0 / math.pi**2 * a[3]**3, # g3
  49. lambda *a: 1.0 / 16.0 / math.pi**2 * (9.0 / 2.0 * a[4]**3 - 8.0 * a[3]**2 * a[4] - 9.0 / 4.0 * a[2]**2 * a[4] - 17.0 / 12.0 * a[1]**2 * a[4]), # yt
  50. lambda *a: 1.0 / 16.0 / math.pi**2 * (24.0 * a[5]**2 + 12.0 * a[4]**2 * a[5] - 9.0 * a[5] * (a[2]**2 + 1.0 / 3.0 * a[1]**2) - 6.0 * a[4]**4 + 9.0 / 8.0 * a[2]**4 + 3.0 / 8.0 * a[1]**4 + 3.0 / 4.0 * a[2]**2 * a[1]**2), # lambda
  51. )
  52. def drange(start, stop, step):
  53. r = start
  54. while r < stop:
  55. yield r
  56. r += step
  57. def phaseDiagram(system, trajStart, trajPlot, h=0.1, tend=1.0, range=1.0):
  58. tstart = 0.0
  59. for i in drange(0, range, 0.1 * range):
  60. for j in drange(0, range, 0.1 * range):
  61. rk = RungeKutta(system, trajStart(i, j), tstart, h)
  62. rk.solve(tend)
  63. # draw the line
  64. for tr in rk.Trajectory:
  65. x, y = trajPlot(tr)
  66. print(x, y)
  67. print()
  68. # draw the arrow
  69. continue
  70. l = (len(rk.Trajectory) - 1) / 3
  71. if l > 0 and 2 * l < len(rk.Trajectory):
  72. p1 = rk.Trajectory[l]
  73. p2 = rk.Trajectory[2 * l]
  74. x1, y1 = trajPlot(p1)
  75. x2, y2 = trajPlot(p2)
  76. dx = -0.5 * (y2 - y1) # orthogonal to line
  77. dy = 0.5 * (x2 - x1) # orthogonal to line
  78. #l = math.sqrt(dx*dx + dy*dy)
  79. #if abs(l) > 1e-3:
  80. # l = 0.1 / l
  81. # dx *= l
  82. # dy *= l
  83. print(x1 + dx, y1 + dy)
  84. print(x2, y2)
  85. print(x1 - dx, y1 - dy)
  86. print()
  87. def singleTraj(system, trajStart, h=0.02, tend=1.0):
  88. tstart = 0.0
  89. # compute the trajectory
  90. rk = RungeKutta(system, trajStart, tstart, h)
  91. rk.solve(tend)
  92. # print out trajectory
  93. for i in range(len(rk.Trajectory)):
  94. tr = rk.Trajectory[i]
  95. print(' '.join(["{:.4f}".format(t) for t in tr]))
  96. #phaseDiagram(sysSM, (lambda i, j: [0.354, 0.654, 1.278, 0.8 + 0.2 * i, 0.1 + 0.1 * j]), (lambda a: (a[4], a[5])), h=0.1, tend=math.log(10**17))
  97. # initial conditions at M_Z
  98. singleTraj(sysSM, [0.354, 0.654, 1.278, 0.983, 0.131], h=0.5, tend=math.log(10**17)) # true values