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.
- transitionlistener/__init__.py +21 -0
- transitionlistener/bubbledynamics.py +2250 -0
- transitionlistener/bubbledynamics_fixedstep.py +2929 -0
- transitionlistener/check_installation.py +309 -0
- transitionlistener/ckm.py +91 -0
- transitionlistener/colors.py +288 -0
- transitionlistener/config.py +185 -0
- transitionlistener/constants.py +64 -0
- transitionlistener/counterterms/__init__.py +230 -0
- transitionlistener/counterterms/cw.py +298 -0
- transitionlistener/counterterms/tensors.py +343 -0
- transitionlistener/counterterms/twohdm.py +520 -0
- transitionlistener/counterterms/twohdm_solver.py +374 -0
- transitionlistener/errors.py +315 -0
- transitionlistener/examples/bp_et.yaml +64 -0
- transitionlistener/examples/bp_lisa.yaml +70 -0
- transitionlistener/examples/bp_muares.yaml +69 -0
- transitionlistener/examples/bp_pta.yaml +64 -0
- transitionlistener/examples/example_dark_photon.yaml +73 -0
- transitionlistener/examples/example_grid.yaml +55 -0
- transitionlistener/examples/example_line.yaml +51 -0
- transitionlistener/examples/example_point.yaml +73 -0
- transitionlistener/examples/example_random_conformal.yaml +42 -0
- transitionlistener/examples/example_ultranest.yaml +39 -0
- transitionlistener/finiteT.py +468 -0
- transitionlistener/generic_potential.py +1521 -0
- transitionlistener/gridplots.py +592 -0
- transitionlistener/gwfopt.py +604 -0
- transitionlistener/helper_functions.py +843 -0
- transitionlistener/hydrodynamics.py +647 -0
- transitionlistener/interface/__init__.py +95 -0
- transitionlistener/interface/check.py +51 -0
- transitionlistener/interface/cli.py +211 -0
- transitionlistener/interface/config_loader.py +264 -0
- transitionlistener/interface/logging_utils.py +30 -0
- transitionlistener/interface/output_schema.py +296 -0
- transitionlistener/interface/pipeline.py +300 -0
- transitionlistener/interface/samplers.py +565 -0
- transitionlistener/interface/scans.py +468 -0
- transitionlistener/interface/single_point.py +581 -0
- transitionlistener/interface/state.py +61 -0
- transitionlistener/lineplots.py +597 -0
- transitionlistener/logo/TL-logo_large.png +0 -0
- transitionlistener/logo/TL-logo_small.png +0 -0
- transitionlistener/models/TL_2HDM.py +512 -0
- transitionlistener/models/TL_conformal_dark_u1.py +202 -0
- transitionlistener/models/TL_dark_U1.py +198 -0
- transitionlistener/models/TL_dark_U1_g_parameterization.py +198 -0
- transitionlistener/models/TL_dark_flipflop.py +274 -0
- transitionlistener/models/templatePotential.py +260 -0
- transitionlistener/nucleation.py +412 -0
- transitionlistener/observability.py +790 -0
- transitionlistener/particles.py +436 -0
- transitionlistener/pathDeformation.py +1462 -0
- transitionlistener/percolation_adaptive_gridbuilders.py +1385 -0
- transitionlistener/percolation_adaptive_rate.py +1049 -0
- transitionlistener/percolation_adaptivestepsize.py +1632 -0
- transitionlistener/percolation_fixedstepsize.py +618 -0
- transitionlistener/phases.py +1499 -0
- transitionlistener/plot_settings.py +121 -0
- transitionlistener/plots.py +1781 -0
- transitionlistener/runtime_options.py +278 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/bandwidths.npy +0 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/density.npy +0 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/freqs.npy +0 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/log.txt +16 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/log10rhogrid.npy +0 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/log10rholabels.txt +30 -0
- transitionlistener/tab_data/30f_fs{hd}_100fDMGP_ceffyl/pulsar_list.txt +1 -0
- transitionlistener/tab_data/HLV-O2-PLI.csv +82 -0
- transitionlistener/tab_data/HLV-O2-noise.csv +83 -0
- transitionlistener/tab_data/HLVK-design-PLI.csv +61 -0
- transitionlistener/tab_data/HLVK-design-noise.csv +83 -0
- transitionlistener/tab_data/NG15_PLI_hc.csv +31 -0
- transitionlistener/tab_data/NG15_noise_hc.csv +56 -0
- transitionlistener/tab_data/PLI-dataset.csv +327 -0
- transitionlistener/tab_data/energydensities.dat +1001 -0
- transitionlistener/tab_data/finiteT_b.dat.txt +1999 -0
- transitionlistener/tab_data/finiteT_f.dat.txt +1000 -0
- transitionlistener/tab_data/geff_SM.dat +10009 -0
- transitionlistener/tab_data/muAres_f_Hz_PLI_h2OmegaGW.csv +131 -0
- transitionlistener/tab_data/muAres_f_Hz_h2Omega_noise.csv +99 -0
- transitionlistener/tab_data/noise-dataset.csv +327 -0
- transitionlistener/tab_data/numberdensities.dat +1001 -0
- transitionlistener/tab_data/pressures.dat +1001 -0
- transitionlistener/thermodynamics.py +686 -0
- transitionlistener/transitionObservables.py +1199 -0
- transitionlistener/transitionObservables_fixedstep.py +976 -0
- transitionlistener/transitions.py +1000 -0
- transitionlistener/tunneling1D.py +910 -0
- transitionlistener-2.0.0.dist-info/METADATA +817 -0
- transitionlistener-2.0.0.dist-info/RECORD +95 -0
- transitionlistener-2.0.0.dist-info/WHEEL +4 -0
- transitionlistener-2.0.0.dist-info/entry_points.txt +2 -0
- 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
|
+
|