17 #ifndef __deal2__tensor_base_h
18 #define __deal2__tensor_base_h
27 #include <deal.II/base/config.h>
29 #include <deal.II/base/table_indices.h>
35 DEAL_II_NAMESPACE_OPEN
37 template <
typename number>
class Vector;
44 template <
int dim,
typename Number=
double>
class Point;
48 template <
int rank_,
int dim,
typename Number=
double>
class Tensor;
49 template <
int dim,
typename Number>
class Tensor<0,dim,Number>;
50 template <
int dim,
typename Number>
class Tensor<1,dim,Number>;
69 template <
int dim,
typename Number>
96 static const unsigned int rank = 0;
143 operator Number ()
const;
288 <<
"dim must be positive, but was " << arg1);
294 template <
class Archive>
295 void serialize(Archive &ar,
const unsigned int version);
328 template <
int dim,
typename Number>
355 static const unsigned int rank = 1;
361 static const unsigned int
405 explicit Tensor (
const bool initialize =
true);
429 Number
operator [] (
const unsigned int index)
const;
591 template <
typename Number2>
639 <<
"dim must be positive, but was " << arg1);
645 template <
class Archive>
646 void serialize(Archive &ar,
const unsigned int version);
658 Number values[(dim!=0) ? (dim) : (dim+1)];
671 template <
typename Number2>
673 unsigned int &start_index)
const;
689 template <
int otherrank,
int otherdim,
typename OtherNumber>
friend class ::Tensor;
703 template <
int dim,
typename Number>
704 std::ostream &operator << (std::ostream &out, const Tensor<0,dim,Number> &p);
710 template <
int dim,
typename Number>
711 std::ostream &operator << (std::ostream &out, const Tensor<1,dim,Number> &p);
718 template <
int dim,
typename Number>
722 Assert (dim>0, ExcDimTooSmall(dim));
729 template <
int dim,
typename Number>
733 Assert (dim>0, ExcDimTooSmall(dim));
740 template <
int dim,
typename Number>
744 Assert (dim>0, ExcDimTooSmall(dim));
752 template <
int dim,
typename Number>
761 template <
int dim,
typename Number>
770 template <
int dim,
typename Number>
780 template <
int dim,
typename Number>
790 template <
int dim,
typename Number>
794 return (value == p.
value);
799 template <
int dim,
typename Number>
803 return !((*this) == p);
808 template <
int dim,
typename Number>
818 template <
int dim,
typename Number>
828 template <
int dim,
typename Number>
838 template <
int dim,
typename Number>
848 template <
int dim,
typename Number>
852 return value*p.
value;
857 template <
int dim,
typename Number>
861 return value+p.
value;
866 template <
int dim,
typename Number>
870 return value-p.
value;
875 template <
int dim,
typename Number>
884 template <
int dim,
typename Number>
894 template <
int dim,
typename Number>
904 template <
int dim,
typename Number>
913 template <
int dim,
typename Number>
914 template <
class Archive>
924 template <
int dim,
typename Number>
934 for (
unsigned int i=0; i!=dim; ++i)
940 template <
int dim,
typename Number>
944 Assert (dim>0, ExcDimTooSmall(dim));
946 for (
unsigned int i=0; i<dim; ++i)
947 values[i] = initializer[i];
952 template <
int dim,
typename Number>
956 Assert (dim>0, ExcDimTooSmall(dim));
958 for (
unsigned int i=0; i<dim; ++i)
982 template <
int dim,
typename Number>
992 template <
int dim,
typename Number>
1000 template <
int dim,
typename Number>
1005 return values[indices[0]];
1008 template <
int dim,
typename Number>
1013 return values[indices[0]];
1037 template <
int dim,
typename Number>
1042 for (
unsigned int i=0; i<dim; ++i)
1050 template <
int dim,
typename Number>
1054 Assert (d==Number(0),
ExcMessage (
"Only assignment with zero is allowed"));
1057 for (
unsigned int i=0; i<dim; ++i)
1065 template <
int dim,
typename Number>
1069 for (
unsigned int i=0; i<dim; ++i)
1086 template <
int dim,
typename Number>
1090 return !((*this) == p);
1095 template <
int dim,
typename Number>
1099 for (
unsigned int i=0; i<dim; ++i)
1106 template <
int dim,
typename Number>
1110 for (
unsigned int i=0; i<dim; ++i)
1117 template <
int dim,
typename Number>
1121 for (
unsigned int i=0; i<dim; ++i)
1128 template <
int dim,
typename Number>
1132 for (
unsigned int i=0; i<dim; ++i)
1139 template <
int dim,
typename Number>
1165 for (
unsigned int i=1; i<dim; ++i)
1173 template <
int dim,
typename Number>
1182 template <
int dim,
typename Number>
1191 template <
int dim,
typename Number>
1196 for (
unsigned int i=0; i<dim; ++i)
1197 result.values[i] = -
values[i];
1203 template <
int dim,
typename Number>
1213 template <
int dim,
typename Number>
1219 for (
unsigned int i=1; i<dim; ++i)
1227 template <
int dim,
typename Number>
1228 template <
typename Number2>
1236 unsigned int index = 0;
1242 template<
int dim,
typename Number>
1243 template <
typename Number2>
1247 unsigned int &index)
const
1249 for (
unsigned int i=0; i<dim; ++i)
1254 template <
int dim,
typename Number>
1262 template <
int dim,
typename Number>
1272 template <
int dim,
typename Number>
1276 for (
unsigned int i=0; i<dim; ++i)
1282 template <
int dim,
typename Number>
1291 template <
int dim,
typename Number>
1292 template <
class Archive>
1307 template <
int dim,
typename Number>
1309 std::ostream &operator << (std::ostream &out, const Tensor<0,dim,Number> &p)
1311 out << static_cast<Number>(p);
1323 template <
int dim,
typename Number>
1325 std::ostream &operator << (std::ostream &out, const Tensor<1,dim,Number> &p)
1327 for (
unsigned int i=0; i<dim-1; ++i)
1344 std::ostream &operator << (std::ostream &out, const Tensor<1,1,double> &p)
1358 template <
int dim,
typename Number>
1362 const Number factor)
1365 for (
unsigned int d=0; d<dim; ++d)
1366 tt[d] = t[d] * factor;
1377 template <
int dim,
typename Number>
1384 for (
unsigned int d=0; d<dim; ++d)
1385 tt[d] = t[d] * factor;
1396 template <
int dim,
typename Number>
1400 const Number factor)
1403 for (
unsigned int d=0; d<dim; ++d)
1404 tt[d] = t[d] / factor;
1419 const double factor)
1422 for (
unsigned int d=0; d<dim; ++d)
1423 tt[d] = t[d] * factor;
1441 for (
unsigned int d=0; d<dim; ++d)
1442 tt[d] = t[d] * factor;
1457 const double factor)
1460 for (
unsigned int d=0; d<dim; ++d)
1461 tt[d] = t[d] / factor;
1466 DEAL_II_NAMESPACE_CLOSE
VectorizedArray< Number > operator/(const VectorizedArray< Number > &u, const VectorizedArray< Number > &v)
numbers::NumberTraits< Number >::real_type real_type
numbers::NumberTraits< Number >::real_type real_type
Tensor< rank_, dim, Number > operator-() const
VectorizedArray< Number > operator*(const VectorizedArray< Number > &u, const VectorizedArray< Number > &v)
Number array_type[(dim!=0)?dim:100000000]
static TableIndices< rank_ > unrolled_to_component_indices(const unsigned int i)
static const unsigned int n_independent_components
Tensor< 1, dim, Number > operator*(const Tensor< 1, dim, Number > &t, const Number factor)
::ExceptionBase & ExcMessage(std::string arg1)
real_type norm_square() const
static const unsigned int rank
static real_type abs(const number &x)
Tensor< rank_, dim, Number > & operator-=(const Tensor< rank_, dim, Number > &)
Tensor< rank_-1, dim, Number > & operator[](const unsigned int i)
Number values[(dim!=0)?(dim):(dim+1)]
bool operator!=(const Tensor< rank_, dim, Number > &) const
numbers::NumberTraits< Number >::real_type real_type
static real_type abs_square(const number &x)
#define Assert(cond, exc)
Tensor< rank_-1, dim, Number >::array_type array_type[dim]
static std::size_t memory_consumption()
void serialize(Archive &ar, const unsigned int version)
::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
Tensor< rank_, dim, Number > operator+(const Tensor< rank_, dim, Number > &) const
void unroll_recursion(Vector< Number2 > &result, unsigned int &start_index) const
DeclException1(ExcInvalidTensorIndex, int,<< "Invalid tensor index "<< arg1)
bool operator==(const Tensor< rank_, dim, Number > &) const
static const unsigned int dimension
Tensor< rank_, dim, Number > & operator/=(const Number factor)
::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
Tensor< rank_, dim, Number > & operator+=(const Tensor< rank_, dim, Number > &)
static unsigned int component_to_unrolled_index(const TableIndices< rank_ > &indices)
Tensor< rank_, dim, Number > & operator*=(const Number factor)
void unroll(Vector< Number2 > &result) const
Tensor & operator=(const Tensor< rank_, dim, Number > &)