From: Christian Bauer Date: Thu, 18 Jul 2002 21:56:10 +0000 (+0000) Subject: metric tensors now silently replace their indices' dimensions with their X-Git-Tag: release_1-0-10~5 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=b8b8cfbb72bfa59b01371f67f542914cf55f2ab9 metric tensors now silently replace their indices' dimensions with their minimum instead of complaining about mismatching dimensions --- diff --git a/ginac/tensor.cpp b/ginac/tensor.cpp index 08c2ecc6..0c36a680 100644 --- a/ginac/tensor.cpp +++ b/ginac/tensor.cpp @@ -213,6 +213,13 @@ ex tensmetric::eval_indexed(const basic & i) const const varidx & i1 = ex_to(i.op(1)); const varidx & i2 = ex_to(i.op(2)); + // The dimension of the indices must be equal, otherwise we use the minimal + // dimension + if (!i1.get_dim().is_equal(i2.get_dim())) { + ex min_dim = i1.minimal_dim(i2); + return i.subs(lst(i1 == i1.replace_dim(min_dim), i2 == i2.replace_dim(min_dim))); + } + // A metric tensor with one covariant and one contravariant index gets // replaced by a delta tensor if (i1.is_covariant() != i2.is_covariant()) @@ -519,9 +526,6 @@ ex metric_tensor(const ex & i1, const ex & i2) { if (!is_ex_of_type(i1, varidx) || !is_ex_of_type(i2, varidx)) throw(std::invalid_argument("indices of metric tensor must be of type varidx")); - ex dim = ex_to(i1).get_dim(); - if (!dim.is_equal(ex_to(i2).get_dim())) - throw(std::invalid_argument("all indices of metric tensor must have the same dimension")); return indexed(tensmetric(), sy_symm(), i1, i2); } @@ -530,9 +534,6 @@ ex lorentz_g(const ex & i1, const ex & i2, bool pos_sig) { if (!is_ex_of_type(i1, varidx) || !is_ex_of_type(i2, varidx)) throw(std::invalid_argument("indices of metric tensor must be of type varidx")); - ex dim = ex_to(i1).get_dim(); - if (!dim.is_equal(ex_to(i2).get_dim())) - throw(std::invalid_argument("all indices of metric tensor must have the same dimension")); return indexed(minkmetric(pos_sig), sy_symm(), i1, i2); }