Version: SMASH-2.0
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 36 of file deformednucleus.h.

Inheritance diagram for smash::DeformedNucleus:
[legend]
Collaboration diagram for smash::DeformedNucleus:
[legend]

Public Member Functions

 DeformedNucleus (const std::map< PdgCode, int > &particle_list, int nTest)
 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...
 
void set_orientation_from_config (Configuration &orientation_config)
 Set angles for orientation of nucleus from config file. More...
 
void rotate () override
 Rotates the nucleus according to members nucleus_polar_angle_ and nucleus_azimuthal_angle_ and updates nucleon positions. More...
 
double nucleon_density (double r, double cosx) const override
 Return the deformed Woods-Saxon probability density for the given position. More...
 
void set_beta_2 (double b2)
 Set deformation coefficient for Y_2_0. More...
 
void set_beta_4 (double b4)
 Set deformation coefficient for Y_4_0. More...
 
void set_polar_angle (double theta)
 Set the nucleus polar angle. More...
 
void set_azimuthal_angle (double phi)
 Set the nucleus azimuthal angle. More...
 
double get_beta2 ()
 return the beta2 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)
 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 set_parameters_from_config (Configuration &config)
 Sets the parameters of the Woods-Saxon according to manually added values in the configuration file. 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...
 
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 align_center ()
 Shifts the nucleus so that its center is at (0,0,0) 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
 
void set_saturation_density (double density)
 Sets the saturation density of the nucleus. More...
 
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
 

Private Attributes

double beta2_ = 0.0
 Deformation parameter for angular momentum l=2. More...
 
double beta4_ = 0.0
 Deformation parameter for angular momentum l=4. More...
 
Angles nuclear_orientation_
 Nucleus orientation (initial profile in xz plane) in terms of a pair of angles (theta, phi) More...
 
bool random_rotation_ = false
 Whether the nuclei should be rotated randomly. 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 euler_phi_
 Euler angel phi. More...
 
double euler_theta_
 Euler angel theta. More...
 
double euler_psi_
 Euler angel psi. More...
 

Constructor & Destructor Documentation

◆ DeformedNucleus() [1/2]

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

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


Example: Configuring a deformed nucleus
To configure a fixed target heavy-ion collision with deformed nuclei, whose spherical deformation is explicitly declared, it can be done according to the following example. For explanatory (and not physics) reasons, the projectile's Woods Saxon distribution is initialized automatically and its spherical deformation manually, while the target nucleus is configured just the opposite.

Modi:
    Collider:
        Projectile:
            Particles:    {2212: 29, 2112: 34}
            Deformed:
                # Manually set deformation parameters
                Automatic: False
                Beta_2: 0.1
                Beta_4: 0.3
                Orientation:
                    Theta: 0.8
                    Phi: 0.02
        Target:
            Particles:    {2212: 29, 2112: 34}
            # manually set woods saxon parameters
            Saturation_Density: 0.1968
            Diffusiveness: 0.8
            Radius: 2.0
            Deformed:
                # Automatically set deformation parameters
                Automatic: True
                Orientation:
                    # Randomly rotate nucleus
                    Random_Rotation: True
        E_kin: 1.2
        Calculation_Frame: "fixed target"

Definition at line 106 of file deformednucleus.cc.

108  : Nucleus(particle_list, nTest) {}

◆ 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 110 of file deformednucleus.cc.

112  : Nucleus(config, nTest) {
113  if (auto_deformation) {
115  } else {
117  }
118 
119  if (config.has_value({"Deformed", "Orientation"})) {
120  Configuration subconfig = config["Deformed"]["Orientation"];
121  set_orientation_from_config(subconfig);
122  }
123 }
Here is the call graph for this function:

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 125 of file deformednucleus.cc.

