{-|
Module: Data.Astro.Sun.SunInternals
Description: Internal functions of Sun module.
Copyright: Alexander Ignatyev, 2016

Internal functions of Sun module. Exposed only for Unit Tests
-}

module Data.Astro.Sun.SunInternals
(
  solveKeplerEquation
)

where


-- | Solve Kepler's Equation: E - e * (sin E) = M

-- It takes eccentricity,

-- mean anomaly in radians equals epsilon - omega (see 'SunDetails').

-- It returns E in radians.

solveKeplerEquation :: Double -> Double -> Double -> Double
solveKeplerEquation :: Double -> Double -> Double -> Double
solveKeplerEquation Double
e Double
m Double
eps = Double -> Double
iter Double
m
  where iter :: Double -> Double
iter Double
x =
          let delta :: Double
delta = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
eDouble -> Double -> Double
forall a. Num a => a -> a -> a
*(Double -> Double
forall a. Floating a => a -> a
sin Double
x) Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
m
              dx :: Double
dx = Double
delta Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
eDouble -> Double -> Double
forall a. Num a => a -> a -> a
*(Double -> Double
forall a. Floating a => a -> a
cos Double
x))
          in if Double -> Double
forall a. Num a => a -> a
abs Double
delta Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
eps
             then Double
x
             else Double -> Double
iter (Double
xDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
dx)