ampsci
High-precision calculations for one- and two-valence atomic systems
Loading...
Searching...
No Matches
EM_multipole_lowqr.hpp
1#pragma once
2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5#include "qip/Maths.hpp"
6
7namespace DiracOperator {
8
10class VEk_lowq final : public TensorOperator {
11public:
12 VEk_lowq(const Grid &, int K, double)
13 : TensorOperator(1, Parity::odd, -std::sqrt(2.0) / 3.0, {}, 0,
14 Realness::imaginary, false),
15 m_K(K) {}
16
17 std::string name() const override final {
18 return std::string("V_lowq^E_") + std::to_string(m_rank);
19 }
20
21 double angularF(const int ka, const int kb) const override final {
22 return Angular::Ck_kk(1, ka, kb);
23 }
24
25 double angularCff(int, int) const override final { return 0; }
26 double angularCgg(int, int) const override final { return 0; }
27 double angularCfg(int ka, int kb) const override final {
28 return m_K == 1 ? ka - kb - 1 : 0.0;
29 }
30 double angularCgf(int ka, int kb) const override final {
31 return m_K == 1 ? ka - kb + 1 : 0.0;
32 }
33
34private:
35 int m_K;
36};
37
39class VMk_lowq final : public TensorOperator {
40public:
41 VMk_lowq(const Grid &gr, int K, double omega)
42 : TensorOperator(1, Parity::even, 0, gr.r(), 0, Realness::imaginary, true),
43 m_K(K) {
44 updateFrequency(omega);
45 }
46
47 std::string name() const override final {
48 return std::string("V_lowq^E_") + std::to_string(m_rank);
49 }
50
51 double angularF(const int ka, const int kb) const override final {
52 return (ka + kb) * Angular::Ck_kk(1, ka, -kb);
53 }
54
55 double angularCff(int, int) const override final { return 0; }
56 double angularCgg(int, int) const override final { return 0; }
57 double angularCfg(int, int) const override final {
58 return m_K == 1 ? 1.0 : 0.0;
59 }
60 double angularCgf(int, int) const override final {
61 return m_K == 1 ? 1.0 : 0.0;
62 }
63
65 void updateFrequency(const double omega) override final {
66 m_q = std::abs(PhysConst::alpha * omega);
67 m_constant = -m_q / (3.0 * std::sqrt(2.0));
68 }
69
70private:
71 int m_K;
72 double m_q{};
73};
74
76class VLk_lowq final : public TensorOperator {
77public:
78 VLk_lowq(const Grid &, int K, double)
79 : TensorOperator(1, Parity::odd, 1.0 / 3.0, {}, 0, Realness::imaginary,
80 false),
81 m_K(K) {}
82
83 std::string name() const override final {
84 return std::string("V_lowq^E_") + std::to_string(m_rank);
85 }
86
87 double angularF(const int ka, const int kb) const override final {
88 return Angular::Ck_kk(1, ka, kb);
89 }
90
91 double angularCff(int, int) const override final { return 0; }
92 double angularCgg(int, int) const override final { return 0; }
93 double angularCfg(int ka, int kb) const override final {
94 return m_K == 1 ? ka - kb - 1 : 0.0;
95 }
96 double angularCgf(int ka, int kb) const override final {
97 return m_K == 1 ? ka - kb + 1 : 0.0;
98 }
99
100private:
101 int m_K;
102};
103
104//==============================================================================
107class Phik_lowq final : public TensorOperator {
108public:
109 Phik_lowq(const Grid &gr, int K, double omega)
110 : TensorOperator(K, Angular::evenQ(K) ? Parity::even : Parity::odd, 1.0,
111 gr.r(), 0, Realness::real, true),
112 m_K(K),
113 m_r2(gr.rpow(2)) {
114 if (omega != 0.0)
115 updateFrequency(omega);
116 }
117 std::string name() const override final {
118 return std::string("Phi_lowq_") + std::to_string(m_K);
119 }
120
121 double angularF(const int ka, const int kb) const override final {
122 return Angular::Ck_kk(m_K, ka, kb);
123 }
124
125 DiracSpinor radial_rhs(const int kappa_a,
126 const DiracSpinor &Fb) const override final {
127 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
128 dF.min_pt() = Fb.min_pt();
129 dF.max_pt() = Fb.max_pt();
130
131 if (isZero(kappa_a, Fb.kappa())) {
132 dF.min_pt() = 0;
133 dF.max_pt() = 0;
134 return dF;
135 }
136
137 if (m_K == 0) {
138 Rab_rhs(+1, m_r2, &dF, Fb, -(m_q * m_q / 6.0));
139 } else if (m_K == 1) {
140 Rab_rhs(+1, m_vec, &dF, Fb, (m_q / 3.0));
141 }
142
143 return dF;
144 }
145
146 double radialIntegral(const DiracSpinor &Fa,
147 const DiracSpinor &Fb) const override final {
148
149 if (isZero(Fa.kappa(), Fb.kappa())) {
150 return 0.0;
151 }
152
153 if (m_K == 0) {
154 return -(m_q * m_q / 6.0) * Rab(+1, m_r2, Fa, Fb);
155 }
156 if (m_K == 1) {
157 return (m_q / 3.0) * Rab(+1, m_vec, Fa, Fb);
158 }
159
160 return 0.0;
161 }
162
164 void updateFrequency(const double omega) override final {
165 m_q = std::abs(PhysConst::alpha * omega);
166 }
167
168private:
169 int m_K;
170 double m_q{};
171 std::vector<double> m_r2;
172};
173
174//==============================================================================
176class Sk_lowq final : public TensorOperator {
177public:
178 Sk_lowq(const Grid &gr, int K, double omega)
179 : TensorOperator(K, Angular::evenQ(K) ? Parity::even : Parity::odd, 1.0,
180 gr.r(), 0, Realness::real, true),
181 m_K(K) {
182 if (omega != 0.0)
183 updateFrequency(omega);
184 }
185 std::string name() const override final {
186 return std::string("t^S_k_lowq") + std::to_string(m_K);
187 }
188
189 double angularF(const int ka, const int kb) const override final {
190 return Angular::Ck_kk(m_K, ka, kb);
191 }
192
193 DiracSpinor radial_rhs(const int kappa_a,
194 const DiracSpinor &Fb) const override final {
195 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
196 dF.min_pt() = Fb.min_pt();
197 dF.max_pt() = Fb.max_pt();
198
199 if (isZero(kappa_a, Fb.kappa())) {
200 dF.min_pt() = 0;
201 dF.max_pt() = 0;
202 return dF;
203 }
204
205 if (m_K == 0) {
206 Gab_rhs(&dF, Fb, -2.0);
207 } else if (m_K == 1) {
208 Rab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
209 }
210
211 return dF;
212 }
213
214 double radialIntegral(const DiracSpinor &Fa,
215 const DiracSpinor &Fb) const override final {
216
217 if (isZero(Fa.kappa(), Fb.kappa())) {
218 return 0.0;
219 }
220
221 if (m_K == 0) {
222 return -2.0 * Gab(Fa, Fb);
223 }
224
225 if (m_K == 1) {
226 return (m_q / 3.0) * Rab(-1, m_vec, Fa, Fb);
227 }
228
229 return 0.0;
230 }
231
233 void updateFrequency(const double omega) override final {
234 m_q = std::abs(PhysConst::alpha * omega);
235 }
236
237private:
238 int m_K;
239 double m_q{};
240};
241
242//==============================================================================
243//==============================================================================
244// Gamma^5 versions!
245
246//==============================================================================
248class AEk_lowq final : public TensorOperator {
249public:
250 AEk_lowq(const Grid &gr, int K, double omega)
251 : TensorOperator(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
252 gr.r(), 0, Realness::real),
253 m_K(K) {
254 if (omega != 0.0)
255 updateFrequency(omega);
256 }
257 std::string name() const override final {
258 return std::string("T^E5_lowq_") + std::to_string(m_K);
259 }
260
261 double angularF(const int ka, const int kb) const override final {
262 return Angular::Ck_kk(m_K, ka, -kb);
263 }
264
265 DiracSpinor radial_rhs(const int kappa_a,
266 const DiracSpinor &Fb) const override final {
267 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
268 dF.min_pt() = Fb.min_pt();
269 dF.max_pt() = Fb.max_pt();
270
271 if (isZero(kappa_a, Fb.kappa()) || kappa_a == -Fb.kappa()) {
272 dF.min_pt() = 0;
273 dF.max_pt() = 0;
274 return dF;
275 }
276
277 const auto dk = double(kappa_a + Fb.kappa());
278 const auto dk_int = kappa_a + Fb.kappa();
279 const auto same_kap = kappa_a == Fb.kappa();
280
281 if (m_K == 1) {
282 const double cx = std::sqrt(2.0) / 3.0;
283
284 if (same_kap || dk_int == 1) {
285 Gab_rhs(&dF, Fb, -2.0 * cx * dk);
286 } else {
287 Rab_rhs(-1, &dF, Fb, cx * dk);
288 Rab_rhs(+1, &dF, Fb, -cx);
289 }
290 }
291
292 if (m_K == 2) {
293 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
294
295 if (dk_int == 2) {
296 // F-part cancels!
297 Gab_rhs(&dF, Fb, -4.0 * cx2 * m_q);
298 dF *= m_vec;
299 } else {
300 Rab_rhs(-1, m_vec, &dF, Fb, cx2 * dk * m_q);
301 Rab_rhs(+1, m_vec, &dF, Fb, -2.0 * cx2 * m_q);
302 }
303 }
304
305 return dF;
306 }
307
308 double radialIntegral(const DiracSpinor &Fa,
309 const DiracSpinor &Fb) const override final {
310
311 if (isZero(Fa.kappa(), Fb.kappa()) || Fa.kappa() == -Fb.kappa()) {
312 return 0.0;
313 }
314
315 const auto dk = double(Fa.kappa() + Fb.kappa());
316 const auto dk_int = Fa.kappa() + Fb.kappa();
317
318 const auto same_kap = Fa.kappa() == Fb.kappa();
319
320 if (m_K == 1) {
321 const auto cx = std::sqrt(2.0);
322
323 if (same_kap || dk_int == 1) {
324 return (-2.0 / 3.0) * cx * dk * Gab(Fa, Fb);
325 }
326 const auto Rm1 = Rab(-1, Fa, Fb);
327 const auto Rp1 = Rab(+1, Fa, Fb);
328 return cx * (dk * Rm1 - Rp1) / 3.0;
329 }
330
331 if (m_K == 2) {
332 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
333
334 if (dk_int == 2) {
335 // F-part cancels!
336 return cx2 * m_q * (-4.0 * Gab(m_vec, Fa, Fb));
337 }
338
339 return cx2 * m_q *
340 (dk * Rab(-1, m_vec, Fa, Fb) - 2.0 * Rab(+1, m_vec, Fa, Fb));
341 }
342
343 return 0.0;
344 }
345
347 void updateFrequency(const double omega) override final {
348 m_q = std::abs(PhysConst::alpha * omega);
349 }
350
351private:
352 int m_K;
353 double m_q{};
354};
355
356//==============================================================================
358class ALk_lowq final : public TensorOperator {
359public:
360 ALk_lowq(const Grid &gr, int K, double omega)
361 : TensorOperator(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
362 gr.r(), 0, Realness::real, true),
363 m_K(K) {
364 if (omega != 0.0)
365 updateFrequency(omega);
366 }
367 std::string name() const override final {
368 return std::string("T^L5_k_lowq") + std::to_string(m_K);
369 }
370
371 double angularF(const int ka, const int kb) const override final {
372 return Angular::Ck_kk(m_K, ka, -kb);
373 }
374
375 DiracSpinor radial_rhs(const int kappa_a,
376 const DiracSpinor &Fb) const override final {
377 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
378 dF.min_pt() = Fb.min_pt();
379 dF.max_pt() = Fb.max_pt();
380
381 if (isZero(kappa_a, Fb.kappa())) {
382 dF.min_pt() = 0;
383 dF.max_pt() = 0;
384 return dF;
385 }
386
387 if (m_K == 0) {
388 Rab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
389 } else if (m_K == 1) {
390 const auto dk_int = kappa_a + Fb.kappa();
391 const auto dk = double(dk_int);
392 const auto same_kap = kappa_a == Fb.kappa();
393 if (dk == 0)
394 return dF;
395 if (same_kap || dk_int == 1) {
396 Gab_rhs(&dF, Fb, (2.0 / 3.0) * dk);
397 } else {
398 const auto c = -(1.0 / 3.0);
399 // -(1.0 / 3.0) * (dk * Rab(-1, Fa, Fb) - Rab(+1, Fa, Fb));
400 Rab_rhs(-1, &dF, Fb, c * dk);
401 Rab_rhs(+1, &dF, Fb, -c);
402 }
403 }
404
405 return dF;
406 }
407
408 double radialIntegral(const DiracSpinor &Fa,
409 const DiracSpinor &Fb) const override final {
410
411 if (isZero(Fa.kappa(), Fb.kappa())) {
412 return 0.0;
413 }
414
415 if (m_K == 0) {
416 return -(m_q / 3.0) * Rab(+1, m_vec, Fa, Fb);
417 }
418 if (m_K == 1) {
419
420 const auto dk_int = Fa.kappa() + Fb.kappa();
421 const auto dk = double(dk_int);
422 const auto same_kap = Fa.kappa() == Fb.kappa();
423
424 if (same_kap || dk_int == 1)
425 return (2.0 / 3.0) * dk * Gab(Fa, Fb);
426
427 return -(1.0 / 3.0) * (dk * Rab(-1, Fa, Fb) - Rab(+1, Fa, Fb));
428 }
429 return 0.0;
430 }
431
433 void updateFrequency(const double omega) override final {
434 m_q = std::abs(PhysConst::alpha * omega);
435 }
436
437private:
438 int m_K;
439 double m_q{};
440};
441
442//==============================================================================
444class AMk_lowq final : public TensorOperator {
445public:
446 AMk_lowq(const Grid &gr, int K, double omega)
447 : TensorOperator(K, Angular::evenQ(K) ? Parity::even : Parity::odd, 1.0,
448 gr.r(), 0, Realness::real, true),
449 m_K(K) {
450 if (omega != 0.0)
451 updateFrequency(omega);
452 }
453
454 std::string name() const override final {
455 return std::string("T^M5_k_lowq_1") + std::to_string(m_K);
456 }
457
458 double angularF(const int ka, const int kb) const override final {
459 return Angular::Ck_kk(m_K, ka, kb);
460 }
461
462 DiracSpinor radial_rhs(const int kappa_a,
463 const DiracSpinor &Fb) const override final {
464 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
465 dF.min_pt() = Fb.min_pt();
466 dF.max_pt() = Fb.max_pt();
467
468 if (isZero(kappa_a, Fb.kappa()) || (kappa_a == Fb.kappa())) {
469 dF.min_pt() = 0;
470 dF.max_pt() = 0;
471 return dF;
472 }
473
474 const auto sk = double(kappa_a - Fb.kappa());
475 if (m_K == 1) {
476 Rab_rhs(-1, m_vec, &dF, Fb, -(m_q / (std::sqrt(2.0) * 3.0)) * sk);
477 }
478
479 if (m_K == 2) {
480 using namespace qip::overloads;
481 const auto c = -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk;
482 Rab_rhs(-1, m_vec * m_vec, &dF, Fb, c);
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 const auto sk = double(Fa.kappa() - Fb.kappa());
496
497 if (m_K == 1) {
498 const auto ck = sk / std::sqrt(2.0);
499 return -ck * m_q * Rab(-1, m_vec, Fa, Fb) / 3.0;
500 }
501 if (m_K == 2) {
502 using namespace qip::overloads;
503 return -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk *
504 Rab(-1, m_vec * m_vec, Fa, Fb);
505 }
506 return 0.0;
507 }
508
510 void updateFrequency(const double omega) override final {
511 m_q = std::abs(PhysConst::alpha * omega);
512 }
513
514private:
515 int m_K;
516 double m_q{};
517};
518
519//==============================================================================
522class Phi5k_lowq final : public TensorOperator {
523public:
524 Phi5k_lowq(const Grid &gr, int K, double omega,
525 double alpha = PhysConst::alpha)
526 : TensorOperator(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
527 gr.r(), 0, Realness::real, true),
528 m_K(K),
529 m_alpha(alpha) {
530 if (omega != 0.0)
531 updateFrequency(omega);
532 }
533 std::string name() const override final {
534 return std::string("Phi5_lowq_") + std::to_string(m_K);
535 }
536
537 double angularF(const int ka, const int kb) const override final {
538 return Angular::Ck_kk(m_K, ka, -kb);
539 }
540
541 DiracSpinor radial_rhs(const int kappa_a,
542 const DiracSpinor &Fb) const override final {
543 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
544 dF.min_pt() = Fb.min_pt();
545 dF.max_pt() = Fb.max_pt();
546
547 if (isZero(kappa_a, Fb.kappa())) {
548 return dF;
549 }
550
551 if (m_K == 0) {
552 // XXX q here is via _frequency_, not momentum
553 const auto w_ab = m_q / m_alpha;
554 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
555 const auto c = -m_alpha * w_ab * f_rel;
556 Rab_rhs(+1, m_vec, &dF, Fb, c);
557 } else if (m_K == 1) {
558 // XXX q here is _momentum_, not frequency
559 Pab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
560 }
561
562 return dF;
563 }
564
565 double radialIntegral(const DiracSpinor &Fa,
566 const DiracSpinor &Fb) const override final {
567
568 if (isZero(Fa.kappa(), Fb.kappa())) {
569 return 0.0;
570 }
571
572 if (m_K == 0) {
573 // XXX q here is via _frequency_, not momentum
574 const auto w_ab = Fa.en() - Fb.en();
575 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
576 return -m_alpha * w_ab * Rab(+1, m_vec, Fa, Fb) * f_rel;
577 //Pab(-1, Fa, Fb); //
578 }
579
580 if (m_K == 1) {
581 // XXX q here is _momentum_, not frequency
582 return (m_q / 3.0) * Pab(-1, m_vec, Fa, Fb);
583 }
584
585 return 0.0;
586 }
587
589 void updateFrequency(const double omega) override final {
590 m_q = PhysConst::alpha * omega;
591 }
592
593private:
594 int m_K;
595 double m_alpha;
596 double m_q{};
597};
598
599//==============================================================================
603class S5k_lowq final : public TensorOperator {
604public:
605 S5k_lowq(const Grid &gr, int K, double omega, double alpha = PhysConst::alpha)
606 : TensorOperator(K, Angular::evenQ(K) ? Parity::odd : Parity::even, 1.0,
607 gr.r(), 0, Realness::real, true),
608 m_K(K),
609 m_alpha(alpha) {
610 if (omega != 0.0)
611 updateFrequency(omega);
612 }
613 std::string name() const override final {
614 return std::string("S5_k_lowq") + std::to_string(m_K);
615 }
616
617 double angularF(const int ka, const int kb) const override final {
618 return Angular::Ck_kk(m_K, ka, -kb);
619 }
620
621 DiracSpinor radial_rhs(const int kappa_a,
622 const DiracSpinor &Fb) const override final {
623 DiracSpinor dF(0, kappa_a, Fb.grid_sptr());
624 dF.min_pt() = Fb.min_pt();
625 dF.max_pt() = Fb.max_pt();
626
627 if (isZero(kappa_a, Fb.kappa())) {
628 return dF;
629 }
630
631 if (m_K == 0) {
632 // XXX Need to think about how to do omega here nicely
633 // return dF;
634 // XXX omega_ab factored out!! XXX
635
636 const auto w_ab = m_q / m_alpha;
637 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
638 const auto wab2 = std::pow(w_ab, 2);
639 const auto c = 0.5 * m_alpha * m_alpha * m_alpha * wab2 * f_rel;
640
641 Rab_rhs(+1, m_vec, &dF, Fb, c);
642 } else if (m_K == 1) {
643 Pab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
644 }
645
646 return dF;
647 }
648
649 double radialIntegral(const DiracSpinor &Fa,
650 const DiracSpinor &Fb) const override final {
651
652 if (isZero(Fa.kappa(), Fb.kappa())) {
653 return 0.0;
654 }
655
656 if (m_K == 0) {
657
658 // XXX q here is via _frequency_, not momentum
659 const auto w_ab = Fa.en() - Fb.en();
660 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
661
662 const auto wab2 = std::pow(w_ab, 2);
663 return 0.5 * m_alpha * m_alpha * m_alpha * wab2 * Rab(+1, m_vec, Fa, Fb) *
664 f_rel;
665 }
666
667 if (m_K == 1) {
668 return -(m_q / 3.0) * Pab(+1, m_vec, Fa, Fb);
669 }
670
671 return 0.0;
672 }
673
675 void updateFrequency(const double omega) override final {
676 m_q = m_alpha * omega;
677 }
678
679private:
680 int m_K;
681 double m_alpha;
682 double m_q{};
683};
684
685} // namespace DiracOperator
Low qr form of Axial electric multipole operator: .
Definition EM_multipole_lowqr.hpp:248
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:308
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:347
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:265
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:257
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:261
Low qr form of Axial longitudinal multipole operator: .
Definition EM_multipole_lowqr.hpp:358
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:367
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:371
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:408
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:433
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:375
Low qr form of Axial magnetic multipole operator: .
Definition EM_multipole_lowqr.hpp:444
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:458
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:488
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:510
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:462
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:454
Low qr form of Temporal component of the axial vector multipole operator: . NOTE: If K=0,...
Definition EM_multipole_lowqr.hpp:522
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:533
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
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:537
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:565
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:541
Low qr form of Temporal component of the vector multipole operator: .
Definition EM_multipole_lowqr.hpp:107
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:125
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:121
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:117
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:146
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:164
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:603
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:675
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:617
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:621
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:649
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:613
Low qr form of Scalar multipole operator: .
Definition EM_multipole_lowqr.hpp:176
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:193
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:214
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:233
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:185
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:189
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:110
bool isZero(const int ka, int kb) const
If matrix element <a|h|b> is zero, returns true.
Definition TensorOperator.cpp:15
Low qr form of Vector electric. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:10
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:17
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:21
Low qr form of Vector longitudanal.
Definition EM_multipole_lowqr.hpp:76
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:83
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:87
Low qr form of Vector magnetic. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:39
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:47
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:51
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:65
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:144
auto min_pt() const
First non-zero point (index for f[i])
Definition DiracSpinor.hpp:140
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:154
double Ck_kk(int k, int ka, int kb)
Reduced (relativistic) angular ME: <ka||C^k||kb> [takes k and kappa].
Definition Wigner369j.hpp:306
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:219
double Gab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Gab function: Int[ (ga*gb ) * t(r) , dr].
Definition TensorOperator.cpp:257
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:207
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:229
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:193
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