module Numeric.GSL.Integration (
integrateQNG,
integrateQAGS,
integrateQAGI,
integrateQAGIU,
integrateQAGIL
) where
import Foreign.C.Types
import Foreign.Marshal.Alloc(malloc, free)
import Foreign.Ptr(Ptr, FunPtr, freeHaskellFunPtr)
import Foreign.Storable(peek)
import Data.Packed.Internal(check,(//))
import System.IO.Unsafe(unsafePerformIO)
foreign import ccall safe "wrapper" mkfun:: (Double -> Ptr() -> Double) -> IO( FunPtr (Double -> Ptr() -> Double))
integrateQAGS :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQAGS prec n f a b = unsafePerformIO $ do
r <- malloc
e <- malloc
fp <- mkfun (\x _ -> f x)
c_integrate_qags fp a b prec (fromIntegral n) r e // check "integrate_qags"
vr <- peek r
ve <- peek e
let result = (vr,ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "gsl-aux.h integrate_qags"
c_integrate_qags :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> Double -> CInt
-> Ptr Double -> Ptr Double -> IO CInt
integrateQNG :: Double
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQNG prec f a b = unsafePerformIO $ do
r <- malloc
e <- malloc
fp <- mkfun (\x _ -> f x)
c_integrate_qng fp a b prec r e // check "integrate_qng"
vr <- peek r
ve <- peek e
let result = (vr,ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "gsl-aux.h integrate_qng"
c_integrate_qng :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> Double
-> Ptr Double -> Ptr Double -> IO CInt
integrateQAGI :: Double
-> Int
-> (Double -> Double)
-> (Double, Double)
integrateQAGI prec n f = unsafePerformIO $ do
r <- malloc
e <- malloc
fp <- mkfun (\x _ -> f x)
c_integrate_qagi fp prec (fromIntegral n) r e // check "integrate_qagi"
vr <- peek r
ve <- peek e
let result = (vr,ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "gsl-aux.h integrate_qagi"
c_integrate_qagi :: FunPtr (Double-> Ptr() -> Double) -> Double -> CInt
-> Ptr Double -> Ptr Double -> IO CInt
integrateQAGIU :: Double
-> Int
-> (Double -> Double)
-> Double
-> (Double, Double)
integrateQAGIU prec n f a = unsafePerformIO $ do
r <- malloc
e <- malloc
fp <- mkfun (\x _ -> f x)
c_integrate_qagiu fp a prec (fromIntegral n) r e // check "integrate_qagiu"
vr <- peek r
ve <- peek e
let result = (vr,ve)
free r
free e
freeHaskellFunPtr fp
return result
foreign import ccall safe "gsl-aux.h integrate_qagiu"
c_integrate_qagiu :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> CInt
-> Ptr Double -> Ptr Double -> IO CInt
integrateQAGIL :: Double
-> Int
-> (Double -> Double)
-> Double
-> (Double, Double)
integrateQAGIL prec n f b = unsafePerformIO $ do
r <- malloc
e <- malloc
fp <- mkfun (\x _ -> f x)
c_integrate_qagil fp b prec (fromIntegral n) r e // check "integrate_qagil"
vr <- peek r
ve <- peek e
let result = (vr,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 -> CInt
-> Ptr Double -> Ptr Double -> IO CInt