{-|
Module: Data.Astro.Effects
Description: Physical effects
Copyright: Alexander Ignatyev, 2016

Physical effects which influence on accuracy of astronomical calculations.
-}

module Data.Astro.Effects
(
  refract
  , Precession.AstronomyEpoch(..)
  , Precession.precession1
  , Precession.precession2
  , Nutation.nutationLongitude
  , Nutation.nutationObliquity
  , Aberration.includeAberration
  , Parallax.parallax
)

where

import Data.Astro.Types (DecimalDegrees(..), toRadians)

import qualified Data.Astro.Effects.Precession as Precession
import qualified Data.Astro.Effects.Nutation as Nutation
import qualified Data.Astro.Effects.Aberration as Aberration
import qualified Data.Astro.Effects.Parallax as Parallax

-- | Calculate the atmospheric refraction angle.

-- It takes the observed altitude (of Horizon Coordinates), temperature in degrees centigrade and barometric pressure in millibars.

-- The average sea level atmospheric pressure is 1013 millibars.

refract :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refract :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refract DecimalDegrees
altitude Double
temperature Double
pressure =
  let f :: DecimalDegrees -> Double -> Double -> DecimalDegrees
f = if DecimalDegrees
altitude DecimalDegrees -> DecimalDegrees -> Bool
forall a. Ord a => a -> a -> Bool
> (Double -> DecimalDegrees
DD Double
15) then DecimalDegrees -> Double -> Double -> DecimalDegrees
refractBigAlpha else DecimalDegrees -> Double -> Double -> DecimalDegrees
refractSmallAlpha
  in DecimalDegrees -> Double -> Double -> DecimalDegrees
f DecimalDegrees
altitude Double
temperature Double
pressure


-- | Calculate the atmospheric refraction angle for big values of alpha (altitude) (> 15 decimal degrees)

refractBigAlpha :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refractBigAlpha :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refractBigAlpha DecimalDegrees
altitude Double
temperature Double
pressure =
  let z :: Double
z = DecimalDegrees -> Double
toRadians (DecimalDegrees -> Double) -> DecimalDegrees -> Double
forall a b. (a -> b) -> a -> b
$ DecimalDegrees
90 DecimalDegrees -> DecimalDegrees -> DecimalDegrees
forall a. Num a => a -> a -> a
- DecimalDegrees
altitude  -- zenith angle

  in Double -> DecimalDegrees
DD (Double -> DecimalDegrees) -> Double -> DecimalDegrees
forall a b. (a -> b) -> a -> b
$ Double
0.00452Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
pressureDouble -> Double -> Double
forall a. Num a => a -> a -> a
*(Double -> Double
forall a. Floating a => a -> a
tan Double
z) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/(Double
273Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
temperature) 


-- | Calculate the atmospheric refraction angle for small values of alpha (altitude)

refractSmallAlpha :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refractSmallAlpha :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refractSmallAlpha DecimalDegrees
altitude Double
temperature Double
pressure =
  let a :: Double
a = DecimalDegrees -> Double
toRadians DecimalDegrees
altitude
  in Double -> DecimalDegrees
DD (Double -> DecimalDegrees) -> Double -> DecimalDegrees
forall a b. (a -> b) -> a -> b
$ Double
pressureDouble -> Double -> Double
forall a. Num a => a -> a -> a
*(Double
0.1594Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
0.0196Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
aDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
0.00002Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
aDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
a)Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/((Double
273Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
temperature)Double -> Double -> Double
forall a. Num a => a -> a -> a
*(Double
1Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
0.505Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
aDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
0.0845Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
aDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
a))