]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix converted type rank when a SymmetricTensor is contracted with a Tensor 10851/head
authorJean-Paul Pelteret <jppelteret@gmail.com>
Wed, 26 Aug 2020 20:18:09 +0000 (22:18 +0200)
committerJean-Paul Pelteret <jppelteret@gmail.com>
Thu, 27 Aug 2020 16:21:44 +0000 (18:21 +0200)
include/deal.II/base/symmetric_tensor.h
tests/tensors/symmetric_tensor_45.cc [new file with mode: 0644]
tests/tensors/symmetric_tensor_45.output [new file with mode: 0644]

index d0471c3dc40031125a6e5e10e0229038afd61a87..8d116fb9bebbaa20612fd483bb5c4a72608b6977 100644 (file)
@@ -4032,7 +4032,7 @@ constexpr DEAL_II_ALWAYS_INLINE
   operator*(const SymmetricTensor<rank_1, dim, Number> &src1,
             const Tensor<rank_2, dim, OtherNumber> &    src2)
 {
-  return Tensor<rank_2, dim, OtherNumber>(src1) * src2;
+  return Tensor<rank_1, dim, Number>(src1) * src2;
 }
 
 
diff --git a/tests/tensors/symmetric_tensor_45.cc b/tests/tensors/symmetric_tensor_45.cc
new file mode 100644 (file)
index 0000000..40bb2ed
--- /dev/null
@@ -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 <deal.II/base/symmetric_tensor.h>
+#include <deal.II/base/tensor.h>
+
+#include "../tests.h"
+
+template <int rank, int dim, typename NumberType>
+void
+fill_tensor(SymmetricTensor<rank, dim, NumberType> &t)
+{
+  for (unsigned int i = 0; i != t.n_independent_components; ++i)
+    {
+      t.access_raw_entry(i) = i + 1;
+    }
+}
+
+
+template <int rank, int dim, typename NumberType>
+void
+fill_tensor(Tensor<rank, dim, NumberType> &t)
+{
+  for (unsigned int i = 0; i != t.n_independent_components; ++i)
+    {
+      t[t.unrolled_to_component_indices(i)] = i + 1;
+    }
+}
+
+
+template <typename NumberType1, int rank, int dim, typename NumberType2>
+void
+test_ST(const SymmetricTensor<rank, dim, NumberType2> &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 <typename NumberType1, typename NumberType2>
+void
+test_ST()
+{
+  const unsigned int dim = 2;
+
+  deallog.push("rank 2");
+  {
+    SymmetricTensor<2, dim, NumberType2> S;
+    fill_tensor(S);
+    test_ST<NumberType1>(S);
+  }
+  deallog.pop();
+
+  deallog.push("rank 4");
+  {
+    SymmetricTensor<4, dim, NumberType2> S;
+    fill_tensor(S);
+    test_ST<NumberType1>(S);
+  }
+  deallog.pop();
+}
+
+int
+main()
+{
+  initlog();
+
+  // Benchmark results for same types
+  deallog.push("d,d");
+  test_ST<double, double>();
+  deallog.pop();
+
+  // Differing number types:
+  deallog.push("d,f");
+  test_ST<double, float>();
+  deallog.pop();
+  deallog.push("f,d");
+  test_ST<float, double>();
+  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 (file)
index 0000000..a05269c
--- /dev/null
@@ -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

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.