Version: SMASH-1.5
clebschgordan.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2018
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 
8 #include "smash/clebschgordan.h"
9 
10 #include <gsl/gsl_sf_coupling.h>
11 #include <numeric>
12 #include "smash/constants.h"
13 #include "smash/logging.h"
14 
15 namespace smash {
16 
17 double clebsch_gordan(const int j_a, const int j_b, const int j_c,
18  const int m_a, const int m_b, const int m_c) {
19  const double wigner_3j = gsl_sf_coupling_3j(j_a, j_b, j_c, m_a, m_b, -m_c);
20  if (std::abs(wigner_3j) < really_small) {
21  return 0.;
22  }
23  assert((j_a - j_b + m_c) % 2 == 0);
24  const int j = (j_a - j_b + m_c) / 2;
25  double result = std::sqrt(j_c + 1) * wigner_3j;
26  result *= (j % 2 == 0) * 2 - 1; // == (-1)**j
27 
28 #ifndef NDEBUG
29  const auto &log = logger<LogArea::Resonances>();
30  log.debug("CG: ", result, " I1: ", j_a, " I2: ", j_b, " IR: ", j_c,
31  " iz1: ", m_a, " iz2: ", m_b, " izR: ", m_c);
32 #endif
33 
34  return result;
35 }
36 
45 static double isospin_clebsch_gordan_2to1(const ParticleType &p_a,
46  const ParticleType &p_b,
47  const int I_tot, const int I_z) {
48  return clebsch_gordan(p_a.isospin(), p_b.isospin(), I_tot, p_a.isospin3(),
49  p_b.isospin3(), I_z);
50 }
51 
53  const ParticleType &p_b,
54  const ParticleType &p_c,
55  const ParticleType &Res) {
56  // Calculate allowed isospin range for 3->1 reaction I_ab
57  const auto min_I_ab = std::abs(p_a.isospin() - p_b.isospin());
58  const auto max_I_ab = p_a.isospin() + p_b.isospin();
59  std::vector<int> possible_I_ab(max_I_ab - min_I_ab + 1);
60  std::iota(possible_I_ab.begin(), possible_I_ab.end(), min_I_ab);
61  std::vector<int> allowed_I_ab;
62  allowed_I_ab.reserve(possible_I_ab.size());
63  for (const auto Iab : possible_I_ab) {
64  const auto min_I = std::abs(Iab - p_c.isospin());
65  const auto max_I = Iab + p_c.isospin();
66  if (min_I <= Res.isospin() && Res.isospin() <= max_I) {
67  allowed_I_ab.push_back(Iab);
68  }
69  }
70  if (allowed_I_ab.size() != 1) {
71  throw std::runtime_error(
72  "The coupled 3-body isospin state is not uniquely defined for " +
73  Res.name() + " -> " + p_a.name() + " " + p_b.name() + " " + p_c.name());
74  }
75  const auto I_ab = allowed_I_ab[0];
76 
77  const int I_abz = p_a.isospin3() + p_b.isospin3();
78  const double cg = clebsch_gordan(I_ab, p_c.isospin(), Res.isospin(), I_abz,
79  p_c.isospin3(), Res.isospin3()) *
80  clebsch_gordan(p_a.isospin(), p_b.isospin(), I_ab,
81  p_a.isospin3(), p_b.isospin3(), I_abz);
82  return cg * cg;
83 }
84 
86  const ParticleType &p_b,
87  const ParticleType &p_c,
88  const ParticleType &p_d, const int I) {
89  const int I_z = p_a.isospin3() + p_b.isospin3();
90 
91  /* Loop over total isospin in allowed range. */
92  double isospin_factor = 0.;
93  for (const int I_tot : I_tot_range(p_a, p_b, p_c, p_d)) {
94  if (I < 0 || I_tot == I) {
95  const double cg_in = isospin_clebsch_gordan_2to1(p_a, p_b, I_tot, I_z);
96  const double cg_out = isospin_clebsch_gordan_2to1(p_c, p_d, I_tot, I_z);
97  isospin_factor = isospin_factor + cg_in * cg_in * cg_out * cg_out;
98  }
99  }
100  return isospin_factor;
101 }
102 
103 } // namespace smash
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
Collection of useful constants that are known at compile time.
int isospin3() const
Definition: particletype.h:166
double isospin_clebsch_gordan_sqr_3to1(const ParticleType &p_a, const ParticleType &p_b, const ParticleType &p_c, const ParticleType &Res)
Calculate the squared isospin Clebsch-Gordan coefficient for three particles p_a, p_b and p_c couplin...
Range of total isospin for reaction of particle a with particle b.
Definition: clebschgordan.h:84
static double isospin_clebsch_gordan_2to1(const ParticleType &p_a, const ParticleType &p_b, const int I_tot, const int I_z)
Calculate isospin Clebsch-Gordan coefficient for two particles p_a and p_b coupling to a total isospi...
Particle type contains the static properties of a particle species.
Definition: particletype.h:87
int isospin() const
Returns twice the isospin vector length .
double isospin_clebsch_gordan_sqr_2to2(const ParticleType &p_a, const ParticleType &p_b, const ParticleType &p_c, const ParticleType &p_d, const int I=-1)
Calculate the squared isospin Clebsch-Gordan coefficient for a 2-to-2 reaction A + B -> C + D...
double clebsch_gordan(const int j_a, const int j_b, const int j_c, const int m_a, const int m_b, const int m_c)
Calculate Clebsch-Gordan coefficient .
Definition: action.h:24
const std::string & name() const
Definition: particletype.h:131