Version: SMASH-3.3
smash::DeformedNucleus Class Reference

#include <deformednucleus.h>

DeformedNucleus: Child of nucleus for deformed nuclei.

All options from the nucleus will still apply. The deformed nucleus adds new or updated features which are outlined below.

Definition at line 38 of file deformednucleus.h.

Inheritance diagram for smash::DeformedNucleus:
smash::Nucleus

Public Member Functions

 DeformedNucleus (const std::map< PdgCode, int > &particle_list, int nTest, SpinInteractionType spin_interaction_type=SpinInteractionType::Off)
 Constructor for DeformedNucles which takes a particle list and the number of testparticles. More...
 
 DeformedNucleus (Configuration &config, int nTest, bool auto_deformation)
 Constructor for DeformedNucleus, that needs the configuration parameters from the inputfile and the number of testparticles. More...
 
ThreeVector distribute_nucleon () override
 Deformed Woods-Saxon sampling routine. More...
 
void set_deformation_parameters_automatic ()
 Sets the deformation parameters of the radius according to the current mass number. More...
 
void set_deformation_parameters_from_config (Configuration &config)
 Set parameters for spherical deformation of the nucleus from the values specified in the configuration file. More...
 
double get_saturation_density () const
 
double nucleon_density (double r, double cosx, double phi) const override
 Return the deformed Woods-Saxon probability density for the given position. More...
 
double nucleon_density_unnormalized (double r, double cosx, double phi) const override
 Return the unnormalized deformed Woods-Saxon distribution for the given position. More...
 
double integrant_nucleon_density_phi (double r, double cosx) const
 Return the integral over the azimuthal angle phi. More...
 
double calculate_saturation_density () const override
 
void set_beta_2 (double b2)
 Set deformation coefficient for Y_2_0. More...
 
void set_gamma (double ga)
 Set the triaxiality coefficient gamma for Y_2_0 and Y_2_2. More...
 
void set_beta_3 (double b3)
 Set deformation coefficient for Y_3_0. More...
 
void set_beta_4 (double b4)
 Set deformation coefficient for Y_4_0. More...
 
double get_beta2 ()
 return the beta2 value. More...
 
double get_beta3 ()
 return the beta3 value. More...
 
double get_beta4 ()
 return the beta4 value. More...
 
- Public Member Functions inherited from smash::Nucleus
 Nucleus ()=default
 default constructor More...
 
 Nucleus (Configuration &config, int nTest)
 Constructor for Nucleus, that needs the configuration parameters from the inputfile and the number of testparticles. More...
 
 Nucleus (const std::map< PdgCode, int > &particle_list, int nTest, SpinInteractionType spin_interaction_type=SpinInteractionType::Off)
 Constructor which directly initializes the Nucleus with particles and respective counts. More...
 
virtual ~Nucleus ()=default
 
double mass () const
 
double woods_saxon (double x)
 Woods-Saxon distribution. More...
 
virtual void arrange_nucleons ()
 Sets the positions of the nucleons inside a nucleus. More...
 
virtual void set_parameters_automatic ()
 Sets the deformation parameters of the Woods-Saxon distribution according to the current mass number. More...
 
virtual void generate_fermi_momenta ()
 Generates momenta according to Fermi motion for the nucleons. More...
 
void boost (double beta_scalar)
 Boosts the nuclei into the computational frame, such that the nucleons have the appropriate momentum and the nuclei are lorentz-contracted. More...
 
void fill_from_list (const std::map< PdgCode, int > &particle_list, int testparticles)
 Adds particles from a map PDG code => Number_of_particles_with_that_PDG_code to the nucleus. More...
 
void shift (double z_offset, double x_offset, double simulation_time)
 Shifts the nucleus to correct impact parameter and z displacement. More...
 
virtual void rotate ()
 Rotates the nucleus using the three euler angles phi, theta and psi. More...
 
void copy_particles (Particles *particles)
 Copies the particles from this nucleus into the particle list. More...
 
size_t size () const
 Number of numerical (=test-)particles in the nucleus: More...
 
size_t number_of_particles () const
 Number of physical particles in the nucleus: More...
 
