Documentation of MARTY
A Modern ARtificial Theoretical phYsicist
looptools_patch.h
1 #pragma once
2 
3 #include "clooptools.h"
4 #include <iostream>
5 
6 namespace mty::lt {
7 
8 #ifdef QUAD
9  using lti_real_t = __float128;
10  using lti_complex_t = __complex128;
11  inline auto lt_real(lti_complex_t const &z) { return crealq(z); }
12  inline auto lt_imag(lti_complex_t const &z) { return cimagq(z); }
13  inline auto lt_pow(lti_real_t const &x, int n) { return powq(x, n); }
14  inline std::complex<lti_real_t> ensure_std_complex(lti_complex_t const &z) {
15  return std::complex<lti_real_t>(lt_real(z), lt_imag(z));
16  }
17 #else
18  using lti_real_t = double;
19  using lti_complex_t = std::complex<double>;
20  inline auto lt_real(lti_complex_t const &z) { return (z).real(); }
21  inline auto lt_imag(lti_complex_t const &z) { return (z).imag(); }
22  inline auto lt_pow(lti_real_t const &x, int n) { return std::pow(x, n); }
23  inline std::complex<lti_real_t> ensure_std_complex(lti_complex_t const &z) {
24  return z;
25  }
26 #endif
27 
28  inline lti_real_t reg_int = 1e-8; // Default value, can be changed if needed
29 
61  template<class ValueType, class LoopToolsFunc, class ...Args>
62  auto rescaled(
63  ValueType const &scale,
64  ValueType const &preFactor,
65  LoopToolsFunc &&func,
66  int id,
67  ValueType const &eps,
68  Args &&...args
69  )
70  {
71  const auto mu = getmudim();
72  setmudim(mu * scale);
73  const auto res = preFactor*func(id, (args * scale) ..., eps);
74  setmudim(mu);
75  return res;
76  }
77 
78  inline lti_real_t abs_re(lti_complex_t const &value) {
79  const lti_real_t re = lt_real(value);
80  return (re < 0) ? -re : re;
81  }
82 
83  inline auto min_ct(lti_real_t const &first) {
84  return first;
85  }
86 
87  template<class ...Args>
88  auto min_ct(
89  lti_real_t const &first,
90  lti_real_t const &second,
91  Args &&...args
92  )
93  {
94  const auto recmin = min_ct(second, std::forward<Args>(args)...);
95  return (first < recmin) ? first : recmin;
96  }
97 
98  template<class ...Args>
99  auto abs_min_ct(Args &&...args)
100  {
101  return min_ct(abs_re(args)...);
102  }
103 
104  template<class ValueType, class EpsType>
105  void regulateC(
106  ValueType &p1_2,
107  ValueType &p2_2,
108  ValueType &p3_2,
109  ValueType const &m1_2,
110  ValueType const &m2_2,
111  ValueType const &m3_2,
112  EpsType const &eps
113  )
114  {
115  const bool p1Zero = (p1_2 == 0.);
116  const bool p3Zero = (p3_2 == 0.);
117  if (p1Zero && p3Zero && p2_2 == 0.) {
118  p1_2 = 1e-5;
119  return;
120  }
121  else if (p1_2 == p2_2 && !p1Zero) {
122  p2_2 = (1 + eps) * p1_2;
123  if (abs_re(m1_2/p1_2) > 1e5 || abs_re(m2_2/p1_2) > 1e5 || abs_re(m3_2/p1_2) > 1e5)
124  p1_2 *= -1;
125  }
126  else if (p1_2 == p3_2 && !p1Zero) {
127  p3_2 = (1 + eps) * p1_2;
128  if (abs_re(m1_2/p2_2) > 1e5 || abs_re(m2_2/p2_2) > 1e5 || abs_re(m3_2/p2_2) > 1e5)
129  p2_2 *= -1;
130  }
131  else if (p3_2 == p2_2 && !p3Zero) {
132  p3_2 = (1 + eps) * p2_2;
133  if (abs_re(m1_2/p3_2) > 1e5 || abs_re(m2_2/p3_2) > 1e5 || abs_re(m3_2/p3_2) > 1e5)
134  p3_2 *= -1;
135  }
136  }
137 
138  inline lti_real_t scaleFactorA(int id, lti_real_t const &scale)
139  {
140  switch(id) {
141  case aa0:
142  return 1/scale;
143  case aa00:
144  return 1/(scale * scale);
145  default:
146  std::cerr << "Error: id " << id << " not recognized"
147  << " for integral A.\n ";
148  exit(1);
149  }
150  }
151 
152  inline lti_real_t scaleFactorB(int id, lti_real_t const &scale)
153  {
154  switch(id) {
155  case bb00:
156  case bb001:
157  case dbb00:
158  case dbb001:
159  return 1/scale;
160  default:
161  return 1;
162  }
163  }
164 
165  inline lti_real_t scaleFactorC(int id, lti_real_t const &scale)
166  {
167  switch(id) {
168  case cc00:
169  case cc001:
170  case cc002:
171  case cc0011:
172  case cc0012:
173  case cc0022:
174  return 1;
175 
176  case cc0000:
177  return 1./scale;
178 
179  default:
180  return scale;
181  }
182  }
183 
184  inline lti_real_t scaleFactorD(int id, lti_real_t const &scale)
185  {
186  if (id == dd0000 || (id >= dd00001 && id <= dd00003))
187  return 1;
188  if (id == dd00
189  || (id >= dd001 && id <= dd003)
190  || (id >= dd0011 && id <= dd0033)
191  || (id >= dd00111 && id <= dd00333))
192  return scale;
193  return scale*scale;
194  }
195 
196  inline lti_real_t scaleFactorE(int id, lti_real_t const &scale)
197  {
198  if (id == ee0000)
199  return scale;
200  if (id == ee00
201  || (id >= ee001 && id <= ee004)
202  || (id >= ee0011 && id <= ee0044))
203  return scale*scale;
204  return scale*scale*scale;
205  }
206 
207 }
csl::Expr mu
mu parameter.
Definition: MSSM.h:83
Definition: looptools_interface.h:5