X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fcolor.cpp;h=16f68c072ee1f41a149d67a76f2867243e6e4c60;hb=09f37bdbd46f469b3a8a902a43d0f795c41a89bf;hp=aeaf112c6e16adb9e9b9906a74bb9c3bca86eab6;hpb=e7cc6a764ff67b5885d6633385fac23ccc1dc9a7;p=ginac.git diff --git a/ginac/color.cpp b/ginac/color.cpp index aeaf112c..16f68c07 100644 --- a/ginac/color.cpp +++ b/ginac/color.cpp @@ -27,6 +27,7 @@ #include "idx.h" #include "ncmul.h" #include "symmetry.h" +#include "operators.h" #include "numeric.h" #include "mul.h" #include "power.h" // for sqrt() @@ -162,7 +163,7 @@ ex color::simplify_ncmul(const exvector & v) const // Remove superfluous ONEs exvector::const_iterator it = v.begin(), itend = v.end(); while (it != itend) { - if (!is_ex_of_type(it->op(0), su3one)) + if (!is_a(it->op(0))) s.push_back(*it); it++; } @@ -306,7 +307,12 @@ bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exve GINAC_ASSERT(is_a(self->op(0))); unsigned char rl = ex_to(*self).get_representation_label(); - if (is_ex_exactly_of_type(other->op(0), su3t)) { + if (is_exactly_a(other->op(0))) { + + // Contraction only makes sense if the represenation labels are equal + GINAC_ASSERT(is_a(*other)); + if (ex_to(*other).get_representation_label() != rl) + return false; // T.a T.a = 4/3 ONE if (other - self == 1) { @@ -316,7 +322,7 @@ bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exve // T.a T.b T.a = -1/6 T.b } else if (other - self == 2 - && is_ex_of_type(self[1], color)) { + && is_a(self[1])) { *self = numeric(-1, 6); *other = _ex1; return true; @@ -325,7 +331,7 @@ bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exve } else { exvector::iterator it = self + 1; while (it != other) { - if (!is_ex_of_type(*it, color)) { + if (!is_a(*it)) { return false; } it++; @@ -355,7 +361,7 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve GINAC_ASSERT(self->nops() == 4); GINAC_ASSERT(is_a(self->op(0))); - if (is_ex_exactly_of_type(other->op(0), su3d)) { + if (is_exactly_a(other->op(0))) { // Find the dummy indices of the contraction exvector self_indices = ex_to(*self).get_indices(); @@ -383,11 +389,11 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve return true; } - } else if (is_ex_exactly_of_type(other->op(0), su3t)) { + } else if (is_exactly_a(other->op(0))) { // d.abc T.b T.c = 5/6 T.a if (other+1 != v.end() - && is_ex_exactly_of_type(other[1].op(0), su3t) + && is_exactly_a(other[1].op(0)) && ex_to(*self).has_dummy_index_for(other[1].op(1))) { exvector self_indices = ex_to(*self).get_indices(); @@ -414,7 +420,7 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve GINAC_ASSERT(self->nops() == 4); GINAC_ASSERT(is_a(self->op(0))); - if (is_ex_exactly_of_type(other->op(0), su3f)) { // f*d is handled by su3d class + if (is_exactly_a(other->op(0))) { // f*d is handled by su3d class // Find the dummy indices of the contraction exvector dummy_indices; @@ -436,11 +442,11 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve return true; } - } else if (is_ex_exactly_of_type(other->op(0), su3t)) { + } else if (is_exactly_a(other->op(0))) { // f.abc T.b T.c = 3/2 I T.a if (other+1 != v.end() - && is_ex_exactly_of_type(other[1].op(0), su3t) + && is_exactly_a(other[1].op(0)) && ex_to(*self).has_dummy_index_for(other[1].op(1))) { exvector self_indices = ex_to(*self).get_indices(); @@ -470,7 +476,7 @@ ex color_ONE(unsigned char rl) ex color_T(const ex & a, unsigned char rl) { - if (!is_ex_of_type(a, idx)) + if (!is_a(a)) throw(std::invalid_argument("indices of color_T must be of type idx")); if (!ex_to(a).get_dim().is_equal(8)) throw(std::invalid_argument("index dimension for color_T must be 8")); @@ -480,7 +486,7 @@ ex color_T(const ex & a, unsigned char rl) ex color_f(const ex & a, const ex & b, const ex & c) { - if (!is_ex_of_type(a, idx) || !is_ex_of_type(b, idx) || !is_ex_of_type(c, idx)) + if (!is_a(a) || !is_a(b) || !is_a(c)) throw(std::invalid_argument("indices of color_f must be of type idx")); if (!ex_to(a).get_dim().is_equal(8) || !ex_to(b).get_dim().is_equal(8) || !ex_to(c).get_dim().is_equal(8)) throw(std::invalid_argument("index dimension for color_f must be 8")); @@ -490,7 +496,7 @@ ex color_f(const ex & a, const ex & b, const ex & c) ex color_d(const ex & a, const ex & b, const ex & c) { - if (!is_ex_of_type(a, idx) || !is_ex_of_type(b, idx) || !is_ex_of_type(c, idx)) + if (!is_a(a) || !is_a(b) || !is_a(c)) throw(std::invalid_argument("indices of color_d must be of type idx")); if (!ex_to(a).get_dim().is_equal(8) || !ex_to(b).get_dim().is_equal(8) || !ex_to(c).get_dim().is_equal(8)) throw(std::invalid_argument("index dimension for color_d must be 8")); @@ -512,15 +518,15 @@ static bool is_color_tinfo(unsigned ti, unsigned char rl) ex color_trace(const ex & e, unsigned char rl) { - if (is_ex_of_type(e, color)) { + if (is_a(e)) { if (ex_to(e).get_representation_label() == rl - && is_ex_of_type(e.op(0), su3one)) + && is_a(e.op(0))) return _ex3; else return _ex0; - } else if (is_ex_exactly_of_type(e, mul)) { + } else if (is_exactly_a(e)) { // Trace of product: pull out non-color factors ex prod = _ex1; @@ -533,14 +539,14 @@ ex color_trace(const ex & e, unsigned char rl) } return prod; - } else if (is_ex_exactly_of_type(e, ncmul)) { + } else if (is_exactly_a(e)) { if (!is_color_tinfo(e.return_type_tinfo(), rl)) return _ex0; // Expand product, if necessary ex e_expanded = e.expand(); - if (!is_ex_of_type(e_expanded, ncmul)) + if (!is_a(e_expanded)) return color_trace(e_expanded, rl); unsigned num = e.nops();