]> www.ginac.de Git - ginac.git/blobdiff - ginac/color.cpp
- prepared for 1.0.13 release
[ginac.git] / ginac / color.cpp
index 195b93e71ab9c651f196ec58f81c0312b4c4b6f6..4c50a6e7dd8f8c2b2abcab33eb927e2e869cbd78 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's color (SU(3) Lie algebra) objects. */
 
 /*
- *  GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#include <algorithm>
+#include <iostream>
 #include <stdexcept>
 
 #include "color.h"
 #include "ncmul.h"
 #include "symmetry.h"
 #include "numeric.h"
+#include "mul.h"
 #include "power.h" // for sqrt()
 #include "symbol.h"
 #include "print.h"
 #include "archive.h"
-#include "debugmsg.h"
 #include "utils.h"
 
 namespace GiNaC {
@@ -44,12 +44,11 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(su3f, tensor)
 GINAC_IMPLEMENT_REGISTERED_CLASS(su3d, tensor)
 
 //////////
-// default constructor, destructor, copy constructor assignment operator and helpers
+// default ctor, dtor, copy ctor, assignment operator and helpers
 //////////
 
 color::color() : representation_label(0)
 {
-       debugmsg("color default constructor", LOGLEVEL_CONSTRUCT);
        tinfo_key = TINFO_color;
 }
 
@@ -74,7 +73,6 @@ DEFAULT_CTORS(su3d)
  *  @see color_ONE */
 color::color(const ex & b, unsigned char rl) : inherited(b), representation_label(rl)
 {
-       debugmsg("color constructor from ex,unsigned char", LOGLEVEL_CONSTRUCT);
        tinfo_key = TINFO_color;
 }
 
@@ -83,19 +81,16 @@ color::color(const ex & b, unsigned char rl) : inherited(b), representation_labe
  *  @see color_T */
 color::color(const ex & b, const ex & i1, unsigned char rl) : inherited(b, i1), representation_label(rl)
 {
-       debugmsg("color constructor from ex,ex,unsigned char", LOGLEVEL_CONSTRUCT);
        tinfo_key = TINFO_color;
 }
 
 color::color(unsigned char rl, const exvector & v, bool discardable) : inherited(sy_none(), v, discardable), representation_label(rl)
 {
-       debugmsg("color constructor from unsigned char,exvector", LOGLEVEL_CONSTRUCT);
        tinfo_key = TINFO_color;
 }
 
 color::color(unsigned char rl, exvector * vp) : inherited(sy_none(), vp), representation_label(rl)
 {
-       debugmsg("color constructor from unsigned char,exvector *", LOGLEVEL_CONSTRUCT);
        tinfo_key = TINFO_color;
 }
 
