Version: SMASH-2.0
clebschgordan.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2020
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 static constexpr int LResonances = LogArea::Resonances::id;
17 
18 double clebsch_gordan(const int j_a, const int j_b, const int j_c,
19  const int m_a, const int m_b, const int m_c) {
20  const double wigner_3j = gsl_sf_coupling_3j(j_a, j_b, j_c, m_a, m_b, -m_c);
21  if (std::abs(wigner_3j) < really_small) {
22  return 0.;
23  }
24  assert((j_a - j_b + m_c) % 2 == 0);
25  const int j = (j_a - j_b + m_c) / 2;
26  double result = std::sqrt(j_c + 1) * wigner_3j;
27  result *= (j % 2 == 0) * 2 - 1; // == (-1)**j
28 
29  logg[LResonances].debug("CG: ", result, " I1: ", j_a, " I2: ", j_b,
30  " IR: ", j_c, " iz1: ", m_a, " iz2: ", m_b,
31  " izR: ", m_c);
32 
33  return result;
34 }
35 
44 static double isospin_clebsch_gordan_2to1(const ParticleType &p_a,
45  const ParticleType &p_b,
46  const int I_tot, const int I_z) {
47  return clebsch_gordan(p_a.isospin(), p_b.isospin(), I_tot, p_a.isospin3(),
48  p_b.isospin3(), I_z);
49 }
50 
52  const ParticleType &p_b,
53  const ParticleType &p_c,
54  const ParticleType &Res) {
55  // Calculate allowed isospin range for 3->1 reaction I_ab
56  const auto min_I_ab = std::abs(p_a.isospin() - p_b.isospin());
57  const auto max_I_ab = p_a.isospin() + p_b.isospin();
58  std::vector<int> possible_I_ab(max_I_ab - min_I_ab + 1);
59  std::iota(possible_I_ab.begin(), possible_I_ab.end(), min_I_ab);
60  std::vector<int> allowed_I_ab;
61  allowed_I_ab.reserve(possible_I_ab.size());
62  for (const auto Iab : possible_I_ab) {
63  const auto min_I = std::abs(Iab - p_c.isospin());
64  const auto max_I = Iab + p_c.isospin();
65  if (min_I <= Res.isospin() && Res.isospin() <= max_I) {
66  allowed_I_ab.push_back(Iab);
67  }
68  }
69  if (allowed_I_ab.size() != 1) {
70  throw std::runtime_error(
71  "The coupled 3-body isospin state is not uniquely defined for " +
72  Res.name() + " -> " + p_a.name() + " " + p_b.name() + " " + p_c.name());
73  }
74  const auto I_ab = allowed_I_ab[0];
75 
76  const int I_abz = p_a.isospin3() + p_b.isospin3();
77  const double cg = clebsch_gordan(I_ab, p_c.isospin(), Res.isospin(), I_abz,
78  p_c.isospin3(), Res.isospin3()) *
79  clebsch_gordan(p_a.isospin(), p_b.isospin(), I_ab,
80  p_a.isospin3(), p_b.isospin3(), I_abz);
81  return cg * cg;
82 }
83 
85  const ParticleType &p_b,
86  const ParticleType &p_c,
87  const ParticleType &p_d, const int I) {
88  const int I_z = p_a.isospin3() + p_b.isospin3();
89 
90  /* Loop over total isospin in allowed range. */
91  double isospin_factor = 0.;
92  for (const int I_tot : I_tot_range(p_a, p_b, p_c, p_d)) {
93  if (I < 0 || I_tot == I) {
94  const double cg_in = isospin_clebsch_gordan_2to1(p_a, p_b, I_tot, I_z);
95  const double cg_out = isospin_clebsch_gordan_2to1(p_c, p_d, I_tot, I_z);
96  isospin_factor = isospin_factor + cg_in * cg_in * cg_out * cg_out;
97  }
98  }
99  return isospin_factor;
100 }
101 
102 } // namespace smash
smash
Definition: action.h:24
clebschgordan.h
smash::isospin_clebsch_gordan_sqr_2to2
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.
Definition: clebschgordan.cc:84
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::LResonances
static constexpr int LResonances
Definition: clebschgordan.cc:16
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
smash::ParticleType::isospin
int isospin() const
Returns twice the isospin vector length .
Definition: particletype.cc:404
smash::ParticleType
Definition: particletype.h:97
smash::ParticleType::name
const std::string & name() const
Definition: particletype.h:141
smash::I_tot_range
Range of total isospin for reaction of particle a with particle b.
Definition: clebschgordan.h:84
smash::ParticleType::isospin3
int isospin3() const
Definition: particletype.h:176
smash::isospin_clebsch_gordan_2to1
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...
Definition: clebschgordan.cc:44
constants.h
logging.h
smash::isospin_clebsch_gordan_sqr_3to1
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...
Definition: clebschgordan.cc:51
smash::clebsch_gordan
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: clebschgordan.cc:18