High-precision calculations for one- and two-valence atomic systems
DiracSpinor.hpp
1#pragma once
2#include <cstdint>
3#include <memory>
4#include <string>
5#include <utility>
6#include <vector>
7class Grid;
8
9/*!
10@brief Stores radial Dirac spinor: F_nk = (f, g)
11@details
12\f[
13\psi_{n\kappa m} = \frac{1}{r}
14\begin{pmatrix}
15 f_{n\kappa}(r)\,\Omega_{\kappa m}\\
16 g_{n\kappa}(r)\,\Omega_{-\kappa m}
17\end{pmatrix},
18\quad
19F_{n\kappa} =
20\begin{pmatrix}
21 f_{n\kappa}(r)\\
22 g_{n\kappa}(r)
23\end{pmatrix}
24\f]
25
26\par Construction.
27Takes in constant n and k=kappa values + grid
28 - A shared pointer to the Grid is stored (to avoid many copies of Grid)
29
30\par Operator Overloads
31 - Intuative operator overloads are provided (Fa, Fb are DiracSpinors):
32 - v * Fa, where v is a double or vector works the obvious way
33 - Fa * Fb = <Fa|Fb>
34 - Fa == Fb returns true if {na,ka}=={nb,kb}
35 - Fa > Fb : first compares n, and then kappa (via kappa_index)
36 - Fa +/- Fb : Adds/subtracts the two spinors (and updates p0/pinf)
37 - You can make copies: auto Fnew = Fa
38 - And you can re-asign: Fb = Fa (provided Fa and Fb have same n and kappa!)
39 - n and kappa are constant, cannot be changed. Avoids angular errors.
40 - all 'set_' functions return mutable references to variables
41*/
43
44public:
45 //! Constructor: Requires n (PQN), kappa (Dirac QN), and grid (shared pointer,
46 //! as it's a shared resource)
47 DiracSpinor(int in_n, int in_kappa, std::shared_ptr<const Grid> in_rgrid);
48 using Index = uint16_t;
49
50private:
51 // Radial Grid; links F[i] to F(r)
52 std::shared_ptr<const Grid> m_rgrid;
53 // Principal quantum number
54 int m_n;
55 // Dirac quantum number, kappa
56 int m_kappa;
57 // Single-particle energy, not including rest energy
58 double m_en = 0.0;
59 // Upper (large) radial component
60 std::vector<double> m_f;
61 // Lower (small) radial component
62 std::vector<double> m_g;
63 // `practical zero': p0 is first non-zero point for f(r) [usually p0=0]
64 std::size_t m_p0 = 0;
65 // `practical infinity': pinf is last non-zero point for f(r)
66 std::size_t m_pinf;
67 // Number of iterations until energy convergence (for latest routine only)
68 int m_its = -1;
69 // Fractional energy convergence: eps = |(en'-en)/en|
70 double m_eps = -1.0;
71 // Occupation fraction. =1 for closed shells. =1/(2j+1) for valence
72 double m_occ_frac = 0.0;
73
74 // 2j, l, pi, kappa_index (for convenience): these are defined by n and kappa
75 int m_twoj;
76 int m_l;
77 int m_parity;
78 std::size_t m_kappa_index;
79 Index m_nkappa_index;
80
81 // flag for regular electron, or "exotic"
82 bool m_exotic{false};
83
84public:
85 //! Principal quantum number, n
86 int n() const { return m_n; }
87 //! Dirac quantum number, kappa
88 int kappa() const { return m_kappa; }
89 //! Orbital angular momentum Q number
90 int l() const { return m_l; }
91 //! j(j+1)
92 double jjp1() const { return 0.25 * double(m_twoj * (m_twoj + 2)); }
93 int twoj() const { return m_twoj; }
94 //! 2j+1
95 int twojp1() const { return m_twoj + 1; }
96 //! (-1)^l, returns +/- 1
97 int parity() const { return m_parity; }
98 //! kappa index (see AtomData)
99 std::size_t k_index() const { return m_kappa_index; }
100 //! (n,kappa) index (see AtomData)
101 Index nk_index() const { return m_nkappa_index; }
102 //! Single-electron term symbol (e.g., 6s_1/2). Gnuplot=true => 6s_{1/2}
103 std::string symbol(bool gnuplot = false) const;
104 //! e.g., 6p_1/2 => 6p-, 6p_3/2 => 6p+
105 std::string shortSymbol() const;
106
107 //! Checks if spinor is for "exotic" lepton, or regular electron
108 bool &exotic() { return m_exotic; }
109 //! Checks if spinor is for "exotic" lepton, or regular electron
110 bool exotic() const { return m_exotic; }
111
112 //! NOTE: Only works for regular alpha, and m=1 - shuold fix
113 bool negativeEnergyStateQ() const;
114
115 //! Changes 'kappa' angular quantum number. Use with caution!
116 void set_new_kappa(int new_kappa);
117
118 //! Resturns a const reference to the radial grid
119 const Grid &grid() const { return *m_rgrid; };
120 //! Resturns copy of shared_ptr to grid [shared resource] - used when we want
121 //! to construct a new DiracSpinor that shares this grid
122 std::shared_ptr<const Grid> grid_sptr() const { return m_rgrid; };
123
124 //! Single-particle energy, not including rest energy
125 double en() const { return m_en; }
126 double &en() { return m_en; }
127
128 //! Upper (large) radial component function, f
129 const std::vector<double> &f() const { return m_f; }
130 std::vector<double> &f() { return m_f; }
131 //! Upper (large) radial component, f(r_i)
132 double f(std::size_t i) const { return m_f.at(i); }
133 double &f(std::size_t i) { return m_f.at(i); }
134
135 //! Lower (small) radial component function, g
136 const std::vector<double> &g() const { return m_g; }
137 std::vector<double> &g() { return m_g; }
138 //! Lower (small) radial component, g(r_i)
139 double g(std::size_t i) const { return m_g.at(i); }
140 double &g(std::size_t i) { return m_g.at(i); }
141
142 //! First non-zero point (index for f[i])
143 // XXX Kill this?
144 auto min_pt() const { return m_p0; }
145 auto &min_pt() { return m_p0; }
146
147 //! Effective size(); index _after_ last non-zero point (index for f[i])
148 auto max_pt() const { return m_pinf; }
149 auto &max_pt() { return m_pinf; }
150
151 //! r0 = r[min_pt] (in atomic units) XXX Kill this?
152 double r0() const;
153 //! rinf = r[max_pt]
154 double rinf() const;
155
156 //! Number of iterations until energy convergence (for latest routine only)
157 auto its() const { return m_its; }
158 auto &its() { return m_its; }
159
160 //! Occupation fraction. =1 for closed shells. =1/(2j+1) for valence
161 auto occ_frac() const { return m_occ_frac; }
162 auto &occ_frac() { return m_occ_frac; }
163
164 //! Fractional energy convergence: eps = |(en'-en)/en|
165 auto eps() const { return m_eps; }
166 auto &eps() { return m_eps; }
167
168 //! Scales DiracSpinor (f and g) by constant
169 const DiracSpinor &scale(const double factor);
170 //! Scales DiracSpinor (f and g) by function of r
171 const DiracSpinor &scale(const std::vector<double> &v);
172 //! By default normalises to 1, but can normalise to other number.
173 void normalise(double norm_to = 1.0);
174 //! Forces f(r) and g(r) to be zero outside of [p0,pinf)
175 void zero_boundaries();
176
177 //! Returns the norm, defined: Norm = Sqrt[<a|a>]
178 double norm() const;
179 //! Returns the norm^2, defined: Norm2 = <a|a>
180 double norm2() const;
181
182 //! Returns [f[p0]/f_max , f[pinf]/f_max] - for tests
183 std::pair<double, double> r0pinfratio() const;
184
185 //! rho(r) = sum_m |Psi^2|(r) = (2j+1) * x_occ * |F^2|(r)
186 std::vector<double> rho() const;
187
188 //! Number of occupied electrons: (2j+1)*occ_frac
189 int num_electrons() const;
190
191public:
192 // Operator overloads
193
194 //! Returns radial integral (Fa,Fb) = Int(fa*fb + ga*gb)
195 friend double operator*(const DiracSpinor &Fa, const DiracSpinor &Fb);
196
197 //! Addition of two DiracSpinors - must have same kappa
199 DiracSpinor &operator-=(const DiracSpinor &rhs);
200 friend DiracSpinor operator+(DiracSpinor lhs, const DiracSpinor &rhs);
201 friend DiracSpinor operator-(DiracSpinor lhs, const DiracSpinor &rhs);
202
203 //! Scalar multiplication
204 DiracSpinor &operator*=(const double x);
205 friend DiracSpinor operator*(DiracSpinor Fa, const double x);
206 friend DiracSpinor operator*(const double x, DiracSpinor Fa);
207
208 //! Multiplication by array (function)
209 DiracSpinor &operator*=(const std::vector<double> &v);
210 friend DiracSpinor operator*(const std::vector<double> &v, DiracSpinor Fa);
211
212 //! Comparitor overloads (compares n, then kappa):
213 friend bool operator==(const DiracSpinor &lhs, const DiracSpinor &rhs);
214 friend bool operator!=(const DiracSpinor &lhs, const DiracSpinor &rhs);
215 friend bool operator<(const DiracSpinor &lhs, const DiracSpinor &rhs);
216 friend bool operator>(const DiracSpinor &lhs, const DiracSpinor &rhs);
217 friend bool operator<=(const DiracSpinor &lhs, const DiracSpinor &rhs);
218 friend bool operator>=(const DiracSpinor &lhs, const DiracSpinor &rhs);
219
220 //! Custom comparitors (for sorting): l, j, kappa_index, energy
221 static bool comp_l(const DiracSpinor &lhs, const DiracSpinor &rhs) {
222 return lhs.m_l < rhs.m_l;
223 }
224 static bool comp_j(const DiracSpinor &lhs, const DiracSpinor &rhs) {
225 return lhs.m_twoj < rhs.m_twoj;
226 }
227 static bool comp_ki(const DiracSpinor &lhs, const DiracSpinor &rhs) {
228 return lhs.m_kappa_index < rhs.m_kappa_index;
229 }
230 static bool comp_n(const DiracSpinor &lhs, const DiracSpinor &rhs) {
231 return lhs.m_n < rhs.m_n;
232 }
233 static bool comp_en(const DiracSpinor &lhs, const DiracSpinor &rhs) {
234 return lhs.en() < rhs.en();
235 }
236
237 //! Writes short symbol to ostream
238 friend std::ostream &operator<<(std::ostream &ostr, const DiracSpinor &Fa) {
239 return ostr << Fa.shortSymbol();
240 }
241
242 // Static (helper) functions:
243
244 //! Returns worst |<a|b>| (or |<a|b>-1| for a=b) {val, state_names}
245 static std::pair<double, std::string>
246 check_ortho(const std::vector<DiracSpinor> &a,
247 const std::vector<DiracSpinor> &b);
248
249 //! (approximately) OrthoNormalises a set of any orbitals.
250 //! @details Note: only updates orbs, not energies
251 static void orthonormaliseOrbitals(std::vector<DiracSpinor> &orbs,
252 int num_its = 1);
253
254 //! Forces Fin to be orthogonal to orbs. If Fn (i.e., {n,k}) in in orbs, replaces Fin with that from orbs.
255 [[nodiscard]] static DiracSpinor
256 orthogonaliseWrt(const DiracSpinor &Fin,
257 const std::vector<DiracSpinor> &orbs);
258
259 //! As orthogonaliseWrt(), but normalises Fin afterwards
260 [[nodiscard]] static DiracSpinor
262 const std::vector<DiracSpinor> &orbs);
263
264 //! A more correct way to force orthogonality than normal
265 void orthog(const DiracSpinor &rhs);
266
267 //! e.g., 6p_1/2 => 6p-, 6p_3/2 => 6p+
268 static std::string shortSymbol(int n, int kappa);
269
270 //! Returns formatted states string (e.g., '7sp5d') given list of orbs
271 static std::string state_config(const std::vector<DiracSpinor> &orbs);
272
273 //! Constructs H-like (pointlike) DiracSpinor - mainly for testing
274 static DiracSpinor exactHlike(int n, int k, std::shared_ptr<const Grid> rgrid,
275 double zeff, double alpha = 0.0,
276 double mass = 1.0);
277
278 //! Constructs a basis of H-like (pointlike) DiracSpinors - mainly for testing
279 /*! @details
280 @param max_l = maxiumum l (both kappas calculated)
281 @param num_ns = number of principle quantum numbers per l (not max n)
282 @param mass = lepton mass in units of m_e (default 1 = electron)
283 */
284 static std::vector<DiracSpinor> HlikeBasis(int max_l, int num_ns,
285 std::shared_ptr<const Grid> rgrid,
286 double zeff, double alpha = 0.0,
287 double mass = 1.0);
288
289 //! Constructs a basis of H-like (pointlike) DiracSpinors - mainly for testing
290 /*! @details
291 @param basis_string = e.g., "6sp5d": max n for each kappa; all n down to
292 n_min = l+1 are included
293 @param mass = lepton mass in units of m_e (default 1 = electron)
294 */
295 static std::vector<DiracSpinor> HlikeBasis(const std::string &basis_string,
296 std::shared_ptr<const Grid> rgrid,
297 double zeff, double alpha = 0.0,
298 double mass = 1.0);
299
300 //! Searches for {n,k} in list of orbitals, returns pointer (may be null)
301 static const DiracSpinor *find(int n, int k,
302 const std::vector<DiracSpinor> &orbs);
303
304 //! Returns maximum (2j) found in {orbs}
305 static int max_tj(const std::vector<DiracSpinor> &orbs);
306 //! Returns maximum l found in {orbs}
307 static int max_l(const std::vector<DiracSpinor> &orbs);
308 //! Returns maximum n found in {orbs}
309 static int max_n(const std::vector<DiracSpinor> &orbs);
310 //! Returns maximum n found in {orbs}, for given kappa
311 static int max_n(const std::vector<DiracSpinor> &orbs, int kappa);
312 //! Returns maximum kappa_index found in {orbs}
313 static std::size_t max_kindex(const std::vector<DiracSpinor> &orbs);
314
315 //! Returns maximum Energy found in {orbs}
316 static double max_En(const std::vector<DiracSpinor> &orbs);
317 //! Returns maximum Energy found in {orbs}
318 static double min_En(const std::vector<DiracSpinor> &orbs);
319
320 //! Splits orbitals into two groups (i.e., core, excited) by energy
321 //! @details
322 //! - The first group contains orbitals with energy < energy
323 //! - The second group contains orbitals with energy > energy
324 //! - The first group is also limited to have n >= n_min_core (i.e., exclude
325 //! deep core states)
326 static std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
327 split_by_energy(const std::vector<DiracSpinor> &orbitals, double Fermi_energy,
328 int n_min_core = 1, int n_max_excited = 9999,
329 bool positrons_are_excited = true);
330
331 //! Splits orbitals into two groups (i.e., core, excited).
332 //! @details
333 //! - The first group contains orbitals with {n,kappa} in the given "core"
334 //! - The second group contains all of the rest
335 //! - The first group is also limited to have n >= n_min_core (i.e., exclude
336 //! deep core states)
337 static std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
338 split_by_core(const std::vector<DiracSpinor> &orbitals,
339 const std::vector<DiracSpinor> &core, int n_min_core = 1);
340
341 //! Takes a subset of an input basis (by copy), according to subset_string
342 //! @details
343 //! - Includes only states matching the subset_string
344 static std::vector<DiracSpinor> subset(const std::vector<DiracSpinor> &basis,
345 const std::string &subset_string,
346 bool exclude_negative_energy = true);
347};
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:439
static int max_tj(const std::vector< DiracSpinor > &orbs)
Returns maximum (2j) found in {orbs}.
Definition DiracSpinor.cpp:271
static DiracSpinor exactHlike(int n, int k, std::shared_ptr< const Grid > rgrid, double zeff, double alpha=0.0, double mass=1.0)
Constructs H-like (pointlike) DiracSpinor - mainly for testing.
Definition DiracSpinor.cpp:447
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:505
static std::vector< DiracSpinor > subset(const std::vector< DiracSpinor > &basis, const std::string &subset_string, bool exclude_negative_energy=true)
Takes a subset of an input basis (by copy), according to subset_string.
Definition DiracSpinor.cpp:551
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:333
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:148
auto eps() const
Fractional energy convergence: eps = |(en'-en)/en|.
Definition DiracSpinor.hpp:165
const std::vector< double > & f() const
Upper (large) radial component function, f.
Definition DiracSpinor.hpp:129
bool negativeEnergyStateQ() const
NOTE: Only works for regular alpha, and m=1 - shuold fix.
Definition DiracSpinor.cpp:135
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:531
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:161
const Grid & grid() const
Resturns a const reference to the radial grid.
Definition DiracSpinor.hpp:119
friend bool operator==(const DiracSpinor &lhs, const DiracSpinor &rhs)
Comparitor overloads (compares n, then kappa):
Definition DiracSpinor.cpp:211
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:422
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:122
static int max_l(const std::vector< DiracSpinor > &orbs)
Returns maximum l found in {orbs}.
Definition DiracSpinor.cpp:277
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:325
DiracSpinor & operator*=(const double x)
Scalar multiplication.
Definition DiracSpinor.cpp:192
static int max_n(const std::vector< DiracSpinor > &orbs)
Returns maximum n found in {orbs}.
Definition DiracSpinor.cpp:282
double en() const
Single-particle energy, not including rest energy.
Definition DiracSpinor.hpp:125
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:306
static std::vector< DiracSpinor > HlikeBasis(int max_l, int num_ns, std::shared_ptr< const Grid > rgrid, double zeff, double alpha=0.0, double mass=1.0)
Constructs a basis of H-like (pointlike) DiracSpinors - mainly for testing.
Definition DiracSpinor.cpp:469
double f(std::size_t i) const
Upper (large) radial component, f(r_i)
Definition DiracSpinor.hpp:132
static std::size_t max_kindex(const std::vector< DiracSpinor > &orbs)
Returns maximum kappa_index found in {orbs}.
Definition DiracSpinor.cpp:299
double r0() const
r0 = r[min_pt] (in atomic units) XXX Kill this?
Definition DiracSpinor.cpp:140
double g(std::size_t i) const
Lower (small) radial component, g(r_i)
Definition DiracSpinor.hpp:139
void orthog(const DiracSpinor &rhs)
A more correct way to force orthogonality than normal.
Definition DiracSpinor.cpp:354
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 bool comp_l(const DiracSpinor &lhs, const DiracSpinor &rhs)
Custom comparitors (for sorting): l, j, kappa_index, energy.
Definition DiracSpinor.hpp:221
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:144
static void orthonormaliseOrbitals(std::vector< DiracSpinor > &orbs, int num_its=1)
(approximately) OrthoNormalises a set of any orbitals.
Definition DiracSpinor.cpp:367
static double max_En(const std::vector< DiracSpinor > &orbs)
Returns maximum Energy found in {orbs}.
Definition DiracSpinor.cpp:319
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:238
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:155
friend double operator*(const DiracSpinor &Fa, const DiracSpinor &Fb)
Returns radial integral (Fa,Fb) = Int(fa*fb + ga*gb)
Definition DiracSpinor.cpp:145
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:141
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:157
static std::string state_config(const std::vector< DiracSpinor > &orbs)
Returns formatted states string (e.g., '7sp5d') given list of orbs.
Definition DiracSpinor.cpp:238
const std::vector< double > & g() const
Lower (small) radial component function, g.
Definition DiracSpinor.hpp:136
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85