ampsci
High-precision calculations for one- and two-valence atomic systems
RadialF.hpp
1#pragma once
2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5
6namespace DiracOperator {
7
8//! @brief General function of r, even scalar operator
9//! @details Pass only grid to just get r, or either pass a lambda/function
10//! [f(r)], or a number, n, (for r^n).
11class RadialF final : public ScalarOperator {
12 // = some function of r
13 // Pass only grid to just get r, or
14 // either pass a lambda/function [f(r)], or a number, n, (for r^n)
15 // Explicitely even with rank 0, so ...
16private:
17 std::vector<double> fillVec(const Grid &gr,
18 const std::function<double(double)> &f) {
19 std::vector<double> f_r;
20 f_r.reserve(gr.num_points());
21 for (auto r : gr.r())
22 f_r.push_back(f(r));
23 return f_r;
24 }
25
26public:
27 RadialF(const Grid &rgrid, const std::function<double(double)> &f)
28 : ScalarOperator(Parity::even, 1.0, fillVec(rgrid, f)) {}
29 RadialF(const Grid &rgrid, const double n)
30 : ScalarOperator(Parity::even, 1.0,
31 fillVec(rgrid, [n](double r) { return std::pow(r, n); })) {
32 }
33 std::string name() const override final { return "RadialFunction"; }
34 std::string units() const override final { return "au"; }
35 static std::unique_ptr<TensorOperator> generate(const IO::InputBlock &input,
36 const Wavefunction &wf) {
37 input.check({{"power", "Power (real) for r^k"}});
38 if (input.has_option("help"))
39 return nullptr;
40 const auto power = input.get("power", 1.0);
41 std::cout << "r^(" << power << ")\n";
42 return std::make_unique<RadialF>(wf.grid(), power);
43 }
44};
45
46} // namespace DiracOperator
General function of r, even scalar operator.
Definition RadialF.hpp:11
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition RadialF.hpp:33
std::string units() const override final
Returns units of operator as a string (usually au, may be MHz, etc.)
Definition RadialF.hpp:34
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
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
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
Dirac operators: TensorOperator base class and derived implementations for single-particle (one-body)...
Definition GenerateOperator.cpp:6