QCD Library
zeta_alpha_s.hpp
Go to the documentation of this file.
1 
28 #pragma once
29 
30 #include <array>
31 
32 #include "scheme.hpp"
33 
34 #if __cplusplus >= 201402L
35 #define QCD_CONSTEXPR_AFTER_CXX14 constexpr
36 #else
37 #define QCD_CONSTEXPR_AFTER_CXX14
38 #endif
39 
41 namespace QCD{
42 
43  // decoupling coefficients for alpha_s from
44  // Chetyrkin, Kniehl, Steinhauser hep-ph/9708255
45  // Chetyrkin, Kuehn, Steinhauser hep-ph/0004189
46  // Chetyrkin, Kuehn, Sturm hep-ph/0512060
47  // zeta_alpha_s = zeta_g^2
48  // i.e.
49  // alpha_s^(nf-1) = zeta_alpha_s * alpha_s^(nf)
50  // alpha_s^(nf+1) = zeta_alpha_s_inv * alpha_s^(nf)
51  // lm = log(mu^2/m^2)
52 
53  constexpr unsigned zeta_alpha_s_max_order = 4;
54 
55  namespace detail{
56 
57  namespace zeta_alpha_s{
58  constexpr double pi = 3.141592653589793238462643383279;
59  constexpr double pi2 = pi*pi;
60  constexpr double pi4 = pi2*pi2;
61  constexpr double pi6 = pi4*pi2;
62 
63  constexpr double zeta_2 = pi*pi/6.;
64  constexpr double zeta_3 = 1.202056903159594285399738161511449990765;
65  constexpr double zeta_5 = 1.036927755143369926331365486457034168057;
66  constexpr double log_2 = 0.693147180559945309428690474185;
67  constexpr double log2_2 = log_2*log_2;
68  constexpr double log3_2 = log2_2*log_2;
69  constexpr double log4_2 = log3_2*log_2;
70  constexpr double log5_2 = log4_2*log_2;
71  constexpr double a4 = 0.5174790616738993863307581618988629456224;
72  constexpr double a5 = 0.5084005792422687074591088492585899413195;
73 
74  constexpr unsigned max_nf_pow(unsigned order){
75  return (order > 2u)?(order-2u):0u;
76  }
77 
78  constexpr unsigned max_log_pow(unsigned order, unsigned nf_pow){
79  return (nf_pow==0u)?order:order-1u;
80  }
81 
82  // coefficients of zeta_alpha_s
83  constexpr size_t num_coeff = 26;
84  constexpr double T54_3 = -8445.8046390310298;
85  constexpr double T62_2 = -4553.4004372195263;
86  constexpr double Delta_OS_4_nf0 =
87  - 2287952896065241./43342154956800.
88  + 3657317./207360.*zeta_5
89  - 44801124029./1567641600.*zeta_3
90  + 151369./544320.*zeta_3*zeta_3
91  - 121./36.*a5
92  + 21199949./544320.*a4
93  - 765521./116640.*pi2
94  + 1439./1296.*pi2*zeta_3
95  - 389455229./1567641600.*pi4
96  - 151369./30481920.*pi6
97  + 983./972.*log_2*pi2
98  - 2057./51840.*log_2*pi4
99  - 18377549./13063680.*log2_2*pi2
100  - 121./2592.*log3_2*pi2
101  + 21199949./13063680.*log4_2
102  + 121./4320.*log5_2
103  + 82037./30965760.*T54_3
104  - 151369./11612160.*T62_2
105  ;
106  constexpr double Delta_OS_4_nf1 =
107  + 318983./124416.
108  + 115./576.*zeta_5
109  + 4778329./995328.*zeta_3
110  + 173./5184.*a4
111  + 583./972.*pi2
112  - 697709./14929920.*pi4
113  + 11./243.*log_2*pi2
114  - 1709./124416.*log2_2*pi2
115  + 173./124416.*log4_2
116  ;
117  constexpr double Delta_OS_4_nf2 =
118  - 140825./1492992.
119  - 19./1728.*zeta_3
120  - 13./972.*pi2
121  ;
122  constexpr auto data_OS = std::array<double, num_coeff>{{
123  + 1., //alpha_s^0
124  + 0., - 1./6., //alpha_s^1 log^0...1
125  - 7./24., - 19./24., 1./36., //alpha_s^2 log^0...2
126  - 68849./124416. - 7./9.*zeta_2 - 2./9.*zeta_2*log_2
127  - 80507./27648.*zeta_3, //alpha_s^3 nf^0 log^0
128  - 4465./864., - 131./576., - 1./216., //alpha_s^3 nf^0 log^1...3
129  + 2479./31104. + zeta_2/9, + 409./1728., 0., //alpha_s^3 nf^1 log^0...2
130  Delta_OS_4_nf0, //alpha_s^4 nf^0 log^0
131  - 21924511./746496.
132  - 2703685./165888.*zeta_3
133  - 217./324.*pi2
134  - 31./162.*log_2*pi2, //alpha_s^4 nf^0 log^1
135  - 16921./2304., - 9013./10368., + 1./1296., //alpha_s^4 nf^0 log^2...4
136  Delta_OS_4_nf1, //alpha_s^4 nf^1 log^0
137  + 1117159./373248.
138  + 132283./82944.*zeta_3
139  + 5./36.*pi2
140  + 1./81.*log_2*pi2, //alpha_s^4 nf^1 log^1
141  + 3577./5184., + 107./1728., //alpha_s^4 nf^1 log^2...3
142  Delta_OS_4_nf2, //alpha_s^4 nf^2 log^0
143  - 1679./186624. - 1./162.*pi2, - 493./20736., 0. //alpha_s^4 nf^2 log^1...3
144  }};
145 
146  constexpr double Delta_MS_4_nf0 =
147  + 224509779902759./43342154956800.
148  + 4289317./207360.*zeta_5
149  - 42159357629./1567641600.*zeta_3
150  + 151369./544320.*zeta_3*zeta_3
151  - 121./36.*a5
152  + 19667789./544320.*a4
153  - 452556029./1567641600.*pi4
154  - 151369./30481920.*pi6
155  - 2057./51840.*log_2*pi4
156  - 19667789./13063680.*log2_2*pi2
157  - 121./2592.*log3_2*pi2
158  + 19667789./13063680.*log4_2
159  + 121./4320.*log5_2
160  + 82037./30965760.*T54_3
161  - 151369./11612160.*T62_2
162  ;
163  constexpr double Delta_MS_4_nf1 =
164  - 749843./373248.
165  + 115./576.*zeta_5
166  + 3581785./995328.*zeta_3
167  + 685./5184.*a4
168  - 541549./14929920.*pi4
169  - 685./124416.*log2_2*pi2
170  + 685./124416.*log4_2
171  ;
172  constexpr double Delta_MS_4_nf2 =
173  - 271883./4478976.
174  + 167./5184.*zeta_3
175  ;
176  constexpr auto data_MS = std::array<double, num_coeff>{{
177  1.,
178  0., -1./6.,
179  11./72., -11./24., 1./36.,
180  575263./124416. - 82043./27648.*zeta_3,
181  -511./288., 23./192., -1./216.,
182  -2633./31104., 67./576., -1./36,
183  Delta_MS_4_nf0,
184  + 7639841./746496. - 2751301./165888.*zeta_3,
185  + 5317./6912., - 1597./10368., + 1./1296.,
186  Delta_MS_4_nf1,
187  - 137801./373248. + 110779./82944.*zeta_3,
188  - 703./5184., - 53./1728.,
189  Delta_MS_4_nf2,
190  + 6865./186624., - 77./20736., + 1./324.
191  }};
192 
193  constexpr auto data_SI = std::array<double, num_coeff>{{
194  1.,
195  0., -1./6.,
196  11./72., -19./24., 1./36.,
197  575263./124416 - 82043./27648.*zeta_3,
198  -131./32., -131./576., -1./216.,
199  -2633./31104., 281./1728., 0.,
200  Delta_MS_4_nf0,
201  - 2745007./746496. - 2751301./165888.*zeta_3,
202  - 30091./6912., - 9013./10368., + 1./1296.,
203  Delta_MS_4_nf1,
204  + 156103./373248. + 133819./82944.*zeta_3,
205  + 59./192., + 107./1728.,
206  Delta_MS_4_nf2,
207  + 8545./186624., - 79./6912., 0.
208  }};
209 
210  template<scheme s>
211  QCD_CONSTEXPR_AFTER_CXX14
212  double coeffs(size_t);
213 
214  template<>
215  inline QCD_CONSTEXPR_AFTER_CXX14
216  double coeffs<scheme::pole>(size_t i){
217  return data_OS[i];
218  }
219 
220  template<>
221  inline QCD_CONSTEXPR_AFTER_CXX14
222  double coeffs<scheme::MSbar>(size_t i){
223  return data_MS[i];
224  }
225 
226  template<>
227  inline QCD_CONSTEXPR_AFTER_CXX14
228  double coeffs<scheme::scale_invariant>(size_t i){
229  return data_SI[i];
230  }
231 
232  // coefficients of zeta_alpha_s^-1
233  constexpr auto data_OS_inv = std::array<double, num_coeff>{{
234  + 1., //alpha_s^0
235  + 0., 1./6., //alpha_s^1 log^0...1
236  + 7./24., + 19./24., 1./36., //alpha_s^2 log^0...2
237  + 58933./124416. + 2./3.*zeta_2 + 2./9.*zeta_2*log_2
238  + 80507./27648.*zeta_3, //alpha_s^3 nf^0 log^0
239  + 8941./1728., + 511./576., + 1./216., //alpha_s^3 nf^0 log^1...3
240  - 2479./31104. - zeta_2/9, - 409./1728., 0.0, //alpha_s^3 nf^1 log^0...2
241  + 49./192. - Delta_OS_4_nf2 - Delta_OS_4_nf1 - Delta_OS_4_nf0, //alpha_s^4 nf^0 log^0
242  + 21084715./746496. + 2922161./165888.*zeta_3
243  + 35./54.*pi2 + 35./162.*log_2*pi2, //alpha_s^4 nf^0 log^1
244  + 47039./3456., + 14149./10368., + 1./1296., //alpha_s^4 nf^0 log^2...4
245  - Delta_OS_4_nf1 - 2*Delta_OS_4_nf2, //alpha_s^4 nf^0 log^0
246  - 1140191./373248. - 132283./82944.*zeta_3
247  - 47./324.*pi2 - 1./81.*log_2*pi2, //alpha_s^4 nf^1 log^1
248  - 9115./10368., - 107./1728., //alpha_s^4 nf^1 log^2..3
249  - Delta_OS_4_nf2, //alpha_s^4 nf^2 log^0
250  + 1679./186624. + 1./162.*pi2, + 493./20736. //alpha_s^4 nf^2 log^1..2
251  }};
252 
253 
254  constexpr auto data_MS_inv = std::array<double, num_coeff>{{
255  + 1., //alpha_s^0
256  + 0., 1./6., //alpha_s^1 log^0...1
257  - 11./72., + 11./24., 1./36., //alpha_s^2 log^0...2
258  - 564731./124416. + 82043./27648.*zeta_3, //alpha_s^3 nf^0 log^0
259  + 2645./1728., + 167./576., + 1./216., //alpha_s^3 nf^0 log^1...3
260  + 2633./31104., - 67./576., 1./36., //alpha_s^3 nf^1 log^0...2
261  + 121./1728. - Delta_MS_4_nf2 - Delta_MS_4_nf1 - Delta_MS_4_nf0,
262  - 11093717./746496. + 3022001./165888.*zeta_3,
263  + 1837./1152., + 2909./10368., + 1./1296.,
264  - 2*Delta_MS_4_nf2 - Delta_MS_4_nf1,
265  + 141937./373248. - 110779./82944.*zeta_3,
266  + 277./10368., + 271./5184.,
267  - Delta_MS_4_nf2,
268  - 6865./186624., + 77./20736., - 1./324.
269  }};
270 
271  constexpr auto data_SI_inv = std::array<double, num_coeff>{{
272  + 1., //alpha_s^0
273  + 0., 1./6., //alpha_s^1 log^0...1
274  - 11./72., + 19./24., 1./36., //alpha_s^2 log^0...2
275  - 564731./124416. + 82043./27648.*zeta_3, //alpha_s^3 nf^0 log^0
276  + 2191./576., + 511./576., + 1./216., //alpha_s^3 nf^0 log^1...3
277  + 2633./31104., - 281./1728., 0., //alpha_s^3 nf^1 log^0...2
278  + 121./1728. - Delta_MS_4_nf2 - Delta_MS_4_nf1 - Delta_MS_4_nf0,
279  - 1531493./746496. + 2975921./165888.*zeta_3,
280  + 33887./3456., + 14149./10368., + 1./1296.,
281  - 2*Delta_MS_4_nf2 - Delta_MS_4_nf1,
282  - 158687./373248. - 133819./82944.*zeta_3,
283  - 515./1152., - 107./1728.,
284  - Delta_MS_4_nf2,
285  - 8545./186624., + 79./6912., 0.
286  }};
287 
288  template<scheme s>
289  QCD_CONSTEXPR_AFTER_CXX14
290  double coeffs_inv(size_t);
291 
292  template<>
293  inline QCD_CONSTEXPR_AFTER_CXX14
294  double coeffs_inv<scheme::pole>(size_t i){
295  return data_OS_inv[i];
296  }
297 
298  template<>
299  inline QCD_CONSTEXPR_AFTER_CXX14
300  double coeffs_inv<scheme::MSbar>(size_t i){
301  return data_MS_inv[i];
302  }
303 
304  template<>
305  inline QCD_CONSTEXPR_AFTER_CXX14
306  double coeffs_inv<scheme::scale_invariant>(size_t i){
307  return data_SI_inv[i];
308  }
309 
310 
311  // get index in coeffs array for a given order and power of nf, lm
312  constexpr unsigned get_index(
313  unsigned order,
314  unsigned nf_pow
315  );
316 
317  constexpr unsigned get_index(
318  unsigned order
319  ){
320  return (order == 0u)?
321  0:(
322  + 1u
323  + max_log_pow(order - 1, max_nf_pow(order - 1))
324  + get_index(order - 1, max_nf_pow(order - 1))
325  );
326  }
327 
328  constexpr unsigned get_index(
329  unsigned order,
330  unsigned nf_pow
331  ){
332  return (nf_pow == 0u)?
333  get_index(order):(
334  1u + max_log_pow(order, nf_pow - 1) + get_index(order, nf_pow - 1)
335  );
336  }
337 
338  constexpr unsigned get_index(
339  unsigned order,
340  unsigned nf_pow,
341  unsigned log_pow
342  ){
343  return log_pow + get_index(order, nf_pow);
344  }
345  }
346  }
347 
348  template<scheme s>
349  inline QCD_CONSTEXPR_AFTER_CXX14
350  double zeta_alpha_s_log_coeff(
351  unsigned order,
352  unsigned nf_pow,
353  unsigned log_pow
354  ){
355  using namespace detail::zeta_alpha_s;
356  return coeffs<s>(get_index(order, nf_pow, log_pow));
357  }
358 
359  template<scheme s>
360  inline QCD_CONSTEXPR_AFTER_CXX14
361  double zeta_alpha_s_inv_log_coeff(
362  unsigned order,
363  unsigned nf_pow,
364  unsigned log_pow
365  ){
366  using namespace detail::zeta_alpha_s;
367  return coeffs_inv<s>(get_index(order, nf_pow, log_pow));
368  }
369 
370 
371  namespace detail{
372  namespace zeta_alpha_s{
373 
374  template<scheme s>
375  inline QCD_CONSTEXPR_AFTER_CXX14
376  double nf_coeff_helper(
377  unsigned order,
378  unsigned nf_pow,
379  double lm,
380  unsigned cur_log_pow
381  ){
382  return (cur_log_pow == max_log_pow(order, nf_pow))?
383  zeta_alpha_s_log_coeff<s>(order, nf_pow, cur_log_pow):(
384  + zeta_alpha_s_log_coeff<s>(order, nf_pow, cur_log_pow)
385  + lm * nf_coeff_helper<s>(order, nf_pow, lm, cur_log_pow + 1)
386  );
387  }
388 
389  template<scheme s>
390  inline QCD_CONSTEXPR_AFTER_CXX14
391  double nf_coeff_helper_inv(
392  unsigned order,
393  unsigned nf_pow,
394  double lm,
395  unsigned cur_log_pow
396  ){
397  return (cur_log_pow == max_log_pow(order, nf_pow))?
398  zeta_alpha_s_inv_log_coeff<s>(order, nf_pow, cur_log_pow):(
399  + zeta_alpha_s_inv_log_coeff<s>(order, nf_pow, cur_log_pow)
400  + lm * nf_coeff_helper_inv<s>(order, nf_pow, lm, cur_log_pow + 1)
401  );
402  }
403  }
404  }
405 
406  template<scheme s>
407  inline QCD_CONSTEXPR_AFTER_CXX14
408  double zeta_alpha_s_nf_coeff(
409  unsigned order,
410  unsigned nf_pow,
411  double lm
412  ){
413  using namespace detail::zeta_alpha_s;
414  return nf_coeff_helper<s>(order, nf_pow, lm, 0);
415  }
416 
417  template<scheme s>
418  inline QCD_CONSTEXPR_AFTER_CXX14
419  double zeta_alpha_s_inv_nf_coeff(
420  unsigned order,
421  unsigned nf_pow,
422  double lm
423  ){
424  using namespace detail::zeta_alpha_s;
425  return nf_coeff_helper_inv<s>(order, nf_pow, lm, 0);
426  }
427 
428  namespace detail{
429  namespace zeta_alpha_s{
430  template<scheme s>
431  inline QCD_CONSTEXPR_AFTER_CXX14
432  double helper(
433  unsigned order,
434  unsigned nf,
435  double lm,
436  unsigned cur_nf_pow
437  ){
438  return (cur_nf_pow == max_nf_pow(order))?
439  zeta_alpha_s_nf_coeff<s>(order, cur_nf_pow, lm):(
440  + zeta_alpha_s_nf_coeff<s>(order, cur_nf_pow, lm)
441  + nf * helper<s>(order, nf, lm, cur_nf_pow + 1)
442  );
443  }
444 
445  template<scheme s>
446  inline QCD_CONSTEXPR_AFTER_CXX14
447  double helper_inv(
448  unsigned order,
449  unsigned nf,
450  double lm,
451  unsigned cur_nf_pow
452  ){
453  return (cur_nf_pow == max_nf_pow(order))?
454  zeta_alpha_s_inv_nf_coeff<s>(order, cur_nf_pow, lm):(
455  + zeta_alpha_s_inv_nf_coeff<s>(order, cur_nf_pow, lm)
456  + nf * helper_inv<s>(order, nf, lm, cur_nf_pow + 1)
457  );
458  }
459 
460  template<scheme s>
461  inline QCD_CONSTEXPR_AFTER_CXX14
462  double zeta_alpha_s(
463  unsigned order,
464  unsigned nf,
465  double lm
466  ){
467  return helper<s>(order, nf, lm, 0);
468  }
469 
470  template<scheme s>
471  inline QCD_CONSTEXPR_AFTER_CXX14
472  double zeta_alpha_s_inv(
473  unsigned order,
474  unsigned nf,
475  double lm
476  ){
477  return helper_inv<s>(order, nf, lm, 0);
478  }
479 
480  template<scheme s>
481  inline QCD_CONSTEXPR_AFTER_CXX14
482  double helper(
483  unsigned order,
484  unsigned nf,
485  double lm,
486  double alpha_s,
487  unsigned cur_order
488  ){
489  return (cur_order == order)?
490  zeta_alpha_s<s>(order, nf, lm):(
491  + zeta_alpha_s<s>(cur_order, nf, lm)
492  + alpha_s/pi * helper<s>(order, nf, lm, alpha_s, cur_order + 1)
493  );
494  }
495 
496  template<scheme s>
497  inline QCD_CONSTEXPR_AFTER_CXX14
498  double helper_inv(
499  unsigned order,
500  unsigned nf,
501  double lm,
502  double alpha_s,
503  unsigned cur_order
504  ){
505  return (cur_order == order)?
506  zeta_alpha_s_inv<s>(order, nf, lm):(
507  + zeta_alpha_s_inv<s>(cur_order, nf, lm)
508  + alpha_s/pi * helper_inv<s>(order, nf, lm, alpha_s, cur_order + 1)
509  );
510  }
511  }
512  }
513 
515 
530  template<scheme s>
531  inline QCD_CONSTEXPR_AFTER_CXX14
532  double zeta_alpha_s(
533  unsigned order,
534  unsigned nf,
535  double lm,
536  double alpha_s
537  ){
538  using namespace detail::zeta_alpha_s;
539  return helper<s>(order, nf, lm, alpha_s, 0);
540  }
541 
543 
557  template<scheme s>
558  inline QCD_CONSTEXPR_AFTER_CXX14
560  unsigned order,
561  unsigned nf,
562  double lm,
563  double alpha_s
564  ){
565  using namespace detail::zeta_alpha_s;
566  return helper_inv<s>(order, nf, lm, alpha_s, 0);
567  }
568 
570 
580  template<scheme s>
581  inline QCD_CONSTEXPR_AFTER_CXX14
582  double zeta_alpha_s(
583  unsigned order,
584  unsigned nf,
585  double lm
586  ){
587  return detail::zeta_alpha_s::zeta_alpha_s<s>(order, nf, lm);
588  }
589 
591 
601  template<scheme s>
602  inline QCD_CONSTEXPR_AFTER_CXX14
604  unsigned order,
605  unsigned nf,
606  double lm
607  ){
608  return detail::zeta_alpha_s::zeta_alpha_s_inv<s>(order, nf, lm);
609  }
610 
611 }
612 
613 #undef QCD_CONSTEXPR_AFTER_CXX14
QCD_CONSTEXPR_AFTER_CXX14 double zeta_alpha_s(unsigned order, unsigned nf, double lm, double alpha_s)
Decoupling constant for the strong coupling constant.
Definition: zeta_alpha_s.hpp:532
Definition: alpha_s.hpp:35
QCD_CONSTEXPR_AFTER_CXX14 double zeta_alpha_s(unsigned order, unsigned nf, double lm)
Coefficients of the decoupling constant.
Definition: zeta_alpha_s.hpp:582
Definition of mass schemes.
QCD_CONSTEXPR_AFTER_CXX14 double zeta_alpha_s_inv(unsigned order, unsigned nf, double lm, double alpha_s)
Inverse decoupling constant for the strong coupling constant.
Definition: zeta_alpha_s.hpp:559