Пример #1
0
def sun_angular_radius(jdate, solar_radius = 6.96342e8, one_au=1.496e11):
    """Calculate the angular size of the sun at the specified date. Assumes that
    solar radius is 6.9e8m, one AU is 1.496e11m"""
    #as Google usefully says, solar_radius = 1 solar radius
    #wikipedia solar radius 6.96342x10^5 km
    # 1 Au 1.496x10^8 km
    orbit_radius = marstime.heliocentric_distance(jdate) #in AU.
    angular_radius = solar_radius / (orbit_radius * one_au)
    angular_radius_degree = numpy.rad2deg(angular_radius)
    return angular_radius_degree
Пример #2
0
def sun_angular_radius(jdate, solar_radius=6.96342e8, one_au=1.496e11):
    """Calculate the angular size of the sun at the specified date. Assumes that
    solar radius is 6.9e8m, one AU is 1.496e11m"""
    #as Google usefully says, solar_radius = 1 solar radius
    #wikipedia solar radius 6.96342x10^5 km
    # 1 Au 1.496x10^8 km
    orbit_radius = marstime.heliocentric_distance(jdate)  #in AU.
    angular_radius = solar_radius / (orbit_radius * one_au)
    angular_radius_degree = numpy.rad2deg(angular_radius)
    return angular_radius_degree
Пример #3
0
def test_spirit_landing():
    mil = 1073137591000
    longitude=184.702
    latitude=-14.460
    jdut = marstime.julian(mil)
    assert within_error(jdut,2453008.07397,1e-3)
    
    tt_utc = marstime.utc_to_tt_offset(jdut)
    assert within_error(tt_utc,64.184,1e-3)
    
    jday_tt = marstime.julian_tt(jdut)
    assert within_error(jday_tt, 2453008.07471,1e-3)
    
    j2000_ott = marstime.j2000_offset_tt(jday_tt)
    assert within_error(j2000_ott, 1463.07471, 1e-3)

    m = marstime.Mars_Mean_Anomaly(j2000_ott)
    assert within_error(m, 66.06851,1e3)

    alpha = marstime.FMS_Angle(j2000_ott)
    assert within_error(alpha, 317.09363,1e-4)

    pbs = marstime.alpha_perturbs(j2000_ott)
    assert within_error(pbs, 0.01614, 1e-3)

    v_m = marstime.equation_of_center(j2000_ott)
    assert within_error(v_m, 10.22959, 1e-4)

    ls = marstime.Mars_Ls(j2000_ott)
    assert within_error(ls, 327.32322, 1e-4)

    eot = marstime.equation_of_time(j2000_ott)
    assert within_error(eot, -12.77557, 1e-4)

    mtc = marstime.Coordinated_Mars_Time(j2000_ott)
    assert within_error(mtc,13.16542, 1e-4)

    lmst = marstime.Local_Mean_Solar_Time(longitude,j2000_ott)
    assert within_error(lmst, 0.85196, 1e-4)

    ltst = marstime.Local_True_Solar_Time(longitude,j2000_ott)
    assert within_error(ltst, 0.00025, 1e-5)

    subsol = marstime.subsolar_longitude(j2000_ott)
    assert within_error(subsol, 4.70575,1e-4)

    dec = marstime.solar_declination(ls)
    assert within_error(dec, -13.42105,1e-2)

    rm = marstime.heliocentric_distance(j2000_ott)
    assert within_error(rm,1.47767, 1e-4)

    im = marstime.heliocentric_longitude(j2000_ott)
    assert within_error(im, 52.37469, 1e-4)

    bm = marstime.heliocentric_latitude(j2000_ott)
    assert within_error(bm, 0.08962, 1e-4)

#This is where we deviate significantly from the original marstime algorithm.
    sz = marstime.solar_zenith(longitude, latitude,j2000_ott)
    assert within_error(sz, 151.93895, 0.2)

    sa = marstime.solar_azimuth(longitude, latitude,j2000_ott)
    assert within_error(sa, 179.99225,1e-2)