125  {
126  double a_radius;
127  Angles a_direction;
128  // Set a sensible maximum bound for radial sampling.
129  double radius_max =
132 
133  // Sample the distribution.
134  do {
135  a_direction.distribute_isotropically();
136  // sample r**2 dr
137  a_radius = radius_max * std::cbrt(random::canonical());
138  } while (random::canonical() >
139  nucleon_density(a_radius, a_direction.costheta()) /
141 
142  // Update (x, y, z) positions.
143  return a_direction.threevec() * a_radius;
144 }
Here is the call graph for this function:

◆ 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 [33]. Corrections to the deformation parameter beta2 in Uranium come from Kuhlman:2005ts [27]. For finite nucleon size corrections to the nuclear density and radius for copper and gold, see Hirano:2009ah [21], and Hirano:2010jg [23] for uranium.

Definition at line 146 of file deformednucleus.cc.

146  {
147  // Set the deformation parameters
148  // reference for U, Pb, Au, Cu: \iref{Moller:1993ed}
149  // reference for Zr and Ru: \iref{Schenke:2019ruo}
150  bool listed = 0;
151  const std::map<int, std::string> A_map = {
152  {238, "Uranium"}, {208, "Lead"}, {197, "Gold"}, {63, "Copper"}};
153  const std::map<std::string, std::string> Z_map = {
154  {"Uranium", "92"}, {"Lead", "82"}, {"Gold", "79"}, {"Copper", "29"}};
156  int Z = Nucleus::number_of_protons();
157  switch (A) {
158  case 238: // Uranium
159  if (Z == 92) {
160  set_beta_2(0.28);
161  set_beta_4(0.093);
162  } else {
163  listed = true;
164  }
165  break;
166  case 208: // Lead
167  if (Z == 82) {
168  set_beta_2(0.0);
169  set_beta_4(0.0);
170  } else {
171  listed = true;
172  }
173  break;
174  case 197: // Gold
175  if (Z == 79) {
176  set_beta_2(-0.131);
177  set_beta_4(-0.031);
178  } else {
179  listed = true;
180  }
181  break;
182  case 63: // Copper
183  if (Z == 29) {
184  set_beta_2(0.162);
185  set_beta_4(-0.006);
186  } else {
187  listed = true;
188  }
189  break;
190  case 96:
191  if (Z == 40) { // Zirconium
192  set_beta_2(0.0);
193  set_beta_4(0.0);
194  } else if (Z == 44) { // Ruthenium
195  set_beta_2(0.158);
196  set_beta_4(0.0);
197  } else {
198  throw std::domain_error(
199  "Number of protons for nuclei with mass number A = 96 does not "
200  "match that of Zirconium or Ruthenium. The deformation parameters "
201  "for additional isobars are currently not implemented."
202  " Please specify at least \"Beta_2\" and \"Beta_4\" "
203  "manually and set \"Automatic: False.\" ");
204  }
205  break;
206  default:
207  throw std::domain_error(
208  "Mass number not listed for automatically setting deformation "
209  "parameters. Please specify at least \"Beta_2\" and \"Beta_4\" "
210  "manually and set \"Automatic: False.\" ");
211  }
212  if (listed) {
213  throw std::domain_error("Mass number is listed under " + A_map.at(A) +
214  " but the proton "
215  "number of " +
216  std::to_string(Z) +
217  " does not match "
218  "its " +
219  Z_map.at(A_map.at(A)) +
220  " protons."
221  "Please specify at least \"Beta_2\" and \"Beta_4\" "
222  "manually and set \"Automatic: False.\" ");
223  }
224 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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 226 of file deformednucleus.cc.

227  {
228  // Deformation parameters.
229  if (config.has_value({"Deformed", "Beta_2"})) {
230  set_beta_2(static_cast<double>(config.take({"Deformed", "Beta_2"})));
231  }
232  if (config.has_value({"Deformed", "Beta_4"})) {
233  set_beta_4(static_cast<double>(config.take({"Deformed", "Beta_4"})));
234  }
235 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_orientation_from_config()

void smash::DeformedNucleus::set_orientation_from_config ( Configuration orientation_config)

Set angles for orientation of nucleus from config file.

Parameters
[in]orientation_configThe configuration for the deformation of this nucleus (projectile or target).

Definition at line 237 of file deformednucleus.cc.

238  {
239  // Read in orientation if provided, otherwise, the defaults are
240  // theta = pi/2, phi = 0, as declared in the angles class
241 
242  if (orientation_config.has_value({"Theta"})) {
243  if (orientation_config.has_value({"Random_Rotation"}) &&
244  orientation_config.take({"Random_Rotation"})) {
245  throw std::domain_error(
246  "Random rotation of nuclei is activated although"
247  " theta is provided. Please specify only either of them. ");
248  } else {
249  set_polar_angle(static_cast<double>(orientation_config.take({"Theta"})));
250  }
251  }
252 
253  if (orientation_config.has_value({"Phi"})) {
254  if (orientation_config.has_value({"Random_Rotation"}) &&
255  orientation_config.take({"Random_Rotation"})) {
256  throw std::domain_error(
257  "Random rotation of nuclei is activated although"
258  " phi is provided. Please specify only either of them. ");
259  } else {
261  static_cast<double>(orientation_config.take({"Phi"})));
262  }
263  }
264 
265  if (orientation_config.take({"Random_Rotation"}, false)) {
266  random_rotation_ = true;
267  }
268 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rotate()

void smash::DeformedNucleus::rotate ( )
overridevirtual

Rotates the nucleus according to members nucleus_polar_angle_ and nucleus_azimuthal_angle_ and updates nucleon positions.

Reimplemented from smash::Nucleus.

Definition at line 270 of file deformednucleus.cc.

270  {
271  if (random_rotation_) {
272  // Randomly generate euler angles for theta and phi. Psi needs not be
273  // assigned, as the nucleus objects are symmetric with respect to psi.
277  }
278  for (auto &particle : *this) {
279  /* Rotate every vector by the nuclear azimuth phi and polar angle
280  * theta (the Euler angles). This means applying the matrix for a
281  * rotation of phi about z, followed by the matrix for a rotation
282  * theta about the rotated x axis. The third angle psi is 0 by symmetry.*/
283  ThreeVector three_pos = particle.position().threevec();
284  three_pos.rotate(nuclear_orientation_.phi(), nuclear_orientation_.theta(),
285  0.);
286  particle.set_3position(three_pos);
287  }
288 }
Here is the call graph for this function:

◆ nucleon_density()

double smash::DeformedNucleus::nucleon_density ( double  r,
double  cosx 
) 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
Returns
The Woods-Saxon density

Reimplemented from smash::Nucleus.

Definition at line 302 of file deformednucleus.cc.

302  {
304  (1 + std::exp((r - Nucleus::get_nuclear_radius() *
305  (1 + beta2_ * y_l_0(2, cosx) +
306  beta4_ * y_l_0(4, cosx))) /
308 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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 110 of file deformednucleus.h.

110 { beta2_ = b2; }
Here is the caller graph for this function:

◆ 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 115 of file deformednucleus.h.

115 { beta4_ = b4; }
Here is the caller graph for this function:

◆ set_polar_angle()

void smash::DeformedNucleus::set_polar_angle ( double  theta)
inline

Set the nucleus polar angle.

Parameters
[in]thetaPolar angle of position inside nucleus

Definition at line 120 of file deformednucleus.h.

120  {
122  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_azimuthal_angle()

void smash::DeformedNucleus::set_azimuthal_angle ( double  phi)
inline

Set the nucleus azimuthal angle.

Parameters
[in]phiAzimuthal angle of position inside nucleus

Definition at line 127 of file deformednucleus.h.

127  {
129  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_beta2()

double smash::DeformedNucleus::get_beta2 ( )
inline

return the beta2 value.

Definition at line 133 of file deformednucleus.h.

133 { return beta2_; }

◆ get_beta4()

double smash::DeformedNucleus::get_beta4 ( )
inline

return the beta4 value.

Definition at line 137 of file deformednucleus.h.

137 { return beta4_; }

Member Data Documentation

◆ beta2_

double smash::DeformedNucleus::beta2_ = 0.0
private

Deformation parameter for angular momentum l=2.

Definition at line 141 of file deformednucleus.h.

◆ beta4_

double smash::DeformedNucleus::beta4_ = 0.0
private

Deformation parameter for angular momentum l=4.

Definition at line 143 of file deformednucleus.h.

◆ nuclear_orientation_

Angles smash::DeformedNucleus::nuclear_orientation_
private

Nucleus orientation (initial profile in xz plane) in terms of a pair of angles (theta, phi)

Definition at line 148 of file deformednucleus.h.

◆ random_rotation_

bool smash::DeformedNucleus::random_rotation_ = false
private

Whether the nuclei should be rotated randomly.

Definition at line 152 of file deformednucleus.h.


The documentation for this class was generated from the following files:
smash::Nucleus::random_euler_angles
void random_euler_angles()
Randomly generate Euler angles.
Definition: nucleus.cc:497
smash::DeformedNucleus::beta2_
double beta2_
Deformation parameter for angular momentum l=2.
Definition: deformednucleus.h:141
smash::Nucleus::Nucleus
Nucleus()=default
default constructor
smash::DeformedNucleus::set_beta_4
void set_beta_4(double b4)
Set deformation coefficient for Y_4_0.
Definition: deformednucleus.h:115
smash::Angles::phi
double phi() const
Definition: angles.h:260
smash::Nucleus::number_of_protons
size_t number_of_protons() const
Number of physical protons in the nucleus:
Definition: nucleus.h:183
smash::Nucleus::get_diffusiveness
double get_diffusiveness() const
Definition: nucleus.h:295
smash::Angles::set_phi
void set_phi(const double phi)
Sets the azimuthal angle.
Definition: angles.h:194
smash::DeformedNucleus::nuclear_orientation_
Angles nuclear_orientation_
Nucleus orientation (initial profile in xz plane) in terms of a pair of angles (theta,...
Definition: deformednucleus.h:148
smash::DeformedNucleus::beta4_
double beta4_
Deformation parameter for angular momentum l=4.
Definition: deformednucleus.h:143
smash::Nucleus::get_saturation_density
double get_saturation_density() const
Definition: nucleus.h:307
smash::Nucleus::euler_theta_
double euler_theta_
Euler angel theta.
Definition: nucleus.h:267
smash::Angles::set_theta
void set_theta(const double theta)
Set the polar angle.
Definition: angles.h:218
smash::Nucleus::number_of_particles
size_t number_of_particles() const
Number of physical particles in the nucleus:
Definition: nucleus.h:164
smash::DeformedNucleus::nucleon_density
double nucleon_density(double r, double cosx) const override
Return the deformed Woods-Saxon probability density for the given position.
Definition: deformednucleus.cc:302
smash::DeformedNucleus::set_beta_2
void set_beta_2(double b2)
Set deformation coefficient for Y_2_0.
Definition: deformednucleus.h:110
smash::y_l_0
double y_l_0(int l, double cosx)
Spherical harmonics Y_2_0 and Y_4_0.
Definition: deformednucleus.cc:290
smash::DeformedNucleus::set_orientation_from_config
void set_orientation_from_config(Configuration &orientation_config)
Set angles for orientation of nucleus from config file.
Definition: deformednucleus.cc:237
smash::DeformedNucleus::set_azimuthal_angle
void set_azimuthal_angle(double phi)
Set the nucleus azimuthal angle.
Definition: deformednucleus.h:127
smash::Nucleus::euler_phi_
double euler_phi_
Euler angel phi.
Definition: nucleus.h:265
smash::DeformedNucleus::set_deformation_parameters_from_config
void set_deformation_parameters_from_config(Configuration &config)
Set parameters for spherical deformation of the nucleus from the values specified in the configuratio...
Definition: deformednucleus.cc:226
smash::Nucleus::get_nuclear_radius
double get_nuclear_radius() const
Definition: nucleus.h:335
smash::Angles::theta
double theta() const
Definition: angles.h:272
smash::DeformedNucleus::set_polar_angle
void set_polar_angle(double theta)
Set the nucleus polar angle.
Definition: deformednucleus.h:120
smash::random::canonical
T canonical()
Definition: random.h:113
smash::DeformedNucleus::random_rotation_
bool random_rotation_
Whether the nuclei should be rotated randomly.
Definition: deformednucleus.h:152
smash::DeformedNucleus::set_deformation_parameters_automatic
void set_deformation_parameters_automatic()
Sets the deformation parameters of the radius according to the current mass number.
Definition: deformednucleus.cc:146