@@ 757-801 (lines=45) @@ | ||
754 | ||
755 | return alat, alon |
|
756 | ||
757 | def mlon2mlt(self, mlon, dtime, ssheight=318550): |
|
758 | """Computes the magnetic local time at the specified magnetic longitude |
|
759 | and UT. |
|
760 | ||
761 | Parameters |
|
762 | ---------- |
|
763 | mlon : array_like |
|
764 | Magnetic longitude (apex and quasi-dipole longitude are always |
|
765 | equal) |
|
766 | dtime : :class:`datetime.datetime` |
|
767 | Date and time |
|
768 | ssheight : float, optional |
|
769 | Altitude in km to use for converting the subsolar point from |
|
770 | geographic to magnetic coordinates. A high altitude is used |
|
771 | to ensure the subsolar point is mapped to high latitudes, which |
|
772 | prevents the South-Atlantic Anomaly (SAA) from influencing the MLT. |
|
773 | The current default is 50 * 6371, roughly 50 RE. (default=318550) |
|
774 | ||
775 | Returns |
|
776 | ------- |
|
777 | mlt : ndarray or float |
|
778 | Magnetic local time in hours [0, 24) |
|
779 | ||
780 | Notes |
|
781 | ----- |
|
782 | To compute the MLT, we find the apex longitude of the subsolar point at |
|
783 | the given time. Then the MLT of the given point will be computed from |
|
784 | the separation in magnetic longitude from this point (1 hour = 15 |
|
785 | degrees). |
|
786 | ||
787 | """ |
|
788 | # Get the subsolar location |
|
789 | ssglat, ssglon = helpers.subsol(dtime) |
|
790 | ||
791 | # Convert the subsolar location to apex coordinates |
|
792 | _, ssalon = self.geo2apex(ssglat, ssglon, ssheight) |
|
793 | ||
794 | # Calculate the magnetic local time (0-24 h range) from apex longitude. |
|
795 | # Ensure lists are converted to arrays |
|
796 | mlt = (180 + np.asarray(mlon) - ssalon) / 15 % 24 |
|
797 | ||
798 | if mlt.shape == (): |
|
799 | mlt = np.float64(mlt) |
|
800 | ||
801 | return mlt |
|
802 | ||
803 | def mlt2mlon(self, mlt, dtime, ssheight=318550): |
|
804 | """Computes the magnetic longitude at the specified MLT and UT. |
|
@@ 803-845 (lines=43) @@ | ||
800 | ||
801 | return mlt |
|
802 | ||
803 | def mlt2mlon(self, mlt, dtime, ssheight=318550): |
|
804 | """Computes the magnetic longitude at the specified MLT and UT. |
|
805 | ||
806 | Parameters |
|
807 | ---------- |
|
808 | mlt : array_like |
|
809 | Magnetic local time |
|
810 | dtime : :class:`datetime.datetime` |
|
811 | Date and time |
|
812 | ssheight : float, optional |
|
813 | Altitude in km to use for converting the subsolar point from |
|
814 | geographic to magnetic coordinates. A high altitude is used |
|
815 | to ensure the subsolar point is mapped to high latitudes, which |
|
816 | prevents the South-Atlantic Anomaly (SAA) from influencing the MLT. |
|
817 | The current default is 50 * 6371, roughly 50 RE. (default=318550) |
|
818 | ||
819 | Returns |
|
820 | ------- |
|
821 | mlon : ndarray or float |
|
822 | Magnetic longitude [0, 360) (apex and quasi-dipole longitude are |
|
823 | always equal) |
|
824 | ||
825 | Notes |
|
826 | ----- |
|
827 | To compute the magnetic longitude, we find the apex longitude of the |
|
828 | subsolar point at the given time. Then the magnetic longitude of the |
|
829 | given point will be computed from the separation in magnetic local time |
|
830 | from this point (1 hour = 15 degrees). |
|
831 | """ |
|
832 | # Get the location of the subsolar point at this time |
|
833 | ssglat, ssglon = helpers.subsol(dtime) |
|
834 | ||
835 | # Convert the location of the subsolar point to apex coordinates |
|
836 | _, ssalon = self.geo2apex(ssglat, ssglon, ssheight) |
|
837 | ||
838 | # Calculate the magnetic longitude (0-360 h range) from MLT. |
|
839 | # Ensure lists are converted to arrays |
|
840 | mlon = (15 * np.asarray(mlt) - 180 + ssalon + 360) % 360 |
|
841 | ||
842 | if mlon.shape == (): |
|
843 | mlon = np.float64(mlon) |
|
844 | ||
845 | return mlon |
|
846 | ||
847 | def map_to_height(self, glat, glon, height, newheight, conjugate=False, |
|
848 | precision=1e-10): |