-- | Wrappers for the various solvers. module Solver ( Solver , solvers) where import Common.Body import qualified Solver.ListBH.Solver as SolverLB import qualified Data.Vector.Unboxed as V import qualified Solver.VectorBH.Solver as SolverVB import qualified Solver.VectorNaive.Solver as SolverVN import qualified Data.Array.Parallel as P import qualified Data.Array.Parallel.PArray as P import qualified Solver.NestedBH.Solver as SolverNB type Solver = Double -> V.Vector MassPoint -> V.Vector Accel solvers :: [(String, Solver)] solvers = [ ("list-bh", calcAccels_lb) , ("vector-naive", calcAccels_vn) , ("vector-bh", calcAccels_vb) , ("nested-bh", calcAccels_nb) ] -- | Lists + Barnes-Hut algorithm. calcAccels_lb :: Solver calcAccels_lb epsilon mpts = V.fromList $ SolverLB.calcAccels epsilon $ V.toList mpts -- | Vector + Naive algorithm. calcAccels_vn :: Solver calcAccels_vn epsilon = SolverVN.calcAccels epsilon -- | Vector + Barnes-Hut algorithm. calcAccels_vb :: Solver calcAccels_vb epsilon mpts = SolverVB.calcAccels epsilon mpts -- | Nested Data Parallelism + Barnes-Hut algorithm. calcAccels_nb :: Solver calcAccels_nb epsilon mpts = let -- bounds finding isn't vectorised yet. (llx, lly, rux, ruy) = SolverVB.findBounds mpts mpts' = P.fromList $ V.toList mpts accels' = SolverNB.calcAccelsWithBoxPA epsilon llx lly rux ruy mpts' in V.fromList $ P.toList accels'