packages feed

jacobi-elliptic-0.1.2.0: tests/Main.hs

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

  ]