2#include "Physics/PhysConst_constants.hpp"
70 DiracSpinor(
int in_n,
int in_kappa, std::shared_ptr<const Grid> in_rgrid,
71 bool negative_energy =
false);
77 std::shared_ptr<const Grid> m_rgrid;
85 std::vector<double> m_f;
87 std::vector<double> m_g;
97 double m_occ_frac = 0.0;
103 std::size_t m_kappa_index;
104 Index m_nkappa_index;
107 bool m_exotic{
false};
109 bool m_negative_energy{
false};
113 int n()
const {
return m_n; }
115 int kappa()
const {
return m_kappa; }
117 int l()
const {
return m_l; }
119 double jjp1()
const {
return 0.25 * double(m_twoj * (m_twoj + 2)); }
121 int twoj()
const {
return m_twoj; }
123 int twojp1()
const {
return m_twoj + 1; }
127 std::size_t
k_index()
const {
return m_kappa_index; }
145 std::string
symbol(
bool gnuplot =
false)
const;
173 std::shared_ptr<const Grid>
grid_sptr()
const {
return m_rgrid; };
176 double en()
const {
return m_en; }
177 double &
en() {
return m_en; }
180 const std::vector<double> &
f()
const {
return m_f; }
181 std::vector<double> &
f() {
return m_f; }
183 double f(std::size_t i)
const {
return m_f.at(i); }
184 double &
f(std::size_t i) {
return m_f.at(i); }
187 const std::vector<double> &
g()
const {
return m_g; }
188 std::vector<double> &
g() {
return m_g; }
190 double g(std::size_t i)
const {
return m_g.at(i); }
191 double &
g(std::size_t i) {
return m_g.at(i); }
199 auto &
min_pt() {
return m_p0; }
203 auto &
max_pt() {
return m_pinf; }
215 auto its()
const {
return m_its; }
216 auto &
its() {
return m_its; }
220 auto &
occ_frac() {
return m_occ_frac; }
223 auto eps()
const {
return m_eps; }
224 auto &
eps() {
return m_eps; }
244 double norm2()
const;
262 int num_nodes(
double rel_cut = 1.0e-3)
const;
275 std::vector<double>
rho()
const;
335 return lhs.m_l < rhs.m_l;
339 return lhs.m_twoj < rhs.m_twoj;
343 return lhs.m_kappa_index < rhs.m_kappa_index;
347 return lhs.m_n < rhs.m_n;
351 return lhs.
en() < rhs.
en();
362 static std::pair<double, std::string>
364 const std::vector<DiracSpinor> &b);
395 const std::vector<DiracSpinor> &orbs);
400 const std::vector<DiracSpinor> &orbs);
418 enum class Branch { electron, positron, both };
430 static std::string
state_config(
const std::vector<DiracSpinor> &orbs,
431 Branch branch = Branch::both);
440 static std::string
config_string(
const std::vector<int> &n_per_l);
469 std::shared_ptr<const Grid> rgrid,
482 static std::vector<DiracSpinor>
494 static std::vector<DiracSpinor>
495 HlikeBasis(
const std::string &basis_string, std::shared_ptr<const Grid> rgrid,
500 const std::vector<DiracSpinor> &orbs);
503 static int max_tj(
const std::vector<DiracSpinor> &orbs);
505 static int max_l(
const std::vector<DiracSpinor> &orbs);
507 static int max_n(
const std::vector<DiracSpinor> &orbs);
509 static int max_n(
const std::vector<DiracSpinor> &orbs,
int kappa);
511 static std::size_t
max_kindex(
const std::vector<DiracSpinor> &orbs);
514 static double max_En(
const std::vector<DiracSpinor> &orbs);
516 static double min_En(
const std::vector<DiracSpinor> &orbs);
531 static std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
532 split_by_energy(
const std::vector<DiracSpinor> &orbitals,
double Fermi_energy,
533 int n_min_core = 1,
int n_max_excited = 9999,
534 bool include_negative_energy =
true);
545 static std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
547 const std::vector<DiracSpinor> &core,
int n_min_core = 1);
559 static std::vector<DiracSpinor>
subset(
const std::vector<DiracSpinor> &basis,
560 const std::string &subset_string,
561 bool exclude_negative_energy =
true);
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:55
static std::pair< std::vector< DiracSpinor >, std::vector< DiracSpinor > > split_by_energy(const std::vector< DiracSpinor > &orbitals, double Fermi_energy, int n_min_core=1, int n_max_excited=9999, bool include_negative_energy=true)
Splits orbitals into two groups (i.e., core, excited) by energy.
Definition DiracSpinor.cpp:606
std::pair< double, double > r0pinfratio() const
Returns [f[p0]/f_max , f[pinf-1]/f_max] - for tests; {0,0} if f = 0.
Definition DiracSpinor.cpp:113
void normalise(double norm_to=1.0)
By default normalises to 1, but can normalise to other number.
Definition DiracSpinor.cpp:98
static DiracSpinor orthonormaliseWrt(const DiracSpinor &Fin, const std::vector< DiracSpinor > &orbs)
As orthogonaliseWrt(), but normalises Fin afterwards.
Definition DiracSpinor.cpp:522
static int max_tj(const std::vector< DiracSpinor > &orbs)
Returns maximum (2j) found in {orbs}.
Definition DiracSpinor.cpp:354
int parity() const
(-1)^l, returns +/- 1
Definition DiracSpinor.hpp:125
double norm() const
Returns the norm, defined: Norm = Sqrt[<a|a>].
Definition DiracSpinor.cpp:72
friend bool operator<(const DiracSpinor &lhs, const DiracSpinor &rhs)
Ordering: compares n, then kappa (via kappa_index)
Definition DiracSpinor.cpp:279
friend DiracSpinor operator-(DiracSpinor lhs, const DiracSpinor &rhs)
Returns lhs - rhs; should generally have same kappa (see +=)
Definition DiracSpinor.cpp:233
uint16_t Index
Integer type for the compressed (n,kappa) index.
Definition DiracSpinor.hpp:73
static std::vector< DiracSpinor > subset(const std::vector< DiracSpinor > &basis, const std::string &subset_string, bool exclude_negative_energy=true)
Takes a subset of a basis (by copy), according to subset_string.
Definition DiracSpinor.cpp:652
static std::pair< double, std::string > check_ortho(const std::vector< DiracSpinor > &a, const std::vector< DiracSpinor > &b)
Returns worst |<a|b>| (or ||<a|b>|-1| for a=b) {val, state_names}.
Definition DiracSpinor.cpp:416
DiracSpinor & add_scaled(double x, const DiracSpinor &rhs)
Adds x*rhs to this, in place (no temporary); should generally have same kappa.
Definition DiracSpinor.cpp:237
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:202
static bool comp_j(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparator (for sorting): by 2j.
Definition DiracSpinor.hpp:338
static bool comp_n(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparator (for sorting): by n.
Definition DiracSpinor.hpp:346
Branch
Which energy branch of a set of orbitals state_config() describes.
Definition DiracSpinor.hpp:418
auto eps() const
Fractional energy convergence: eps = |(en'-en)/en|.
Definition DiracSpinor.hpp:223
static std::string config_string(const std::vector< int > &n_per_l)
Formats a list of numbers into the compressed states-string notation.
Definition DiracSpinor.cpp:336
const std::vector< double > & f() const
Upper (large) radial component function, f.
Definition DiracSpinor.hpp:180
bool negativeEnergyStateQ() const
Returns true if this is a negative-energy (Dirac sea) state.
Definition DiracSpinor.hpp:160
int num_nodes(double rel_cut=1.0e-3) const
Number of nodes (sign changes) in f(r).
Definition DiracSpinor.cpp:128
int twojp1() const
2j+1
Definition DiracSpinor.hpp:123
int kappa() const
Dirac quantum number, kappa.
Definition DiracSpinor.hpp:115
static std::pair< std::vector< DiracSpinor >, std::vector< DiracSpinor > > split_by_core(const std::vector< DiracSpinor > &orbitals, const std::vector< DiracSpinor > &core, int n_min_core=1)
Splits orbitals into two groups (i.e., core, excited)
Definition DiracSpinor.cpp:632
double norm2() const
Returns the norm^2, defined: Norm2 = <a|a>
Definition DiracSpinor.cpp:73
auto occ_frac() const
Occupation fraction. =1 for closed shells. =1/(2j+1) for valence.
Definition DiracSpinor.hpp:219
const Grid & grid() const
Returns a const reference to the radial grid.
Definition DiracSpinor.hpp:166
friend bool operator==(const DiracSpinor &lhs, const DiracSpinor &rhs)
Equality: true if {n,kappa} match.
Definition DiracSpinor.cpp:271
int n() const
Principal quantum number, n.
Definition DiracSpinor.hpp:113
friend bool operator<=(const DiracSpinor &lhs, const DiracSpinor &rhs)
Ordering: compares n, then kappa (via kappa_index)
Definition DiracSpinor.cpp:289
friend bool operator!=(const DiracSpinor &lhs, const DiracSpinor &rhs)
Inequality: true if {n,kappa} differ.
Definition DiracSpinor.cpp:275
static DiracSpinor orthogonaliseWrt(const DiracSpinor &Fin, const std::vector< DiracSpinor > &orbs)
Forces Fin to be orthogonal to orbs.
Definition DiracSpinor.cpp:505
std::shared_ptr< const Grid > grid_sptr() const
Returns copy of shared_ptr to grid [shared resource].
Definition DiracSpinor.hpp:173
static int max_l(const std::vector< DiracSpinor > &orbs)
Returns maximum l found in {orbs}.
Definition DiracSpinor.cpp:360
std::string symbol(bool gnuplot=false) const
Single-electron term symbol (e.g., 6s_1/2). Gnuplot=true => 6s_{1/2}.
Definition DiracSpinor.cpp:36
static DiracSpinor exactHlike_cntm(double en, int k, std::shared_ptr< const Grid > rgrid, double zeff, double alpha=PhysConst::alpha, double mass=1.0)
Constructs an exact (Dirac-Coulomb) continuum DiracSpinor.
Definition DiracSpinor.cpp:543
static double min_En(const std::vector< DiracSpinor > &orbs)
Returns minimum Energy found in {orbs}.
Definition DiracSpinor.cpp:408
DiracSpinor & operator*=(const double x)
Scales this by scalar x, in place.
Definition DiracSpinor.cpp:252
static int max_n(const std::vector< DiracSpinor > &orbs)
Returns maximum n found in {orbs}.
Definition DiracSpinor.cpp:365
static bool comp_ki(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparator (for sorting): by kappa_index.
Definition DiracSpinor.hpp:342
friend bool operator>=(const DiracSpinor &lhs, const DiracSpinor &rhs)
Ordering: compares n, then kappa (via kappa_index)
Definition DiracSpinor.cpp:293
friend DiracSpinor operator+(DiracSpinor lhs, const DiracSpinor &rhs)
Returns lhs + rhs; should generally have same kappa (see +=)
Definition DiracSpinor.cpp:230
double en() const
Single-particle energy, not including rest energy.
Definition DiracSpinor.hpp:176
static DiracSpinor exactHlike(int n, int k, std::shared_ptr< const Grid > rgrid, double zeff, double alpha=PhysConst::alpha, double mass=1.0)
Constructs an exact H-like (pointlike Coulomb) DiracSpinor.
Definition DiracSpinor.cpp:530
Index nk_index() const
(n,kappa) index
Definition DiracSpinor.hpp:143
void zero_boundaries()
Forces f(r) and g(r) to be zero outside of [p0,pinf)
Definition DiracSpinor.cpp:101
static const DiracSpinor * find(int n, int k, const std::vector< DiracSpinor > &orbs)
Searches for {n,k} in list of orbitals, returns pointer (may be null)
Definition DiracSpinor.cpp:389
static std::string state_config(const std::vector< DiracSpinor > &orbs, Branch branch=Branch::both)
Returns formatted states string (e.g., '7sp5d') given list of orbs.
Definition DiracSpinor.cpp:298
double f(std::size_t i) const
Upper (large) radial component, f(r_i)
Definition DiracSpinor.hpp:183
static std::size_t max_kindex(const std::vector< DiracSpinor > &orbs)
Returns maximum kappa_index found in {orbs}.
Definition DiracSpinor.cpp:382
double r0() const
r0 = r[min_pt] (in atomic units)
Definition DiracSpinor.cpp:183
double g(std::size_t i) const
Lower (small) radial component, g(r_i)
Definition DiracSpinor.hpp:190
friend bool operator>(const DiracSpinor &lhs, const DiracSpinor &rhs)
Ordering: compares n, then kappa (via kappa_index)
Definition DiracSpinor.cpp:285
void orthog(const DiracSpinor &rhs)
A more correct way to force orthogonality than normal.
Definition DiracSpinor.cpp:437
double jjp1() const
j(j+1)
Definition DiracSpinor.hpp:119
std::string shortSymbol() const
e.g., 6p_1/2 => 6p-, 6p_3/2 => 6p+
Definition DiracSpinor.cpp:49
static bool comp_l(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparator (for sorting): by l.
Definition DiracSpinor.hpp:334
static std::vector< DiracSpinor > HlikeBasis(int max_l, int num_ns, std::shared_ptr< const Grid > rgrid, double zeff, double alpha=PhysConst::alpha, double mass=1.0)
Constructs a basis of H-like (pointlike) DiracSpinors.
Definition DiracSpinor.cpp:570
bool & exotic()
Checks if spinor is for "exotic" lepton, or regular electron.
Definition DiracSpinor.hpp:150
auto min_pt() const
First non-zero point (index for f[i])
Definition DiracSpinor.hpp:198
static void orthonormaliseOrbitals(std::vector< DiracSpinor > &orbs, int num_its=1)
(approximately) OrthoNormalises a set of any orbitals
Definition DiracSpinor.cpp:450
static double max_En(const std::vector< DiracSpinor > &orbs)
Returns maximum Energy found in {orbs}.
Definition DiracSpinor.cpp:402
int num_electrons() const
Number of occupied electrons: (2j+1)*occ_frac, rounded to an integer.
Definition DiracSpinor.cpp:178
friend std::ostream & operator<<(std::ostream &ostr, const DiracSpinor &Fa)
Writes short symbol to ostream.
Definition DiracSpinor.hpp:355
const DiracSpinor & scale(const double factor)
Scales DiracSpinor (f and g) by constant.
Definition DiracSpinor.cpp:76
int twoj() const
2j (twice the total angular momentum)
Definition DiracSpinor.hpp:121
DiracSpinor & operator-=(const DiracSpinor &rhs)
Subtracts rhs from this, in place; should generally have same kappa (see +=)
Definition DiracSpinor.cpp:214
int l() const
Orbital angular momentum Q number.
Definition DiracSpinor.hpp:117
DiracSpinor & operator+=(const DiracSpinor &rhs)
Adds rhs to this, in place (should generally have same kappa, but forced)
Definition DiracSpinor.cpp:200
friend double operator*(const DiracSpinor &Fa, const DiracSpinor &Fb)
Returns radial integral (Fa,Fb) = Int(fa*fb + ga*gb)
Definition DiracSpinor.cpp:190
bool exotic() const
Checks if spinor is for "exotic" lepton, or regular electron.
Definition DiracSpinor.hpp:152
void set_new_kappa(int new_kappa)
Changes 'kappa' angular quantum number. Use with caution!
Definition DiracSpinor.cpp:62
std::size_t k_index() const
kappa index (see Angular::kappa_to_kindex)
Definition DiracSpinor.hpp:127
double rinf() const
rinf = r[max_pt - 1], the last point of the spinor (au); 0 if max_pt = 0
Definition DiracSpinor.cpp:184
std::vector< double > rho() const
Radial density: rho(r) = (2j+1) * x_occ * |F^2|(r)
Definition DiracSpinor.cpp:167
auto its() const
Number of iterations until energy convergence (for latest routine only)
Definition DiracSpinor.hpp:215
static bool comp_en(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparator (for sorting): by energy.
Definition DiracSpinor.hpp:350
const std::vector< double > & g() const
Lower (small) radial component function, g.
Definition DiracSpinor.hpp:187
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
constexpr double alpha
Fine-structure constant: alpha = 1/137.035 999 177(21) [CODATA 2022].
Definition PhysConst_constants.hpp:24