1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
module Numeric.Sundials.ODEOpts where
import Data.Int (Int32)
import Foreign.Ptr (Ptr)
import Foreign.Storable as FS
import Foreign.ForeignPtr as FF
import Foreign.C.Types
import qualified Data.Vector.Storable as VS
import qualified Data.Vector.Storable.Mutable as VM
import qualified Types as T
import qualified Arkode as B
data ODEOpts = ODEOpts {
maxNumSteps :: Int32
, minStep :: Double
, relTol :: Double
, absTols :: VS.Vector Double
, initStep :: Double
} deriving (Read, Show, Eq, Ord)
-- FIXME: Potentially an instance of Storable
_getMatrixDataFromContents :: Ptr T.SunMatrix -> IO T.SunMatrix
_getMatrixDataFromContents ptr = do
qtr <- B.getContentMatrixPtr ptr
rs <- B.getNRows qtr
cs <- B.getNCols qtr
rtr <- B.getMatrixData qtr
vs <- vectorFromC (fromIntegral $ rs * cs) rtr
return $ T.SunMatrix { T.rows = rs, T.cols = cs, T.vals = vs }
putMatrixDataFromContents :: T.SunMatrix -> Ptr T.SunMatrix -> IO ()
putMatrixDataFromContents mat ptr = do
let rs = T.rows mat
cs = T.cols mat
vs = T.vals mat
qtr <- B.getContentMatrixPtr ptr
B.putNRows rs qtr
B.putNCols cs qtr
rtr <- B.getMatrixData qtr
vectorToC vs (fromIntegral $ rs * cs) rtr
-- FIXME: END
vectorFromC :: Storable a => Int -> Ptr a -> IO (VS.Vector a)
vectorFromC len ptr = do
ptr' <- newForeignPtr_ ptr
VS.freeze $ VM.unsafeFromForeignPtr0 ptr' len
vectorToC :: Storable a => VS.Vector a -> Int -> Ptr a -> IO ()
vectorToC vec len ptr = do
ptr' <- newForeignPtr_ ptr
VS.copy (VM.unsafeFromForeignPtr0 ptr' len) vec
getDataFromContents :: Int -> Ptr T.SunVector -> IO (VS.Vector CDouble)
getDataFromContents len ptr = do
qtr <- B.getContentPtr ptr
rtr <- B.getData qtr
vectorFromC len rtr
putDataInContents :: Storable a => VS.Vector a -> Int -> Ptr b -> IO ()
putDataInContents vec len ptr = do
qtr <- B.getContentPtr ptr
rtr <- B.getData qtr
vectorToC vec len rtr
data SundialsDiagnostics = SundialsDiagnostics {
aRKodeGetNumSteps :: Int
, aRKodeGetNumStepAttempts :: Int
, aRKodeGetNumRhsEvals_fe :: Int
, aRKodeGetNumRhsEvals_fi :: Int
, aRKodeGetNumLinSolvSetups :: Int
, aRKodeGetNumErrTestFails :: Int
, aRKodeGetNumNonlinSolvIters :: Int
, aRKodeGetNumNonlinSolvConvFails :: Int
, aRKDlsGetNumJacEvals :: Int
, aRKDlsGetNumRhsEvals :: Int
} deriving Show
|