astro-0.4.3.0: src/Data/Astro/Effects/Parallax.hs
{-|
Module: Data.Astro.Effects.Parallax
Description: Calculation effects of geocentric parallax
Copyright: Alexander Ignatyev, 2016
Calculation effects of geocentric parallax.
-}
module Data.Astro.Effects.Parallax
(
parallaxQuantities
, parallax
)
where
import Data.Astro.Types (DecimalDegrees(..)
, DecimalHours(..)
, AstronomicalUnits(..)
, GeographicCoordinates(..)
, toRadians, fromRadians
, fromDMS
, toDecimalHours, fromDecimalHours)
import Data.Astro.Time (utToLST)
import Data.Astro.Time.JulianDate (JulianDate(..))
import Data.Astro.Time.Sidereal (LocalSiderealTime(..), utToGST, gstToLST)
import Data.Astro.Coordinate (EquatorialCoordinates1(..), raToHA)
-- | It takes latitude of the observer
-- and height above sea-level of the observer measured in metres
-- Returns palallax quantities (p*(sin phi'), p*(cos phi')),
-- where phi' is the geocentric latitude
-- and p is the distance of the obserbve from the centre of the Earth.
parallaxQuantities :: DecimalDegrees -> Double -> (Double, Double)
parallaxQuantities latitude height =
let c = 0.996647
phi = toRadians latitude
h = earthRadiusUnits height
u = atan (c*(tan phi))
pSin = c * (sin u) + h*(sin phi)
pCos = (cos u) + h*(cos phi)
in (pSin, pCos)
-- | Calculate the apparent position of the celestial object (the Sun or a planet).
-- It takes geocraphic coordinates of the observer and height above sea-level of the observer measured in metres,
-- distance from the celestial object to the Earth measured in AU, the Universal Time and geocentric equatorial coordinates.
-- It returns adjusted equatorial coordinates.
parallax :: GeographicCoordinates -> Double -> AstronomicalUnits -> JulianDate -> EquatorialCoordinates1 -> EquatorialCoordinates1
parallax (GeoC latitude longitude) height distance ut (EC1 delta alpha) =
let piD = earthRadiusUnitsAU distance
lst = utToLST longitude ut
(pSin, pCos) = parallaxQuantities latitude height
ha = toRadians $ fromDecimalHours $ raToHA alpha longitude ut
delta' = toRadians delta
dAlpha = (toDecimalHours piD) * (DH $ (sin ha)*pCos/(cos delta'))
dDelta = piD * (DD $ pSin*(cos delta') - pCos*(cos ha)*(sin delta'))
in EC1 (delta-dDelta) (alpha-dAlpha)
-- | It takes the distance in metres and
-- returns the distance measured in units of qquatorial Earth radius
earthRadiusUnits :: Double -> Double
earthRadiusUnits d = d / 6378140
--earthRadiusUnitsAU :: AstronomicalUnits -> DecimalDegrees
earthRadiusUnitsAU (AU d) = fromDMS 0 0 (8.794/d)