ampsci
High-precision calculations for one- and two-valence atomic systems
TDHF.hpp
1#pragma once
2#include "CorePolarisation.hpp"
3#include <string>
4#include <vector>
5class DiracSpinor;
6namespace DiracOperator {
7class TensorOperator;
8}
9namespace MBPT {
10class CorrelationPotential;
11}
12
13namespace HF {
14class HartreeFock;
15class Breit;
16} // namespace HF
17
18namespace ExternalField {
19
20//! Uses time-dependent Hartree-Fock method to include core-polarisation
21//! (RPA) corrections to matrix elements of some external field operator.
22/*! @details
23Solves set of TDHF equations
24\f[
25 (H -\epsilon \pm \omega)\delta\psi_b = -(\delta V + \delta\epsilon_c)\psi_b
26\f]
27self consistantly for each electron in the core to determine dV. (See
28'ampsci.pdf' for detailed physics description). There is an option to limit
29the maximum number of iterations; set to 1 to get the first-order correction
30(nb: no damping is used for first iteration).
31\par Construction
32Requires a pointer to an operator (h), a const HF object (const pointer).
33\par Usage
34solve_core(omega) solves TDHF eqs for given frequency. Frequency should be
35positive, but is allowed to be negative (use as a test only, with care). Can be
36run again with a different frequency, typically does not need to be re-started
37from scratch. Then, dV(Fa,Fb) returns the correction to the matrix element:
38\f[ \langle \phi_a || \delta V || \phi_b \rangle \f]
39*/
40class TDHF : public CorePolarisation {
41
42protected:
43 // dPhi = X exp(-iwt) + Y exp(+iwt)
44 // (H - e - w)X = -(h + dV - de)Phi
45 // (H - e + w)Y = -(h* + dV* - de)Phi
46 // X_c = sum_x X_x,
47 // j(x)=j(c)-k,...,j(c)+k. And: pi(x) = pi(c)*pi(h)
48 std::vector<std::vector<DiracSpinor>> m_X{};
49 std::vector<std::vector<DiracSpinor>> m_Y{};
50 std::vector<std::vector<DiracSpinor>> m_hFcore{};
51 // can just write these to disk! Read them in, continue as per normal
52
53 const HF::HartreeFock *const p_hf;
54 const std::vector<DiracSpinor> m_core;
55 // const std::vector<double> m_Hmag;
56 const double m_alpha;
57 const HF::Breit *const p_VBr;
58
59public:
60 //! Contruct TDHF operator: takes pointer to operator and to HF object
62 const HF::HartreeFock *const hf);
63
64 //! Solves TDHF equations self-consistantly for core electrons at frequency
65 //! omega.
66 /*! @details Will iterate up to a maximum of max_its. Set max_its=1
67 to get first-order correction [note: no damping is used for first
68 itteration]. If print=true, will write progress to screen.
69 */
70 virtual void solve_core(const double omega, int max_its = 100,
71 const bool print = true) override;
72
73 //! Returns RPA method
74 virtual Method method() const override { return Method::TDHF; }
75
76 //! Clears the dPsi orbitals (sets to zero)
77 virtual void clear() override final;
78
79 //! Calculate reduced matrix element <a||dV||b> or <a||dV*||b>.
80 //! Will exclude orbital 'Fexcl' from sum over core (for tests only)
81 double dV(const DiracSpinor &Fa, const DiracSpinor &Fb, bool conj) const;
82
83 //! As above, but automatically determines if 'conjugate' version
84 //! required (Based on sign of [en_a-en_b])
85 virtual double dV(const DiracSpinor &Fa,
86 const DiracSpinor &Fb) const override final;
87
88 //! Returns "reduced partial matrix element RHS": dV||Fb}.
89 //! Note: Fa * dV_rhs(..) equiv to dV(..)
90 DiracSpinor dV_rhs(const int kappa_n, const DiracSpinor &Fm,
91 bool conj = false) const;
92
93 //! Returns const ref to dPsi orbitals for given core orbital Fc
94 const std::vector<DiracSpinor> &get_dPsis(const DiracSpinor &Fc,
95 dPsiType XorY) const;
96 //! Returns const reference to dPsi orbital of given kappa
97 const DiracSpinor &get_dPsi_x(const DiracSpinor &Fc, dPsiType XorY,
98 const int kappa_x) const;
99
100 //! Forms \delta Psi_v for valence state Fv (including core pol.) - 1 kappa
101 /*! @details
102 Solves
103 \f[ (H + \Sigma - \epsilon - \omega)X = -(h + \delta V
104 - \delta\epsilon)\psi \f]
105 or
106 \f[ (H + \Sigma - \epsilon + \omega)Y = -(h^\dagger + \delta V^\dagger
107 - \delta\epsilon)Psi\f]
108 Returns \f$ \chi_\beta \f$ for given kappa_beta, where
109 \f[ X_{j,m} = (-1)^{j_\beta-m}tjs(j,k,j;-m,0,m)\chi_j \f]
110 XorY takes values: dPsiType::X or dPsiType::Y.
111 st takes values: StateType::ket or StateType::bra
112 */
114 solve_dPsi(const DiracSpinor &Fv, const double omega, dPsiType XorY,
115 const int kappa_beta,
116 const MBPT::CorrelationPotential *const Sigma = nullptr,
117 StateType st = StateType::ket, bool incl_dV = true) const;
118 //! Forms \delta Psi_v for valence state Fv for all kappas (see solve_dPsi)
119 std::vector<DiracSpinor>
120 solve_dPsis(const DiracSpinor &Fv, const double omega, dPsiType XorY,
121 const MBPT::CorrelationPotential *const Sigma = nullptr,
122 StateType st = StateType::ket, bool incl_dV = true) const;
123
124 // //! Writes dPsi (f-component) to textfile
125 // void print(const std::string &ofname = "dPsi.txt") const;
126
127private:
128 void initialise_dPsi();
129
130 // Single iteration of TDHF equations
131 std::pair<double, std::string> tdhf_core_it(double omega, double eta_damp);
132 // Forms set of h*Fc for all core orbitals and all projections
133 std::vector<std::vector<DiracSpinor>> form_hFcore() const;
134 // Solves the MS equations for all projections, single core state
135 void solve_ms_core(std::vector<DiracSpinor> &dFb, const DiracSpinor &Fb,
136 const std::vector<DiracSpinor> &hFbs, const double omega,
137 dPsiType XorY, double eps_ms = 1.0e-9) const;
138
139public:
140 TDHF &operator=(const TDHF &) = delete;
141 TDHF(const TDHF &) = default;
142 ~TDHF() = default;
143};
144
145} // namespace ExternalField
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:65
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
Virtual Core Polarisation class, for <a||dV||b>. See TDHF, DiagramRPA, etc.
Definition CorePolarisation.hpp:35
Uses time-dependent Hartree-Fock method to include core-polarisation (RPA) corrections to matrix elem...
Definition TDHF.hpp:40
virtual void clear() override final
Clears the dPsi orbitals (sets to zero)
Definition TDHF.cpp:70
const DiracSpinor & get_dPsi_x(const DiracSpinor &Fc, dPsiType XorY, const int kappa_x) const
Returns const reference to dPsi orbital of given kappa.
Definition TDHF.cpp:87
double dV(const DiracSpinor &Fa, const DiracSpinor &Fb, bool conj) const
Calculate reduced matrix element <a||dV||b> or <a||dV*||b>. Will exclude orbital 'Fexcl' from sum ove...
Definition TDHF.cpp:330
DiracSpinor dV_rhs(const int kappa_n, const DiracSpinor &Fm, bool conj=false) const
Returns "reduced partial matrix element RHS": dV||Fb}. Note: Fa * dV_rhs(..) equiv to dV(....
Definition TDHF.cpp:342
std::vector< DiracSpinor > solve_dPsis(const DiracSpinor &Fv, const double omega, dPsiType XorY, const MBPT::CorrelationPotential *const Sigma=nullptr, StateType st=StateType::ket, bool incl_dV=true) const
Forms \delta Psi_v for valence state Fv for all kappas (see solve_dPsi)
Definition TDHF.cpp:96
const std::vector< DiracSpinor > & get_dPsis(const DiracSpinor &Fc, dPsiType XorY) const
Returns const ref to dPsi orbitals for given core orbital Fc.
Definition TDHF.cpp:77
virtual Method method() const override
Returns RPA method.
Definition TDHF.hpp:74
DiracSpinor solve_dPsi(const DiracSpinor &Fv, const double omega, dPsiType XorY, const int kappa_beta, const MBPT::CorrelationPotential *const Sigma=nullptr, StateType st=StateType::ket, bool incl_dV=true) const
Forms \delta Psi_v for valence state Fv (including core pol.) - 1 kappa.
Definition TDHF.cpp:109
virtual void solve_core(const double omega, int max_its=100, const bool print=true) override
Solves TDHF equations self-consistantly for core electrons at frequency omega.
Definition TDHF.cpp:273
Breit (Hartree-Fock Breit) interaction potential.
Definition Breit.hpp:52
Solves relativistic Hartree-Fock equations for core and valence. Optionally includes Breit and QED ef...
Definition HartreeFock.hpp:71
Dirac Operators: General + derived.
Definition GenerateOperator.cpp:3
Calculates many-body corrections (RPA) to matrix elements of external field.
Definition calcMatrixElements.cpp:14
Functions and classes for Hartree-Fock.
Definition CI_Integrals.hpp:12
Many-body perturbation theory.
Definition CI_Integrals.hpp:9