Пример #4
0
def test_midnight_crossing():
    mil = 947116800000
    longitude=0.
    latitude=0.
    jdut = marstime.julian(mil)
    assert within_error(jdut,2451549.5,1e-3)
    
    tt_utc = marstime.utc_to_tt_offset(jdut)
    assert within_error(tt_utc,64.184,1e-3)
    
    jday_tt = marstime.julian_tt(jdut)
    assert within_error(jday_tt, 2451549.50074,1e-3)
    
    j2000_ott = marstime.j2000_offset_tt(jday_tt)
    assert within_error(j2000_ott, 4.50074, 1e-3)

    m = marstime.Mars_Mean_Anomaly(j2000_ott)
    assert within_error(m, 21.74548,1e3)

    alpha = marstime.FMS_Angle(j2000_ott)
    assert within_error(alpha, 272.74486,1e-4)

    pbs = marstime.alpha_perturbs(j2000_ott)
    assert within_error(pbs, 0.00142, 1e-3)

    v_m = marstime.equation_of_center(j2000_ott)
    assert within_error(v_m, 4.44191, 1e-4)

    ls = marstime.Mars_Ls(j2000_ott)
    assert within_error(ls, 277.18677, 1e-4)

    eot = marstime.equation_of_time(j2000_ott)
    assert within_error(eot, -5.18764, 1e-4)

    mtc = marstime.Coordinated_Mars_Time(j2000_ott)
    assert within_error(mtc,23.99431, 1e-4)

    lmst = marstime.Local_Mean_Solar_Time(longitude,j2000_ott)
    assert within_error(lmst, 23.99431, 1e-4)

    ltst = marstime.Local_True_Solar_Time(longitude,j2000_ott)
    assert within_error(ltst, 23.64847, 1e-4)

    subsol = marstime.subsolar_longitude(j2000_ott)
    assert within_error(subsol, 174.72703,1e-4)

    dec = marstime.solar_declination(ls)
    assert within_error(dec, -25.22838,1e-4)

    rm = marstime.heliocentric_distance(j2000_ott)
    assert within_error(rm, 1.39358, 1e-4)

    im = marstime.heliocentric_longitude(j2000_ott)
    assert within_error(im, 2.26270, 1e-4)

    bm = marstime.heliocentric_latitude(j2000_ott)
    assert within_error(bm, -1.35959, 1e-4)

    sz = marstime.solar_zenith(longitude, latitude,j2000_ott)
    assert within_error(sz, 154.26182, 1e-4)

    sa = marstime.solar_azimuth(longitude, latitude,j2000_ott)
    assert within_error(sa, 191.03687,1e-4)
Пример #5
0
def test_heliocentric_distance():
    assert within_error(marstime.heliocentric_distance(0.0), 1.391,1e-3)
    assert within_error(marstime.heliocentric_distance(1000.0), 1.665,1e-3)
Пример #6
0
def SetupMarsPlot():
    import matplotlib.pyplot as pl
    import numpy as np
    import marstime
    from astropy.time import Time
    from astropy import constants as const

    canvas = pl.figure(figsize=(8.0, 6.0), dpi=150, facecolor="white")
    x0, x1, xtks = -180., 180., 13
    y0, y1, ytks = 25., 90., 14

    #NORTH
    axN = canvas.add_subplot(3, 1, 1, axisbg="white")

    axN.set_xlim(x0, x1)
    axN.set_xticks(np.linspace(x0, x1, xtks, endpoint=True))

    axN.set_ylim(y0, y1)
    axN.set_yticks(np.linspace(y0, y1, ytks, endpoint=True))

    axN.grid(linewidth=0.5)
    axN.tick_params(axis='y', which='major', labelsize=9)
    axN.tick_params(labelbottom=False)
    axN.set_ylabel("Latitude (deg)", fontsize=9)
    axN.set_title("North Pole", fontsize=10)

    LS_ALPO = np.linspace(40, 135, 20)
    LAT_ALPO = [
        65.1, 67.4, 67.6, 68.0, 69.7, 72.2, 74.0, 75.5, 77.8, 79.8, 81.2, 81.6,
        82.7, 83.1, 82.9, 82.4, 82.8, 83.5, 83.6, 83.4
    ]
    LAT_SD_ALPO = [
        4.4, 4.5, 3.4, 2.4, 2.4, 2.1, 1.4, 1.8, 2.8, 2.9, 2.5, 2.2, 1.3, 1.5,
        1.6, 1.8, 1.9, 1.0, 0.7, 0.6
    ]
    axN.plot(LS_ALPO, LAT_ALPO, color='k', label="ALPO 1980-2003 Average")
    axN.plot(LS_ALPO,
             np.array(LAT_ALPO) + 1.96 * np.array(LAT_SD_ALPO),
             color='k',
             linewidth=0.5,
             label="95% Confidence")
    axN.plot(LS_ALPO,
             np.array(LAT_ALPO) - 1.96 * np.array(LAT_SD_ALPO),
             color='k',
             linewidth=0.5)

    #SOUTH
    axS = canvas.add_subplot(3, 1, 3, axisbg="white")
    y0, y1, ytks = 25., 90., 14

    axS.set_xlim(x0, x1)
    axS.set_xticks(np.linspace(x0, x1, xtks, endpoint=True))
    axS.set_ylim(-y1, -y0)
    axS.set_yticks(np.linspace(-y1, -y0, ytks, endpoint=True))

    axS.grid(linewidth=0.5)
    axS.tick_params(axis='both', which='major', labelsize=8)
    axS.set_ylabel("Latitude (deg)", fontsize=9)
    axS.set_xlabel("Solar Longitude (deg)", fontsize=9)
    axS.set_title("South Pole", fontsize=10)

    LS_ALPO = np.linspace(200, 300, 21) - 360.
    W_ALPO = [
        54.0, 51.2, 49.1, 47.4, 44.4, 40.4, 38.2, 35.1, 31.3, 28.9, 23.9, 21.6,
        20.6, 19.2, 16.8, 16.0, 14.6, 12.1, 9.8, 9.5, 10.6
    ]
    LAT_SD_ALPO = [
        7.1, 6.5, 4.6, 5.5, 4.9, 7.5, 7.8, 6.5, 6.1, 5.4, 4.2, 3.1, 1.7, 2.2,
        2.2, 2.3, 3.0, 3.2, 1.8, 1.4, 1.0
    ]
    LAT_ALPO = -(90. - np.array(W_ALPO) / 2.)
    axS.plot(LS_ALPO, LAT_ALPO, color='k', label="ALPO 1986-2003 Average")
    axS.plot(LS_ALPO,
             np.array(LAT_ALPO) + 1.96 * np.array(LAT_SD_ALPO),
             color='k',
             linewidth=0.5,
             label="95% Confidence")
    axS.plot(LS_ALPO,
             np.array(LAT_ALPO) - 1.96 * np.array(LAT_SD_ALPO),
             color='k',
             linewidth=0.5)

    #SOLAR LATITUDE
    Target = "Solar Latitude"

    axL = canvas.add_subplot(3, 1, 2, axisbg="white")
    y0, y1, ytks = -30., 30., 13
    axL.set_xlim(x0, x1)
    axL.set_xticks(np.linspace(x0, x1, xtks, endpoint=True))
    axL.set_ylim(y0, y1)
    axL.set_yticks(np.linspace(y0, y1, ytks, endpoint=True))
    axL.grid(linewidth=0.5)
    axL.tick_params(axis='y', which='major', labelsize=9)
    axL.tick_params(labelbottom=False)
    axL.set_ylabel("Solar Latitude (deg)", fontsize=9)

    axL.set_title(Target, fontsize=9)

    #306 days to start at Autumn equinox rather than vernal equinox
    dateoffset = np.arange(0, 686, 2, dtype=int) - 306
    datearray = np.datetime64('2000-06-03') + dateoffset

    LS_array = []
    SL_array = []
    D_array = []
    F_array = []
    for d in datearray:
        t = Time(str(d), format='isot', scale='utc')
        ott = t.jd - 2451545.0
        LS_temp = marstime.Mars_Ls(j2000_ott=ott)
        SL_temp = marstime.solar_declination(ls=LS_temp)
        D_temp = marstime.heliocentric_distance(j2000_ott=ott)
        F_temp = const.L_sun / (4. * np.pi * (const.au * D_temp)**2)
        print ott, LS_temp, SL_temp, D_temp, F_temp
        LS_array.append(float(LS_temp))
        SL_array.append(float(SL_temp))
        D_array.append(float(D_temp))
        F_array.append(float(F_temp.value))
    LS_array = np.array(LS_array)
    SL_array = np.array(SL_array)

    LS_array = np.mod(LS_array + 180.0, 360.) - 180.

    axL.plot(LS_array, SL_array, color='k', label="Solar Latitude (deg)")

    axD = axL.twinx()
    axD.set_xlim(x0, x1)
    axD.set_xticks(np.linspace(x0, x1, xtks, endpoint=True))
    axD.set_ylim(500, 700)
    axD.set_yticks(np.linspace(400, 800, 9, endpoint=True))
    axD.tick_params(axis='y', which='major', labelsize=9)
    axD.set_ylabel("Solar Flux (W/m^2)", fontsize=9)

    axD.plot(LS_array, F_array, color='b', label="Solar Distance")

    Seasons = ['Autumn', 'Winter', 'Spring', 'Summer']
    for j in range(0, len(Seasons)):
        axL.annotate(Seasons[j],
                     xy=(-135. + 90. * j, 27.5),
                     size=9,
                     horizontalalignment='center',
                     verticalalignment='center')
        axL.annotate(Seasons[np.mod(j + 2, 4)],
                     xy=(-135. + 90. * j, -27.5),
                     size=9,
                     horizontalalignment='center',
                     verticalalignment='center')

    pl.subplots_adjust(left=0.1, right=0.9, top=0.95, bottom=0.09)

    return axN, axS