Version: SMASH-1.5
potentials.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2018
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #include "smash/potentials.h"
11 
12 #include "smash/constants.h"
13 #include "smash/density.h"
14 
15 namespace smash {
16 
17 Potentials::Potentials(Configuration conf, const DensityParameters &param)
18  : param_(param),
19  use_skyrme_(conf.has_value({"Skyrme"})),
20  use_symmetry_(conf.has_value({"Symmetry"})) {
72  if (use_skyrme_) {
73  skyrme_a_ = conf.take({"Skyrme", "Skyrme_A"});
74  skyrme_b_ = conf.take({"Skyrme", "Skyrme_B"});
75  skyrme_tau_ = conf.take({"Skyrme", "Skyrme_Tau"});
76  }
77 
89  if (use_symmetry_) {
90  symmetry_s_ = conf.take({"Symmetry", "S_Pot"});
91  }
92 }
93 
94 Potentials::~Potentials() {}
95 
96 double Potentials::skyrme_pot(const double baryon_density) const {
97  const double tmp = baryon_density / nuclear_density;
98  /* U = U(|rho|) * sgn , because the sign of the potential changes
99  * under a charge reversal transformation. */
100  const int sgn = tmp > 0 ? 1 : -1;
101  // Return in GeV
102  return 1.0e-3 * sgn *
103  (skyrme_a_ * std::abs(tmp) +
104  skyrme_b_ * std::pow(std::abs(tmp), skyrme_tau_));
105 }
106 
107 double Potentials::symmetry_pot(const double baryon_isospin_density) const {
108  return 1.0e-3 * 2. * symmetry_s_ * baryon_isospin_density / nuclear_density;
109 }
110 
111 double Potentials::potential(const ThreeVector &r, const ParticleList &plist,
112  const ParticleType &acts_on) const {
113  double total_potential = 0.0;
114  const bool compute_gradient = false;
115  const auto scale = force_scale(acts_on);
116 
117  if (!acts_on.is_baryon()) {
118  return total_potential;
119  }
120 
121  if (use_skyrme_) {
122  const double rho_eck = std::get<0>(
123  rho_eckart(r, plist, param_, DensityType::Baryon, compute_gradient));
124  total_potential += scale.first * skyrme_pot(rho_eck);
125  }
126  if (use_symmetry_) {
127  const double rho_iso = std::get<0>(rho_eckart(
128  r, plist, param_, DensityType::BaryonicIsospin, compute_gradient));
129  const double sym_pot = symmetry_pot(rho_iso) * acts_on.isospin3_rel();
130  total_potential += scale.second * sym_pot;
131  }
132  return total_potential;
133 }
134 
135 std::pair<double, int> Potentials::force_scale(const ParticleType &data) const {
136  double skyrme_scale = data.is_baryon() ? 1.0 : 0.0;
137  if (data.pdgcode().is_hyperon()) {
138  if (data.pdgcode().is_Xi()) {
139  skyrme_scale = 1. / 3.;
140  } else if (data.pdgcode().is_Omega()) {
141  skyrme_scale = 0.;
142  } else {
143  skyrme_scale = 2. / 3.;
144  }
145  }
146  skyrme_scale = skyrme_scale * data.pdgcode().baryon_number();
147  const int symmetry_scale = data.pdgcode().baryon_number();
148  return std::make_pair(skyrme_scale, symmetry_scale);
149 }
150 
151 std::pair<ThreeVector, ThreeVector> Potentials::skyrme_force(
152  const double density, const ThreeVector grad_rho, const ThreeVector dj_dt,
153  const ThreeVector rot_j) const {
154  const double MeV_to_GeV = 1.0e-3;
155  ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
156  if (use_skyrme_) {
157  const double dV_drho =
158  (skyrme_a_ + skyrme_b_ * skyrme_tau_ *
159  std::pow(density / nuclear_density, skyrme_tau_ - 1)) *
160  MeV_to_GeV / nuclear_density;
161  E_component -= dV_drho * (grad_rho + dj_dt);
162  B_component += dV_drho * rot_j;
163  }
164  return std::make_pair(E_component, B_component);
165 }
166 
167 std::pair<ThreeVector, ThreeVector> Potentials::symmetry_force(
168  const ThreeVector grad_rho, const ThreeVector dj_dt,
169  const ThreeVector rot_j) const {
170  const double MeV_to_GeV = 1.0e-3;
171  ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
172  if (use_symmetry_) {
173  const double dV_drho = MeV_to_GeV * 2. * symmetry_s_ / nuclear_density;
174  E_component -= dV_drho * (grad_rho + dj_dt);
175  B_component += dV_drho * rot_j;
176  }
177  return std::make_pair(E_component, B_component);
178 }
179 
180 std::tuple<ThreeVector, ThreeVector, ThreeVector, ThreeVector>
181 Potentials::all_forces(const ThreeVector &r, const ParticleList &plist) const {
182  const bool compute_gradient = true;
183  auto F_skyrme =
184  std::make_pair(ThreeVector(0., 0., 0.), ThreeVector(0., 0., 0.));
185  auto F_symmetry =
186  std::make_pair(ThreeVector(0., 0., 0.), ThreeVector(0., 0., 0.));
187 
188  if (use_skyrme_) {
189  const auto density_and_gradient =
190  rho_eckart(r, plist, param_, DensityType::Baryon, compute_gradient);
191  const double rho = std::get<0>(density_and_gradient);
192  const ThreeVector grad_rho = std::get<1>(density_and_gradient);
193  const ThreeVector dj_dt = std::get<2>(density_and_gradient);
194  const ThreeVector rot_j = std::get<3>(density_and_gradient);
195  F_skyrme = skyrme_force(rho, grad_rho, dj_dt, rot_j);
196  }
197 
198  if (use_symmetry_) {
199  const auto density_and_gradient = rho_eckart(
200  r, plist, param_, DensityType::BaryonicIsospin, compute_gradient);
201  const ThreeVector grad_rho = std::get<1>(density_and_gradient);
202  const ThreeVector dj_dt = std::get<2>(density_and_gradient);
203  const ThreeVector rot_j = std::get<3>(density_and_gradient);
204  F_symmetry = symmetry_force(grad_rho, dj_dt, rot_j);
205  }
206 
207  return std::make_tuple(F_skyrme.first, F_skyrme.second, F_symmetry.first,
208  F_symmetry.second);
209 }
210 
211 } // namespace smash
bool is_Omega() const
Definition: pdgcode.h:346
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:30
Collection of useful constants that are known at compile time.
std::tuple< double, ThreeVector, ThreeVector, ThreeVector > rho_eckart(const ThreeVector &r, const ParticleList &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame...
Definition: density.cc:133
Potentials(Configuration conf, const DensityParameters &parameters)
Potentials constructor.
bool is_baryon() const
Definition: particletype.h:190
double isospin3_rel() const
Definition: particletype.h:169
bool is_hyperon() const
Definition: pdgcode.h:343
Particle type contains the static properties of a particle species.
Definition: particletype.h:87
bool is_Xi() const
Definition: pdgcode.h:351
constexpr double nuclear_density
Ground state density of symmetric nuclear matter [fm^-3].
Definition: constants.h:42
PdgCode pdgcode() const
Definition: particletype.h:146
int baryon_number() const
Definition: pdgcode.h:308
Definition: action.h:24
int sgn(T val)
Signum function.
Definition: random.h:187