This notebook is part of the clifford documentation: https://clifford.readthedocs.io/.
This notebook demonstrates how to use clifford to work with Space Time Algebra.
The Pauli algebra of space $\mathbb{P}$, and Dirac algebra of space-time $\mathbb{D}$, are related using the spacetime split.
The split is implemented by using a BladeMap (docs), which maps a subset of blades in $\mathbb{D}$ to the blades in $\mathbb{P}$.
This split allows a spacetime bivector $F$ to be broken up into relative electric and magnetic fields in space.
Lorentz transformations are implemented as rotations in $\mathbb{D}$, and the effects on the relative fields are computed with the split.
First we import clifford, instantiate the two algebras, and populate the namespace with the blades of each algebra.
The elements of $\mathbb{D}$ are prefixed with $d$, while the elements of $\mathbb{P}$ are prefixed with $p$.
Although unconventional, it is easier to read and to translate into code.
In [ ]:
from clifford import Cl, pretty
pretty(precision=1)
# Dirac Algebra `D`
D, D_blades = Cl(1,3, firstIdx=0, names='d')
# Pauli Algebra `P`
P, P_blades = Cl(3, names='p')
# put elements of each in namespace
locals().update(D_blades)
locals().update(P_blades)
To two algebras can be related by the spacetime-split.
First, we create a BladeMap which relates the bivectors in $\mathbb{D}$ to the vectors/bivectors in $\mathbb{P}$.
The scalars and pseudo-scalars in each algebra are equated.
In [ ]:
from clifford import BladeMap
bm = BladeMap([(d01,p1),
(d02,p2),
(d03,p3),
(d12,p12),
(d23,p23),
(d13,p13),
(d0123, p123)])
A vector in $\mathbb{D}$, represents a unique place in space and time, i.e. an event. To illustrate the split, create a random event $X$.
In [ ]:
X = D.randomV()*10
X
This can be split into time and space components by multiplying with the time-vector $d_0$,
In [ ]:
X*d0
and applying the BladeMap, which results in a scalar+vector in $\mathbb{P}$
In [ ]:
bm(X*d0)
The space and time components can be separated by grade projection,
In [ ]:
x = bm(X*d0)
x(0) # the time component
In [ ]:
x(1) # the space component
We therefor define a split() function, which has a simple condition allowing it to act on a vector or a multivector in $\mathbb{D}$.
Splitting a spacetime bivector will be treated in the next section.
In [ ]:
def split(X):
return bm(X.odd*d0+X.even)
In [ ]:
split(X)
The split can be inverted by applying the BladeMap again, and multiplying by $d_0$
In [ ]:
x = split(X)
bm(x)*d0
Given a random bivector $F$ in $\mathbb{D}$,
In [ ]:
F = D.randomMV()(2)
F
$F$ splits into a vector/bivector in $\mathbb{P}$
In [ ]:
split(F)
If $F$ is interpreted as the electromagnetic bivector, the Electric and Magnetic fields can be separated by grade
In [ ]:
E = split(F)(1)
iB = split(F)(2)
E
In [ ]:
iB
Lorentz Transformations are rotations in $\mathbb{D}$, which are implemented with Rotors. A rotor in G4 will, in general, have scalar, bivector, and quadvector components.
In [ ]:
R = D.randomRotor()
R
In this way, the effect of a lorentz transformation on the electric and magnetic fields can be computed by rotating the bivector with $F \rightarrow RF\tilde{R}$
In [ ]:
F_ = R*F*~R
F_
Then splitting into $E$ and $B$ fields
In [ ]:
E_ = split(F_)(1)
E_
In [ ]:
iB_ = split(F_)(2)
iB_
Since lorentz rotations in $\mathbb{D}$, the magnitude of elements of $\mathbb{D}$ are invariants of the lorentz transformation. For example, the magnitude of electromagnetic bivector $F$ is invariant, and it can be related to $E$ and $B$ fields in $\mathbb{P}$ through the split,
In [ ]:
i = p123
E = split(F)(1)
B = -i*split(F)(2)
In [ ]:
F**2
In [ ]:
split(F**2) == E**2 - B**2 + (2*E|B)*i