+{-# LANGUAGE BangPatterns #-}
+
-- | The FunctionValues module contains the 'FunctionValues' type and
-- the functions used to manipulate it.
+--
module FunctionValues (
FunctionValues(..),
empty_values,
rotate,
function_values_tests,
function_values_properties,
- value_at
- )
+ value_at )
where
-import Prelude hiding (LT)
-import Test.HUnit
-import Test.Framework (Test, testGroup)
-import Test.Framework.Providers.HUnit (testCase)
-import Test.Framework.Providers.QuickCheck2 (testProperty)
-import Test.QuickCheck (Arbitrary(..), choose)
+import Prelude hiding ( LT )
+import Test.HUnit ( Assertion )
+import Test.Framework ( Test, testGroup )
+import Test.Framework.Providers.HUnit ( testCase )
+import Test.Framework.Providers.QuickCheck2 ( testProperty )
+import Test.QuickCheck ( Arbitrary(..), choose )
-import Assertions (assertTrue)
+import Assertions ( assertTrue )
import Cardinal ( Cardinal(..), cwx, cwy, cwz )
-import Examples (trilinear)
-import Values (Values3D, dims, idx)
+import Examples ( trilinear )
+import Values ( Values3D, dims, idx )
-- | The FunctionValues type represents the value of our function f at
-- the 27 points surrounding (and including) the center of a
-- cube. Each value of f can be accessed by the name of its
-- direction.
+--
data FunctionValues =
- FunctionValues { front :: Double,
- back :: Double,
- left :: Double,
- right :: Double,
- top :: Double,
- down :: Double,
- front_left :: Double,
- front_right :: Double,
- front_down :: Double,
- front_top :: Double,
- back_left :: Double,
- back_right :: Double,
- back_down :: Double,
- back_top :: Double,
- left_down :: Double,
- left_top :: Double,
- right_down :: Double,
- right_top :: Double,
- front_left_down :: Double,
- front_left_top :: Double,
- front_right_down :: Double,
- front_right_top :: Double,
- back_left_down :: Double,
- back_left_top :: Double,
- back_right_down :: Double,
- back_right_top :: Double,
- interior :: Double }
+ FunctionValues { front :: !Double,
+ back :: !Double,
+ left :: !Double,
+ right :: !Double,
+ top :: !Double,
+ down :: !Double,
+ front_left :: !Double,
+ front_right :: !Double,
+ front_down :: !Double,
+ front_top :: !Double,
+ back_left :: !Double,
+ back_right :: !Double,
+ back_down :: !Double,
+ back_top :: !Double,
+ left_down :: !Double,
+ left_top :: !Double,
+ right_down :: !Double,
+ right_top :: !Double,
+ front_left_down :: !Double,
+ front_left_top :: !Double,
+ front_right_down :: !Double,
+ front_right_top :: !Double,
+ back_left_down :: !Double,
+ back_left_top :: !Double,
+ back_right_down :: !Double,
+ back_right_top :: !Double,
+ interior :: !Double }
deriving (Eq, Show)
-- 5.0
--
value_at :: Values3D -> Int -> Int -> Int -> Double
-value_at v3d i j k
+value_at v3d !i !j !k
-- Put the most common case first!
| (valid_i i) && (valid_j j) && (valid_k k) =
idx v3d i j k
2*(value_at v3d i j 0) - (value_at v3d i j 1)
else
2*(value_at v3d i j (k-1)) - (value_at v3d i j (k-2))
-
- | otherwise =
- let istr = show i
- jstr = show j
- kstr = show k
- coordstr = "(" ++ istr ++ "," ++ jstr ++ "," ++ kstr ++ ")"
- in
- error $ "value_at called outside of domain: " ++ coordstr
where
(dim_i, dim_j, dim_k) = dims v3d
-- coordinates (i,j,k), constructs and returns the 'FunctionValues'
-- object centered at (i,j,k)
make_values :: Values3D -> Int -> Int -> Int -> FunctionValues
-make_values values i j k =
+make_values values !i !j !k =
empty_values { front = value_at values (i-1) j k,
back = value_at values (i+1) j k,
left = value_at values i (j-1) k,