def carrington_rotation_number(t='now'): """ Return the Carrington Rotation number """ jd = julian_day(t) result = (1. / 27.2753) * (jd - 2398167.0) + 1.0 return result
def test(): """ Print out a summary of Solar ephemeris A correct answer set to compare to Solar Ephemeris for 1-JAN-01 00:00:00 Distance (AU) = 0.98330468 Semidiameter (arc sec) = 975.92336 True (long, lat) in degrees = (280.64366, 0.00000) Apparent (long, lat) in degrees = (280.63336, 0.00000) True (RA, Dec) in hrs, deg = (18.771741, -23.012449) Apparent (RA, Dec) in hrs, deg = (18.770994, -23.012593) Heliographic long. and lat. of disk center in deg = (217.31269, -3.0416292) Position angle of north pole in deg = 2.0102649 Carrington Rotation Number = 1971.4091 check! """ t = '2001-01-01T00:00:00' swpy_jd = swdt.julian_day(t) sunpy_jd = sunt.julian_day(t) print "SWPY JD: {}, SUNPY JD: {}".format(swpy_jd,sunpy_jd) print "Sun-earth distance: {}, {}".format( sun.sunearth_distance(t), ssun.sunearth_distance(t)) print "Solar semidiameter angular size: {}, {}".format( sun.solar_semidiameter_angular_size(t), sun.solar_semidiameter_angular_size(t)) print "True longitude: {}, {}".format(sun.true_longitude(t), ssun.true_longitude(t)) print "Apparent Longitude: {}, {}".format(sun.apparent_longitude(t), ssun.apparent_longitude(t)) print "True R.A.: {}, {}".format( sun.true_rightascension(t), ssun.true_rightascension(t)) print "True Dec.: {}, {}".format(sun.true_declination(t), ssun.true_declination(t)) print "Apparent R.A.: {}, {}".format( sun.apparent_rightascension(t), ssun.apparent_rightascension(t)) print "Apparent Dec.: {}, {}".format(sun.apparent_declination(t), ssun.apparent_declination(t)) print "Heliographic center: {}, {}".format(sun.heliographic_solar_center(t), ssun.heliographic_solar_center(t)) print "Position angle of north pole [deg]: {}, {}".format(sun.solar_north(t), ssun.solar_north(t)) print "Carrington rotation number: {}, {}".format(sun.carrington_rotation_number(t), ssun.carrington_rotation_number(t))
def heliographic_solar_center(t='now'): """Returns the position of the solar center in heliographic coordinates.""" jd = julian_day(t) T = julian_centuries(t) # Heliographic coordinates in degrees theta = ((jd - 2398220)*360/25.38) * u.deg i = 7.25 * u.deg k = (74.3646 + 1.395833 * T) * u.deg lamda = true_longitude(t) - 0.00569 * u.deg diff = lamda - k # Latitude at center of disk (deg): he_lat = np.degrees(np.arcsin(np.sin(diff)*np.sin(i))) # Longitude at center of disk (deg): y = -np.sin(diff)*np.cos(i) x = -np.cos(diff) rpol = (np.arctan2(y, x)) he_lon = rpol - theta return [Longitude(he_lon), Latitude(he_lat)]
def heliographic_solar_center(t='now'): """Returns the position of the solar center in heliographic coordinates.""" jd = julian_day(t) T = julian_centuries(t) # Heliographic coordinates in degrees theta = ((jd - 2398220)*360/25.38) * u.deg i = 7.25 * u.deg k = (74.3646 + 1.395833 * T) * u.deg lamda = true_longitude(t) - 0.00569 * u.deg diff = lamda - k # Latitude at center of disk (deg): he_lat = np.arcsin(np.sin(diff)*np.sin(i)) # Longitude at center of disk (deg): y = -np.sin(diff)*np.cos(i) x = -np.cos(diff) rpol = (np.arctan2(y, x)) he_lon = rpol - theta return (Longitude(he_lon.to(u.deg)), Latitude(he_lat.to(u.deg)))
def heliographic_solar_center(t=None): """Returns the position of the solar center in heliographic coordinates.""" jd = julian_day(t) T = julian_centuries(t) # Heliographic coordinates in degrees theta = (jd - 2398220) * 360 / 25.38 i = 7.25 k = 74.3646 + 1.395833 * T lamda = true_longitude(t) - 0.00569 #omega = apparent_longitude(t) #lamda2 = lamda - 0.00479 * math.sin(np.radians(omega)) diff = np.radians(lamda - k) # Latitude at center of disk (deg): he_lat = np.degrees(math.asin(math.sin(diff) * math.sin(np.radians(i)))) # Longitude at center of disk (deg): y = -math.sin(diff) * math.cos(np.radians(i)) x = -math.cos(diff) rpol = cmath.polar(complex(x, y)) he_lon = np.degrees(rpol[1]) - theta he_lon = he_lon % 360 if he_lon < 0: he_lon = he_lon + 360.0 return [he_lon, he_lat]
def heliographic_solar_center(t=None): """Returns the position of the solar center in heliographic coordinates.""" jd = julian_day(t) T = julian_centuries(t) # Heliographic coordinates in degrees theta = (jd - 2398220)*360/25.38 i = 7.25 k = 74.3646 + 1.395833 * T lamda = true_longitude(t) - 0.00569 #omega = apparent_longitude(t) #lamda2 = lamda - 0.00479 * math.sin(np.radians(omega)) diff = np.radians(lamda - k) # Latitude at center of disk (deg): he_lat = np.degrees(np.arcsin(np.sin(diff)*np.sin(np.radians(i)))) # Longitude at center of disk (deg): y = -np.sin(diff)*np.cos(np.radians(i)) x = -np.cos(diff) rpol = cmath.polar(complex(x,y)) he_lon = np.degrees(rpol[1]) - theta he_lon = he_lon % 360 if he_lon < 0: he_lon = he_lon + 360.0 return [he_lon, he_lat]
def _sun_pos(date): """ Calculate solar ephemeris parameters. Allows for planetary and lunar perturbations in the calculation of solar longitude at date and various other solar positional parameters. This routine is a truncated version of Newcomb's Sun and is designed to give apparent angular coordinates (T.E.D) to a precision of one second of time. This function replicates the SSW/ IDL function "sun_pos.pro". This function is assigned to be internal at the moment as it should really be replaced by accurate ephemeris calculations in the part of SunPy that handles ephemeris. Parameters ----------- date : `sunpy.time.time` Time at which the solar ephemeris parameters are calculated. The input time can be in any acceptable time format. Returns ------- A dictionary with the following keys with the following meanings: longitude - Longitude of sun for mean equinox of date (degs) ra - Apparent RA for true equinox of date (degs) dec - Apparent declination for true equinox of date (degs) app_long - Apparent longitude (degs) obliq - True obliquity (degs) Notes ----- SSWIDL code equivalent: http://hesperia.gsfc.nasa.gov/ssw/gen/idl/solar/sun_pos.pro Examples -------- >>> sp = _sun_pos('2013-03-27') """ # Fractional Julian day with correct offset dd = julian_day(date) - 2415020.0 # form time in Julian centuries from 1900.0 t = dd / 36525.0 # form sun's mean longitude l = (279.6966780 + np.mod(36000.7689250 * t, 360.00)) * 3600.0 # allow for ellipticity of the orbit (equation of centre) using the Earth's # mean anomaly ME me = 358.4758440 + np.mod(35999.049750 * t, 360.0) ellcor = (6910.10 - 17.20 * t) * np.sin(np.deg2rad(me)) + \ 72.30 * np.sin(np.deg2rad(2.0 * me)) l = l + ellcor # allow for the Venus perturbations using the mean anomaly of Venus MV mv = 212.603219 + np.mod(58517.8038750 * t, 360.0) vencorr = 4.80 * np.cos(np.deg2rad(299.10170 + mv - me)) + \ 5.50 * np.cos(np.deg2rad(148.31330 + 2.0 * mv - 2.0 * me)) + \ 2.50 * np.cos(np.deg2rad(315.94330 + 2.0 * mv - 3.0 * me)) + \ 1.60 * np.cos(np.deg2rad(345.25330 + 3.0 * mv - 4.0 * me)) + \ 1.00 * np.cos(np.deg2rad(318.150 + 3.0 * mv - 5.0 * me)) l = l + vencorr # Allow for the Mars perturbations using the mean anomaly of Mars MM mm = 319.5294250 + np.mod(19139.858500 * t, 360.0) marscorr = 2.0 * np.cos(np.deg2rad(343.88830 - 2.0 * mm + 2.0 * me)) + \ 1.80 * np.cos(np.deg2rad(200.40170 - 2.0 * mm + me)) l = l + marscorr # Allow for the Jupiter perturbations using the mean anomaly of Jupiter MJ mj = 225.3283280 + np.mod(3034.69202390 * t, 360.00) jupcorr = 7.20 * np.cos(np.deg2rad(179.53170 - mj + me)) + \ 2.60 * np.cos(np.deg2rad(263.21670 - mj)) + \ 2.70 * np.cos(np.deg2rad(87.14500 - 2.0 * mj + 2.0 * me)) + \ 1.60 * np.cos(np.deg2rad(109.49330 - 2.0 * mj + me)) l = l + jupcorr # Allow for the Moons perturbations using the mean elongation of the Moon # from the Sun D d = 350.73768140 + np.mod(445267.114220 * t, 360.0) mooncorr = 6.50 * np.sin(np.deg2rad(d)) l = l + mooncorr # Note the original code is # longterm = + 6.4d0 * sin(( 231.19d0 + 20.20d0 * t )*!dtor) longterm = 6.40 * np.sin(np.deg2rad(231.190 + 20.20 * t)) l = l + longterm l = np.mod(l + 2592000.0, 1296000.0) longmed = l / 3600.0 # Allow for Aberration l = l - 20.5 # Allow for Nutation using the longitude of the Moons mean node OMEGA omega = 259.1832750 - np.mod(1934.1420080 * t, 360.0) l = l - 17.20 * np.sin(np.deg2rad(omega)) # Form the True Obliquity oblt = 23.4522940 - 0.01301250 * t + \ (9.20 * np.cos(np.deg2rad(omega))) / 3600.0 # Form Right Ascension and Declination l = l / 3600.0 ra = np.rad2deg(np.arctan2(np.sin(np.deg2rad(l)) * \ np.cos(np.deg2rad(oblt)), np.cos(np.deg2rad(l)))) if isinstance(ra, np.ndarray): ra[ra < 0.0] += 360.0 elif ra < 0.0: ra = ra + 360.0 dec = np.rad2deg(np.arcsin(np.sin(np.deg2rad(l)) * np.sin(np.deg2rad(oblt)))) # convert the internal variables to those listed in the top of the # comment section in this code and in the original IDL code. Quantities # are assigned following the advice in Astropy "Working with Angles" return {"longitude": Longitude(longmed, u.deg), "ra": Longitude(ra, u.deg), "dec": Latitude(dec, u.deg), "app_long": Longitude(l, u.deg), "obliq": Angle(oblt, u.deg)}
def _calc_P_B0_SD(date): """ To calculate the solar P, B0 angles and the semi-diameter as seen from Earth. This function is assigned as being internal as these quantities should be calculated in a part of SunPy that can calculate these quantities accurately. Parameters ----------- date: `sunpy.time.time` the time at which to calculate the solar P, B0 angles and the semi-diameter. Returns ------- A dictionary with the following keys with the following meanings: p - Solar P (position angle of pole) (degrees) b0 - latitude of point at disk centre (degrees) sd - semi-diameter of the solar disk in arcminutes Notes ----- SSWIDL code equivalent: http://hesperia.gsfc.nasa.gov/ssw/gen/idl/solar/pb0r.pro """ # number of Julian days since 2415020.0 de = julian_day(parse_time(date)) - 2415020.0 # get the longitude of the sun etc. sun_position = _sun_pos(date) longmed = sun_position["longitude"].to(u.deg).value #ra = sun_position["ra"] #dec = sun_position["dec"] appl = sun_position["app_long"].to(u.deg).value oblt = sun_position["obliq"].to(u.deg).value # form the aberrated longitude Lambda = longmed - (20.50 / 3600.0) # form longitude of ascending node of sun's equator on ecliptic node = 73.6666660 + (50.250 / 3600.0) * ((de / 365.250) + 50.0) arg = Lambda - node # calculate P, the position angle of the pole p = np.rad2deg( np.arctan(-np.tan(np.deg2rad(oblt)) * np.cos(np.deg2rad(appl))) + np.arctan(-0.127220 * np.cos(np.deg2rad(arg)))) # B0 the tilt of the axis... b = np.rad2deg(np.arcsin(0.12620 * np.sin(np.deg2rad(arg)))) # ... and the semi-diameter # Form the mean anomalies of Venus(MV),Earth(ME),Mars(MM),Jupiter(MJ) # and the mean elongation of the Moon from the Sun(D). t = de / 36525.0 mv = 212.60 + np.mod(58517.80 * t, 360.0) me = 358.4760 + np.mod(35999.04980 * t, 360.0) mm = 319.50 + np.mod(19139.860 * t, 360.0) mj = 225.30 + np.mod(3034.690 * t, 360.0) d = 350.70 + np.mod(445267.110 * t, 360.0) # Form the geocentric distance(r) and semi-diameter(sd) r = 1.0001410 - (0.0167480 - 0.00004180 * t) * np.cos(np.deg2rad(me)) \ - 0.000140 * np.cos(np.deg2rad(2.0 * me)) \ + 0.0000160 * np.cos(np.deg2rad(58.30 + 2.0 * mv - 2.0 * me)) \ + 0.0000050 * np.cos(np.deg2rad(209.10 + mv - me)) \ + 0.0000050 * np.cos(np.deg2rad(253.80 - 2.0 * mm + 2.0 * me)) \ + 0.0000160 * np.cos(np.deg2rad(89.50 - mj + me)) \ + 0.0000090 * np.cos(np.deg2rad(357.10 - 2.0 * mj + 2.0 * me)) \ + 0.0000310 * np.cos(np.deg2rad(d)) sd_const = constants.radius / constants.au sd = np.arcsin(sd_const / r) * 10800.0 / np.pi return {"p": Angle(p, u.deg), "b0": Angle(b, u.deg), "sd": Angle(sd.value, u.arcmin), "l0": Angle(0.0, u.deg)}
def pb0r(date, stereo=None, soho=False, arcsec=False): # Ejemplo: # >> from cjd_pylib import pb0r # >> A = pb0r.pb0r('2014-06-17T09:35:00') # {'p': -8.8133708, 'b0': 1.2762924, 'l0': 0.0, 'sd': 15.732692} """To calculate the solar P, B0 angles and the semi-diameter. Parameters ----------- date: a date/time object - the date/time specified in any CDS format stereo: { 'A' | 'B' | None } calculate the solar P, B0 angles and the semi-diameter from the point of view of either of the STEREO spacecraft. soho: { False | True } calculate the solar P, B0 angles and the semi-diameter from the point of view of the SOHO spacecraft. SOHO sits at the Lagrange L1 point which is about 1% closer to the Sun than the Earth. Implementation of this seems to require the ability to read SOHO orbit files. arcsec: { False | True } return the semi-diameter in arcseconds. Returns: ------- A dictionary with the following keys with the following meanings: p - Solar P (position angle of pole) (degrees) b0 - latitude of point at disk centre (degrees) sd - semi-diameter of the solar disk in arcminutes See Also -------- IDL code equavalent: http://hesperia.gsfc.nasa.gov/ssw/gen/idl/solar/pb0r.pro """ if (stereo is not None) and soho: raise ValueError("Cannot set STEREO and SOHO simultaneously") # place holder for STEREO calculation if stereo is not None: raise ValueError("STEREO solar P, B0 and semi-diameter calcution" + \ " is not supported.") # number of Julian days since 2415020.0 de = julian_day(date) - 2415020.0 # get the longitude of the sun etc. sun_position = sun_pos(date) longmed = sun_position["longitude"] #ra = sun_position["ra"] #dec = sun_position["dec"] appl = sun_position["app_long"] oblt = sun_position["obliq"] # form the aberrated longitude Lambda = longmed - (20.50 / 3600.0) # form longitude of ascending node of sun's equator on ecliptic node = 73.6666660 + (50.250 / 3600.0) * ((de / 365.250) + 50.0) arg = Lambda - node # calculate P, the position angle of the pole p = np.rad2deg(\ np.arctan(-np.tan(np.deg2rad(oblt)) * np.cos(np.deg2rad(appl))) + \ np.arctan(-0.127220 * np.cos(np.deg2rad(arg)))) # B0 the tilt of the axis... b = np.rad2deg(np.arcsin(0.12620 * np.sin(np.deg2rad(arg)))) # ... and the semi-diameter # Form the mean anomalies of Venus(MV),Earth(ME),Mars(MM),Jupiter(MJ) # and the mean elongation of the Moon from the Sun(D). t = de / 36525.0 mv = 212.60 + np.mod(58517.80 * t, 360.0) me = 358.4760 + np.mod(35999.04980 * t, 360.0) mm = 319.50 + np.mod(19139.860 * t, 360.0) mj = 225.30 + np.mod(3034.690 * t, 360.0) d = 350.70 + np.mod(445267.110 * t, 360.0) # Form the geocentric distance(r) and semi-diameter(sd) r = 1.0001410 - (0.0167480 - 0.00004180 * t) * np.cos(np.deg2rad(me)) \ - 0.000140 * np.cos(np.deg2rad(2.0 * me)) \ + 0.0000160 * np.cos(np.deg2rad(58.30 + 2.0 * mv - 2.0 * me)) \ + 0.0000050 * np.cos(np.deg2rad(209.10 + mv - me)) \ + 0.0000050 * np.cos(np.deg2rad(253.80 - 2.0 * mm + 2.0 * me)) \ + 0.0000160 * np.cos(np.deg2rad(89.50 - mj + me)) \ + 0.0000090 * np.cos(np.deg2rad(357.10 - 2.0 * mj + 2.0 * me)) \ + 0.0000310 * np.cos(np.deg2rad(d)) sd_const = constants.radius / constants.au sd = np.arcsin(sd_const / r) * 10800.0 / np.pi # place holder for SOHO correction if soho: raise ValueError("SOHO correction (on the order of 1% " + \ "since SOHO sets at L1) not yet supported.") if arcsec: return {"p": p, "b0": b, "sd": sd * 60.0} else: return {"p": p, "b0": b, "sd": sd, "l0": 0.0}
def sun_pos(date, is_julian=False, since_2415020=False): """ Calculate solar ephemeris parameters. Allows for planetary and lunar perturbations in the calculation of solar longitude at date and various other solar positional parameters. This routine is a truncated version of Newcomb's Sun and is designed to give apparent angular coordinates (T.E.D) to a precision of one second of time. Parameters ----------- date: a date/time object or a fractional number of days since JD 2415020.0 is_julian: { False | True } notify this routine that the variable "date" is a Julian date (a floating point number) since_2415020: { False | True } notify this routine that the variable "date" has been corrected for the required time offset Returns: ------- A dictionary with the following keys with the following meanings: longitude - Longitude of sun for mean equinox of date (degs) ra - Apparent RA for true equinox of date (degs) dec - Apparent declination for true equinox of date (degs) app_long - Apparent longitude (degs) obliq - True obliquity (degs)longditude_delta: See Also -------- IDL code equavalent: http://hesperia.gsfc.nasa.gov/ssw/gen/idl/solar/sun_pos.pro Examples -------- >>> sp = sun_pos('2013-03-27') """ # check the time input if is_julian: # if a Julian date is being passed in if since_2415020: dd = date else: dd = date - 2415020.0 else: # parse the input time as a julian day if since_2415020: dd = julian_day(date) else: dd = julian_day(date) - 2415020.0 # form time in Julian centuries from 1900.0 t = dd / 36525.0 # form sun's mean longitude l = (279.6966780 + np.mod(36000.7689250 * t, 360.00)) * 3600.0 # allow for ellipticity of the orbit (equation of centre) using the Earth's # mean anomaly ME me = 358.4758440 + np.mod(35999.049750 * t, 360.0) ellcor = (6910.10 - 17.20 * t) * np.sin(np.deg2rad(me)) + \ 72.30 * np.sin(np.deg2rad(2.0 * me)) l = l + ellcor # allow for the Venus perturbations using the mean anomaly of Venus MV mv = 212.603219 + np.mod(58517.8038750 * t, 360.0) vencorr = 4.80 * np.cos(np.deg2rad(299.10170 + mv - me)) + \ 5.50 * np.cos(np.deg2rad(148.31330 + 2.0 * mv - 2.0 * me)) + \ 2.50 * np.cos(np.deg2rad(315.94330 + 2.0 * mv - 3.0 * me)) + \ 1.60 * np.cos(np.deg2rad(345.25330 + 3.0 * mv - 4.0 * me)) + \ 1.00 * np.cos(np.deg2rad(318.150 + 3.0 * mv - 5.0 * me)) l = l + vencorr # Allow for the Mars perturbations using the mean anomaly of Mars MM mm = 319.5294250 + np.mod(19139.858500 * t, 360.0) marscorr = 2.0 * np.cos(np.deg2rad(343.88830 - 2.0 * mm + 2.0 * me)) + \ 1.80 * np.cos(np.deg2rad(200.40170 - 2.0 * mm + me)) l = l + marscorr # Allow for the Jupiter perturbations using the mean anomaly of Jupiter MJ mj = 225.3283280 + np.mod(3034.69202390 * t, 360.00) jupcorr = 7.20 * np.cos(np.deg2rad(179.53170 - mj + me)) + \ 2.60 * np.cos(np.deg2rad(263.21670 - mj)) + \ 2.70 * np.cos(np.deg2rad(87.14500 - 2.0 * mj + 2.0 * me)) + \ 1.60 * np.cos(np.deg2rad(109.49330 - 2.0 * mj + me)) l = l + jupcorr # Allow for the Moons perturbations using the mean elongation of the Moon # from the Sun D d = 350.73768140 + np.mod(445267.114220 * t, 360.0) mooncorr = 6.50 * np.sin(np.deg2rad(d)) l = l + mooncorr # Note the original code is # longterm = + 6.4d0 * sin(( 231.19d0 + 20.20d0 * t )*!dtor) longterm = 6.40 * np.sin(np.deg2rad(231.190 + 20.20 * t)) l = l + longterm l = np.mod(l + 2592000.0, 1296000.0) longmed = l / 3600.0 # Allow for Aberration l = l - 20.5 # Allow for Nutation using the longitude of the Moons mean node OMEGA omega = 259.1832750 - np.mod(1934.1420080 * t, 360.0) l = l - 17.20 * np.sin(np.deg2rad(omega)) # Form the True Obliquity oblt = 23.4522940 - 0.01301250 * t + \ (9.20 * np.cos(np.deg2rad(omega))) / 3600.0 # Form Right Ascension and Declination l = l / 3600.0 ra = np.rad2deg(np.arctan2(np.sin(np.deg2rad(l)) * \ np.cos(np.deg2rad(oblt)), np.cos(np.deg2rad(l)))) if isinstance(ra, np.ndarray): ra[ra < 0.0] += 360.0 elif ra < 0.0: ra = ra + 360.0 dec = np.rad2deg(np.arcsin(np.sin(np.deg2rad(l)) * \ np.sin(np.deg2rad(oblt)))) # convert the internal variables to those listed in the top of the # comment section in this code and in the original IDL code. return {"longitude": longmed, "ra": ra, "dec": dec, "app_long": l, "obliq": oblt}
def pb0r(date, stereo=None, soho=False, arcsec=False): # Ejemplo: # >> from cjd_pylib import pb0r # >> A = pb0r.pb0r('2014-06-17T09:35:00') # {'p': -8.8133708, 'b0': 1.2762924, 'l0': 0.0, 'sd': 15.732692} """To calculate the solar P, B0 angles and the semi-diameter. Parameters ----------- date: a date/time object - the date/time specified in any CDS format stereo: { 'A' | 'B' | None } calculate the solar P, B0 angles and the semi-diameter from the point of view of either of the STEREO spacecraft. soho: { False | True } calculate the solar P, B0 angles and the semi-diameter from the point of view of the SOHO spacecraft. SOHO sits at the Lagrange L1 point which is about 1% closer to the Sun than the Earth. Implementation of this seems to require the ability to read SOHO orbit files. arcsec: { False | True } return the semi-diameter in arcseconds. Returns: ------- A dictionary with the following keys with the following meanings: p - Solar P (position angle of pole) (degrees) b0 - latitude of point at disk centre (degrees) sd - semi-diameter of the solar disk in arcminutes See Also -------- IDL code equavalent: http://hesperia.gsfc.nasa.gov/ssw/gen/idl/solar/pb0r.pro """ if (stereo is not None) and soho: raise ValueError("Cannot set STEREO and SOHO simultaneously") # place holder for STEREO calculation if stereo is not None: raise ValueError("STEREO solar P, B0 and semi-diameter calcution" + \ " is not supported.") # number of Julian days since 2415020.0 de = julian_day(date) - 2415020.0 # get the longitude of the sun etc. sun_position = sun_pos(date) longmed = sun_position["longitude"] #ra = sun_position["ra"] #dec = sun_position["dec"] appl = sun_position["app_long"] oblt = sun_position["obliq"] # form the aberrated longitude Lambda = longmed - (20.50 / 3600.0) # form longitude of ascending node of sun's equator on ecliptic node = 73.6666660 + (50.250 / 3600.0) * ((de / 365.250) + 50.0) arg = Lambda - node # calculate P, the position angle of the pole p = np.rad2deg(\ np.arctan(-np.tan(np.deg2rad(oblt)) * np.cos(np.deg2rad(appl))) + \ np.arctan(-0.127220 * np.cos(np.deg2rad(arg)))) # B0 the tilt of the axis... b = np.rad2deg(np.arcsin(0.12620 * np.sin(np.deg2rad(arg)))) # ... and the semi-diameter # Form the mean anomalies of Venus(MV),Earth(ME),Mars(MM),Jupiter(MJ) # and the mean elongation of the Moon from the Sun(D). t = de / 36525.0 mv = 212.60 + np.mod(58517.80 * t, 360.0) me = 358.4760 + np.mod(35999.04980 * t, 360.0) mm = 319.50 + np.mod(19139.860 * t, 360.0) mj = 225.30 + np.mod(3034.690 * t, 360.0) d = 350.70 + np.mod(445267.110 * t, 360.0) # Form the geocentric distance(r) and semi-diameter(sd) r = 1.0001410 - (0.0167480 - 0.00004180 * t) * np.cos(np.deg2rad(me)) \ - 0.000140 * np.cos(np.deg2rad(2.0 * me)) \ + 0.0000160 * np.cos(np.deg2rad(58.30 + 2.0 * mv - 2.0 * me)) \ + 0.0000050 * np.cos(np.deg2rad(209.10 + mv - me)) \ + 0.0000050 * np.cos(np.deg2rad(253.80 - 2.0 * mm + 2.0 * me)) \ + 0.0000160 * np.cos(np.deg2rad(89.50 - mj + me)) \ + 0.0000090 * np.cos(np.deg2rad(357.10 - 2.0 * mj + 2.0 * me)) \ + 0.0000310 * np.cos(np.deg2rad(d)) sd_const = constants.radius / constants.au sd = np.arcsin(sd_const / r) * 10800.0 / np.pi # place holder for SOHO correction if soho: raise ValueError("SOHO correction (on the order of 1% " + \ "since SOHO sets at L1) not yet supported.") if arcsec: return {p, b, sd * 60.0} else: return {p, b, sd}