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(std::string states, std::size_t n, std::size_t k, double r0,
59 double reps, double rmax, bool positronQ,
60 SplineType itype = SplineType::Derevianko,
61 bool in_orthogonalise = false);
62 Parameters(IO::InputBlock input);
63
64 std::string states{};
65 std::size_t n{}, k{};
66 double r0{}, reps{}, rmax{};
67 bool positronQ{false};
68 SplineType type{SplineType::Derevianko};
69 bool orthogonalise{false};
70};
71
73
91std::vector<DiracSpinor> form_basis(const Parameters &params,
92 const Wavefunction &wf,
93 const bool correlationsQ = false);
94
95double check(const std::vector<DiracSpinor> &basis,
96 const std::vector<DiracSpinor> &orbs, bool print_warning = true);
97
99std::pair<std::vector<DiracSpinor>, std::vector<DiracSpinor>>
100form_spline_basis(const int kappa, const std::size_t n_states,
101 const std::size_t k_spl, const double r0_spl,
102 const double rmax_spl, std::shared_ptr<const Grid> rgrid,
103 const double alpha,
104 SplineType itype = SplineType::Derevianko);
105
108std::pair<LinAlg::Matrix<double>, LinAlg::Matrix<double>>
109fill_Hamiltonian_matrix(const std::vector<DiracSpinor> &spl_basis,
110 const std::vector<DiracSpinor> &d_basis,
111 const Wavefunction &wf,
112 const bool correlationsQ = false,
113 SplineType itype = SplineType::Derevianko);
114
115void add_NotreDameBoundary(LinAlg::Matrix<double> *Aij, const int kappa,
116 const double alpha);
117
120void expand_basis_orbitals(std::vector<DiracSpinor> *basis,
121 std::vector<DiracSpinor> *basis_positron,
122 const std::vector<DiracSpinor> &spl_basis,
123 const int kappa, const int max_n,
124 const LinAlg::Vector<double> &e_values,
125 const LinAlg::Matrix<double> &e_vectors,
126 const Wavefunction &wf);
127
129std::vector<double> sumrule_TKR(const std::vector<DiracSpinor> &basis,
130 const std::vector<double> &r,
131 bool print = false);
132
134std::vector<double> sumrule_DG(int nDG, const std::vector<DiracSpinor> &basis,
135 const Grid &gr, double alpha, bool print);
136
137std::pair<double, double> r_completeness(const DiracSpinor &Fv,
138 const std::vector<DiracSpinor> &basis,
139 const Grid &gr, bool print = false);
140} // 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:36
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:459
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, 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:357
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:193
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:277
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:422
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:53