size_t number_of_protons () const
 Number of physical protons in the nucleus: More...
 
FourVector center () const
 Calculate geometrical center of the nucleus. More...
 
void set_label (BelongsTo label)
 Sets target / projectile labels on nucleons. More...
 
void align_center ()
 Shifts the nucleus so that its center is at (0,0,0) More...
 
virtual void set_saturation_density (double density)
 Sets the saturation density of the nucleus. More...
 
std::vector< ParticleData >::iterator begin ()
 For iterators over the particle list: More...
 
std::vector< ParticleData >::iterator end ()
 For iterators over the particle list: More...
 
std::vector< ParticleData >::const_iterator cbegin () const
 For const iterators over the particle list: More...
 
std::vector< ParticleData >::const_iterator cend () const
 For const iterators over the particle list: More...
 
void set_diffusiveness (double diffuse)
 Sets the diffusiveness of the nucleus. More...
 
double get_diffusiveness () const
 
double get_saturation_density () const
 
double default_nuclear_radius ()
 Default nuclear radius calculated as: More...
 
void set_nuclear_radius (double rad)
 Sets the nuclear radius. More...
 
double get_nuclear_radius () const
 
void set_orientation_from_config (Configuration &orientation_config)
 Set angles for rotation of the nucleus from config file. More...
 

Private Attributes

double beta2_ = 0.0
 Deformation parameter for angular momentum l=2. More...
 
double gamma_ = 0.0
 Triaxiality parameter for angular momentum l=2. More...
 
double beta3_ = 0.0
 Deformation parameter for angular momentum l=3. More...
 
double beta4_ = 0.0
 Deformation parameter for angular momentum l=4. More...
 

Additional Inherited Members

- Protected Member Functions inherited from smash::Nucleus
void random_euler_angles ()
 Randomly generate Euler angles. More...
 
- Protected Attributes inherited from smash::Nucleus
std::vector< ParticleDataparticles_
 Particles associated with this nucleus. More...
 
double saturation_density_ = nuclear_density
 Saturation density of this nucleus. More...
 
double euler_phi_ = 0.0
 The Euler angle phi of the three Euler angles used to apply rotations to the nucleus. More...
 
double euler_theta_ = 0.0
 Euler angle theta. More...
 
double euler_psi_ = 0.0
 Euler angle psi. More...
 
bool random_rotation_ = false
 Whether the nucleus should be rotated randomly. More...
 

Constructor & Destructor Documentation

◆ DeformedNucleus() [1/2]

smash::DeformedNucleus::DeformedNucleus ( const std::map< PdgCode, int > &  particle_list,
int  nTest,
SpinInteractionType  spin_interaction_type = SpinInteractionType::Off 
)

Constructor for DeformedNucles which takes a particle list and the number of testparticles.

This constructor is only used for testing purposes.

Parameters
[in]particle_listMap with PDGCode and number of particles which make up the nucleus
[in]nTestnumber of testparticles
[in]spin_interaction_typewhich type of spin interaction to use

Definition at line 22 of file deformednucleus.cc.

25  : Nucleus(particle_list, nTest, spin_interaction_type) {}
Nucleus()=default
default constructor

◆ DeformedNucleus() [2/2]

smash::DeformedNucleus::DeformedNucleus ( Configuration config,
int  nTest,
bool  auto_deformation 
)

Constructor for DeformedNucleus, that needs the configuration parameters from the inputfile and the number of testparticles.

Parameters
[in]configcontains the parameters from the inputfile on the numbers of particles with a certain PDG code
[in]nTestnumber of testparticles
[in]auto_deformationwhether or not deformation parameters should be set automatically

Definition at line 27 of file deformednucleus.cc.

