From cabef88502a417a86d4a440e71d39309bdb1c51d Mon Sep 17 00:00:00 2001 From: Jean-Paul Pelteret Date: Wed, 26 Aug 2020 22:18:09 +0200 Subject: [PATCH] Fix converted type rank when a SymmetricTensor is contracted with a Tensor --- include/deal.II/base/symmetric_tensor.h | 2 +- tests/tensors/symmetric_tensor_45.cc | 115 +++++++++++++++++++++++ tests/tensors/symmetric_tensor_45.output | 50 ++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 tests/tensors/symmetric_tensor_45.cc create mode 100644 tests/tensors/symmetric_tensor_45.output diff --git a/include/deal.II/base/symmetric_tensor.h b/include/deal.II/base/symmetric_tensor.h index d0471c3dc4..8d116fb9be 100644 --- a/include/deal.II/base/symmetric_tensor.h +++ b/include/deal.II/base/symmetric_tensor.h @@ -4032,7 +4032,7 @@ constexpr DEAL_II_ALWAYS_INLINE operator*(const SymmetricTensor &src1, const Tensor & src2) { - return Tensor(src1) * src2; + return Tensor(src1) * src2; } diff --git a/tests/tensors/symmetric_tensor_45.cc b/tests/tensors/symmetric_tensor_45.cc new file mode 100644 index 0000000000..40bb2ed979 --- /dev/null +++ b/tests/tensors/symmetric_tensor_45.cc @@ -0,0 +1,115 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2017 - 2018 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + + +// Test that single contraction of SymmetricTensors and Tensors work +// as expected. + +#include +#include + +#include "../tests.h" + +template +void +fill_tensor(SymmetricTensor &t) +{ + for (unsigned int i = 0; i != t.n_independent_components; ++i) + { + t.access_raw_entry(i) = i + 1; + } +} + + +template +void +fill_tensor(Tensor &t) +{ + for (unsigned int i = 0; i != t.n_independent_components; ++i) + { + t[t.unrolled_to_component_indices(i)] = i + 1; + } +} + + +template +void +test_ST(const SymmetricTensor &S) +{ + Tensor<1, dim, NumberType1> T1; + Tensor<2, dim, NumberType1> T2; + Tensor<3, dim, NumberType1> T3; + Tensor<4, dim, NumberType1> T4; + + fill_tensor(T1); + fill_tensor(T2); + fill_tensor(T3); + fill_tensor(T4); + + deallog << "T1*S: " << T1 * S << std::endl; + deallog << "T2*S: " << T2 * S << std::endl; + deallog << "T3*S: " << T3 * S << std::endl; + deallog << "T4*S: " << T4 * S << std::endl; + + deallog << "S*T1: " << S * T1 << std::endl; + deallog << "S*T2: " << S * T2 << std::endl; + deallog << "S*T3: " << S * T3 << std::endl; + deallog << "S*T4: " << S * T4 << std::endl; +} + + +template +void +test_ST() +{ + const unsigned int dim = 2; + + deallog.push("rank 2"); + { + SymmetricTensor<2, dim, NumberType2> S; + fill_tensor(S); + test_ST(S); + } + deallog.pop(); + + deallog.push("rank 4"); + { + SymmetricTensor<4, dim, NumberType2> S; + fill_tensor(S); + test_ST(S); + } + deallog.pop(); +} + +int +main() +{ + initlog(); + + // Benchmark results for same types + deallog.push("d,d"); + test_ST(); + deallog.pop(); + + // Differing number types: + deallog.push("d,f"); + test_ST(); + deallog.pop(); + deallog.push("f,d"); + test_ST(); + deallog.pop(); + + deallog << "OK" << std::endl; +} diff --git a/tests/tensors/symmetric_tensor_45.output b/tests/tensors/symmetric_tensor_45.output new file mode 100644 index 0000000000..a05269c2dd --- /dev/null +++ b/tests/tensors/symmetric_tensor_45.output @@ -0,0 +1,50 @@ + +DEAL:d,d:rank 2::T1*S: 7.00000 7.00000 +DEAL:d,d:rank 2::T2*S: 7.00000 7.00000 15.0000 17.0000 +DEAL:d,d:rank 2::T3*S: 7.00000 7.00000 15.0000 17.0000 23.0000 27.0000 31.0000 37.0000 +DEAL:d,d:rank 2::T4*S: 7.00000 7.00000 15.0000 17.0000 23.0000 27.0000 31.0000 37.0000 39.0000 47.0000 47.0000 57.0000 55.0000 67.0000 63.0000 77.0000 +DEAL:d,d:rank 2::S*T1: 7.00000 7.00000 +DEAL:d,d:rank 2::S*T2: 10.0000 14.0000 9.00000 14.0000 +DEAL:d,d:rank 2::S*T3: 16.0000 20.0000 24.0000 28.0000 13.0000 18.0000 23.0000 28.0000 +DEAL:d,d:rank 2::S*T4: 28.0000 32.0000 36.0000 40.0000 44.0000 48.0000 52.0000 56.0000 21.0000 26.0000 31.0000 36.0000 41.0000 46.0000 51.0000 56.0000 +DEAL:d,d:rank 4::T1*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 +DEAL:d,d:rank 4::T2*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 +DEAL:d,d:rank 4::T3*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 47.0000 69.0000 69.0000 58.0000 59.0000 81.0000 81.0000 70.0000 63.0000 93.0000 93.0000 78.0000 81.0000 111.000 111.000 96.0000 +DEAL:d,d:rank 4::T4*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 47.0000 69.0000 69.0000 58.0000 59.0000 81.0000 81.0000 70.0000 63.0000 93.0000 93.0000 78.0000 81.0000 111.000 111.000 96.0000 79.0000 117.000 117.000 98.0000 103.000 141.000 141.000 122.000 95.0000 141.000 141.000 118.000 125.000 171.000 171.000 148.000 111.000 165.000 165.000 138.000 147.000 201.000 201.000 174.000 127.000 189.000 189.000 158.000 169.000 231.000 231.000 200.000 +DEAL:d,d:rank 4::S*T1: 7.00000 7.00000 25.0000 25.0000 25.0000 25.0000 16.0000 16.0000 +DEAL:d,d:rank 4::S*T2: 10.0000 14.0000 9.00000 14.0000 34.0000 50.0000 33.0000 50.0000 34.0000 50.0000 33.0000 50.0000 22.0000 32.0000 21.0000 32.0000 +DEAL:d,d:rank 4::S*T3: 16.0000 20.0000 24.0000 28.0000 13.0000 18.0000 23.0000 28.0000 52.0000 68.0000 84.0000 100.000 49.0000 66.0000 83.0000 100.000 52.0000 68.0000 84.0000 100.000 49.0000 66.0000 83.0000 100.000 34.0000 44.0000 54.0000 64.0000 31.0000 42.0000 53.0000 64.0000 +DEAL:d,d:rank 4::S*T4: 28.0000 32.0000 36.0000 40.0000 44.0000 48.0000 52.0000 56.0000 21.0000 26.0000 31.0000 36.0000 41.0000 46.0000 51.0000 56.0000 88.0000 104.000 120.000 136.000 152.000 168.000 184.000 200.000 81.0000 98.0000 115.000 132.000 149.000 166.000 183.000 200.000 88.0000 104.000 120.000 136.000 152.000 168.000 184.000 200.000 81.0000 98.0000 115.000 132.000 149.000 166.000 183.000 200.000 58.0000 68.0000 78.0000 88.0000 98.0000 108.000 118.000 128.000 51.0000 62.0000 73.0000 84.0000 95.0000 106.000 117.000 128.000 +DEAL:d,f:rank 2::T1*S: 7.00000 7.00000 +DEAL:d,f:rank 2::T2*S: 7.00000 7.00000 15.0000 17.0000 +DEAL:d,f:rank 2::T3*S: 7.00000 7.00000 15.0000 17.0000 23.0000 27.0000 31.0000 37.0000 +DEAL:d,f:rank 2::T4*S: 7.00000 7.00000 15.0000 17.0000 23.0000 27.0000 31.0000 37.0000 39.0000 47.0000 47.0000 57.0000 55.0000 67.0000 63.0000 77.0000 +DEAL:d,f:rank 2::S*T1: 7.00000 7.00000 +DEAL:d,f:rank 2::S*T2: 10.0000 14.0000 9.00000 14.0000 +DEAL:d,f:rank 2::S*T3: 16.0000 20.0000 24.0000 28.0000 13.0000 18.0000 23.0000 28.0000 +DEAL:d,f:rank 2::S*T4: 28.0000 32.0000 36.0000 40.0000 44.0000 48.0000 52.0000 56.0000 21.0000 26.0000 31.0000 36.0000 41.0000 46.0000 51.0000 56.0000 +DEAL:d,f:rank 4::T1*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 +DEAL:d,f:rank 4::T2*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 +DEAL:d,f:rank 4::T3*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 47.0000 69.0000 69.0000 58.0000 59.0000 81.0000 81.0000 70.0000 63.0000 93.0000 93.0000 78.0000 81.0000 111.000 111.000 96.0000 +DEAL:d,f:rank 4::T4*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 47.0000 69.0000 69.0000 58.0000 59.0000 81.0000 81.0000 70.0000 63.0000 93.0000 93.0000 78.0000 81.0000 111.000 111.000 96.0000 79.0000 117.000 117.000 98.0000 103.000 141.000 141.000 122.000 95.0000 141.000 141.000 118.000 125.000 171.000 171.000 148.000 111.000 165.000 165.000 138.000 147.000 201.000 201.000 174.000 127.000 189.000 189.000 158.000 169.000 231.000 231.000 200.000 +DEAL:d,f:rank 4::S*T1: 7.00000 7.00000 25.0000 25.0000 25.0000 25.0000 16.0000 16.0000 +DEAL:d,f:rank 4::S*T2: 10.0000 14.0000 9.00000 14.0000 34.0000 50.0000 33.0000 50.0000 34.0000 50.0000 33.0000 50.0000 22.0000 32.0000 21.0000 32.0000 +DEAL:d,f:rank 4::S*T3: 16.0000 20.0000 24.0000 28.0000 13.0000 18.0000 23.0000 28.0000 52.0000 68.0000 84.0000 100.000 49.0000 66.0000 83.0000 100.000 52.0000 68.0000 84.0000 100.000 49.0000 66.0000 83.0000 100.000 34.0000 44.0000 54.0000 64.0000 31.0000 42.0000 53.0000 64.0000 +DEAL:d,f:rank 4::S*T4: 28.0000 32.0000 36.0000 40.0000 44.0000 48.0000 52.0000 56.0000 21.0000 26.0000 31.0000 36.0000 41.0000 46.0000 51.0000 56.0000 88.0000 104.000 120.000 136.000 152.000 168.000 184.000 200.000 81.0000 98.0000 115.000 132.000 149.000 166.000 183.000 200.000 88.0000 104.000 120.000 136.000 152.000 168.000 184.000 200.000 81.0000 98.0000 115.000 132.000 149.000 166.000 183.000 200.000 58.0000 68.0000 78.0000 88.0000 98.0000 108.000 118.000 128.000 51.0000 62.0000 73.0000 84.0000 95.0000 106.000 117.000 128.000 +DEAL:f,d:rank 2::T1*S: 7.00000 7.00000 +DEAL:f,d:rank 2::T2*S: 7.00000 7.00000 15.0000 17.0000 +DEAL:f,d:rank 2::T3*S: 7.00000 7.00000 15.0000 17.0000 23.0000 27.0000 31.0000 37.0000 +DEAL:f,d:rank 2::T4*S: 7.00000 7.00000 15.0000 17.0000 23.0000 27.0000 31.0000 37.0000 39.0000 47.0000 47.0000 57.0000 55.0000 67.0000 63.0000 77.0000 +DEAL:f,d:rank 2::S*T1: 7.00000 7.00000 +DEAL:f,d:rank 2::S*T2: 10.0000 14.0000 9.00000 14.0000 +DEAL:f,d:rank 2::S*T3: 16.0000 20.0000 24.0000 28.0000 13.0000 18.0000 23.0000 28.0000 +DEAL:f,d:rank 2::S*T4: 28.0000 32.0000 36.0000 40.0000 44.0000 48.0000 52.0000 56.0000 21.0000 26.0000 31.0000 36.0000 41.0000 46.0000 51.0000 56.0000 +DEAL:f,d:rank 4::T1*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 +DEAL:f,d:rank 4::T2*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 +DEAL:f,d:rank 4::T3*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 47.0000 69.0000 69.0000 58.0000 59.0000 81.0000 81.0000 70.0000 63.0000 93.0000 93.0000 78.0000 81.0000 111.000 111.000 96.0000 +DEAL:f,d:rank 4::T4*S: 15.0000 21.0000 21.0000 18.0000 15.0000 21.0000 21.0000 18.0000 31.0000 45.0000 45.0000 38.0000 37.0000 51.0000 51.0000 44.0000 47.0000 69.0000 69.0000 58.0000 59.0000 81.0000 81.0000 70.0000 63.0000 93.0000 93.0000 78.0000 81.0000 111.000 111.000 96.0000 79.0000 117.000 117.000 98.0000 103.000 141.000 141.000 122.000 95.0000 141.000 141.000 118.000 125.000 171.000 171.000 148.000 111.000 165.000 165.000 138.000 147.000 201.000 201.000 174.000 127.000 189.000 189.000 158.000 169.000 231.000 231.000 200.000 +DEAL:f,d:rank 4::S*T1: 7.00000 7.00000 25.0000 25.0000 25.0000 25.0000 16.0000 16.0000 +DEAL:f,d:rank 4::S*T2: 10.0000 14.0000 9.00000 14.0000 34.0000 50.0000 33.0000 50.0000 34.0000 50.0000 33.0000 50.0000 22.0000 32.0000 21.0000 32.0000 +DEAL:f,d:rank 4::S*T3: 16.0000 20.0000 24.0000 28.0000 13.0000 18.0000 23.0000 28.0000 52.0000 68.0000 84.0000 100.000 49.0000 66.0000 83.0000 100.000 52.0000 68.0000 84.0000 100.000 49.0000 66.0000 83.0000 100.000 34.0000 44.0000 54.0000 64.0000 31.0000 42.0000 53.0000 64.0000 +DEAL:f,d:rank 4::S*T4: 28.0000 32.0000 36.0000 40.0000 44.0000 48.0000 52.0000 56.0000 21.0000 26.0000 31.0000 36.0000 41.0000 46.0000 51.0000 56.0000 88.0000 104.000 120.000 136.000 152.000 168.000 184.000 200.000 81.0000 98.0000 115.000 132.000 149.000 166.000 183.000 200.000 88.0000 104.000 120.000 136.000 152.000 168.000 184.000 200.000 81.0000 98.0000 115.000 132.000 149.000 166.000 183.000 200.000 58.0000 68.0000 78.0000 88.0000 98.0000 108.000 118.000 128.000 51.0000 62.0000 73.0000 84.0000 95.0000 106.000 117.000 128.000 +DEAL::OK -- 2.39.5