astro-0.4.1.0: src/Data/Astro/Effects/Nutation.hs
{-|
Module: Data.Astro.Effects.Nutation
Description: Calculation effects of nutation
Copyright: Alexander Ignatyev, 2016
Calculation effects of nutation.
-}
module Data.Astro.Effects.Nutation
(
nutationLongitude
, nutationObliquity
)
where
import qualified Data.Astro.Utils as U
import Data.Astro.Types (DecimalDegrees(..), toRadians, fromDMS)
import Data.Astro.Time.JulianDate (JulianDate, numberOfCenturies)
import Data.Astro.Time.Epoch (j1900)
-- | Calculates the nutation on the ecliptic longitude at the given JulianDate
nutationLongitude :: JulianDate -> DecimalDegrees
nutationLongitude jd =
let t = numberOfCenturies j1900 jd
l = sunMeanLongutude t
omega = moonNode t
dPsi = -17.2*(sin omega) - 1.3*(sin $ 2*l)
in fromDMS 0 0 dPsi
-- | Calculates the nutation on the obliquity of the ecliptic at the given JulianDate
nutationObliquity :: JulianDate -> DecimalDegrees
nutationObliquity jd =
let t = numberOfCenturies j1900 jd
l = sunMeanLongutude t
omega = moonNode t
dEps = 9.2*(cos omega) + 0.5*(cos $ 2*l)
in fromDMS 0 0 dEps
-- | It takes a number of centuries and returns the Sun's mean longitude in radians
sunMeanLongutude :: Double -> Double
sunMeanLongutude t =
let a = 100.002136 * t
in U.toRadians $ U.reduceToZeroRange 360 $ 279.6967 + 360 * (a - int a)
-- | It takes a number of centuries and returns the Moon's node in radians
moonNode :: Double -> Double
moonNode t =
let b = 5.372617 * t
in U.toRadians $ U.reduceToZeroRange 360 $ 259.1833 - 360*(b - int b)
-- | 'round' function that returns Double
int :: Double -> Double
int = fromIntegral . round