Let's say I have fields with both spin and isospin indices. A great feature of Cadabra is that it can deal with multiple index types -- so I can actually define spin and isospin indices separately. But when I use epsilon_to_delta
on products of epsilon tensors with spin and isospin indices, it produces generalized deltas with mixed spin and isospin indices, that I find a little awkward to deal with.
To be more concrete, I define the spin and isospin indices:
{a,b,c,d}::Indices(isospin,position=fixed).
{a,b,c,d}::Integer(1..2).
{i,j,k,l}::Indices(spin,position=fixed).
{i,j,k,l}::Integer(1..2).
In an attempt to keep the spin and isospin space from mixing with each other, I define two EpsilonTensor
s: $\epsilon_{i j}$ for the spin indices, and $E_{a b}$ for the isospin indices.
\delta{#}::KroneckerDelta.
# EpsilonTensor for spin indices
\epsilon_{i j}::EpsilonTensor(delta=\delta).
\epsilon^{i j}::EpsilonTensor(delta=\delta).
# EpsilonTensor for isospin indices
E_{a b}::EpsilonTensor(delta=\delta).
E^{a b}::EpsilonTensor(delta=\delta).
Now, epsilon_to_delta
works fine for a product like $\epsilon_{i j} \epsilon^{i k}E_{a b} E^{a c}$:
ex:= \epsilon_{i j} \epsilon^{i k} E_{a b} E^{a c};
epsilon_to_delta(_,repeat=True);
This immediately gives me $$\delta_{j}^{k} \delta_{b}^{c},$$ as expected. But when I try the same thing in a different order, such as $E_{a b} \epsilon_{i j} \epsilon^{i k} E^{a c}$:
ex:= E_{a b} \epsilon_{i j} \epsilon^{i k} E^{a c};
epsilon_to_delta(_,repeat=True);
I get $$4δ_{aibj} δ^{iakc},$$ where the generalized delta has mixed the two types of indices. I tried with two separate KroneckerDelta
for spin and isospin epsilon tensors as well, but it does not seem to help either.
At this point, I have to do expand_delta, distribute, eliminate_kronecker
to get to the result I want. Alternatively, sorting the product first and then using epsilon_to_delta
avoids this problem too. But can I tell Cadabra to only use epsilon_to_delta
on same "type" of EpsilonTensor
s so that this situation does not arise at all? Is there a better way of achieving this?
I hope the question was clear. Thanks for the help!
I am using Cadabra2 version 2.1.4 compiled from source.