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 :: forall a. Fractional a => Mass a
solMass = a
1988500e24 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 :: forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter = forall a. Fractional a => Mass a
solMass forall n (a :: [Factor (*)]) (l :: LCSU (*)) (b :: [Factor (*)]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| forall (lcsu :: LCSU (*)) n.
(Fractional n,
 CompatibleUnit
   lcsu
   (((Meter :^ Three) :* ((Kilo :@ Gram) :^ MOne))
    :* (Second :^ MTwo))) =>
MkQu_ULN
  (((Meter :^ Three) :* ((Kilo :@ Gram) :^ MOne))
   :* (Second :^ MTwo))
  lcsu
  n
gravity_G

venusOrbit :: Fractional a => Orbit a
venusOrbit :: forall a. Fractional a => Orbit a
venusOrbit = Orbit
  { eccentricity :: Unitless a
eccentricity                  = Qu '[] 'DefaultLCSU a
0.006772
  , periapsis :: Distance a
periapsis                     = a
0.718440 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = a
76.680 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = a
2.19 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = a
54.884 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 = forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }

earthOrbit :: Fractional a => Orbit a
earthOrbit :: forall a. Fractional a => Orbit a
earthOrbit = Orbit
  { eccentricity :: Unitless a
eccentricity                  = Qu '[] 'DefaultLCSU a
0.01671123
  , periapsis :: Distance a
periapsis                     = a
0.9832899 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = a
348.73936 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = a
1.578690 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = a
114.20783 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 = forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }

marsOrbit :: Fractional a => Orbit a
marsOrbit :: forall a. Fractional a => Orbit a
marsOrbit = Orbit
  { eccentricity :: Unitless a
eccentricity                  = Qu '[] 'DefaultLCSU a
0.0934
  , periapsis :: Distance a
periapsis                     = a
1.382 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = a
49.558 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = a
1.67 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = a
286.502 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 = forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }

halleyOrbit :: Fractional a => Orbit a
halleyOrbit :: forall a. Fractional a => Orbit a
halleyOrbit = Orbit
  { eccentricity :: Unitless a
eccentricity                  = Qu '[] 'DefaultLCSU a
0.96714
  , periapsis :: Distance a
periapsis                     = a
0.586 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = Inclined
                                      { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = a
58.42 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      , inclination :: Angle a
inclination = a
162.26 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
                                      }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier = Eccentric { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = a
111.33 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 = 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 :: forall a. Fractional a => Orbit a
c1980E1Orbit = Orbit
  { eccentricity :: Unitless a
eccentricity                  = Qu '[] 'DefaultLCSU a
1.057731876173255
  , periapsis :: Distance a
periapsis                     = a
3.363937831611605 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% AstronomicalUnit
AstronomicalUnit
  , inclinationSpecifier :: InclinationSpecifier a
inclinationSpecifier          = Inclined
    { longitudeOfAscendingNode :: Angle a
longitudeOfAscendingNode = a
114.5581951921299 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
    , inclination :: Angle a
inclination              = a
1.661712630614323 forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|deg|]
    }
  , periapsisSpecifier :: PeriapsisSpecifier a
periapsisSpecifier            = Eccentric
    { argumentOfPeriapsis :: Angle a
argumentOfPeriapsis = a
135.0826233919265 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 = forall a.
Fractional a =>
Quantity
  ((Meter :^ Succ (Succ (Succ 'Zero)))
   :* (Second :^ Pred (Pred 'Zero)))
  a
solGraviationalParameter
  }