ampsci
High-precision calculations for one- and two-valence atomic systems
ComplexDirac.hpp
1#pragma once
2#include "AdamsMoulton.hpp"
3#include "Physics/PhysConst_constants.hpp"
4#include <complex>
5#include <utility>
6#include <vector>
7class DiracSpinor;
8class Grid;
9
10namespace DiracODE {
11
12//! For given complex energy en, solves Dirac equation with correct boundary conditions at the origin.
14 const std::complex<double> en,
15 const std::vector<double> &v,
16 const std::vector<double> &H_off_diag,
17 const double alpha);
18
19//! For given complex energy en, solves Dirac equation with correct boundary conditions at infinity.
21 const std::complex<double> en,
22 const std::vector<double> &v,
23 const std::vector<double> &H_off_diag,
24 const double alpha);
25
26namespace Internal {
27//==============================================================================
28/*!
29 @brief Complex-energy Dirac derivative matrix: dF/du = D(u)*F(u).
30 @details
31 Complex-energy analogue of @ref DiracDerivative. Accepts a complex orbital
32 energy en, returning complex matrix elements. See @ref DiracDerivative for
33 the form of D; the only difference here is Y = std::complex<double>.
34
35 @note Non-copyable; stores raw pointers to grid and potential arrays.
36*/
38 : AdamsMoulton::DerivativeMatrix<std::size_t, std::complex<double>> {
39
40 /*!
41 @brief Constructs the complex Dirac derivative matrix.
42 @param in_grid Radial grid.
43 @param in_v Local potential v(r).
44 @param in_k Orbital kappa quantum number.
45 @param in_en Complex orbital energy.
46 @param in_alpha Fine-structure constant.
47 @param V_off_diag Optional off-diagonal (magnetic) potential. If empty, treated as zero.
48 */
49 CDiracDerivative(const Grid &in_grid, const std::vector<double> &in_v,
50 const int in_k, const std::complex<double> in_en,
51 const double in_alpha,
52 const std::vector<double> &V_off_diag = {});
53 const Grid *const pgr;
54 const std::vector<double> *const v;
55 const std::vector<double> *const Hmag;
56 const double zion = 1.0;
57 const int k;
58 const std::complex<double> en;
59 const double alpha, cc;
60
61 //! D matrix elements (see @ref DiracDerivative for definitions); index i is grid point.
62 std::complex<double> a(std::size_t i) const final;
63 std::complex<double> b(std::size_t i) const final;
64 std::complex<double> c(std::size_t i) const final;
65 std::complex<double> d(std::size_t i) const final;
66
67 CDiracDerivative(const CDiracDerivative &) = delete;
68 void operator=(const CDiracDerivative &) = delete;
69};
70
71/*!
72 @brief Integrates the complex Dirac equation outwards from the origin.
73 @details
74 Integrates up to index @p final (not inclusive); if final=0, integrates to
75 f.size(). Solution satisfies the boundary condition at r=0 but not at large r.
76*/
77void solve_Dirac_outwards_C(std::vector<std::complex<double>> &f,
78 std::vector<std::complex<double>> &g,
79 const CDiracDerivative &Hd, std::size_t final = 0);
80
81//! Integrates the complex Dirac equation inwards from pinf to ctp.
82//! Solution satisfies the boundary condition at large r but not at the origin.
83void solve_Dirac_inwards_C(std::vector<std::complex<double>> &f,
84 std::vector<std::complex<double>> &g,
85 const CDiracDerivative &Hd, std::size_t ctp,
86 std::size_t pinf);
87
88} // namespace Internal
89} // namespace DiracODE
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
Functions and classes used to solve the Dirac equation.
Definition AsymptoticSpinor.hpp:8
void regularAtInfinity_C(DiracSpinor &FaR, DiracSpinor &FaI, const std::complex< double > en, const std::vector< double > &v, const std::vector< double > &H_mag, const double alpha)
For given complex energy en, solves Dirac equation with correct boundary conditions at infinity.
Definition ComplexDirac.cpp:55
void regularAtOrigin_C(DiracSpinor &FaR, DiracSpinor &FaI, const std::complex< double > en, const std::vector< double > &v, const std::vector< double > &H_mag, const double alpha)
For given complex energy en, solves Dirac equation with correct boundary conditions at the origin.
Definition ComplexDirac.cpp:22
Pure-virtual struct defining the derivative matrix for a 2x2 ODE system.
Definition AdamsMoulton.hpp:47
Complex-energy Dirac derivative matrix: dF/du = D(u)*F(u).
Definition ComplexDirac.hpp:38
std::complex< double > a(std::size_t i) const final
D matrix elements (see DiracDerivative for definitions); index i is grid point.
Definition ComplexDirac.cpp:208