ampsci
High-precision calculations for one- and two-valence atomic systems
EM_multipole_lowqr.hpp
1#pragma once
2#include "DiracOperator/Operators/EM_multipole_base.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5#include "qip/Maths.hpp"
6
7namespace DiracOperator {
8
9//! Low qr form of Vector electric. Only for K=1 (zero otherwise)
10class VEk_lowq final : public EM_multipole {
11public:
12 VEk_lowq(const Grid &gr, int K, double)
13 : EM_multipole(K, Parity::odd, -std::sqrt(2.0) / 3.0, {},
14 Realness::imaginary, false, &gr, 'V', 'E', true) {}
15
16 void updateFrequency(const double) override final { return; }
17
18 double angularCff(int, int) const override final { return 0; }
19 double angularCgg(int, int) const override final { return 0; }
20 double angularCfg(int ka, int kb) const override final {
21 return m_rank == 1 ? ka - kb - 1 : 0.0;
22 }
23 double angularCgf(int ka, int kb) const override final {
24 return m_rank == 1 ? ka - kb + 1 : 0.0;
25 }
26};
27
28//! Low qr form of Vector magnetic. Only for K=1 (zero otherwise)
29class VMk_lowq final : public EM_multipole {
30public:
31 VMk_lowq(const Grid &gr, int K, double omega)
32 : EM_multipole(K, Parity::even, 0, gr.r(), Realness::imaginary, true, &gr,
33 'V', 'M', true) {
34 updateFrequency(omega);
35 }
36
37 //! @note VMk_lowq angular factor has an extra (ka+kb) prefactor vs. the base.
38 double angularF(const int ka, const int kb) const override final {
39 return (ka + kb) * Angular::Ck_kk(m_rank, ka, -kb);
40 }
41
42 double angularCff(int, int) const override final { return 0; }
43 double angularCgg(int, int) const override final { return 0; }
44 double angularCfg(int, int) const override final {
45 return m_rank == 1 ? 1.0 : 0.0;
46 }
47 double angularCgf(int, int) const override final {
48 return m_rank == 1 ? 1.0 : 0.0;
49 }
50
51 //! nb: q = alpha*omega!
52 void updateFrequency(const double omega) override final {
53 m_omega = omega;
54 m_q = std::abs(PhysConst::alpha * omega);
55 m_constant = -m_q / (3.0 * std::sqrt(2.0));
56 }
57
58private:
59 double m_q{};
60};
61
62//! Low qr form of Vector longitudinal
63class VLk_lowq final : public EM_multipole {
64public:
65 VLk_lowq(const Grid &gr, int K, double)
66 : EM_multipole(K, Parity::odd, 1.0 / 3.0, {}, Realness::imaginary, false,
67 &gr, 'V', 'L', true) {}
68
69 void updateFrequency(const double) override final { return; }
70
71 double angularCff(int, int) const override final { return 0; }
72 double angularCgg(int, int) const override final { return 0; }
73 double angularCfg(int ka, int kb) const override final {
74 return m_rank == 1 ? ka - kb - 1 : 0.0;
75 }
76 double angularCgf(int ka, int kb) const override final {
77 return m_rank == 1 ? ka - kb + 1 : 0.0;
78 }
79};
80
81//==============================================================================
82//! Low qr form of Temporal component of the vector multipole operator:
83//! \f$ \Phi_K = t^K(q)\f$
84class Phik_lowq final : public EM_multipole {
85public:
86 Phik_lowq(const Grid &gr, int K, double omega)
87 : EM_multipole(K, Angular::evenQ(K) ? Parity::even : Parity::odd, 1.0,
88 gr.r(), Realness::real, true, &gr, 'V', 'T', true),
89 m_r2(gr.rpow(2)) {
90 if (omega != 0.0)
91 updateFrequency(omega);
92 }
93 DiracSpinor radial_rhs(const int kappa_a,
94 const DiracSpinor &Fb) const override final {
95 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
96 dF.min_pt() = Fb.min_pt();
97 dF.max_pt() = Fb.max_pt();
98
99 if (isZero(kappa_a, Fb.kappa())) {
100 dF.min_pt() = 0;
101 dF.max_pt() = 0;
102 return dF;
103 }
104
105 if (m_rank == 0) {
106 Rab_rhs(+1, m_r2, &dF, Fb, -(m_q * m_q / 6.0));
107 } else if (m_rank == 1) {
108 Rab_rhs(+1, m_vec, &dF, Fb, (m_q / 3.0));
109 }
110
111 return dF;
112 }
113
114 double radialIntegral(const DiracSpinor &Fa,
115 const DiracSpinor &Fb) const override final {
116
117 if (isZero(Fa.kappa(), Fb.kappa())) {
118 return 0.0;
119 }
120
121 if (m_rank == 0) {
122 return -(m_q * m_q / 6.0) * Rab(+1, m_r2, Fa, Fb);
123 }
124 if (m_rank == 1) {
125 return (m_q / 3.0) * Rab(+1, m_vec, Fa, Fb);
126 }
127
128 return 0.0;
129 }
130
131 //! nb: q = alpha*omega!
132 void updateFrequency(const double omega) override final {
133 m_omega = omega;
134 m_q = std::abs(PhysConst::alpha * omega);
135 }
136
137private:
138 double m_q{};
139 std::vector<double> m_r2;
140};
141
142//==============================================================================
143//! @brief Low qr form of Scalar multipole operator: \f$ S_K = t^K(q)\gamma^0\f$
144class Sk_lowq final : public EM_multipole {
145public:
146 Sk_lowq(const Grid &gr, int K, double omega)
147 : EM_multipole(K, Angular::evenQ(K) ? Parity::even : Parity::odd, 1.0,
148 gr.r(), Realness::real, true, &gr, 'S', 'T', true) {
149 if (omega != 0.0)
150 updateFrequency(omega);
151 }
152 DiracSpinor radial_rhs(const int kappa_a,
153 const DiracSpinor &Fb) const override final {
154 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
155 dF.min_pt() = Fb.min_pt();
156 dF.max_pt() = Fb.max_pt();
157
158 if (isZero(kappa_a, Fb.kappa())) {
159 dF.min_pt() = 0;
160 dF.max_pt() = 0;
161 return dF;
162 }
163
164 if (m_rank == 0) {
165 Gab_rhs(&dF, Fb, -2.0);
166 } else if (m_rank == 1) {
167 Rab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
168 }
169
170 return dF;
171 }
172
173 double radialIntegral(const DiracSpinor &Fa,
174 const DiracSpinor &Fb) const override final {
175
176 if (isZero(Fa.kappa(), Fb.kappa())) {
177 return 0.0;
178 }
179
180 if (m_rank == 0) {
181 return -2.0 * Gab(Fa, Fb);
182 }
183
184 if (m_rank == 1) {
185 return (m_q / 3.0) * Rab(-1, m_vec, Fa, Fb);
186 }
187
188 return 0.0;
189 }
190
191 //! nb: q = alpha*omega!
192 void updateFrequency(const double omega) override final {
193 m_omega = omega;
194 m_q = std::abs(PhysConst::alpha * omega);
195 }
196
197private:
198 double m_q{};
199};
200
201//==============================================================================
202//==============================================================================
203// Gamma^5 versions!
204
205//==============================================================================
206//! @brief Low qr form of Axial electric multipole operator: \f$ A^E_K = T^{(+1)}_K(q)\gamma^5\f$
207class AEk_lowq final : public EM_multipole {
208public:
209 AEk_lowq(const Grid &gr, int K, double omega)
210 : EM_multipole(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
211 gr.r(), Realness::real, false, &gr, 'A', 'E', true) {
212 if (omega != 0.0)
213 updateFrequency(omega);
214 }
215 DiracSpinor radial_rhs(const int kappa_a,
216 const DiracSpinor &Fb) const override final {
217 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
218 dF.min_pt() = Fb.min_pt();
219 dF.max_pt() = Fb.max_pt();
220
221 if (isZero(kappa_a, Fb.kappa()) || kappa_a == -Fb.kappa()) {
222 dF.min_pt() = 0;
223 dF.max_pt() = 0;
224 return dF;
225 }
226
227 const auto dk = double(kappa_a + Fb.kappa());
228 const auto dk_int = kappa_a + Fb.kappa();
229 const auto same_kap = kappa_a == Fb.kappa();
230
231 if (m_rank == 1) {
232 const double cx = std::sqrt(2.0) / 3.0;
233
234 if (same_kap || dk_int == 1) {
235 Gab_rhs(&dF, Fb, -2.0 * cx * dk);
236 } else {
237 Rab_rhs(-1, &dF, Fb, cx * dk);
238 Rab_rhs(+1, &dF, Fb, -cx);
239 }
240 }
241
242 if (m_rank == 2) {
243 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
244
245 if (dk_int == 2) {
246 // F-part cancels!
247 Gab_rhs(&dF, Fb, -4.0 * cx2 * m_q);
248 dF *= m_vec;
249 } else {
250 Rab_rhs(-1, m_vec, &dF, Fb, cx2 * dk * m_q);
251 Rab_rhs(+1, m_vec, &dF, Fb, -2.0 * cx2 * m_q);
252 }
253 }
254
255 return dF;
256 }
257
258 double radialIntegral(const DiracSpinor &Fa,
259 const DiracSpinor &Fb) const override final {
260
261 if (isZero(Fa.kappa(), Fb.kappa()) || Fa.kappa() == -Fb.kappa()) {
262 return 0.0;
263 }
264
265 const auto dk = double(Fa.kappa() + Fb.kappa());
266 const auto dk_int = Fa.kappa() + Fb.kappa();
267
268 const auto same_kap = Fa.kappa() == Fb.kappa();
269
270 if (m_rank == 1) {
271 const auto cx = std::sqrt(2.0);
272
273 if (same_kap || dk_int == 1) {
274 return (-2.0 / 3.0) * cx * dk * Gab(Fa, Fb);
275 }
276 const auto Rm1 = Rab(-1, Fa, Fb);
277 const auto Rp1 = Rab(+1, Fa, Fb);
278 return cx * (dk * Rm1 - Rp1) / 3.0;
279 }
280
281 if (m_rank == 2) {
282 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
283
284 if (dk_int == 2) {
285 // F-part cancels!
286 return cx2 * m_q * (-4.0 * Gab(m_vec, Fa, Fb));
287 }
288
289 return cx2 * m_q *
290 (dk * Rab(-1, m_vec, Fa, Fb) - 2.0 * Rab(+1, m_vec, Fa, Fb));
291 }
292
293 return 0.0;
294 }
295
296 //! nb: q = alpha*omega!
297 void updateFrequency(const double omega) override final {
298 m_omega = omega;
299 m_q = std::abs(PhysConst::alpha * omega);
300 }
301
302private:
303 double m_q{};
304};
305
306//==============================================================================
307//! @brief Low qr form of Axial longitudinal multipole operator: \f$ A^L_K = T^{(-1)}_K(q)\gamma^5\f$
308class ALk_lowq final : public EM_multipole {
309public:
310 ALk_lowq(const Grid &gr, int K, double omega)
311 : EM_multipole(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
312 gr.r(), Realness::real, true, &gr, 'A', 'L', true) {
313 if (omega != 0.0)
314 updateFrequency(omega);
315 }
316 DiracSpinor radial_rhs(const int kappa_a,
317 const DiracSpinor &Fb) const override final {
318 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
319 dF.min_pt() = Fb.min_pt();
320 dF.max_pt() = Fb.max_pt();
321
322 if (isZero(kappa_a, Fb.kappa())) {
323 dF.min_pt() = 0;
324 dF.max_pt() = 0;
325 return dF;
326 }
327
328 if (m_rank == 0) {
329 Rab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
330 } else if (m_rank == 1) {
331 const auto dk_int = kappa_a + Fb.kappa();
332 const auto dk = double(dk_int);
333 const auto same_kap = kappa_a == Fb.kappa();
334 if (dk == 0)
335 return dF;
336 if (same_kap || dk_int == 1) {
337 Gab_rhs(&dF, Fb, (2.0 / 3.0) * dk);
338 } else {
339 const auto c = -(1.0 / 3.0);
340 // -(1.0 / 3.0) * (dk * Rab(-1, Fa, Fb) - Rab(+1, Fa, Fb));
341 Rab_rhs(-1, &dF, Fb, c * dk);
342 Rab_rhs(+1, &dF, Fb, -c);
343 }
344 }
345
346 return dF;
347 }
348
349 double radialIntegral(const DiracSpinor &Fa,
350 const DiracSpinor &Fb) const override final {
351
352 if (isZero(Fa.kappa(), Fb.kappa())) {
353 return 0.0;
354 }
355
356 if (m_rank == 0) {
357 return -(m_q / 3.0) * Rab(+1, m_vec, Fa, Fb);
358 }
359 if (m_rank == 1) {
360
361 const auto dk_int = Fa.kappa() + Fb.kappa();
362 const auto dk = double(dk_int);
363 const auto same_kap = Fa.kappa() == Fb.kappa();
364
365 if (same_kap || dk_int == 1)
366 return (2.0 / 3.0) * dk * Gab(Fa, Fb);
367
368 return -(1.0 / 3.0) * (dk * Rab(-1, Fa, Fb) - Rab(+1, Fa, Fb));
369 }
370 return 0.0;
371 }
372
373 //! nb: q = alpha*omega!
374 void updateFrequency(const double omega) override final {
375 m_omega = omega;
376 m_q = std::abs(PhysConst::alpha * omega);
377 }
378
379private:
380 double m_q{};
381};
382
383//==============================================================================
384//! @brief Low qr form of Axial magnetic multipole operator: \f$ A^M_K = T^{(0)}_K(q)\gamma^5\f$
385class AMk_lowq final : public EM_multipole {
386public:
387 AMk_lowq(const Grid &gr, int K, double omega)
388 : EM_multipole(K, Angular::evenQ(K) ? Parity::even : Parity::odd, 1.0,
389 gr.r(), Realness::real, true, &gr, 'A', 'M', true) {
390 if (omega != 0.0)
391 updateFrequency(omega);
392 }
393
394 DiracSpinor radial_rhs(const int kappa_a,
395 const DiracSpinor &Fb) const override final {
396 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
397 dF.min_pt() = Fb.min_pt();
398 dF.max_pt() = Fb.max_pt();
399
400 if (isZero(kappa_a, Fb.kappa()) || (kappa_a == Fb.kappa())) {
401 dF.min_pt() = 0;
402 dF.max_pt() = 0;
403 return dF;
404 }
405
406 const auto sk = double(kappa_a - Fb.kappa());
407 if (m_rank == 1) {
408 Rab_rhs(-1, m_vec, &dF, Fb, -(m_q / (std::sqrt(2.0) * 3.0)) * sk);
409 }
410
411 if (m_rank == 2) {
412 using namespace qip::overloads;
413 const auto c = -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk;
414 Rab_rhs(-1, m_vec * m_vec, &dF, Fb, c);
415 }
416
417 return dF;
418 }
419
420 double radialIntegral(const DiracSpinor &Fa,
421 const DiracSpinor &Fb) const override final {
422
423 if (isZero(Fa.kappa(), Fb.kappa())) {
424 return 0.0;
425 }
426
427 const auto sk = double(Fa.kappa() - Fb.kappa());
428
429 if (m_rank == 1) {
430 const auto ck = sk / std::sqrt(2.0);
431 return -ck * m_q * Rab(-1, m_vec, Fa, Fb) / 3.0;
432 }
433 if (m_rank == 2) {
434 using namespace qip::overloads;
435 return -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk *
436 Rab(-1, m_vec * m_vec, Fa, Fb);
437 }
438 return 0.0;
439 }
440
441 //! nb: q = alpha*omega!
442 void updateFrequency(const double omega) override final {
443 m_omega = omega;
444 m_q = std::abs(PhysConst::alpha * omega);
445 }
446
447private:
448 double m_q{};
449};
450
451//==============================================================================
452//! @brief Low qr form of Temporal component of the axial vector multipole operator: \f$ \Theta_K = \Phi^5_K = t^K(q)\gamma^5\f$ .
453//! NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
454class Phi5k_lowq final : public EM_multipole {
455public:
456 Phi5k_lowq(const Grid &gr, int K, double omega,
457 double alpha = PhysConst::alpha)
458 : EM_multipole(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
459 gr.r(), Realness::real, true, &gr, 'A', 'T', true),
460 m_alpha(alpha) {
461 if (omega != 0.0)
462 updateFrequency(omega);
463 }
464 DiracSpinor radial_rhs(const int kappa_a,
465 const DiracSpinor &Fb) const override final {
466 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
467 dF.min_pt() = Fb.min_pt();
468 dF.max_pt() = Fb.max_pt();
469
470 if (isZero(kappa_a, Fb.kappa())) {
471 return dF;
472 }
473
474 if (m_rank == 0) {
475 // XXX q here is via _frequency_, not momentum
476 const auto w_ab = m_q / m_alpha;
477 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
478 const auto c = -m_alpha * w_ab * f_rel;
479 Rab_rhs(+1, m_vec, &dF, Fb, c);
480 } else if (m_rank == 1) {
481 // XXX q here is _momentum_, not frequency
482 Pab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
483 }
484
485 return dF;
486 }
487
488 double radialIntegral(const DiracSpinor &Fa,
489 const DiracSpinor &Fb) const override final {
490
491 if (isZero(Fa.kappa(), Fb.kappa())) {
492 return 0.0;
493 }
494
495 if (m_rank == 0) {
496 // XXX q here is via _frequency_, not momentum
497 const auto w_ab = Fa.en() - Fb.en();
498 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
499 return -m_alpha * w_ab * Rab(+1, m_vec, Fa, Fb) * f_rel;
500 //Pab(-1, Fa, Fb); //
501 }
502
503 if (m_rank == 1) {
504 // XXX q here is _momentum_, not frequency
505 return (m_q / 3.0) * Pab(-1, m_vec, Fa, Fb);
506 }
507
508 return 0.0;
509 }
510
511 //! NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
512 void updateFrequency(const double omega) override final {
513 m_omega = omega;
514 m_q = PhysConst::alpha * omega;
515 }
516
517private:
518 double m_alpha;
519 double m_q{};
520};
521
522//==============================================================================
523//! @brief Low qr form of Pseudoscalar multipole operator:
524//! \f$ P_K = S^5_K = t^K(q)(i\gamma^0\gamma^5)\f$
525//! NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
526class S5k_lowq final : public EM_multipole {
527public:
528 S5k_lowq(const Grid &gr, int K, double omega, double alpha = PhysConst::alpha)
529 : EM_multipole(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
530 gr.r(), Realness::real, true, &gr, 'P', 'T', true),
531 m_alpha(alpha) {
532 if (omega != 0.0)
533 updateFrequency(omega);
534 }
535 DiracSpinor radial_rhs(const int kappa_a,
536 const DiracSpinor &Fb) const override final {
537 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
538 dF.min_pt() = Fb.min_pt();
539 dF.max_pt() = Fb.max_pt();
540
541 if (isZero(kappa_a, Fb.kappa())) {
542 return dF;
543 }
544
545 if (m_rank == 0) {
546 // XXX Need to think about how to do omega here nicely
547 // return dF;
548 // XXX omega_ab factored out!! XXX
549
550 const auto w_ab = m_q / m_alpha;
551 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
552 const auto wab2 = std::pow(w_ab, 2);
553 const auto c = 0.5 * m_alpha * m_alpha * m_alpha * wab2 * f_rel;
554
555 Rab_rhs(+1, m_vec, &dF, Fb, c);
556 } else if (m_rank == 1) {
557 Pab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
558 }
559
560 return dF;
561 }
562
563 double radialIntegral(const DiracSpinor &Fa,
564 const DiracSpinor &Fb) const override final {
565
566 if (isZero(Fa.kappa(), Fb.kappa())) {
567 return 0.0;
568 }
569
570 if (m_rank == 0) {
571
572 // XXX q here is via _frequency_, not momentum
573 const auto w_ab = Fa.en() - Fb.en();
574 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
575
576 const auto wab2 = std::pow(w_ab, 2);
577 return 0.5 * m_alpha * m_alpha * m_alpha * wab2 * Rab(+1, m_vec, Fa, Fb) *
578 f_rel;
579 }
580
581 if (m_rank == 1) {
582 return -(m_q / 3.0) * Pab(+1, m_vec, Fa, Fb);
583 }
584
585 return 0.0;
586 }
587
588 //! NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
589 void updateFrequency(const double omega) override final {
590 m_omega = omega;
591 m_q = m_alpha * omega;
592 }
593
594private:
595 double m_alpha;
596 double m_q{};
597};
598
599} // namespace DiracOperator
Low qr form of Axial electric multipole operator: .
Definition EM_multipole_lowqr.hpp:207
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:258
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:297
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:215
Low qr form of Axial longitudinal multipole operator: .
Definition EM_multipole_lowqr.hpp:308
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:349
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:374
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:316
Low qr form of Axial magnetic multipole operator: .
Definition EM_multipole_lowqr.hpp:385
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:420
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:442
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:394
Intermediate abstract base class for all EM relativistic multipole operators.
Definition EM_multipole_base.hpp:50
double m_omega
Current frequency; cached by each derived updateFrequency().
Definition EM_multipole_base.hpp:174
Low qr form of Temporal component of the axial vector multipole operator: . NOTE: If K=0,...
Definition EM_multipole_lowqr.hpp:454
void updateFrequency(const double omega) override final
NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
Definition EM_multipole_lowqr.hpp:512
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:488
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:464
Low qr form of Temporal component of the vector multipole operator: .
Definition EM_multipole_lowqr.hpp:84
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:93
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:114
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:132
Low qr form of Pseudoscalar multipole operator: NOTE: If K=0, omega should be (ea-eb); for K=1 shoul...
Definition EM_multipole_lowqr.hpp:526
void updateFrequency(const double omega) override final
NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
Definition EM_multipole_lowqr.hpp:589
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:535
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:563
Low qr form of Scalar multipole operator: .
Definition EM_multipole_lowqr.hpp:144
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:152
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:173
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:192
bool isZero(int ka, int kb) const
If matrix element <a|h|b> is zero, returns true.
Definition TensorOperator.cpp:18
Low qr form of Vector electric. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:10
void updateFrequency(const double) override final
Update frequency for frequency-dependant operators.
Definition EM_multipole_lowqr.hpp:16
double angularCfg(int ka, int kb) const override final
Angular factor for f_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:20
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:19
double angularCgf(int ka, int kb) const override final
Angular factor for g_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:23
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:18
Low qr form of Vector longitudinal.
Definition EM_multipole_lowqr.hpp:63
double angularCfg(int ka, int kb) const override final
Angular factor for f_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:73
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:71
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:72
double angularCgf(int ka, int kb) const override final
Angular factor for g_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:76
void updateFrequency(const double) override final
Update frequency for frequency-dependant operators.
Definition EM_multipole_lowqr.hpp:69
Low qr form of Vector magnetic. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:29
double angularCfg(int, int) const override final
Angular factor for f_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:44
double angularF(const int ka, const int kb) const override final
Definition EM_multipole_lowqr.hpp:38
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:43
double angularCgf(int, int) const override final
Angular factor for g_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:47
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:42
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:52
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:145
auto min_pt() const
First non-zero point (index for f[i])
Definition DiracSpinor.hpp:141
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
const std::vector< double > & r() const
Grid points, r.
Definition Grid.hpp:75
std::vector< double > rpow(double k) const
Calculates+returns vector of 1/r.
Definition Grid.cpp:120
constexpr bool evenQ(int a)
Returns true if a is even - for integer values.
Definition Wigner369j.hpp:220
double Ck_kk(int k, int ka, int kb)
Reduced (relativistic) angular ME: <ka||C^k||kb> [takes k and kappa].
Definition Wigner369j.hpp:372
Dirac Operators: General + derived.
Definition GenerateOperator.cpp:3
void Pab_rhs(double pm, const std::vector< double > &t, DiracSpinor *dF, const DiracSpinor &Fb, double a)
Pab_rhs function: dF_ab += A * t(r) * (g, pm*f) , pm=+/-1 (usually). NOTE: uses +=,...
Definition TensorOperator.cpp:239
double Gab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Gab function: Int[ (ga*gb ) * t(r) , dr].
Definition TensorOperator.cpp:277
double Rab(double pm, const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Rab function: Int[ (fa*fb + pm*ga*gb) * t(r) , dr]. pm = +/-1 (usually)
Definition TensorOperator.cpp:227
void Rab_rhs(double pm, const std::vector< double > &t, DiracSpinor *dF, const DiracSpinor &Fb, double a)
Rab_rhs function: dF_ab += A * t(r) * (f, pm*g) , pm=+/-1 (usually). NOTE: uses +=,...
Definition TensorOperator.cpp:249
double Pab(double pm, const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Pab function: Int[ (fa*gb + pm*ga*fb) * t(r) , dr]. pm = +/-1 (usually)
Definition TensorOperator.cpp:213
constexpr double alpha
Fine-structure constant: alpha = 1/137.035 999 177(21) [CODATA 2022].
Definition PhysConst_constants.hpp:24
namespace qip::overloads provides operator overloads for std::vector
Definition Vector.hpp:451