|
Go to the documentation of this file.
33#include <clooptools.h>
43constexpr double TOL = 1 e-4;
45constexpr double dabs( double a) noexcept { return a >= 0. ? a : -a; }
46constexpr double sqr( double a) noexcept { return a*a; }
47constexpr double pow3( double a) noexcept { return a*a*a; }
48constexpr double pow6( double a) noexcept { return a*a*a*a*a*a; }
50constexpr bool is_zero( double m, double tol) noexcept
52 const double am = dabs(m);
53 const double mtol = tol * am;
55 if (mtol == 0.0 && am != 0.0 && tol != 0.0)
61constexpr bool is_close( double m1, double m2, double tol) noexcept
63 const double mmax = std::max( dabs(m1), dabs(m2));
64 const double mmin = std::min( dabs(m1), dabs(m2));
65 const double max_tol = tol * mmax;
67 if (max_tol == 0.0 && mmax != 0.0 && tol != 0.0)
68 return mmax - mmin <= tol;
70 return mmax - mmin <= max_tol;
73double sign( double x) noexcept
75 return x >= 0.0 ? 1.0 : -1.0;
79double fB( const std::complex<double>& x) noexcept
83 const double re = std::real(x);
84 const double im = std::imag(x);
86 if ((std::abs(re) == 0.0 || std::abs(re) == 1.0) && im == 0.0) {
94double fB( const std::complex<double>& xp, const std::complex<double>& xm) noexcept
98 const double rep = std::real(xp);
99 const double imp = std::imag(xp);
101 if ((std::abs(rep) == 0.0 || std::abs(rep) == 1.0) && imp == 0.0) {
102 return -1.0 + fB(xm);
105 const double rem = std::real(xm);
106 const double imm = std::imag(xm);
108 if ((std::abs(rem) == 0.0 || std::abs(rem) == 1.0) && imm == 0.0) {
109 return -1.0 + fB(xp);
112 return std::real(-2.0 + fast_log((1.0 - xp)*(1.0 - xm))
125double a0( double m, double q) noexcept
127 return rea0(m*m, q*q);
139double rea0( double x, double q) noexcept
142 return std::numeric_limits<double>::quiet_NaN();
149 return x * (1 - std::log(std::abs(x)/q));
152double ffn( double p, double m1, double m2, double q) noexcept {
153 return a0(m1, q) - 2.0 * a0(m2, q) -
154 (2.0 * sqr(p) + 2.0 * sqr(m1) - sqr(m2)) *
158double gfn( double p, double m1, double m2, double q) noexcept {
159 return ( sqr(p) - sqr(m1) - sqr(m2)) * b0(p, m1, m2, q) - a0(m1, q)
163double hfn( double p, double m1, double m2, double q) noexcept {
164 return 4.0 * b22(p, m1, m2, q) + gfn(p, m1, m2, q);
167double b22bar( double p, double m1, double m2, double q) noexcept {
168 return b22(p, m1, m2, q) - 0.25 * a0(m1, q) - 0.25 * a0(m2, q);
174double b0( double p, double m1, double m2, double q) noexcept
178 double b0l = B0(p*p, m1*m1, m2*m2).real();
197 if (p > 1.0e-5 * m2) {
198 const double m12 = sqr(m1), m22 = sqr(m2), p2 = sqr(p);
199 const double s = p2 - m22 + m12;
200 const std::complex<double> imin(m12, - EPSTOL);
201 const std::complex<double> x = std::sqrt( sqr(s) - 4.0 * p2 * imin);
202 const std::complex<double> xp = (s + sign(s)*x) / (2*p2);
203 const std::complex<double> xm = imin / (xp*p2);
216 const double m12 = sqr(m1), m22 = sqr(m2);
219 + 2.0 * m12 * std::log(m2/m1) / (m12 - m22);
223double b1( double p, double m1, double m2, double q) noexcept
227 double b1l = -B1(p*p, m1*m1, m2*m2).real();
235 const double p2 = sqr(p), m12 = sqr(m1), m22 = sqr(m2), q2 = sqr(q);
238 const double pTolerance = 1.0e-4;
240 if (p2 > pTolerance * std::max(m12, m22)) {
241 return ( a0(m2, q) - a0(m1, q) + (p2 + m12 - m22)
242 * b0(p, m1, m2, q)) / (2.0 * p2);
245 if (std::abs(m1) > 1.0e-15 && std::abs(m2) > 1.0e-15) {
246 const double m14 = sqr(m12), m24 = sqr(m22);
247 const double m16 = m12*m14 , m26 = m22*m24;
248 const double m18 = sqr(m14), m28 = sqr(m24);
249 const double p4 = sqr(p2);
250 const double diff = m12 - m22;
252 if (std::abs(diff) < pTolerance * std::max(m12, m22)) {
255 + 1.0/12.0*p2/m22 + 1.0/120.0*p4/m24
256 + diff*(-1.0/6.0/m22 - 1.0/30.0*p2/m24 - 1.0/140.0*p4/m26)
257 + sqr(diff)*(1.0/24.0/m24 + 1.0/60.0*p2/m26 + 3.0/560.0*p4/m28);
260 const double l12 = std::log(m12/m22);
262 return (3*m14 - 4*m12*m22 + m24 - 2*m14*l12)/(4.* sqr(diff))
264 (2*m14 + 5*m12*m22 - m24) +
265 (3*m18 + 44*m16*m22 - 36*m14*m24 - 12*m12*m26 + m28)*p2
266 - 12*m14*m22*(2* sqr(diff) + (2*m12 + 3*m22)*p2)*l12))/
275double b22( double p, double m1, double m2, double q) noexcept
279 double b22l = B00(p*p, m1*m1, m2*m2).real();
292 const double p2 = sqr(p), m12 = sqr(m1), m22 = sqr(m2);
293 const double pTolerance = 1.0e-10;
295 if (p2 < pTolerance * std::max(m12, m22)) {
298 return -m12 * std::log(m1/q) + m12 * 0.5;
302 return 0.375 * (m12 + m22) - 0.5 *
307 ? 0.375 * m22 - 0.5 * m22 * std::log(m2/q)
308 : 0.375 * m12 - 0.5 * m12 * std::log(m1/q);
311 const double b0Save = b0(p, m1, m2, q);
312 const double a01 = a0(m1, q);
313 const double a02 = a0(m2, q);
316 (0.5 * (a01 + a02) + (m12 + m22 - 0.5 * p2)
317 * b0Save + (m22 - m12) / (2.0 * p2) *
318 (a02 - a01 - (m22 - m12) * b0Save) +
319 m12 + m22 - p2 / 3.0);
322double d0( double m1, double m2, double m3, double m4) noexcept
324 const double m1sq = sqr(m1);
325 const double m2sq = sqr(m2);
328 const double m3sq = sqr(m3);
329 const double m4sq = sqr(m4);
335 return (-m2sq + m4sq - m2sq * std::log(m4sq/m2sq))/
336 sqr(m2 * m2sq - m2 * m4sq);
338 return (-m2sq + m3sq - m2sq * std::log(m3sq/m2sq))/
339 sqr(m2 * m2sq - m2 * m3sq);
341 return 1.0 / (6.0 * sqr(m2sq));
343 return ( sqr(m2sq) - sqr(m4sq) + 2.0 * m4sq * m2sq * std::log(m4sq / m2sq)) /
344 (2.0 * m2sq * sqr(m2sq - m4sq) * (m2sq - m4sq));
346 return ( sqr(m2sq) - sqr(m3sq) + 2.0 * m3sq * m2sq * std::log(m3sq / m2sq)) /
347 (2.0 * m2sq * sqr(m2sq - m3sq) * (m2sq - m3sq));
349 return -1.0 / sqr(m2sq - m3sq) *
350 ((m2sq + m3sq) / (m2sq - m3sq) * std::log(m3sq / m2sq) + 2.0);
355 m4sq / (m2sq * (m2sq - m4sq)) -
357 m3sq / (m2sq * (m2sq - m3sq))) / (m3sq - m4sq);
359 return ( c0(m1, m3, m4) - c0(m2, m3, m4)) / (m1sq - m2sq);
362double d27( double m1, double m2, double m3, double m4) noexcept
367 const double m12 = sqr(m1), m22 = sqr(m2);
369 return (m12 * c0(m1, m3, m4) - m22 * c0(m2, m3, m4))
370 / (4.0 * (m12 - m22));
373double c0( double m1, double m2, double m3) noexcept
379 double c0l = C0(psq, psq, psq, m1*m1, m2*m2, m3*m3).real();
382 const double m12 = sqr(m1), m22 = sqr(m2), m32 = sqr(m3);
387 if ((m1_is_zero && m2_is_zero && m3_is_zero) ||
388 (m2_is_zero && m3_is_zero) ||
389 (m1_is_zero && m3_is_zero) ||
390 (m1_is_zero && m2_is_zero)) {
397 return std::log(m32/m22)/(m22 - m32);
403 return std::log(m32/m12)/(m12 - m32);
409 return std::log(m22/m12)/(m12 - m22);
415 return m12 / sqr(m12-m22) * std::log(m22/m12) + 1.0 / (m12 - m22);
419 return - (1.0 + m32 / (m22-m32) * std::log(m32/m22)) / (m22-m32);
423 return - (1.0 + m22 / (m32-m22) * std::log(m22/m32)) / (m32-m22);
426 return (m22 / (m12 - m22) * std::log(m22 / m12) -
427 m32 / (m12 - m32) * std::log(m32 / m12)) / (m22 - m32);
441double d1_b0( double , double m2a, double m2b) noexcept
446 if ((m2a < 0.0001) != (m2b < 0.0001)) {
447 return (m2a - m2b) * (m2a + m2b) / (2 * pow3(m2a - m2b));
448 } else if (m2a < 0.0001 && m2b < 0.0001) {
450 } else if (std::abs(m2b - m2a) < 0.001) {
451 return 1. / (6 * m2a) + (m2a - m2b) / (12 * sqr(m2a));
454 return ((m2a - m2b) * (m2a + m2b) + 2 * m2a * m2b * std::log(m2b / m2a)) /
455 (2 * pow3(m2a - m2b));
458double c00( double m1, double m2, double m3, double q) noexcept
461 const double m12 = sqr(m1), m22 = sqr(m2), m32 = sqr(m3), q2 = sqr(q);
470 ans = 3./8. + 1./4* std::log(q2/m12);
472 ans = 3./8. + 1./4* std::log(q2/m22);
474 ans = 3./8. + 1./4* std::log(q2/m32);
497 ans = (3*m12-m22)/(8*(m12-m22))
501 ans = (3*m32-m12)/(8*(m32-m12)) - 1./4*( sqr(m32)* std::log(m32/m12))/ sqr(m32-m12)
504 ans = (3*m22-m12)/(8*(m22-m12)) - 1./4*( sqr(m22)* std::log(m22/m12))/ sqr(m22-m12)
507 ans = 3./8 - 1./4* sqr(m12)* std::log(m12/m32)/((m12-m22)*(m12-m32))
double C0(double m1, double m2, double m3) noexcept (arguments are interpreted as unsquared)
double B0(double m1, double m2, double scale) noexcept (arguments are interpreted as unsquared)
std::complex< T > fast_log(const std::complex< T > &z) noexcept fast implementation of complex logarithm
Complex< T > log(const Complex< T > &z) noexcept
constexpr bool is_zero(double m, double tol) noexcept
double sign(double x) noexcept
constexpr double EPSTOL underflow accuracy
constexpr double sqr(double a) noexcept
constexpr double pow6(double a) noexcept
double fB(const std::complex< double > &xp, const std::complex< double > &xm) noexcept fB(xp) + fB(xm)
constexpr double pow3(double a) noexcept
constexpr double dabs(double a) noexcept
constexpr bool is_close(double m1, double m2, double tol) noexcept
Comment if you want default softsusy behaviour.
double gfn(double p, double m1, double m2, double q) noexcept
double b1(double p, double m1, double m2, double q) noexcept Note that b1 is NOT symmetric in m1 <-> m2!!!
double c00(double m1, double m2, double m3, double q) noexcept
double rea0(double x, double q) noexcept
double c0(double m1, double m2, double m3) noexcept
double a0(double m, double q) noexcept
double b22(double p, double m1, double m2, double q) noexcept
double d27(double m1, double m2, double m3, double m4) noexcept
double hfn(double p, double m1, double m2, double q) noexcept
double ffn(double p, double m1, double m2, double q) noexcept
double b22bar(double p, double m1, double m2, double q) noexcept
double b0(double p, double m1, double m2, double q) noexcept
double d0(double m1, double m2, double m3, double m4) noexcept
double d1_b0(double, double m2a, double m2b) noexcept
void swap(nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > &j1, nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > >::value &&//NOLINT(misc-redundant-expression, cppcoreguidelines-noexcept-swap, performance-noexcept-swap) is_nothrow_move_assignable< nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > >::value) exchanges the values of two JSON objects
|