X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ftensor.cpp;h=8881425f6e4c2189dc73ed2132e1f82bd34299cc;hp=0d93e6529ea387c48a63963c16fd1fb5719da72d;hb=4a2bfea67bf250ebd88778f616dab442df2510fd;hpb=c366645d84ba4cfdd5b98785a9c5e66e0aea3e62 diff --git a/ginac/tensor.cpp b/ginac/tensor.cpp index 0d93e652..8881425f 100644 --- a/ginac/tensor.cpp +++ b/ginac/tensor.cpp @@ -153,7 +153,7 @@ DEFAULT_COMPARE(spinmetric) int minkmetric::compare_same_type(const basic & other) const { - GINAC_ASSERT(is_of_type(other, minkmetric)); + GINAC_ASSERT(is_a(other)); const minkmetric &o = static_cast(other); if (pos_sig != o.pos_sig) @@ -164,7 +164,7 @@ int minkmetric::compare_same_type(const basic & other) const int tensepsilon::compare_same_type(const basic & other) const { - GINAC_ASSERT(is_of_type(other, tensepsilon)); + GINAC_ASSERT(is_a(other)); const tensepsilon &o = static_cast(other); if (minkowski != o.minkowski) @@ -184,9 +184,9 @@ DEFAULT_PRINT_LATEX(tensepsilon, "eps", "\\varepsilon") /** Automatic symbolic evaluation of an indexed delta tensor. */ ex tensdelta::eval_indexed(const basic & i) const { - GINAC_ASSERT(is_of_type(i, indexed)); + GINAC_ASSERT(is_a(i)); GINAC_ASSERT(i.nops() == 3); - GINAC_ASSERT(is_ex_of_type(i.op(0), tensdelta)); + GINAC_ASSERT(is_a(i.op(0))); const idx & i1 = ex_to(i.op(1)); const idx & i2 = ex_to(i.op(2)); @@ -211,11 +211,11 @@ ex tensdelta::eval_indexed(const basic & i) const /** Automatic symbolic evaluation of an indexed metric tensor. */ ex tensmetric::eval_indexed(const basic & i) const { - GINAC_ASSERT(is_of_type(i, indexed)); + GINAC_ASSERT(is_a(i)); GINAC_ASSERT(i.nops() == 3); - GINAC_ASSERT(is_ex_of_type(i.op(0), tensmetric)); - GINAC_ASSERT(is_ex_of_type(i.op(1), varidx)); - GINAC_ASSERT(is_ex_of_type(i.op(2), varidx)); + GINAC_ASSERT(is_a(i.op(0))); + GINAC_ASSERT(is_a(i.op(1))); + GINAC_ASSERT(is_a(i.op(2))); const varidx & i1 = ex_to(i.op(1)); const varidx & i2 = ex_to(i.op(2)); @@ -232,11 +232,11 @@ ex tensmetric::eval_indexed(const basic & i) const /** Automatic symbolic evaluation of an indexed Lorentz metric tensor. */ ex minkmetric::eval_indexed(const basic & i) const { - GINAC_ASSERT(is_of_type(i, indexed)); + GINAC_ASSERT(is_a(i)); GINAC_ASSERT(i.nops() == 3); - GINAC_ASSERT(is_ex_of_type(i.op(0), minkmetric)); - GINAC_ASSERT(is_ex_of_type(i.op(1), varidx)); - GINAC_ASSERT(is_ex_of_type(i.op(2), varidx)); + GINAC_ASSERT(is_a(i.op(0))); + GINAC_ASSERT(is_a(i.op(1))); + GINAC_ASSERT(is_a(i.op(2))); const varidx & i1 = ex_to(i.op(1)); const varidx & i2 = ex_to(i.op(2)); @@ -259,11 +259,11 @@ ex minkmetric::eval_indexed(const basic & i) const /** Automatic symbolic evaluation of an indexed metric tensor. */ ex spinmetric::eval_indexed(const basic & i) const { - GINAC_ASSERT(is_of_type(i, indexed)); + GINAC_ASSERT(is_a(i)); GINAC_ASSERT(i.nops() == 3); - GINAC_ASSERT(is_ex_of_type(i.op(0), spinmetric)); - GINAC_ASSERT(is_ex_of_type(i.op(1), spinidx)); - GINAC_ASSERT(is_ex_of_type(i.op(2), spinidx)); + GINAC_ASSERT(is_a(i.op(0))); + GINAC_ASSERT(is_a(i.op(1))); + GINAC_ASSERT(is_a(i.op(2))); const spinidx & i1 = ex_to(i.op(1)); const spinidx & i2 = ex_to(i.op(2)); @@ -290,9 +290,9 @@ ex spinmetric::eval_indexed(const basic & i) const /** Automatic symbolic evaluation of an indexed epsilon tensor. */ ex tensepsilon::eval_indexed(const basic & i) const { - GINAC_ASSERT(is_of_type(i, indexed)); + GINAC_ASSERT(is_a(i)); GINAC_ASSERT(i.nops() > 1); - GINAC_ASSERT(is_ex_of_type(i.op(0), tensepsilon)); + GINAC_ASSERT(is_a(i.op(0))); // Convolutions are zero if (!(static_cast(i).get_dummy_indices().empty())) @@ -333,10 +333,10 @@ ex tensepsilon::eval_indexed(const basic & i) const /** Contraction of an indexed delta tensor with something else. */ bool tensdelta::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(*self)); + GINAC_ASSERT(is_a(*other)); GINAC_ASSERT(self->nops() == 3); - GINAC_ASSERT(is_ex_of_type(self->op(0), tensdelta)); + GINAC_ASSERT(is_a(self->op(0))); // Try to contract first index const idx *self_idx = &ex_to(self->op(1)); @@ -373,10 +373,10 @@ again: /** Contraction of an indexed metric tensor with something else. */ bool tensmetric::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(*self)); + GINAC_ASSERT(is_a(*other)); GINAC_ASSERT(self->nops() == 3); - GINAC_ASSERT(is_ex_of_type(self->op(0), tensmetric)); + GINAC_ASSERT(is_a(self->op(0))); // If contracting with the delta tensor, let the delta do it // (don't raise/lower delta indices) @@ -418,10 +418,10 @@ again: /** Contraction of an indexed spinor metric with something else. */ bool spinmetric::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(*self)); + GINAC_ASSERT(is_a(*other)); GINAC_ASSERT(self->nops() == 3); - GINAC_ASSERT(is_ex_of_type(self->op(0), spinmetric)); + GINAC_ASSERT(is_a(self->op(0))); // Contractions between spinor metrics if (is_ex_of_type(other->op(0), spinmetric)) { @@ -497,9 +497,9 @@ again: /** Contraction of epsilon tensor with something else. */ bool tensepsilon::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_ex_of_type(self->op(0), tensepsilon)); + GINAC_ASSERT(is_a(*self)); + GINAC_ASSERT(is_a(*other)); + GINAC_ASSERT(is_a(self->op(0))); unsigned num = self->nops() - 1; if (is_ex_exactly_of_type(other->op(0), tensepsilon) && num+1 == other->nops()) { @@ -507,9 +507,14 @@ bool tensepsilon::contract_with(exvector::iterator self, exvector::iterator othe // Contraction of two epsilon tensors is a determinant ex dim = ex_to(self->op(1)).get_dim(); matrix M(num, num); - for (int i=0; iop(i+1), other->op(j+1)); + for (int i=0; iop(i+1), other->op(j+1), pos_sig); + else + M(i, j) = metric_tensor(self->op(i+1), other->op(j+1)); + } + } int sign = minkowski ? -1 : 1; *self = sign * M.determinant().simplify_indexed(); *other = _ex1();