#Planetary database
#Source for planetary data, and some of the data on
#the moons, is http://nssdc.gsfc.nasa.gov/planetary/factsheet/

class Planet:
    '''
    A Planet object contains basic planetary data.
    If P is a Planet object, the data are:
           P.name = Name of the planet
           P.a = Mean radius of planet (m)
           P.g = Surface gravitational acceleration (m/s**2)
           P.L = Annual mean solar constant (current) (W/m**2)
           P.albedo Bond albedo (fraction)

           P.rsm = Semi-major axis of orbit about Sun (m)
           P.year = Sidereal length of year (s)
           P.eccentricity =  Eccentricity (unitless)
           P.day = Mean tropical length of day (s)
           P.obliquity = Obliquity to orbit (degrees)
           P.Lequinox = Longitude of equinox (degrees)

           P.Tsbar = Mean surface temperature (K)
           P.Tsmax = Maximum surface temperature (K)

    For gas giants, "surface" quantities are given at the 1 bar level
    '''

    #__repr__ object prints out a help string when help is
    #invoked on the planet object or the planet name is typed
    def __repr__(self):
        line1 =\
        'This planet object contains information on %s\n'%self.name
        line2 = 'Type \"help(Planet)\" for more information\n'
        return line1+line2
    def __init__(self):
        self.name = None #Name of the planet
        self.a = None #Mean radius of planet
        self.g = None #Surface gravitational acceleration
        self.L = None #Annual mean solar constant (current)
        self.albedo = None #Bond albedo

        self.rsm = None #Semi-major axis
        self.year = None #Sidereal length of year
        self.eccentricity = None # Eccentricity
        self.day = None #Mean tropical length of day
        self.obliquity = None #Obliquity to orbit
        self.Lequinox = None #Longitude of equinox

        self.Tsbar = None #Mean surface temperature
        self.Tsmax = None #Maximum surface temperature

#----------------------------------------------------
Mercury = Planet()
Mercury.name = 'Mercury' #Name of the planet
Mercury.a = 2.4397e6 #Mean radius of planet
Mercury.g = 3.70 #Surface gravitational acceleration
Mercury.albedo = .119 #Bond albedo
Mercury.L = 9126.6 #Annual mean solar constant (current)
#
Mercury.rsm = 57.91e9 #Semi-major axis
Mercury.year = 87.969*24.*3600. #Sidereal length of year
Mercury.eccentricity = .2056 # Eccentricity
Mercury.day = 4222.6*3600. #Mean tropical length of day
Mercury.obliquity = .01 #Obliquity to orbit (deg)
Mercury.Lequinox = None #Longitude of equinox (deg)
#
Mercury.Tsbar = 440. #Mean surface temperature
Mercury.Tsmax = 725. #Maximum surface temperature

#----------------------------------------------------
Venus = Planet()
Venus.name = 'Venus' #Name of the planet
Venus.a = 6.0518e6 #Mean radius of planet
Venus.g = 8.87 #Surface gravitational acceleration
Venus.albedo = .750 #Bond albedo
Venus.L = 2613.9 #Annual mean solar constant (current)
#
Venus.rsm = 108.21e9 #Semi-major axis
Venus.year = 224.701*24.*3600. #Sidereal length of year
Venus.eccentricity = .0067 # Eccentricity
Venus.day = 2802.*3600. #Mean tropical length of day
Venus.obliquity = 177.36 #Obliquity to orbit (deg)
Venus.Lequinox = None #Longitude of equinox (deg)
#
Venus.Tsbar = 737. #Mean surface temperature
Venus.Tsmax = 737. #Maximum surface temperature

#----------------------------------------------------
Earth = Planet()
Earth.name = 'Earth' #Name of the planet
Earth.a = 6.371e6 #Mean radius of planet
Earth.g = 9.798 #Surface gravitational acceleration
Earth.albedo = .306 #Bond albedo
Earth.L = 1367.6 #Annual mean solar constant (current)
#
Earth.rsm = 149.60e9 #Semi-major axis
Earth.year = 365.256*24.*3600. #Sidereal length of year
Earth.eccentricity = .0167 # Eccentricity
Earth.day = 24.000*3600. #Mean tropical length of day
Earth.obliquity = 23.45 #Obliquity to orbit (deg)
Earth.Lequinox = None #Longitude of equinox (deg)
#
Earth.Tsbar = 288. #Mean surface temperature
Earth.Tsmax = None #Maximum surface temperature

#----------------------------------------------------
Mars = Planet()
Mars.name = 'Mars' #Name of the planet
Mars.a = 3.390e6 #Mean radius of planet
Mars.g = 3.71 #Surface gravitational acceleration
Mars.albedo = .250 #Bond albedo
Mars.L = 589.2 #Annual mean solar constant (current)
#
Mars.rsm = 227.92e9 #Semi-major axis
Mars.year = 686.98*24.*3600. #Sidereal length of year
Mars.eccentricity = .0935 # Eccentricity
Mars.day = 24.6597*3600. #Mean tropical length of day
Mars.obliquity = 25.19 #Obliquity to orbit (deg)
Mars.Lequinox = None #Longitude of equinox (deg)
#
Mars.Tsbar = 210. #Mean surface temperature
Mars.Tsmax = 295. #Maximum surface temperature

#----------------------------------------------------
Jupiter = Planet()
Jupiter.name = 'Jupiter' #Name of the planet
Jupiter.a = 69.911e6 #Mean radius of planet
Jupiter.g = 24.79 #Surface gravitational acceleration
Jupiter.albedo = .343 #Bond albedo
Jupiter.L = 50.5 #Annual mean solar constant (current)
#
Jupiter.rsm = 778.57e9 #Semi-major axis
Jupiter.year = 4332.*24.*3600. #Sidereal length of year
Jupiter.eccentricity = .0489 # Eccentricity
Jupiter.day = 9.9259*3600. #Mean tropical length of day
Jupiter.obliquity = 3.13 #Obliquity to orbit (deg)
Jupiter.Lequinox = None #Longitude of equinox (deg)
#
Jupiter.Tsbar = 165. #Mean surface temperature
Jupiter.Tsmax = None #Maximum surface temperature

#----------------------------------------------------
Saturn = Planet()
Saturn.name = 'Saturn' #Name of the planet
Saturn.a = 58.232e6 #Mean radius of planet
Saturn.g = 10.44 #Surface gravitational acceleration
Saturn.albedo = .342 #Bond albedo
Saturn.L = 14.90 #Annual mean solar constant (current)
#
Saturn.rsm = 1433.e9 #Semi-major axis
Saturn.year = 10759.*24.*3600. #Sidereal length of year
Saturn.eccentricity = .0565 # Eccentricity
Saturn.day = 10.656*3600. #Mean tropical length of day
Saturn.obliquity = 26.73 #Obliquity to orbit (deg)
Saturn.Lequinox = None #Longitude of equinox (deg)
#
Saturn.Tsbar = 134. #Mean surface temperature
Saturn.Tsmax = None #Maximum surface temperature

#----------------------------------------------------
Uranus = Planet()
Uranus.name = 'Uranus' #Name of the planet
Uranus.a = 25.362e6 #Mean radius of planet
Uranus.g = 8.87 #Surface gravitational acceleration
Uranus.albedo = .300 #Bond albedo
Uranus.L = 3.71 #Annual mean solar constant (current)
#
Uranus.rsm = 2872.46e9 #Semi-major axis
Uranus.year = 30685.4*24.*3600. #Sidereal length of year
Uranus.eccentricity = .0457 # Eccentricity
Uranus.day = 17.24*3600. #Mean tropical length of day
Uranus.obliquity = 97.77 #Obliquity to orbit (deg)
Uranus.Lequinox = None #Longitude of equinox (deg)
#
Uranus.Tsbar = 76. #Mean surface temperature
Uranus.Tsmax = None #Maximum surface temperature


#----------------------------------------------------
Neptune = Planet()
Neptune.name = 'Neptune' #Name of the planet
Neptune.a = 26.624e6 #Mean radius of planet
Neptune.g = 11.15 #Surface gravitational acceleration
Neptune.albedo = .290 #Bond albedo
Neptune.L = 1.51 #Annual mean solar constant (current)
#
Neptune.rsm = 4495.06e9 #Semi-major axis
Neptune.year = 60189.0*24.*3600. #Sidereal length of year
Neptune.eccentricity = .0113 # Eccentricity
Neptune.day = 16.11*3600. #Mean tropical length of day
Neptune.obliquity = 28.32 #Obliquity to orbit (deg)
Neptune.Lequinox = None #Longitude of equinox (deg)
#
Neptune.Tsbar = 72. #Mean surface temperature
Neptune.Tsmax = None #Maximum surface temperature

#----------------------------------------------------
Pluto = Planet()
Pluto.name = 'Pluto' #Name of the planet
Pluto.a = 1.195e6 #Mean radius of planet
Pluto.g = .58 #Surface gravitational acceleration
Pluto.albedo = .5 #Bond albedo
Pluto.L = .89 #Annual mean solar constant (current)
#
Pluto.rsm = 5906.e9 #Semi-major axis
Pluto.year = 90465.*24.*3600. #Sidereal length of year
Pluto.eccentricity = .2488 # Eccentricity
Pluto.day = 153.2820*3600. #Mean tropical length of day
Pluto.obliquity = 122.53 #Obliquity to orbit (deg)
Pluto.Lequinox = None #Longitude of equinox (deg)
#
Pluto.Tsbar = 50. #Mean surface temperature
Pluto.Tsmax = None #Maximum surface temperature



#Selected moons

#----------------------------------------------------
Moon = Planet()
Moon.name = 'Moon' #Name of the planet
Moon.a = 1.737e6 #Mean radius of planet
Moon.g = 1.62 #Surface gravitational acceleration
Moon.albedo = .11 #Bond albedo
Moon.L = 1367.6 #Annual mean solar constant (current)
#
Moon.rsm = Earth.rsm #Semi-major axis
Moon.year = Earth.year #Sidereal length of year
Moon.eccentricity = None # Eccentricity
Moon.day = 28.*24.*3600. #Mean tropical length of day (approx)
Moon.obliquity = None #Obliquity to orbit (deg)
Moon.Lequinox = None #Longitude of equinox (deg)
#
Moon.Tsbar = None #Mean surface temperature
Moon.Tsmax = 400. #Maximum surface temperature
Moon.Tsmin = 100. #Minimum surface temperature

Titan = Planet()
Titan.name = 'Titan' #Name of the planet
Titan.a = 2.575e6 #Mean radius of planet
Titan.g = 1.35 #Surface gravitational acceleration
Titan.L = Saturn.L #Annual mean solar constant (current)
Titan.albedo = .21 #Bond albedo (Not yet updated from Cassini)
#
Titan.rsm = None #Semi-major axis
Titan.year = Saturn.year #Sidereal length of year
Titan.eccentricity = Saturn.eccentricity # Eccentricity ABOUT SUN
Titan.day = 15.9452*24.*3600. #Mean tropical length of day
Titan.obliquity = Saturn.obliquity #Obliquity to plane of Ecliptic
                                   #(Titan's rotation axis approx parallel
                                   # to Saturn's
Titan.Lequinox = Saturn.Lequinox #Longitude of equinox
#
Titan.Tsbar = 95. #Mean surface temperature
Titan.Tsmax = None #Maximum surface temperature

Europa = Planet()
Europa.name = 'Europa' #Name of the planet
Europa.a = 1.560e6 #Mean radius of planet
Europa.g = 1.31 #Surface gravitational acceleration
Europa.L = Jupiter.L #Annual mean solar constant (current)
Europa.albedo = .67 #Bond albedo
#
Europa.rsm = Jupiter.rsm #Semi-major axis
Europa.year = Jupiter.year #Sidereal length of year
Europa.eccentricity = Jupiter.eccentricity # Eccentricity
Europa.day = 3.551*24.*3600. #Mean tropical length of day
Europa.obliquity = Jupiter.obliquity #Obliquity to plane of ecliptic
Europa.Lequinox = None #Longitude of equinox
#
Europa.Tsbar = 103. #Mean surface temperature
Europa.Tsmax = 125. #Maximum surface temperature

Triton = Planet()
Triton.name = 'Triton' #Name of the planet
Triton.a = 2.7068e6/2. #Mean radius of planet
Triton.g = .78 #Surface gravitational acceleration
Triton.L = Neptune.L #Annual mean solar constant (current)
Triton.albedo = .76 #Bond albedo
#
Triton.rsm = Neptune.rsm #Semi-major axis
Triton.year = Neptune.year #Sidereal length of year
Triton.eccentricity = Neptune.eccentricity # Eccentricity about Sun
Triton.day = 5.877*24.*3600. #Mean tropical length of day
                             #Triton's rotation is retrograde
Triton.obliquity = 156. #Obliquity to ecliptic **ToDo: Check this.
                        #Note: Seasons are influenced by the inclination
                        #of Triton's orbit? (About 20 degrees to
                        #Neptune's equator
Triton.Lequinox = None #Longitude of equinox
#
Triton.Tsbar = 34.5 #Mean surface temperature
                    #This is probably a computed blackbody
                    #temperature, rather than an observation
Triton.Tsmax = None #Maximum surface temperature
