High-precision calculations for one- and two-valence atomic systems
Nuclear Namespace Reference

Detailed Description

Data and useful functions for nuclear properties and potentials. Radii all in Fermi (fm, e-15m) from Nuclear Data Service: https://www-nds.iaea.org/.

Classes

struct  Isotope
 Isotope data: Z, A, r_rms/fm, I, pi, mu, Q. More...
 
class  Nucleus
 Stores set of nuclear parameters (all radii in fm) More...
 

Enumerations

enum class  ChargeDistro {
  Fermi , spherical , point , Gaussian ,
  custom , Error
}
 Nuclear charge distribution options. More...
 

Functions

Isotope findIsotopeData (int z, int a)
 Looks up + returns an isotope from the list. If not in list, partially blank.
 
std::vector< Isotope > findIsotopeList (int z)
 Returns all known isotopes of given atom.
 
double find_rrms (int z, int a)
 Looks up default value of r_rms for given isotope. Returns 0 if not found.
 
double find_mu (int z, int a)
 As above, for dipole moment.
 
int find_parity (int z, int a)
 As above, for parity.
 
double find_spin (int z, int a)
 As above, for nuclear spin. Returns -1 if not found.
 
double approximate_r_rms (int a, int z)
 Approximate rms radius from a for to Angeli data.
 
double c_hdr_formula_rrms_t (double rrms, double t=default_t)
 Calculates c from rrms and t.
 
double rrms_formula_c_t (double c, double t=default_t)
 Calculates rrms from c and t.
 
double deformation_effective_t (double c, double t, double beta)
 Calculates effective skin thickness due to quadrupole deformation [See Eq. 8 of https://doi.org/10.1103/PhysRevA.100.032511.].
 
double approximate_t_skin (int a)
 just returns 2.3
 
ChargeDistro parseType (const std::string &str_type)
 Converts string to ChargeDistro (case-insensitive).
 
std::string parseType (ChargeDistro type)
 Converts ChargeDistro to string.
 
std::ostream & operator<< (std::ostream &ostr, const Nucleus &n)
 
Nucleus form_nucleus (int Z, std::optional< int > A=std::nullopt, IO::InputBlock input={})
 Forms nucleus from Z, A, and the nuclear options in input.
 
std::vector< double > sphericalNuclearPotential (double Z, double rnuc, const std::vector< double > &rgrid)
 Nuclear potential: uniformly charged sphere (ball) of radius rnuc.
 
std::vector< double > GaussianNuclearPotential (double Z, double r_rms, const std::vector< double > &rgrid)
 Nuclear potential: Gaussian charge distribution.
 
std::vector< double > fermiNuclearPotential (double Z, double t, double c, const std::vector< double > &rgrid)
 Nuclear potential: Fermi charge distribution.
 
std::vector< double > fermiNuclearDensity_tcN (double t, double c, double Z_norm, const Grid &grid)
 Fermi charge distribution, rho(r), normalised to Z_norm.
 
std::vector< double > formPotential (const Nucleus &nucleus, const std::vector< double > &r)
 Nuclear potential V(r) for given nucleus, at radial points r.
 

Variables

constexpr double default_t = 2.30
 
constexpr auto FourLn3 = 4.0 * 1.098612289
 
constexpr auto Pi2 = M_PI * M_PI
 

Class Documentation

◆ Nuclear::Isotope

struct Nuclear::Isotope
Class Members
int Z Atomic charge.
int A Atomic mass number (A = Z + N)
optional< double > r_rms {} root-mean-square charge radius, in Fermi (fm, e-15m)
optional< double > I_N {} Nuclear spin (in hbar)
optional< int > parity {}
optional< double > mu {} Magnetic dipole moment, in nuclear magnetons.
optional< double > q {} Magnetic quadrupole moment, in barns.

Enumeration Type Documentation

◆ ChargeDistro

enum class Nuclear::ChargeDistro
strong

Nuclear charge distribution options.

  • Fermi : two-parameter Fermi distribution (c and t)
  • spherical : uniformly charged sphere (ball)
  • point : point-like nucleus
  • Gaussian : Gaussian distribution
  • custom : potential read from file (see formPotential)
  • Error : unrecognised type (see parseType)

Function Documentation

◆ findIsotopeData()

Isotope Nuclear::findIsotopeData ( int  z,
int  a 
)

Looks up + returns an isotope from the list. If not in list, partially blank.

◆ findIsotopeList()

std::vector< Isotope > Nuclear::findIsotopeList ( int  z)

Returns all known isotopes of given atom.

◆ find_rrms()

double Nuclear::find_rrms ( int  z,
int  a 
)

Looks up default value of r_rms for given isotope. Returns 0 if not found.

◆ find_mu()

double Nuclear::find_mu ( int  z,
int  a 
)

As above, for dipole moment.

◆ find_parity()

int Nuclear::find_parity ( int  z,
int  a 
)

As above, for parity.

◆ find_spin()

double Nuclear::find_spin ( int  z,
int  a 
)

As above, for nuclear spin. Returns -1 if not found.

◆ approximate_r_rms()

double Nuclear::approximate_r_rms ( int  A,
int  Z 
)

Approximate rms radius from a for to Angeli data.

◆ c_hdr_formula_rrms_t()

double Nuclear::c_hdr_formula_rrms_t ( double  rrms,
double  t 
)

Calculates c from rrms and t.

◆ rrms_formula_c_t()

double Nuclear::rrms_formula_c_t ( double  c,
double  t 
)

Calculates rrms from c and t.

◆ deformation_effective_t()

double Nuclear::deformation_effective_t ( double  c,
double  t,
double  beta 
)

Calculates effective skin thickness due to quadrupole deformation [See Eq. 8 of https://doi.org/10.1103/PhysRevA.100.032511.].

◆ approximate_t_skin()

double Nuclear::approximate_t_skin ( int  )

just returns 2.3

◆ parseType() [1/2]

ChargeDistro Nuclear::parseType ( const std::string &  str_type)

Converts string to ChargeDistro (case-insensitive).

Also accepts: "spher*", "ball", "uniform" (spherical); "point*", "zero*" (point); "gaus*" (Gaussian). If unknown, prints a warning with the closest match.

Returns
ChargeDistro; ChargeDistro::Error if unknown.

◆ parseType() [2/2]

std::string Nuclear::parseType ( ChargeDistro  type)

Converts ChargeDistro to string.

◆ form_nucleus()

Nucleus Nuclear::form_nucleus ( int  Z,
std::optional< int >  A = std::nullopt,
IO::InputBlock  input = {} 
)

Forms nucleus from Z, A, and the nuclear options in input.

Starts from the default nucleus for given Z and A (see Nucleus), then over-rides with any options given in input: type, rrms, c, t, beta, input_file, parameters. If c is given, it over-rides rrms. If A or r_rms is zero, the nucleus is set to point-like (except for custom).

Parameters
ZNuclear charge
AMass number; default A for Z if not given
inputInput block with nuclear options (see input.check() in .cpp)
Note
input_file only sets the file name: type must also be custom.

◆ sphericalNuclearPotential()

std::vector< double > Nuclear::sphericalNuclearPotential ( double  Z,
double  rnuc,
const std::vector< double > &  rgrid 
)

Nuclear potential: uniformly charged sphere (ball) of radius rnuc.

\[ V(r) = \begin{cases} -\frac{Z}{2 r_N}\left(3 - r^2/r_N^2\right) & r < r_N, \\ -Z/r & r \geq r_N. \end{cases} \]

rnuc = 0 gives a point-like nucleus.

Parameters
ZNuclear charge
rnucNuclear charge radius, in fm (not r_rms: for a uniform sphere, r_N = sqrt(5/3) r_rms)
rgridRadial points (atomic units)
Returns
V(r) at each point of rgrid (atomic units).

◆ GaussianNuclearPotential()

std::vector< double > Nuclear::GaussianNuclearPotential ( double  Z,
double  r_rms,
const std::vector< double > &  rgrid 
)

Nuclear potential: Gaussian charge distribution.

\[ V(r) = -\frac{Z}{r}\,{\rm erf}\left(\sqrt{3/2}\;r/r_{\rm rms}\right). \]

Parameters
ZNuclear charge
r_rmsRoot-mean-square charge radius, in fm
rgridRadial points (atomic units)
Returns
V(r) at each point of rgrid (atomic units).

◆ fermiNuclearPotential()

std::vector< double > Nuclear::fermiNuclearPotential ( double  Z,
double  t,
double  c,
const std::vector< double > &  rgrid 
)

Nuclear potential: Fermi charge distribution.

For charge density

\[ \rho(r) = \rho_0 \left[ 1 + e^{(r - c)/a} \right]^{-1}, \qquad a = t/(4\ln 3), \]

normalised to Z. Expressed in terms of complete Fermi-Dirac integrals (GSL). V = -Z/r beyond r = 10c.

Parameters
ZNuclear charge
tSkin thickness (90% to 10% fall-off), in fm
cHalf-density radius, in fm (not r_rms)
rgridRadial points (atomic units)
Returns
V(r) at each point of rgrid (atomic units).

◆ fermiNuclearDensity_tcN()

std::vector< double > Nuclear::fermiNuclearDensity_tcN ( double  t,
double  c,
double  Z_norm,
const Grid &  grid 
)

Fermi charge distribution, rho(r), normalised to Z_norm.

\( \int \rho\, d^3r = 4\pi \int \rho(r)\, r^2 dr = Z_{\rm norm} \): Z_norm = Z for nuclear charge density; Z_norm = 1 for nuclear density. rho = 0 beyond r = 10c.

Parameters
tSkin thickness, in fm
cHalf-density radius, in fm
Z_normNormalisation
gridRadial grid
Returns
rho(r) on grid (atomic units).

◆ formPotential()

std::vector< double > Nuclear::formPotential ( const Nucleus &  nucleus,
const std::vector< double > &  r 
)

Nuclear potential V(r) for given nucleus, at radial points r.

Calls one of the above, depending on nucleus type. If r_rms = 0, point-like (-Z/r) for all types except custom.

  • Fermi: c from r_rms and t; if beta is non-zero, uses the effective skin thickness for the deformed nucleus (deformation_effective_t)
  • spherical: radius r_N = sqrt(5/3) r_rms
  • custom: reads {r, V(r)} (atomic units) from custom_pot_file(), and interpolates onto r. Beyond the last point, V = -Z_eff/r, with Z_eff from the last point. Not extrapolated to smaller r.
Returns
V(r) at each point of r (atomic units).
Warning
Aborts if the custom file is invalid (fewer than 3 points), or the type is invalid.