QCD Library
zeta_m.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 MSbar mass from
44  // Chetyrkin, Kniehl, Steinhauser hep-ph/9708255
45  // Chetyrkin, Kuehn, Steinhauser hep-ph/0004189
46  // Liu, Steinhauser arXiv:1502.04719
47  // m^(nf-1) = zeta_m * m^(nf)
48  // m^(nf+1) = zeta_m_inv * m^(nf)
49  // lm = log(mu^2/m^2)
50 
51  constexpr unsigned zeta_m_max_order = 4;
52 
53  namespace detail{
54 
55  namespace zeta_m{
56  constexpr double pi = 3.141592653589793238462643383279;
57 
58  constexpr double zeta_2 = pi*pi/6.;
59  constexpr double zeta_3 = 1.202056903159594285399738161511449990765;
60  constexpr double zeta_4 = pi*pi*pi*pi/90.;
61  constexpr double zeta_5 = 1.036927755143369926331365486457034168057;
62  constexpr double zeta_6 = pi*pi*pi*pi*pi*pi/945.;
63  constexpr double log2 = 0.6931471805599453094172321214581765680755;
64  constexpr double B4 = -1.762800087073770864061897634679818807215;
65  // c4 = 24*Li_4(1/2) + log^4(2) - pi^2*log^2(2)
66  constexpr double c4 = 7.908451398072941071188189589256658841231;
67  // c5 = -360*Li_5(1/2) + 3*log^5(2) - 5*pi^2*log^3(2)
68  constexpr double c5 = -198.9783082886512628182933723717652048993;
69 
70  constexpr unsigned max_nf_pow(unsigned order){
71  return (order > 2u)?(order-2u):0u;
72  }
73 
74  constexpr unsigned max_log_pow(unsigned order, unsigned){
75  return (order > 1u)?order:0u;
76  }
77 
78  // coefficients of zeta_m
79  constexpr size_t num_coeff = 28;
80  constexpr auto data_OS = std::array<double, num_coeff>{{
81  + 1., //alpha_s^0
82  + 0., //alpha_s^1
83  89./432., -5./36., 1./12., // alpha_s^2 log^0...2
84  6157./11664. - B4/36. - 343./864.*zeta_3 + 5./4.*zeta_4, // alpha_s^3 nf^0 log^0
85  439./2592. -5./6.*zeta_3, 319./432., 31./216., //alpha_s^3 nf^0 log^1...3
86  1327./11664. - 2./27.*zeta_3, -53./432., 0., -1./108., //alpha_s^3 nf^1 log^0...3
87  133533622679./3292047360. - 2006969./4354560.*c4 + 13./972.*c5
88  - 35./54.*zeta_2 - 5./27.*log2*zeta_2 - 416579531./40642560.*zeta_3
89  + 1061./576.*zeta_3*zeta_3 + 16350665./580608.*zeta_4 - 1597./216.*log2*zeta_4
90  - 61997./1728.*zeta_5 - 3935./432.*zeta_6, // alpha_s^4 nf^0 log^0
91  -412745./124416. - 11./72.*c4 + 7./9.*zeta_2 + 2./9.*log2*zeta_2
92  - 143231./9216.*zeta_3 + 1483./96.*zeta_4 + 575./72.*zeta_5, // alpha_s^4 nf^0 log^1
93  28663./2592. - 155./48.*zeta_3, 6035./2592., 1039./3456., // alpha_s^4 nf^0 log^2...4
94  -2615471./746496. + 49./2592.*c4 - c5/810 + 5./54.*zeta_2 - 1055./1728.*zeta_3
95  - 721./3456.*zeta_4 + 49./72.*log2*zeta_4 + 497./288.*zeta_5, // alpha_s^4 nf^1 log^0
96  34739./93312. + c4/108 - zeta_2/9. + 439./1728.*zeta_3 - 163./144.*zeta_4, // alpha_s^4 nf^1 log^1
97  -10097./10368., -47./288., -1./27., // alpha_s^4 nf^1 log^2...4
98  17671./124416. - 5./864.*zeta_3 - 7./96.*zeta_4, // alpha_s^4 nf^2 log^0
99  -3401./46656. + 7./108.*zeta_3, 31./1296., 0., 1./864. // alpha_s^4 nf^2 log^2...4
100  }};
101 
102  constexpr auto data_MS = std::array<double, num_coeff>{{
103  1.,
104  0.,
105  89./432., -5./36., 1./12.,
106  10477./11664. - B4/36. - 343./864.*zeta_3 + 5./4.*zeta_4,
107  7./2592. - 5./6.*zeta_3, 175./432., 31./216.,
108  1327./11664. - 2./27.*zeta_3, -53./432., 0., -1./108.,
109  142408730039./3292047360. - 2006969./4354560.*c4 + 13./972.*c5
110  - 328144331./40642560.*zeta_3 + 1061./576.*zeta_3*zeta_3 + 16350665./580608.*zeta_4
111  - 1597./216.*log2*zeta_4 - 61997./1728.*zeta_5 - 3935./432.*zeta_6,
112  -1012697./124416. - 11./72.*c4 - 14151./1024.*zeta_3
113  + 1483./96.*zeta_4 + 575./72.*zeta_5,
114  14809./2592. - 155./48.*zeta_3, 2615./2592., 1039./3456.,
115  -2473487./746496. + 49./2592.*c4 - c5/810 - 1055./1728.*zeta_3
116  - 721./3456.*zeta_4 + 49./72.*log2*zeta_4 + 497./288.*zeta_5,
117  63611./93312. + c4/108 + 439./1728.*zeta_3 - 163./144.*zeta_4,
118  -8321./10368., -23./288., -1./27.,
119  17671./124416. - 5./864.*zeta_3 - 7./96.*zeta_4,
120  -3401./46656. + 7./108.*zeta_3, 31./1296., 0., 1./864.
121  }};
122 
123  constexpr auto data_SI = std::array<double, num_coeff>{{
124  1.,
125  0.,
126  89./432., -5./36., 1./12.,
127  10477./11664. - B4/36. - 343./864.*zeta_3 + 5./4.*zeta_4,
128  -713./2592. - 5./6.*zeta_3, 319./432., 31./216.,
129  1327./11664. - 2./27.*zeta_3, -53./432., 0., -1./108.,
130  142408730039./3292047360. - 2006969./4354560.*c4 + 13./972.*c5
131  - 328144331./40642560.*zeta_3 + 1061./576.*zeta_3*zeta_3 + 16350665./580608.*zeta_4
132  - 1597./216.*log2*zeta_4 - 61997./1728.*zeta_5 - 3935./432.*zeta_6,
133  -1157465./124416. - 11./72.*c4 - 47573./3072.*zeta_3
134  + 1483./96.*zeta_4 + 575./72.*zeta_5,
135  22519./2592. - 155./48.*zeta_3, 6035./2592., 1039./3456.,
136  -2473487./746496. + 49./2592.*c4 - c5/810 - 1055./1728.*zeta_3
137  - 721./3456.*zeta_4 + 49./72.*log2*zeta_4 + 497./288.*zeta_5,
138  44315./93312. + c4/108 + 439./1728.*zeta_3 - 163./144.*zeta_4,
139  -8561./10368., -47./288., -1./27.,
140  17671./124416. - 5./864.*zeta_3 - 7./96.*zeta_4,
141  -3401./46656. + 7./108.*zeta_3, 31./1296., 0, 1./864.
142  }};
143 
144 
145  template<scheme s>
146  QCD_CONSTEXPR_AFTER_CXX14
147  double coeffs(size_t);
148 
149  template<>
150  inline QCD_CONSTEXPR_AFTER_CXX14
151  double coeffs<scheme::pole>(size_t i){
152  return data_OS[i];
153  }
154 
155  template<>
156  inline QCD_CONSTEXPR_AFTER_CXX14
157  double coeffs<scheme::MSbar>(size_t i){
158  return data_MS[i];
159  }
160 
161  template<>
162  inline QCD_CONSTEXPR_AFTER_CXX14
163  double coeffs<scheme::scale_invariant>(size_t i){
164  return data_SI[i];
165  }
166 
167  /* coefficients of zeta_m^-1 */
168  constexpr auto data_OS_inv = std::array<double, num_coeff>{{
169  1., //alpha_s^0
170  0., //alpha_s^1
171  -89./432., 5./36., -1./12., //alpha_s^2 log^0...2
172  -1871/2916. + B4/36. + 407./864.*zeta_3 - 5./4.*zeta_4, //alpha_s^3 nf^0 log^0
173  -299./2592. + 5./6.*zeta_3, -299./432., -35./216., //alpha_s^3 nf^0 log^1...3
174  -1327./11664. + 2./27.*zeta_3, 53./432., 0., 1./108., //alpha_s^3 nf^1 log^0...3
175  -122722873709./3292047360. + 1924649./4354560.*c4 - 59./4860.*c5
176  + 5./9.*zeta_2 + 5./27.*log2*zeta_2 + 441628331./40642560.*zeta_3
177  - 1061./576.*zeta_3*zeta_3 - 16187201./580608.*zeta_4 + 725./108.*log2*zeta_4
178  + 59015./1728.*zeta_5 + 3935./432.*zeta_6, //alpha_s^4 nf^0 log^0
179  99319./41472. + 11./72.*c4 - 2./3.*zeta_2 - 2./9.*log2*zeta_2
180  + 142463./9216.*zeta_3 - 481./32.*zeta_4 - 575./72.*zeta_5, //alpha_s^4 nf^0 log^1
181  -34297./3456. + 175./48.*zeta_3, -6941./2592., -1147./3456., //alpha_s^4 nf^0 log^2...4
182  2403419./746496. - 49./2592.*c4 + c5/810 - 5./54.*zeta_2 + 1075./1728.*zeta_3
183  + 1225./3456.*zeta_4 - 49./72.*log2*zeta_4 - 497./288.*zeta_5, //alpha_s^4 nf^1 log^0
184  -26443./93312. - c4/108 + zeta_2/9. - 599./1728.*zeta_3 + 163./144.*zeta_4, //alpha_s^4 nf^1 log^1
185  10237./10368., 47./288., 17./432., //alpha_s^4 nf^1 log^2...4
186  -17671./124416. + 5./864.*zeta_3 + 7./96.*zeta_4, //alpha_s^4 nf^2 log^0
187  3401./46656. - 7./108.*zeta_3, -31./1296., 0., -1./864. //alpha_s^4 nf^2 log^1...4
188  }};
189 
190 
191  constexpr auto data_MS_inv = std::array<double, num_coeff>{{
192  1., //alpha_s^0
193  0., //alpha_s^1
194  -89./432., 5./36., -1./12., //alpha_s^2 log^0...2
195  -2951./2916. + B4/36. + 407./864.*zeta_3 - 5./4.*zeta_4, //alpha_s^3 nf^0 log^0
196  133./2592. + 5./6.*zeta_3, -155./432., -35./216., //alpha_s^3 nf^0 log^1...3
197  -1327./11664. + 2./27.*zeta_3, 53./432., 0., 1./108., //alpha_s^3 nf^1 log^0...3
198  -131621265869./3292047360. + 1924649./4354560.*c4 - 59./4860.*c5
199  + 353193131./40642560.*zeta_3 - 1061./576.*zeta_3*zeta_3 - 16187201./580608.*zeta_4
200  + 725./108.*log2*zeta_4 + 59015./1728.*zeta_5 + 3935./432.*zeta_6, //alpha_s^4 nf^0 log^0
201  279367./41472. + 11./72.*c4 + 42197./3072.*zeta_3
202  - 481./32.*zeta_4 - 575./72.*zeta_5, //alpha_s^4 nf^0 log^1
203  -16193./3456. + 175./48.*zeta_3, -3161./2592., -1147./3456., //alpha_s^4 nf^0 log^2...4
204  2261435./746496. - 49./2592.*c4 + c5/810 + 1075./1728.*zeta_3
205  + 1225./3456.*zeta_4 - 49./72.*log2*zeta_4 - 497./288.*zeta_5, //alpha_s^4 nf^1 log^0
206  -55315./93312. - c4/108 - 599./1728.*zeta_3 + 163./144.*zeta_4, //alpha_s^4 nf^1 log^1
207  8461./10368., 23./288., 17./432., //alpha_s^4 nf^1 log^2...4
208  -17671./124416. + 5./864.*zeta_3 + 7./96.*zeta_4, //alpha_s^4 nf^2 log^0
209  3401./46656. - 7./108.*zeta_3, -31./1296., 0, -1./864. //alpha_s^4 nf^2 log^1...4
210  }};
211 
212  constexpr auto data_SI_inv = std::array<double, num_coeff>{{
213  1., //alpha_s^0
214  0., //alpha_s^1
215  -89./432., 5./36., -1./12., //alpha_s^2 log^0...2
216  -2951./2916. + B4/36. + 407./864.*zeta_3 - 5./4.*zeta_4, //alpha_s^3 nf^0 log^0
217  853./2592. + 5./6.*zeta_3, -299./432., -35./216., //alpha_s^3 nf^0 log^1...3
218  -1327./11664. + 2./27.*zeta_3, 53./432., 0., 1./108., //alpha_s^3 nf^1 log^0...3
219  -131621265869./3292047360. + 1924649./4354560.*c4 - 59./4860.*c5
220  + 353193131./40642560.*zeta_3 - 1061./576.*zeta_3*zeta_3 - 16187201./580608.*zeta_4
221  + 725./108.*log2*zeta_4 + 59015./1728.*zeta_5 + 3935./432.*zeta_6, //alpha_s^4 nf^0 log^0
222  330503./41472. + 11./72.*c4 + 47317./3072.*zeta_3
223  - 481./32.*zeta_4 - 575./72.*zeta_5, //alpha_s^4 nf^0 log^1
224  -8531./1152. + 175./48.*zeta_3, -6941./2592., -1147./3456., //alpha_s^4 nf^0 log^2...4
225  2261435./746496. - 49./2592.*c4 + c5/810 + 1075./1728.*zeta_3
226  + 1225./3456.*zeta_4 - 49./72.*log2*zeta_4 - 497./288.*zeta_5, //alpha_s^4 nf^1 log^0
227  -36019./93312. - c4/108 - 599./1728.*zeta_3 + 163./144.*zeta_4, //alpha_s^4 nf^1 log^1
228  8701./10368., 47./288., 17./432., //alpha_s^4 nf^1 log^2...4
229  -17671./124416. + 5./864.*zeta_3 + 7./96.*zeta_4, //alpha_s^4 nf^2 log^0
230  3401./46656. - 7./108.*zeta_3, -31./1296., 0, -1./864. //alpha_s^4 nf^2 log^1...4
231  }};
232 
233  template<scheme s>
234  QCD_CONSTEXPR_AFTER_CXX14
235  double coeffs_inv(size_t);
236 
237  template<>
238  inline QCD_CONSTEXPR_AFTER_CXX14
239  double coeffs_inv<scheme::pole>(size_t i){
240  return data_OS_inv[i];
241  }
242 
243  template<>
244  inline QCD_CONSTEXPR_AFTER_CXX14
245  double coeffs_inv<scheme::MSbar>(size_t i){
246  return data_MS_inv[i];
247  }
248 
249  template<>
250  inline QCD_CONSTEXPR_AFTER_CXX14
251  double coeffs_inv<scheme::scale_invariant>(size_t i){
252  return data_SI_inv[i];
253  }
254 
255 
256  // get index in coeffs array for a given order and power of nf, lm
257  constexpr unsigned get_index(
258  unsigned order,
259  unsigned nf_pow
260  );
261 
262  constexpr unsigned get_index(
263  unsigned order
264  ){
265  return (order == 0u)?
266  0:(
267  + 1u
268  + max_log_pow(order - 1, max_nf_pow(order - 1))
269  + get_index(order - 1, max_nf_pow(order - 1))
270  );
271  }
272 
273  constexpr unsigned get_index(
274  unsigned order,
275  unsigned nf_pow
276  ){
277  return (nf_pow == 0u)?
278  get_index(order):(
279  1u + max_log_pow(order, nf_pow - 1) + get_index(order, nf_pow - 1)
280  );
281  }
282 
283  constexpr unsigned get_index(
284  unsigned order,
285  unsigned nf_pow,
286  unsigned log_pow
287  ){
288  return log_pow + get_index(order, nf_pow);
289  }
290  }
291  }
292 
293  template<scheme s>
294  inline QCD_CONSTEXPR_AFTER_CXX14
295  double zeta_m_log_coeff(
296  unsigned order,
297  unsigned nf_pow,
298  unsigned log_pow
299  ){
300  using namespace detail::zeta_m;
301  return coeffs<s>(get_index(order, nf_pow, log_pow));
302  }
303 
304  template<scheme s>
305  inline QCD_CONSTEXPR_AFTER_CXX14
306  double zeta_m_inv_log_coeff(
307  unsigned order,
308  unsigned nf_pow,
309  unsigned log_pow
310  ){
311  using namespace detail::zeta_m;
312  return coeffs_inv<s>(get_index(order, nf_pow, log_pow));
313  }
314 
315 
316  namespace detail{
317  namespace zeta_m{
318 
319  template<scheme s>
320  inline QCD_CONSTEXPR_AFTER_CXX14
321  double nf_coeff_helper(
322  unsigned order,
323  unsigned nf_pow,
324  double lm,
325  unsigned cur_log_pow
326  ){
327  return (cur_log_pow == max_log_pow(order, nf_pow))?
328  zeta_m_log_coeff<s>(order, nf_pow, cur_log_pow):(
329  + zeta_m_log_coeff<s>(order, nf_pow, cur_log_pow)
330  + lm * nf_coeff_helper<s>(order, nf_pow, lm, cur_log_pow + 1)
331  );
332  }
333 
334  template<scheme s>
335  inline QCD_CONSTEXPR_AFTER_CXX14
336  double nf_coeff_helper_inv(
337  unsigned order,
338  unsigned nf_pow,
339  double lm,
340  unsigned cur_log_pow
341  ){
342  return (cur_log_pow == max_log_pow(order, nf_pow))?
343  zeta_m_inv_log_coeff<s>(order, nf_pow, cur_log_pow):(
344  + zeta_m_inv_log_coeff<s>(order, nf_pow, cur_log_pow)
345  + lm * nf_coeff_helper_inv<s>(order, nf_pow, lm, cur_log_pow + 1)
346  );
347  }
348  }
349  }
350 
351  template<scheme s>
352  inline QCD_CONSTEXPR_AFTER_CXX14
353  double zeta_m_nf_coeff(
354  unsigned order,
355  unsigned nf_pow,
356  double lm
357  ){
358  using namespace detail::zeta_m;
359  return nf_coeff_helper<s>(order, nf_pow, lm, 0);
360  }
361 
362  template<scheme s>
363  inline QCD_CONSTEXPR_AFTER_CXX14
364  double zeta_m_inv_nf_coeff(
365  unsigned order,
366  unsigned nf_pow,
367  double lm
368  ){
369  using namespace detail::zeta_m;
370  return nf_coeff_helper_inv<s>(order, nf_pow, lm, 0);
371  }
372 
373  namespace detail{
374  namespace zeta_m{
375  template<scheme s>
376  inline QCD_CONSTEXPR_AFTER_CXX14
377  double helper(
378  unsigned order,
379  unsigned nf,
380  double lm,
381  unsigned cur_nf_pow
382  ){
383  return (cur_nf_pow == max_nf_pow(order))?
384  zeta_m_nf_coeff<s>(order, cur_nf_pow, lm):(
385  + zeta_m_nf_coeff<s>(order, cur_nf_pow, lm)
386  + nf * helper<s>(order, nf, lm, cur_nf_pow + 1)
387  );
388  }
389 
390  template<scheme s>
391  inline QCD_CONSTEXPR_AFTER_CXX14
392  double helper_inv(
393  unsigned order,
394  unsigned nf,
395  double lm,
396  unsigned cur_nf_pow
397  ){
398  return (cur_nf_pow == max_nf_pow(order))?
399  zeta_m_inv_nf_coeff<s>(order, cur_nf_pow, lm):(
400  + zeta_m_inv_nf_coeff<s>(order, cur_nf_pow, lm)
401  + nf * helper_inv<s>(order, nf, lm, cur_nf_pow + 1)
402  );
403  }
404 
405  template<scheme s>
406  inline QCD_CONSTEXPR_AFTER_CXX14
407  double zeta_m(
408  unsigned order,
409  unsigned nf,
410  double lm
411  ){
412  return helper<s>(order, nf, lm, 0);
413  }
414 
415  template<scheme s>
416  inline QCD_CONSTEXPR_AFTER_CXX14
417  double zeta_m_inv(
418  unsigned order,
419  unsigned nf,
420  double lm
421  ){
422  return helper_inv<s>(order, nf, lm, 0);
423  }
424 
425  template<scheme s>
426  inline QCD_CONSTEXPR_AFTER_CXX14
427  double helper(
428  unsigned order,
429  unsigned nf,
430  double lm,
431  double alpha_s,
432  unsigned cur_order
433  ){
434  return (cur_order == order)?
435  zeta_m<s>(order, nf, lm):(
436  + zeta_m<s>(cur_order, nf, lm)
437  + alpha_s/pi * helper<s>(order, nf, lm, alpha_s, cur_order + 1)
438  );
439  }
440 
441  template<scheme s>
442  inline QCD_CONSTEXPR_AFTER_CXX14
443  double helper_inv(
444  unsigned order,
445  unsigned nf,
446  double lm,
447  double alpha_s,
448  unsigned cur_order
449  ){
450  return (cur_order == order)?
451  zeta_m_inv<s>(order, nf, lm):(
452  + zeta_m_inv<s>(cur_order, nf, lm)
453  + alpha_s/pi * helper_inv<s>(order, nf, lm, alpha_s, cur_order + 1)
454  );
455  }
456  }
457  }
458 
460 
474  template<scheme s>
475  inline QCD_CONSTEXPR_AFTER_CXX14
476  double zeta_m(
477  unsigned order,
478  unsigned nf,
479  double lm,
480  double alpha_s
481  ){
482  using namespace detail::zeta_m;
483  return helper<s>(order, nf, lm, alpha_s, 0);
484  }
485 
487 
500  template<scheme s>
501  inline QCD_CONSTEXPR_AFTER_CXX14
502  double zeta_m_inv(
503  unsigned order,
504  unsigned nf,
505  double lm,
506  double alpha_s
507  ){
508  using namespace detail::zeta_m;
509  return helper_inv<s>(order, nf, lm, alpha_s, 0);
510  }
512 
522  template<scheme s>
523  inline QCD_CONSTEXPR_AFTER_CXX14
524  double zeta_m(
525  unsigned order,
526  unsigned nf,
527  double lm
528  ){
529  return detail::zeta_m::zeta_m<s>(order, nf, lm);
530  }
531 
533 
543  template<scheme s>
544  inline QCD_CONSTEXPR_AFTER_CXX14
545  double zeta_m_inv(
546  unsigned order,
547  unsigned nf,
548  double lm
549  ){
550  return detail::zeta_m::zeta_m_inv<s>(order, nf, lm);
551  }
552 
553 }
554 
555 #undef QCD_CONSTEXPR_AFTER_CXX14
QCD_CONSTEXPR_AFTER_CXX14 double zeta_m_inv(unsigned order, unsigned nf, double lm, double alpha_s)
Inverse decoupling constant for the mass in the scheme.
Definition: zeta_m.hpp:502
Definition: alpha_s.hpp:35
QCD_CONSTEXPR_AFTER_CXX14 double zeta_m(unsigned order, unsigned nf, double lm, double alpha_s)
Decoupling constant for the mass in the scheme.
Definition: zeta_m.hpp:476
Definition of mass schemes.
QCD_CONSTEXPR_AFTER_CXX14 double zeta_m(unsigned order, unsigned nf, double lm)
Coefficients of the decoupling constant.
Definition: zeta_m.hpp:524