TransitionListener 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. transitionlistener/__init__.py +21 -0
  2. transitionlistener/bubbledynamics.py +2250 -0
  3. transitionlistener/bubbledynamics_fixedstep.py +2929 -0
  4. transitionlistener/check_installation.py +309 -0
  5. transitionlistener/ckm.py +91 -0
  6. transitionlistener/colors.py +288 -0
  7. transitionlistener/config.py +185 -0
  8. transitionlistener/constants.py +64 -0
  9. transitionlistener/counterterms/__init__.py +230 -0
  10. transitionlistener/counterterms/cw.py +298 -0
  11. transitionlistener/counterterms/tensors.py +343 -0
  12. transitionlistener/counterterms/twohdm.py +520 -0
  13. transitionlistener/counterterms/twohdm_solver.py +374 -0
  14. transitionlistener/errors.py +315 -0
  15. transitionlistener/examples/bp_et.yaml +64 -0
  16. transitionlistener/examples/bp_lisa.yaml +70 -0
  17. transitionlistener/examples/bp_muares.yaml +69 -0
  18. transitionlistener/examples/bp_pta.yaml +64 -0
  19. transitionlistener/examples/example_dark_photon.yaml +73 -0
  20. transitionlistener/examples/example_grid.yaml +55 -0
  21. transitionlistener/examples/example_line.yaml +51 -0
  22. transitionlistener/examples/example_point.yaml +73 -0
  23. transitionlistener/examples/example_random_conformal.yaml +42 -0
  24. transitionlistener/examples/example_ultranest.yaml +39 -0
  25. transitionlistener/finiteT.py +468 -0
  26. transitionlistener/generic_potential.py +1521 -0
  27. transitionlistener/gridplots.py +592 -0
  28. transitionlistener/gwfopt.py +604 -0
  29. transitionlistener/helper_functions.py +843 -0
  30. transitionlistener/hydrodynamics.py +647 -0
  31. transitionlistener/interface/__init__.py +95 -0
  32. transitionlistener/interface/check.py +51 -0
  33. transitionlistener/interface/cli.py +211 -0
  34. transitionlistener/interface/config_loader.py +264 -0
  35. transitionlistener/interface/logging_utils.py +30 -0
  36. transitionlistener/interface/output_schema.py +296 -0
  37. transitionlistener/interface/pipeline.py +300 -0
  38. transitionlistener/interface/samplers.py +565 -0
  39. transitionlistener/interface/scans.py +468 -0
  40. transitionlistener/interface/single_point.py +581 -0
  41. transitionlistener/interface/state.py +61 -0
  42. transitionlistener/lineplots.py +597 -0
  43. transitionlistener/logo/TL-logo_large.png +0 -0
  44. transitionlistener/logo/TL-logo_small.png +0 -0
  45. transitionlistener/models/TL_2HDM.py +512 -0
  46. transitionlistener/models/TL_conformal_dark_u1.py +202 -0
  47. transitionlistener/models/TL_dark_U1.py +198 -0
  48. transitionlistener/models/TL_dark_U1_g_parameterization.py +198 -0
  49. transitionlistener/models/TL_dark_flipflop.py +274 -0
  50. transitionlistener/models/templatePotential.py +260 -0
  51. transitionlistener/nucleation.py +412 -0
  52. transitionlistener/observability.py +790 -0
  53. transitionlistener/particles.py +436 -0
  54. transitionlistener/pathDeformation.py +1462 -0
  55. transitionlistener/percolation_adaptive_gridbuilders.py +1385 -0
  56. transitionlistener/percolation_adaptive_rate.py +1049 -0
  57. transitionlistener/percolation_adaptivestepsize.py +1632 -0
  58. transitionlistener/percolation_fixedstepsize.py +618 -0
  59. transitionlistener/phases.py +1499 -0
  60. transitionlistener/plot_settings.py +121 -0
  61. transitionlistener/plots.py +1781 -0
  62. transitionlistener/runtime_options.py +278 -0
  63. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/bandwidths.npy +0 -0
  64. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/density.npy +0 -0
  65. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/freqs.npy +0 -0
  66. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/log.txt +16 -0
  67. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/log10rhogrid.npy +0 -0
  68. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/log10rholabels.txt +30 -0
  69. transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/pulsar_list.txt +1 -0
  70. transitionlistener/tab_data/HLV-O2-PLI.csv +82 -0
  71. transitionlistener/tab_data/HLV-O2-noise.csv +83 -0
  72. transitionlistener/tab_data/HLVK-design-PLI.csv +61 -0
  73. transitionlistener/tab_data/HLVK-design-noise.csv +83 -0
  74. transitionlistener/tab_data/NG15_PLI_hc.csv +31 -0
  75. transitionlistener/tab_data/NG15_noise_hc.csv +56 -0
  76. transitionlistener/tab_data/PLI-dataset.csv +327 -0
  77. transitionlistener/tab_data/energydensities.dat +1001 -0
  78. transitionlistener/tab_data/finiteT_b.dat.txt +1999 -0
  79. transitionlistener/tab_data/finiteT_f.dat.txt +1000 -0
  80. transitionlistener/tab_data/geff_SM.dat +10009 -0
  81. transitionlistener/tab_data/muAres_f_Hz_PLI_h2OmegaGW.csv +131 -0
  82. transitionlistener/tab_data/muAres_f_Hz_h2Omega_noise.csv +99 -0
  83. transitionlistener/tab_data/noise-dataset.csv +327 -0
  84. transitionlistener/tab_data/numberdensities.dat +1001 -0
  85. transitionlistener/tab_data/pressures.dat +1001 -0
  86. transitionlistener/thermodynamics.py +686 -0
  87. transitionlistener/transitionObservables.py +1199 -0
  88. transitionlistener/transitionObservables_fixedstep.py +976 -0
  89. transitionlistener/transitions.py +1000 -0
  90. transitionlistener/tunneling1D.py +910 -0
  91. transitionlistener-2.0.0.dist-info/METADATA +817 -0
  92. transitionlistener-2.0.0.dist-info/RECORD +95 -0
  93. transitionlistener-2.0.0.dist-info/WHEEL +4 -0
  94. transitionlistener-2.0.0.dist-info/entry_points.txt +2 -0
  95. transitionlistener-2.0.0.dist-info/licenses/LICENSE.txt +674 -0
