From: Christian Bauer Date: Tue, 27 Mar 2001 18:17:25 +0000 (+0000) Subject: contraction of symmetric with antisymmetric tensor over more than one index X-Git-Tag: release_0-8-1~46 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=f4ecccb36c004d05fcd3f96003c56e5a70ba38dc;ds=sidebyside contraction of symmetric with antisymmetric tensor over more than one index is zero --- diff --git a/ginac/indexed.cpp b/ginac/indexed.cpp index 86fe6115..27379fec 100644 --- a/ginac/indexed.cpp +++ b/ginac/indexed.cpp @@ -648,6 +648,16 @@ try_again: } } + // Contraction of symmetric with antisymmetric object is zero + if ((ex_to_indexed(*it1).symmetry == indexed::symmetric && + ex_to_indexed(*it2).symmetry == indexed::antisymmetric + || ex_to_indexed(*it1).symmetry == indexed::antisymmetric && + ex_to_indexed(*it2).symmetry == indexed::symmetric) + && dummy.size() > 1) { + free_indices.clear(); + return _ex0(); + } + // Try to contract the first one with the second one bool contracted = it1->op(0).bp->contract_with(it1, it2, v); if (!contracted) { @@ -713,17 +723,27 @@ ex simplify_indexed(const ex & e, exvector & free_indices, const scalar_products // Simplification of sum = sum of simplifications, check consistency of // free indices in each term if (is_ex_exactly_of_type(e_expanded, add)) { - ex sum = simplify_indexed(e_expanded.op(0), free_indices, sp); + bool first = true; + ex sum = _ex0(); + free_indices.clear(); - for (unsigned i=1; iadd_indexed(sum, term); - else - sum += term; + if (!term.is_zero()) { + if (first) { + free_indices = free_indices_of_term; + sum = term; + first = false; + } else { + if (!indices_consistent(free_indices, free_indices_of_term)) + throw (std::runtime_error("simplify_indexed: inconsistent indices in sum")); + if (is_ex_of_type(sum, indexed) && is_ex_of_type(term, indexed)) + sum = sum.op(0).bp->add_indexed(sum, term); + else + sum += term; + } + } } return sum;