ampsci
High-precision calculations for one- and two-valence atomic systems
PNC.hpp
1#pragma once
2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5
6namespace DiracOperator {
7
8//==============================================================================
9//! @brief Nuclear-spin independent PNC operator (Qw)
10/*! @details
11 \f[
12 h_{PNCnsi} = -\frac{G_F \, Q_W}{2\sqrt{2}} \, \rho(r) \, \gamma^5.
13 \f]
14 \f[
15 h_{PNCnsi} = \frac{G_F \, Q_W}{2\sqrt{2}} \, \rho(r) \, \gamma_5.
16 \f]
17
18 - Ouput is in units of (Qw * 1.e-11.) by default. To get (Qw/-N), multiply
19 by (-N) [can go into optional 'factor']
20
21 Scalar, ME = Radial integral (F'|h|F)
22 \f[
23 (F'|h|F) = -\frac{G_F \, Q_W}{2\sqrt{2}}\int (f'g - g'f) rho(r) dr
24 \f]
25
26 Generates rho(r) according to fermi distribution, given c and t [c and t in
27 FERMI / femptometers].
28*/
29class PNCnsi final : public ScalarOperator {
30public:
31 PNCnsi(double c, double t, const Grid &rgrid, double factor = 1.0,
32 const std::string &in_units = "iQw*e-11")
33 : ScalarOperator(Parity::odd, factor * PhysConst::GFe11 / std::sqrt(8.0),
34 Nuclear::fermiNuclearDensity_tcN(t, c, 1.0, rgrid),
35 {0, -1, +1, 0}, Realness::imaginary),
36 m_unit(in_units) {}
37
38 std::string name() const override final { return "pnc-nsi"; }
39 std::string units() const override final { return m_unit; }
40
41 static std::unique_ptr<TensorOperator> generate(const IO::InputBlock &input,
42 const Wavefunction &wf) {
43 input.check(
44 {{{"c",
45 "Half-density radius for Fermi rho(r). [defaut: from wavefunction]"},
46 {"t", "skin thickness [2.3]"},
47 {"N", "Neutron number, for units [default: from wavefunction]"},
48 {"print", "Write details to screen [true]"}}});
49 if (input.has_option("help"))
50 return nullptr;
51 const auto r_rms = wf.get_rrms();
52 const auto c = input.get("c", Nuclear::c_hdr_formula_rrms_t(r_rms));
53 const auto t = input.get("t", Nuclear::default_t);
54 const auto N = input.get("N", wf.Anuc() - wf.Znuc());
55 std::string units =
56 N == 1 ? "i(-Qw)e-11" : "i(-Qw/" + std::to_string(N) + ")e-11";
57 if (input.get("print", true))
58 std::cout << "pnc: with c=" << c << ", t=" << t << " [" << units << "]\n";
59 return std::make_unique<PNCnsi>(c, t, wf.grid(), -1.0 * N, "units");
60 }
61
62private:
63 const std::string m_unit{"iQw*e-11"};
64};
65
66} // namespace DiracOperator
Nuclear-spin independent PNC operator (Qw)
Definition PNC.hpp:29
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition PNC.hpp:38
std::string units() const override final
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition PNC.hpp:39
Rank-0 (scalar) tensor operator; derives from TensorOperator with k=0.
Definition TensorOperator.hpp:561
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
Holds a named list of key=value options and nested InputBlocks.
Definition InputBlock.hpp:154
bool check(std::initializer_list< std::string > blocks, const std::vector< std::pair< std::string, std::string > > &list, bool print=false) const
Validates options and sub-blocks against an allowed list.
Definition InputBlock.hpp:649
bool has_option(std::string_view key) const
Returns true if key is present in this block's option list, even if unset.
Definition InputBlock.hpp:247
T get(std::string_view key, T default_value) const
Returns the value of key, or default_value if not found.
Definition InputBlock.hpp:471
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
int Anuc() const
Nuclear mass number, A.
Definition Wavefunction.hpp:101
double get_rrms() const
Nuclear rms charge radii, in fm (femptometres)
Definition Wavefunction.hpp:103
Dirac operators: TensorOperator base class and derived implementations for single-particle (one-body)...
Definition GenerateOperator.cpp:6
double c_hdr_formula_rrms_t(double rrms, double t)
Calculates c from rrms and t.
Definition NuclearData.cpp:73
std::vector< double > fermiNuclearDensity_tcN(double t, double c, double Z_norm, const Grid &grid)
Fermi charge distribution, rho(r) - normalised to Z_norm.
Definition NuclearPotentials.cpp:319
constexpr double GFe11
Fermi weak constant * 10^11, in atomic units.
Definition PhysConst_constants.hpp:119
constexpr double c
speed of light in a.u. (=1/alpha)
Definition PhysConst_constants.hpp:63