This does not work (as you wrote it) because the mathematical symbols i, j, k
in the mathematical expression e_{i j k} s_{k}
are not the same as the python symbols of the same name over which you do the loops. In Cadabra, symbols appearing in mathematical expressions are not Python objects (unlike, for example, in SymPy). If this sounds weird, think about the object e_{i j k}
. That is clearly not a Python object. Cadabra's maths input language is not Python.
Of course you can still do what you want, using the much more powerful evaluate
algorithm. You would write
{i,j,k}::Indices(values={1,2,3});
\epsilon_{i j k}::EpsilonTensor();
ex:=\epsilon_{i j k} s_{k};
evaluate(ex);
The evaluate
does the index loops for you; the output will show that e.g. the i=1, j=2
component of your expression equals s_3
.
If you had wanted to do other component value substitutions too, you can add them as rules to the evaluate
function. For instance, if $s=(a,b,c)$, then use (instead of the last line above)
evaluate(ex, $s_{1}=a, s_{2}=b, s_{3}=c$);
Hope this helps.