47 DiracSpinor(
int in_n,
int in_kappa, std::shared_ptr<const Grid> in_rgrid);
48 using Index = uint16_t;
52 std::shared_ptr<const Grid> m_rgrid;
60 std::vector<double> m_f;
62 std::vector<double> m_g;
72 double m_occ_frac = 0.0;
78 std::size_t m_kappa_index;
86 int n()
const {
return m_n; }
88 int kappa()
const {
return m_kappa; }
90 int l()
const {
return m_l; }
92 double jjp1()
const {
return 0.25 * double(m_twoj * (m_twoj + 2)); }
93 int twoj()
const {
return m_twoj; }
95 int twojp1()
const {
return m_twoj + 1; }
97 int parity()
const {
return m_parity; }
99 std::size_t
k_index()
const {
return m_kappa_index; }
103 std::string
symbol(
bool gnuplot =
false)
const;
119 std::shared_ptr<const Grid>
grid_sptr()
const {
return m_rgrid; };
122 double en()
const {
return m_en; }
123 double &
en() {
return m_en; }
126 const std::vector<double> &
f()
const {
return m_f; }
127 std::vector<double> &
f() {
return m_f; }
129 double f(std::size_t i)
const {
return m_f.at(i); }
130 double &
f(std::size_t i) {
return m_f.at(i); }
133 const std::vector<double> &
g()
const {
return m_g; }
134 std::vector<double> &
g() {
return m_g; }
136 double g(std::size_t i)
const {
return m_g.at(i); }
137 double &
g(std::size_t i) {
return m_g.at(i); }
142 auto &
min_pt() {
return m_p0; }
146 auto &
max_pt() {
return m_pinf; }
154 auto its()
const {
return m_its; }
155 auto &
its() {
return m_its; }
159 auto &
occ_frac() {
return m_occ_frac; }
162 auto eps()
const {
return m_eps; }
163 auto &
eps() {
return m_eps; }
177 double norm2()
const;
183 std::vector<double>
rho()
const;
219 return lhs.m_l < rhs.m_l;
222 return lhs.m_twoj < rhs.m_twoj;
225 return lhs.m_kappa_index < rhs.m_kappa_index;
228 return lhs.m_n < rhs.m_n;
231 return lhs.
en() < rhs.
en();
242 static std::pair<double, std::string>
244 const std::vector<DiracSpinor> &b);
254 const std::vector<DiracSpinor> &orbs);
259 const std::vector<DiracSpinor> &orbs);
268 static std::string
state_config(
const std::vector<DiracSpinor> &orbs);
272 double zeff,
double alpha = 0.0);
276 const std::vector<DiracSpinor> &orbs);
279 static int max_tj(
const std::vector<DiracSpinor> &orbs);
281 static int max_l(
const std::vector<DiracSpinor> &orbs);
283 static int max_n(
const std::vector<DiracSpinor> &orbs);
285 static int max_n(
const std::vector<DiracSpinor> &orbs,
int kappa);
287 static std::size_t
max_kindex(
const std::vector<DiracSpinor> &orbs);
290 static double max_En(
const std::vector<DiracSpinor> &orbs);
292 static double min_En(
const std::vector<DiracSpinor> &orbs);
300 static std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
301 split_by_energy(
const std::vector<DiracSpinor> &orbitals,
double Fermi_energy,
302 int n_min_core = 1,
int n_max_excited = 9999,
303 bool positrons_are_excited =
true);
311 static std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
313 const std::vector<DiracSpinor> &core,
int n_min_core = 1);
318 static std::vector<DiracSpinor>
subset(
const std::vector<DiracSpinor> &basis,
319 const std::string &subset_string);
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
std::pair< double, double > r0pinfratio() const
Returns [f[p0]/f_max , f[pinf]/f_max] - for tests.
Definition DiracSpinor.cpp:106
void normalise(double norm_to=1.0)
By default normalises to 1, but can normalise to other number.
Definition DiracSpinor.cpp:91
static DiracSpinor orthonormaliseWrt(const DiracSpinor &Fin, const std::vector< DiracSpinor > &orbs)
As orthogonaliseWrt(), but normalises Fin afterwards.
Definition DiracSpinor.cpp:434
static int max_tj(const std::vector< DiracSpinor > &orbs)
Returns maximum (2j) found in {orbs}.
Definition DiracSpinor.cpp:266
int parity() const
(-1)^l, returns +/- 1
Definition DiracSpinor.hpp:97
double norm() const
Returns the norm, defined: Norm = Sqrt[<a|a>].
Definition DiracSpinor.cpp:65
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 positrons_are_excited=true)
Splits orbitals into two groups (i.e., core, excited) by energy.
Definition DiracSpinor.cpp:461
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:328
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:145
auto eps() const
Fractional energy convergence: eps = |(en'-en)/en|.
Definition DiracSpinor.hpp:162
const std::vector< double > & f() const
Upper (large) radial component function, f.
Definition DiracSpinor.hpp:126
int twojp1() const
2j+1
Definition DiracSpinor.hpp:95
int kappa() const
Dirac quantum number, kappa.
Definition DiracSpinor.hpp:88
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:487
double norm2() const
Returns the norm^2, defined: Norm2 = <a|a>
Definition DiracSpinor.cpp:66
auto occ_frac() const
Occupation fraction. =1 for closed shells. =1/(2j+1) for valence.
Definition DiracSpinor.hpp:158
const Grid & grid() const
Resturns a const reference to the radial grid.
Definition DiracSpinor.hpp:116
friend bool operator==(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparitor overloads (compares n, then kappa):
Definition DiracSpinor.cpp:206
int n() const
Principal quantum number, n.
Definition DiracSpinor.hpp:86
static DiracSpinor orthogonaliseWrt(const DiracSpinor &Fin, const std::vector< DiracSpinor > &orbs)
Forces Fin to be orthogonal to orbs. If Fn (i.e., {n,k}) in in orbs, replaces Fin with that from orbs...
Definition DiracSpinor.cpp:417
std::shared_ptr< const Grid > grid_sptr() const
Resturns copy of shared_ptr to grid [shared resource] - used when we want to construct a new DiracSpi...
Definition DiracSpinor.hpp:119
static int max_l(const std::vector< DiracSpinor > &orbs)
Returns maximum l found in {orbs}.
Definition DiracSpinor.cpp:272
std::string symbol(bool gnuplot=false) const
Single-electron term symbol (e.g., 6s_1/2). Gnuplot=true => 6s_{1/2}.
Definition DiracSpinor.cpp:32
static double min_En(const std::vector< DiracSpinor > &orbs)
Returns maximum Energy found in {orbs}.
Definition DiracSpinor.cpp:320
DiracSpinor & operator*=(const double x)
Scalar multiplication.
Definition DiracSpinor.cpp:187
static int max_n(const std::vector< DiracSpinor > &orbs)
Returns maximum n found in {orbs}.
Definition DiracSpinor.cpp:277
double en() const
Single-particle energy, not including rest energy.
Definition DiracSpinor.hpp:122
Index nk_index() const
(n,kappa) index (see AtomData)
Definition DiracSpinor.hpp:101
void zero_boundaries()
Forces f(r) and g(r) to be zero outside of [p0,pinf)
Definition DiracSpinor.cpp:94
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:301
double f(std::size_t i) const
Upper (large) radial component, f(r_i)
Definition DiracSpinor.hpp:129
static std::size_t max_kindex(const std::vector< DiracSpinor > &orbs)
Returns maximum kappa_index found in {orbs}.
Definition DiracSpinor.cpp:294
double r0() const
r0 = r[min_pt] (in atomic units) XXX Kill this?
Definition DiracSpinor.cpp:135
double g(std::size_t i) const
Lower (small) radial component, g(r_i)
Definition DiracSpinor.hpp:136
void orthog(const DiracSpinor &rhs)
A more correct way to force orthogonality than normal.
Definition DiracSpinor.cpp:349
static std::vector< DiracSpinor > subset(const std::vector< DiracSpinor > &basis, const std::string &subset_string)
Takes a subset of an input basis (by copy), according to subset_string.
Definition DiracSpinor.cpp:507
double jjp1() const
j(j+1)
Definition DiracSpinor.hpp:92
std::string shortSymbol() const
e.g., 6p_1/2 => 6p-, 6p_3/2 => 6p+
Definition DiracSpinor.cpp:43
static DiracSpinor exactHlike(int n, int k, std::shared_ptr< const Grid > rgrid, double zeff, double alpha=0.0)
Constructs H-like (pointlike) DiracSpinor - mainly for testing.
Definition DiracSpinor.cpp:442
static bool comp_l(const DiracSpinor &lhs, const DiracSpinor &rhs)
Custom comparitors (for sorting): l, j, kappa_index, energy.
Definition DiracSpinor.hpp:218
bool & exotic()
Checks if spinor is for "exotic" lepton, or regular electron.
Definition DiracSpinor.hpp:108
auto min_pt() const
First non-zero point (index for f[i])
Definition DiracSpinor.hpp:141
static void orthonormaliseOrbitals(std::vector< DiracSpinor > &orbs, int num_its=1)
(approximately) OrthoNormalises a set of any orbitals.
Definition DiracSpinor.cpp:362
static double max_En(const std::vector< DiracSpinor > &orbs)
Returns maximum Energy found in {orbs}.
Definition DiracSpinor.cpp:314
int num_electrons() const
Number of occupied electrons: (2j+1)*occ_frac.
Definition DiracSpinor.cpp:130
friend std::ostream & operator<<(std::ostream &ostr, const DiracSpinor &Fa)
Writes short symbol to ostream.
Definition DiracSpinor.hpp:235
const DiracSpinor & scale(const double factor)
Scales DiracSpinor (f and g) by constant.
Definition DiracSpinor.cpp:69
int l() const
Orbital angular momentum Q number.
Definition DiracSpinor.hpp:90
DiracSpinor & operator+=(const DiracSpinor &rhs)
Addition of two DiracSpinors - must have same kappa.
Definition DiracSpinor.cpp:150
friend double operator*(const DiracSpinor &Fa, const DiracSpinor &Fb)
Returns radial integral (Fa,Fb) = Int(fa*fb + ga*gb)
Definition DiracSpinor.cpp:140
bool exotic() const
Checks if spinor is for "exotic" lepton, or regular electron.
Definition DiracSpinor.hpp:110
void set_new_kappa(int new_kappa)
Changes 'kappa' angular quantum number. Use with caution!
Definition DiracSpinor.cpp:55
std::size_t k_index() const
kappa index (see AtomData)
Definition DiracSpinor.hpp:99
double rinf() const
rinf = r[max_pt]
Definition DiracSpinor.cpp:136
std::vector< double > rho() const
rho(r) = sum_m |Psi^2|(r) = (2j+1) * x_occ * |F^2|(r)
Definition DiracSpinor.cpp:119
auto its() const
Number of iterations until energy convergence (for latest routine only)
Definition DiracSpinor.hpp:154
static std::string state_config(const std::vector< DiracSpinor > &orbs)
Returns formatted states string (e.g., '7sp5d') given list of orbs.
Definition DiracSpinor.cpp:233
const std::vector< double > & g() const
Lower (small) radial component function, g.
Definition DiracSpinor.hpp:133
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31