]> www.ginac.de Git - ginac.git/blobdiff - ginac/color.cpp
* Some internal reorganization WRT flyweight handling and initialization,
[ginac.git] / ginac / color.cpp
index 561f88b1e09d00c71f7b76231143289c1e0949fa..642da5c02125ac0b9a8fa4f33eb5870dc891dbd5 100644 (file)
@@ -28,6 +28,7 @@
 #include "ncmul.h"
 #include "symmetry.h"
 #include "numeric.h"
+#include "mul.h"
 #include "power.h" // for sqrt()
 #include "symbol.h"
 #include "print.h"
@@ -129,7 +130,7 @@ DEFAULT_ARCHIVING(su3d)
 
 int color::compare_same_type(const basic & other) const
 {
-       GINAC_ASSERT(is_of_type(other, color));
+       GINAC_ASSERT(is_a<color>(other));
        const color &o = static_cast<const color &>(other);
 
        if (representation_label != o.representation_label) {
@@ -142,7 +143,7 @@ int color::compare_same_type(const basic & other) const
 
 bool color::match_same_type(const basic & other) const
 {
-       GINAC_ASSERT(is_of_type(other, color));
+       GINAC_ASSERT(is_a<color>(other));
        const color &o = static_cast<const color &>(other);
 
        return representation_label == o.representation_label;
@@ -223,13 +224,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)) {
@@ -247,18 +248,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
@@ -268,9 +269,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)) {
@@ -289,13 +290,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
@@ -306,10 +307,10 @@ 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)) {
@@ -324,7 +325,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
@@ -338,14 +339,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;
                }
        }
@@ -356,10 +357,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)) {
 
@@ -374,7 +375,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
@@ -385,7 +386,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;
                }
 
@@ -404,7 +405,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;
                }
        }
@@ -415,10 +416,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
 
@@ -429,7 +430,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
@@ -438,7 +439,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;
                }
 
@@ -457,7 +458,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;
                }
        }
@@ -522,14 +523,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))
@@ -542,7 +543,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();
@@ -590,7 +591,7 @@ ex color_trace(const ex & e, unsigned char rl)
                return e.map(fcn);
 
        } else
-               return _ex0();
+               return _ex0;
 }
 
 } // namespace GiNaC