[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
4.14.4 Dummy indices
GiNaC treats certain symbolic index pairs as dummy indices meaning that a summation over the index range is implied. Symbolic indices which are not dummy indices are called free indices. Numeric indices are neither dummy nor free indices.
To be recognized as a dummy index pair, the two indices must be of the same
class and their value must be the same single symbol (an index like
‘2*n+1’ is never a dummy index). If the indices are of class
varidx
they must also be of opposite variance; if they are of class
spinidx
they must be both dotted or both undotted.
The method .get_free_indices()
returns a vector containing the free
indices of an expression. It also checks that the free indices of the terms
of a sum are consistent:
{ symbol A("A"), B("B"), C("C"); symbol i_sym("i"), j_sym("j"), k_sym("k"), l_sym("l"); idx i(i_sym, 3), j(j_sym, 3), k(k_sym, 3), l(l_sym, 3); ex e = indexed(A, i, j) * indexed(B, j, k) + indexed(C, k, l, i, l); cout << exprseq(e.get_free_indices()) << endl; // -> (.i,.k) // 'j' and 'l' are dummy indices symbol mu_sym("mu"), nu_sym("nu"), rho_sym("rho"), sigma_sym("sigma"); varidx mu(mu_sym, 4), nu(nu_sym, 4), rho(rho_sym, 4), sigma(sigma_sym, 4); e = indexed(A, mu, nu) * indexed(B, nu.toggle_variance(), rho) + indexed(C, mu, sigma, rho, sigma.toggle_variance()); cout << exprseq(e.get_free_indices()) << endl; // -> (~mu,~rho) // 'nu' is a dummy index, but 'sigma' is not e = indexed(A, mu, mu); cout << exprseq(e.get_free_indices()) << endl; // -> (~mu) // 'mu' is not a dummy index because it appears twice with the same // variance e = indexed(A, mu, nu) + 42; cout << exprseq(e.get_free_indices()) << endl; // ERROR // this will throw an exception: // "add::get_free_indices: inconsistent indices in sum" } |
A dummy index summation like a.i b~i can be expanded for indices with numeric dimensions (e.g. 3) into the explicit sum like a.1 b~1 + a.2 b~2 + a.3 b~3. This is performed by the function
ex expand_dummy_sum(const ex & e, bool subs_idx = false); |
which takes an expression e
and returns the expanded sum for all
dummy indices with numeric dimensions. If the parameter subs_idx
is set to true
then all substitutions are made by idx
class
indices, i.e. without variance. In this case the above sum
a.i b~i
will be expanded to
a.1 b.1 + a.2 b.2 + a.3 b.3.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |