Version: SMASH-1.7
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  const auto &log = logger<LogArea::Resonances>();
29  log.debug("CG: ", result, " I1: ", j_a, " I2: ", j_b, " IR: ", j_c,
30  " iz1: ", m_a, " iz2: ", m_b, " izR: ", m_c);
31 
32  return result;
33 }
34 
43 static double isospin_clebsch_gordan_2to1(const ParticleType &p_a,
44  const ParticleType &p_b,
45  const int I_tot, const int I_z) {
46  return clebsch_gordan(p_a.isospin(), p_b.isospin(), I_tot, p_a.isospin3(),
47  p_b.isospin3(), I_z);
48 }
49 
51  const ParticleType &p_b,
52  const ParticleType &p_c,
53  const ParticleType &Res) {
54  // Calculate allowed isospin range for 3->1 reaction I_ab
55  const auto min_I_ab = std::abs(p_a.isospin() - p_b.isospin());
56  const auto max_I_ab = p_a.isospin() + p_b.isospin();
57  std::vector<int> possible_I_ab(max_I_ab - min_I_ab + 1);
58  std::iota(possible_I_ab.begin(), possible_I_ab.end(), min_I_ab);
59  std::vector<int> allowed_I_ab;
60  allowed_I_ab.reserve(possible_I_ab.size());
61  for (const auto Iab : possible_I_ab) {
62  const auto min_I = std::abs(Iab - p_c.isospin());
63  const auto max_I = Iab + p_c.isospin();
64  if (min_I <= Res.isospin() && Res.isospin() <= max_I) {
65  allowed_I_ab.push_back(Iab);
66  }
67  }
68  if (allowed_I_ab.size() != 1) {
69  throw std::runtime_error(
70  "The coupled 3-body isospin state is not uniquely defined for " +
71  Res.name() + " -> " + p_a.name() + " " + p_b.name() + " " + p_c.name());
72  }
73  const auto I_ab = allowed_I_ab[0];
74 
75  const int I_abz = p_a.isospin3() + p_b.isospin3();
76  const double cg = clebsch_gordan(I_ab, p_c.isospin(), Res.isospin(), I_abz,
77  p_c.isospin3(), Res.isospin3()) *
78  clebsch_gordan(p_a.isospin(), p_b.isospin(), I_ab,
79  p_a.isospin3(), p_b.isospin3(), I_abz);
80  return cg * cg;
81 }
82 
84  const ParticleType &p_b,
85  const ParticleType &p_c,
86  const ParticleType &p_d, const int I) {
87  const int I_z = p_a.isospin3() + p_b.isospin3();
88 
89  /* Loop over total isospin in allowed range. */
90  double isospin_factor = 0.;
91  for (const int I_tot : I_tot_range(p_a, p_b, p_c, p_d)) {
92  if (I < 0 || I_tot == I) {
93  const double cg_in = isospin_clebsch_gordan_2to1(p_a, p_b, I_tot, I_z);
94  const double cg_out = isospin_clebsch_gordan_2to1(p_c, p_d, I_tot, I_z);
95  isospin_factor = isospin_factor + cg_in * cg_in * cg_out * cg_out;
96  }
97  }
98  return isospin_factor;
99 }
100 
101 } // namespace smash
int isospin3() const
Definition: particletype.h:176
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
int isospin() const
Returns twice the isospin vector length .
Collection of useful constants that are known at compile time.
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...
const std::string & name() const
Definition: particletype.h:141
Particle type contains the static properties of a particle species.
Definition: particletype.h:97
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