* @relatesalso SymmetricTensor
*/
template <int dim, typename Number = double>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
- unit_symmetric_tensor();
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<2, dim, Number>
+ unit_symmetric_tensor();
/**
* Return the tensor of rank 4 that, when multiplied by a symmetric rank 2
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number = double>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE SymmetricTensor<4, dim, Number>
- deviator_tensor();
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<4, dim, Number>
+ deviator_tensor();
/**
* Return the fourth-order symmetric identity tensor $\mathbb S$ which maps
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number = double>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE SymmetricTensor<4, dim, Number>
- identity_tensor();
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<4, dim, Number>
+ identity_tensor();
template <int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
- invert(const SymmetricTensor<2, dim, Number> &);
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
+invert(const SymmetricTensor<2, dim, Number> &);
template <int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE SymmetricTensor<4, dim, Number>
- invert(const SymmetricTensor<4, dim, Number> &);
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE SymmetricTensor<4, dim, Number>
+invert(const SymmetricTensor<4, dim, Number> &);
/**
* Compute and return the trace of a tensor of rank 2, i.e. the sum of its
* @relatesalso SymmetricTensor
*/
template <int dim2, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE Number
trace(const SymmetricTensor<2, dim2, Number> &);
/**
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
-deviator(const SymmetricTensor<2, dim, Number> &);
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<2, dim, Number>
+ deviator(const SymmetricTensor<2, dim, Number> &);
/**
* Compute the determinant of a rank 2 symmetric tensor. The determinant is
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE Number
determinant(const SymmetricTensor<2, dim, Number> &);
* put at position <tt>position</tt>. The remaining indices remain in
* invalid state.
*/
- DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE TableIndices<2>
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE TableIndices<2>
merge(const TableIndices<2> &previous_indices,
const unsigned int new_index,
const unsigned int position)
* put at position <tt>position</tt>. The remaining indices remain in
* invalid state.
*/
- DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE TableIndices<4>
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE TableIndices<4>
merge(const TableIndices<4> &previous_indices,
const unsigned int new_index,
const unsigned int position)
* This guarantees that the accessor objects go out of scope earlier
* than the mother object, avoid problems with data consistency.
*/
- constexpr Accessor(tensor_type & tensor,
- const TableIndices<rank> &previous_indices);
+ DEAL_II_CONSTEXPR_FUNCTION
+ Accessor(tensor_type &tensor, const TableIndices<rank> &previous_indices);
/**
* Copy constructor.
*/
- constexpr DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Accessor(const Accessor &) = default;
public:
/**
* Index operator.
*/
- constexpr Accessor<rank, dim, constness, P - 1, Number>
- operator[](const unsigned int i);
+ DEAL_II_CONSTEXPR_FUNCTION Accessor<rank, dim, constness, P - 1, Number>
+ operator[](const unsigned int i);
/**
* Index operator.
*/
- constexpr Accessor<rank, dim, constness, P - 1, Number>
- operator[](const unsigned int i) const;
+ DEAL_II_CONSTEXPR_FUNCTION Accessor<rank, dim, constness, P - 1, Number>
+ operator[](const unsigned int i) const;
private:
/**
* This guarantees that the accessor objects go out of scope earlier
* than the mother object, avoid problems with data consistency.
*/
- constexpr Accessor(tensor_type & tensor,
- const TableIndices<rank> &previous_indices);
+ DEAL_II_CONSTEXPR_FUNCTION
+ Accessor(tensor_type &tensor, const TableIndices<rank> &previous_indices);
/**
* Copy constructor.
*/
- constexpr DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Accessor(const Accessor &) = default;
public:
/**
* Index operator.
*/
- constexpr reference
+ DEAL_II_CONSTEXPR_FUNCTION reference
operator[](const unsigned int);
/**
* Index operator.
*/
- constexpr reference
+ DEAL_II_CONSTEXPR_FUNCTION reference
operator[](const unsigned int) const;
private:
/**
* Default constructor. Creates a tensor with all entries equal to zero.
*/
- constexpr DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
SymmetricTensor() = default;
/**
* the object from the internal namespace is to work around bugs in some
* older compilers.
*/
- constexpr SymmetricTensor(const Number (&array)[n_independent_components]);
+ DEAL_II_CONSTEXPR_FUNCTION
+ SymmetricTensor(const Number (&array)[n_independent_components]);
/**
* Copy constructor from tensors with different underlying scalar type. This
* Number.
*/
template <typename OtherNumber>
- constexpr explicit SymmetricTensor(
+ DEAL_II_CONSTEXPR_FUNCTION explicit SymmetricTensor(
const SymmetricTensor<rank_, dim, OtherNumber> &initializer);
/**
* @p Number.
*/
template <typename OtherNumber>
- constexpr SymmetricTensor &
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor &
operator=(const SymmetricTensor<rank_, dim, OtherNumber> &rhs);
/**
* value allowed for <tt>d</tt>, allowing the intuitive notation
* $\mathbf A = 0$ to reset all elements of the tensor to zero.
*/
- constexpr SymmetricTensor &
- operator=(const Number &d);
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor &
+ operator=(const Number &d);
/**
* Convert the present symmetric tensor into a full tensor with the same
* elements, but using the different storage scheme of full tensors.
*/
- constexpr operator Tensor<rank_, dim, Number>() const;
+ DEAL_II_CONSTEXPR_FUNCTION operator Tensor<rank_, dim, Number>() const;
/**
* Test for equality of two tensors.
*/
- constexpr bool
+ DEAL_II_CONSTEXPR_FUNCTION bool
operator==(const SymmetricTensor &) const;
/**
* Test for inequality of two tensors.
*/
- constexpr bool
+ DEAL_II_CONSTEXPR_FUNCTION bool
operator!=(const SymmetricTensor &) const;
/**
* Add another tensor.
*/
template <typename OtherNumber>
- constexpr SymmetricTensor &
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor &
operator+=(const SymmetricTensor<rank_, dim, OtherNumber> &);
/**
* Subtract another tensor.
*/
template <typename OtherNumber>
- constexpr SymmetricTensor &
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor &
operator-=(const SymmetricTensor<rank_, dim, OtherNumber> &);
/**
* <tt>factor</tt>.
*/
template <typename OtherNumber>
- constexpr SymmetricTensor &
- operator*=(const OtherNumber &factor);
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor &
+ operator*=(const OtherNumber &factor);
/**
* Scale the tensor by <tt>1/factor</tt>.
*/
template <typename OtherNumber>
- constexpr SymmetricTensor &
- operator/=(const OtherNumber &factor);
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor &
+ operator/=(const OtherNumber &factor);
/**
* Unary minus operator. Negate all entries of a tensor.
*/
- constexpr SymmetricTensor
+ DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor
operator-() const;
/**
* symmetric tensors.
*/
template <typename OtherNumber>
- DEAL_II_CONSTEXPR typename internal::SymmetricTensorAccessors::
+ DEAL_II_CONSTEXPR_FUNCTION typename internal::SymmetricTensorAccessors::
double_contraction_result<rank_, 2, dim, Number, OtherNumber>::type
operator*(const SymmetricTensor<2, dim, OtherNumber> &s) const;
* two indices of the rank-4 symmetric tensor given as argument.
*/
template <typename OtherNumber>
- DEAL_II_CONSTEXPR typename internal::SymmetricTensorAccessors::
+ DEAL_II_CONSTEXPR_FUNCTION typename internal::SymmetricTensorAccessors::
double_contraction_result<rank_, 4, dim, Number, OtherNumber>::type
operator*(const SymmetricTensor<4, dim, OtherNumber> &s) const;
/**
* Return a read-write reference to the indicated element.
*/
- constexpr Number &
- operator()(const TableIndices<rank_> &indices);
+ DEAL_II_CONSTEXPR_FUNCTION Number &
+ operator()(const TableIndices<rank_> &indices);
/**
* Return a @p const reference to the value referred to by the argument.
*/
- constexpr const Number &
+ DEAL_II_CONSTEXPR_FUNCTION const Number &
operator()(const TableIndices<rank_> &indices) const;
/**
* Access the elements of a row of this symmetric tensor. This function is
* called for constant tensors.
*/
- constexpr internal::SymmetricTensorAccessors::
+ DEAL_II_CONSTEXPR_FUNCTION internal::SymmetricTensorAccessors::
Accessor<rank_, dim, true, rank_ - 1, Number>
operator[](const unsigned int row) const;
* Access the elements of a row of this symmetric tensor. This function is
* called for non-constant tensors.
*/
- constexpr internal::SymmetricTensorAccessors::
+ DEAL_II_CONSTEXPR_FUNCTION internal::SymmetricTensorAccessors::
Accessor<rank_, dim, false, rank_ - 1, Number>
operator[](const unsigned int row);
*
* Exactly the same as operator().
*/
- constexpr const Number &
+ DEAL_II_CONSTEXPR_FUNCTION const Number &
operator[](const TableIndices<rank_> &indices) const;
/**
*
* Exactly the same as operator().
*/
- constexpr Number &
- operator[](const TableIndices<rank_> &indices);
+ DEAL_II_CONSTEXPR_FUNCTION Number &
+ operator[](const TableIndices<rank_> &indices);
/**
* Access to an element according to unrolled index. The function
* <tt>s[s.unrolled_to_component_indices(unrolled_index)]</tt>, but more
* efficiently.
*/
- constexpr const Number &
+ DEAL_II_CONSTEXPR_FUNCTION const Number &
access_raw_entry(const unsigned int unrolled_index) const;
/**
* <tt>s[s.unrolled_to_component_indices(unrolled_index)]</tt>, but more
* efficiently.
*/
- constexpr Number &
+ DEAL_II_CONSTEXPR_FUNCTION Number &
access_raw_entry(const unsigned int unrolled_index);
/**
* upper right as well as lower left entries, not just one of them, although
* they are equal for symmetric tensors).
*/
- constexpr typename numbers::NumberTraits<Number>::real_type
+ DEAL_II_CONSTEXPR_FUNCTION typename numbers::NumberTraits<Number>::real_type
norm() const;
/**
* <code>[0,n_independent_components)</code> the given entry in a symmetric
* tensor has.
*/
- static constexpr unsigned int
+ static DEAL_II_CONSTEXPR_FUNCTION unsigned int
component_to_unrolled_index(const TableIndices<rank_> &indices);
/**
* form of the tensor, return what set of indices $(k,l)$ (for rank-2
* tensors) or $(k,l,m,n)$ (for rank-4 tensors) corresponds to it.
*/
- static constexpr TableIndices<rank_>
+ static DEAL_II_CONSTEXPR_FUNCTION TableIndices<rank_>
unrolled_to_component_indices(const unsigned int i);
/**
* and indeed the state where all elements have a zero value is the state
* right after construction of such an object.
*/
- constexpr void
+ DEAL_II_CONSTEXPR_FUNCTION void
clear();
/**
* Determine an estimate for the memory consumption (in bytes) of this
* object.
*/
- static constexpr std::size_t
- memory_consumption();
+ static DEAL_II_CONSTEXPR_FUNCTION std::size_t
+ memory_consumption();
/**
* Read or write the data of this object to or from a stream for the purpose
// Make a few more functions friends.
template <int dim2, typename Number2>
- friend constexpr Number2
+ friend DEAL_II_CONSTEXPR_FUNCTION Number2
trace(const SymmetricTensor<2, dim2, Number2> &d);
template <int dim2, typename Number2>
- friend DEAL_II_CONSTEXPR Number2
+ friend DEAL_II_CONSTEXPR_FUNCTION Number2
determinant(const SymmetricTensor<2, dim2, Number2> &t);
template <int dim2, typename Number2>
- friend constexpr SymmetricTensor<2, dim2, Number2>
+ friend DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor<2, dim2, Number2>
deviator(const SymmetricTensor<2, dim2, Number2> &t);
template <int dim2, typename Number2>
- friend DEAL_II_CONSTEXPR SymmetricTensor<2, dim2, Number2>
- unit_symmetric_tensor();
+ friend DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor<2, dim2, Number2>
+ unit_symmetric_tensor();
template <int dim2, typename Number2>
- friend DEAL_II_CONSTEXPR SymmetricTensor<4, dim2, Number2>
- deviator_tensor();
+ friend DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor<4, dim2, Number2>
+ deviator_tensor();
template <int dim2, typename Number2>
- friend DEAL_II_CONSTEXPR SymmetricTensor<4, dim2, Number2>
- identity_tensor();
+ friend DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor<4, dim2, Number2>
+ identity_tensor();
// Make a few helper classes friends as well.
namespace SymmetricTensorAccessors
{
template <int rank_, int dim, bool constness, int P, typename Number>
- constexpr DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Accessor<rank_, dim, constness, P, Number>::Accessor(
tensor_type & tensor,
const TableIndices<rank_> &previous_indices)
template <int rank_, int dim, bool constness, int P, typename Number>
- constexpr inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
Accessor<rank_, dim, constness, P - 1, Number>
Accessor<rank_, dim, constness, P, Number>::operator[](
const unsigned int i)
template <int rank_, int dim, bool constness, int P, typename Number>
- constexpr DEAL_II_ALWAYS_INLINE
- Accessor<rank_, dim, constness, P - 1, Number>
+ DEAL_II_CONSTEXPR_FUNCTION
+ DEAL_II_ALWAYS_INLINE Accessor<rank_, dim, constness, P - 1, Number>
Accessor<rank_, dim, constness, P, Number>::operator[](
const unsigned int i) const
{
template <int rank_, int dim, bool constness, typename Number>
- constexpr DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Accessor<rank_, dim, constness, 1, Number>::Accessor(
tensor_type & tensor,
const TableIndices<rank_> &previous_indices)
template <int rank_, int dim, bool constness, typename Number>
- constexpr inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename Accessor<rank_, dim, constness, 1, Number>::reference
Accessor<rank_, dim, constness, 1, Number>::operator[](
const unsigned int i)
template <int rank_, int dim, bool constness, typename Number>
- constexpr DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
typename Accessor<rank_, dim, constness, 1, Number>::reference
Accessor<rank_, dim, constness, 1, Number>::operator[](
const unsigned int i) const
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
SymmetricTensor<rank_, dim, Number>::SymmetricTensor(
const SymmetricTensor<rank_, dim, OtherNumber> &initializer)
: data(initializer.data)
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
SymmetricTensor<rank_, dim, Number>::SymmetricTensor(
const Number (&array)[n_independent_components])
: data(
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number> &
-SymmetricTensor<rank_, dim, Number>::operator=(
- const SymmetricTensor<rank_, dim, OtherNumber> &t)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number> &
+ SymmetricTensor<rank_, dim, Number>::operator=(
+ const SymmetricTensor<rank_, dim, OtherNumber> &t)
{
data = t.data;
return *this;
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number> &
-SymmetricTensor<rank_, dim, Number>::operator=(const Number &d)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number> &
+ SymmetricTensor<rank_, dim, Number>::operator=(const Number &d)
{
Assert(numbers::value_is_zero(d),
ExcMessage("Only assignment with zero is allowed"));
template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
SymmetricTensor<rank_, dim, Number>::operator Tensor<rank_, dim, Number>()
const
{
template <int rank_, int dim, typename Number>
-constexpr bool
+DEAL_II_CONSTEXPR_FUNCTION bool
SymmetricTensor<rank_, dim, Number>::operator==(
const SymmetricTensor<rank_, dim, Number> &t) const
{
template <int rank_, int dim, typename Number>
-constexpr bool
+DEAL_II_CONSTEXPR_FUNCTION bool
SymmetricTensor<rank_, dim, Number>::operator!=(
const SymmetricTensor<rank_, dim, Number> &t) const
{
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number> &
-SymmetricTensor<rank_, dim, Number>::operator+=(
- const SymmetricTensor<rank_, dim, OtherNumber> &t)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number> &
+ SymmetricTensor<rank_, dim, Number>::operator+=(
+ const SymmetricTensor<rank_, dim, OtherNumber> &t)
{
data += t.data;
return *this;
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number> &
-SymmetricTensor<rank_, dim, Number>::operator-=(
- const SymmetricTensor<rank_, dim, OtherNumber> &t)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number> &
+ SymmetricTensor<rank_, dim, Number>::operator-=(
+ const SymmetricTensor<rank_, dim, OtherNumber> &t)
{
data -= t.data;
return *this;
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number> &
-SymmetricTensor<rank_, dim, Number>::operator*=(const OtherNumber &d)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number> &
+ SymmetricTensor<rank_, dim, Number>::operator*=(const OtherNumber &d)
{
data *= d;
return *this;
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number> &
-SymmetricTensor<rank_, dim, Number>::operator/=(const OtherNumber &d)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number> &
+ SymmetricTensor<rank_, dim, Number>::operator/=(const OtherNumber &d)
{
data /= d;
return *this;
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number>
-SymmetricTensor<rank_, dim, Number>::operator-() const
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number>
+ SymmetricTensor<rank_, dim, Number>::operator-() const
{
SymmetricTensor tmp = *this;
tmp.data = -tmp.data;
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE void
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE void
SymmetricTensor<rank_, dim, Number>::clear()
{
data.clear();
template <int rank_, int dim, typename Number>
-constexpr std::size_t
+DEAL_II_CONSTEXPR_FUNCTION std::size_t
SymmetricTensor<rank_, dim, Number>::memory_consumption()
{
// all memory consists of statically allocated memory of the current
namespace internal
{
template <int dim, typename Number, typename OtherNumber = Number>
- DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename SymmetricTensorAccessors::
double_contraction_result<2, 2, dim, Number, OtherNumber>::type
perform_double_contraction(
template <int dim, typename Number, typename OtherNumber = Number>
- DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename SymmetricTensorAccessors::
double_contraction_result<4, 2, dim, Number, OtherNumber>::type
perform_double_contraction(
template <int dim, typename Number, typename OtherNumber = Number>
- DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename SymmetricTensorAccessors::StorageType<
2,
dim,
template <int dim, typename Number, typename OtherNumber = Number>
- DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE
+ DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename SymmetricTensorAccessors::StorageType<
4,
dim,
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename internal::SymmetricTensorAccessors::
double_contraction_result<rank_, 2, dim, Number, OtherNumber>::type
SymmetricTensor<rank_, dim, Number>::operator*(
template <int rank_, int dim, typename Number>
template <typename OtherNumber>
-DEAL_II_CONSTEXPR inline typename internal::SymmetricTensorAccessors::
+DEAL_II_CONSTEXPR_FUNCTION inline typename internal::SymmetricTensorAccessors::
double_contraction_result<rank_, 4, dim, Number, OtherNumber>::type
SymmetricTensor<rank_, dim, Number>::operator*(
const SymmetricTensor<4, dim, OtherNumber> &s) const
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE Number &
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE Number &
SymmetricTensor<rank_, dim, Number>::operator()(
const TableIndices<rank_> &indices)
{
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE const Number &
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE const Number &
SymmetricTensor<rank_, dim, Number>::operator()(
const TableIndices<rank_> &indices) const
{
template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE internal::SymmetricTensorAccessors::
- Accessor<rank_, dim, true, rank_ - 1, Number>
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE internal::
+ SymmetricTensorAccessors::Accessor<rank_, dim, true, rank_ - 1, Number>
SymmetricTensor<rank_, dim, Number>::operator[](const unsigned int row) const
{
return internal::SymmetricTensorAccessors::
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE internal::SymmetricTensorAccessors::
- Accessor<rank_, dim, false, rank_ - 1, Number>
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE internal::
+ SymmetricTensorAccessors::Accessor<rank_, dim, false, rank_ - 1, Number>
SymmetricTensor<rank_, dim, Number>::operator[](const unsigned int row)
{
return internal::SymmetricTensorAccessors::
template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE const Number &
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE const Number &
SymmetricTensor<rank_, dim, Number>::operator[](
const TableIndices<rank_> &indices) const
{
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE Number &
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE Number &
SymmetricTensor<rank_, dim, Number>::operator[](
const TableIndices<rank_> &indices)
{
template <int rank_, int dim, typename Number>
-constexpr inline const Number &
+DEAL_II_CONSTEXPR_FUNCTION inline const Number &
SymmetricTensor<rank_, dim, Number>::access_raw_entry(
const unsigned int index) const
{
template <int rank_, int dim, typename Number>
-constexpr inline Number &
+DEAL_II_CONSTEXPR_FUNCTION inline Number &
SymmetricTensor<rank_, dim, Number>::access_raw_entry(const unsigned int index)
{
AssertIndexRange(index, n_independent_components);
template <int rank_, int dim, typename Number>
-constexpr typename numbers::NumberTraits<Number>::real_type
+DEAL_II_CONSTEXPR_FUNCTION typename numbers::NumberTraits<Number>::real_type
SymmetricTensor<rank_, dim, Number>::norm() const
{
return internal::compute_norm<dim, Number>(data);
template <int rank_, int dim, typename Number>
-constexpr unsigned int
+DEAL_II_CONSTEXPR_FUNCTION unsigned int
SymmetricTensor<rank_, dim, Number>::component_to_unrolled_index(
const TableIndices<rank_> &indices)
{
} // namespace internal
template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE TableIndices<rank_>
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE TableIndices<rank_>
SymmetricTensor<rank_, dim, Number>::unrolled_to_component_indices(
const unsigned int i)
{
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
SymmetricTensor<rank_, dim, typename ProductType<Number, OtherNumber>::type>
operator+(const SymmetricTensor<rank_, dim, Number> & left,
const SymmetricTensor<rank_, dim, OtherNumber> &right)
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
SymmetricTensor<rank_, dim, typename ProductType<Number, OtherNumber>::type>
operator-(const SymmetricTensor<rank_, dim, Number> & left,
const SymmetricTensor<rank_, dim, OtherNumber> &right)
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Tensor<rank_, dim, typename ProductType<Number, OtherNumber>::type>
operator+(const SymmetricTensor<rank_, dim, Number> &left,
const Tensor<rank_, dim, OtherNumber> & right)
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Tensor<rank_, dim, typename ProductType<Number, OtherNumber>::type>
operator+(const Tensor<rank_, dim, Number> & left,
const SymmetricTensor<rank_, dim, OtherNumber> &right)
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Tensor<rank_, dim, typename ProductType<Number, OtherNumber>::type>
operator-(const SymmetricTensor<rank_, dim, Number> &left,
const Tensor<rank_, dim, OtherNumber> & right)
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
Tensor<rank_, dim, typename ProductType<Number, OtherNumber>::type>
operator-(const Tensor<rank_, dim, Number> & left,
const SymmetricTensor<rank_, dim, OtherNumber> &right)
template <int dim, typename Number>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE Number
determinant(const SymmetricTensor<2, dim, Number> &t)
{
switch (dim)
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-DEAL_II_CONSTEXPR DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE Number
third_invariant(const SymmetricTensor<2, dim, Number> &t)
{
return determinant(t);
template <int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE Number
trace(const SymmetricTensor<2, dim, Number> &d)
{
Number t = d.data[0];
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-constexpr Number
+DEAL_II_CONSTEXPR_FUNCTION Number
first_invariant(const SymmetricTensor<2, dim, Number> &t)
{
return trace(t);
* @relatesalso SymmetricTensor
*/
template <typename Number>
-constexpr DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE Number
second_invariant(const SymmetricTensor<2, 1, Number> &)
{
return internal::NumberType<Number>::value(0.0);
* @relatesalso SymmetricTensor
*/
template <typename Number>
-constexpr DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE Number
second_invariant(const SymmetricTensor<2, 2, Number> &t)
{
return t[0][0] * t[1][1] - t[0][1] * t[0][1];
* @relatesalso SymmetricTensor
*/
template <typename Number>
-constexpr DEAL_II_ALWAYS_INLINE Number
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE Number
second_invariant(const SymmetricTensor<2, 3, Number> &t)
{
return (t[0][0] * t[1][1] + t[1][1] * t[2][2] + t[2][2] * t[0][0] -
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number>
-transpose(const SymmetricTensor<rank_, dim, Number> &t)
+DEAL_II_CONSTEXPR_FUNCTION
+ DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number>
+ transpose(const SymmetricTensor<rank_, dim, Number> &t)
{
return t;
}
template <int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
-deviator(const SymmetricTensor<2, dim, Number> &t)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<2, dim, Number>
+ deviator(const SymmetricTensor<2, dim, Number> &t)
{
SymmetricTensor<2, dim, Number> tmp = t;
template <int dim, typename Number>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
- unit_symmetric_tensor()
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<2, dim, Number>
+ unit_symmetric_tensor()
{
// create a default constructed matrix filled with
// zeros, then set the diagonal elements to one
template <int dim, typename Number>
-DEAL_II_CONSTEXPR inline SymmetricTensor<4, dim, Number>
+DEAL_II_CONSTEXPR_FUNCTION inline SymmetricTensor<4, dim, Number>
deviator_tensor()
{
SymmetricTensor<4, dim, Number> tmp;
template <int dim, typename Number>
-DEAL_II_CONSTEXPR inline DEAL_II_ALWAYS_INLINE SymmetricTensor<4, dim, Number>
- identity_tensor()
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<4, dim, Number>
+ identity_tensor()
{
SymmetricTensor<4, dim, Number> tmp;
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
- invert(const SymmetricTensor<2, dim, Number> &t)
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
+invert(const SymmetricTensor<2, dim, Number> &t)
{
return internal::SymmetricTensorImplementation::Inverse<2, dim, Number>::
value(t);
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-constexpr SymmetricTensor<4, dim, Number>
-invert(const SymmetricTensor<4, dim, Number> &t)
+DEAL_II_CONSTEXPR_FUNCTION SymmetricTensor<4, dim, Number>
+ invert(const SymmetricTensor<4, dim, Number> &t)
{
return internal::SymmetricTensorImplementation::Inverse<4, dim, Number>::
value(t);
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-constexpr inline SymmetricTensor<4, dim, Number>
+DEAL_II_CONSTEXPR_FUNCTION inline SymmetricTensor<4, dim, Number>
outer_product(const SymmetricTensor<2, dim, Number> &t1,
const SymmetricTensor<2, dim, Number> &t2)
{
* @relatesalso SymmetricTensor
*/
template <int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<2, dim, Number>
-symmetrize(const Tensor<2, dim, Number> &t)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<2, dim, Number>
+ symmetrize(const Tensor<2, dim, Number> &t)
{
SymmetricTensor<2, dim, Number> result;
for (unsigned int d = 0; d < dim; ++d)
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number>
-operator*(const SymmetricTensor<rank_, dim, Number> &t, const Number &factor)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim, Number>
+ operator*(const SymmetricTensor<rank_, dim, Number> &t, const Number &factor)
{
SymmetricTensor<rank_, dim, Number> tt = t;
tt *= factor;
* @relatesalso SymmetricTensor
*/
template <int rank_, int dim, typename Number>
-constexpr DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number>
-operator*(const Number &factor, const SymmetricTensor<rank_, dim, Number> &t)
+DEAL_II_CONSTEXPR_FUNCTION
+ DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim, Number>
+ operator*(const Number &factor, const SymmetricTensor<rank_, dim, Number> &t)
{
// simply forward to the other operator
return t * factor;
* @relates SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE SymmetricTensor<
rank_,
dim,
typename ProductType<Number,
* @relates SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE SymmetricTensor<
rank_,
dim,
typename ProductType<OtherNumber,
* @relates SymmetricTensor
*/
template <int rank_, int dim, typename Number, typename OtherNumber>
-constexpr inline SymmetricTensor<
+DEAL_II_CONSTEXPR_FUNCTION inline SymmetricTensor<
rank_,
dim,
typename ProductType<Number,
* @relates SymmetricTensor
*/
template <int rank_, int dim>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim>
-operator*(const SymmetricTensor<rank_, dim> &t, const double factor)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim>
+ operator*(const SymmetricTensor<rank_, dim> &t, const double factor)
{
SymmetricTensor<rank_, dim> tt(t);
tt *= factor;
* @relates SymmetricTensor
*/
template <int rank_, int dim>
-constexpr inline DEAL_II_ALWAYS_INLINE SymmetricTensor<rank_, dim>
-operator*(const double factor, const SymmetricTensor<rank_, dim> &t)
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
+ SymmetricTensor<rank_, dim>
+ operator*(const double factor, const SymmetricTensor<rank_, dim> &t)
{
SymmetricTensor<rank_, dim> tt(t);
tt *= factor;
* @relates SymmetricTensor
*/
template <int rank_, int dim>
-constexpr inline SymmetricTensor<rank_, dim>
+DEAL_II_CONSTEXPR_FUNCTION inline SymmetricTensor<rank_, dim>
operator/(const SymmetricTensor<rank_, dim> &t, const double factor)
{
SymmetricTensor<rank_, dim> tt(t);
* @relates SymmetricTensor
*/
template <int dim, typename Number, typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE typename ProductType<Number, OtherNumber>::type
-scalar_product(const SymmetricTensor<2, dim, Number> & t1,
- const SymmetricTensor<2, dim, OtherNumber> &t2)
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
+ typename ProductType<Number, OtherNumber>::type
+ scalar_product(const SymmetricTensor<2, dim, Number> & t1,
+ const SymmetricTensor<2, dim, OtherNumber> &t2)
{
return (t1 * t2);
}
* @relates SymmetricTensor
*/
template <int dim, typename Number, typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE
typename ProductType<Number, OtherNumber>::type
scalar_product(const SymmetricTensor<2, dim, Number> &t1,
const Tensor<2, dim, OtherNumber> & t2)
* @relates SymmetricTensor
*/
template <int dim, typename Number, typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE typename ProductType<Number, OtherNumber>::type
-scalar_product(const Tensor<2, dim, Number> & t1,
- const SymmetricTensor<2, dim, OtherNumber> &t2)
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
+ typename ProductType<Number, OtherNumber>::type
+ scalar_product(const Tensor<2, dim, Number> & t1,
+ const SymmetricTensor<2, dim, OtherNumber> &t2)
{
return scalar_product(t2, t1);
}
* @relates SymmetricTensor
*/
template <typename Number, typename OtherNumber>
-constexpr inline DEAL_II_ALWAYS_INLINE void
+DEAL_II_CONSTEXPR_FUNCTION inline DEAL_II_ALWAYS_INLINE void
double_contract(
SymmetricTensor<2, 1, typename ProductType<Number, OtherNumber>::type> &tmp,
const SymmetricTensor<4, 1, Number> & t,
* @relates SymmetricTensor
*/
template <typename Number, typename OtherNumber>
-constexpr inline void
+DEAL_II_CONSTEXPR_FUNCTION inline void
double_contract(
SymmetricTensor<2, 1, typename ProductType<Number, OtherNumber>::type> &tmp,
const SymmetricTensor<2, 1, Number> & s,
* @relates SymmetricTensor
*/
template <typename Number, typename OtherNumber>
-constexpr inline void
+DEAL_II_CONSTEXPR_FUNCTION inline void
double_contract(
SymmetricTensor<2, 2, typename ProductType<Number, OtherNumber>::type> &tmp,
const SymmetricTensor<4, 2, Number> & t,
* @relates SymmetricTensor
*/
template <typename Number, typename OtherNumber>
-constexpr inline void
+DEAL_II_CONSTEXPR_FUNCTION inline void
double_contract(
SymmetricTensor<2, 2, typename ProductType<Number, OtherNumber>::type> &tmp,
const SymmetricTensor<2, 2, Number> & s,
* @relates SymmetricTensor
*/
template <typename Number, typename OtherNumber>
-constexpr inline void
+DEAL_II_CONSTEXPR_FUNCTION inline void
double_contract(
SymmetricTensor<2, 3, typename ProductType<Number, OtherNumber>::type> &tmp,
const SymmetricTensor<4, 3, Number> & t,
* @relates SymmetricTensor
*/
template <typename Number, typename OtherNumber>
-constexpr inline void
+DEAL_II_CONSTEXPR_FUNCTION inline void
double_contract(
SymmetricTensor<2, 3, typename ProductType<Number, OtherNumber>::type> &tmp,
const SymmetricTensor<2, 3, Number> & s,
* @relates SymmetricTensor
*/
template <int dim, typename Number, typename OtherNumber>
-constexpr Tensor<1, dim, typename ProductType<Number, OtherNumber>::type>
-operator*(const SymmetricTensor<2, dim, Number> &src1,
- const Tensor<1, dim, OtherNumber> & src2)
+DEAL_II_CONSTEXPR_FUNCTION
+ Tensor<1, dim, typename ProductType<Number, OtherNumber>::type>
+ operator*(const SymmetricTensor<2, dim, Number> &src1,
+ const Tensor<1, dim, OtherNumber> & src2)
{
Tensor<1, dim, typename ProductType<Number, OtherNumber>::type> dest;
for (unsigned int i = 0; i < dim; ++i)
* @relates SymmetricTensor
*/
template <int dim, typename Number, typename OtherNumber>
-constexpr Tensor<1, dim, typename ProductType<Number, OtherNumber>::type>
-operator*(const Tensor<1, dim, Number> & src1,
- const SymmetricTensor<2, dim, OtherNumber> &src2)
+DEAL_II_CONSTEXPR_FUNCTION
+ Tensor<1, dim, typename ProductType<Number, OtherNumber>::type>
+ operator*(const Tensor<1, dim, Number> & src1,
+ const SymmetricTensor<2, dim, OtherNumber> &src2)
{
// this is easy for symmetric tensors:
return src2 * src1;
int dim,
typename Number,
typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
typename Tensor<rank_1 + rank_2 - 2,
dim,
typename ProductType<Number, OtherNumber>::type>::tensor_type
int dim,
typename Number,
typename OtherNumber>
-constexpr DEAL_II_ALWAYS_INLINE
+DEAL_II_CONSTEXPR_FUNCTION DEAL_II_ALWAYS_INLINE
typename Tensor<rank_1 + rank_2 - 2,
dim,
typename ProductType<Number, OtherNumber>::type>::tensor_type