@@ -0,0 +1,202 @@
1
+ """
2
+ This module contains the Higgs potential for a conformal dark
3
+ U(1) model with a dark photon, a dark Higgs and a dark fermion.
4
+
5
+ Part of TransitionListener v2.0
6
+ Documentation: https://tasillo.de/TransitionListener/
7
+
8
+ Authors:
9
+ Jonas Matuszak <jonas.matuszak@kit.edu>
10
+ Carlo Tasillo <carlo.tasillo@ific.uv.es>
11
+ """
12
+
13
+ import numpy as np
14
+ from transitionlistener import generic_potential
15
+ from transitionlistener.errors import InitPotentialError
16
+ from transitionlistener import config
17
+ from transitionlistener.particles import MassSpectrum, Scalar, GaugeBoson, Fermion, Goldstone
18
+
19
+
20
+ class specific_potential(generic_potential.generic_potential):
21
+ """Conformal dark U(1) model potential class."""
22
+
23
+ model_parameters = {
24
+ "g": {
25
+ "default": 1,
26
+ "plotname": r"$g$",
27
+ "min": 0,
28
+ "max": 4 * np.pi},
29
+ "y": {
30
+ "default": 0.1,
31
+ "plotname": r"$y$",
32
+ "min": 0,
33
+ "max": 4 * np.pi},
34
+ "v_GeV": {
35
+ "default": 1,
36
+ "plotname": r"$v$ [GeV]",
37
+ "min": 0,
38
+ "max": np.inf}
39
+ }
40
+
41
+ def init(self, inputparam_dict, verbose=True):
42
+ """Initialise the conformal dark U(1) model from input parameters."""
43
+ # Set the values of the model parameters and check if they are in range
44
+ self.mp = self.set_modelparams(inputparam_dict)
45
+ g, y, v_GeV = [self.mp[name]["value"] for name in self.mp.keys()]
46
+
47
+ self.Ndim = 1 # Number of scalars
48
+
49
+ # Fermion parameters:
50
+ self.Q_l = 1/2
51
+ self.Q_r = -1/2
52
+ self.g = g
53
+ self.y = y
54
+ self.v_GeV = v_GeV
55
+ self.verbose = verbose
56
+
57
+ # Parameters
58
+ self.v_GeV = v_GeV
59
+ self.daisy = "ArnoldEspinosa"
60
+ self.v_stable = 1000
61
+ self.Z2_cutoff = -5
62
+ self.X0 = np.array([self.v_stable])
63
+ self.conversionFactor = self.computeConversionFactor(self.v_stable, v_GeV)
64
+
65
+ self.l = self.calcSelfcouping()
66
+ self.v = self.v_stable
67
+ self.renormScaleSq = self.v * self.v
68
+ self.mass_spectrum = self._build_mass_spectrum()
69
+ self.derived_parameters = {"lambda": self.l}
70
+
71
+ def calcSelfcouping(self):
72
+ """Return the quartic coupling consistent with radiative symmetry breaking."""
73
+ l = 1/55*(12*np.pi**2 - np.sqrt((-1815*self.g**4 + 288*np.pi**4 + 605*self.y**4)/2))
74
+ if l < 0:
75
+ raise InitPotentialError(
76
+ "The Higgs quartic coupling is negative, because the Yukawa " +
77
+ "coupling was chosen too large! The Higgs potential is not bounded from below.")
78
+ return l
79
+
80
+ def setConfigParameters(self) -> None:
81
+ """Change the default config parameters for tracing, hydrodynamics, and GW
82
+ computation.
83
+
84
+ ``algorithm_mode`` (adaptive_step_size / fixed_step_size) is left at
85
+ the ``PercolationConf`` default and can be set per-run from the YAML.
86
+ """
87
+ self.config.tracingConf.gen_mirror_phases = False
88
+ self.config.tracingConf.tracing_field_accuracy = 1e-3 # for Hessian
89
+
90
+ def V0(self, X):
91
+ """
92
+ This method defines the tree-level potential.
93
+ """
94
+ X = np.asanyarray(X)
95
+ v = X[..., 0]
96
+ r = self.l * (v**4.) / 4.
97
+ return r
98
+
99
+ def V1(self, bosons, fermions) -> np.ndarray:
100
+ """One-loop corrections to the zero-temperature potential."""
101
+ m2, n, _, _ = bosons
102
+
103
+ la2 = np.array([3 * self.l, self.l, self.g**2, self.g**2], dtype=float)
104
+ y = np.sum(
105
+ n * m2 * m2 * (np.log(np.abs(m2 / (la2 * self.renormScaleSq)) + 1e-100) - 25.0 / 6.0),
106
+ axis=-1,
107
+ )
108
+
109
+ m2f, nf = fermions
110
+ y2 = np.array([self.y**2 / 2.0, self.y**2 / 2.0], dtype=float)
111
+ y -= np.sum(
112
+ nf * m2f * m2f * (np.log(np.abs(m2f / (y2 * self.renormScaleSq)) + 1e-100) - 25.0 / 6.0),
113
+ axis=-1,
114
+ )
115
+
116
+ return y / (64 * np.pi * np.pi)
117
+
118
+ def _build_mass_spectrum(self) -> MassSpectrum:
119
+
120
+ phi_particle = Scalar(
121
+ name="m_phi",
122
+ latex_name=r"$m_\phi$",
123
+ dof=1,
124
+ is_SM=False,
125
+ )
126
+ goldstone = Goldstone(
127
+ name="m_varphi",
128
+ latex_name=r"$m_\varphi$",
129
+ dof=1,
130
+ is_SM=False,
131
+ )
132
+ dark_photon_T = GaugeBoson(
133
+ name="m_A_T",
134
+ latex_name=r"$m_{A^\prime_T}$",
135
+ dof=2,
136
+ gauge_coupling=self.g,
137
+ is_SM=False,
138
+ )
139
+ dark_photon_L = GaugeBoson(
140
+ name="m_A_L",
141
+ latex_name=r"$m_{A^\prime_L}$",
142
+ dof=1,
143
+ gauge_coupling=self.g,
144
+ is_SM=False,
145
+ )
146
+
147
+ def boson_mass_function(X, T):
148
+ X = np.asarray(X)
149
+ T2 = T * T
150
+
151
+ scalar_prefactor = self.l / 3.0 + self.g**2 / 4.0 + self.y**2 / 12.0
152
+ longitudinal_prefactor = (1.0 / 3.0 + (self.Q_l**2 + self.Q_r**2) / 6.0) * self.g**2
153
+
154
+ phi = X[..., 0]
155
+ phi_sq = phi * phi
156
+ even = 3.0 * self.l * phi_sq
157
+ odd = self.l * phi_sq
158
+ mDP2 = self.g**2 * phi_sq
159
+ mDP2L = mDP2
160
+
161
+ Nbosons = 4
162
+ M2 = np.empty(phi.shape + (Nbosons,))
163
+ M2[..., 0] = even + scalar_prefactor * T2
164
+ M2[..., 1] = odd + scalar_prefactor * T2
165
+ M2[..., 2] = mDP2
166
+ M2[..., 3] = mDP2L + longitudinal_prefactor * T2
167
+ return M2
168
+
169
+
170
+ def fermion_mass_function(X):
171
+
172
+ X = np.asarray(X)
173
+ phi = X[..., 0]
174
+ msq = 0.5 * self.y**2 * phi**2
175
+
176
+ Nfermions = 2
177
+ M2 = np.empty(phi.shape + (Nfermions,))
178
+ M2[..., 0] = msq
179
+ M2[..., 1] = msq
180
+
181
+ return M2
182
+
183
+ fermion_L = Fermion(name="m_psi1", latex_name=r"$m_{\psi_1}$", dof=2, is_SM=False)
184
+ fermion_R = Fermion(name="m_psi2", latex_name=r"$m_{\psi_2}$", dof=2, is_SM=False)
185
+
186
+ GaugeBosons = [dark_photon_T,
187
+ dark_photon_L]
188
+ Scalars = [phi_particle, goldstone]
189
+ Fermions = [fermion_L, fermion_R]
190
+
191
+ spectrum = MassSpectrum(Scalars, GaugeBosons, Fermions,
192
+ boson_massSq_fn=boson_mass_function,
193
+ fermion_massSq_fn=fermion_mass_function)
194
+
195
+ return spectrum
196
+
197
+ def forbidPhaseCrit(self, X):
198
+ """
199
+ forbidPhaseCrit is used since there is a Z2 symmetry in the theory and
200
+ we don't want to double-count all of the phases.
201
+ """
202
+ return (np.array([X])[..., 0] < self.Z2_cutoff).any()
@@ -0,0 +1,198 @@
1
+ """
2
+ This module contains the Higgs potential for a dark
3
+ U(1) model with a dark photon and a dark Higgs.
4
+
5
+ Part of TransitionListener v2.0
6
+ Documentation: https://tasillo.de/TransitionListener/
7
+
8
+ Authors:
9
+ Jonas Matuszak <jonas.matuszak@kit.edu>
10
+ Carlo Tasillo <carlo.tasillo@ific.uv.es>
11
+ """
12
+
13
+ import numpy as np
14
+ from transitionlistener import generic_potential
15
+ from transitionlistener.constants import *
16
+ from transitionlistener import config
17
+ from transitionlistener.particles import MassSpectrum, Scalar, Goldstone, GaugeBoson
18
+
19
+ class specific_potential(generic_potential.generic_potential):
20
+ """Dark U(1) model variant with corrected Debye masses."""
21
+
22
+ model_parameters = {
23
+ "g_tilde": {
24
+ "default": 1,
25
+ "plotname": r"$g\cdot \lambda^{-1/4}$",
26
+ "min": 0,
27
+ "max": 4 * np.pi},
28
+ "l": {
29
+ "default": 0.1,
30
+ "plotname": r"$\lambda$",
31
+ "min": 0,
32
+ "max": 4 * np.pi},
33
+ "v_GeV": {
34
+ "default": 1,
35
+ "plotname": r"$v$ [GeV]",
36
+ "min": 0,
37
+ "max": np.inf}
38
+ }
39
+
40
+ def init(self, inp, verbose=True):
41
+ """Initialise the model parameters and thermal masses."""
42
+ self.mp = self.set_modelparams(inp)
43
+ g_tilde, l, v_GeV = [self.mp[name]["value"] for name in self.mp.keys()]
44
+ g = g_tilde * np.power(l, 1/4)
45
+ self.retrieved_input = np.array([g, l, v_GeV])
46
+ self.Ndim = 1
47
+ self.v_GeV = v_GeV
48
+ self.verbose = verbose
49
+
50
+ self.internal_scale = 1000
51
+ self.v = self.internal_scale
52
+ self.X0 = [self.v]
53
+ self.daisy = "ArnoldEspinosa"
54
+ self.Z2_cutoff = -5
55
+ self.conversionFactor = self.computeConversionFactor(self.internal_scale, v_GeV)
56
+
57
+ self.g = g
58
+ self.l = l
59
+ self.mu2 = self.l * self.v**2.
60
+ self.mu = np.sqrt(self.mu2)
61
+ self.mu_GeV = self.mu * self.conversionFactor
62
+ self.v2 = self.v**2.
63
+ self.mDP = self.g * self.v
64
+ self.mDP_GeV = self.mDP * self.conversionFactor
65
+ self.mDP2 = self.g**2. * self.v**2
66
+ self.mDH = np.sqrt(-self.mu2 + 3.*self.l*self.v**2.)
67
+ self.mDH_GeV = self.mDH * self.conversionFactor
68
+ self.renormScaleSq = self.v2
69
+
70
+ self.mass_spectrum = self._build_mass_spectrum()
71
+
72
+ # Calculate counter mass and counter coupling
73
+ self.x_eps = 0.1
74
+ dV1 = self.dV1atvev()
75
+ d2V1 = self.d2V1atvev()
76
+ self.x_eps = 0.1
77
+ self.dmu2 = 3./2. * dV1 / self.v - 1./2. * d2V1
78
+ self.dmu2_GeV2 = self.dmu2 * self.conversionFactor**2.
79
+ self.dl = 1./2. * dV1 / self.v**3. - 1./2. * d2V1 / self.v**2.
80
+
81
+ self.derived_param_names = [name for name in config.all_observables.keys()]
82
+ self.derived_param_plot_names = [config.all_observables[name] for name in self.derived_param_names]
83
+
84
+ if self.verbose:
85
+ input_dict = dict(vev_GeV=self.v_GeV, quartic_coupling=self.l,
86
+ gauge_coupling=self.g, conversion_factor=self.conversionFactor)
87
+ derived_dict = dict(mDP_GeV=self.mDP_GeV, mDH_GeV=self.mDH_GeV,
88
+ mu2_GeV2=self.mu_GeV**2,
89
+ dmu2_GeV2=self.dmu2_GeV2, dl=self.dl,
90
+ renormScaleSq=self.renormScaleSq)
91
+ self.makePrettyDictionaryPrint(derived_dict)
92
+
93
+ def setConfigParameters(self) -> None:
94
+ """Change the default config parameters for tracing, hydrodynamics, and GW
95
+ computation.
96
+ """
97
+
98
+ # Adjust to allow for weak phase transitions as well!
99
+ self.config.tracingConf.approx_strength_threshold = 1e-7
100
+ self.config.gwConf.weak_threshold = 1e-7
101
+ self.config.percolationConf.n_action = 30
102
+
103
+ def forbidPhaseCrit(self, X):
104
+ """
105
+ forbidPhaseCrit is used since there is a Z2 symmetry in the theory and
106
+ we don't want to double-count all of the phases.
107
+ """
108
+ return (np.array([X])[..., 0] < -5.).any()
109
+
110
+ def V0(self, X):
111
+ """
112
+ This method defines the tree-level potential.
113
+ """
114
+ X = np.asanyarray(X)
115
+ phi = X[...,0]
116
+ r = - self.mu2*(phi**2.)/2. + self.l*(phi**4.)/4.
117
+ return r
118
+
119
+ def Vct(self, X):
120
+ """
121
+ The counterterm lagrangian is the same as the tree level lagrangian but
122
+ with masses and couplings replaced by counter term values (i.e. here
123
+ mu2 -> dmu2 and l -> dl). Assume potential of the form
124
+ V = - 1/2 mu**2 h**2 + lambda/4 h**4 where h is the investigated scalar field
125
+ """
126
+ X = np.array(X)
127
+ phi = X[...,0]
128
+ r = - self.dmu2*(phi**2.)/2. + self.dl*(phi**4.)/4.
129
+ return r
130
+
131
+
132
+ def _build_mass_spectrum(self) -> MassSpectrum:
133
+ """Construct the mass spectrum for the corrected Debye-mass variant."""
134
+
135
+ scalar_prefactor = self.l / 3.0 + self.g * self.g / 4.0
136
+ longitudinal_prefactor = (1.0 / 3.0) * self.g * self.g
137
+
138
+ phi_particle = Scalar(
139
+ name="m_phi",
140
+ latex_name=r"$m_\phi$",
141
+ dof=1,
142
+ is_SM=False,
143
+ )
144
+ goldstone = Goldstone(
145
+ name="m_varphi",
146
+ latex_name=r"$m_\varphi$",
147
+ dof=1,
148
+ is_SM=False,
149
+ )
150
+ dark_photon_T = GaugeBoson(
151
+ name="m_A_T",
152
+ latex_name=r"$m_{A^\prime_T}$",
153
+ dof=2,
154
+ gauge_coupling=self.g,
155
+ is_SM=False,
156
+ )
157
+ dark_photon_L = GaugeBoson(
158
+ name="m_A_L",
159
+ latex_name=r"$m_{A^\prime_L}$",
160
+ dof=1,
161
+ gauge_coupling=self.g,
162
+ is_SM=False,
163
+ )
164
+
165
+ def boson_mass_function(X, T):
166
+ X = np.asarray(X)
167
+ phi = X[..., 0]
168
+ phi_sq = phi * phi
169
+ even = -self.mu2 + 3.0 * self.l * phi_sq
170
+ odd = -self.mu2 + self.l * phi_sq
171
+ transverse = self.g * self.g * phi_sq
172
+ longitudinal = transverse
173
+
174
+ Nbosons = 4
175
+ M2 = np.empty(phi.shape + (Nbosons,))
176
+ M2[..., 0] = even + scalar_prefactor * T*T
177
+ M2[..., 1] = odd + scalar_prefactor * T*T
178
+ M2[..., 2] = transverse
179
+ M2[..., 3] = longitudinal + longitudinal_prefactor * T * T
180
+
181
+ return M2
182
+
183
+
184
+ scalars = [phi_particle, goldstone]
185
+ gauge_bosons = [dark_photon_T, dark_photon_L]
186
+ spectrum = MassSpectrum(scalars=scalars, gaugeBosons=gauge_bosons,
187
+ boson_massSq_fn=boson_mass_function)
188
+
189
+ return spectrum
190
+
191
+ def approxZeroTMin(self):
192
+ """Return approximate zero-temperature minima for the corrected model."""
193
+ # There are generically two minima at zero temperature in this model,
194
+ # and we want to include both of them.
195
+ v = self.v2**.5
196
+ return [np.array([v])]
197
+
198
+
@@ -0,0 +1,198 @@
1
+ """
2
+ This module contains the Higgs potential for a dark
3
+ U(1) model with a dark photon and a dark Higgs.
4
+
5
+ Part of TransitionListener v2.0
6
+ Documentation: https://tasillo.de/TransitionListener/
7
+
8
+ Authors:
9
+ Jonas Matuszak <jonas.matuszak@kit.edu>
10
+ Carlo Tasillo <carlo.tasillo@ific.uv.es>
11
+ """
12
+
13
+ import numpy as np
14
+ from transitionlistener import generic_potential
15
+ from transitionlistener.constants import *
16
+ from transitionlistener import config
17
+ from transitionlistener.particles import MassSpectrum, Scalar, Goldstone, GaugeBoson
18
+
19
+ class specific_potential(generic_potential.generic_potential):
20
+ """Dark U(1) model with fermions and gauge bosons."""
21
+
22
+ model_parameters = {
23
+ "g": {
24
+ "default": 1,
25
+ "plotname": r"$g$",
26
+ "min": 0,
27
+ "max": 4 * np.pi},
28
+ "lambda": {
29
+ "default": 0.1,
30
+ "plotname": r"$\lambda$",
31
+ "min": 0,
32
+ "max": 4 * np.pi},
33
+ "v_GeV": {
34
+ "default": 1,
35
+ "plotname": r"$v$ [GeV]",
36
+ "min": 0,
37
+ "max": np.inf}
38
+ }
39
+
40
+ def init(self, inputparam_dict, verbose=True):
41
+ """Initialise the dark U(1) potential parameters from user input."""
42
+ self.mp = self.set_modelparams(inputparam_dict)
43
+ g, l, v_GeV = [self.mp[name]["value"] for name in self.mp.keys()]
44
+ self.retrieved_input = np.array([g, l, v_GeV])
45
+ self.Ndim = 1
46
+
47
+ self.v_GeV = v_GeV
48
+ self.verbose = verbose
49
+ self.daisy = "ArnoldEspinosa"
50
+
51
+ self.v_stable = 1000
52
+ self.v = self.v_stable
53
+ self.X0 = np.array([self.v])
54
+ self.conversionFactor = self.computeConversionFactor(self.v_stable, v_GeV)
55
+
56
+ self.g = g
57
+ self.l = l
58
+ self.mu2 = self.l * self.v**2.
59
+ self.mu = np.sqrt(self.mu2)
60
+ self.mu_GeV = self.mu * self.conversionFactor
61
+ self.v2 = self.v**2.
62
+ self.mDP = self.g * self.v
63
+ self.mDP_GeV = self.mDP * self.conversionFactor
64
+ self.mDP2 = self.g**2. * self.v**2
65
+ self.mDH = np.sqrt(-self.mu2 + 3.*self.l*self.v**2.)
66
+ self.mDH_GeV = self.mDH * self.conversionFactor
67
+ self.renormScaleSq = self.v2
68
+
69
+ self.mass_spectrum = self._build_mass_spectrum()
70
+
71
+ # Calculate counter mass and counter coupling
72
+ dV1 = self.dV1atvev()
73
+ d2V1 = self.d2V1atvev()
74
+ self.dmu2 = 3./2. * dV1 / self.v - 1./2. * d2V1
75
+ self.dmu2_GeV2 = self.dmu2 * self.conversionFactor**2.
76
+ self.dl = 1./2. * dV1 / self.v**3. - 1./2. * d2V1 / self.v**2.
77
+
78
+ # Include the input and derived parameters in the class.
79
+ self.derived_param_names = [name for name in config.all_observables.keys()]
80
+ self.derived_param_plot_names = [config.all_observables[name] for name in self.derived_param_names]
81
+
82
+ if self.verbose:
83
+ derived_dict = dict(mDP_GeV=self.mDP_GeV, mDH_GeV=self.mDH_GeV,
84
+ mu2_GeV2=self.mu_GeV**2,
85
+ dmu2_GeV2=self.dmu2_GeV2, dl=self.dl,
86
+ renormScaleSq=self.renormScaleSq)
87
+ self.makePrettyDictionaryPrint(derived_dict)
88
+
89
+ def setConfigParameters(self) -> None:
90
+ """Change the default config parameters for tracing, hydrodynamics, and GW
91
+ computation.
92
+ """
93
+
94
+ # Adjust to allow for weak phase transitions as well!
95
+ self.config.tracingConf.approx_strength_threshold = 1e-7
96
+ self.config.percolationConf.weak_threshold = 1e-7
97
+ self.config.percolationConf.n_action = 30
98
+ self.config.gwConf.wall_velocity = 1.0
99
+ # algorithm_mode (adaptive_step_size / fixed_step_size) is taken from
100
+ # PercolationConf's default or the YAML override. To compare both
101
+ # solvers on the same model, run the same YAML twice with different
102
+ # algorithm_mode values.
103
+
104
+ def forbidPhaseCrit(self, X):
105
+ """
106
+ forbidPhaseCrit is used since there is a Z2 symmetry in the theory and
107
+ we don't want to double-count all of the phases.
108
+ """
109
+ return (np.array([X])[..., 0] < -5.).any()
110
+
111
+ def V0(self, X):
112
+ """
113
+ This method defines the tree-level potential.
114
+ """
115
+ X = np.asanyarray(X)
116
+ phi = X[...,0]
117
+ r = - self.mu2*(phi**2.)/2. + self.l*(phi**4.)/4.
118
+ return r
119
+
120
+ def Vct(self, X):
121
+ """
122
+ The counterterm lagrangian is the same as the tree level lagrangian but
123
+ with masses and couplings replaced by counter term values (i.e. here
124
+ mu2 -> dmu2 and l -> dl). Assume potential of the form
125
+ V = - 1/2 mu**2 h**2 + lambda/4 h**4 where h is the investigated scalar field
126
+ """
127
+ X = np.array(X)
128
+ phi = X[...,0]
129
+ r = - self.dmu2*(phi**2.)/2. + self.dl*(phi**4.)/4.
130
+ return r
131
+
132
+
133
+ def _build_mass_spectrum(self) -> MassSpectrum:
134
+ """Construct the mass spectrum for the dark U(1) model."""
135
+
136
+ phi_particle = Scalar(
137
+ name="m_phi",
138
+ latex_name=r"$m_\phi$",
139
+ dof=1,
140
+ is_SM=False,
141
+ )
142
+ goldstone = Goldstone(
143
+ name="m_varphi",
144
+ latex_name=r"$m_\varphi$",
145
+ dof=1,
146
+ is_SM=False,
147
+ )
148
+ dark_photon_T = GaugeBoson(
149
+ name="m_A_T",
150
+ latex_name=r"$m_{A^\prime_T}$",
151
+ dof=2,
152
+ gauge_coupling=self.g,
153
+ is_SM=False,
154
+ )
155
+ dark_photon_L = GaugeBoson(
156
+ name="m_A_L",
157
+ latex_name=r"$m_{A^\prime_L}$",
158
+ dof=1,
159
+ gauge_coupling=self.g,
160
+ is_SM=False,
161
+ )
162
+
163
+ def boson_mass_function(X, T):
164
+ X = np.asarray(X)
165
+ phi = X[..., 0]
166
+ phi_sq = phi * phi
167
+ T2 = T * T
168
+ even = -self.mu2 + 3.0 * self.l * phi_sq
169
+ odd = -self.mu2 + self.l * phi_sq
170
+ transverse = self.g * self.g * phi_sq
171
+ longitudinal = transverse
172
+
173
+ scalar_prefactor = self.l / 3.0 + self.g * self.g / 4.0
174
+ longitudinal_prefactor = (1.0 / 3.0) * self.g * self.g
175
+
176
+ Nbosons = 4
177
+ M2 = np.empty(phi.shape + (Nbosons,))
178
+ M2[..., 0] = even + scalar_prefactor * T2
179
+ M2[..., 1] = odd + scalar_prefactor * T2
180
+ M2[..., 2] = transverse
181
+ M2[..., 3] = longitudinal + longitudinal_prefactor * T2
182
+ return M2
183
+
184
+ Scalars = [phi_particle, goldstone]
185
+ GaugeBosons = [dark_photon_T, dark_photon_L]
186
+ spectrum = MassSpectrum(scalars=Scalars, gaugeBosons=GaugeBosons,
187
+ boson_massSq_fn=boson_mass_function)
188
+
189
+ return spectrum
190
+
191
+ def approxZeroTMin(self):
192
+ """Return approximate zero-temperature minima for the dark U(1) model."""
193
+ # There are generically two minima at zero temperature in this model,
194
+ # and we want to include both of them.
195
+ v = self.v2**.5
196
+ return [np.array([v])]
197
+
198
+