High-precision calculations for one- and two-valence atomic systems
SecondOrder.hpp
1#pragma once
2#include "Coulomb/meTable.hpp"
3#include <iostream>
4#include <utility>
5#include <vector>
6class DiracSpinor;
7namespace DiracOperator {
9}
10namespace ExternalField {
11class CorePolarisation;
12class TDHF;
13} // namespace ExternalField
14namespace MBPT {
15class CorrelationPotential;
16}
17
18namespace Amplitudes {
19
20/*!
21 Second-order (in the external field) amplitudes for a single-valence atom.
22
23 For a transition \f$ a \to b \f$ due to two one-body operators, \f$ t \f$
24 (rank \f$ k_t \f$, frequency \f$ \omega \f$) and \f$ s \f$ (rank
25 \f$ k_s \f$, frequency \f$ \omega_s \f$), the amplitude with definite
26 projections \f$ q_1, q_2 \f$ of the two operators is
27
28 \f[
29 A^{k_tk_s}_{q_1q_2} = \sum_n \left[
30 \frac{\matel{b}{t_{q_1}}{n}\matel{n}{s_{q_2}}{a}}{\en_a + \omega_s - \en_n}
31 + \frac{\matel{b}{s_{q_2}}{n}\matel{n}{t_{q_1}}{a}}{\en_a + \omega - \en_n}
32 \right],
33 \f]
34
35 the sum over \f$ n \f$ running over the magnetic quantum numbers too, and
36 \f$ \en_b = \en_a + \omega + \omega_s \f$. The operators are coupled to rank
37 \f$ K \f$, with \f$ Q = q_1+q_2 = m_b-m_a \f$ and \f$ [K] \equiv 2K+1 \f$,
38
39 \f[
40 A^K_Q = \sum_{q_1q_2}\braket{k_tq_1\,k_sq_2}{KQ}\,A^{k_tk_s}_{q_1q_2}
41 = (-1)^{k_t-k_s+Q}\sqrt{[K]}\sum_{q_1q_2}
42 \threej{k_t}{k_s}{K}{q_1}{q_2}{-Q}\,A^{k_tk_s}_{q_1q_2},
43 \f]
44
45 and \f$ A^K \f$ follows from the Wigner-Eckart theorem,
46
47 \f[
48 A^K_Q = (-1)^{j_b-m_b}\threej{j_b}{K}{j_a}{-m_b}{Q}{m_a}\,A^K
49 \qquad {\rm with} \qquad
50 A^K = \sum_n \left[
51 c_1(j_n)\,
52 \frac{\redmatel{b}{t}{n}\redmatel{n}{s}{a}}{\en_a + \omega_s - \en_n}
53 + c_2(j_n)\,
54 \frac{\redmatel{b}{s}{n}\redmatel{n}{t}{a}}{\en_a + \omega - \en_n}
55 \right],
56 \f]
57
58 the coefficients being those of CI::A_K_coefs (evaluated with the
59 single-particle j in place of J), which also gives the sign convention of the
60 coupling and the specific cases; CI::z_component converts \f$ A^K \f$ to the
61 z-component. With \f$ t = s = d \f$ (E1) and \f$ [j] \equiv 2j+1 \f$:
62
63 \f[
64 \alpha_0 = \frac{A^0}{\sqrt{3[j_a]}},
65 \qquad
66 \alpha_2 = -\sqrt{\frac{2j(2j-1)}{3(j+1)(2j+1)(2j+3)}}\;A^2,
67 \qquad
68 \beta = \frac{A^1}{\sqrt{2}\,\redmatel{b}{\bm\sigma}{a}},
69 \f]
70
71 for \f$ K = 0, 2, 1 \f$ (\f$ \alpha_2 \f$ requires
72 \f$ j_b = j_a = j \ge 1 \f$), and with \f$ t = d \f$, \f$ s = h_W \f$ (PNC,
73 \f$ k_s = 0 \f$, so \f$ K = 1 \f$),
74
75 \f[
76 E_{\rm PNC} = A^1_0
77 = (-1)^{j_b-m}\threej{j_b}{1}{j_a}{-m}{0}{m}\,A^1 .
78 \f]
79
80 This is the single-valence analogue of CI::A_K; it covers static, dynamic,
81 and transition polarisabilities (\f$ t = s = E1 \f$), and PNC amplitudes
82 (\f$ s \f$ = PNC operator).
83
84 Two methods are provided for the valence sum: sum-over-states (SOS) over a
85 given spectrum, and mixed states (MS, solving the inhomogeneous equation via
86 ExternalField::TDHF), which is complete (no truncation of the sum). The
87 contribution of core excitations (closed core: K = 0, diagonal only) is
88 likewise available both ways. SOS and MS must agree (to basis completeness);
89 the comparison is a strong check on the numerics.
90*/
91
92//! Is rank K allowed: triangle rules for the operators (kt, ks) and states
93[[nodiscard]] bool allowed_K(int K, int kt, int ks, int twoJb, int twoJa);
94
95//! The smallest rank K allowed for the amplitude; negative if there is none
96[[nodiscard]] int smallest_allowed_K(int kt, int ks, int twoJb, int twoJa);
97
98/*!
99 @brief Valence part of the second-order amplitude A^K, by sum-over-states.
100 @details
101 Evaluates the sum above directly over the states of @p spectrum.
102
103 If the spectrum contains states below the Fermi level (e.g.
104 Wavefunction::spectrum() does), the core-valence (Pauli blocking) part of
105 the amplitude is included automatically through those terms, as in the
106 polarisability module. The polarisation of the closed core is separate:
107 see @ref sos_core.
108
109 Matrix elements: taken from @p t_me / @p s_me if present in the table,
110 otherwise calculated directly as \f$ \redmatel{}{h}{} + \delta V \f$. The
111 tables (if given) should be formed at the operator's frequency, and may
112 contain RPA and structure radiation. RPA enters on both vertices.
113
114 @param K Rank of the amplitude.
115 @param Fb,Fa Final and initial valence states.
116 @param t,s The two operators.
117 @param omega Frequency of t. For a real transition carried entirely by t
118 this is e_b - e_a, and s is static.
119 @param omega_s Frequency of s. Energy conservation requires
120 omega + omega_s = e_b - e_a; it is -omega for a dynamic
121 polarisability (b = a).
122 @param spectrum Intermediate states summed over.
123 @param dVt,dVs RPA for each operator, solved at the frequency of that
124 operator. May be nullptr. Ignored for table entries.
125 @param t_me,s_me Optional tables of single-particle reduced matrix
126 elements; empty (default) to calculate directly.
127 @return \f$ A^K \f$ (valence part).
128
129 @note Degenerate denominators arise for even-parity operator pairs (an
130 intermediate state degenerate with \f$ \en_a + \omega \f$; e.g.
131 n = a for a static diagonal amplitude). Such terms diverge, and
132 nothing is skipped here: remove the offending states from the sum
133 and treat them separately (cf. the project-out treatment in the
134 pnc module).
135*/
136[[nodiscard]] double
137sos_valence(int K, const DiracSpinor &Fb, const DiracSpinor &Fa,
139 const DiracOperator::TensorOperator *s, double omega,
140 double omega_s, const std::vector<DiracSpinor> &spectrum,
141 const ExternalField::CorePolarisation *dVt = nullptr,
142 const ExternalField::CorePolarisation *dVs = nullptr,
143 const Coulomb::meTable<double> &t_me = {},
144 const Coulomb::meTable<double> &s_me = {});
145
146/*!
147 @brief Contribution to A^K from the polarisation of the closed core, by
148 sum-over-states.
149 @details
150 Delegates to CI::A_K_core, which is the same quantity: a core electron
151 excited by one operator and de-excited by the other,
152
153 \f[
154 A^0_{\rm core} = \sqrt{[J]}\sum_c \sqrt{[j_c]} \sum_m \left[
155 c_1\,\frac{\redmatel{c}{t}{m}\redmatel{m}{s}{c}}{\en_c+\omega_s-\en_m}
156 + c_2\,\frac{\redmatel{c}{s}{m}\redmatel{m}{t}{c}}{\en_c+\omega-\en_m}
157 \right].
158 \f]
159
160 Non-zero only for K = 0 (closed core), which requires kt = ks, and only
161 for a diagonal amplitude (b = a); the caller is responsible for the
162 diagonal condition.
163
164 @param K Rank; zero returned unless K = 0.
165 @param twoJ 2J of the valence state (the sqrt([J]) prefactor).
166 @param t,s The two operators.
167 @param omega,omega_s Frequency of each operator; see @ref sos_valence.
168 @param core Core states c.
169 @param excited Particle states m: basis states above the Fermi level.
170 @param dVt,dVs RPA for each operator. May be nullptr.
171 @return \f$ A^0_{\rm core} \f$.
172
173 @note RPA enters once: of the two matrix elements, only the one acting on
174 the core orbital is dressed (see the note on CI::A_K_core).
175*/
176[[nodiscard]] double
177sos_core(int K, int twoJ, const DiracOperator::TensorOperator *t,
178 const DiracOperator::TensorOperator *s, double omega, double omega_s,
179 const std::vector<DiracSpinor> &core,
180 const std::vector<DiracSpinor> &excited,
181 const ExternalField::CorePolarisation *dVt = nullptr,
182 const ExternalField::CorePolarisation *dVs = nullptr);
183
184/*!
185 @brief Valence part of the second-order amplitude A^K, evaluated with
186 mixed states (TDHF method).
187 @details
188 The sums over intermediate states are performed with mixed states
189 (solutions of the inhomogeneous Dirac equation, via
190 ExternalField::TDHF::solve_dPsi), so they are complete: no truncation of
191 the spectrum. All intermediate states of a given kappa share the same
192 angular coefficient, so one mixed state per kappa channel per term is
193 required.
194
195 Each sum is formed in two independent ways: with the mixed states of
196 \f$ s \f$, and with those of \f$ t \f$, returned as the two elements of
197 the pair. They must agree; the difference is a check on the numerics
198 (cf. CI::A_K).
199
200 RPA enters on both vertices: the mixed states are solved with
201 \f$ t + \delta V \f$ (the inner vertex), and the outer matrix element is
202 dressed with the \f$ \delta V \f$ of the outer operator. With RPA not
203 solved, \f$ \delta V = 0 \f$ and the amplitude is at the HF level.
204
205 @param K Rank of the amplitude.
206 @param Fb,Fa Final and initial valence states.
207 @param t,s The two operators.
208 The core-valence (Pauli blocking) part of the sum is included (the mixed
209 states are complete). It may be separated by projecting the mixed states
210 onto the span of the core states: pass the HF core as @p project_onto to
211 obtain just that part (cf. the orthogonality treatment in the pnc module).
212
213 @param omega,omega_s Frequency of each operator; see @ref sos_valence.
214 @param dVt,dVs TDHF object for each operator (required, not null): it
215 provides the mixed-state solver even when RPA is off
216 (unsolved TDHF gives dV = 0). Solve at the operator's
217 frequency for RPA. Must be TDHF (or TDHFbasis): the
218 diagram method cannot drive mixed states.
219 @param Sigma Optional correlation potential, included in the
220 mixed-state solutions (use with Brueckner valence states).
221 @param project_onto If non-empty, each mixed state is projected onto the
222 span of these states before the outer matrix element; pass
223 the HF core for the core-valence part of the amplitude.
224 Empty (default): the full sum.
225 @param outstream Stream for warnings.
226 @return The two evaluations of \f$ A^K \f$: with the mixed states of s,
227 and with those of t.
228
229 @note If an intermediate state is degenerate with a denominator, the
230 mixed-state equation is singular and the amplitude divergent. This
231 cannot happen for odd-parity operators (the intermediate states
232 have opposite parity to a and b); see the note on CI::A_K.
233*/
234[[nodiscard]] std::pair<double, double>
235ms_valence(int K, const DiracSpinor &Fb, const DiracSpinor &Fa,
237 const DiracOperator::TensorOperator *s, double omega, double omega_s,
238 const ExternalField::TDHF *dVt, const ExternalField::TDHF *dVs,
239 const MBPT::CorrelationPotential *Sigma = nullptr,
240 const std::vector<DiracSpinor> &project_onto = {},
241 std::ostream &outstream = std::cout);
242
243/*!
244 @brief Contribution to A^K from the polarisation of the closed core,
245 evaluated with mixed states.
246 @details
247 As @ref sos_core, with the sum over excited states m performed with mixed
248 states of the core orbitals (generalises the TDHF core polarisability of
249 the polarisability module to two operators). Non-zero only for K = 0 and
250 a diagonal amplitude (caller's responsibility).
251
252 RPA enters once, through the mixed-state solve (the vertex acting on the
253 core orbital); the outer matrix element is bare - the same counting as
254 @ref sos_core.
255
256 The mixed states of a core orbital include (occupied) core intermediate
257 states; for the diagonal amplitude (omega_s = -omega) their contributions
258 cancel in the sum over the core, so this agrees with @ref sos_core, which
259 sums over excited states only.
260
261 @param K Rank; zero returned unless K = 0.
262 @param twoJ 2J of the valence state.
263 @param t,s The two operators.
264 @param omega,omega_s Frequency of each operator.
265 @param core Core states c.
266 @param dVt,dVs TDHF object for each operator (required); see
267 @ref ms_valence.
268 @param Sigma Optional correlation potential for the mixed states. The
269 intermediate states here are core excitations, for which
270 the valence Sigma is not appropriate: normally nullptr
271 (matching @ref sos_core, which uses the HF basis).
272 @return \f$ A^0_{\rm core} \f$.
273*/
274[[nodiscard]] double
275ms_core(int K, int twoJ, const DiracOperator::TensorOperator *t,
276 const DiracOperator::TensorOperator *s, double omega, double omega_s,
277 const std::vector<DiracSpinor> &core, const ExternalField::TDHF *dVt,
278 const ExternalField::TDHF *dVs,
279 const MBPT::CorrelationPotential *Sigma = nullptr);
280
281} // namespace Amplitudes
Look-up table for matrix elements. Note: does not assume any symmetry: (a,b) is stored independantly ...
Definition meTable.hpp:17
General tensor operator (virtual base class); all single-particle (one-body) tenosor operators derive...
Definition TensorOperator.hpp:198
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:44
Virtual base class for core-polarisation (RPA); computes dV corrections.
Definition CorePolarisation.hpp:145
Uses TDHF to include core-polarisation (RPA) corrections to matrix elements of an external field oper...
Definition TDHF.hpp:59
Physical amplitudes and observables (matrix elements, second-order amplitudes); testable functions,...
Definition MatrixElements.cpp:15
bool allowed_K(int K, int kt, int ks, int twoJb, int twoJa)
Is rank K allowed: triangle rules for the operators (kt, ks) and states.
Definition SecondOrder.cpp:18
double sos_valence(int K, const DiracSpinor &Fb, const DiracSpinor &Fa, const DiracOperator::TensorOperator *t, const DiracOperator::TensorOperator *s, double omega, double omega_s, const std::vector< DiracSpinor > &spectrum, const ExternalField::CorePolarisation *dVt, const ExternalField::CorePolarisation *dVs, const Coulomb::meTable< double > &t_me, const Coulomb::meTable< double > &s_me)
Valence part of the second-order amplitude A^K, by sum-over-states.
Definition SecondOrder.cpp:45
double ms_core(int K, int twoJ, const DiracOperator::TensorOperator *t, const DiracOperator::TensorOperator *s, double omega, double omega_s, const std::vector< DiracSpinor > &core, const ExternalField::TDHF *dVt, const ExternalField::TDHF *dVs, const MBPT::CorrelationPotential *Sigma)
Contribution to A^K from the polarisation of the closed core, evaluated with mixed states.
Definition SecondOrder.cpp:215
int smallest_allowed_K(int kt, int ks, int twoJb, int twoJa)
The smallest rank K allowed for the amplitude; negative if there is none.
Definition SecondOrder.cpp:24
double sos_core(int K, int twoJ, const DiracOperator::TensorOperator *t, const DiracOperator::TensorOperator *s, double omega, double omega_s, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const ExternalField::CorePolarisation *dVt, const ExternalField::CorePolarisation *dVs)
Contribution to A^K from the polarisation of the closed core, by sum-over-states.
Definition SecondOrder.cpp:88
std::pair< double, double > ms_valence(int K, const DiracSpinor &Fb, const DiracSpinor &Fa, const DiracOperator::TensorOperator *t, const DiracOperator::TensorOperator *s, double omega, double omega_s, const ExternalField::TDHF *dVt, const ExternalField::TDHF *dVs, const MBPT::CorrelationPotential *Sigma, const std::vector< DiracSpinor > &project_onto, std::ostream &outstream)
Valence part of the second-order amplitude A^K, evaluated with mixed states (TDHF method).
Definition SecondOrder.cpp:120
Dirac operators: TensorOperator base class and derived implementations for single-particle (one-body)...
Definition SecondOrder.hpp:7
Core-polarisation (RPA) corrections to matrix elements of an external field.
Definition MatrixElements.hpp:9
Many-body perturbation theory.
Definition MatrixElements.hpp:12