X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fcolor.cpp;h=92f890a5f25a4764368a72d606e413dfa8f30a98;hp=f06805e95ea3f617d4136e6c8a76efa35746a12b;hb=b9cd4b49ffbfbf3e1c36a2b594ec3148a5baca64;hpb=df7b9291027e0e5bda65e07fe251469ef964e704 diff --git a/ginac/color.cpp b/ginac/color.cpp index f06805e9..92f890a5 100644 --- a/ginac/color.cpp +++ b/ginac/color.cpp @@ -24,7 +24,6 @@ #include #include "color.h" -#include "ex.h" #include "idx.h" #include "ncmul.h" #include "numeric.h" @@ -363,13 +362,13 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve exvector free_indices, dummy_indices; find_free_and_dummy(all_indices, free_indices, dummy_indices); - // d.abc*d.abc=40/3 + // d.abc d.abc = 40/3 if (dummy_indices.size() == 3) { *self = numeric(40, 3); *other = _ex1(); return true; - // d.akl*d.bkl=5/3*delta.ab + // d.akl d.bkl = 5/3 delta.ab } else if (dummy_indices.size() == 2) { exvector a; back_insert_iterator ita(a); @@ -380,6 +379,25 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve *other = _ex1(); return true; } + + } else if (is_ex_exactly_of_type(other->op(0), su3t)) { + + // 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) + && ex_to_indexed(*self).has_dummy_index_for(other[1].op(1))) { + + exvector self_indices = ex_to_indexed(*self).get_indices(); + exvector dummy_indices; + dummy_indices.push_back(other[0].op(1)); + dummy_indices.push_back(other[1].op(1)); + int sig; + ex a = permute_free_index_to_front(self_indices, dummy_indices, sig); + *self = numeric(5, 6); + other[0] = color_T(a, ex_to_color(other[0]).get_representation_label()); + other[1] = _ex1(); + return true; + } } return false; @@ -399,13 +417,13 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve exvector dummy_indices; dummy_indices = ex_to_indexed(*self).get_dummy_indices(ex_to_indexed(*other)); - // f.abc*f.abc=24 + // f.abc f.abc = 24 if (dummy_indices.size() == 3) { *self = 24; *other = _ex1(); return true; - // f.akl*f.bkl=3*delta.ab + // f.akl f.bkl = 3 delta.ab } else if (dummy_indices.size() == 2) { int sign1, sign2; ex a = permute_free_index_to_front(ex_to_indexed(*self).get_indices(), dummy_indices, sign1); @@ -414,6 +432,25 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve *other = _ex1(); return true; } + + } else if (is_ex_exactly_of_type(other->op(0), su3t)) { + + // 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) + && ex_to_indexed(*self).has_dummy_index_for(other[1].op(1))) { + + exvector self_indices = ex_to_indexed(*self).get_indices(); + exvector dummy_indices; + dummy_indices.push_back(other[0].op(1)); + dummy_indices.push_back(other[1].op(1)); + int sig; + ex a = permute_free_index_to_front(self_indices, dummy_indices, sig); + *self = numeric(3, 2) * sig * I; + other[0] = color_T(a, ex_to_color(other[0]).get_representation_label()); + other[1] = _ex1(); + return true; + } } return false;