2#include "CI/CI_Integrals.hpp"
4#include "HF/HartreeFock.hpp"
5#include "MBPT/CorrelationPotential.hpp"
6#include "Maths/Grid.hpp"
7#include "Physics/AtomData.hpp"
8#include "Physics/PhysConst_constants.hpp"
9#include "Potentials/NuclearPotentials.hpp"
10#include "Potentials/RadPot.hpp"
11#include "Wavefunction/BSplineBasis.hpp"
12#include "Wavefunction/DiracSpinor.hpp"
13#include "json/json.hpp"
77 std::shared_ptr<const Grid> rgrid;
80 std::string m_run_label;
84 std::vector<DiracSpinor> m_valence{};
85 std::vector<DiracSpinor> m_hf_valence{};
87 std::vector<DiracSpinor> m_basis{};
89 std::vector<DiracSpinor> m_spectrum{};
91 std::vector<double> m_vnuc{};
93 std::optional<HF::HartreeFock> m_HF{std::nullopt};
95 std::optional<MBPT::CorrelationPotential> m_Sigma{};
97 std::string m_core_string =
"";
98 std::string m_aboveFermi_core_string =
"";
112 std::shared_ptr<const Grid>
grid_sptr()
const {
return rgrid; };
115 double alpha()
const {
return m_alpha; }
120 return (m_alpha * m_alpha / PhysConst::alpha2) - 1.0;
126 int Znuc()
const {
return m_nucleus.
z(); }
128 int Anuc()
const {
return m_nucleus.
a(); }
133 const std::vector<DiracSpinor> &
core()
const {
134 static const auto empty = std::vector<DiracSpinor>{};
135 return m_HF ? m_HF->core() : empty;
139 const std::vector<DiracSpinor> &
valence()
const {
return m_valence; }
140 std::vector<DiracSpinor> &
valence() {
return m_valence; }
143 const std::vector<DiracSpinor> &
hf_valence()
const {
return m_hf_valence; }
151 const std::vector<DiracSpinor> &
basis()
const {
return m_basis; }
152 std::vector<DiracSpinor> &
basis() {
return m_basis; }
155 const std::vector<DiracSpinor> &
spectrum()
const {
return m_spectrum; }
156 std::vector<DiracSpinor> &
spectrum() {
return m_spectrum; }
159 const std::vector<CI::PsiJPi> &
CIwfs()
const {
return m_CI.
levels; }
168 for (
const auto &ci_wf : m_CI.
levels) {
169 if (ci_wf.twoJ() == 2 * J && ci_wf.parity() == parity)
190 const std::vector<double> &
vnuc()
const {
return m_vnuc; }
202 std::vector<double>
vlocal(
int l = 0)
const;
211 std::vector<double>
Hmag(
int l = 0)
const;
219 return m_Sigma ? &*m_Sigma :
nullptr;
269 ", Z=" + std::to_string(m_nucleus.
z()) +
270 " A=" + std::to_string(m_nucleus.
a());
291 const std::string &
run_label()
const {
return m_run_label; };
312 void printValence(
const std::vector<DiracSpinor> &tmp_orbitals = {})
const;
315 void printBasis(
const std::vector<DiracSpinor> &the_basis)
const;
361 const std::string &in_core =
"",
362 std::optional<HF::Breit::Params> breit_params = std::nullopt,
363 double eps_HF = 1.0e-14,
bool print =
true);
370 std::optional<HF::Breit::Params> breit_params = std::nullopt,
371 double eps_HF = 1.0e-14,
bool print =
true);
373 void solve_core(
const std::string &method,
const std::string &in_core =
"",
374 std::optional<HF::Breit::Params> breit_params = std::nullopt,
375 double eps_HF = 1.0e-14,
bool print =
true);
389 const bool print =
true);
455 const std::vector<double> &fit_energies,
456 bool separate_lambda =
false);
460 const std::vector<double> &x_spd,
461 bool do_readwrite =
true,
bool print =
true);
547 void formSigma(
int nmin_core = 1,
double r0 = 1.0e-4,
double rmax = 30.0,
548 int stride = 4,
bool each_valence =
false,
549 bool include_G =
false,
bool include_Breit =
false,
550 int n_max_breit = 0,
const std::vector<double> &lambdas = {},
551 const std::vector<double> &fk = {},
552 const std::vector<double> &etak = {},
bool read_write =
true,
553 const std::string &fname =
"",
bool FeynmanQ =
false,
554 bool ScreeningQ =
false,
bool hole_particleQ =
false,
555 int lmax = 6,
double omre = -0.2,
double w0 = 0.01,
556 double wratio = 1.5,
bool complex_green =
false,
557 const std::optional<IO::InputBlock> &ek = std::nullopt,
558 const std::string &ladder_file =
"",
bool derivative =
false,
559 bool print_de =
false,
bool fk_both_lines =
false,
560 bool tail_extrapolation =
false);
574 if (
Sigma !=
nullptr)
590 m_HF->vnuc() = v_new;
649 output_to_json(
const std::string &out_name =
"ampsci_output.json");
652 double H0ab_impl(
const DiracSpinor &Fa, std::vector<double> dga,
653 const DiracSpinor &Fb, std::vector<double> dgb)
const;
656 std::vector<DiracSpinor> determineCore(
const std::string &str_core_in);
657 bool isInAboveFermiCore(
int n,
int k)
const;
Container for CI solutions in a single J/Pi.
Definition CSF.hpp:248
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:55
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
Solves relativistic Hartree-Fock equations for core and valence. Optionally includes Breit and QED ef...
Definition HartreeFock.hpp:114
Correlation potential, Sigma, for valence states.
Definition CorrelationPotential.hpp:108
Stores set of nuclear parameters (all radii in fm)
Definition NuclearPotentials.hpp:41
int & z()
Nuclear charge, Z.
Definition NuclearPotentials.hpp:93
double r_rms() const
Root-mean-square charge radius (fm); 0 if not set.
Definition NuclearPotentials.hpp:106
int & a()
Mass number, A.
Definition NuclearPotentials.hpp:96
Constructs and stores the Flambaum-Ginges QED Radiative Potential.
Definition RadPot.hpp:16
Scale factors for Uehling, high, low, magnetic, Wickman-Kroll.
Definition RadPot.hpp:21
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:48
void solve_valence(const std::string &in_valence_str="", const bool print=true)
Performs Hartree-Fock procedure for valence; populates valence.
Definition Wavefunction.cpp:192
void formBasis(const SplineBasis::Parameters ¶ms)
Calculates + populates basis [see BSplineBasis].
Definition Wavefunction.cpp:481
void solve_core(bool print=true)
Performs Hartree-Fock procedure for core (nothing if HF not set)
Definition Wavefunction.cpp:164
const std::vector< DiracSpinor > & core() const
Core orbitals (frozen HF core); empty if HF not set.
Definition Wavefunction.hpp:133
void printValence(const std::vector< DiracSpinor > &tmp_orbitals={}) const
Prints table of valence orbitals + energies etc.
Definition Wavefunction.cpp:414
const Grid & grid() const
Returns a const reference to the radial grid.
Definition Wavefunction.hpp:105
double coreEnergyHF() const
Calculates HF core energy.
Definition Wavefunction.cpp:184
std::tuple< double, double > lminmax_core_range(int l, double eps=0.0) const
Returns [min,max] r values for which the core density is > cutoff.
Definition Wavefunction.cpp:356
const DiracSpinor * getState(int n, int k) const
Finds requested state (n, kappa); returns nullptr if not found.
Definition Wavefunction.cpp:297
int Znuc() const
Nuclear charge, Z.
Definition Wavefunction.hpp:126
double energy_gap() const
Energy gap between lowest valence + highest core state.
Definition Wavefunction.cpp:343
std::string identity() const
Atomic symbol, including core ionisation degree and run_label.
Definition Wavefunction.cpp:771
const CI::PsiJPi * CIwf(int J, int parity) const
CI solutions for given J and parity; nullptr if not found.
Definition Wavefunction.hpp:167
void copySigma(const MBPT::CorrelationPotential *const Sigma)
Copies correlation potential Sigma (nothing if Sigma is null).
Definition Wavefunction.hpp:573
std::string coreConfiguration() const
Returns full core configuration.
Definition Wavefunction.hpp:259
nlohmann::json output_to_json(const std::string &out_name="ampsci_output.json")
Writes wavefunction information to json file.
Definition Wavefunction.cpp:1004
int Zion() const
Effective charge (for core) = Z-N_core.
Definition Wavefunction.hpp:302
const CI::Integrals & CI_integrals() const
Integral tables used to construct the CI Hamiltonians.
Definition Wavefunction.hpp:181
std::vector< double > vlocal(int l=0) const
Local part of potential, e.g., Vl = Vnuc + Vdir + Vrad_el(l).
Definition Wavefunction.cpp:752
const std::string & run_label() const
Optional label for output identity (see identity)
Definition Wavefunction.hpp:291
std::vector< double > Hmag(int l=0) const
QED Magnetic form factor.
Definition Wavefunction.cpp:757
std::vector< double > coreDensity() const
Calculates rho(r) = sum_c psi^2(r) for core states, c={n,k,m}.
Definition Wavefunction.cpp:469
int ion_degree(int num_val) const
0 for neutral, 1 for singly-ionised etc. (num_val: valence electrons)
Definition Wavefunction.hpp:294
void formSigma(int nmin_core=1, double r0=1.0e-4, double rmax=30.0, int stride=4, bool each_valence=false, bool include_G=false, bool include_Breit=false, int n_max_breit=0, const std::vector< double > &lambdas={}, const std::vector< double > &fk={}, const std::vector< double > &etak={}, bool read_write=true, const std::string &fname="", bool FeynmanQ=false, bool ScreeningQ=false, bool hole_particleQ=false, int lmax=6, double omre=-0.2, double w0=0.01, double wratio=1.5, bool complex_green=false, const std::optional< IO::InputBlock > &ek=std::nullopt, const std::string &ladder_file="", bool derivative=false, bool print_de=false, bool fk_both_lines=false, bool tail_extrapolation=false)
Forms + stores correlation potential Sigma.
Definition Wavefunction.cpp:524
int Anuc() const
Nuclear mass number, A.
Definition Wavefunction.hpp:128
std::string atomicSymbol() const
e.g., "Cs"
Definition Wavefunction.hpp:274
void radiativePotential(QED::RadPot::Scale s, double rcut, double scale_rN, const std::vector< double > &x_spd, bool do_readwrite=true, bool print=true)
OLD: deprecated.
Definition Wavefunction.cpp:227
std::string ion_symbol(int num_val) const
I for neutral, II for singly-ionised etc. (num_val: valence electrons)
Definition Wavefunction.hpp:297
double get_rrms() const
Nuclear rms charge radius, in fm (femtometres)
Definition Wavefunction.hpp:130
void solve_exotic(const std::string &in_exotic_str, double mass=PhysConst::m_muon, bool screening=true, bool print=true)
Solves for exotic atoms (e.g., muonic), including screening.
Definition Wavefunction.cpp:874
const std::vector< DiracSpinor > & spectrum() const
Spectrum: like basis, but includes correlations.
Definition Wavefunction.hpp:155
const MBPT::CorrelationPotential * Sigma() const
Returns ptr to (const) Correlation Potential, Sigma; nullptr if none.
Definition Wavefunction.hpp:218
std::string coreConfiguration_nice() const
Returns core configuration, in nice output notation.
Definition Wavefunction.hpp:262
void formSpectrum(const SplineBasis::Parameters ¶ms)
Calculates + populates Spectrum [see BSplineBasis].
Definition Wavefunction.cpp:502
const std::vector< CI::PsiJPi > & CIwfs() const
CI solutions, one for each {J, parity}; empty unless CI was run.
Definition Wavefunction.hpp:159
void set_HF(HF::Method method=HF::Method::HartreeFock, const std::string &in_core="", std::optional< HF::Breit::Params > breit_params=std::nullopt, double eps_HF=1.0e-14, bool print=true)
Initialises HF object and populates core orbitals.
Definition Wavefunction.cpp:122
const std::vector< DiracSpinor > & valence() const
Valence orbitals (HF or Brueckner orbitals)
Definition Wavefunction.hpp:139
std::shared_ptr< const Grid > grid_sptr() const
Copy of shared_ptr to grid [shared resource].
Definition Wavefunction.hpp:112
void printCore() const
Prints table of core orbitals + energies etc.
Definition Wavefunction.cpp:382
bool isInCore(int n, int k) const
Check if a state (n, kappa) is in the core list.
Definition Wavefunction.cpp:268
std::string atom() const
String of atom info (e.g., "Cs, Z=55 A=133")
Definition Wavefunction.hpp:267
double alpha() const
Local value of fine-structure constant.
Definition Wavefunction.hpp:115
double H0ab(const DiracSpinor &Fa, const DiracSpinor &Fb) const
Returns <a|H|b> for Hamiltonian H (NOT Sigma, Breit, or exchange).
Definition Wavefunction.cpp:806
const HF::HartreeFock * vHF() const
Returns ptr to Hartree Fock (class); nullptr if not set.
Definition Wavefunction.hpp:193
void ConfigurationInteraction(const IO::InputBlock &input)
Runs the CI+MBPT routines; stores wavefunctions.
Definition Wavefunction.cpp:865
void update_Vnuc(const std::vector< double > &v_new)
Replaces nuclear potential, in both Wavefunction and HartreeFock.
Definition Wavefunction.hpp:586
void fitSigma_hfBrueckner(const std::string &valence_list, const std::vector< double > &fit_energies, bool separate_lambda=false)
First, fits Sigma to energies, then forms fitted Brueckner orbitals.
Definition Wavefunction.cpp:655
const std::vector< double > & vnuc() const
Nuclear potential.
Definition Wavefunction.hpp:190
void hartreeFockBrueckner(const bool print=true)
Forms Brueckner valence orbitals; replaces existing valence states.
Definition Wavefunction.cpp:644
int Ncore() const
Number of electrons in the core.
Definition Wavefunction.cpp:763
const Nuclear::Nucleus & nucleus() const
Returns Nuclear::nucleus object (contains nuc. parameters)
Definition Wavefunction.hpp:124
const std::vector< DiracSpinor > & basis() const
Basis, eigenstates of HF potential. Used for MBPT.
Definition Wavefunction.hpp:151
const QED::RadPot * vrad() const
Pointer to QED radiative potential. May be nullptr.
Definition Wavefunction.hpp:214
double FermiLevel() const
Returns energy location of the "Fermi Level".
Definition Wavefunction.cpp:324
void printBasis(const std::vector< DiracSpinor > &the_basis) const
Prints table of Basis/Spectrum orbitals, compares to HF orbitals.
Definition Wavefunction.cpp:446
double Hab(const DiracSpinor &Fa, const DiracSpinor &Fb) const
Returns <a|H|b>, including exchange, Sigma, and Breit.
Definition Wavefunction.cpp:785
Wavefunction()
Default grid and nucleus (see GridParameters, Nuclear::Nucleus)
Definition Wavefunction.hpp:73
double dalpha2() const
Variation in alpha^2 : x = (alpha/alpha_0)^2 - 1.
Definition Wavefunction.hpp:118
const std::vector< DiracSpinor > & hf_valence() const
HF valence orbitals: copy of valence, as last solved by solve_valence.
Definition Wavefunction.hpp:143
bool isInValence(int n, int k) const
Check if a state (n, kappa) is in the valence list.
Definition Wavefunction.cpp:276
std::string niceCoreOutput(const std::string &full_core)
Given a full electron config., returns nicer format by recognising nobel gas.
Definition AtomData.cpp:199
std::string atomicSymbol(int Z)
e.g., 55 -> "Cs"
Definition AtomData.cpp:65
std::vector< PsiJPi > levels
One entry per {J, parity} requested.
Definition CI_Integrals.hpp:295
Integrals integrals
Integral tables used to construct the CI Hamiltonians.
Definition CI_Integrals.hpp:297
The result of a CI calculation: the solutions, and the integrals used to construct the CI Hamiltonian...
Definition CI_Integrals.hpp:293
Method
Methods available for self-consistant field model.
Definition HartreeFock.hpp:55
Data and useful functions for nuclear properties and potentials. Radii all in Fermi (fm,...
Definition nuclear_data_table.hpp:5
std::vector< T > derivative(const std::vector< T > &f, const std::vector< T > &drdt, const T dt, const int order=1)
Computes the derivative df/dr on a non-uniform grid.
Definition NumCalc_quadIntegrate.hpp:97
constexpr double m_muon
muon mass in atomic units (m_mu/m_e). Codata 2022: 206.768 2827(46)
Definition PhysConst_constants.hpp:39
Constructs spinor/orbital basis using B-splines.
Definition BSplineBasis.cpp:21
std::string int_to_roman(int a)
Converts an integer to a Roman numeral string. Assumes |a| <= 3999.
Definition String.hpp:349
The integral tables required to construct the CI Hamiltonian matrix.
Definition CI_Integrals.hpp:250
Parameters used to construct a Grid.
Definition Grid.hpp:26
Input parameters for B-spline basis construction (see form_basis).
Definition BSplineBasis.hpp:170