]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
Fix scalar product with complex number: return real_type, not Number. Make unroll...
authorkronbichler <kronbichler@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 2 Aug 2011 12:19:58 +0000 (12:19 +0000)
committerkronbichler <kronbichler@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 2 Aug 2011 12:19:58 +0000 (12:19 +0000)
git-svn-id: https://svn.dealii.org/trunk@23991 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/include/deal.II/base/tensor.h
deal.II/include/deal.II/base/tensor_base.h
deal.II/source/base/tensor.cc [deleted file]

index 8cfb1f71e6e7ded1aa97c01499d1facbf9c9141f..effb6875a19454431b78772d8d5985dbb82c77b3 100644 (file)
@@ -76,6 +76,22 @@ class Tensor
                                      */
     typedef Tensor<rank_-1,dim,Number> value_type;
 
+                                    /**
+                                     * Declare a type that has holds
+                                     * real-valued numbers with the same
+                                     * precision as the template argument to
+                                     * this class. For std::complex<number>,
+                                     * this corresponds to type number, and
+                                     * it is equal to Number for all other
+                                     * cases. See also the respective field
+                                     * in Vector<Number>.
+                                     *
+                                     * This typedef is used to
+                                     * represent the return type of
+                                     * norms.
+                                     */
+    typedef typename numbers::NumberTraits<Number>::real_type real_type;
+
                                     /**
                                      * Declare an array type which
                                      * can be used to initialize an
@@ -185,7 +201,7 @@ class Tensor
                                       * i.e. the square root of the sum of
                                       * squares of all entries.
                                       */
-    Number norm () const;
+    real_type norm () const;
 
                                      /**
                                       * Return the square of the
@@ -199,7 +215,7 @@ class Tensor
                                      * may also be useful in other
                                      * contexts.
                                       */
-    Number norm_square () const;
+    real_type norm_square () const;
 
                                     /**
                                      * Fill a vector with all tensor elements.
@@ -210,7 +226,8 @@ class Tensor
                                      * usual in C++, the rightmost
                                      * index of the tensor marches fastest.
                                      */
-    void unroll (Vector<Number> & result) const;
+    template <typename Number2>
+    void unroll (Vector<Number2> & result) const;
 
 
                                     /**
@@ -264,8 +281,9 @@ class Tensor
                                     /**
                                      * Help function for unroll.
                                      */
-    void unroll_recursion(Vector<Number> &result,
-                         unsigned int   &start_index) const;
+    template <typename Number2>
+    void unroll_recursion(Vector<Number2> &result,
+                         unsigned int    &start_index) const;
 
                                     // make the following class a
                                     // friend to this class. in principle,
