module Main where
import Approx ( assertApproxEqual )
import Data.Complex ( Complex(..) )
import Math.NevilleTheta ( theta_c,
theta_d,
theta_n,
theta_s,
theta_c',
theta_d',
theta_n',
theta_s' )
import Math.EllipticIntegrals ( ellipticF )
import Math.JacobiElliptic ( jellip', am )
import Test.Tasty ( defaultMain, testGroup )
import Test.Tasty.HUnit ( testCase )
i_ :: Complex Double
i_ = 0.0 :+ 1.0
z :: Complex Double
z = 1.0 :+ 1.0
q :: Complex Double
q = exp (-pi)
q' :: Complex Double
q' = exp (-pi/10)
q'' :: Complex Double
q'' = exp (i_ * pi * tau)
where
tau = 2.0 :+ 2.0
u :: Complex Double
u = 0.3 :+ 0.7
m :: Complex Double
m = 0.4 :+ 0.0
main :: IO ()
main = defaultMain $
testGroup "Tests"
[
testCase "theta_c value 1" $ do
let expected = 0.902705416117337 :+ (-0.718974020880116)
obtained = theta_c z q
assertApproxEqual "" 10 expected obtained,
testCase "theta_c value 2" $ do
let expected = 0.997974260633626 :+ (-0.063618983904188)
obtained = theta_c z q'
assertApproxEqual "" 10 expected obtained,
testCase "theta_c value 3" $ do
let expected = 0.838567437919619 :+ (-0.974584266572289)
obtained = theta_c z q''
assertApproxEqual "" 10 expected obtained,
testCase "theta_d value 1" $ do
let expected = 0.892748081976972 :+ (-0.207593861225047)
obtained = theta_d z q
assertApproxEqual "" 10 expected obtained,
testCase "theta_d value 2" $ do
let expected = 0.997974260633412 :+ (-0.063618983903874)
obtained = theta_d z q'
assertApproxEqual "" 10 expected obtained,
testCase "theta_d value 3" $ do
let expected = 0.990723180697351 :+ (-0.012164484951676)
obtained = theta_d z q''
assertApproxEqual "" 10 expected obtained,
testCase "theta_n value 1" $ do
let expected = 1.12730988168993 :+ 0.2469274015421
obtained = theta_n z q
assertApproxEqual "" 10 expected obtained,
testCase "theta_n value 2" $ do
let expected = 0.894953772623932 :+ 0.933853399701569
obtained = theta_n z q'
assertApproxEqual "" 10 expected obtained,
testCase "theta_n value 3" $ do
let expected = 1.00934637387594 :+ 0.01225569246714
obtained = theta_n z q''
assertApproxEqual "" 10 expected obtained,
testCase "theta_s value 1" $ do
let expected = 1.22039326540444 :+ 0.75990704701835
obtained = theta_s z q
assertApproxEqual "" 10 expected obtained,
testCase "theta_s value 2" $ do
let expected = 0.7162841953585 :+ 1.25543148570321
obtained = theta_s z q'
assertApproxEqual "" 10 expected obtained,
testCase "theta_s value 3" $ do
let expected = 1.29457805665579 :+ 0.64084576896851
obtained = theta_s z q''
assertApproxEqual "" 10 expected obtained,
testCase "a value of theta_c prime" $ do
let expected = -0.65900466676738154967
obtained = theta_c' 2.5 0.3
assertApproxEqual "" 15 expected obtained,
testCase "a value of theta_d prime" $ do
let expected = 0.95182196661268
obtained = theta_d' 2.5 0.3
assertApproxEqual "" 13 expected obtained,
testCase "a value of theta_n prime" $ do
let expected = 1.0526693354651613637
obtained = theta_n' 2.5 0.3
assertApproxEqual "" 14 expected obtained,
testCase "a value of theta_s prime" $ do
let expected = 0.82086879524530400536
obtained = theta_s' 2.5 0.3
assertApproxEqual "" 14 expected obtained,
testCase "jellip relation 1" $ do
let z1 = jellip' 'c' 'n' u m
z2 = jellip' 'n' 'c' (i_ * u) (1 - m)
assertApproxEqual "" 13 z1 z2,
testCase "jellip relation 2" $ do
let z1 = jellip' 's' 'n' u m
z2 = -i_ * jellip' 's' 'c' (i_ * u) (1 - m)
assertApproxEqual "" 14 z1 z2,
testCase "jellip relation 3" $ do
let z1 = jellip' 'd' 'n' u m
z2 = jellip' 'd' 'c' (i_ * u) (1 - m)
assertApproxEqual "" 13 z1 z2,
testCase "amplitude function" $ do
let phi = 1 :+ 1
ell = ellipticF phi 2
obtained = am ell 2
assertApproxEqual "" 14 obtained phi
]