]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Grid.hs
Drop the no-longer-useful ThreeDimensional class.
[spline3.git] / src / Grid.hs
index de5f76ac326ff6d4d169125284a3d8a9b7b381a2..94b9e1de7715bd4107a52904dff3ab803a0cd1a7 100644 (file)
@@ -32,8 +32,12 @@ import Examples (trilinear, trilinear9x9x9, zeros, naturals_1d)
 import FunctionValues (make_values, value_at)
 import Point (Point(..))
 import ScaleFactor (ScaleFactor)
-import Tetrahedron (Tetrahedron, c, polynomial, v0, v1, v2, v3)
-import ThreeDimensional (ThreeDimensional(..))
+import Tetrahedron (
+  Tetrahedron(v0,v1,v2,v3),
+  c,
+  contains_point,
+  polynomial,
+  )
 import Values (Values3D, dims, empty3d, zoom_shape)
 
 
@@ -43,7 +47,7 @@ import Values (Values3D, dims, empty3d, zoom_shape)
 --   another in each direction (x,y,z).
 data Grid = Grid { h :: Double, -- MUST BE GREATER THAN ZERO!
                    function_values :: Values3D }
-          deriving (Eq, Show)
+          deriving (Show)
 
 
 instance Arbitrary Grid where
@@ -53,33 +57,27 @@ instance Arbitrary Grid where
       return (make_grid h' fvs)
 
 
--- | The constructor that we want people to use. If we're passed a
---   non-positive grid size, we throw an error.
+-- | The constructor that we want people to use.
+--   Ignore non-positive grid sizes for performance.
 make_grid :: Double -> Values3D -> Grid
-make_grid grid_size values
-    | grid_size <= 0 = error "grid size must be positive"
-    | otherwise = Grid grid_size values
+make_grid grid_size values =
+  Grid grid_size values
 
 
 
 -- | Takes a grid and a position as an argument and returns the cube
---   centered on that position. If there is no cube there (i.e. the
---   position is outside of the grid), it will throw an error.
+--   centered on that position. If there is no cube there, well, you
+--   shouldn't have done that. The omitted "otherwise" case actually
+--   does improve performance.
 cube_at :: Grid -> Int -> Int -> Int -> Cube
-cube_at !g !i !j !k
-    | i < 0      = error "i < 0 in cube_at"
-    | i >= xsize = error "i >= xsize in cube_at"
-    | j < 0      = error "j < 0 in cube_at"
-    | 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 = Cube delta i j k fvs' tet_vol
-      where
-        fvs = function_values g
-        (xsize, ysize, zsize) = dims fvs
-        fvs' = make_values fvs i j k
-        delta = h g
-        tet_vol = (1/24)*(delta^(3::Int))
+cube_at !g !i !j !k =
+   Cube delta i j k fvs' tet_vol
+   where
+     fvs = function_values g
+     fvs' = make_values fvs i j k
+     delta = h g
+     tet_vol = (1/24)*(delta^(3::Int))
+
 
 --   The first cube along any axis covers (-h/2, h/2). The second
 --   covers (h/2, 3h/2).  The third, (3h/2, 5h/2), and so on.
@@ -137,7 +135,7 @@ zoom :: Values3D -> ScaleFactor -> Values3D
 zoom v3d scale_factor
     | xsize == 0 || ysize == 0 || zsize == 0 = empty3d
     | otherwise =
-        R.force $ R.unsafeTraverse v3d transExtent f
+        R.compute $ R.unsafeTraverse v3d transExtent f
           where
             (xsize, ysize, zsize) = dims v3d
             transExtent = zoom_shape scale_factor