oomph::RankThreeTensor< T > Class Template Reference

A Rank 3 Tensor class. More...

#include <matrices.h>

Public Member Functions

 RankThreeTensor ()
 Empty constructor. More...
 
 RankThreeTensor (const RankThreeTensor &source_tensor)
 Copy constructor: Deep copy. More...
 
RankThreeTensoroperator= (const RankThreeTensor &source_tensor)
 Copy assignement. More...
 
 RankThreeTensor (const unsigned long &n)
 One parameter constructor produces a cubic nxnxn tensor. More...
 
 RankThreeTensor (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3)
 Three parameter constructor, general non-square tensor. More...
 
 RankThreeTensor (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3, const T &initial_val)
 Three parameter constructor, general non-square tensor. More...
 
virtual ~RankThreeTensor ()
 Destructor: delete the pointers. More...
 
void resize (const unsigned long &n)
 Resize to a square nxnxn tensor. More...
 
void resize (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3)
 Resize to a general tensor. More...
 
void resize (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3, const T &initial_value)
 Resize to a general tensor. More...
 
void initialise (const T &val)
 Initialise all values in the tensor to val. More...
 
unsigned long nindex1 () const
 Return the range of index 1 of the tensor. More...
 
unsigned long nindex2 () const
 Return the range of index 2 of the tensor. More...
 
unsigned long nindex3 () const
 Return the range of index 3 of the tensor. More...
 
Toperator() (const unsigned long &i, const unsigned long &j, const unsigned long &k)
 Overload the round brackets to give access as a(i,j,k) More...
 
T operator() (const unsigned long &i, const unsigned long &j, const unsigned long &k) const
 Overload a const version for read-only access as a(i,j,k) More...
 

Private Member Functions

void range_check (const unsigned long &i, const unsigned long &j, const unsigned long &k) const
 

Private Attributes

TTensordata
 Private internal representation as pointer to data. More...
 
unsigned N
 1st Tensor dimension More...
 
unsigned M
 2nd Tensor dimension More...
 
unsigned P
 3rd Tensor dimension More...
 

Detailed Description

template<class T>
class oomph::RankThreeTensor< T >

A Rank 3 Tensor class.

////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////

Constructor & Destructor Documentation

◆ RankThreeTensor() [1/5]

template<class T >
oomph::RankThreeTensor< T >::RankThreeTensor ( )
inline

Empty constructor.

1425 : Tensordata(0), N(0), M(0), P(0) {}
unsigned N
1st Tensor dimension
Definition: matrices.h:1376
unsigned M
2nd Tensor dimension
Definition: matrices.h:1379
unsigned P
3rd Tensor dimension
Definition: matrices.h:1382
T * Tensordata
Private internal representation as pointer to data.
Definition: matrices.h:1373

◆ RankThreeTensor() [2/5]

template<class T >
oomph::RankThreeTensor< T >::RankThreeTensor ( const RankThreeTensor< T > &  source_tensor)
inline

Copy constructor: Deep copy.

