2#include "Coulomb/YkTable.hpp"
4#include "Physics/PhysConst_constants.hpp"
5#include "Potentials/Parametric_potentials.hpp"
6#include "Potentials/RadPot.hpp"
15class CorrelationPotential;
38 friend bool operator<(
const EpsIts &l,
const EpsIts &r) {
39 return std::abs(l.eps) < std::abs(r.eps);
67 const std::vector<DiracSpinor> &core,
68 int k_cut = 99,
double lambda_cut = 0.003);
82std::vector<double>
vex_KS(
const std::vector<DiracSpinor> &core);
114 std::shared_ptr<const Grid> m_rgrid;
115 std::vector<DiracSpinor> m_core;
116 std::vector<double> m_vnuc;
117 std::optional<QED::RadPot> m_vrad;
118 std::optional<HF::Breit> m_VBr;
122 std::vector<double> m_vdir;
124 int m_max_hf_its = 128;
150 HartreeFock(std::shared_ptr<const Grid> rgrid, std::vector<double>
vnuc,
151 std::vector<DiracSpinor>
core,
152 std::optional<QED::RadPot> vrad = std::nullopt,
155 std::optional<Breit::Params> breit_params = std::nullopt,
157 Parametric::Type potential = Parametric::Type::Green,
158 double H_g = 0.0,
double d_t = 0.0);
169 solve_valence(std::vector<DiracSpinor> *valence,
bool print =
true,
170 const MBPT::CorrelationPotential *
const Sigma =
nullptr)
const;
174 const MBPT::CorrelationPotential *
const Sigma =
nullptr,
175 std::optional<double> eta = std::nullopt,
176 std::optional<int> prev_its = std::nullopt)
const;
180 const MBPT::CorrelationPotential *
const Sigma)
const;
188 return ::HF::vexFa(Fa, m_core, 99);
200 std::shared_ptr<const Grid>
grid_sptr()
const {
return m_rgrid; };
203 const std::vector<double> &
vdir()
const {
return m_vdir; }
204 std::vector<double> &
vdir() {
return m_vdir; }
207 const std::vector<double> &
vnuc()
const {
return m_vnuc; }
208 std::vector<double> &
vnuc() {
return m_vnuc; }
211 std::vector<double>
Hrad_el(
int l = 0)
const;
214 std::vector<double>
Hmag(
int l = 0)
const;
217 std::vector<double>
vlocal(
int l = 0)
const;
227 return m_core.empty() ||
228 !(m_method == Method::HartreeFock || m_method == Method::ApproxHF);
232 const std::vector<DiracSpinor> &
core()
const {
return m_core; }
235 double alpha()
const {
return m_alpha; }
247 double x_Breit()
const {
return m_VBr ? m_VBr->scale_factor() : 0.0; }
255 EpsIts solve_initial_core(
const double eps);
258 EpsIts selfcon_local_core(
const double eps_target_HF);
260 EpsIts hf_approx_core(
const double eps_target_HF);
262 EpsIts hartree_fock_core();
287 void hf_orbital_green(
288 DiracSpinor &Fa,
double en,
const std::vector<double> &vl,
289 const std::vector<double> &H_mag,
const DiracSpinor &VxF,
290 const std::vector<DiracSpinor> &static_core,
291 const std::vector<double> &dv0 = {},
const HF::Breit *
const VBr =
nullptr,
292 const MBPT::CorrelationPotential *
const Sigma =
nullptr)
const;
298 enum class ReScale { yes =
true, no =
false };
300 void update_vdir(ReScale re_scale = ReScale::no);
302 void add_KohnSham_vdir_addition();
306 set_parametric_potential(
bool print =
true,
307 Parametric::Type potential = Parametric::Type::Green,
308 double H_g = 0.0,
double d_t = 0.0);
311 void form_approx_vex_core(std::vector<std::vector<double>> &vex)
const;
312 std::vector<std::vector<double>> form_approx_vex_core()
const;
315 std::vector<double> &vex_a)
const;
316 std::vector<double> form_approx_vex_core_a(
const DiracSpinor &Fa)
const;
319 double enGuessCore(
int n,
int ka)
const;
321 double enGuessVal(
int n,
int ka)
const;
Calculates + stores Hartree Y functions + Angular (w/ look-up), taking advantage of symmetry.
Definition YkTable.hpp:46
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
Breit potentials for one- (Hartree-Fock Breit) and two-body Breit integrals.
Definition Breit.hpp:88
Solves relativistic Hartree-Fock equations for core and valence. Optionally includes Breit and QED ef...
Definition HartreeFock.hpp:111
const std::vector< double > & vnuc() const
Returns reference to Vnuc (nuclear potential)
Definition HartreeFock.hpp:207
const Grid & grid() const
Resturns a const reference to the radial grid.
Definition HartreeFock.hpp:197
double x_Breit() const
Breit scale factor (usualy 0 or 1)
Definition HartreeFock.hpp:247
std::vector< double > Hrad_el(int l=0) const
Electric part of radiative potential.
Definition HartreeFock.cpp:1155
double calculateCoreEnergy() const
Calculates the HF core energy (not including Breit?)
Definition HartreeFock.cpp:680
double zion() const
Effective charge at large Z : zion = Z - num_core_electrons.
Definition HartreeFock.cpp:1240
void set_Vrad(QED::RadPot in_vrad)
Update the Vrad used inside HF (only used if we want QED into valence but.
Definition HartreeFock.hpp:239
EpsIts hf_valence_Green(DiracSpinor &Fa, const MBPT::CorrelationPotential *const Sigma) const
Solves HF equation (+ Sigma) for single valence state, alternative method.
Definition HartreeFock.cpp:627
double alpha() const
Value of fine-structure constant used.
Definition HartreeFock.hpp:235
std::vector< double > Hmag(int l=0) const
Magnetic (off-diagonal) part of radiative potential. Doesn't currently depend on l.
Definition HartreeFock.cpp:1158
Method method() const
Which method used to solve HF.
Definition HartreeFock.hpp:220
DiracSpinor vexFa(const DiracSpinor &Fa) const
Calculates exchange term Vex*Fa.
Definition HartreeFock.hpp:186
EpsIts hf_valence(DiracSpinor &Fv, const MBPT::CorrelationPotential *const Sigma=nullptr, std::optional< double > eta=std::nullopt, std::optional< int > prev_its=std::nullopt) const
Solves HF equation (+ Sigma) for single valence state.
Definition HartreeFock.cpp:552
const HF::Breit * vBreit() const
pointer to Breit - may be nullptr if no breit
Definition HartreeFock.hpp:245
const std::vector< double > & vdir() const
Returns reference to Vdir (direct HF potential)
Definition HartreeFock.hpp:203
int num_core_electrons() const
Number of electrons in the core.
Definition HartreeFock.cpp:737
void solve_valence(std::vector< DiracSpinor > *valence, bool print=true, const MBPT::CorrelationPotential *const Sigma=nullptr) const
Solves HF for given valence list. They need not already be solutions.
Definition HartreeFock.cpp:159
DiracSpinor VBr(const DiracSpinor &Fv) const
Breit interaction V_Br*Fa.
Definition HartreeFock.cpp:729
bool is_localQ() const
Returns true if exchange not included.
Definition HartreeFock.hpp:226
EpsIts solve_core(bool print=true)
Solves HF equations self-consitantly for core orbs. Returns epsilon.
Definition HartreeFock.cpp:96
const std::vector< DiracSpinor > & core() const
vector of core orbitals
Definition HartreeFock.hpp:232
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 object t...
Definition HartreeFock.hpp:200
const QED::RadPot * Vrad() const
Get (const) ptr to Vrad - may be null.
Definition HartreeFock.hpp:241
std::vector< double > vlocal(int l=0) const
vlocal = vnuc + vrad_el + vdir
Definition HartreeFock.cpp:723
Constructs and stores the Flambaum-Ginges QED Radiative Potential.
Definition RadPot.hpp:16
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:38
Functions and classes for Hartree-Fock.
Definition CI_Integrals.hpp:16
std::vector< double > vex_KS(const std::vector< DiracSpinor > &core)
Density-based (Kohn-Sham/Slater) local exchange potential, ~rho^1/3.
Definition HartreeFock.cpp:1036
DiracSpinor vexFa_1el(const DiracSpinor &Fv, const DiracSpinor &Fa)
Exchange of a single electron in orbital Fa, acting on Fv: X_a Fv.
Definition HartreeFock.cpp:1128
std::string parseMethod_short(const Method &in_method)
Convers HF::Method enum to short string (name) of method (e.g., HF)
Definition HartreeFock.cpp:59
std::vector< double > vex_approx(const DiracSpinor &Fa, const std::vector< DiracSpinor > &core, int k_cut, const double lambda_cut)
Forms approx (localised) exchange potential, from scratch.
Definition HartreeFock.cpp:974
Method
Methods available for self-consistant field model.
Definition HartreeFock.hpp:52
DiracSpinor vexFa(const DiracSpinor &Fa, const std::vector< DiracSpinor > &core, int k_cut)
Calculates V_exch * Fa, for any orbital Fa (calculates Coulomb integral from scratch).
Definition HartreeFock.cpp:1093
Method parseMethod(const std::string &in_method)
Convers string (name) of method (e.g., HartreeFock) to HF::Method enum.
Definition HartreeFock.cpp:26
Many-body perturbation theory.
Definition MatrixElements.hpp:12
constexpr double alpha
Fine-structure constant: alpha = 1/137.035 999 177(21) [CODATA 2022].
Definition PhysConst_constants.hpp:24
Convergence results of for each self-consistent-field solve.
Definition HartreeFock.hpp:34