constexpr DEAL_II_CUDA_HOST_DEV
Tensor(const OtherNumber &initializer);
-#if __GNUC__ >= 11 || defined __INTEL_COMPILER
+#ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
/**
* Copy constructor
*/
constexpr DEAL_II_CUDA_HOST_DEV
Tensor(const Tensor<0, dim, Number> &other);
- /**
- * Copy assignment operator
- */
- constexpr DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
- operator=(const Tensor<0, dim, Number> &other);
-
/**
* Move constructor
*/
constexpr DEAL_II_CUDA_HOST_DEV
Tensor(Tensor<0, dim, Number> &&other) noexcept;
-
- /**
- * Move assignment operator
- */
- constexpr DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
- operator=(Tensor<0, dim, Number> &&other) noexcept;
#endif
/**
constexpr DEAL_II_CUDA_HOST_DEV Tensor &
operator=(const Tensor<0, dim, OtherNumber> &rhs);
+#if defined(__INTEL_COMPILER) || defined(DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG)
+ /**
+ * Assignment from tensors with same underlying scalar type.
+ * This is needed for ICC15 because it can't generate a suitable
+ * copy constructor for Sacado::Rad::ADvar types automatically.
+ * See https://github.com/dealii/dealii/pull/5865.
+ *
+ * @note This function can also be used in CUDA device code.
+ */
+ constexpr DEAL_II_CUDA_HOST_DEV Tensor &
+ operator=(const Tensor<0, dim, Number> &rhs);
+#endif
+
+#ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
+ /**
+ * Move assignment operator
+ */
+ constexpr DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
+ operator=(Tensor<0, dim, Number> &&other) noexcept;
+#endif
+
/**
* This operator assigns a scalar to a tensor. This obviously requires
* that the @p OtherNumber type is convertible to @p Number.
constexpr
operator Tensor<1, dim, Tensor<rank_ - 1, dim, OtherNumber>>() const;
-#if __GNUC__ >= 11 || defined __INTEL_COMPILER
+#ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
/**
* Copy constructor
*/
constexpr Tensor(const Tensor<rank_, dim, Number> &);
- /**
- * Copy assignment operator
- */
- constexpr Tensor<rank_, dim, Number> &
- operator=(const Tensor<rank_, dim, Number> &);
-
/**
* Move constructor
*/
constexpr Tensor(Tensor<rank_, dim, Number> &&) noexcept;
-
- /**
- * Move assignment operator
- */
- constexpr Tensor<rank_, dim, Number> &
- operator=(Tensor<rank_, dim, Number> &&) noexcept;
#endif
/**
constexpr Tensor &
operator=(const Number &d);
+#ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
+ /**
+ * Copy assignment operator
+ */
+ constexpr Tensor<rank_, dim, Number> &
+ operator=(const Tensor<rank_, dim, Number> &);
+
+ /**
+ * Move assignment operator
+ */
+ constexpr Tensor<rank_, dim, Number> &
+ operator=(Tensor<rank_, dim, Number> &&) noexcept;
+#endif
+
/**
* Test for equality of two tensors.
*/
{}
-
-# if __GNUC__ >= 11 || defined __INTEL_COMPILER
+# ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
template <int dim, typename Number>
constexpr DEAL_II_ALWAYS_INLINE DEAL_II_CUDA_HOST_DEV
Tensor<0, dim, Number>::Tensor(const Tensor<0, dim, Number> &other)
-template <int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
-Tensor<0, dim, Number>::operator=(const Tensor<0, dim, Number> &other)
-{
- value = other.value;
- return *this;
-}
-
-
-
template <int dim, typename Number>
constexpr DEAL_II_ALWAYS_INLINE DEAL_II_CUDA_HOST_DEV
Tensor<0, dim, Number>::Tensor(Tensor<0, dim, Number> &&other) noexcept
: value{std::move(other.value)}
{}
-
-
-
-template <int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
- Tensor<0, dim, Number>::operator=(Tensor<0, dim, Number> &&other) noexcept
-{
- value = std::move(other.value);
- return *this;
-}
# endif
-
template <int dim, typename Number>
inline Number *
Tensor<0, dim, Number>::begin_raw()
}
+# if defined(__INTEL_COMPILER) || defined(DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG)
+template <int dim, typename Number>
+constexpr inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
+ Tensor<0, dim, Number>::operator=(const Tensor<0, dim, Number> &p)
+{
+ value = p.value;
+ return *this;
+}
+# endif
+
+# ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
+template <int dim, typename Number>
+constexpr DEAL_II_ALWAYS_INLINE DEAL_II_CUDA_HOST_DEV Tensor<0, dim, Number> &
+ Tensor<0, dim, Number>::operator=(Tensor<0, dim, Number> &&other) noexcept
+{
+ value = std::move(other.value);
+ return *this;
+}
+# endif
+
+
+
template <int dim, typename Number>
template <typename OtherNumber>
constexpr inline DEAL_II_ALWAYS_INLINE
{}
+
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
constexpr DEAL_II_ALWAYS_INLINE
{}
+
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
constexpr DEAL_II_ALWAYS_INLINE Tensor<rank_, dim, Number>::
}
-# if __GNUC__ >= 11 || defined __INTEL_COMPILER
+# ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
template <int rank_, int dim, typename Number>
constexpr DEAL_II_ALWAYS_INLINE
Tensor<rank_, dim, Number>::Tensor(const Tensor<rank_, dim, Number> &other)
}
-template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE Tensor<rank_, dim, Number> &
-Tensor<rank_, dim, Number>::operator=(const Tensor<rank_, dim, Number> &other)
-{
- for (unsigned int i = 0; i < dim; ++i)
- values[i] = other.values[i];
- return *this;
-}
-
template <int rank_, int dim, typename Number>
constexpr DEAL_II_ALWAYS_INLINE
for (unsigned int i = 0; i < dim; ++i)
values[i] = other.values[i];
}
-
-
-template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE Tensor<rank_, dim, Number> &
- Tensor<rank_, dim, Number>::
- operator=(Tensor<rank_, dim, Number> &&other) noexcept
-{
- for (unsigned int i = 0; i < dim; ++i)
- values[i] = other.values[i];
- return *this;
-}
# endif
}
+
template <int rank_, int dim, typename Number>
constexpr inline DEAL_II_ALWAYS_INLINE Tensor<rank_, dim, Number> &
Tensor<rank_, dim, Number>::operator=(const Number &d)
}
+# ifdef DEAL_II_DELETED_MOVE_CONSTRUCTOR_BUG
+template <int rank_, int dim, typename Number>
+constexpr DEAL_II_ALWAYS_INLINE Tensor<rank_, dim, Number> &
+Tensor<rank_, dim, Number>::operator=(const Tensor<rank_, dim, Number> &other)
+{
+ for (unsigned int i = 0; i < dim; ++i)
+ values[i] = other.values[i];
+ return *this;
+}
+
+
+
+template <int rank_, int dim, typename Number>
+constexpr DEAL_II_ALWAYS_INLINE Tensor<rank_, dim, Number> &
+ Tensor<rank_, dim, Number>::
+ operator=(Tensor<rank_, dim, Number> &&other) noexcept
+{
+ for (unsigned int i = 0; i < dim; ++i)
+ values[i] = other.values[i];
+ return *this;
+}
+# endif
+
+
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
constexpr inline bool