| [ < ] | [ > ] | [ << ] | [ 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] | [ ? ] |
