ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
Loading...
Searching...
No Matches
p.hpp
1#pragma once
2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5#include "qip/Vector.hpp"
6
7namespace DiracOperator {
8
9//==============================================================================
10
11class p final : public TensorOperator {
12public:
13 p() : TensorOperator(1, Parity::odd, 1.0, {}, 0, Realness::imaginary) {}
14 std::string name() const override final { return "p"; }
15 std::string units() const override final { return "i au"; }
16
17 double angularF(const int ka, const int kb) const override final {
18 return -1.0 * Angular::Ck_kk(1, ka, kb);
19 }
20
21 double angularCff(int, int) const override final { return 1.0; }
22 double angularCgg(int, int) const override final { return 1.0; }
23 double angularCfg(int, int) const override final { return 0.0; }
24 double angularCgf(int, int) const override final { return 0.0; }
25
26 virtual DiracSpinor radial_rhs(const int kappa_a,
27 const DiracSpinor &Fb) const override final {
28 // {(f' + eta/r f) , (g' + xi/r g)}
29 const auto kappa_b = Fb.kappa();
30 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
31
32 // const double eta = (kappa_a == kappa_b + 1) ? kappa_a : -kappa_b;
33 // const double xi = (kappa_a == kappa_b + 1) ? kappa_b : -kappa_a;
34
35 const auto la = Angular::l_k(kappa_a);
36 const auto lb = Fb.l();
37 const auto lta = Angular::l_k(-kappa_a);
38 const auto ltb = Angular::l_k(-kappa_b);
39 const double eta = (la == lb - 1) ? lb : -lb - 1;
40 const double xi = (lta == ltb - 1) ? ltb : -ltb - 1;
41
42 const auto &gr = Fb.grid();
43 const auto df = NumCalc::derivative(Fb.f(), gr.drdu(), gr.du(), 1);
44 const auto dg = NumCalc::derivative(Fb.g(), gr.drdu(), gr.du(), 1);
45
46 using namespace qip::overloads;
47 dF.f() = df + eta * (Fb.f() / gr.r());
48 dF.g() = dg + xi * (Fb.g() / gr.r());
49 dF.max_pt() = Fb.max_pt(); //?
50 return dF;
51 }
52
53 virtual double radialIntegral(const DiracSpinor &Fa,
54 const DiracSpinor &Fb) const override final {
55 // nb: faster not to do this, but nicer this way
56 return Fa * radial_rhs(Fa.kappa(), Fb);
57 }
58};
59
60//==============================================================================
61inline std::unique_ptr<DiracOperator::TensorOperator>
62generate_p(const IO::InputBlock &input, const Wavefunction &) {
63 input.check({{"", "no input"}});
64 if (input.has_option("help")) {
65 return nullptr;
66 }
67 return std::make_unique<DiracOperator::p>();
68}
69
70} // namespace DiracOperator
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
int kappa() const
Dirac quantum number, kappa.
Definition DiracSpinor.hpp:84
Holds list of Options, and a list of other InputBlocks. Can be initialised with a list of options,...
Definition InputBlock.hpp:142
bool check(std::initializer_list< std::string > blocks, const std::vector< std::pair< std::string, std::string > > &list, bool print=false) const
Check all the options and blocks in this; if any of them are not present in 'list',...
Definition InputBlock.hpp:594
bool has_option(std::string_view key) const
Check is option is present (even if not set) in current block.
Definition InputBlock.hpp:201
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:36
constexpr int l_k(int ka)
returns l given kappa
Definition Wigner369j.hpp:43
double Ck_kk(int k, int ka, int kb)
Reduced (relativistic) angular ME: <ka||C^k||kb> [takes k and kappa].
Definition Wigner369j.hpp:298
Dirac Operators: General + derived.
Definition GenerateOperator.cpp:12
namespace qip::overloads provides operator overloads for std::vector
Definition Vector.hpp:450