1429  {
1430  // Set row and column lengths
1431  N = source_tensor.nindex1();
1432  M = source_tensor.nindex2();
1433  P = source_tensor.nindex3();
1434  // Assign space for the data
1435  Tensordata = new T[N * M * P];
1436  // Copy the data across from the other matrix
1437  for (unsigned i = 0; i < N; i++)
1438  {
1439  for (unsigned j = 0; j < M; j++)
1440  {
1441  for (unsigned k = 0; k < P; k++)
1442  {
1443  Tensordata[P * (M * i + j) + k] = source_tensor(i, j, k);
1444  }
1445  }
1446  }
1447  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
char char char int int * k
Definition: level2_impl.h:374
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References i, j, k, oomph::RankThreeTensor< T >::M, oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::nindex1(), oomph::RankThreeTensor< T >::nindex2(), oomph::RankThreeTensor< T >::nindex3(), oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::Tensordata.

◆ RankThreeTensor() [3/5]

template<class T >
oomph::RankThreeTensor< T >::RankThreeTensor ( const unsigned long &  n)
inline

One parameter constructor produces a cubic nxnxn tensor.

1484  {
1485  // Set row and column lengths
1486  N = n;
1487  M = n;
1488  P = n;
1489  // Assign space for the n rows
1490  Tensordata = new T[N * M * P];
1491  // Initialise to zero if required
1492 #ifdef OOMPH_INITIALISE_DENSE_MATRICES
1493  initialise(T(0));
1494 #endif
1495  }
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
void initialise(const T &val)
Initialise all values in the tensor to val.
Definition: matrices.h:1642

References oomph::RankThreeTensor< T >::initialise(), n, oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::Tensordata.

◆ RankThreeTensor() [4/5]

template<class T >
oomph::RankThreeTensor< T >::RankThreeTensor ( const unsigned long &  n_index1,
const unsigned long &  n_index2,
const unsigned long &  n_index3 
)
inline

Three parameter constructor, general non-square tensor.

1501  {
1502  // Set row and column lengths
1503  N = n_index1;
1504  M = n_index2;
1505  P = n_index3;
1506  // Assign space for the n rows
1507  Tensordata = new T[N * M * P];
1508  // Initialise to zero if required
1509 #ifdef OOMPH_INITIALISE_DENSE_MATRICES
1510  initialise(T(0));
1511 #endif
1512  }

References oomph::RankThreeTensor< T >::initialise(), oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::Tensordata.

◆ RankThreeTensor() [5/5]

template<class T >
oomph::RankThreeTensor< T >::RankThreeTensor ( const unsigned long &  n_index1,
const unsigned long &  n_index2,
const unsigned long &  n_index3,
const T initial_val 
)
inline

Three parameter constructor, general non-square tensor.

1520  {
1521  // Set row and column lengths
1522  N = n_index1;
1523  M = n_index2;
1524  P = n_index3;
1525  // Assign space for the n rows
1526  Tensordata = new T[N * M * P];
1527  // Initialise to the initial value
1528  initialise(initial_val);
1529  }

References oomph::RankThreeTensor< T >::initialise(), oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::Tensordata.

◆ ~RankThreeTensor()

template<class T >
virtual oomph::RankThreeTensor< T >::~RankThreeTensor ( )
inlinevirtual

Destructor: delete the pointers.

1533  {
1534  delete[] Tensordata;
1535  Tensordata = 0;
1536  }

References oomph::RankThreeTensor< T >::Tensordata.

Member Function Documentation

◆ initialise()

template<class T >
void oomph::RankThreeTensor< T >::initialise ( const T val)
inline

Initialise all values in the tensor to val.

1643  {
1644  for (unsigned long i = 0; i < (N * M * P); ++i)
1645  {
1646  Tensordata[i] = val;
1647  }
1648  }
val
Definition: calibrate.py:119

References i, oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::P, oomph::RankThreeTensor< T >::Tensordata, and calibrate::val.

Referenced by oomph::ScalarAdvectionEquations< DIM >::dflux_du(), oomph::RankThreeTensor< T >::RankThreeTensor(), and oomph::RankThreeTensor< T >::resize().

◆ nindex1()

template<class T >
unsigned long oomph::RankThreeTensor< T >::nindex1 ( ) const
inline

Return the range of index 1 of the tensor.

1652  {
1653  return N;
1654  }

References oomph::RankThreeTensor< T >::N.

Referenced by oomph::RankThreeTensor< T >::operator=(), and oomph::RankThreeTensor< T >::RankThreeTensor().

◆ nindex2()

template<class T >
unsigned long oomph::RankThreeTensor< T >::nindex2 ( ) const
inline

Return the range of index 2 of the tensor.

1658  {
1659  return M;
1660  }

References oomph::RankThreeTensor< T >::M.

Referenced by oomph::RankThreeTensor< T >::operator=(), and oomph::RankThreeTensor< T >::RankThreeTensor().

◆ nindex3()

template<class T >
unsigned long oomph::RankThreeTensor< T >::nindex3 ( ) const
inline

Return the range of index 3 of the tensor.

1664  {
1665  return P;
1666  }

References oomph::RankThreeTensor< T >::P.

Referenced by oomph::RankThreeTensor< T >::operator=(), and oomph::RankThreeTensor< T >::RankThreeTensor().

◆ operator()() [1/2]

template<class T >
T& oomph::RankThreeTensor< T >::operator() ( const unsigned long &  i,
const unsigned long &  j,
const unsigned long &  k 
)
inline

Overload the round brackets to give access as a(i,j,k)

1672  {
1673 #ifdef RANGE_CHECKING
1674  this->range_check(i, j, k);
1675 #endif
1676  return Tensordata[P * (M * i + j) + k];
1677  }
void range_check(const unsigned long &i, const unsigned long &j, const unsigned long &k) const
Definition: matrices.h:1386

References i, j, k, oomph::RankThreeTensor< T >::P, oomph::RankThreeTensor< T >::range_check(), and oomph::RankThreeTensor< T >::Tensordata.

◆ operator()() [2/2]

template<class T >
T oomph::RankThreeTensor< T >::operator() ( const unsigned long &  i,
const unsigned long &  j,
const unsigned long &  k 
) const
inline

Overload a const version for read-only access as a(i,j,k)

1683  {
1684 #ifdef RANGE_CHECKING
1685  this->range_check(i, j, k);
1686 #endif
1687  return Tensordata[P * (M * i + j) + k];
1688  }

References i, j, k, oomph::RankThreeTensor< T >::P, oomph::RankThreeTensor< T >::range_check(), and oomph::RankThreeTensor< T >::Tensordata.

◆ operator=()

template<class T >
RankThreeTensor& oomph::RankThreeTensor< T >::operator= ( const RankThreeTensor< T > &  source_tensor)
inline

Copy assignement.

1451  {
1452  // Don't create a new matrix if the assignement is the identity
1453  if (this != &source_tensor)
1454  {
1455  // Check row and column length
1456  unsigned long n = source_tensor.nindex1();
1457  unsigned long m = source_tensor.nindex2();
1458  unsigned long p = source_tensor.nindex3();
1459  // Resie the tensor to be the same size as the old tensor
1460  if ((N != n) || (M != m) || (P != p))
1461  {
1462  resize(n, m, p);
1463  }
1464 
1465  // Copy entries across from the other matrix
1466  for (unsigned long i = 0; i < N; i++)
1467  {
1468  for (unsigned long j = 0; j < M; j++)
1469  {
1470  for (unsigned long k = 0; k < P; k++)
1471  {
1472  (*this)(i, j, k) = source_tensor(i, j, k);
1473  }
1474  }
1475  }
1476  }
1477  // Return reference to object itself (i.e. de-reference this pointer)
1478  return *this;
1479  }
float * p
Definition: Tutorial_Map_using.cpp:9
void resize(const unsigned long &n)
Resize to a square nxnxn tensor.
Definition: matrices.h:1539
int * m
Definition: level2_cplx_impl.h:294

References i, j, k, m, oomph::RankThreeTensor< T >::M, n, oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::nindex1(), oomph::RankThreeTensor< T >::nindex2(), oomph::RankThreeTensor< T >::nindex3(), p, oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::resize().

◆ range_check()

template<class T >
void oomph::RankThreeTensor< T >::range_check ( const unsigned long &  i,
const unsigned long &  j,
const unsigned long &  k 
) const
inlineprivate

Range check to catch when an index is out of bounds, if so, it issues a warning message and dies by throwing an OomphLibError

1389  {
1390  if (i >= N)
1391  {
1392  std::ostringstream error_message;
1393  error_message << "Range Error: i=" << i << " is not in the range (0,"
1394  << N - 1 << ")." << std::endl;
1395 
1396  throw OomphLibError(error_message.str(),
1399  }
1400  else if (j >= M)
1401  {
1402  std::ostringstream error_message;
1403  error_message << "Range Error: j=" << j << " is not in the range (0,"
1404  << M - 1 << ")." << std::endl;
1405 
1406  throw OomphLibError(error_message.str(),
1409  }
1410  else if (k >= P)
1411  {
1412  std::ostringstream error_message;
1413  error_message << "Range Error: k=" << k << " is not in the range (0,"
1414  << P - 1 << ")." << std::endl;
1415 
1416  throw OomphLibError(error_message.str(),
1419  }
1420  }
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References i, j, k, oomph::RankThreeTensor< T >::N, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, and oomph::RankThreeTensor< T >::P.

Referenced by oomph::RankThreeTensor< T >::operator()().

◆ resize() [1/3]

template<class T >
void oomph::RankThreeTensor< T >::resize ( const unsigned long &  n)
inline

Resize to a square nxnxn tensor.

1540  {
1541  resize(n, n, n);
1542  }

References n.

Referenced by oomph::RankThreeTensor< T >::operator=().

◆ resize() [2/3]

template<class T >
void oomph::RankThreeTensor< T >::resize ( const unsigned long &  n_index1,
const unsigned long &  n_index2,
const unsigned long &  n_index3 
)
inline

Resize to a general tensor.

1548  {
1549  // If the sizes have not changed do nothing
1550  if ((n_index1 == N) && (n_index2 == M) && (n_index3 == P))
1551  {
1552  return;
1553  }
1554  // Store old sizes
1555  unsigned long n_old = N, m_old = M, p_old = P;
1556  // Reassign the sizes
1557  N = n_index1;
1558  M = n_index2;
1559  P = n_index3;
1560  // Store triple pointer to old matrix data
1561  T* temp_tensor = Tensordata;
1562  // Re-create Tensordata in new size
1563  Tensordata = new T[N * M * P];
1564 #ifdef OOMPH_INITIALISE_DENSE_MATRICES
1565  initialise(T(0));
1566 #endif
1567  // Transfer values
1568  unsigned long n_copy, m_copy, p_copy;
1569  n_copy = std::min(n_old, n_index1);
1570  m_copy = std::min(m_old, n_index2);
1571  p_copy = std::min(p_old, n_index3);
1572  // If matrix has values, transfer them to new matrix
1573  // Loop over rows
1574  for (unsigned long i = 0; i < n_copy; i++)
1575  {
1576  // Loop over columns
1577  for (unsigned long j = 0; j < m_copy; j++)
1578  {
1579  // Loop over columns
1580  for (unsigned long k = 0; k < p_copy; k++)
1581  {
1582  // Transfer values from temp_tensor
1583  Tensordata[M * P * i + P * j + k] =
1584  temp_tensor[m_old * p_old * i + p_old * j + k];
1585  }
1586  }
1587  }
1588  // Now kill storage for old tensor
1589  delete[] temp_tensor;
1590  }
#define min(a, b)
Definition: datatypes.h:22

References i, oomph::RankThreeTensor< T >::initialise(), j, k, oomph::RankThreeTensor< T >::M, min, oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::Tensordata.

◆ resize() [3/3]

template<class T >
void oomph::RankThreeTensor< T >::resize ( const unsigned long &  n_index1,
const unsigned long &  n_index2,
const unsigned long &  n_index3,
const T initial_value 
)
inline

Resize to a general tensor.

1597  {
1598  // If the sizes have not changed do nothing
1599  if ((n_index1 == N) && (n_index2 == M) && (n_index3 == P))
1600  {
1601  return;
1602  }
1603  // Store old sizes
1604  unsigned long n_old = N, m_old = M, p_old = P;
1605  // Reassign the sizes
1606  N = n_index1;
1607  M = n_index2;
1608  P = n_index3;
1609  // Store triple pointer to old matrix data
1610  T* temp_tensor = Tensordata;
1611  // Re-create Tensordata in new size
1612  Tensordata = new T[N * M * P];
1613  // Initialise the newly allocated storage
1614  initialise(initial_value);
1615 
1616  // Transfer values
1617  unsigned long n_copy, m_copy, p_copy;
1618  n_copy = std::min(n_old, n_index1);
1619  m_copy = std::min(m_old, n_index2);
1620  p_copy = std::min(p_old, n_index3);
1621  // If matrix has values, transfer them to new matrix
1622  // Loop over rows
1623  for (unsigned long i = 0; i < n_copy; i++)
1624  {
1625  // Loop over columns
1626  for (unsigned long j = 0; j < m_copy; j++)
1627  {
1628  // Loop over columns
1629  for (unsigned long k = 0; k < p_copy; k++)
1630  {
1631  // Transfer values from temp_tensor
1632  Tensordata[M * P * i + P * j + k] =
1633  temp_tensor[m_old * p_old * i + p_old * j + k];
1634  }
1635  }
1636  }
1637  // Now kill storage for old tensor
1638  delete[] temp_tensor;
1639  }

References i, oomph::RankThreeTensor< T >::initialise(), j, k, oomph::RankThreeTensor< T >::M, min, oomph::RankThreeTensor< T >::N, oomph::RankThreeTensor< T >::P, and oomph::RankThreeTensor< T >::Tensordata.

Member Data Documentation

◆ M

◆ N

◆ P

◆ Tensordata


The documentation for this class was generated from the following file: