|
1 | 1 | import numpy as np |
2 | 2 | import time |
3 | 3 | from numpy.polynomial import legendre |
4 | | -from scipy.special import eval_legendre as Legendre, sph_harm_y, spherical_jn |
| 4 | +from scipy.special import spherical_jn |
5 | 5 | from pathlib import Path |
6 | 6 |
|
| 7 | +import scipy.special |
| 8 | +from packaging import version |
| 9 | + |
| 10 | + |
| 11 | +def sph_harm_y(m, n, phi, theta): |
| 12 | + """ |
| 13 | + Args: |
| 14 | + m: azimuthal quantum number |
| 15 | + n: Degree of the harmonic, commonly denoted as l in quantum mechanics |
| 16 | + theta: polar angle in [0,pi] |
| 17 | + phi: azimuthal angle in [0, 2pi) |
| 18 | + -------------------------------------------------------------------------------------------------------- |
| 19 | + -------------------------------------------------------------------------------------------------------- |
| 20 | + In Scipy < 1.15.0 |
| 21 | + sph_harm: sph_harm(m, n, theta, phi, out=None) |
| 22 | + - m: azimuthal quantum number |
| 23 | + - n: Degree of the harmonic, commonly denoted as l in quantum mechanics |
| 24 | + - theta in [0, 2pi): azimuthal angle |
| 25 | + - phi in [0,pi]: polar angle |
| 26 | +
|
| 27 | + In SciPy >= 1.15.0 sph_harm is deprecated (and will be removed in SciPy 1.17.0) called sph_harm_y where |
| 28 | + sph_harm_y: sph_harm_y(n, m, theta, phi, *, diff_n=0) |
| 29 | + - m: azimuthal quantum number |
| 30 | + - n: Degree of the harmonic, commonly denoted as l in quantum mechanics |
| 31 | + - theta in [0,pi]: polar angle |
| 32 | + - phi in [0, 2pi): azimuthal angle |
| 33 | + -------------------------------------------------------------------------------------------------------- |
| 34 | + -------------------------------------------------------------------------------------------------------- |
| 35 | + """ |
| 36 | + scipy_version = version.parse(scipy.__version__) |
| 37 | + |
| 38 | + if scipy_version >= version.parse("1.15.0"): |
| 39 | + # New: sph_harm_y(degree, order, polar, azimuthal) |
| 40 | + return scipy.special.sph_harm_y(n, m, theta, phi) |
| 41 | + else: |
| 42 | + # Old: sph_harm(order, degree, azimuthal, polar) |
| 43 | + return scipy.special.sph_harm(m, n, phi, theta) |
| 44 | + |
7 | 45 |
|
8 | 46 | class AngularMatrixElements: |
9 | 47 | def __init__(self, l_max=5, N=101): |
@@ -34,9 +72,7 @@ def kron_delta(self, i, j): |
34 | 72 |
|
35 | 73 | def a_lm(self, l, m): |
36 | 74 | if l >= 0 and abs(m) <= l: |
37 | | - return np.sqrt( |
38 | | - ((l + 1) ** 2 - m**2) / ((2 * l + 1) * (2 * l + 3)) |
39 | | - ) |
| 75 | + return np.sqrt(((l + 1) ** 2 - m**2) / ((2 * l + 1) * (2 * l + 3))) |
40 | 76 | else: |
41 | 77 | return 0 |
42 | 78 |
|
@@ -530,19 +566,16 @@ def setup_l_matrix_elements(self, arr_to_calc_dict, m=0): |
530 | 566 | and arr_to_calc_dict["z_Omega"] == False |
531 | 567 | ): |
532 | 568 | if abs(m) <= l1 and abs(m) <= l2: |
533 | | - self.arr["H_z_beta"][ |
534 | | - l1, l2 |
535 | | - ] = -self.l1m1_sinth_ddtheta_l2m2( |
536 | | - l1, m, l2, m |
537 | | - ) - self.l1m1_costh_l2m2( |
538 | | - l1, m, l2, m |
| 569 | + self.arr["H_z_beta"][l1, l2] = ( |
| 570 | + -self.l1m1_sinth_ddtheta_l2m2(l1, m, l2, m) |
| 571 | + - self.l1m1_costh_l2m2(l1, m, l2, m) |
539 | 572 | ) |
540 | 573 | if arr_to_calc_dict["H_Bz_Omega"]: |
541 | 574 | if abs(m) <= l1 and abs(m) <= l2: |
542 | | - self.arr["H_Bz_Omega"][ |
543 | | - l1, l2 |
544 | | - ] = self.l1m1_sinth_sq_l2m2_Lebedev( |
545 | | - Yl1m_cc, Yl2m, l1, m, l2, m |
| 575 | + self.arr["H_Bz_Omega"][l1, l2] = ( |
| 576 | + self.l1m1_sinth_sq_l2m2_Lebedev( |
| 577 | + Yl1m_cc, Yl2m, l1, m, l2, m |
| 578 | + ) |
546 | 579 | ) |
547 | 580 |
|
548 | 581 |
|
@@ -594,60 +627,60 @@ def setup_matrix_elements(self, arr_to_calc_dict): |
594 | 627 | Yl2m2 = sph_harm_y(m2, l2, self.phi, self.theta) |
595 | 628 |
|
596 | 629 | if arr_to_calc_dict["x_Omega"]: |
597 | | - self.arr["x_Omega"][ |
598 | | - I, J |
599 | | - ] = self.l1m1_sinth_cosph_l2m2(l1, m1, l2, m2) |
| 630 | + self.arr["x_Omega"][I, J] = ( |
| 631 | + self.l1m1_sinth_cosph_l2m2(l1, m1, l2, m2) |
| 632 | + ) |
600 | 633 |
|
601 | 634 | if arr_to_calc_dict["x_x_Omega"]: |
602 | | - self.arr["x_x_Omega"][ |
603 | | - I, J |
604 | | - ] = self.l1m1_sinth_sq_cosph_sq_l2m2_Lebedev( |
605 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 635 | + self.arr["x_x_Omega"][I, J] = ( |
| 636 | + self.l1m1_sinth_sq_cosph_sq_l2m2_Lebedev( |
| 637 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 638 | + ) |
606 | 639 | ) |
607 | 640 |
|
608 | 641 | if arr_to_calc_dict["y_Omega"]: |
609 | | - self.arr["y_Omega"][ |
610 | | - I, J |
611 | | - ] = self.l1m1_sinth_sinph_l2m2(l1, m1, l2, m2) |
| 642 | + self.arr["y_Omega"][I, J] = ( |
| 643 | + self.l1m1_sinth_sinph_l2m2(l1, m1, l2, m2) |
| 644 | + ) |
612 | 645 |
|
613 | 646 | if arr_to_calc_dict["y_y_Omega"]: |
614 | | - self.arr["y_y_Omega"][ |
615 | | - I, J |
616 | | - ] = self.l1m1_sinth_sq_sinph_sq_l2m2_Lebedev( |
617 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 647 | + self.arr["y_y_Omega"][I, J] = ( |
| 648 | + self.l1m1_sinth_sq_sinph_sq_l2m2_Lebedev( |
| 649 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 650 | + ) |
618 | 651 | ) |
619 | 652 |
|
620 | 653 | if arr_to_calc_dict["z_Omega"]: |
621 | | - self.arr["z_Omega"][ |
622 | | - I, J |
623 | | - ] = self.l1m1_costh_l2m2(l1, m1, l2, m2) |
| 654 | + self.arr["z_Omega"][I, J] = ( |
| 655 | + self.l1m1_costh_l2m2(l1, m1, l2, m2) |
| 656 | + ) |
624 | 657 |
|
625 | 658 | if arr_to_calc_dict["z_z_Omega"]: |
626 | | - self.arr["z_z_Omega"][ |
627 | | - I, J |
628 | | - ] = self.l1m1_costh_sq_l2m2_Lebedev( |
629 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 659 | + self.arr["z_z_Omega"][I, J] = ( |
| 660 | + self.l1m1_costh_sq_l2m2_Lebedev( |
| 661 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 662 | + ) |
630 | 663 | ) |
631 | 664 |
|
632 | 665 | if arr_to_calc_dict["z_x_Omega"]: |
633 | | - self.arr["z_x_Omega"][ |
634 | | - I, J |
635 | | - ] = self.l1m1_costh_sinth_cosph_l2m2_Lebedev( |
636 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 666 | + self.arr["z_x_Omega"][I, J] = ( |
| 667 | + self.l1m1_costh_sinth_cosph_l2m2_Lebedev( |
| 668 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 669 | + ) |
637 | 670 | ) |
638 | 671 |
|
639 | 672 | if arr_to_calc_dict["z_y_Omega"]: |
640 | | - self.arr["z_y_Omega"][ |
641 | | - I, J |
642 | | - ] = self.l1m1_costh_sinth_sinph_l2m2_Lebedev( |
643 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 673 | + self.arr["z_y_Omega"][I, J] = ( |
| 674 | + self.l1m1_costh_sinth_sinph_l2m2_Lebedev( |
| 675 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 676 | + ) |
644 | 677 | ) |
645 | 678 |
|
646 | 679 | if arr_to_calc_dict["y_x_Omega"]: |
647 | | - self.arr["y_x_Omega"][ |
648 | | - I, J |
649 | | - ] = self.l1m1_sinph_cosph_sinthsq_l2m2( |
650 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 680 | + self.arr["y_x_Omega"][I, J] = ( |
| 681 | + self.l1m1_sinph_cosph_sinthsq_l2m2( |
| 682 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 683 | + ) |
651 | 684 | ) |
652 | 685 |
|
653 | 686 | if arr_to_calc_dict["y_px_beta"]: |
@@ -723,10 +756,10 @@ def setup_matrix_elements(self, arr_to_calc_dict): |
723 | 756 | ) |
724 | 757 |
|
725 | 758 | if arr_to_calc_dict["H_Bz_Omega"]: |
726 | | - self.arr["H_Bz_Omega"][ |
727 | | - I, J |
728 | | - ] = self.l1m1_sinth_sq_l2m2_Lebedev( |
729 | | - Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 759 | + self.arr["H_Bz_Omega"][I, J] = ( |
| 760 | + self.l1m1_sinth_sq_l2m2_Lebedev( |
| 761 | + Yl1m1_cc, Yl2m2, l1, m1, l2, m2 |
| 762 | + ) |
730 | 763 | ) |
731 | 764 | toc = time.time() |
732 | 765 | print(f"Time setup angular matrix elements: {toc-tic}") |
|
0 commit comments