clif-0.1.1.0: src/Clif/Algebra.hs
{-|
Module : Clif.Algebra
Copyright : (c) Matti A. Eskelinen, 2016-2017
License : MIT
Maintainer : matti.a.eskelinen@gmail.com
Stability : experimental
Portability : POSIX
This module provides the type 'Clif' for representing the elements of a Clifford algebra along with some standard operations.
See /The inner products of geometric algebra/ by Leo Dorst for a concise explanation of the different inner products.
-}
{-# LANGUAGE
Safe,
FlexibleInstances,
MultiParamTypeClasses
#-}
module Clif.Algebra
(
-- * The @Clif@ type
Clif
-- * Constructing and deconstructing @Clifs@
, blade, (*:)
, vec
, fromList
, toList
-- * Geometric algebra operations
, grade, rev
-- * Outer product
, wedge, (/\)
-- * Inner products
, (<\), (/>), (.|.), (<.>)
, lContract, rContract, scalarProd, dot, hestenes
-- * Hodge duality
, hodge
-- * Projections
, proj
) where
import Clif.Basis
import Clif.Internal
infixl 8 <\, />, .|., <.>, /\
(<\), (/>), (.|.), (<.>), (/\) :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
-- | Infix synonym for 'lContract'
(<\) = lContract
-- | Infix synonym for 'rContract'
(/>) = rContract
-- | Infix synonym for 'scalarProd'
(.|.) = scalarProd
-- | Infix synonym for 'dot'
(<.>) = dot
-- | Infix synonym for 'wedge'
(/\) = wedge
-- | Left contraction
lContract :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
lContract = contractWith (flip (-))
-- | Right contraction
rContract :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
rContract = contractWith (-)
-- | Scalar product (0-grade components of the blade products)
scalarProd :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
scalarProd = contractWith (const (const 0))
-- | Dot product
dot :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
dot = contractWith (abs .: (-))
-- | Hestenes dot product
hestenes :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
hestenes = contractWith f
where f 0 _ = -1 -- negative grades don't exist, so the product vanishes
f _ 0 = -1
f a b = abs (a - b)
-- | Wedge product
wedge :: (Eq a, Basis b a) => Clif b a -> Clif b a -> Clif b a
wedge = contractWith (+)
-- | Hodge dual of a 'Clif' in a Clifford algebra specified by a given pseudoscalar (volume element):
--
-- prop> hodge (E <$> "abc") $ blade [E 'b'] 1 == blade (E <$> "ac") 1
--
hodge :: (Eq a, Basis b a) => [b] -> Clif b a -> Clif b a
hodge bs = flip (*) (sgnm * i)
where
i = blade bs 1 -- pseudoscalar times the sign of the metric
sgnm = i * rev i -- sign of the metric calculated from the unit pseudoscalar
-- | Projection of Clif x in the direction of Clif y, defined as
--
-- prop>proj x y == (x <\ recip y) <\ y
--
proj :: (Eq a, Basis b a, Fractional a) => Clif b a -> Clif b a -> Clif b a
proj x y = (x `lContract` recip y) * y