GM2Calc 2.3.0
Loading...
Searching...
No Matches
THDM_mass_eigenstates.cpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of GM2Calc.
3//
4// GM2Calc is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// GM2Calc is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with GM2Calc. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
19/**
20 * @file THDM_mass_eigenstates.cpp
21 * @brief implementation of the THDM model class
22 *
23 * Contains the definition of the THDM model class methods
24 * which solve EWSB and calculate masses and mixings from MSbar
25 * parameters.
26 *
27 * This file was generated with FlexibleSUSY 2.6.0 and SARAH 4.14.3.
28 */
29
31
32#include "gm2_eigen_utils.hpp"
33#include "gm2_linalg.hpp"
34#include "gm2_numerics.hpp"
35#include "gm2_raii.hpp"
36
37#include <cmath>
38#include <iostream>
39
40namespace gm2calc {
41
42namespace {
43
44const double pi = 3.1415926535897932;
45const double sqrt2_inv = 0.70710678118654752; // 1/Sqrt[2]
46const double gut_normalization = 0.77459666924148338; // Sqrt[3/5]
47
48} // anonymous namespace
49
50#define CLASSNAME THDM_mass_eigenstates
51
52void CLASSNAME::do_force_output(bool flag)
53{
54 force_output = flag;
55}
56
57bool CLASSNAME::do_force_output() const
58{
59 return force_output;
60}
61
62const THDM_problems& CLASSNAME::get_problems() const
63{
64 return problems;
65}
66
67int CLASSNAME::solve_ewsb_tree_level()
68{
69 int error = 0;
70
71 const double old_m112 = m112;
72 const double old_m222 = m222;
73
74 m112 = (0.25*(2*m122*v2 + 2*v2*m122 - 2*lambda1*cube(v1) - lambda7*
75 cube(v2) - lambda7*cube(v2) - 3*lambda6*v2*sqr(v1) - 3*v2*lambda6*sqr(v1)
76 - 2*lambda3*v1*sqr(v2) - 2*lambda4*v1*sqr(v2) - lambda5*v1*sqr(v2)
77 - v1*lambda5*sqr(v2)))/v1;
78 m222 = (0.25*(2*m122*v1 + 2*v1*m122 - lambda6*cube(v1) - lambda6
79 *cube(v1) - 2*lambda2*cube(v2) - 2*lambda3*v2*sqr(v1) - 2*lambda4*v2*sqr(v1)
80 - lambda5*v2*sqr(v1) - v2*lambda5*sqr(v1) - 3*lambda7*v1*sqr(v2) - 3*
81 v1*lambda7*sqr(v2)))/v2;
82
83 const bool is_finite = std::isfinite(m112) && std::isfinite(m222);
84
85 if (!is_finite) {
86 m112 = old_m112;
87 m222 = old_m222;
88 error = 1;
89 }
90
91 return error;
92}
93
94int CLASSNAME::solve_ewsb()
95{
96 return solve_ewsb_tree_level();
97}
98
99void CLASSNAME::print(std::ostream& ostr) const
100{
101 ostr << "========================================\n"
102 "THDM\n"
103 "========================================\n";
105 ostr << "----------------------------------------\n"
106 "Masses:\n"
107 "----------------------------------------\n";
108 ostr << "Mhh = {" << Mhh(0) << ", " << Mhh(1) << "} GeV\n";
109 ostr << "MAh = {" << MAh(0) << ", " << MAh(1) << "} GeV\n";
110 ostr << "MHm = {" << MHm(0) << ", " << MHm(1) << "} GeV\n";
111 ostr << "MFu = {" << MFu(0) << ", " << MFu(1) << ", " << MFu(2) << "} GeV\n";
112 ostr << "MFd = {" << MFd(0) << ", " << MFd(1) << ", " << MFd(2) << "} GeV\n";
113 ostr << "MFv = {" << MFv(0) << ", " << MFv(1) << ", " << MFv(2) << "} GeV\n";
114 ostr << "MFe = {" << MFe(0) << ", " << MFe(1) << ", " << MFe(2) << "} GeV\n";
115 ostr << "MVWm = " << MVWm << " GeV\n";
116 ostr << "MVZ = " << MVZ << " GeV\n";
117
118 ostr << "----------------------------------------\n"
119 "Mixing matrices:\n"
120 "----------------------------------------\n";
121 ostr << "ZH =\n" << ZH << '\n';
122 ostr << "ZA =\n" << ZA << '\n';
123 ostr << "ZP =\n" << ZP << '\n';
124 ostr << "Vd =\n" << Vd << '\n';
125 ostr << "Ud =\n" << Ud << '\n';
126 ostr << "Vu =\n" << Vu << '\n';
127 ostr << "Uu =\n" << Uu << '\n';
128 ostr << "Ve =\n" << Ve << '\n';
129 ostr << "Ue =\n" << Ue << '\n';
131 ostr << "----------------------------------------\n"
132 "Derived parameters:\n"
133 "----------------------------------------\n";
134 ostr << "v = " << get_v() << " GeV\n";
135 ostr << "theta_w = " << ThetaW() << '\n';
136 ostr << "alpha_h = " << get_alpha_h() << '\n';
137 ostr << "beta = " << get_beta() << '\n';
138 ostr << "sin(beta - alpha_h) = " << get_sin_beta_minus_alpha() << '\n';
139 ostr << "cos(beta - alpha_h) = " << get_cos_beta_minus_alpha() << '\n';
140 ostr << "eta = " << get_eta() << '\n';
141 ostr << "tan(beta) = " << get_tan_beta() << '\n';
142}
143
144/**
145 * routine which finds the MSbar mass eigenstates and mixings.
146 */
147void CLASSNAME::calculate_MSbar_masses()
148{
149 calculate_boson_masses();
150 calculate_fermion_masses();
151}
152
153/**
154 * routine which finds the boson mass eigenstates and mixings.
155 */
156void CLASSNAME::calculate_boson_masses()
157{
158 const auto save_m112_raii = make_raii_save(m112);
159 const auto save_m222_raii = make_raii_save(m222);
160
161 solve_ewsb_tree_level();
162
163 calculate_MVZ();
164 calculate_MVWm();
165 calculate_MHm();
166 calculate_MAh();
167 calculate_Mhh();
168
169 reorder_MSbar_masses();
170}
171
172/**
173 * routine which finds the fermion mass eigenstates and mixings.
174 */
175void CLASSNAME::calculate_fermion_masses()
176{
177 calculate_MFu();
178 calculate_MFd();
179 calculate_MFv();
180 calculate_MFe();
181}
182
183/**
184 * reorders MSbar masses so that golstones are placed at the index
185 * specified in the model files definition of the associated
186 * gauge boson (see Z-boson definition in default particles.m file
187 * in the Models directory of your SARAH distribution for example)
188 */
189void CLASSNAME::reorder_MSbar_masses()
190{
191 move_goldstone_to(0, MVZ, MAh, ZA);
192 move_goldstone_to(0, MVWm, MHm, ZP);
193}
194
195Eigen::Matrix<double,3,3> CLASSNAME::get_mass_matrix_Fv() const
196{
197 return Eigen::Matrix<double,3,3>::Zero();
198}
199
200void CLASSNAME::calculate_MFv()
201{
202 MFv.setZero();
203}
204
205Eigen::Matrix<double,2,2> CLASSNAME::get_mass_matrix_hh() const
206{
207 Eigen::Matrix<double,2,2> mass_matrix_hh;
208
209 mass_matrix_hh(0,0) = m112 + 1.5*lambda6*v1*v2 + 1.5*v1*v2*lambda6 +
210 1.5*lambda1*sqr(v1) + 0.5*lambda3*sqr(v2) + 0.5*lambda4*sqr(v2) + 0.25*
211 lambda5*sqr(v2) + 0.25*lambda5*sqr(v2);
212 mass_matrix_hh(0,1) = -0.5*m122 + lambda3*v1*v2 + lambda4*v1*v2 + 0.5*
213 lambda5*v1*v2 + 0.5*v1*v2*lambda5 - 0.5*m122 + 0.75*lambda6*
214 sqr(v1) + 0.75*lambda6*sqr(v1) + 0.75*lambda7*sqr(v2) + 0.75*
215 lambda7*sqr(v2);
216 mass_matrix_hh(1,1) = m222 + 1.5*lambda7*v1*v2 + 1.5*v1*v2*lambda7 +
217 0.5*lambda3*sqr(v1) + 0.5*lambda4*sqr(v1) + 0.25*lambda5*sqr(v1) + 0.25*
218 lambda5*sqr(v1) + 1.5*lambda2*sqr(v2);
219
221
222 return mass_matrix_hh;
223}
224
225void CLASSNAME::calculate_Mhh()
226{
227 const auto mass_matrix_hh(get_mass_matrix_hh());
230
231 if (Mhh.minCoeff() < 0.) {
232 problems.flag_tachyon("hh");
233 }
234
235 Mhh = sqrt(Mhh.cwiseAbs());
236}
237
238Eigen::Matrix<double,2,2> CLASSNAME::get_mass_matrix_Ah() const
239{
240 Eigen::Matrix<double,2,2> mass_matrix_Ah;
241
242 const double tw = gut_normalization*g1/g2;
243 const double rt = std::sqrt(1 + tw*tw);
244 const double sw = tw/rt;
245 const double cw = 1/rt;
246
247 mass_matrix_Ah(0,0) = m112 + 0.5*lambda6*v1*v2 + 0.5*v1*v2*lambda6 +
248 0.5*lambda1*sqr(v1) + 0.3872983346207417*g1*g2*cw*sw*sqr(v1) +
249 0.5*lambda3*sqr(v2) + 0.5*lambda4*sqr(v2) - 0.25*lambda5*sqr(
250 v2) - 0.25*lambda5*sqr(v2) + 0.25*sqr(g2)*sqr(v1)*sqr(cw
251 ) + 0.15*sqr(g1)*sqr(v1)*sqr(sw);
252 mass_matrix_Ah(0,1) = -0.5*m122 + 0.5*lambda5*v1*v2 + 0.5*v1*v2*lambda5
253 - 0.5*m122 + 0.3872983346207417*g1*g2*v1*v2*cw*sw + 0.25*lambda6*sqr(v1)
254 + 0.25*lambda6*sqr(v1) + 0.25*
255 lambda7*sqr(v2) + 0.25*lambda7*sqr(v2) + 0.25*v1*v2*sqr(g2)*sqr(cw) +
256 0.15*v1*v2*sqr(g1)*sqr(sw);
257 mass_matrix_Ah(1,1) = m222 + 0.5*lambda7*v1*v2 + 0.5*v1*v2*lambda7 +
258 0.5*lambda3*sqr(v1) + 0.5*lambda4*sqr(v1) - 0.25*lambda5*sqr(v1) - 0.25*
259 lambda5*sqr(v1) + 0.5*lambda2*sqr(v2) + 0.3872983346207417*g1*g2*
260 cw*sw*sqr(v2) + 0.25*sqr(g2)*sqr(v2)*sqr(cw) + 0.15*sqr(g1)*sqr(v2)*sqr(sw);
261
263
264 return mass_matrix_Ah;
265}
266
267void CLASSNAME::calculate_MAh()
268{
269 const auto mass_matrix_Ah(get_mass_matrix_Ah());
272
273 if (MAh.minCoeff() < 0.) {
274 problems.flag_tachyon("Ah");
275 }
276
277 MAh = sqrt(MAh.cwiseAbs());
278}
279
280Eigen::Matrix<double,2,2> CLASSNAME::get_mass_matrix_Hm() const
281{
282 Eigen::Matrix<double,2,2> mass_matrix_Hm;
283
284 mass_matrix_Hm(0,0) = m112 + 0.5*lambda6*v1*v2 + 0.5*v1*v2*lambda6 +
285 0.5*lambda1*sqr(v1) + 0.25*sqr(g2)*sqr(v1) + 0.5*lambda3*sqr(v2);
286 mass_matrix_Hm(0,1) = 0.5*lambda4*v1*v2 + 0.5*lambda5*v1*v2 - m122 +
287 0.25*v1*v2*sqr(g2) + 0.5*lambda6*sqr(v1) + 0.5*lambda7*sqr(v2
288 );
289 mass_matrix_Hm(1,0) = -m122 + 0.5*lambda4*v1*v2 + 0.5*v1*v2*lambda5 +
290 0.25*v1*v2*sqr(g2) + 0.5*lambda6*sqr(v1) + 0.5*lambda7*sqr(v2);
291 mass_matrix_Hm(1,1) = m222 + 0.5*lambda7*v1*v2 + 0.5*v1*v2*lambda7 +
292 0.5*lambda3*sqr(v1) + 0.5*lambda2*sqr(v2) + 0.25*sqr(g2)*sqr(v2);
293
294 return mass_matrix_Hm;
295}
296
297void CLASSNAME::calculate_MHm()
298{
299 const auto mass_matrix_Hm(get_mass_matrix_Hm());
302
303 if (MHm.minCoeff() < 0.) {
304 problems.flag_tachyon("Hm");
305 }
306
307 MHm = sqrt(MHm.cwiseAbs());
308}
309
310Eigen::Matrix<std::complex<double>,3,3> CLASSNAME::get_mass_matrix_Fd() const
311{
312 return sqrt2_inv*(v1*Gamma_d + v2*Pi_d);
313}
314
315void CLASSNAME::calculate_MFd()
316{
317 const auto mass_matrix_Fd(get_mass_matrix_Fd());
319}
320
321Eigen::Matrix<std::complex<double>,3,3> CLASSNAME::get_mass_matrix_Fu() const
322{
323 return sqrt2_inv*(v1*Gamma_u + v2*Pi_u);
324}
325
326void CLASSNAME::calculate_MFu()
327{
328 const auto mass_matrix_Fu(get_mass_matrix_Fu());
330}
331
332Eigen::Matrix<std::complex<double>,3,3> CLASSNAME::get_mass_matrix_Fe() const
333{
334 return sqrt2_inv*(v1*Gamma_l + v2*Pi_l);
335}
336
337void CLASSNAME::calculate_MFe()
338{
339 const auto mass_matrix_Fe(get_mass_matrix_Fe());
341}
342
343double CLASSNAME::get_mass_matrix_VWm() const
344{
345 const double mass_matrix_VWm = 0.25*sqr(g2)*(sqr(v1) + sqr(v2));
346 return mass_matrix_VWm;
347}
348
349void CLASSNAME::calculate_MVWm()
350{
351 const auto mass_matrix_VWm = get_mass_matrix_VWm();
353}
354
355double CLASSNAME::get_mass_matrix_VZ() const
356{
357 const double tw = gut_normalization*g1/g2;
358 const double rt = std::sqrt(1 + tw*tw);
359 const double sw = tw/rt;
360 const double cw = 1/rt;
361
362 const double mass_matrix_VZ = 0.25*(sqr(v1) + sqr(v2))
363 *sqr(g2*cw + gut_normalization*g1*sw);
364
365 return mass_matrix_VZ;
366}
367
368void CLASSNAME::calculate_MVZ()
369{
370 const auto mass_matrix_VZ = get_mass_matrix_VZ();
372}
373
374double CLASSNAME::get_ewsb_eq_hh_1() const
375{
376 double result = m112*v1 - 0.5*m122*v2 - 0.5*v2*m122 + 0.5*lambda1*cube
377 (v1) + 0.25*lambda7*cube(v2) + 0.25*lambda7*cube(v2) + 0.75*lambda6*v2
378 *sqr(v1) + 0.75*v2*lambda6*sqr(v1) + 0.5*lambda3*v1*sqr(v2) + 0.5*
379 lambda4*v1*sqr(v2) + 0.25*lambda5*v1*sqr(v2) + 0.25*v1*lambda5*sqr(v2);
380
381 return result;
382}
383
384double CLASSNAME::get_ewsb_eq_hh_2() const
385{
386 double result = -0.5*m122*v1 + m222*v2 - 0.5*v1*m122 + 0.25*lambda6*
387 cube(v1) + 0.25*lambda6*cube(v1) + 0.5*lambda2*cube(v2) + 0.5*lambda3*
388 v2*sqr(v1) + 0.5*lambda4*v2*sqr(v1) + 0.25*lambda5*v2*sqr(v1) + 0.25*v2*
389 lambda5*sqr(v1) + 0.75*lambda7*v1*sqr(v2) + 0.75*v1*lambda7*sqr(v2);
390
391 return result;
392}
393
394/**
395 * Returns the CP-odd Higgs mixing angle \f$\beta\f$.
396 *
397 * The mixing angle \f$\beta\f$ is chosen such that
398 * \f$0 \leq \beta \leq \pi/2\f$.
399 *
400 * @return CP-odd Higgs mixing angle \f$\beta\f$
401 */
402double CLASSNAME::get_beta() const
403{
404 return std::atan(get_tan_beta());
405}
406
407double CLASSNAME::get_sin_beta() const
408{
409 const double tb = get_tan_beta();
410 return tb/std::sqrt(1.0 + sqr(tb));
411}
412
413double CLASSNAME::get_cos_beta() const
414{
415 const double tb = get_tan_beta();
416 return 1.0/std::sqrt(1.0 + sqr(tb));
417}
418
419double CLASSNAME::get_tan_beta() const
420{
421 return v2/v1;
422}
423
424/**
425 * Returns the CP-even Higgs mixing angle \f$\alpha_h\f$.
426 *
427 * The mixing angle \f$\alpha_h\f$ is chosen such that
428 * \f$-\pi/2 \leq \beta - \alpha_h \leq \pi/2\f$.
429 *
430 * @return CP-even Higgs mixing angle \f$\alpha_h\f$
431 */
432double CLASSNAME::get_alpha_h() const
433{
434 double alpha_h = std::asin(ZH(1,1));
435
436 const double bma = get_beta() - alpha_h;
437 const double eps = 10*std::numeric_limits<double>::epsilon();
438
439 if (bma < -pi/2 - eps) { alpha_h -= pi; }
440 if (bma > pi/2 + eps) { alpha_h += pi; }
441
442 return alpha_h;
443}
444
445double CLASSNAME::get_sin_beta_minus_alpha() const
446{
447 return std::sin(get_beta() - get_alpha_h());
448}
449
450double CLASSNAME::get_cos_beta_minus_alpha() const
451{
452 return std::cos(get_beta() - get_alpha_h());
453}
454
455double CLASSNAME::get_alpha_em() const
456{
457 const double gY = g1*gut_normalization;
458 const double e2 = sqr(gY)*sqr(g2)/(sqr(gY) + sqr(g2));
459 return e2/12.566370614359173; // e^2/(4 Pi)
460}
461
462/**
463 * Returns the CP-even Higgs mixing angle contribution \f$\eta\f$ that
464 * describes the deviation from the SM limit.
465 *
466 * The \f$\eta\f$ parameter is defined as
467 * \f$\beta - \alpha = \pi/2 - \eta\f$.
468 *
469 * @return \f$\eta\f$
470 */
471double CLASSNAME::get_eta() const
472{
473 return pi/2 + get_alpha_h() - get_beta();
474}
475
476/**
477 * Returns \f$\Lambda_5\f$, Eq (14) arxiv:1607.06292
478 * @return \f$\Lambda_5\f$
479 */
480double CLASSNAME::get_LambdaFive() const
481{
482 const double tb = get_tan_beta();
483 const double sbcb = tb/(1.0 + sqr(tb)); // Sin[beta] Cos[beta]
484 return 2*get_m122()/(get_v_sqr() * sbcb);
485}
486
487/**
488 * Returns \f$\left(\Lambda_{567} - \Lambda_{5}\right)\left(\tan\beta - \frac{1}{\tan\beta}\right) = \frac{\lambda_6}{\sin^2\beta} - \frac{\lambda_7}{\cos^2\beta}\f$
489 */
490double CLASSNAME::get_LambdaSixSeven() const
491{
492 const double sb = get_sin_beta();
493 const double cb = get_cos_beta();
494 return lambda6/sqr(sb) - lambda7/sqr(cb);
495}
496
497double CLASSNAME::ThetaW() const
498{
499 return std::atan(gut_normalization*g1/g2);
500}
501
502double CLASSNAME::get_v() const
503{
504 return std::sqrt(get_v_sqr());
505}
506
507double CLASSNAME::get_v_sqr() const
508{
509 return sqr(v1) + sqr(v2);
510}
511
512void CLASSNAME::set_alpha_em_and_cw(double alpha_em, double cw)
513{
514 const double e = std::sqrt(alpha_em*4*pi);
515 const double sw = std::sqrt(1 - sqr(cw));
516 g1 = e/(cw*gut_normalization);
517 g2 = e/sw;
518}
519
520void CLASSNAME::set_tan_beta_and_v(double tan_beta, double v)
521{
522 const double sq = std::sqrt(1.0 + sqr(tan_beta));
523 const double sb = tan_beta/sq;
524 const double cb = 1/sq;
525 v1 = v*cb;
526 v2 = v*sb;
527}
528
529std::ostream& operator<<(std::ostream& ostr, const CLASSNAME& model)
530{
531 model.print(ostr);
532 return ostr;
533}
534
535} // namespace gm2calc
contains class for general THDM model with routines needed to solve EWSB and determine the masses and...
void print(std::ostream &) const
contains problem and warning flags
double v
void move_goldstone_to(int idx, double mass, Eigen::ArrayBase< DerivedArray > &v, Eigen::MatrixBase< DerivedMatrix > &z)
The element of v, which is closest to mass, is moved to the position idx.
double abs_sqrt(double x) noexcept
returns square root of absolute of number
T sqr(T x) noexcept
returns number squared
void svd_eigen(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
T cube(T x) noexcept
returns number to the third power
std::ostream & operator<<(std::ostream &os, const MSSMNoFV_onshell &model)
streaming operator
constexpr RAII_save< T > make_raii_save(T &var)
Definition gm2_raii.hpp:44
void symmetrize(Eigen::MatrixBase< Derived > &m)