@@ -105,7 +100,6 @@ color::color(unsigned char rl, exvector * vp) : inherited(sy_none(), vp), repres
 
 color::color(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
 {
-       debugmsg("color constructor from archive_node", LOGLEVEL_CONSTRUCT);
        unsigned rl;
        n.find_unsigned("label", rl);
        representation_label = rl;
@@ -124,12 +118,12 @@ DEFAULT_ARCHIVING(su3f)
 DEFAULT_ARCHIVING(su3d)
 
 //////////
-// functions overriding virtual functions from bases classes
+// functions overriding virtual functions from base classes
 //////////
 
 int color::compare_same_type(const basic & other) const
 {
-       GINAC_ASSERT(other.tinfo() == TINFO_color);
+       GINAC_ASSERT(is_a<color>(other));
        const color &o = static_cast<const color &>(other);
 
        if (representation_label != o.representation_label) {
@@ -140,6 +134,14 @@ int color::compare_same_type(const basic & other) const
        return inherited::compare_same_type(other);
 }
 
+bool color::match_same_type(const basic & other) const
+{
+       GINAC_ASSERT(is_a<color>(other));
+       const color &o = static_cast<const color &>(other);
+
+       return representation_label == o.representation_label;
+}
+
 DEFAULT_COMPARE(su3one)
 DEFAULT_COMPARE(su3t)
 DEFAULT_COMPARE(su3f)
@@ -215,13 +217,13 @@ static ex permute_free_index_to_front(const exvector & iv3, const exvector & iv2
 /** Automatic symbolic evaluation of indexed symmetric structure constant. */
 ex su3d::eval_indexed(const basic & i) const
 {
-       GINAC_ASSERT(is_of_type(i, indexed));
+       GINAC_ASSERT(is_a<indexed>(i));
        GINAC_ASSERT(i.nops() == 4);
-       GINAC_ASSERT(is_ex_of_type(i.op(0), su3d));
+       GINAC_ASSERT(is_a<su3d>(i.op(0)));
 
        // Convolutions are zero
        if (!(static_cast<const indexed &>(i).get_dummy_indices().empty()))
-               return _ex0();
+               return _ex0;
 
        // Numeric evaluation
        if (static_cast<const indexed &>(i).all_index_values_are(info_flags::nonnegint)) {
@@ -239,18 +241,18 @@ ex su3d::eval_indexed(const basic & i) const
                // Check for non-zero elements
                if (CMPINDICES(1,4,6) || CMPINDICES(1,5,7) || CMPINDICES(2,5,6)
                 || CMPINDICES(3,4,4) || CMPINDICES(3,5,5))
-                       return _ex1_2();
+                       return _ex1_2;
                else if (CMPINDICES(2,4,7) || CMPINDICES(3,6,6) || CMPINDICES(3,7,7))
-                       return _ex_1_2();
+                       return _ex_1_2;
                else if (CMPINDICES(1,1,8) || CMPINDICES(2,2,8) || CMPINDICES(3,3,8))
-                       return sqrt(_ex3())/3;
+                       return sqrt(_ex3)*_ex1_3;
                else if (CMPINDICES(8,8,8))
-                       return -sqrt(_ex3())/3;
+                       return sqrt(_ex3)*_ex_1_3;
                else if (CMPINDICES(4,4,8) || CMPINDICES(5,5,8)
                      || CMPINDICES(6,6,8) || CMPINDICES(7,7,8))
-                       return -sqrt(_ex3())/6;
+                       return sqrt(_ex3)/_ex_6;
                else
-                       return _ex0();
+                       return _ex0;
        }
 
        // No further simplifications
@@ -260,9 +262,9 @@ ex su3d::eval_indexed(const basic & i) const
 /** Automatic symbolic evaluation of indexed antisymmetric structure constant. */
 ex su3f::eval_indexed(const basic & i) const
 {
-       GINAC_ASSERT(is_of_type(i, indexed));
+       GINAC_ASSERT(is_a<indexed>(i));
        GINAC_ASSERT(i.nops() == 4);
-       GINAC_ASSERT(is_ex_of_type(i.op(0), su3f));
+       GINAC_ASSERT(is_a<su3f>(i.op(0)));
 
        // Numeric evaluation
        if (static_cast<const indexed &>(i).all_index_values_are(info_flags::nonnegint)) {
@@ -281,13 +283,13 @@ ex su3f::eval_indexed(const basic & i) const
                        return sign;
                else if (CMPINDICES(1,4,7) || CMPINDICES(2,4,6)
                      || CMPINDICES(2,5,7) || CMPINDICES(3,4,5))
-                       return _ex1_2() * sign;
+                       return _ex1_2 * sign;
                else if (CMPINDICES(1,5,6) || CMPINDICES(3,6,7))
-                       return _ex_1_2() * sign;
+                       return _ex_1_2 * sign;
                else if (CMPINDICES(4,5,8) || CMPINDICES(6,7,8))
-                       return sqrt(_ex3())/2 * sign;
+                       return sqrt(_ex3)/2 * sign;
                else
-                       return _ex0();
+                       return _ex0;
        }
 
        // No further simplifications
@@ -298,14 +300,19 @@ ex su3f::eval_indexed(const basic & i) const
 /** Contraction of generator with something else. */
 bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const
 {
-       GINAC_ASSERT(is_ex_of_type(*self, indexed));
-       GINAC_ASSERT(is_ex_of_type(*other, indexed));
+       GINAC_ASSERT(is_a<indexed>(*self));
+       GINAC_ASSERT(is_a<indexed>(*other));
        GINAC_ASSERT(self->nops() == 2);
-       GINAC_ASSERT(is_ex_of_type(self->op(0), su3t));
+       GINAC_ASSERT(is_a<su3t>(self->op(0)));
        unsigned char rl = ex_to<color>(*self).get_representation_label();
 
        if (is_ex_exactly_of_type(other->op(0), su3t)) {
 
+               // Contraction only makes sense if the represenation labels are equal
+               GINAC_ASSERT(is_a<color>(*other));
+               if (ex_to<color>(*other).get_representation_label() != rl)
+                       return false;
+
                // T.a T.a = 4/3 ONE
                if (other - self == 1) {
                        *self = numeric(4, 3);
@@ -316,7 +323,7 @@ bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exve
                } else if (other - self == 2
                        && is_ex_of_type(self[1], color)) {
                        *self = numeric(-1, 6);
-                       *other = _ex1();
+                       *other = _ex1;
                        return true;
 
                // T.a S T.a = 1/2 Tr(S) - 1/6 S
@@ -330,14 +337,14 @@ bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exve
                        }
 
                        it = self + 1;
-                       ex S = _ex1();
+                       ex S = _ex1;
                        while (it != other) {
                                S *= *it;
-                               *it++ = _ex1();
+                               *it++ = _ex1;
                        }
 
                        *self = color_trace(S, rl) * color_ONE(rl) / 2 - S / 6;
-                       *other = _ex1();
+                       *other = _ex1;
                        return true;
                }
        }
@@ -348,10 +355,10 @@ bool su3t::contract_with(exvector::iterator self, exvector::iterator other, exve
 /** Contraction of an indexed symmetric structure constant with something else. */
 bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const
 {
-       GINAC_ASSERT(is_ex_of_type(*self, indexed));
-       GINAC_ASSERT(is_ex_of_type(*other, indexed));
+       GINAC_ASSERT(is_a<indexed>(*self));
+       GINAC_ASSERT(is_a<indexed>(*other));
        GINAC_ASSERT(self->nops() == 4);
-       GINAC_ASSERT(is_ex_of_type(self->op(0), su3d));
+       GINAC_ASSERT(is_a<su3d>(self->op(0)));
 
        if (is_ex_exactly_of_type(other->op(0), su3d)) {
 
@@ -366,7 +373,7 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve
                // d.abc d.abc = 40/3
                if (dummy_indices.size() == 3) {
                        *self = numeric(40, 3);
-                       *other = _ex1();
+                       *other = _ex1;
                        return true;
 
                // d.akl d.bkl = 5/3 delta.ab
@@ -377,7 +384,7 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve
                        ita = set_difference(other_indices.begin(), other_indices.end(), dummy_indices.begin(), dummy_indices.end(), ita, ex_is_less());
                        GINAC_ASSERT(a.size() == 2);
                        *self = numeric(5, 3) * delta_tensor(a[0], a[1]);
-                       *other = _ex1();
+                       *other = _ex1;
                        return true;
                }
 
@@ -396,7 +403,7 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve
                        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();
+                       other[1] = _ex1;
                        return true;
                }
        }
@@ -407,10 +414,10 @@ bool su3d::contract_with(exvector::iterator self, exvector::iterator other, exve
 /** Contraction of an indexed antisymmetric structure constant with something else. */
 bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const
 {
-       GINAC_ASSERT(is_ex_of_type(*self, indexed));
-       GINAC_ASSERT(is_ex_of_type(*other, indexed));
+       GINAC_ASSERT(is_a<indexed>(*self));
+       GINAC_ASSERT(is_a<indexed>(*other));
        GINAC_ASSERT(self->nops() == 4);
-       GINAC_ASSERT(is_ex_of_type(self->op(0), su3f));
+       GINAC_ASSERT(is_a<su3f>(self->op(0)));
 
        if (is_ex_exactly_of_type(other->op(0), su3f)) { // f*d is handled by su3d class
 
@@ -421,7 +428,7 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve
                // f.abc f.abc = 24
                if (dummy_indices.size() == 3) {
                        *self = 24;
-                       *other = _ex1();
+                       *other = _ex1;
                        return true;
 
                // f.akl f.bkl = 3 delta.ab
@@ -430,7 +437,7 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve
                        ex a = permute_free_index_to_front(ex_to<indexed>(*self).get_indices(), dummy_indices, sign1);
                        ex b = permute_free_index_to_front(ex_to<indexed>(*other).get_indices(), dummy_indices, sign2);
                        *self = sign1 * sign2 * 3 * delta_tensor(a, b);
-                       *other = _ex1();
+                       *other = _ex1;
                        return true;
                }
 
@@ -449,7 +456,7 @@ bool su3f::contract_with(exvector::iterator self, exvector::iterator other, exve
                        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();
+                       other[1] = _ex1;
                        return true;
                }
        }
@@ -514,14 +521,14 @@ ex color_trace(const ex & e, unsigned char rl)
 
                if (ex_to<color>(e).get_representation_label() == rl
                 && is_ex_of_type(e.op(0), su3one))
-                       return _ex3();
+                       return _ex3;
                else
-                       return _ex0();
+                       return _ex0;
 
        } else if (is_ex_exactly_of_type(e, mul)) {
 
                // Trace of product: pull out non-color factors
-               ex prod = _ex1();
+               ex prod = _ex1;
                for (unsigned i=0; i<e.nops(); i++) {
                        const ex &o = e.op(i);
                        if (is_color_tinfo(o.return_type_tinfo(), rl))
@@ -534,7 +541,7 @@ ex color_trace(const ex & e, unsigned char rl)
        } else if (is_ex_exactly_of_type(e, ncmul)) {
 
                if (!is_color_tinfo(e.return_type_tinfo(), rl))
-                       return _ex0();
+                       return _ex0;
 
                // Expand product, if necessary
                ex e_expanded = e.expand();
@@ -565,7 +572,7 @@ ex color_trace(const ex & e, unsigned char rl)
 
                        exvector v1;
                        v1.reserve(num - 2);
-                       for (int i=0; i<num-2; i++)
+                       for (unsigned i=0; i<num-2; i++)
                                v1.push_back(e.op(i));
 
                        exvector v2 = v1;
@@ -582,7 +589,7 @@ ex color_trace(const ex & e, unsigned char rl)
                return e.map(fcn);
 
        } else
-               return _ex0();
+               return _ex0;
 }
 
 } // namespace GiNaC