]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tetrahedron.hs
Add bang patterns to the Tetrahedron module (Ben Lippmeier).
[spline3.git] / src / Tetrahedron.hs
index f3b53198362768b8fdbe83085cc55b8e6306b7cc..670a6e0f26f5024be159b8f870bcfd61e1dafe92 100644 (file)
@@ -1,3 +1,4 @@
+{-# LANGUAGE BangPatterns #-}
 module Tetrahedron (
   Tetrahedron(..),
   b0, -- Cube test
@@ -18,27 +19,26 @@ import qualified Data.Vector as V (
   sum
   )
 
-import Prelude hiding (LT)
 import Test.Framework (Test, testGroup)
 import Test.Framework.Providers.HUnit (testCase)
 import Test.Framework.Providers.QuickCheck2 (testProperty)
-import Test.HUnit
+import Test.HUnit (Assertion, assertEqual)
 import Test.QuickCheck (Arbitrary(..), Gen, Property, (==>))
 
 import Comparisons ((~=), nearly_ge)
 import FunctionValues (FunctionValues(..), empty_values)
 import Misc (factorial)
-import Point
-import RealFunction
-import ThreeDimensional
+import Point (Point, scale)
+import RealFunction (RealFunction, cmult, fexp)
+import ThreeDimensional (ThreeDimensional(..))
 
 data Tetrahedron =
   Tetrahedron { function_values :: FunctionValues,
-                v0 :: Point,
-                v1 :: Point,
-                v2 :: Point,
-                v3 :: Point,
-                precomputed_volume :: Double
+                v0 :: !Point,
+                v1 :: !Point,
+                v2 :: !Point,
+                v3 :: !Point,
+                precomputed_volume :: !Double
               }
     deriving (Eq)
 
@@ -120,23 +120,6 @@ polynomial t =
             ((c t 3 0 0 0) `cmult` (beta t 3 0 0 0))
 
 
--- | Returns the domain point of t with indices i,j,k,l.
---   Simply an alias for the domain_point function.
-xi :: Tetrahedron -> Int -> Int -> Int -> Int -> Point
-xi = domain_point
-
--- | Returns the domain point of t with indices i,j,k,l.
-domain_point :: Tetrahedron -> Int -> Int -> Int -> Int -> Point
-domain_point t i j k l
-   | i + j + k + l == 3 = weighted_sum `scale` (1/3)
-   | otherwise = error "domain point index out of bounds"
-   where
-     v0' = (v0 t) `scale` (fromIntegral i)
-     v1' = (v1 t) `scale` (fromIntegral j)
-     v2' = (v2 t) `scale` (fromIntegral k)
-     v3' = (v3 t) `scale` (fromIntegral l)
-     weighted_sum = v0' + v1' + v2' + v3'
-
 
 -- | The Bernstein polynomial on t with indices i,j,k,l. Denoted by a
 --   capital 'B' in the Sorokina/Zeilfelder paper.
@@ -160,7 +143,7 @@ beta t i j k l
 --   Zeilfelder, pp. 84-86. If incorrect indices are supplied, the
 --   function will simply error.
 c :: Tetrahedron -> Int -> Int -> Int -> Int -> Double
-c t i j k l =
+c !t !i !j !k !l =
   coefficient i j k l
   where
     fvs = function_values t
@@ -612,39 +595,6 @@ prop_b3_v2_always_zero t =
     (volume t) > 0 ==> (b3 t) (v2 t) ~= 0
 
 
--- | Used for convenience in the next few tests; not a test itself.
-p :: Tetrahedron -> Int -> Int -> Int -> Int -> Double
-p t i j k l = (polynomial t) (xi t i j k l)
-
--- | Given in Sorokina and Zeilfelder, p. 78.
-prop_c3000_identity :: Tetrahedron -> Property
-prop_c3000_identity t =
-    (volume t) > 0 ==>
-               c t 3 0 0 0 ~= p t 3 0 0 0
-
--- | Given in Sorokina and Zeilfelder, p. 78.
-prop_c2100_identity :: Tetrahedron -> Property
-prop_c2100_identity t =
-    (volume t) > 0 ==>
-      c t 2 1 0 0 ~= (term1 - term2 + term3 - term4)
-        where
-          term1 = (1/3)*(p t 0 3 0 0)
-          term2 = (5/6)*(p t 3 0 0 0)
-          term3 = 3*(p t 2 1 0 0)
-          term4 = (3/2)*(p t 1 2 0 0)
-
--- | Given in Sorokina and Zeilfelder, p. 78.
-prop_c1110_identity :: Tetrahedron -> Property
-prop_c1110_identity t =
-    (volume t) > 0 ==>
-       c t 1 1 1 0 ~= (term1 + term2 - term3 - term4)
-        where
-          term1 = (1/3)*((p t 3 0 0 0) + (p t 0 3 0 0) + (p t 0 0 3 0))
-          term2 = (9/2)*(p t 1 1 1 0)
-          term3 = (3/4)*((p t 2 1 0 0) + (p t 1 2 0 0) + (p t 2 0 1 0))
-          term4 = (3/4)*((p t 1 0 2 0) + (p t 0 2 1 0) + (p t 0 1 2 0))
-
-
 prop_swapping_vertices_doesnt_affect_coefficients1 :: Tetrahedron -> Bool
 prop_swapping_vertices_doesnt_affect_coefficients1 t =
       c t 0 0 1 2 == c t' 0 0 1 2
@@ -683,10 +633,57 @@ tetrahedron_tests =
 
 p78_24_properties :: Test.Framework.Test
 p78_24_properties =
-    testGroup "p. 78, Section (2.4) Properties" [
-      testProperty "c3000 identity" prop_c3000_identity,
-      testProperty "c2100 identity" prop_c2100_identity,
-      testProperty "c1110 identity" prop_c1110_identity]
+  testGroup "p. 78, Section (2.4) Properties" [
+    testProperty "c3000 identity" prop_c3000_identity,
+    testProperty "c2100 identity" prop_c2100_identity,
+    testProperty "c1110 identity" prop_c1110_identity]
+  where
+    -- | Returns the domain point of t with indices i,j,k,l.
+    domain_point :: Tetrahedron -> Int -> Int -> Int -> Int -> Point
+    domain_point t i j k l
+      | i + j + k + l == 3 = weighted_sum `scale` (1/3)
+      | otherwise = error "domain point index out of bounds"
+      where
+        v0' = (v0 t) `scale` (fromIntegral i)
+        v1' = (v1 t) `scale` (fromIntegral j)
+        v2' = (v2 t) `scale` (fromIntegral k)
+        v3' = (v3 t) `scale` (fromIntegral l)
+        weighted_sum = v0' + v1' + v2' + v3'
+
+
+    -- | Used for convenience in the next few tests.
+    p :: Tetrahedron -> Int -> Int -> Int -> Int -> Double
+    p t i j k l = (polynomial t) (domain_point t i j k l)
+
+
+    -- | Given in Sorokina and Zeilfelder, p. 78.
+    prop_c3000_identity :: Tetrahedron -> Property
+    prop_c3000_identity t =
+      (volume t) > 0 ==>
+        c t 3 0 0 0 ~= p t 3 0 0 0
+
+    -- | Given in Sorokina and Zeilfelder, p. 78.
+    prop_c2100_identity :: Tetrahedron -> Property
+    prop_c2100_identity t =
+      (volume t) > 0 ==>
+        c t 2 1 0 0 ~= (term1 - term2 + term3 - term4)
+        where
+          term1 = (1/3)*(p t 0 3 0 0)
+          term2 = (5/6)*(p t 3 0 0 0)
+          term3 = 3*(p t 2 1 0 0)
+          term4 = (3/2)*(p t 1 2 0 0)
+
+    -- | Given in Sorokina and Zeilfelder, p. 78.
+    prop_c1110_identity :: Tetrahedron -> Property
+    prop_c1110_identity t =
+      (volume t) > 0 ==>
+        c t 1 1 1 0 ~= (term1 + term2 - term3 - term4)
+        where
+          term1 = (1/3)*((p t 3 0 0 0) + (p t 0 3 0 0) + (p t 0 0 3 0))
+          term2 = (9/2)*(p t 1 1 1 0)
+          term3 = (3/4)*((p t 2 1 0 0) + (p t 1 2 0 0) + (p t 2 0 1 0))
+          term4 = (3/4)*((p t 1 0 2 0) + (p t 0 2 1 0) + (p t 0 1 2 0))
+
 
 
 tetrahedron_properties :: Test.Framework.Test