From: Michael Orlitzky Date: Fri, 2 Sep 2011 16:58:40 +0000 (-0400) Subject: Only compute 'cubes' once, and store it in a new Grid field, cube_grid. X-Git-Tag: 0.0.1~173 X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=b18e13462e37fd48e1d19d131a41e3743252ae31;p=spline3.git Only compute 'cubes' once, and store it in a new Grid field, cube_grid. --- diff --git a/src/Grid.hs b/src/Grid.hs index d87114f..ba8ca20 100644 --- a/src/Grid.hs +++ b/src/Grid.hs @@ -24,7 +24,8 @@ type CubeGrid = Array (Int,Int,Int) Cube -- function at the grid points, which are distance h from one -- another in each direction (x,y,z). data Grid = Grid { h :: Double, -- MUST BE GREATER THAN ZERO! - function_values :: Values3D } + function_values :: Values3D, + cube_grid :: CubeGrid } deriving (Eq, Show) @@ -40,24 +41,23 @@ instance Arbitrary Grid where make_grid :: Double -> Values3D -> Grid make_grid grid_size values | grid_size <= 0 = error "grid size must be positive" - | otherwise = Grid grid_size values + | otherwise = Grid grid_size values (cubes grid_size values) -- | Creates an empty grid with grid size 1. empty_grid :: Grid -empty_grid = Grid 1 empty3d +empty_grid = make_grid 1 empty3d -- | Returns a three-dimensional array of cubes centered on the grid --- points of g with the appropriate 'FunctionValues'. -cubes :: Grid -> CubeGrid -cubes g +-- points (h*i, h*j, h*k) with the appropriate 'FunctionValues'. +cubes :: Double -> Values3D -> CubeGrid +cubes delta fvs = array (lbounds, ubounds) [ ((i,j,k), cube_ijk) | i <- [0..xmax], j <- [0..ymax], k <- [0..zmax], - let delta = h g, let tet_vol = (1/24)*(delta^(3::Int)), let cube_ijk = Cube delta i j k (make_values fvs i j k) tet_vol] @@ -67,7 +67,6 @@ cubes g zmax = zsize - 1 lbounds = (0, 0, 0) ubounds = (xmax, ymax, zmax) - fvs = function_values g (xsize, ysize, zsize) = dims fvs @@ -82,7 +81,7 @@ cube_at g i j k | j >= ysize = error "j >= ysize in cube_at" | k < 0 = error "k < 0 in cube_at" | k >= zsize = error "k >= zsize in cube_at" - | otherwise = (cubes g) ! (i,j,k) + | otherwise = (cube_grid g) ! (i,j,k) where fvs = function_values g (xsize, ysize, zsize) = dims fvs