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, as
113 \f$ \delta V(\omega) \f$ of the operator's own frequency at every
114 vertex (the emission component for a negative frequency; see
115 CorePolarisation::dV), whichever side of the leg the intermediate state
116 lies.
117
118 @param K Rank of the amplitude.
119 @param Fb,Fa Final and initial valence states.
120 @param t,s The two operators.
121 @param omega Frequency of t. For a real transition carried entirely by t
122 this is e_b - e_a, and s is static.
123 @param omega_s Frequency of s. Energy conservation requires
124 omega + omega_s = e_b - e_a; it is -omega for a dynamic
125 polarisability (b = a).
126 @param spectrum Intermediate states summed over.
127 @param dVt,dVs RPA for each operator, solved at the frequency of that
128 operator. May be nullptr. Ignored for table entries.
129 @param t_me,s_me Optional tables of single-particle reduced matrix
130 elements; empty (default) to calculate directly.
131 @return \f$ A^K \f$ (valence part).
132
133 @note Degenerate denominators arise for even-parity operator pairs (an
134 intermediate state degenerate with \f$ \en_a + \omega \f$; e.g.
135 n = a for a static diagonal amplitude). Such terms diverge, and
136 nothing is skipped here: remove the offending states from the sum
137 and treat them separately (cf. the project-out treatment in the
138 pnc module).
139*/
140[[nodiscard]] double
141sos_valence(int K, const DiracSpinor &Fb, const DiracSpinor &Fa,
143 const DiracOperator::TensorOperator *s, double omega,
144 double omega_s, const std::vector<DiracSpinor> &spectrum,
145 const ExternalField::CorePolarisation *dVt = nullptr,
146 const ExternalField::CorePolarisation *dVs = nullptr,
147 const Coulomb::meTable<double> &t_me = {},
148 const Coulomb::meTable<double> &s_me = {});
149
150/*!
151 @brief Contribution to A^K from the polarisation of the closed core, by
152 sum-over-states.
153 @details
154 Delegates to CI::A_K_core, which is the same quantity: a core electron
155 excited by one operator and de-excited by the other,
156
157 \f[
158 A^0_{\rm core} = \sqrt{[J]}\sum_c \sqrt{[j_c]} \sum_m \left[
159 c_1\,\frac{\redmatel{c}{t}{m}\redmatel{m}{s}{c}}{\en_c+\omega_s-\en_m}
160 + c_2\,\frac{\redmatel{c}{s}{m}\redmatel{m}{t}{c}}{\en_c+\omega-\en_m}
161 \right].
162 \f]
163
164 Non-zero only for K = 0 (closed core), which requires kt = ks, and only
165 for a diagonal amplitude (b = a); the caller is responsible for the
166 diagonal condition.
167
168 @param K Rank; zero returned unless K = 0.
169 @param twoJ 2J of the valence state (the sqrt([J]) prefactor).
170 @param t,s The two operators.
171 @param omega,omega_s Frequency of each operator; see @ref sos_valence.
172 @param core Core states c.
173 @param excited Particle states m: basis states above the Fermi level.
174 @param dVt,dVs RPA for each operator. May be nullptr.
175 @return \f$ A^0_{\rm core} \f$.
176
177 @note RPA enters once: of the two matrix elements, only the one acting on
178 the core orbital is dressed (see the note on CI::A_K_core).
179*/
180[[nodiscard]] double
181sos_core(int K, int twoJ, const DiracOperator::TensorOperator *t,
182 const DiracOperator::TensorOperator *s, double omega, double omega_s,
183 const std::vector<DiracSpinor> &core,
184 const std::vector<DiracSpinor> &excited,
185 const ExternalField::CorePolarisation *dVt = nullptr,
186 const ExternalField::CorePolarisation *dVs = nullptr);
187
188/*!
189 @brief Valence part of the second-order amplitude A^K, evaluated with
190 mixed states (TDHF method).
191 @details
192 The sums over intermediate states are performed with mixed states
193 (solutions of the inhomogeneous Dirac equation, via
194 ExternalField::TDHF::solve_dPsi), so they are complete: no truncation of
195 the spectrum. All intermediate states of a given kappa share the same
196 angular coefficient, so one mixed state per kappa channel per term is
197 required.
198
199 Each sum is formed in two independent ways: with the mixed states of
200 \f$ s \f$, and with those of \f$ t \f$, returned as the two elements of
201 the pair. They must agree; the difference is a check on the numerics
202 (cf. CI::A_K).
203
204 RPA enters on both vertices: the mixed states are solved with
205 \f$ t + \delta V \f$ (the inner vertex), and the outer matrix element is
206 dressed with the \f$ \delta V \f$ of the outer operator; each is
207 \f$ \delta V(\omega) \f$ at the frequency of its own operator (cf.
208 @ref sos_valence). With RPA not solved, \f$ \delta V = 0 \f$ and the
209 amplitude is at the HF level.
210
211 @param K Rank of the amplitude.
212 @param Fb,Fa Final and initial valence states.
213 @param t,s The two operators.
214 The core-valence (Pauli blocking) part of the sum is included (the mixed
215 states are complete). It may be separated by projecting the mixed states
216 onto the span of the core states: pass the HF core as @p project_onto to
217 obtain just that part (cf. the orthogonality treatment in the pnc module).
218
219 @param omega,omega_s Frequency of each operator; see @ref sos_valence.
220 @param dVt,dVs TDHF object for each operator (required, not null): it
221 provides the mixed-state solver even when RPA is off
222 (unsolved TDHF gives dV = 0). Solve at the operator's
223 frequency for RPA. Must be TDHF (or TDHFbasis): the
224 diagram method cannot drive mixed states.
225 @param Sigma Optional correlation potential, included in the
226 mixed-state solutions (use with Brueckner valence states).
227 @param project_onto If non-empty, each mixed state is projected onto the
228 span of these states before the outer matrix element; pass
229 the HF core for the core-valence part of the amplitude.
230 Empty (default): the full sum.
231 @param outstream Stream for warnings.
232 @return The two evaluations of \f$ A^K \f$: with the mixed states of s,
233 and with those of t.
234
235 @note If an intermediate state is degenerate with a denominator, the
236 mixed-state equation is singular and the amplitude divergent. This
237 cannot happen for odd-parity operators (the intermediate states
238 have opposite parity to a and b); see the note on CI::A_K.
239*/
240[[nodiscard]] std::pair<double, double>
241ms_valence(int K, const DiracSpinor &Fb, const DiracSpinor &Fa,
243 const DiracOperator::TensorOperator *s, double omega, double omega_s,
244 const ExternalField::TDHF *dVt, const ExternalField::TDHF *dVs,
245 const MBPT::CorrelationPotential *Sigma = nullptr,
246 const std::vector<DiracSpinor> &project_onto = {},
247 std::ostream &outstream = std::cout);
248
249/*!
250 @brief Contribution to A^K from the polarisation of the closed core,
251 evaluated with mixed states.
252 @details
253 As @ref sos_core, with the sum over excited states m performed with mixed
254 states of the core orbitals (generalises the TDHF core polarisability of
255 the polarisability module to two operators). Non-zero only for K = 0 and
256 a diagonal amplitude (caller's responsibility).
257
258 RPA enters once, through the mixed-state solve (the vertex acting on the
259 core orbital); the outer matrix element is bare - the same counting as
260 @ref sos_core.
261
262 The mixed states of a core orbital include (occupied) core intermediate
263 states; for the diagonal amplitude (omega_s = -omega) their contributions
264 cancel in the sum over the core, so this agrees with @ref sos_core, which
265 sums over excited states only.
266
267 @param K Rank; zero returned unless K = 0.
268 @param twoJ 2J of the valence state.
269 @param t,s The two operators.
270 @param omega,omega_s Frequency of each operator.
271 @param core Core states c.
272 @param dVt,dVs TDHF object for each operator (required); see
273 @ref ms_valence.
274 @param Sigma Optional correlation potential for the mixed states. The
275 intermediate states here are core excitations, for which
276 the valence Sigma is not appropriate: normally nullptr
277 (matching @ref sos_core, which uses the HF basis).
278 @return \f$ A^0_{\rm core} \f$.
279*/
280[[nodiscard]] double
281ms_core(int K, int twoJ, const DiracOperator::TensorOperator *t,
282 const DiracOperator::TensorOperator *s, double omega, double omega_s,
283 const std::vector<DiracSpinor> &core, const ExternalField::TDHF *dVt,
284 const ExternalField::TDHF *dVs,
285 const MBPT::CorrelationPotential *Sigma = nullptr);
286
287} // 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:55
Virtual base class for core-polarisation (RPA); computes dV corrections.
Definition CorePolarisation.hpp:147
Uses TDHF to include core-polarisation (RPA) corrections to matrix elements of an external field oper...
Definition TDHF.hpp:58
Correlation potential, Sigma, for valence states.
Definition CorrelationPotential.hpp:108
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:46
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:230
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:94
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:126
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