Indices
Declare names to be used as indices.
Declare index names to be usable for dummy index
purposes. Typical usage is of the form{r,s,t}::Indices(vector);
{a,b,c,d}::Indices(spinor);
\(\displaystyle{}\text{Attached property Indices(position=free) to }(r, s, t).\)
\(\displaystyle{}\text{Attached property Indices(position=free) to }(a, b, c, d).\)
This indicates the name of the index set ("vector" resp. "spinor"
in the example above).
Indices can occur as subscripts or superscripts, and you may use this
to indicate e.g. covariant and contravariant transformation
behaviour. In this case, use the additional
argument
position=fixed
to indicate that the position carries
meaning. If you do not want cadabra to automatically raise or lower
indices when canonicalising expressions, or if upper and lower indices
are not related at all, use position=independent
. The default is
position=free
, which means that indices in a pair can be positioned anywhere and
their position carries no meaning. Be aware that this is not what you want if there
is a metric involved!When you work with vector spaces which are subspaces of larger spaces,
it is possible to indicate that a given set of indices take values in
a subset of values of a larger set. An example makes this more
clear. Suppose we have one set of indices $A,B,C$ which take values in
a four-dimensional space, and another set of indices $a,b,c$ which
take values in a three-dimensional subspace. This is declared as
{A,B,C}::Indices(fourD);
{a,b,c}::Indices(threeD, parent=fourD);
\(\displaystyle{}\text{Attached property Indices(position=free) to }(A, B, C).\)
\(\displaystyle{}\text{Attached property Indices(position=free) to }(a, b, c).\)
This will allow Cadabra to canonicalise expressions which contain mixed
index types, as in
{A,B,C}::Indices(fourD);
{a,b,c}::Indices(name=threeD, parent=fourD);
M_{q? r?}::AntiSymmetric;
ex:=M_{a A} + M_{A a};
\(\displaystyle{}\text{Attached property Indices(position=free) to }(A, B, C).\)
\(\displaystyle{}\text{Attached property Indices(position=free) to }(a, b, c).\)
\(\displaystyle{}\text{Attached property AntiSymmetric to }{M}_(q?r?).\)
\(\displaystyle{}M_{a A}+M_{A a}\)
canonicalise(_);
\(\displaystyle{}0\)
Note the way in which the symmetry of the $M$ tensor was declared here.
Index values
For various algorithms (e.g.evaluate
) it is necessary to specify the values that a particular
index can take. The value of an index needs to be either a Coordinate
or a Symbol
, or
it can be an integer. The following are all valid:{x,y,z}::Coordinate.
{a,b,c}::Indices(values={x,y,z}).
{d,e,f}::Indices(values={0,1,3}).
{m,n,p}::Indices(values={0,1,2}).
{q,r,s}::Indices(values={0..3}).
When values is a sequence or a list of integers with no gaps, an automatic
Integer
property will be generated that reflects these values. So e.g. the
last line above (but not the middle line) leads to an automatic attachment{m,n,p}::Integer(0..3).