accelerate-examples-0.13.0.0: examples/n-body/Common/Dump.hs
module Common.Dump ( dumpWorld, printWorld )
where
import Common.Body
import Common.World
import System.IO
import Data.List
import Text.Printf
import qualified Data.Array.Accelerate as A
-- | Dump the bodies in a world to a file.
--
dumpWorld :: World -> FilePath -> IO ()
dumpWorld world filePath
= withFile filePath WriteMode
$ \h -> hWriteWorld h world
-- | Print the bodies in a world to stdout
--
printWorld :: World -> IO ()
printWorld world
= hWriteWorld stdout world
-- | Write a world to a handle
--
hWriteWorld :: Handle -> World -> IO ()
hWriteWorld h world
= mapM_ (hWriteBody h)
$ A.toList
$ worldBodies world
-- | Write a single body to a handle
--
hWriteBody :: Handle -> Body -> IO ()
hWriteBody h (((px, py), mass), (vx, vy), (ax, ay))
= hPutStrLn h
$ concat
$ ( (padRc 8 ' ' $ show mass)
: " "
: (intersperse " " $ map (\f -> printf "%15.8f" f) [ px, py, vx, vy, ax, ay ]))
-- | Right justify a doc, padding with a given character.
--
padRc :: Int -> Char -> String -> String
padRc n c str
= replicate (n - length str) c ++ str