oomph::RankFourTensor< T > Class Template Reference

A Rank 4 Tensor class. More...

#include <matrices.h>

Public Member Functions

 RankFourTensor ()
 Empty constructor. More...
 
 RankFourTensor (const RankFourTensor &source_tensor)
 Copy constructor: Deep copy. More...
 
RankFourTensoroperator= (const RankFourTensor &source_tensor)
 Copy assignement. More...
 
 RankFourTensor (const unsigned long &n)
 One parameter constructor produces a nxnxnxn tensor. More...
 
 RankFourTensor (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3, const unsigned long &n_index4)
 Four parameter constructor, general non-square tensor. More...
 
 RankFourTensor (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3, const unsigned long &n_index4, const T &initial_val)
 Four parameter constructor, general non-square tensor. More...
 
virtual ~RankFourTensor ()
 Destructor: delete the pointers. More...
 
void resize (const unsigned long &n)
 Resize to a square nxnxnxn tensor. More...
 
void resize (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3, const unsigned long &n_index4)
 Resize to a general tensor. More...
 
void resize (const unsigned long &n_index1, const unsigned long &n_index2, const unsigned long &n_index3, const unsigned long &n_index4, 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...
 
unsigned long nindex4 () const
 Return the range of index 4 of the tensor. More...
 
Toperator() (const unsigned long &i, const unsigned long &j, const unsigned long &k, const unsigned long &l)
 Overload the round brackets to give access as a(i,j,k,l) More...
 
T operator() (const unsigned long &i, const unsigned long &j, const unsigned long &k, const unsigned long &l) const
 Overload a const version for read-only access as a(i,j,k,l) More...
 
Traw_direct_access (const unsigned long &i)
 
const Traw_direct_access (const unsigned long &i) const
 
unsigned offset (const unsigned long &i, const unsigned long &j) const
 

Private Member Functions

void range_check (const unsigned long &i, const unsigned long &j, const unsigned long &k, const unsigned long &l) 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...
 
unsigned Q
 4th Tensor dimension More...
 

Detailed Description

template<class T>
class oomph::RankFourTensor< T >

A Rank 4 Tensor class.

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

Constructor & Destructor Documentation

◆ RankFourTensor() [1/5]

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

Empty constructor.

1769 : Tensordata(0), N(0), M(0), P(0), Q(0) {}
unsigned M
2nd Tensor dimension
Definition: matrices.h:1710
unsigned N
1st Tensor dimension
Definition: matrices.h:1707
T * Tensordata
Private internal representation as pointer to data.
Definition: matrices.h:1704
unsigned P
3rd Tensor dimension
Definition: matrices.h:1713
unsigned Q
4th Tensor dimension
Definition: matrices.h:1716

◆ RankFourTensor() [2/5]

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

Copy constructor: Deep copy.

1773  {
1774  // Set row and column lengths
1775  N = source_tensor.nindex1();
1776  M = source_tensor.nindex2();
1777  P = source_tensor.nindex3();
1778  Q = source_tensor.nindex4();
1779 
1780  // Assign space for the data
1781  Tensordata = new T[N * M * P * Q];
1782 
1783  // Copy the data across from the other matrix
1784  for (unsigned i = 0; i < N; i++)
1785  {
1786  for (unsigned j = 0; j < M; j++)
1787  {
1788  for (unsigned k = 0; k < P; k++)
1789  {
1790  for (unsigned l = 0; l < Q; l++)
1791  {
1792  Tensordata[Q * (P * (M * i + j) + k) + l] =
1793  source_tensor(i, j, k, l);
1794  }
1795  }
1796  }
1797  }
1798  }
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::RankFourTensor< T >::M, oomph::RankFourTensor< T >::N, oomph::RankFourTensor< T >::nindex1(), oomph::RankFourTensor< T >::nindex2(), oomph::RankFourTensor< T >::nindex3(), oomph::RankFourTensor< T >::nindex4(), oomph::RankFourTensor< T >::P, oomph::RankFourTensor< T >::Q, and oomph::RankFourTensor< T >::Tensordata.

◆ RankFourTensor() [3/5]

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

One parameter constructor produces a nxnxnxn tensor.

1839  {
1840  // Set row and column lengths
1841  N = n;
1842  M = n;
1843  P = n;
1844  Q = n;
1845  // Assign space for the n rows
1846  Tensordata = new T[N * M * P * Q];
1847  // Initialise to zero if required
1848 #ifdef OOMPH_INITIALISE_DENSE_MATRICES
1849  initialise(T(0));
1850 #endif
1851  }
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:2018

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

◆ RankFourTensor() [4/5]

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

Four parameter constructor, general non-square tensor.

1858  {
1859  // Set row and column lengths
1860  N = n_index1;
1861  M = n_index2;
1862  P = n_index3;
1863  Q = n_index4;
1864  // Assign space for the n rows
1865  Tensordata = new T[N * M * P * Q];
1866  // Initialise to zero if required
1867 #ifdef OOMPH_INITIALISE_DENSE_MATRICES
1868  initialise(T(0));
1869 #endif
1870  }

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

◆ RankFourTensor() [5/5]

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

Four parameter constructor, general non-square tensor.

1879  {
1880  // Set row and column lengths
1881  N = n_index1;
1882  M = n_index2;
1883  P = n_index3;
1884  Q = n_index4;
1885  // Assign space for the n rows
1886  Tensordata = new T[N * M * P * Q];
1887  // Initialise to the initial value
1888  initialise(initial_val);
1889  }

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

◆ ~RankFourTensor()

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

Destructor: delete the pointers.

1893  {
1894  delete[] Tensordata;
1895  Tensordata = 0;
1896  }

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

Member Function Documentation

◆ initialise()

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

Initialise all values in the tensor to val.

2019  {
2020  for (unsigned long i = 0; i < (N * M * P * Q); ++i)
2021  {
2022  Tensordata[i] = val;
2023  }
2024  }
val
Definition: calibrate.py:119

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

Referenced by oomph::RankFourTensor< T >::RankFourTensor(), and oomph::RankFourTensor< T >::resize().

◆ nindex1()

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

◆ nindex2()

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

◆ nindex3()

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

◆ nindex4()

template<class T >
unsigned long oomph::RankFourTensor< T >::nindex4 ( ) const
inline

◆ offset()

◆ operator()() [1/2]

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

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

2055  {
2056 #ifdef RANGE_CHECKING
2057  this->range_check(i, j, k, l);
2058 #endif
2059  return Tensordata[Q * (P * (M * i + j) + k) + l];
2060  }
void range_check(const unsigned long &i, const unsigned long &j, const unsigned long &k, const unsigned long &l) const
Definition: matrices.h:1720

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

◆ operator()() [2/2]

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

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

2067  {
2068 #ifdef RANGE_CHECKING
2069  this->range_check(i, j, k, l);
2070 #endif
2071  return Tensordata[Q * (P * (M * i + j) + k) + l];
2072  }

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

◆ operator=()

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

Copy assignement.

1802  {
1803  // Don't create a new matrix if the assignement is the identity
1804  if (this != &source_tensor)
1805  {
1806  // Check row and column length
1807  unsigned long n = source_tensor.nindex1();
1808  unsigned long m = source_tensor.nindex2();
1809  unsigned long p = source_tensor.nindex3();
1810  unsigned long q = source_tensor.nindex4();
1811  // Resize the tensor to be the same size as the old tensor
1812  if ((N != n) || (M != m) || (P != p) || (Q != q))
1813  {
1814  resize(n, m, p, q);
1815  }
1816 
1817  // Copy entries across from the other matrix
1818  for (unsigned long i = 0; i < N; i++)
1819  {
1820  for (unsigned long j = 0; j < M; j++)
1821  {
1822  for (unsigned long k = 0; k < P; k++)
1823  {
1824  for (unsigned long l = 0; l < Q; l++)
1825  {
1826  (*this)(i, j, k, l) = source_tensor(i, j, k, l);
1827  }
1828  }
1829  }
1830  }
1831  }
1832  // Return reference to object itself (i.e. de-reference this pointer)
1833  return *this;
1834  }
float * p
Definition: Tutorial_Map_using.cpp:9
void resize(const unsigned long &n)
Resize to a square nxnxnxn tensor.
Definition: matrices.h:1899
int * m
Definition: level2_cplx_impl.h:294
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019

References i, j, k, m, oomph::RankFourTensor< T >::M, n, oomph::RankFourTensor< T >::N, oomph::RankFourTensor< T >::nindex1(), oomph::RankFourTensor< T >::nindex2(), oomph::RankFourTensor< T >::nindex3(), oomph::RankFourTensor< T >::nindex4(), p, oomph::RankFourTensor< T >::P, Eigen::numext::q, oomph::RankFourTensor< T >::Q, and oomph::RankFourTensor< T >::resize().

◆ range_check()

template<class T >
void oomph::RankFourTensor< T >::range_check ( const unsigned long &  i,
const unsigned long &  j,
const unsigned long &  k,
const unsigned long &  l 
) 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

1724  {
1725  if (i >= N)
1726  {
1727  std::ostringstream error_message;
1728  error_message << "Range Error: i=" << i << " is not in the range (0,"
1729  << N - 1 << ")." << std::endl;
1730 
1731  throw OomphLibError(error_message.str(),
1734  }
1735  else if (j >= M)
1736  {
1737  std::ostringstream error_message;
1738  error_message << "Range Error: j=" << j << " is not in the range (0,"
1739  << M - 1 << ")." << std::endl;
1740 
1741  throw OomphLibError(error_message.str(),
1744  }
1745  else if (k >= P)
1746  {
1747  std::ostringstream error_message;
1748  error_message << "Range Error: k=" << k << " is not in the range (0,"
1749  << P - 1 << ")." << std::endl;
1750 
1751  throw OomphLibError(error_message.str(),
1754  }
1755  else if (l >= Q)
1756  {
1757  std::ostringstream error_message;
1758  error_message << "Range Error: l=" << l << " is not in the range (0,"
1759  << Q - 1 << ")." << std::endl;
1760 
1761  throw OomphLibError(error_message.str(),
1764  }
1765  }
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

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

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

◆ raw_direct_access() [1/2]

◆ raw_direct_access() [2/2]

template<class T >
const T& oomph::RankFourTensor< T >::raw_direct_access ( const unsigned long &  i) const
inline

Direct access to internal storage of data in flat-packed C-style column-major format. WARNING: Only for experienced users. Only use this if raw speed is of the essence, as in the solid mechanics problems.

2088  {
2089  return Tensordata[i];
2090  }

References i, and oomph::RankFourTensor< T >::Tensordata.

◆ resize() [1/3]

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

Resize to a square nxnxnxn tensor.

1900  {
1901  resize(n, n, n, n);
1902  }

References n.

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

◆ resize() [2/3]

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

Resize to a general tensor.

1909  {
1910  // If the sizes have not changed do nothing
1911  if ((n_index1 == N) && (n_index2 == M) && (n_index3 == P) &&
1912  (n_index4 == Q))
1913  {
1914  return;
1915  }
1916  // Store old sizes
1917  unsigned long n_old = N, m_old = M, p_old = P, q_old = Q;
1918  // Reassign the sizes
1919  N = n_index1;
1920  M = n_index2;
1921  P = n_index3;
1922  Q = n_index4;
1923  // Store pointer to old matrix data
1924  T* temp_tensor = Tensordata;
1925  // Re-create Tensordata in new size
1926  Tensordata = new T[N * M * P * Q];
1927 #ifdef OOMPH_INITIALISE_DENSE_MATRICES
1928  initialise(T(0));
1929 #endif
1930  // Transfer values
1931  unsigned long n_copy, m_copy, p_copy, q_copy;
1932  n_copy = std::min(n_old, n_index1);
1933  m_copy = std::min(m_old, n_index2);
1934  p_copy = std::min(p_old, n_index3);
1935  q_copy = std::min(q_old, n_index4);
1936  // If matrix has values, transfer them to new matrix
1937  // Loop over rows
1938  for (unsigned long i = 0; i < n_copy; i++)
1939  {
1940  // Loop over columns
1941  for (unsigned long j = 0; j < m_copy; j++)
1942  {
1943  // Loop over columns
1944  for (unsigned long k = 0; k < p_copy; k++)
1945  {
1946  // Loop over columns
1947  for (unsigned long l = 0; l < q_copy; l++)
1948  {
1949  // Transfer values from temp_tensor
1950  Tensordata[Q * (M * P * i + P * j + k) + l] =
1951  temp_tensor[q_old * (m_old * p_old * i + p_old * j + k) + l];
1952  }
1953  }
1954  }
1955  }
1956  // Now kill storage for old tensor
1957  delete[] temp_tensor;
1958  }
#define min(a, b)
Definition: datatypes.h:22

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

◆ resize() [3/3]

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

Resize to a general tensor.

1966  {
1967  // If the sizes have not changed do nothing
1968  if ((n_index1 == N) && (n_index2 == M) && (n_index3 == P) &&
1969  (n_index4 == Q))
1970  {
1971  return;
1972  }
1973  // Store old sizes
1974  unsigned long n_old = N, m_old = M, p_old = P, q_old = Q;
1975  // Reassign the sizes
1976  N = n_index1;
1977  M = n_index2;
1978  P = n_index3;
1979  Q = n_index4;
1980  // Store triple pointer to old matrix data
1981  T* temp_tensor = Tensordata;
1982  // Re-create Tensordata in new size
1983  Tensordata = new T[N * M * P * Q];
1984  // Initialise the newly allocated storage
1985  initialise(initial_value);
1986 
1987  // Transfer values
1988  unsigned long n_copy, m_copy, p_copy, q_copy;
1989  n_copy = std::min(n_old, n_index1);
1990  m_copy = std::min(m_old, n_index2);
1991  p_copy = std::min(p_old, n_index3);
1992  q_copy = std::min(q_old, n_index4);
1993  // If matrix has values, transfer them to new matrix
1994  // Loop over rows
1995  for (unsigned long i = 0; i < n_copy; i++)
1996  {
1997  // Loop over columns
1998  for (unsigned long j = 0; j < m_copy; j++)
1999  {
2000  // Loop over columns
2001  for (unsigned long k = 0; k < p_copy; k++)
2002  {
2003  // Loop over columns
2004  for (unsigned long l = 0; l < q_copy; l++)
2005  {
2006  // Transfer values from temp_tensor
2007  Tensordata[Q * (M * P * i + P * j + k) + l] =
2008  temp_tensor[q_old * (m_old * p_old * i + p_old * j + k) + l];
2009  }
2010  }
2011  }
2012  }
2013  // Now kill storage for old tensor
2014  delete[] temp_tensor;
2015  }

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

Member Data Documentation

◆ M

◆ N

◆ P

◆ Q

◆ Tensordata


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