ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
Loading...
Searching...
No Matches
BSplineBasis.hpp
1#pragma once
2#include "IO/InputBlock.hpp"
3#include "LinAlg/include.hpp"
4#include <memory>
5#include <string>
6#include <utility>
7class DiracSpinor;
8class Wavefunction;
9class Grid;
10namespace MBPT {
11class CorrelationPotential;
12}
13namespace IO {
14class InputBlock;
15}
16
48namespace SplineBasis {
49
50enum class SplineType { Derevianko, Johnson };
51inline auto parseSplineType(std::string_view type) {
52 return (type == "Johnson" || type == "johnson") ? SplineType::Johnson :
53 SplineType::Derevianko;
54}
55
56struct Parameters {
57 Parameters() {}
58 Parameters(const std::string &states, std::size_t n, std::size_t k, double r0,
59 double reps, double rmax, const std::string &positron = "",
60 SplineType itype = SplineType::Derevianko,
61 bool in_orthogonalise = false, bool in_verbose = true);
62 Parameters(IO::InputBlock input);
63
64 std::string states{};
65 std::size_t n{}, k{};
66 double r0{}, reps{}, rmax{};
67 std::string positron{};
68 SplineType type{SplineType::Derevianko};
69 bool orthogonalise{false};
70 bool verbose{true};
71};
72
74
92std::vector<DiracSpinor> form_basis(const Parameters &params,
93 const Wavefunction &wf,
94 const bool correlationsQ = false);
95
96double check(const std::vector<DiracSpinor> &basis,
97 const std::vector<DiracSpinor> &orbs, bool print_warning = true);
98
100std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
101form_spline_basis(const int kappa, const std::size_t n_states,
102 const std::size_t k_spl, const double r0_spl,
103 const double rmax_spl, std::shared_ptr<const Grid> rgrid,
104 const double alpha,
105 SplineType itype = SplineType::Derevianko);
106
109std::pair<LinAlg::Matrix<double>, LinAlg::Matrix<double>>
110fill_Hamiltonian_matrix(const std::vector<DiracSpinor> &spl_basis,
111 const std::vector<DiracSpinor> &d_basis,
112 const Wavefunction &wf,
113 const bool correlationsQ = false,
114 SplineType itype = SplineType::Derevianko);
115
116void add_NotreDameBoundary(LinAlg::Matrix<double> *Aij, const int kappa,
117 const double alpha);
118
121void expand_basis_orbitals(std::vector<DiracSpinor> *basis,
122 std::vector<DiracSpinor> *basis_positron,
123 const std::vector<DiracSpinor> &spl_basis,
124 const int kappa, const int max_n, int max_n_positron,
125 const LinAlg::Vector<double> &e_values,
126 const LinAlg::Matrix<double> &e_vectors,
127 const Wavefunction &wf);
128
130std::vector<double> sumrule_TKR(const std::vector<DiracSpinor> &basis,
131 const std::vector<double> &r,
132 bool print = false);
133
135std::vector<double> sumrule_DG(int nDG, const std::vector<DiracSpinor> &basis,
136 const Grid &gr, double alpha, bool print);
137
138std::pair<double, double> r_completeness(const DiracSpinor &Fv,
139 const std::vector<DiracSpinor> &basis,
140 const Grid &gr, bool print = false);
141} // namespace SplineBasis
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
Holds list of Options, and a list of other InputBlocks. Can be initialised with a list of options,...
Definition InputBlock.hpp:142
Matrix class; row-major.
Definition Matrix.hpp:35
Vector class (inherits from Matrix)
Definition Vector.hpp:9
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:37
In-out (timers, profilers, and read/write data)
Definition ChronoTimer.hpp:9
Many-body perturbation theory.
Definition CI_Integrals.hpp:9
Constucts of spinor/orbital basis using B-splines (DKB/Reno/Derevianko-Beloy method)
Definition BSplineBasis.cpp:20
std::vector< double > sumrule_DG(int nDG, const std::vector< DiracSpinor > &basis, const Grid &gr, double alpha, bool print)
Drake-Gordon sum rule (basis test); should =0 (must incl -ve energy states)
Definition BSplineBasis.cpp:451
std::pair< std::vector< DiracSpinor >, std::vector< DiracSpinor > > form_spline_basis(const int kappa, const std::size_t n_states, const std::size_t k_spl, const double r0_spl, const double rmax_spl, std::shared_ptr< const Grid > rgrid, const double alpha, SplineType type)
Forms the underlying spline basis (which is not kept)
Definition BSplineBasis.cpp:194
std::pair< LinAlg::Matrix< double >, LinAlg::Matrix< double > > fill_Hamiltonian_matrix(const std::vector< DiracSpinor > &spl_basis, const std::vector< DiracSpinor > &d_basis, const Wavefunction &wf, const bool correlationsQ, SplineType type)
Calculates + reyurns the Hamiltonian (and ) matrices.
Definition BSplineBasis.cpp:266
std::vector< double > sumrule_TKR(const std::vector< DiracSpinor > &basis, const std::vector< double > &r, bool print)
TKR sum rule (basis test); should =0 (must include -ve energy states)
Definition BSplineBasis.cpp:415
std::vector< DiracSpinor > form_basis(const Parameters &params, const Wavefunction &wf, const bool correlationsQ)
Forms + returns the basis orbitals (expanded in terms of splines)
Definition BSplineBasis.cpp:51
void expand_basis_orbitals(std::vector< DiracSpinor > *basis, std::vector< DiracSpinor > *basis_positron, const std::vector< DiracSpinor > &spl_basis, const int kappa, const int max_n, int max_n_positron, const LinAlg::Vector< double > &e_values, const LinAlg::Matrix< double > &e_vectors, const Wavefunction &wf)
Expands basis orbitals in terms of spline orbitals, by diagonalising Hamiltonian.
Definition BSplineBasis.cpp:340