29  : Nucleus(config, nTest) {
30  if (auto_deformation) {
33  } else {
35  }
36  /* If the config does not contain (anymore) a target or a projectile
37  sub-section, this code should not be executed, because e.g. the
38  is_about_projectile function would fail. */
39  if (has_projectile_or_target(config)) {
40  const auto &orientation_section = [&config]() {
43  }();
44  if (config.has_section(orientation_section)) {
45  Configuration sub_conf =
46  config.extract_complete_sub_configuration(orientation_section);
48  }
49  }
50 }
void set_deformation_parameters_from_config(Configuration &config)
Set parameters for spherical deformation of the nucleus from the values specified in the configuratio...
double calculate_saturation_density() const override
void set_deformation_parameters_automatic()
Sets the deformation parameters of the radius according to the current mass number.
virtual void set_saturation_density(double density)
Sets the saturation density of the nucleus.
Definition: nucleus.h:255
void set_orientation_from_config(Configuration &orientation_config)
Set angles for rotation of the nucleus from config file.
Definition: nucleus.cc:364
bool has_projectile_or_target(const Configuration &config)
Find out whether a configuration has a projectile or a target sub-section.
Definition: nucleus.cc:588
bool is_about_projectile(const Configuration &config)
Find out whether a configuration is about projectile or target.
Definition: nucleus.cc:594
static const Section m_c_p_orientation
Subsection for the projectile orientation in collider modus.
Definition: input_keys.h:114
static const Section m_c_t_orientation
Subsection for the target orientation in collider modus.
Definition: input_keys.h:128

Member Function Documentation

◆ distribute_nucleon()

ThreeVector smash::DeformedNucleus::distribute_nucleon ( )
overridevirtual

Deformed Woods-Saxon sampling routine.

Returns
Spatial position from uniformly sampling the deformed woods-saxon distribution

Reimplemented from smash::Nucleus.

Definition at line 52 of file deformednucleus.cc.

