packages feed

dph-examples-0.5.1.1: real/NBody/Solver.hs

-- | 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'