{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module Numeric.GSL.Integration (
integrateQNG,
integrateQAGS,
integrateQAGI,
integrateQAGIU,
integrateQAGIL,
integrateCQUAD
) where
import Foreign.C.Types
import Foreign.Marshal.Alloc(malloc, free)
import Foreign.Ptr(Ptr, FunPtr, freeHaskellFunPtr)
import Foreign.Storable(peek)
import Numeric.GSL.Internal
import System.IO.Unsafe(unsafePerformIO)
eps :: Double
eps = Double
1e-12
foreign import ccall safe "wrapper" mkfun:: (Double -> Ptr() -> Double) -> IO( FunPtr (Double -> Ptr() -> Double))
integrateQAGS :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQAGS :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQAGS Double
prec Int
n Double -> Double
f Double
a Double
b = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
fp <- mkfun (\Double
x Ptr ()
_ -> Double -> Double
f Double
x)
c_integrate_qags fp a b eps prec (fromIntegral n) r e // check "integrate_qags"
vr <- peek r
ve <- peek e
let result = (Double
vr,Double
ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "integrate_qags" c_integrate_qags
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateQNG :: Double
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQNG :: Double
-> (Double -> Double) -> Double -> Double -> (Double, Double)
integrateQNG Double
prec Double -> Double
f Double
a Double
b = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
fp <- mkfun (\Double
x Ptr ()
_ -> Double -> Double
f Double
x)
c_integrate_qng fp a b eps prec r e // check "integrate_qng"
vr <- peek r
ve <- peek e
let result = (Double
vr,Double
ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "integrate_qng" c_integrate_qng
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> Double -> Ptr Double -> Ptr Double -> IO CInt
integrateQAGI :: Double
-> Int
-> (Double -> Double)
-> (Double, Double)
integrateQAGI :: Double -> Int -> (Double -> Double) -> (Double, Double)
integrateQAGI Double
prec Int
n Double -> Double
f = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
fp <- mkfun (\Double
x Ptr ()
_ -> Double -> Double
f Double
x)
c_integrate_qagi fp eps prec (fromIntegral n) r e // check "integrate_qagi"
vr <- peek r
ve <- peek e
let result = (Double
vr,Double
ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "integrate_qagi" c_integrate_qagi
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateQAGIU :: Double
-> Int
-> (Double -> Double)
-> Double
-> (Double, Double)
integrateQAGIU :: Double -> Int -> (Double -> Double) -> Double -> (Double, Double)
integrateQAGIU Double
prec Int
n Double -> Double
f Double
a = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
fp <- mkfun (\Double
x Ptr ()
_ -> Double -> Double
f Double
x)
c_integrate_qagiu fp a eps prec (fromIntegral n) r e // check "integrate_qagiu"
vr <- peek r
ve <- peek e
let result = (Double
vr,Double
ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "integrate_qagiu" c_integrate_qagiu
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateQAGIL :: Double
-> Int
-> (Double -> Double)
-> Double
-> (Double, Double)
integrateQAGIL :: Double -> Int -> (Double -> Double) -> Double -> (Double, Double)
integrateQAGIL Double
prec Int
n Double -> Double
f Double
b = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
fp <- mkfun (\Double
x Ptr ()
_ -> Double -> Double
f Double
x)
c_integrate_qagil fp b eps prec (fromIntegral n) r e // check "integrate_qagil"
vr <- peek r
ve <- peek e
let result = (Double
vr,Double
ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "gsl-aux.h integrate_qagil" c_integrate_qagil
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateCQUAD :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double, Int)
integrateCQUAD :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double, Int)
integrateCQUAD Double
prec Int
n Double -> Double
f Double
a Double
b = IO (Double, Double, Int) -> (Double, Double, Int)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double, Int) -> (Double, Double, Int))
-> IO (Double, Double, Int) -> (Double, Double, Int)
forall a b. (a -> b) -> a -> b
$ do
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
neval <- malloc
fp <- mkfun (\Double
x Ptr ()
_ -> Double -> Double
f Double
x)
c_integrate_cquad fp a b eps prec (fromIntegral n) r e neval // check "integrate_cquad"
vr <- peek r
ve <- peek e
vneval <- peek neval
let result = (Double
vr,Double
ve,Int
vneval)
free r
free e
free neval
freeHaskellFunPtr fp
return result
foreign import ccall safe "integrate_cquad" c_integrate_cquad
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> Ptr Int -> IO CInt