@@ -295,6 +313,7 @@ Tensor<rank_,dim,Number>::Tensor ()
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number>::Tensor (const array_type &initializer)
@@ -304,6 +323,7 @@ Tensor<rank_,dim,Number>::Tensor (const array_type &initializer)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 typename Tensor<rank_,dim,Number>::value_type&
@@ -315,6 +335,7 @@ Tensor<rank_,dim,Number>::operator[] (const unsigned int i)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 const typename Tensor<rank_,dim,Number>::value_type&
@@ -326,6 +347,7 @@ Tensor<rank_,dim,Number>::operator[] (const unsigned int i) const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number> &
@@ -337,12 +359,13 @@ Tensor<rank_,dim,Number>::operator = (const Tensor<rank_,dim,Number> &t)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number> &
 Tensor<rank_,dim,Number>::operator = (const Number d)
 {
-  Assert (d==0, ExcMessage ("Only assignment with zero is allowed"));
+  Assert (d==Number(0), ExcMessage ("Only assignment with zero is allowed"));
 
   for (unsigned int i=0; i<dim; ++i)
     subtensor[i] = 0;
@@ -350,6 +373,7 @@ Tensor<rank_,dim,Number>::operator = (const Number d)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 bool
@@ -361,6 +385,7 @@ Tensor<rank_,dim,Number>::operator == (const Tensor<rank_,dim,Number> &p) const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 bool
@@ -370,6 +395,7 @@ Tensor<rank_,dim,Number>::operator != (const Tensor<rank_,dim,Number> &p) const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number> &
@@ -381,6 +407,7 @@ Tensor<rank_,dim,Number>::operator += (const Tensor<rank_,dim,Number> &p)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number> &
@@ -392,6 +419,7 @@ Tensor<rank_,dim,Number>::operator -= (const Tensor<rank_,dim,Number> &p)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number> &
@@ -403,6 +431,7 @@ Tensor<rank_,dim,Number>::operator *= (const Number s)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number> &
@@ -414,6 +443,7 @@ Tensor<rank_,dim,Number>::operator /= (const Number s)
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number>
@@ -428,6 +458,7 @@ Tensor<rank_,dim,Number>::operator + (const Tensor<rank_,dim,Number> &t) const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number>
@@ -442,6 +473,7 @@ Tensor<rank_,dim,Number>::operator - (const Tensor<rank_,dim,Number> &t) const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Tensor<rank_,dim,Number>
@@ -456,19 +488,23 @@ Tensor<rank_,dim,Number>::operator - () const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
-Number Tensor<rank_,dim,Number>::norm () const
+typename Tensor<rank_,dim,Number>::real_type
+Tensor<rank_,dim,Number>::norm () const
 {
   return std::sqrt (norm_square());
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
-Number Tensor<rank_,dim,Number>::norm_square () const
+typename Tensor<rank_,dim,Number>::real_type
+Tensor<rank_,dim,Number>::norm_square () const
 {
-  Number s = 0;
+  real_type s = 0;
   for (unsigned int i=0; i<dim; ++i)
     s += subtensor[i].norm_square();
 
@@ -476,6 +512,35 @@ Number Tensor<rank_,dim,Number>::norm_square () const
 }
 
 
+
+template <int rank_, int dim, typename Number>
+template <typename Number2>
+inline
+void
+Tensor<rank_, dim, Number>::unroll (Vector<Number2> &result) const
+{
+  AssertDimension (result.size(),std::pow(static_cast<double>(dim),rank_));
+  unsigned index = 0;
+  unroll_recursion (result, index);
+}
+
+
+
+template <int rank_, int dim, typename Number>
+template <typename Number2>
+inline
+void
+Tensor<rank_, dim, Number>::unroll_recursion (Vector<Number2> &result,
+                                             unsigned int    &index) const
+{
+  for (unsigned i=0; i<dim; ++i)
+    {
+      operator[](i).unroll_recursion(result, index);
+    }
+}
+
+
+
 template <int rank_, int dim, typename Number>
 inline
 void Tensor<rank_,dim,Number>::clear ()
@@ -485,6 +550,7 @@ void Tensor<rank_,dim,Number>::clear ()
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 std::size_t
@@ -494,6 +560,7 @@ Tensor<rank_,dim,Number>::memory_consumption ()
 }
 
 
+
 template <int rank_, int dim, typename Number>
 template <class Archive>
 inline
index bbfc19eb9a71e2a25937bf144f033fdc7283c0f7..373be4f1410f3c93d202b5f7424324a527c385c8 100644 (file)
@@ -102,6 +102,22 @@ class Tensor<0,dim,Number>
 
     typedef Number value_type;
 
+                                    /**
+                                     * Declare a type that has holds
+                                     * real-valued numbers with the same
+                                     * precision as the template argument to
+                                     * this class. For std::complex<number>,
+                                     * this corresponds to type number, and
+                                     * it is equal to Number for all other
+                                     * cases. See also the respective field
+                                     * in Vector<Number>.
+                                     *
+                                     * This typedef is used to
+                                     * represent the return type of
+                                     * norms.
+                                     */
+    typedef typename numbers::NumberTraits<Number>::real_type real_type;
+
                                     /**
                                      * Constructor. Set to zero.
                                      */
@@ -221,7 +237,7 @@ class Tensor<0,dim,Number>
                                       * <tt>l<sub>2</sub></tt> norm of
                                       * the vector.
                                       */
-    Number norm () const;
+    real_type norm () const;
 
                                      /**
                                       * Return the square of the
@@ -235,7 +251,7 @@ class Tensor<0,dim,Number>
                                      * may also be useful in other
                                      * contexts.
                                       */
-    Number norm_square () const;
+    real_type norm_square () const;
 
                                     /**
                                      * Reset all values to zero.
@@ -345,6 +361,22 @@ class Tensor<1,dim,Number>
 
     typedef Number value_type;
 
+                                    /**
+                                     * Declare a type that has holds
+                                     * real-valued numbers with the same
+                                     * precision as the template argument to
+                                     * this class. For std::complex<number>,
+                                     * this corresponds to type number, and
+                                     * it is equal to Number for all other
+                                     * cases. See also the respective field
+                                     * in Vector<Number>.
+                                     *
+                                     * This typedef is used to
+                                     * represent the return type of
+                                     * norms.
+                                     */
+    typedef typename numbers::NumberTraits<Number>::real_type real_type;
+
                                     /**
                                      * Declare an array type which can
                                      * be used to initialize statically
@@ -494,7 +526,7 @@ class Tensor<1,dim,Number>
                                       * <tt>l<sub>2</sub></tt> norm of
                                       * the vector.
                                       */
-    Number norm () const;
+    real_type norm () const;
 
                                      /**
                                       * Return the square of the
@@ -508,7 +540,7 @@ class Tensor<1,dim,Number>
                                      * may also be useful in other
                                      * contexts.
                                       */
-    Number norm_square () const;
+    real_type norm_square () const;
 
                                     /**
                                      * Reset all values to zero.
@@ -539,7 +571,8 @@ class Tensor<1,dim,Number>
                                      * usual in C++, the rightmost
                                      * index marches fastest.
                                      */
-    void unroll (Vector<Number> &result) const;
+    template <typename Number2>
+    void unroll (Vector<Number2> &result) const;
 
                                     /**
                                      * Determine an estimate for
@@ -596,8 +629,9 @@ class Tensor<1,dim,Number>
                                      * case, even if it should be
                                      * public for your compiler.
                                      */
-    void unroll_recursion (Vector<Number> &result,
-                          unsigned int   &start_index) const;
+    template <typename Number2>
+    void unroll_recursion (Vector<Number2> &result,
+                          unsigned int    &start_index) const;
 
   private:
                                     /**
@@ -810,18 +844,20 @@ Tensor<0,dim,Number> Tensor<0,dim,Number>::operator - () const
 
 template <int dim, typename Number>
 inline
-Number Tensor<0,dim,Number>::norm () const
+typename Tensor<0,dim,Number>::real_type
+Tensor<0,dim,Number>::norm () const
 {
-  return std::abs (value);
+  return numbers::NumberTraits<Number>::abs (value);
 }
 
 
 
 template <int dim, typename Number>
 inline
-Number Tensor<0,dim,Number>::norm_square () const
+typename Tensor<0,dim,Number>::real_type
+Tensor<0,dim,Number>::norm_square () const
 {
-  return value*value;
+  return numbers::NumberTraits<Number>::abs_square (value);
 }
 
 
@@ -833,6 +869,8 @@ void Tensor<0,dim,Number>::clear ()
   value = 0;
 }
 
+
+
 template <int dim, typename Number>
 template <class Archive>
 inline
@@ -1125,7 +1163,8 @@ Tensor<1,dim,Number> Tensor<1,dim,Number>::operator - () const
 
 template <int dim, typename Number>
 inline
-Number Tensor<1,dim,Number>::norm () const
+typename Tensor<1,dim,Number>::real_type
+Tensor<1,dim,Number>::norm () const
 {
   return std::sqrt (norm_square());
 }
@@ -1134,17 +1173,46 @@ Number Tensor<1,dim,Number>::norm () const
 
 template <int dim, typename Number>
 inline
-Number Tensor<1,dim,Number>::norm_square () const
+typename Tensor<1,dim,Number>::real_type
+Tensor<1,dim,Number>::norm_square () const
 {
-  Number s = 0;
+  real_type s = 0;
   for (unsigned int i=0; i<dim; ++i)
-    s += values[i] * values[i];
+    s += numbers::NumberTraits<Number>::abs_square(values[i]);
 
   return s;
 }
 
 
 
+template <int dim, typename Number>
+template <typename Number2>
+inline
+void
+Tensor<1,dim,Number>::unroll (Vector<Number2> &result) const
+{
+  Assert (result.size()==dim,
+          ExcDimensionMismatch(dim, result.size()));
+
+  unsigned index = 0;
+  unroll_recursion (result,index);
+}
+
+
+
+template<int dim, typename Number>
+template <typename Number2>
+inline
+void
+Tensor<1,dim,Number>::unroll_recursion (Vector<Number2> &result,
+                                       unsigned int    &index) const
+{
+  for (unsigned i=0; i<dim; ++i)
+    result(index++) = operator[](i);
+}
+
+
+
 template <int dim, typename Number>
 inline
 void Tensor<1,dim,Number>::clear ()
diff --git a/deal.II/source/base/tensor.cc b/deal.II/source/base/tensor.cc
deleted file mode 100644 (file)
index 5ade4a8..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-//---------------------------------------------------------------------------
-//    $Id$
-//    Version: $Name$
-//
-//    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005, 2006 by the deal.II authors
-//
-//    This file is subject to QPL and may not be  distributed
-//    without copyright and license information. Please refer
-//    to the file deal.II/doc/license.html for the  text  and
-//    further information on this license.
-//
-//---------------------------------------------------------------------------
-
-
-#include <base/tensor.h>
-#include <cmath>
-#include <lac/vector.h>
-
-DEAL_II_NAMESPACE_OPEN
-
-
-// storage for static variables
-template <int dim, typename Number>
-const unsigned int Tensor<1,dim,Number>::dimension;
-
-template <int rank, int dim, typename Number>
-const unsigned int Tensor<rank,dim,Number>::dimension;
-
-
-template <int dim, typename Number>
-void
-Tensor<1,dim,Number>::unroll (Vector<Number> &result) const
-{
-  Assert (result.size()==dim,
-          ExcDimensionMismatch(dim, result.size()));
-
-  unsigned index = 0;
-  unroll_recursion (result,index);
-}
-
-
-
-template <int rank_, int dim, typename Number>
-void
-Tensor<rank_, dim, Number>::unroll (Vector<Number> &result) const
-{
-  Assert(result.size()==std::pow(static_cast<Number>(dim),rank_),
-        ExcDimensionMismatch(static_cast<unsigned int>(std::pow(static_cast<Number>(dim),rank_)),
-                              result.size()));
-
-  unsigned index = 0;
-  unroll_recursion (result, index);
-}
-
-
-
-template <int rank_, int dim, typename Number>
-void
-Tensor<rank_, dim, Number>::unroll_recursion (Vector<Number> &result,
-                                             unsigned int   &index) const
-{
-  for (unsigned i=0; i<dim; ++i)
-    {
-      operator[](i).unroll_recursion(result, index);
-    }
-}
-
-
-
-template<int dim, typename Number>
-void
-Tensor<1,dim,Number>::unroll_recursion (Vector<Number> &result,
-                                       unsigned int   &index) const
-{
-  for (unsigned i=0; i<dim; ++i)
-    result(index++) = operator[](i);
-}
-
-
-template class Tensor<1, 1, double>;
-template class Tensor<1, 2, double>;
-template class Tensor<1, 3, double>;
-template class Tensor<2, 1, double>;
-template class Tensor<2, 2, double>;
-template class Tensor<2, 3, double>;
-template class Tensor<3, 1, double>;
-template class Tensor<3, 2, double>;
-template class Tensor<3, 3, double>;
-template class Tensor<4, 1, double>;
-template class Tensor<4, 2, double>;
-template class Tensor<4, 3, double>;
-
-DEAL_II_NAMESPACE_CLOSE

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.