ampsci
High-precision calculations for one- and two-valence atomic systems
jls.hpp
1#pragma once
2#include "Angular/Wigner369j.hpp"
3#include "DiracOperator/TensorOperator.hpp"
4#include "IO/InputBlock.hpp"
5#include "Wavefunction/Wavefunction.hpp"
6
7namespace DiracOperator {
8
9//==============================================================================
10//! j (total angular momentum) operator
11class j : public TensorOperator {
12public:
13 j() : TensorOperator(1, Parity::even) {}
14
15 double angularF(const int ka, const int kb) const override final {
16 if (ka != kb)
17 return 0.0;
18 const auto tj = Angular::twoj_k(ka);
19 return std::sqrt(tj * (tj + 2) * (tj + 1)) / 2;
20 }
21 std::string name() const override { return std::string("j"); }
22 std::string units() const override { return "au"; }
23};
24
25//==============================================================================
26//! l (orbital angular momentum) operator
27class l : public TensorOperator {
28public:
29 l() : TensorOperator(1, Parity::even) {}
30
31 double angularF(const int ka, const int kb) const override final {
32 const auto la = Angular::l_k(ka);
33 const auto lb = Angular::l_k(kb);
34 const auto tja = Angular::twoj_k(ka);
35 const auto tjb = Angular::twoj_k(kb);
36 if (la != lb)
37 return 0.0;
38 const auto sign = Angular::neg1pow_2(tjb + 2 * lb - 1);
39 const auto fact =
40 std::sqrt(double((tja + 1) * (tjb + 1) * (2 * la + 1) * la * (la + 1)));
41 const auto sjs = Angular::sixj_2(tjb, tja, 2, 2 * lb, 2 * lb, 1);
42 return sign * fact * sjs;
43 }
44 std::string name() const override { return std::string("l"); }
45 std::string units() const override { return "au"; }
46 static std::unique_ptr<TensorOperator> generate(const IO::InputBlock &input,
47 const Wavefunction &) {
48 input.check({{"no options", ""}});
49 if (input.has_option("help"))
50 return nullptr;
51 return std::make_unique<l>();
52 }
53};
54
55//==============================================================================
56//! s (spin) operator
57class s : public TensorOperator {
58public:
59 s() : TensorOperator(1, Parity::even, 1.0) {}
60
61 double angularF(const int ka, const int kb) const override final {
62 const auto la = Angular::l_k(ka);
63 const auto lb = Angular::l_k(kb);
64 const auto tja = Angular::twoj_k(ka);
65 const auto tjb = Angular::twoj_k(kb);
66 if (la != lb)
67 return 0.0;
68 const auto sign = Angular::neg1pow_2(tja + 2 * lb - 1);
69 const auto fact = std::sqrt((tja + 1) * (tjb + 1) * 1.5);
70 const auto sjs = Angular::sixj_2(tjb, tja, 2, 1, 1, 2 * la);
71 return sign * fact * sjs;
72 }
73 std::string name() const override { return std::string("s"); }
74 std::string units() const override { return "au"; }
75 static std::unique_ptr<TensorOperator> generate(const IO::InputBlock &input,
76 const Wavefunction &) {
77 input.check({{"no options", ""}});
78 if (input.has_option("help"))
79 return nullptr;
80 return std::make_unique<s>();
81 }
82};
83
84} // namespace DiracOperator
General tensor operator (virtual base class); all single-particle (one-body) tenosor operators derive...
Definition TensorOperator.hpp:198
j (total angular momentum) operator
Definition jls.hpp:11
std::string units() const override
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition jls.hpp:22
std::string name() const override
Returns "name" of operator (e.g., 'E1')
Definition jls.hpp:21
double angularF(const int ka, const int kb) const override final
Angular factor A_ab linking the radial integral to the RME.
Definition jls.hpp:15
l (orbital angular momentum) operator
Definition jls.hpp:27
std::string units() const override
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition jls.hpp:45
std::string name() const override
Returns "name" of operator (e.g., 'E1')
Definition jls.hpp:44
double angularF(const int ka, const int kb) const override final
Angular factor A_ab linking the radial integral to the RME.
Definition jls.hpp:31
s (spin) operator
Definition jls.hpp:57
std::string units() const override
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition jls.hpp:74
std::string name() const override
Returns "name" of operator (e.g., 'E1')
Definition jls.hpp:73
double angularF(const int ka, const int kb) const override final
Angular factor A_ab linking the radial integral to the RME.
Definition jls.hpp:61
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
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:37
double sixj_2(int two_j1, int two_j2, int two_j3, int two_j4, int two_j5, int two_j6)
Wigner 6j symbol {j1 j2 j3 | j4 j5 j6}. Inputs are 2*j as integers.
Definition Wigner369j.hpp:431
constexpr int l_k(int ka)
returns l given kappa
Definition Wigner369j.hpp:44
constexpr int neg1pow_2(int two_a)
Evaluates (-1)^{two_a/2} (for integer a; two_a is even)
Definition Wigner369j.hpp:239
constexpr int twoj_k(int ka)
returns 2j given kappa
Definition Wigner369j.hpp:46
Dirac operators: TensorOperator base class and derived implementations for single-particle (one-body)...
Definition GenerateOperator.cpp:6