2#include "DiracOperator/Operators/hfs.hpp"
3#include "DiracOperator/TensorOperator.hpp"
4#include "IO/InputBlock.hpp"
5#include "Physics/PhysConst_constants.hpp"
6#include "Potentials/FGRadPot.hpp"
7#include "Wavefunction/Wavefunction.hpp"
8#include "qip/Vector.hpp"
19 std::string
name() const override final {
return "Vrad"; }
20 std::string
units() const override final {
return "au"; }
24 auto dF = m_Vrad.
Vel(Fb.l()) * Fb;
26 const auto &Hmag = m_Vrad.
Hmag(Fb.l());
27 dF.f() -= Hmag * Fb.g();
28 dF.g() -= Hmag * Fb.f();
29 if (kappa_a != Fb.kappa())
40 const QED::RadPot &RadPot()
const {
return m_Vrad; }
42 static std::unique_ptr<TensorOperator> generate(
const IO::InputBlock &input,
45 {{{
"Ueh",
" Uehling (vacuum pol). [1.0]"},
46 {
"SE_h",
" self-energy high-freq electric. [1.0]"},
47 {
"SE_l",
" self-energy low-freq electric. [1.0]"},
48 {
"SE_m",
" self-energy magnetic. [1.0]"},
49 {
"WK",
" Wickman-Kroll. [0.0]"},
50 {
"rcut",
"Maximum radius (au) to calculate Rad Pot for [5.0]"},
51 {
"scale_rN",
"Scale factor for Nuclear size. 0 for pointlike, 1 for "
53 {
"scale_l",
"List of doubles. Extra scaling factor for each l e.g., "
54 "1,0,1 => include for s and d, but not for p [1.0]"},
55 {
"readwrite",
"Read/write potential? [true]"}}});
58 const auto x_Ueh = input.
get(
"Ueh", 1.0);
59 const auto x_SEe_h = input.
get(
"SE_h", 1.0);
60 const auto x_SEe_l = input.
get(
"SE_l", 1.0);
61 const auto x_SEm = input.
get(
"SE_m", 1.0);
62 const auto x_wk = input.
get(
"WK", 0.0);
63 const auto rcut = input.
get(
"rcut", 5.0);
64 const auto scale_rN = input.
get(
"scale_rN", 1.0);
65 const auto x_spd = input.
get(
"scale_l", std::vector{1.0});
66 const auto readwrite = input.
get(
"readwrite",
true);
68 std::sqrt(5.0 / 3.0) * scale_rN * wf.
nucleus().r_rms() / PhysConst::aB_fm;
70 {x_Ueh, x_SEe_h, x_SEe_l, x_SEm, x_wk}, x_spd,
true,
72 return std::make_unique<Vrad>(std::move(qed));
102 h0->
imaginaryQ() ? Realness::imaginary : Realness::real,
106 std::string
name() const override final {
107 return m_h0->
name() +
"_vertexQED";
109 std::string
units() const override final {
return m_h0->
units(); }
111 double angularF(
const int ka,
const int kb)
const override final {
137 static double a(
double z) {
return 1.0 + 28.5 / z; }
147 std::vector<double> v = {}) {
155 for (
auto i = 0ul; i < rgrid.
num_points(); ++i) {
156 auto exp =
a * a0 * std::exp(-b * rgrid.
r(i) / a0);
171 h0->
getc(), MLVP_func(rgrid, rN, h0->
getv()),
176 std::string
name() const override final {
return "MLVP"; }
177 std::string
units() const override final {
return m_h0.
units(); }
179 double angularF(
const int ka,
const int kb)
const override final {
202 static std::vector<double> MLVP_func(
const Grid &rgrid,
double rN,
203 std::vector<double> v = {}) {
212 for (
auto i = 0ul; i < rgrid.
num_points(); ++i) {
221 static std::unique_ptr<TensorOperator> generate(
const IO::InputBlock &input,
225 "Nuclear radius (in fm), for finite-nuclear size "
226 "correction to Uehling loop. If not given, taken from wavefunction."},
228 "Options for hyperfine operator that sits inside the MLVP operator. "
229 " [see `ampsci -o hfs`]."}});
233 const auto t_options = input.
getBlock(
"hfs_options");
237 input.
get(
"rN", std::sqrt(5.0 / 3.0) * wf.
nucleus().r_rms());
238 if (oper_options.get(
"print",
true)) {
239 std::cout <<
"\nGenerate MLVP operator for hfs, with parameters:\n";
241 std::cout <<
"Using finite nuclear charge in Uehling loop, with rN="
242 << rN_fm <<
" fm.\n";
244 std::cout <<
"Using pointlike Uehling loop.\n";
246 const auto h = hfs::generate(oper_options, wf);
247 const auto r_N_au = rN_fm / PhysConst::aB_fm;
Magnetic loop vacuum polarisation (Uehling vertex)
Definition QED.hpp:165
std::string units() const override final
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition QED.hpp:177
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition QED.hpp:176
double angularCgf(int ka, int kb) const override final
Angular coefficient C_gf for the g_a*f_b term of the radial integral.
Definition QED.hpp:191
double angularCff(int ka, int kb) const override final
Angular coefficient C_ff for the f_a*f_b term of the radial integral.
Definition QED.hpp:182
double angularCgg(int ka, int kb) const override final
Angular coefficient C_gg for the g_a*g_b term of the radial integral.
Definition QED.hpp:185
MLVP(const DiracOperator::hfs *const h0, const Grid &rgrid, double rN)
rN is nuclear (charge) radius, in atomic units
Definition QED.hpp:169
double angularCfg(int ka, int kb) const override final
Angular coefficient C_fg for the f_a*g_b term of the radial integral.
Definition QED.hpp:188
double angularF(const int ka, const int kb) const override final
Angular factor A_ab linking the radial integral to the RME.
Definition QED.hpp:179
Rank-0 (scalar) tensor operator; derives from TensorOperator with k=0.
Definition TensorOperator.hpp:561
General tensor operator (virtual base class); all single-particle (one-body) tenosor operators derive...
Definition TensorOperator.hpp:198
virtual double angularCgf(int, int) const
Angular coefficient C_gf for the g_a*f_b term of the radial integral.
Definition TensorOperator.hpp:381
bool freqDependantQ() const
Returns true if the operator is frequency-dependent (requires updateFrequency() calls).
Definition TensorOperator.hpp:261
bool imaginaryQ() const
returns true if operator is imaginary (has imag MEs)
Definition TensorOperator.hpp:324
virtual std::string units() const
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition TensorOperator.hpp:342
int parity() const
returns parity, as integer (+1 or -1)
Definition TensorOperator.hpp:330
virtual double angularF(const int, const int) const =0
Angular factor A_ab linking the radial integral to the RME.
virtual double angularCfg(int, int) const
Angular coefficient C_fg for the f_a*g_b term of the radial integral.
Definition TensorOperator.hpp:379
virtual std::string name() const
Returns "name" of operator (e.g., 'E1')
Definition TensorOperator.hpp:340
double getc() const
Returns the "overall" constant c.
Definition TensorOperator.hpp:321
virtual double angularCgg(int, int) const
Angular coefficient C_gg for the g_a*g_b term of the radial integral.
Definition TensorOperator.hpp:377
virtual double angularCff(int kappa_a, int kappa_b) const
Angular coefficient C_ff for the f_a*f_b term of the radial integral.
Definition TensorOperator.hpp:372
int rank() const
Rank k of operator.
Definition TensorOperator.hpp:327
const std::vector< double > & getv() const
Returns a const ref to the stored vector v.
Definition TensorOperator.hpp:318
Effective VertexQED operator.
Definition QED.hpp:95
double angularCff(int ka, int kb) const override final
Angular coefficient C_ff for the f_a*f_b term of the radial integral.
Definition QED.hpp:115
static std::vector< double > vertex_func(const Grid &rgrid, double a, double b, std::vector< double > v={})
Takes existing radial vector, multiplies by:
Definition QED.hpp:146
double angularCgg(int ka, int kb) const override final
Angular coefficient C_gg for the g_a*g_b term of the radial integral.
Definition QED.hpp:118
std::string units() const override final
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition QED.hpp:109
double angularCfg(int ka, int kb) const override final
Angular coefficient C_fg for the f_a*g_b term of the radial integral.
Definition QED.hpp:121
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition QED.hpp:106
static double a(double z)
Fitting factor for hyperfine. Default a(Z)
Definition QED.hpp:137
double angularCgf(int ka, int kb) const override final
Angular coefficient C_gf for the g_a*f_b term of the radial integral.
Definition QED.hpp:124
double angularF(const int ka, const int kb) const override final
Angular factor A_ab linking the radial integral to the RME.
Definition QED.hpp:111
Flambaum-Ginges radiative potential operator.
Definition QED.hpp:15
virtual double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial integral R_ab, defined by RME = angularF(a,b) * radialIntegral(a,b).
Definition QED.hpp:34
std::string units() const override final
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition QED.hpp:20
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition QED.hpp:19
virtual DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
Computes the right-hand spinor dF_b for the radial integral.
Definition QED.hpp:22
Generalised hyperfine-structure operator, including relevant nuclear moment.
Definition hfs.hpp:270
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
const std::vector< double > & r() const
Full grid vector r.
Definition Grid.hpp:131
auto num_points() const
Number of grid points.
Definition Grid.hpp:120
Constructs and stores the Flambaum-Ginges QED Radiative Potential.
Definition RadPot.hpp:16
std::vector< double > Vel(int l=0) const
Returns entire electric part of potential.
Definition RadPot.cpp:155
std::vector< double > Hmag(int) const
Returns H_mag (magnetic self-energy form vactor)
Definition RadPot.cpp:164
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:37
const Grid & grid() const
Returns a const reference to the radial grid.
Definition Wavefunction.hpp:82
int Znuc() const
Nuclear charge, Z.
Definition Wavefunction.hpp:99
const std::string & run_label() const
Atomic symbol, including core ionisation degree and run_label.
Definition Wavefunction.hpp:205
const Nuclear::Nucleus & nucleus() const
Returns Nuclear::nucleus object (contains nuc. parameters)
Definition Wavefunction.hpp:97
Dirac operators: TensorOperator base class and derived implementations for single-particle (one-body)...
Definition GenerateOperator.cpp:6
Parity
Parity of operator.
Definition TensorOperator.hpp:57
Realness
Specifies whether an operator's matrix elements are real or imaginary.
Definition TensorOperator.hpp:70
double Q_MLVP(double r, double rN)
Magnetic-loop vacuum polarisation, includes finite-nuclear size.
Definition FGRadPot.cpp:280
constexpr double alpha
Fine-structure constant: alpha = 1/137.035 999 177(21) [CODATA 2022].
Definition PhysConst_constants.hpp:24
Operator overloads for std::vector.
Definition Vector.hpp:503