High-precision calculations for one- and two-valence atomic systems
FreeDirac.hpp
1#pragma once
2#include <cstddef>
3#include <memory>
4#include <vector>
5class DiracSpinor;
6class Grid;
7
8namespace DiracODE {
9
10/*!
11 @brief Momentum, normalisation, and resolved extent of the free (V = 0)
12 Dirac waves at one energy on a grid; see freeDirac().
13*/
15 //! Momentum, k = sqrt(en (2 + alpha^2 en)), in au
16 double k{};
17 //! Amplitude N = k D of f = N r j_l(kr): D the energy-normalised large-r
18 //! amplitude (analytic_f_amplitude)
19 double norm{};
20 //! Small-to-large ratio of a free particle, k alpha / (2 + alpha^2 en)
21 double g_ratio{};
22 //! Extent of the stored solution: the grid resolves the oscillations (at
23 //! least ~10 points per wavelength, as solveContinuum) below this index
24 std::size_t max_pt{};
25
26 //! Parameters of the free Dirac waves at energy en (> 0, au) on the grid
27 FreeDiracParameters(double en, const Grid &grid, double alpha);
28};
29
30/*!
31 @brief Free (V = 0) Dirac spherical waves at energy en, for every kappa
32 with l in [min_l, max_l]; energy normalised.
33
34 @details
35 Exact solutions of the free Dirac equation, regular at the origin,
36 \f[
37 \begin{align}
38 f(r) &= N\, r\, j_l(kr), \\
39 g(r) &= \frac{\kappa}{|\kappa|}\, N\, \frac{k\alpha}{2 + \alpha^2\en}\,
40 r\, j_{\tilde l}(kr),
41 \end{align}
42 \f]
43 with
44 \f[
45 \begin{align}
46 k &= \sqrt{\en(2 + \alpha^2\en)}, \\
47 \tilde l &= l(-\kappa), \\
48 N &= k D = \sqrt{\frac{k\,(\en + 2mc^2)}{\pi c^2}},
49 \end{align}
50 \f]
51 (\f$ \tilde l \f$ is l+1 for kappa < 0, l-1 for kappa > 0), where D is the
52 energy-normalised large-r amplitude (analytic_f_amplitude()),
53 \f[
54 f \to D\sin(kr - l\pi/2),
55 \f]
56 so that
57 \f[
58 \int (f_\en f_{\en'} + g_\en g_{\en'})\,dr = \delta(\en - \en').
59 \f]
60 Same (f, g) convention as solveContinuum(); the non-relativistic limit of
61 f is DiracContinuum::P_el with zero charge. Standing waves (not outgoing):
62 only |amplitude|^2 summed over channels is meaningful.
63
64 As solveContinuum(), the solution is stored only where the grid resolves
65 the oscillations (at least ~10 points per wavelength): max_pt() is set
66 accordingly and the tail zeroed, so that free and distorted waves at the
67 same energy are truncated alike (as required when completing a truncated
68 multipole sum with plane waves).
69
70 j_l(kr) for l = 0..max_l+1 is evaluated once per grid point and shared by
71 every kappa; for a single kappa use the (en, kappa) overload.
72
73 @param en Continuum (kinetic) energy, > 0, in au.
74 @param min_l Minimum orbital l.
75 @param max_l Maximum orbital l.
76 @param grid Radial grid.
77 @param alpha Fine-structure constant.
78 @return The waves, in kappa-index order (-1, 1, -2, 2, ...), with n = 0.
79
80 @note Do not obtain free waves from solveContinuum() with a zero
81 potential: its normalisation assumes a Coulomb tail.
82*/
83std::vector<DiracSpinor> freeDirac(double en, int min_l, int max_l,
84 std::shared_ptr<const Grid> grid,
85 double alpha);
86
87//! Free (V = 0) Dirac spherical wave of a single kappa; see the all-l
88//! overload of freeDirac()
89DiracSpinor freeDirac(double en, int kappa, std::shared_ptr<const Grid> grid,
90 double alpha);
91
92} // namespace DiracODE
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:44
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
Functions and classes used to solve the Dirac equation.
Definition AsymptoticSpinor.hpp:10
std::vector< DiracSpinor > freeDirac(double en, int min_l, int max_l, std::shared_ptr< const Grid > grid, double alpha)
Free (V = 0) Dirac spherical waves at energy en, for every kappa with l in [min_l,...
Definition FreeDirac.cpp:37
Momentum, normalisation, and resolved extent of the free (V = 0) Dirac waves at one energy on a grid;...
Definition FreeDirac.hpp:14
std::size_t max_pt
Extent of the stored solution: the grid resolves the oscillations (at least ~10 points per wavelength...
Definition FreeDirac.hpp:24
double norm
Amplitude N = k D of f = N r j_l(kr): D the energy-normalised large-r amplitude (analytic_f_amplitude...
Definition FreeDirac.hpp:19
double k
Momentum, k = sqrt(en (2 + alpha^2 en)), in au.
Definition FreeDirac.hpp:16
double g_ratio
Small-to-large ratio of a free particle, k alpha / (2 + alpha^2 en)
Definition FreeDirac.hpp:21