32 #include <boost/static_assert.hpp>
33 #include <boost/array.hpp>
35 #include "../WAssert.h"
36 #include "WCompileTimeFunctions.h"
48 template< std::
size_t order, std::
size_t dim,
typename Data_T >
65 template< std::
size_t order, std::
size_t dim >
66 inline void positionIterateOneStep( boost::array< std::size_t, order >& pos )
68 WAssert( pos.size() >= order,
"" );
70 for( std::size_t k = order - 1; k > 0; --k )
72 if( pos[ k ] == dim - 1)
100 template< std::
size_t order, std::
size_t dim >
101 inline void positionIterateSortedOneStep( boost::array< std::size_t, order >& pos )
103 WAssert( pos.size() >= order,
"" );
105 for(
int k = order - 1; k > -1; --k )
107 if( pos[ k ] != dim - 1 )
110 for( std::size_t i = k + 1; i < order; ++i )
126 inline void positionIterateSortedOneStep( std::size_t order, std::size_t dim, std::vector< std::size_t >& pos )
128 WAssert( pos.size() >= order,
"" );
130 for(
int k = order - 1; k > -1; --k )
132 if( pos[ k ] != dim - 1 )
135 for( std::size_t i = k + 1; i < order; ++i )
159 template< std::
size_t order, std::
size_t dim,
typename Data_T >
168 friend class WTensorBase< order + 1, dim, Data_T >;
171 friend class ::WTensorBaseTest;
174 friend class ::WTensorFuncTest;
237 template<
typename Index_T >
238 Data_T&
operator[] ( std::vector< Index_T >
const& indices );
247 template<
typename Index_T >
248 Data_T
const&
operator[] ( std::vector< Index_T >
const& indices )
const;
259 template<
typename Index_T >
271 template<
typename Index_T >
272 Data_T
const&
operator[] ( Index_T indices[] )
const;
312 template<
typename Index_T >
313 static inline std::size_t
getPos( Index_T pos[] );
320 template< std::
size_t order, std::
size_t dim,
typename Data_T >
323 m_data.assign( Data_T() );
326 template< std::
size_t order, std::
size_t dim,
typename Data_T >
332 template< std::
size_t order, std::
size_t dim,
typename Data_T >
338 template< std::
size_t order, std::
size_t dim,
typename Data_T >
345 template< std::
size_t order, std::
size_t dim,
typename Data_T >
348 boost::array< std::size_t, order > pos;
351 for( std::size_t k = 0; k <
dataSize; ++k )
353 ( *this )[ &pos[ 0 ] ] = t[ &pos[ 0 ] ];
354 positionIterateOneStep< order, dim >( pos );
360 template< std::
size_t order, std::
size_t dim,
typename Data_T >
366 template< std::
size_t order, std::
size_t dim,
typename Data_T >
372 template< std::
size_t order, std::
size_t dim,
typename Data_T >
373 template<
typename Index_T >
379 template< std::
size_t order, std::
size_t dim,
typename Data_T >
380 template<
typename Index_T >
383 return const_cast< Data_T&
>(
static_cast< WTensorBase const&
>( *this ).operator[] ( indices ) );
386 template< std::
size_t order, std::
size_t dim,
typename Data_T >
387 template<
typename Index_T >
390 WAssert( indices.size() >= order,
"" );
394 template< std::
size_t order, std::
size_t dim,
typename Data_T >
395 template<
typename Index_T >
398 return const_cast< Data_T&
>(
static_cast< WTensorBase const&
>( *this ).operator[] ( indices ) );
401 template< std::
size_t order, std::
size_t dim,
typename Data_T >
402 template<
typename Index_T >
405 for( std::size_t k = 0; k < order; ++k )
407 WAssert( static_cast< std::size_t >( indices[ k ] ) < dim,
"" );
409 std::size_t p =
getPos( indices );
413 template< std::
size_t order, std::
size_t dim,
typename Data_T >
419 template< std::
size_t order, std::
size_t dim,
typename Data_T >
435 template< std::
size_t dim,
typename Data_T >
442 friend class ::WTensorBaseTest;
445 friend class ::WTensorFuncTest;
477 m_data = t.template
operator[]< std::size_t >( NULL );
502 m_data = t.template
operator[]< std::size_t >( NULL );
531 template<
typename Index_T >
542 template<
typename Index_T >
543 Data_T
const&
operator[] ( std::vector< Index_T >
const& )
const
553 template<
typename Index_T >
564 template<
typename Index_T >
601 template<
typename Index_T >
602 static inline std::size_t
getPos( Index_T[] )
640 template< std::
size_t order, std::
size_t dim,
typename Data_T >
649 friend class ::WTensorBaseSymTest;
652 friend class ::WTensorFuncTest;
687 explicit WTensorBaseSym(
const boost::array< Data_T, dataSize >& data );
731 void setValues( boost::array< Data_T, dataSize >
const& values );
740 template<
typename Index_T >
741 Data_T&
operator[] ( std::vector< Index_T >
const& indices );
750 template<
typename Index_T >
751 Data_T
const&
operator[] ( std::vector< Index_T >
const& indices )
const;
762 template<
typename Index_T >
774 template<
typename Index_T >
775 Data_T
const&
operator[] ( Index_T indices[] )
const;
823 template<
typename Index_T >
824 inline std::size_t
operator[] ( Index_T pos[] )
const;
851 template< std::
size_t order, std::
size_t dim,
typename Data_T >
856 template< std::
size_t order, std::
size_t dim,
typename Data_T >
860 std::map< boost::array< std::size_t, order >, std::size_t > m;
864 boost::array< std::size_t, order > pos;
867 for( std::size_t k = 0; k <
dataSize; ++k )
871 m.insert( std::make_pair( pos, k ) );
874 positionIterateSortedOneStep< order, dim >( pos );
880 boost::array< std::size_t, order > _p;
883 for( std::size_t k = 0; k < WPower< dim, order >::value; ++k )
888 std::sort( _p.begin(), _p.end() );
895 WAssert( m.size() ==
dataSize,
"" );
898 positionIterateOneStep< order, dim >( pos );
902 template< std::
size_t order, std::
size_t dim,
typename Data_T >
903 template<
typename Index_T >
906 return m_positions[ pos ];
911 template< std::
size_t order, std::
size_t dim,
typename Data_T >
914 m_data.assign( Data_T() );
917 template< std::
size_t order, std::
size_t dim,
typename Data_T >
920 WAssert(
dataSize ==
m_data.size(),
"Number of given components does not match the order and dimension of this symmetric tensor" );
921 std::copy( &data[ 0 ], &data[ 0 ] + data.
size(), &
m_data[ 0 ] );
924 template< std::
size_t order, std::
size_t dim,
typename Data_T >
930 template< std::
size_t order, std::
size_t dim,
typename Data_T >
936 template< std::
size_t order, std::
size_t dim,
typename Data_T >
943 template< std::
size_t order, std::
size_t dim,
typename Data_T >
949 template< std::
size_t order, std::
size_t dim,
typename Data_T >
955 template< std::
size_t order, std::
size_t dim,
typename Data_T >
958 WAssert( m_data.size() == values.
size(),
"Number of given components does not match the order and dimension of this symmetric tensor" );
959 std::copy( &values[ 0 ], &values[ 0 ] + values.
size(), &m_data[ 0 ] );
962 template< std::
size_t order, std::
size_t dim,
typename Data_T >
965 std::copy( &values[ 0 ], &values[ 0 ] + dataSize, &m_data[ 0 ] );
968 template< std::
size_t order, std::
size_t dim,
typename Data_T >
969 template<
typename Index_T >
972 return const_cast< Data_T&
>(
static_cast< WTensorBaseSym const&
>( *this ).operator[] ( indices ) );
975 template< std::
size_t order, std::
size_t dim,
typename Data_T >
976 template<
typename Index_T >
979 WAssert( indices.size() >= order,
"" );
980 return operator[] ( &indices[ 0 ] );
983 template< std::
size_t order, std::
size_t dim,
typename Data_T >
984 template<
typename Index_T >
987 return const_cast< Data_T&
>(
static_cast< WTensorBaseSym const&
>( *this ).operator[] ( indices ) );
990 template< std::
size_t order, std::
size_t dim,
typename Data_T >
991 template<
typename Index_T >
994 std::size_t p = m_indexer[ indices ];
995 WAssert( p < m_data.size(),
"" );
999 template< std::
size_t order, std::
size_t dim,
typename Data_T >
1002 return m_data == other.
m_data;
1005 template< std::
size_t order, std::
size_t dim,
typename Data_T >
1008 return m_data != other.
m_data;
1021 template< std::
size_t dim,
typename Data_T >
1024 friend class ::WTensorBaseSymTest;
1025 friend class ::WTensorFuncTest;
1087 template<
typename Index_T >
1098 template<
typename Index_T >
1109 template<
typename Index_T >
1120 template<
typename Index_T >
1182 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1206 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1208 : TensorBase_T< order, dim, Data_T >()
1212 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1214 : TensorBase_T< order, dim, Data_T >( data )
1218 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1220 : TensorBase_T< order, dim, Data_T >( data )
1233 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1234 class WTensorFunc< TensorBase_T, 6, dim, Data_T > :
public TensorBase_T< 6, dim, Data_T >
1268 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4, std::size_t i5 );
1282 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4, std::size_t i5 )
const;
1285 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1287 : TensorBase_T< 6, dim, Data_T >()
1291 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1293 : TensorBase_T< 6, dim, Data_T >( data )
1297 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1299 : TensorBase_T< 6, dim, Data_T >( data )
1303 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1305 std::size_t i3, std::size_t i4, std::size_t i5 )
1307 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3, i4, i5 ) );
1310 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1312 std::size_t i3, std::size_t i4, std::size_t i5 )
const
1314 std::size_t p[] = { i0, i1, i2, i3, i4, i5 };
1329 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1330 class WTensorFunc< TensorBase_T, 5, dim, Data_T > :
public TensorBase_T< 5, dim, Data_T >
1344 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4 );
1357 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4 )
const;
1360 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1362 std::size_t i3, std::size_t i4 )
1364 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3, i4 ) );
1367 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1369 std::size_t i3, std::size_t i4 )
const
1371 std::size_t p[] = { i0, i1, i2, i3, i4 };
1386 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1387 class WTensorFunc< TensorBase_T, 4, dim, Data_T > :
public TensorBase_T< 4, dim, Data_T >
1419 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3 );
1431 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3 )
const;
1434 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1436 : TensorBase_T< 4, dim, Data_T >()
1440 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1442 : TensorBase_T< 4, dim, Data_T >( data )
1446 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1448 : TensorBase_T< 4, dim, Data_T >( data )
1452 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1455 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3 ) );
1458 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1461 std::size_t p[] = { i0, i1, i2, i3 };
1475 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1476 class WTensorFunc< TensorBase_T, 3, dim, Data_T > :
public TensorBase_T< 3, dim, Data_T >
1488 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2 );
1499 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2 )
const;
1502 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1505 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2 ) );
1508 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1511 std::size_t p[] = { i0, i1, i2 };
1523 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1524 class WTensorFunc< TensorBase_T, 2, dim, Data_T > :
public TensorBase_T< 2, dim, Data_T >
1554 Data_T& operator() ( std::size_t i0, std::size_t i1 );
1564 Data_T
const& operator() ( std::size_t i0, std::size_t i1 )
const;
1572 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1574 : TensorBase_T< 2, dim, Data_T >()
1578 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1580 : TensorBase_T< 2, dim, Data_T >( data )
1584 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1586 : TensorBase_T< 2, dim, Data_T >( data )
1590 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1593 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1 ) );
1596 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1599 std::size_t p[] = { i0, i1 };
1603 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1607 for( std::size_t i = 0; i < dim; ++i )
1609 for( std::size_t j = 0; j < dim; ++j )
1611 m( i, j ) = this->operator() ( i, j );
1625 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1626 class WTensorFunc< TensorBase_T, 1, dim, Data_T > :
public TensorBase_T< 1, dim, Data_T >
1636 Data_T& operator() ( std::size_t i0 );
1645 Data_T
const& operator() ( std::size_t i0 )
const;
1653 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1656 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0 ) );
1659 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1662 std::size_t p[] = { i0 };
1666 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1671 for( std::size_t k = 0; k < dim; ++k )
1673 v[ k ] = this->operator() ( k );
1687 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1688 class WTensorFunc< TensorBase_T, 0, dim, Data_T > :
public TensorBase_T< 0, dim, Data_T >
1696 Data_T& operator() ();
1703 Data_T
const& operator() ()
const;
1708 operator Data_T()
const;
1711 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1714 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() () );
1717 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1723 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1729 #endif // WTENSORBASE_H
std::size_t getOrder() const
Get the order of this tensor.
static std::size_t getPos(Index_T pos[])
Calculate the position of the element in the data vector.
Data_T & operator[](std::vector< Index_T > const &indices)
Get the element at a specific position.
Data_T m_data
Stores the value.
PositionIndexer()
Standard constructor.
Base class for all higher level values like tensors, vectors, matrices and so on. ...
BOOST_STATIC_ASSERT(dim!=0)
For dim == 0, create an artificial compiler error.
static PositionIndexer const m_indexer
A static PositionIndexer that maps tensor indices to vector positions.
std::size_t getDimension() const
Get the dimension of this tensor.
BOOST_STATIC_ASSERT(dim!=0)
For dim == 0, create an artificial compiler error.
void setValues(WValue< Data_T > const &values)
Set internal data from a WValue.
Data_T m_data
Stores the value.
std::size_t operator[](Index_T pos[]) const
Get the mapped position.
Normal tensor base class.
std::size_t getDimension() const
Get the dimension of this tensor.
Compute the nth power of a value.
boost::array< Data_T, dataSize > m_data
Stores the elements of this tensor lexicographical ordered on their indices, where for each set of pe...
WTensorBase(WTensorBaseSym< 0, dim, Data_T > const &t)
Copy construct a WTensorBase from a WTensorBaseSym.
static std::size_t getPos(Index_T[])
Calculate the position of the element in the data vector.
Implements compile-time calculation of binomial coefficients.
std::size_t getOrder() const
Get the order of this tensor.
WTensorBaseSym(WTensorBaseSym const &t)
Copy constructor.
Matrix template class with variable number of rows and columns.
A class that tests the WTensorFunc template.
WTensorBaseSym const & operator=(WTensorBaseSym const &t)
Copy operator.
bool operator!=(WTensorBase const &other) const
Compare this WTensorBase to another one.
WTensorBase const & operator=(WTensorBase const &t)
Copy operator.
WTensorBase()
Standard constructor.
std::size_t getOrder() const
Get the order of this tensor.
WTensorBase()
Standard constructor.
WTensorFunc()
Default constructor.
Implements functions that should only be defined for certain values of order.
WTensorBaseSym()
Standard constructor.
WTensorBase(WTensorBase const &t)
Copy constructor.
The number of data elements.
size_t size() const
Get number of components the value consists of.
boost::array< Data_T, dataSize > m_data
Stores all elements.
std::size_t getDimension() const
Get the dimension of this tensor.
WTensorBase< order, dim, std::size_t > m_positions
Maps the indices to a vector element position.
Symmetric tensor base class.
The number of elements to store.
A class that maps symmetric tensor indices to vector positions.
std::size_t getOrder() const
Get the order of this tensor.
bool operator==(WTensorBaseSym const &other) const
Compare this WTensorBaseSym to another one.
WTensorBaseSym()
Standard constructor.
std::size_t getDimension() const
Get the dimension of this tensor.
Test class for WTensorBase.
The number of elements to store.
Test class for WTensorBaseSym.
bool operator!=(WTensorBaseSym const &other) const
Compare this WTensorBaseSym to another one.
bool operator==(WTensorBase const &other) const
Compare this WTensorBase to another one.
Data_T & operator[](std::vector< Index_T > const &indices)
Get the element at a specific position.