ampsci
High-precision calculations for one- and two-valence atomic systems
CorePolarisation.hpp
1#pragma once
2#include "DiracOperator/TensorOperator.hpp"
3#include "qip/String.hpp"
4#include <cassert>
5#include <string>
6#include <vector>
7class DiracSpinor;
8namespace DiracOperator {
9class TensorOperator;
10}
11
12//! Calculates many-body corrections (RPA) to matrix elements of external field
13namespace ExternalField {
14
15enum class Method { TDHF, basis, diagram, none, Error };
16
17inline Method ParseMethod(std::string_view str) {
18 return qip::ci_compare(str, "TDHF") ? Method::TDHF :
19 qip::ci_compare(str, "true") ? Method::TDHF :
20 qip::ci_compare(str, "default") ? Method::TDHF :
21 qip::ci_compare(str, "basis") ? Method::basis :
22 qip::ci_compare(str, "tdhf_basis") ? Method::basis :
23 qip::ci_compare(str, "tdhfbasis") ? Method::basis :
24 qip::ci_compare(str, "diagram") ? Method::diagram :
25 qip::ci_compare(str, "diagramRPA") ? Method::diagram :
26 qip::ci_compare(str, "rpad") ? Method::diagram :
27 qip::ci_compare(str, "rpa(d)") ? Method::diagram :
28 qip::ci_compare(str, "none") ? Method::none :
29 qip::ci_compare(str, "false") ? Method::none :
30 qip::ci_compare(str, "") ? Method::none :
31 Method::Error;
32}
33
34enum class dPsiType { X, Y };
35enum class StateType { bra, ket }; // lhs, rhs
36
37//! Virtual Core Polarisation class, for <a||dV||b>. See TDHF, DiagramRPA, etc.
39
40protected:
42 : m_h(h), m_rank(h->rank()), m_pi(h->parity()), m_imag(h->imaginaryQ()) {}
43
44protected:
46 double m_core_eps{1.0};
47 int m_core_its{0};
48 double m_core_omega{0.0};
49 int m_rank;
50 int m_pi;
51 bool m_imag;
52
53 double m_eta{0.4};
54 double m_eps{1.0e-10};
55
56public:
57 //! Returns eps (convergance) of last solve_core run
58 double last_eps() const { return m_core_eps; }
59 //! Returns its (# of iterations) of last solve_core run
60 double last_its() const { return m_core_its; }
61 //! Returns omega (frequency) of last solve_core run
62 double last_omega() const { return m_core_omega; }
63 int rank() const { return m_rank; }
64 int parity() const { return m_pi; }
65 bool imagQ() const { return m_imag; }
66
67 //! Convergance target
68 double &eps_target() { return m_eps; }
69 //! Convergance target
70 double eps_target() const { return m_eps; }
71
72 //! Damping factor; 0 means no damping. Must have 0 <= eta < 1
73 double eta() const { return m_eta; }
74 //! Set/update damping factor; 0 means no damping. Must have 0 <= eta < 1
75 void set_eta(double eta) {
76 assert(eta >= 0.0 && eta < 1 && "Must have 0 <= eta < 1");
77 m_eta = eta;
78 }
79
80 //! Returns RPA method
81 virtual Method method() const = 0;
82
83 //! Solve RPA equations (for whichever method) for core.
84 virtual void solve_core(double omega, int max_its = 100,
85 bool print = true) = 0;
86
87 //! @brief Clears the internal state back to pre solve_core()
88 virtual void clear() = 0;
89
90 //! @brief Calculate reduced matrix element <n||dV||m>
91 virtual double dV(const DiracSpinor &Fn, const DiracSpinor &Fm) const = 0;
92
93 //! @brief Calculates reduced right-hand-side, projected onto kappa: [dV|phi_m]_kappa
94 virtual DiracSpinor dV_rhs(int kappa, const DiracSpinor &Fm,
95 bool conj = false) const {
96 // XXX Remove this implementation (make pure virtual) once j_L killed
97 (void)kappa;
98 (void)Fm;
99 (void)conj;
100 assert(false && "This should be made pure virtual");
101 return Fm;
102 }
103
104public:
105 CorePolarisation &operator=(const CorePolarisation &) = delete;
106 CorePolarisation(const CorePolarisation &) = default;
107 virtual ~CorePolarisation() = default;
108};
109
110} // namespace ExternalField
General tensor operator (virtual base class); all single-particle (one-body) tenosor operators derive...
Definition TensorOperator.hpp:197
bool imaginaryQ() const
returns true if operator is imaginary (has imag MEs)
Definition TensorOperator.hpp:323
int parity() const
returns parity, as integer (+1 or -1)
Definition TensorOperator.hpp:329
int rank() const
Rank k of operator.
Definition TensorOperator.hpp:326
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
Virtual Core Polarisation class, for <a||dV||b>. See TDHF, DiagramRPA, etc.
Definition CorePolarisation.hpp:38
virtual void clear()=0
Clears the internal state back to pre solve_core()
virtual double dV(const DiracSpinor &Fn, const DiracSpinor &Fm) const =0
Calculate reduced matrix element <n||dV||m>
virtual DiracSpinor dV_rhs(int kappa, const DiracSpinor &Fm, bool conj=false) const
Calculates reduced right-hand-side, projected onto kappa: [dV|phi_m]_kappa.
Definition CorePolarisation.hpp:94
double last_eps() const
Returns eps (convergance) of last solve_core run.
Definition CorePolarisation.hpp:58
double last_omega() const
Returns omega (frequency) of last solve_core run.
Definition CorePolarisation.hpp:62
void set_eta(double eta)
Set/update damping factor; 0 means no damping. Must have 0 <= eta < 1.
Definition CorePolarisation.hpp:75
double eps_target() const
Convergance target.
Definition CorePolarisation.hpp:70
virtual Method method() const =0
Returns RPA method.
double eta() const
Damping factor; 0 means no damping. Must have 0 <= eta < 1.
Definition CorePolarisation.hpp:73
double last_its() const
Returns its (# of iterations) of last solve_core run.
Definition CorePolarisation.hpp:60
double & eps_target()
Convergance target.
Definition CorePolarisation.hpp:68
virtual void solve_core(double omega, int max_its=100, bool print=true)=0
Solve RPA equations (for whichever method) for core.
Dirac operators: TensorOperator base class and derived implementations for single-particle (one-body)...
Definition GenerateOperator.cpp:3
Calculates many-body corrections (RPA) to matrix elements of external field.
Definition calcMatrixElements.cpp:14
bool ci_compare(std::string_view s1, std::string_view s2)
Case insensitive string compare. Essentially: LowerCase(s1)==LowerCase(s2)
Definition String.hpp:132