17 #ifndef __deal2__tensor_h
18 #define __deal2__tensor_h
21 #include <deal.II/base/config.h>
22 #include <deal.II/base/tensor_base.h>
23 #include <deal.II/base/utilities.h>
26 template <
int rank_,
int dim,
typename Number>
class Tensor;
27 template <
int dim,
typename Number>
class Tensor<1,dim,Number>;
50 template <
int rank_,
int dim,
typename Number>
77 static const unsigned int rank = rank_;
84 static const unsigned int
127 Tensor (
const array_type &initializer);
139 operator Tensor<1,dim,
Tensor<rank_-1,dim,Number> > ()
const;
240 real_type
norm ()
const;
265 template <
typename Number2>
319 <<
"Invalid tensor index " << arg1);
325 template <
class Archive>
326 void serialize(Archive &ar,
const unsigned int version);
338 template <
typename Number2>
340 unsigned int &start_index)
const;
352 template <
int,
int,
typename>
friend class Tensor;
360 template <
int rank_,
int dim,
typename Number>
371 template <
int rank_,
int dim,
typename Number>
375 for (
unsigned int i=0; i<dim; ++i)
381 template <
int rank_,
int dim,
typename Number>
386 for (
unsigned int i=0; i<dim; ++i)
392 template <
int rank_,
int dim,
typename Number>
395 Tensor<1,dim,Tensor<rank_-1,dim,Number> > ()
const
397 return Tensor<1,dim,Tensor<rank_-1,dim,Number> > (
subtensor);
402 template <
int rank_,
int dim,
typename Number>
413 template <
int rank_,
int dim,
typename Number>
423 template <
int rank_,
int dim,
typename Number>
428 const unsigned int inner_ind = indices[0];
432 for (
unsigned int i = 0; i < rank_-1; i++)
433 indices1[i] = indices[i+1];
437 template <
int rank_,
int dim,
typename Number>
442 const unsigned int inner_ind = indices[0];
446 for (
unsigned int i = 0; i < rank_-1; i++)
447 indices1[i] = indices[i+1];
451 template <
int rank_,
int dim,
typename Number>
456 for (
unsigned int i=0; i<dim; ++i)
463 template <
int rank_,
int dim,
typename Number>
471 for (
unsigned int i=0; i<dim; ++i)
478 template <
int rank_,
int dim,
typename Number>
483 for (
unsigned int i=0; i<dim; ++i)
490 template <
int rank_,
int dim,
typename Number>
495 return !((*this) == p);
500 template <
int rank_,
int dim,
typename Number>
505 for (
unsigned int i=0; i<dim; ++i)
512 template <
int rank_,
int dim,
typename Number>
517 for (
unsigned int i=0; i<dim; ++i)
524 template <
int rank_,
int dim,
typename Number>
529 for (
unsigned int i=0; i<dim; ++i)
536 template <
int rank_,
int dim,
typename Number>
541 for (
unsigned int i=0; i<dim; ++i)
548 template <
int rank_,
int dim,
typename Number>
555 for (
unsigned int i=0; i<dim; ++i)
563 template <
int rank_,
int dim,
typename Number>
570 for (
unsigned int i=0; i<dim; ++i)
578 template <
int rank_,
int dim,
typename Number>
585 for (
unsigned int i=0; i<dim; ++i)
593 template <
int rank_,
int dim,
typename Number>
603 template <
int rank_,
int dim,
typename Number>
609 for (
unsigned int i=0; i<dim; ++i)
617 template <
int rank_,
int dim,
typename Number>
618 template <
typename Number2>
625 unsigned int index = 0;
631 template <
int rank_,
int dim,
typename Number>
632 template <
typename Number2>
636 unsigned int &index)
const
638 for (
unsigned int i=0; i<dim; ++i)
640 operator[](i).unroll_recursion(result, index);
644 template <
int rank_,
int dim,
typename Number>
650 for (
unsigned int i = 0; i < rank_-1; i++)
651 indices1[i] = indices[i];
653 Assert (indices[rank_-1] < dim,
658 template <
int rank_,
int dim,
typename Number>
668 unsigned int remainder = i;
669 for (
int r=rank_-1; r>=0; --r)
671 indices[r] = (remainder % dim);
681 template <
int rank_,
int dim,
typename Number>
685 for (
unsigned int i=0; i<dim; ++i)
691 template <
int rank_,
int dim,
typename Number>
701 template <
int rank_,
int dim,
typename Number>
702 template <
class Archive>
722 template <
int rank_,
int dim,
typename Number>
724 std::ostream &operator << (std::ostream &out, const Tensor<rank_,dim,Number> &p)
726 for (
unsigned int i=0; i<dim-1; ++i)
740 std::ostream &operator << (std::ostream &out, const Tensor<rank_,1> &p)
757 template <
int dim,
typename Number>
763 for (
unsigned int i=0; i<dim; ++i)
764 res += src1[i] * src2[i];
786 template <
int dim,
typename Number>
803 template <
int dim,
typename Number>
809 for (
unsigned int i=0; i<dim; ++i)
823 template <
int dim,
typename Number>
829 for (
unsigned int i=0; i<dim; ++i)
831 dest[i] = src1[i][0] * src2[0];
832 for (
unsigned int j=1; j<dim; ++j)
833 dest[i] += src1[i][j] * src2[j];
854 template <
int dim,
typename Number>
860 for (
unsigned int i=0; i<dim; ++i)
862 dest[i] = src1[i][0] * src2[0];
863 for (
unsigned int j=1; j<dim; ++j)
864 dest[i] += src1[i][j] * src2[j];
877 template <
int dim,
typename Number>
883 for (
unsigned int i=0; i<dim; ++i)
885 dest[i] = src1[0] * src2[0][i];
886 for (
unsigned int j=1; j<dim; ++j)
887 dest[i] += src1[j] * src2[j][i];
908 template <
int dim,
typename Number>
915 for (
unsigned int i=0; i<dim; ++i)
917 dest[i] = src1[0] * src2[0][i];
918 for (
unsigned int j=1; j<dim; ++j)
919 dest[i] += src1[j] * src2[j][i];
932 template <
int dim,
typename Number>
938 for (
unsigned int i=0; i<dim; ++i)
939 for (
unsigned int j=0; j<dim; ++j)
941 dest[i][j] = src1[i][0] * src2[0][j];
942 for (
unsigned int k=1; k<dim; ++k)
943 dest[i][j] += src1[i][k] * src2[k][j];
965 template <
int dim,
typename Number>
972 for (
unsigned int i=0; i<dim; ++i)
973 for (
unsigned int j=0; j<dim; ++j)
974 for (
unsigned int k=0; k<dim; ++k)
975 dest[i][j] += src1[i][k] * src2[k][j];
994 template <
int dim,
typename Number>
1008 for (
unsigned int i=0; i<dim; ++i)
1009 for (
unsigned int j=0; j<dim; ++j)
1010 for (
unsigned int k=0; k<dim; ++k)
1011 dest[i][j] += src1[k][i] * src2[k][j];
1014 for (
unsigned int i=0; i<dim; ++i)
1015 for (
unsigned int j=0; j<dim; ++j)
1016 for (
unsigned int k=0; k<dim; ++k)
1017 dest[i][j] += src1[k][i] * src2[j][k];
1029 for (
unsigned int i=0; i<dim; ++i)
1030 for (
unsigned int j=0; j<dim; ++j)
1031 for (
unsigned int k=0; k<dim; ++k)
1032 dest[i][j] += src1[i][k] * src2[k][j];
1035 for (
unsigned int i=0; i<dim; ++i)
1036 for (
unsigned int j=0; j<dim; ++j)
1037 for (
unsigned int k=0; k<dim; ++k)
1038 dest[i][j] += src1[i][k] * src2[j][k];
1064 template <
int dim,
typename Number>
1075 for (
unsigned int i=0; i<dim; ++i)
1076 for (
unsigned int j=0; j<dim; ++j)
1077 for (
unsigned int k=0; k<dim; ++k)
1078 dest[i][j] += src1[k][i][j] * src2[k];
1082 for (
unsigned int i=0; i<dim; ++i)
1083 for (
unsigned int j=0; j<dim; ++j)
1084 for (
unsigned int k=0; k<dim; ++k)
1085 dest[i][j] += src1[i][k][j] * src2[k];
1089 for (
unsigned int i=0; i<dim; ++i)
1090 for (
unsigned int j=0; j<dim; ++j)
1091 for (
unsigned int k=0; k<dim; ++k)
1092 dest[i][j] += src1[i][j][k] * src2[k];
1109 template <
int dim,
typename Number>
1116 for (
unsigned int i=0; i<dim; ++i)
1117 for (
unsigned int j=0; j<dim; ++j)
1118 for (
unsigned int k=0; k<dim; ++k)
1119 for (
unsigned int l=0; l<dim; ++l)
1120 dest[i][j][k] += src1[i][j][l] * src2[l][k];
1137 template <
int dim,
typename Number>
1151 for (
unsigned int i=0; i<dim; ++i)
1152 for (
unsigned int j=0; j<dim; ++j)
1153 for (
unsigned int k=0; k<dim; ++k)
1154 for (
unsigned int l=0; l<dim; ++l)
1155 dest[i][j][k] += src1[l][i][j] * src2[l][k];
1158 for (
unsigned int i=0; i<dim; ++i)
1159 for (
unsigned int j=0; j<dim; ++j)
1160 for (
unsigned int k=0; k<dim; ++k)
1161 for (
unsigned int l=0; l<dim; ++l)
1162 dest[i][j][k] += src1[l][i][j] * src2[k][l];
1174 for (
unsigned int i=0; i<dim; ++i)
1175 for (
unsigned int j=0; j<dim; ++j)
1176 for (
unsigned int k=0; k<dim; ++k)
1177 for (
unsigned int l=0; l<dim; ++l)
1178 dest[i][j][k] += src1[i][l][j] * src2[l][k];
1181 for (
unsigned int i=0; i<dim; ++i)
1182 for (
unsigned int j=0; j<dim; ++j)
1183 for (
unsigned int k=0; k<dim; ++k)
1184 for (
unsigned int l=0; l<dim; ++l)
1185 dest[i][j][k] += src1[i][l][j] * src2[k][l];
1197 for (
unsigned int i=0; i<dim; ++i)
1198 for (
unsigned int j=0; j<dim; ++j)
1199 for (
unsigned int k=0; k<dim; ++k)
1200 for (
unsigned int l=0; l<dim; ++l)
1201 dest[i][j][k] += src1[i][j][l] * src2[l][k];
1204 for (
unsigned int i=0; i<dim; ++i)
1205 for (
unsigned int j=0; j<dim; ++j)
1206 for (
unsigned int k=0; k<dim; ++k)
1207 for (
unsigned int l=0; l<dim; ++l)
1208 dest[i][j][k] += src1[i][j][l] * src2[k][l];
1239 template <
int dim,
typename Number>
1246 for (
unsigned int i=0; i<dim; ++i)
1247 for (
unsigned int j=0; j<dim; ++j)
1248 for (
unsigned int k=0; k<dim; ++k)
1249 for (
unsigned int l=0; l<dim; ++l)
1250 dest[i][j][k] += src1[i][j][l] * src2[l][k];
1262 template <
int dim,
typename Number>
1269 for (
unsigned int i=0; i<dim; ++i)
1270 for (
unsigned int j=0; j<dim; ++j)
1271 for (
unsigned int k=0; k<dim; ++k)
1272 for (
unsigned int l=0; l<dim; ++l)
1273 dest[i][j][k] += src1[i][l] * src2[l][j][k];
1293 template <
int dim,
typename Number>
1300 for (
unsigned int i=0; i<dim; ++i)
1301 for (
unsigned int j=0; j<dim; ++j)
1302 for (
unsigned int k=0; k<dim; ++k)
1303 for (
unsigned int l=0; l<dim; ++l)
1304 dest[i][j][k] += src1[i][l] * src2[l][j][k];
1316 template <
int dim,
typename Number>
1323 for (
unsigned int i=0; i<dim; ++i)
1324 for (
unsigned int j=0; j<dim; ++j)
1325 for (
unsigned int k=0; k<dim; ++k)
1326 for (
unsigned int l=0; l<dim; ++l)
1327 for (
unsigned int m=0; m<dim; ++m)
1328 dest[i][j][k][l] += src1[i][j][m] * src2[m][k][l];
1341 template <
int dim,
typename Number>
1348 for (
unsigned int i=0; i<dim; ++i)
1349 for (
unsigned int j=0; j<dim; ++j)
1350 for (
unsigned int k=0; k<dim; ++k)
1351 for (
unsigned int l=0; l<dim; ++l)
1352 dest[i][j] += src1[i][j][k][l] * src2[k][l];
1363 template <
int dim,
typename Number>
1371 for (
unsigned int i=0; i<dim; ++i)
1372 for (
unsigned int j=0; j<dim; ++j)
1373 result += u[i] * A[i][j] * v[j];
1385 template <
int dim,
typename Number>
1393 for (
unsigned int i=0; i<dim; ++i)
1394 for (
unsigned int j=0; j<dim; ++j)
1395 for (
unsigned int k=0; k<dim; ++k)
1396 s += t1[i] * t2[i][j][k] * t3[j][k];
1408 template <
int dim,
typename Number>
1416 for (
unsigned int i=0; i<dim; ++i)
1417 for (
unsigned int j=0; j<dim; ++j)
1418 for (
unsigned int k=0; k<dim; ++k)
1419 s += t1[i][j] * t2[i][j][k] * t3[k];
1431 template <
int dim,
typename Number>
1439 for (
unsigned int i=0; i<dim; ++i)
1440 for (
unsigned int j=0; j<dim; ++j)
1441 for (
unsigned int k=0; k<dim; ++k)
1442 for (
unsigned int l=0; l<dim; ++l)
1443 s += t1[i][j] * t2[i][j][k][l] * t3[k][l];
1455 template <
int dim,
typename Number>
1460 for (
unsigned int i=0; i<dim; ++i)
1461 for (
unsigned int j=0; j<dim; ++j)
1462 dst[i][j] = src1[i] * src2[j];
1473 template <
int dim,
typename Number>
1478 for (
unsigned int i=0; i<dim; ++i)
1479 for (
unsigned int j=0; j<dim; ++j)
1480 for (
unsigned int k=0; k<dim; ++k)
1481 dst[i][j][k] = src1[i] * src2[j][k];
1492 template <
int dim,
typename Number>
1497 for (
unsigned int i=0; i<dim; ++i)
1498 for (
unsigned int j=0; j<dim; ++j)
1499 for (
unsigned int k=0; k<dim; ++k)
1500 dst[i][j][k] = src1[i][j] * src2[k];
1515 template <
int dim,
typename Number>
1520 for (
unsigned int i=0; i<dim; ++i)
1521 dst[i] = src1 * src2[i];
1537 template <
int dim,
typename Number>
1542 for (
unsigned int i=0; i<dim; ++i)
1543 dst[i] = src1[i] * src2;
1559 template <
int dim,
typename Number>
1582 template <
int dim,
typename Number>
1591 dst[0] = src1[1]*src2[2] - src1[2]*src2[1];
1592 dst[1] = src1[2]*src2[0] - src1[0]*src2[2];
1593 dst[2] = src1[0]*src2[1] - src1[1]*src2[0];
1607 template <
int dim,
typename Number>
1614 for (
unsigned int i=0; i<dim; ++i)
1615 for (
unsigned int j=0; j<dim; ++j)
1616 s += t1[i][j] * t2[i][j];
1629 template <
int rank,
typename Number>
1646 template <
typename Number>
1662 template <
typename Number>
1677 template <
typename Number>
1681 return ((t[0][0] * t[1][1]) - (t[1][0] * t[0][1]));
1691 template <
typename Number>
1700 const Number t4 = t[0][0]*t[1][1],
1701 t6 = t[0][0]*t[1][2],
1702 t8 = t[0][1]*t[1][0],
1703 t00 = t[0][2]*t[1][0],
1704 t01 = t[0][1]*t[2][0],
1705 t04 = t[0][2]*t[2][0],
1706 det = (t4*t[2][2]-t6*t[2][1]-t8*t[2][2]+
1707 t00*t[2][1]+t01*t[1][2]-t04*t[1][1]);
1719 template <
int dim,
typename Number>
1733 for (
unsigned int k=0; k<dim; ++k)
1735 Tensor<2,dim-1,Number> minor;
1736 for (
unsigned int i=0; i<dim-1; ++i)
1737 for (
unsigned int j=0; j<dim-1; ++j)
1738 minor[i][j] = t[i][j<k ? j : j+1];
1740 const Number cofactor = std::pow (-1., static_cast<Number>(k+1)) *
1743 det += t[dim-1][k] * cofactor;
1746 return std::pow (-1., static_cast<Number>(dim)) * det;
1758 template <
int dim,
typename Number>
1762 for (
unsigned int i=0; i<dim; ++i)
1778 template <
int dim,
typename Number>
1783 Number return_tensor [dim][dim];
1787 return_tensor[0][0] = 1.0/t[0][0];
1794 const Number det = t[0][0]*t[1][1]-t[1][0]*t[0][1];
1795 const Number t4 = 1.0/det;
1796 return_tensor[0][0] = t[1][1]*t4;
1797 return_tensor[0][1] = -t[0][1]*t4;
1798 return_tensor[1][0] = -t[1][0]*t4;
1799 return_tensor[1][1] = t[0][0]*t4;
1805 const Number t4 = t[0][0]*t[1][1],
1806 t6 = t[0][0]*t[1][2],
1807 t8 = t[0][1]*t[1][0],
1808 t00 = t[0][2]*t[1][0],
1809 t01 = t[0][1]*t[2][0],
1810 t04 = t[0][2]*t[2][0],
1811 det = (t4*t[2][2]-t6*t[2][1]-t8*t[2][2]+
1812 t00*t[2][1]+t01*t[1][2]-t04*t[1][1]),
1814 return_tensor[0][0] = (t[1][1]*t[2][2]-t[1][2]*t[2][1])*t07;
1815 return_tensor[0][1] = (t[0][2]*t[2][1]-t[0][1]*t[2][2])*t07;
1816 return_tensor[0][2] = (t[0][1]*t[1][2]-t[0][2]*t[1][1])*t07;
1817 return_tensor[1][0] = (t[1][2]*t[2][0]-t[1][0]*t[2][2])*t07;
1818 return_tensor[1][1] = (t[0][0]*t[2][2]-t04)*t07;
1819 return_tensor[1][2] = (t00-t6)*t07;
1820 return_tensor[2][0] = (t[1][0]*t[2][1]-t[1][1]*t[2][0])*t07;
1821 return_tensor[2][1] = (t01-t[0][0]*t[2][1])*t07;
1822 return_tensor[2][2] = (t4-t8)*t07;
1848 template <
int dim,
typename Number>
1853 Number tt[dim][dim];
1854 for (
unsigned int i=0; i<dim; ++i)
1857 for (
unsigned int j=i+1; j<dim; ++j)
1875 template <
typename Number>
1893 template <
typename Number>
1898 const Number x[2][2] = {{t[0][0], t[1][0]}, {t[0][1], t[1][1]}};
1912 template <
typename Number>
1917 const Number x[3][3] = {{t[0][0], t[1][0], t[2][0]},
1918 {t[0][1], t[1][1], t[2][1]},
1919 {t[0][2], t[1][2], t[2][2]}
1935 template <
int dim,
typename Number>
1941 for (
unsigned int j=0; j<dim; ++j)
1944 for (
unsigned int i=0; i<dim; ++i)
1945 sum += std::fabs(t[i][j]);
1964 template <
int dim,
typename Number>
1970 for (
unsigned int i=0; i<dim; ++i)
1973 for (
unsigned int j=0; j<dim; ++j)
1974 sum += std::fabs(t[i][j]);
1991 template <
int rank,
int dim,
typename Number>
1995 const Number factor)
2010 template <
int rank,
int dim,
typename Number>
2028 template <
int rank,
int dim,
typename Number>
2032 const Number factor)
2048 template <
int rank,
int dim>
2052 const double factor)
2067 template <
int rank,
int dim>
2085 template <
int rank,
int dim>
2089 const double factor)
2096 DEAL_II_NAMESPACE_CLOSE
VectorizedArray< Number > operator/(const VectorizedArray< Number > &u, const VectorizedArray< Number > &v)
double linfty_norm(const Tensor< 2, dim, Number > &t)
Number determinant(const Tensor< 2, 3, Number > &t)
void outer_product(Tensor< 1, dim, Number > &dst, const Number src1, const Tensor< 1, dim, Number > &src2)
Tensor< rank_, dim, Number > & operator/=(const Number factor)
Number scalar_product(const Tensor< 2, dim, Number > &t1, const Tensor< 2, dim, Number > &t2)
Number contract3(const Tensor< 1, dim, Number > &u, const Tensor< 2, dim, Number > &A, const Tensor< 1, dim, Number > &v)
#define AssertDimension(dim1, dim2)
VectorizedArray< Number > operator*(const VectorizedArray< Number > &u, const VectorizedArray< Number > &v)
Tensor< 2, dim, Number > transpose(const Tensor< 2, dim, Number > &t)
static const unsigned int dimension
Tensor< rank_, dim, Number > & operator*=(const Number factor)
Tensor< rank_, dim, Number > operator-() const
void outer_product(Tensor< 3, dim, Number > &dst, const Tensor< 2, dim, Number > &src1, const Tensor< 1, dim, Number > &src2)
Number contract3(const Tensor< 1, dim, Number > &t1, const Tensor< 3, dim, Number > &t2, const Tensor< 2, dim, Number > &t3)
::ExceptionBase & ExcMessage(std::string arg1)
Tensor< rank_-1, dim, Number > subtensor[dim]
Number contract(const Tensor< 1, dim, Number > &src1, const Tensor< 1, dim, Number > &src2)
Number trace(const Tensor< 2, dim, Number > &d)
#define AssertThrow(cond, exc)
static const unsigned int rank
void cross_product(Tensor< 1, dim, Number > &dst, const Tensor< 1, dim, Number > &src)
void outer_product(Tensor< 3, dim, Number > &dst, const Tensor< 1, dim, Number > &src1, const Tensor< 2, dim, Number > &src2)
Number contract3(const Tensor< 2, dim, Number > &t1, const Tensor< 3, dim, Number > &t2, const Tensor< 1, dim, Number > &t3)
Number determinant(const Tensor< 1, 1, Number > &t)
Number determinant(const Tensor< rank, 1, Number > &t)
void serialize(Archive &ar, const unsigned int version)
Tensor< rank_-1, dim, Number > value_type
Tensor< rank_, dim, Number > operator+(const Tensor< rank_, dim, Number > &) const
static unsigned int component_to_unrolled_index(const TableIndices< rank_ > &indices)
Number determinant(const Tensor< 2, 2, Number > &t)
void contract(Tensor< 2, dim, Number > &dest, const Tensor< 3, dim, Number > &src1, const unsigned int index1, const Tensor< 1, dim, Number > &src2)
Tensor< 2, dim, Number > invert(const Tensor< 2, dim, Number > &t)
Tensor< rank_-1, dim, Number >::array_type array_type[dim]
#define Assert(cond, exc)
Tensor< rank_-1, dim, Number > & operator[](const unsigned int i)
static std::size_t memory_consumption()
static TableIndices< rank_ > unrolled_to_component_indices(const unsigned int i)
Tensor & operator=(const Tensor< rank_, dim, Number > &)
bool operator!=(const Tensor< rank_, dim, Number > &) const
::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
bool operator==(const Tensor< rank_, dim, Number > &) const
double l1_norm(const Tensor< 2, dim, Number > &t)
void contract(Tensor< 2, dim, Number > &dest, const Tensor< 2, dim, Number > &src1, const Tensor< 2, dim, Number > &src2)
void outer_product(Tensor< 2, dim, Number > &dst, const Tensor< 1, dim, Number > &src1, const Tensor< 1, dim, Number > &src2)
Tensor< rank_, dim, Number > & operator+=(const Tensor< rank_, dim, Number > &)
Number contract3(const Tensor< 2, dim, Number > &t1, const Tensor< 4, dim, Number > &t2, const Tensor< 2, dim, Number > &t3)
void contract(Tensor< 3, dim, Number > &dest, const Tensor< 2, dim, Number > &src1, const Tensor< 3, dim, Number > &src2)
static const unsigned int n_independent_components
Number determinant(const Tensor< 2, 1, Number > &t)
void cross_product(Tensor< 1, dim, Number > &dst, const Tensor< 1, dim, Number > &src1, const Tensor< 1, dim, Number > &src2)
void outer_product(Tensor< 1, dim, Number > &dst, const Tensor< 1, dim, Number > src1, const Number src2)
void unroll(Vector< Number2 > &result) const
void double_contract(Tensor< 2, dim, Number > &dest, const Tensor< 4, dim, Number > &src1, const Tensor< 2, dim, Number > &src2)
void contract(Tensor< 3, dim, Number > &dest, const Tensor< 3, dim, Number > &src1, const unsigned int index1, const Tensor< 2, dim, Number > &src2, const unsigned int index2)
Tensor< rank_, dim, Number > & operator-=(const Tensor< rank_, dim, Number > &)
DeclException1(ExcInvalidTensorIndex, int,<< "Invalid tensor index "<< arg1)
Number determinant(const Tensor< 2, dim, Number > &t)
Number double_contract(const Tensor< 2, dim, Number > &src1, const Tensor< 2, dim, Number > &src2)
numbers::NumberTraits< Number >::real_type real_type
::ExceptionBase & ExcNotImplemented()
real_type norm_square() const
void contract(Tensor< 1, dim, Number > &dest, const Tensor< 2, dim, Number > &src1, const Tensor< 1, dim, Number > &src2)
void contract(Tensor< 1, dim, Number > &dest, const Tensor< 1, dim, Number > &src1, const Tensor< 2, dim, Number > &src2)
void contract(Tensor< 3, dim, Number > &dest, const Tensor< 3, dim, Number > &src1, const Tensor< 2, dim, Number > &src2)
::ExceptionBase & ExcInternalError()
VectorizedArray< Number > max(const ::VectorizedArray< Number > &x, const ::VectorizedArray< Number > &y)
void unroll_recursion(Vector< Number2 > &result, unsigned int &start_index) const
void contract(Tensor< 2, dim, Number > &dest, const Tensor< 2, dim, Number > &src1, const unsigned int index1, const Tensor< 2, dim, Number > &src2, const unsigned int index2)