52  {
53  double a_radius;
54  Angles a_direction;
55  // Set a sensible maximum bound for radial sampling.
56  double radius_max =
59 
60  // Sample the distribution.
61  do {
62  a_direction.distribute_isotropically();
63  // sample r**2 dr
64  a_radius = radius_max * std::cbrt(random::canonical());
65  } while (random::canonical() > nucleon_density(a_radius,
66  a_direction.costheta(),
67  a_direction.phi()) /
69 
70  // Update (x, y, z) positions.
71  return a_direction.threevec() * a_radius;
72 }
double nucleon_density(double r, double cosx, double phi) const override
Return the deformed Woods-Saxon probability density for the given position.
double get_diffusiveness() const
Definition: nucleus.h:338
double get_saturation_density() const
Definition: nucleus.h:343
double get_nuclear_radius() const
Definition: nucleus.h:371
T canonical()
Definition: random.h:113

◆ set_deformation_parameters_automatic()

void smash::DeformedNucleus::set_deformation_parameters_automatic ( )

Sets the deformation parameters of the radius according to the current mass number.

The deformation parameters are taken from Moller:1993ed [43]. Corrections to the deformation parameter beta2 in Uranium come from Kuhlman:2005ts [35]. For finite nucleon size corrections to the nuclear density and radius for copper and gold, see Hirano:2009ah [27], and Hirano:2010jg [29] for uranium.

Definition at line 74 of file deformednucleus.cc.

74  {
75  // Set the deformation parameters
76  // reference for U, Pb, Au, Cu: \iref{Moller:1993ed}
77  // reference for Zr and Ru: \iref{Schenke:2019ruo}
78  // reference for Xe: \iref{Moller:2015fba}
79  bool listed = 0;
80  const std::map<int, std::string> A_map = {{238, "Uranium"},
81  {208, "Lead"},
82  {197, "Gold"},
83  {63, "Copper"},
84  {129, "Xenon"}};
85  const std::map<std::string, std::string> Z_map = {{"Uranium", "92"},
86  {"Lead", "82"},
87  {"Gold", "79"},
88  {"Copper", "29"},
89  {"Xenon", "54"}};
92  switch (A) {
93  case 238: // Uranium
94  if (Z == 92) {
95  set_beta_2(0.28);
96  set_beta_4(0.093);
97  } else {
98  listed = true;
99  }
100  break;
101  case 208: // Lead
102  if (Z == 82) {
103  set_beta_2(0.0);
104  set_beta_4(0.0);
105  } else {
106  listed = true;
107  }
108  break;
109  case 197: // Gold
110  if (Z == 79) {
111  set_beta_2(-0.131);
112  set_beta_4(-0.031);
113  } else {
114  listed = true;
115  }
116  break;
117  case 129: // Xenon
118  if (Z == 54) {
119  set_beta_2(0.162);
120  set_beta_4(-0.003);
121  } else {
122  listed = true;
123  }
124  break;
125  case 63: // Copper
126  if (Z == 29) {
127  set_beta_2(0.162);
128  set_beta_4(-0.006);
129  } else {
130  listed = true;
131  }
132  break;
133  case 96:
134  if (Z == 40) { // Zirconium
135  set_beta_2(0.0);
136  set_beta_4(0.0);
137  } else if (Z == 44) { // Ruthenium
138  set_beta_2(0.158);
139  set_beta_4(0.0);
140  } else {
141  throw std::domain_error(
142  "Number of protons for nuclei with mass number A = 96 does not "
143  "match that of Zirconium or Ruthenium. The deformation parameters "
144  "for additional isobars are currently not implemented."
145  " Please specify at least \"Beta_2\" and \"Beta_4\" "
146  "manually and set \"Automatic: False.\" ");
147  }
148  break;
149  default:
150  throw std::domain_error(
151  "Mass number not listed for automatically setting deformation "
152  "parameters. Please specify at least \"Beta_2\" and \"Beta_4\" "
153  "manually and set \"Automatic: False.\" ");
154  }
155  if (listed) {
156  throw std::domain_error("Mass number is listed under " + A_map.at(A) +
157  " but the proton "
158  "number of " +
159  std::to_string(Z) +
160  " does not match "
161  "its " +
162  Z_map.at(A_map.at(A)) +
163  " protons."
164  "Please specify at least \"Beta_2\" and \"Beta_4\" "
165  "manually and set \"Automatic: False.\" ");
166  }
167 }
void set_beta_2(double b2)
Set deformation coefficient for Y_2_0.
void set_beta_4(double b4)
Set deformation coefficient for Y_4_0.
size_t number_of_protons() const
Number of physical protons in the nucleus:
Definition: nucleus.h:178
size_t number_of_particles() const
Number of physical particles in the nucleus:
Definition: nucleus.h:159
std::string to_string(ThermodynamicQuantity quantity)
Convert a ThermodynamicQuantity enum value to its corresponding string.
Definition: stringify.cc:26

◆ set_deformation_parameters_from_config()

void smash::DeformedNucleus::set_deformation_parameters_from_config ( Configuration config)

Set parameters for spherical deformation of the nucleus from the values specified in the configuration file.

Parameters
configThe configuration for the deformation of this nucleus (projectile or target).

Definition at line 169 of file deformednucleus.cc.

170  {
171  if (has_projectile_or_target(config)) {
172  const bool is_projectile = is_about_projectile(config);
173  const auto &[beta2_key, beta3_key, beta4_key,
174  gamma_key] = [&is_projectile]() {
175  return is_projectile
176  ? std::make_tuple(
181  : std::make_tuple(
182  InputKeys::modi_collider_target_deformed_beta2,
183  InputKeys::modi_collider_target_deformed_beta3,
184  InputKeys::modi_collider_target_deformed_beta4,
185  InputKeys::modi_collider_target_deformed_gamma);
186  }();
187  // Deformation parameters
188  if (config.has_value(beta2_key)) {
189  beta2_ = config.take(beta2_key);
190  }
191  if (config.has_value(gamma_key)) {
192  gamma_ = config.take(gamma_key);
193  }
194  if (config.has_value(beta3_key)) {
195  beta3_ = config.take(beta3_key);
196  }
197  if (config.has_value(beta4_key)) {
198  beta4_ = config.take(beta4_key);
199  }
200  }
201 }
double beta4_
Deformation parameter for angular momentum l=4.
double gamma_
Triaxiality parameter for angular momentum l=2.
double beta3_
Deformation parameter for angular momentum l=3.
double beta2_
Deformation parameter for angular momentum l=2.
static const Key< double > modi_collider_projectile_deformed_beta3
See user guide description for more information.
Definition: input_keys.h:3597
static const Key< double > modi_collider_projectile_deformed_beta4
See user guide description for more information.
Definition: input_keys.h:3617
static const Key< double > modi_collider_projectile_deformed_beta2
See user guide description for more information.
Definition: input_keys.h:3577
static const Key< double > modi_collider_projectile_deformed_gamma
See user guide description for more information.
Definition: input_keys.h:3637

◆ get_saturation_density()

double smash::DeformedNucleus::get_saturation_density ( ) const
inline
Returns
the saturation density of the deformed_nucleus
See also
saturation_density_

Definition at line 94 of file deformednucleus.h.

94 { return saturation_density_; }
double saturation_density_
Saturation density of this nucleus.
Definition: nucleus.h:293

◆ nucleon_density()

double smash::DeformedNucleus::nucleon_density ( double  r,
double  cosx,
double  phi 
) const
overridevirtual

Return the deformed Woods-Saxon probability density for the given position.

This corresponds to the nuclear density at the very same position.

Parameters
[in]rThe radius at which to sample
[in]cosxThe cosine of the polar angle at which to sample
[in]phiThe azimuthal angle at which to sample
Returns
The Woods-Saxon density

Reimplemented from smash::Nucleus.

Definition at line 221 of file deformednucleus.cc.

222  {
224  (1 + std::exp((r - Nucleus::get_nuclear_radius() *
225  (1 +
226  beta2_ * (std::cos(gamma_) *
227  y_l_m(2, 0, cosx, phi) +
228  std::sqrt(2) * std::sin(gamma_) *
229  y_l_m(2, 2, cosx, phi)) +
230  beta3_ * y_l_m(3, 0, cosx, phi) +
231  beta4_ * y_l_m(4, 0, cosx, phi))) /
233 }
double y_l_m(int l, int m, double cosx, double phi)
Spherical harmonics Y_2_0, Y_2_2, Y_3_0 and Y_4_0.

◆ nucleon_density_unnormalized()

double smash::DeformedNucleus::nucleon_density_unnormalized ( double  r,
double  cosx,
double  phi 
) const
overridevirtual

Return the unnormalized deformed Woods-Saxon distribution for the given position.

Parameters
[in]rThe radius
[in]cosxThe cosine of the polar angle
[in]phiThe azimuthal angle
Returns
The unnormalized Woods-Saxon distribution

Reimplemented from smash::Nucleus.

Definition at line 235 of file deformednucleus.cc.

236  {
237  return 1.0 /
238  (1 + std::exp((r - Nucleus::get_nuclear_radius() *
239  (1 +
240  beta2_ * (std::cos(gamma_) *
241  y_l_m(2, 0, cosx, phi) +
242  std::sqrt(2) * std::sin(gamma_) *
243  y_l_m(2, 2, cosx, phi)) +
244  beta3_ * y_l_m(3, 0, cosx, phi) +
245  beta4_ * y_l_m(4, 0, cosx, phi))) /
247 }

◆ integrant_nucleon_density_phi()

double smash::DeformedNucleus::integrant_nucleon_density_phi ( double  r,
double  cosx 
) const

Return the integral over the azimuthal angle phi.

Parameters
[in]rThe radius
[in]cosxThe cosine of the polar angle
Returns
The unnormalized Woods-Saxon distribution integrated over dphi

Definition at line 249 of file deformednucleus.cc.

250  {
251  Integrator integrate;
252  // Perform the phi integration. This is needed if the triaxiality coefficient
253  // gamma is included, which includes a dependency around the phi axis.
254  // Unfortunately the Integrator class does not support 3d integration which is
255  // why this intermediate integral is needed. It has been checked that the
256  // integral factorizes.
257  const auto result = integrate(0.0, 2.0 * M_PI, [&](double phi) {
258  return nucleon_density_unnormalized(r, cosx, phi);
259  });
260  return result.value();
261 }
double nucleon_density_unnormalized(double r, double cosx, double phi) const override
Return the unnormalized deformed Woods-Saxon distribution for the given position.
static Integrator integrate
Definition: decaytype.cc:143

◆ calculate_saturation_density()

double smash::DeformedNucleus::calculate_saturation_density ( ) const
overridevirtual
Returns
the normalized ground state density for the corresponding Woods-Saxon parameter. This is done by integrating the Woods-Saxon distribution and setting the normalization such that the integral of the Woods-Saxon distribution yields the number of particles in the nucleus \(\int\rho(r)d^3r = N_{particles}\).

Reimplemented from smash::Nucleus.

Definition at line 263 of file deformednucleus.cc.

263  {
264  Integrator2d integrate;
265  // Transform integral from (0, oo) to (0, 1) via r = (1 - t) / t.
266  // To prevent overflow, the integration is only performed to t = 0.01 which
267  // corresponds to r = 99fm. Additionally the precision settings in the
268  // Integrator2d scheme are equally important. However both these point affect
269  // the result only after the seventh digit which should not be relevant here.
270  if (gamma_ == 0.0) {
271  const auto result = integrate(0.01, 1, -1, 1, [&](double t, double cosx) {
272  const double r = (1 - t) / t;
273  return twopi * std::pow(r, 2.0) *
274  nucleon_density_unnormalized(r, cosx, 0.0) / std::pow(t, 2.0);
275  });
276  const auto rho0 = number_of_particles() / result.value();
277  return rho0;
278  } else {
279  const auto result = integrate(0.01, 1, -1, 1, [&](double t, double cosx) {
280  const double r = (1 - t) / t;
281  return std::pow(r, 2.0) * integrant_nucleon_density_phi(r, cosx) /
282  std::pow(t, 2.0);
283  });
284  const auto rho0 = number_of_particles() / result.value();
285  return rho0;
286  }
287 }
double integrant_nucleon_density_phi(double r, double cosx) const
Return the integral over the azimuthal angle phi.
constexpr double twopi
.
Definition: constants.h:49

◆ set_beta_2()

void smash::DeformedNucleus::set_beta_2 ( double  b2)
inline

Set deformation coefficient for Y_2_0.

Parameters
[in]b2deformation coefficient for l=2

Definition at line 137 of file deformednucleus.h.

137 { beta2_ = b2; }

◆ set_gamma()

void smash::DeformedNucleus::set_gamma ( double  ga)
inline

Set the triaxiality coefficient gamma for Y_2_0 and Y_2_2.

Parameters
[in]gatriaxiality coefficient for l=2

Definition at line 142 of file deformednucleus.h.

142 { gamma_ = ga; }

◆ set_beta_3()

void smash::DeformedNucleus::set_beta_3 ( double  b3)
inline

Set deformation coefficient for Y_3_0.

Parameters
[in]b3deformation coefficient for l=3

Definition at line 147 of file deformednucleus.h.

147 { beta3_ = b3; }

◆ set_beta_4()

void smash::DeformedNucleus::set_beta_4 ( double  b4)
inline

Set deformation coefficient for Y_4_0.

Parameters
[in]b4deformation coefficient for l=4

Definition at line 152 of file deformednucleus.h.

152 { beta4_ = b4; }

◆ get_beta2()

double smash::DeformedNucleus::get_beta2 ( )
inline

return the beta2 value.

Definition at line 156 of file deformednucleus.h.

156 { return beta2_; }

◆ get_beta3()

double smash::DeformedNucleus::get_beta3 ( )
inline

return the beta3 value.

Definition at line 160 of file deformednucleus.h.

160 { return beta3_; }

◆ get_beta4()

double smash::DeformedNucleus::get_beta4 ( )
inline

return the beta4 value.

Definition at line 164 of file deformednucleus.h.

164 { return beta4_; }

Member Data Documentation

◆ beta2_

double smash::DeformedNucleus::beta2_ = 0.0
private

Deformation parameter for angular momentum l=2.

Definition at line 168 of file deformednucleus.h.

◆ gamma_

double smash::DeformedNucleus::gamma_ = 0.0
private

Triaxiality parameter for angular momentum l=2.

Definition at line 170 of file deformednucleus.h.

◆ beta3_

double smash::DeformedNucleus::beta3_ = 0.0
private

Deformation parameter for angular momentum l=3.

Definition at line 172 of file deformednucleus.h.

◆ beta4_

double smash::DeformedNucleus::beta4_ = 0.0
private

Deformation parameter for angular momentum l=4.

Definition at line 174 of file deformednucleus.h.


The documentation for this class was generated from the following files: