module Physics.Orbit.Sol
  where

import           Data.Constants.Mechanics
import           Data.Metrology
import           Data.Units.Astronomical
import           Data.Units.SI.Parser
import           Physics.Orbit

solMass :: Fractional a => Mass a
solMass :: Mass a
solMass = 1988500e24 a -> (Kilo :@ Gram) -> Qu '[ 'F Mass One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|kg|]

solGraviationalParameter :: Fractional a => Quantity [si| m^3 s^-2 |] a
solGraviationalParameter :: Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter = Qu '[ 'F Mass One] 'DefaultLCSU a
forall a. Fractional a => Mass a
solMass Qu '[ 'F Mass One] 'DefaultLCSU a
-> Qu
     '[ 'F Length ('S Two), 'F Mass ('P 'Zero), 'F Time ('P ('P 'Zero))]
     'DefaultLCSU
     a
-> Qu
     (Normalize
        ('[ 'F Mass One]
         @+ '[ 'F Length ('S Two), 'F Mass ('P 'Zero),
               'F Time ('P ('P 'Zero))]))
     'DefaultLCSU
     a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu
  '[ 'F Length ('S Two), 'F Mass ('P 'Zero), 'F Time ('P ('P 'Zero))]
  'DefaultLCSU
  a
forall (lcsu :: LCSU *) n.
(Fractional n,
 CompatibleUnit
   lcsu
   (((Meter :^ 'S Two) :* ((Kilo :@ Gram) :^ 'P 'Zero))
    :* (Second :^ 'P ('P 'Zero)))) =>
MkQu_ULN
  (((Meter :^ 'S Two) :* ((Kilo :@ Gram) :^ 'P 'Zero))
   :* (Second :^ 'P ('P 'Zero)))
  lcsu
  n
gravity_G

venusOrbit :: Fractional a => Orbit a
venusOrbit :: Orbit a
venusOrbit = $WOrbit :: forall a.
Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
     ((Meter :^ Succ (Succ (Succ 'Zero)))
      :* (Second :^ Pred (Pred 'Zero)))
     a
-> Orbit a
Orbit
  { eccentricity :: Unitless a
eccentricity                  = 0.006772
  , periapsis :: Distance a
periapsis                     = 0.718440 a -> AstronomicalUnit -> Qu '[ 'F Length One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = $WInclined :: forall a. Angle a -> Angle a -> InclinationSpecifier a
Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = 76.680 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = 2.19 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = $WEccentric :: forall a. Angle a -> PeriapsisSpecifier a
Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = 54.884 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|] }
  , primaryGravitationalParameter :: Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
primaryGravitationalParameter = Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }

earthOrbit :: Fractional a => Orbit a
earthOrbit :: Orbit a
earthOrbit = $WOrbit :: forall a.
Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
     ((Meter :^ Succ (Succ (Succ 'Zero)))
      :* (Second :^ Pred (Pred 'Zero)))
     a
-> Orbit a
Orbit
  { eccentricity :: Unitless a
eccentricity                  = 0.01671123
  , periapsis :: Distance a
periapsis                     = 0.9832899 a -> AstronomicalUnit -> Qu '[ 'F Length One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = $WInclined :: forall a. Angle a -> Angle a -> InclinationSpecifier a
Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = 348.73936 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = 1.578690 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = $WEccentric :: forall a. Angle a -> PeriapsisSpecifier a
Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = 114.20783 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                   }
  , primaryGravitationalParameter :: Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
primaryGravitationalParameter = Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }

marsOrbit :: Fractional a => Orbit a
marsOrbit :: Orbit a
marsOrbit = $WOrbit :: forall a.
Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
     ((Meter :^ Succ (Succ (Succ 'Zero)))
      :* (Second :^ Pred (Pred 'Zero)))
     a
-> Orbit a
Orbit
  { eccentricity :: Unitless a
eccentricity                  = 0.0934
  , periapsis :: Distance a
periapsis                     = 1.382 a -> AstronomicalUnit -> Qu '[ 'F Length One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = $WInclined :: forall a. Angle a -> Angle a -> InclinationSpecifier a
Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = 49.558 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = 1.67 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = $WEccentric :: forall a. Angle a -> PeriapsisSpecifier a
Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = 286.502 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|] }
  , primaryGravitationalParameter :: Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
primaryGravitationalParameter = Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }

halleyOrbit :: Fractional a => Orbit a
halleyOrbit :: Orbit a
halleyOrbit = $WOrbit :: forall a.
Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
     ((Meter :^ Succ (Succ (Succ 'Zero)))
      :* (Second :^ Pred (Pred 'Zero)))
     a
-> Orbit a
Orbit
  { eccentricity :: Unitless a
eccentricity                  = 0.96714
  , periapsis :: Distance a
periapsis                     = 0.586 a -> AstronomicalUnit -> Qu '[ 'F Length One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = $WInclined :: forall a. Angle a -> Angle a -> InclinationSpecifier a
Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = 58.42 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = 162.26 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = $WEccentric :: forall a. Angle a -> PeriapsisSpecifier a
Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = 111.33 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|] }
  , primaryGravitationalParameter :: Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
primaryGravitationalParameter = Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }



-- | The fastest comet in the west. Nice for testing as it's on a hyperbolic
-- trajectory. See https://en.wikipedia.org/wiki/C/1980_E1
--
-- Orbital data from:
-- http://ssd.jpl.nasa.gov/horizons.cgi?CGISESSID=6c2730c1201457522760d3f26b7d1f00#results
c1980E1Orbit :: Fractional a => Orbit a
c1980E1Orbit :: Orbit a
c1980E1Orbit = $WOrbit :: forall a.
Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
     ((Meter :^ Succ (Succ (Succ 'Zero)))
      :* (Second :^ Pred (Pred 'Zero)))
     a
-> Orbit a
Orbit
  { eccentricity :: Unitless a
eccentricity                  = 1.057731876173255
  , periapsis :: Distance a
periapsis                     = 3.363937831611605 a -> AstronomicalUnit -> Qu '[ 'F Length One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = $WInclined :: forall a. Angle a -> Angle a -> InclinationSpecifier a
Inclined
    { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = 114.5581951921299 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
    , inclination :: Angle a
inclination              = 1.661712630614323 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
    }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier            = $WEccentric :: forall a. Angle a -> PeriapsisSpecifier a
Eccentric
    { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = 135.0826233919265 a -> Degree -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
    }
  , primaryGravitationalParameter :: Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
primaryGravitationalParameter = Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }