33 #include <boost/static_assert.hpp>
36 #include <boost/array.hpp>
39 #include "../WAssert.h"
40 #include "WCompileTimeFunctions.h"
52 template< std::
size_t order, std::
size_t dim,
typename Data_T >
69 template< std::
size_t order, std::
size_t dim >
70 inline void positionIterateOneStep( boost::array< std::size_t, order >& pos )
72 WAssert( pos.size() >= order,
"" );
74 for( std::size_t k = order - 1; k > 0; --k )
76 if( pos[ k ] == dim - 1)
104 template< std::
size_t order, std::
size_t dim >
105 inline void positionIterateSortedOneStep( boost::array< std::size_t, order >& pos )
107 WAssert( pos.size() >= order,
"" );
109 for(
int k = order - 1; k > -1; --k )
111 if( pos[ k ] != dim - 1 )
114 for( std::size_t i = k + 1; i < order; ++i )
130 inline void positionIterateSortedOneStep( std::size_t order, std::size_t dim, std::vector< std::size_t >& pos )
132 WAssert( pos.size() >= order,
"" );
134 for(
int k = order - 1; k > -1; --k )
136 if( pos[ k ] != dim - 1 )
139 for( std::size_t i = k + 1; i < order; ++i )
163 template< std::
size_t order, std::
size_t dim,
typename Data_T >
172 friend class WTensorBase< order + 1, dim, Data_T >;
175 friend class ::WTensorBaseTest;
178 friend class ::WTensorFuncTest;
241 template<
typename Index_T >
242 Data_T&
operator[] ( std::vector< Index_T >
const& indices );
251 template<
typename Index_T >
252 Data_T
const&
operator[] ( std::vector< Index_T >
const& indices )
const;
263 template<
typename Index_T >
275 template<
typename Index_T >
276 Data_T
const&
operator[] ( Index_T indices[] )
const;
316 template<
typename Index_T >
317 static inline std::size_t
getPos( Index_T pos[] );
324 template< std::
size_t order, std::
size_t dim,
typename Data_T >
327 m_data.assign( Data_T() );
330 template< std::
size_t order, std::
size_t dim,
typename Data_T >
336 template< std::
size_t order, std::
size_t dim,
typename Data_T >
342 template< std::
size_t order, std::
size_t dim,
typename Data_T >
349 template< std::
size_t order, std::
size_t dim,
typename Data_T >
352 boost::array< std::size_t, order > pos;
355 for( std::size_t k = 0; k <
dataSize; ++k )
357 ( *this )[ &pos[ 0 ] ] = t[ &pos[ 0 ] ];
358 positionIterateOneStep< order, dim >( pos );
364 template< std::
size_t order, std::
size_t dim,
typename Data_T >
370 template< std::
size_t order, std::
size_t dim,
typename Data_T >
376 template< std::
size_t order, std::
size_t dim,
typename Data_T >
377 template<
typename Index_T >
383 template< std::
size_t order, std::
size_t dim,
typename Data_T >
384 template<
typename Index_T >
387 return const_cast< Data_T&
>(
static_cast< WTensorBase const&
>( *this ).operator[] ( indices ) );
390 template< std::
size_t order, std::
size_t dim,
typename Data_T >
391 template<
typename Index_T >
394 WAssert( indices.size() >= order,
"" );
398 template< std::
size_t order, std::
size_t dim,
typename Data_T >
399 template<
typename Index_T >
402 return const_cast< Data_T&
>(
static_cast< WTensorBase const&
>( *this ).operator[] ( indices ) );
405 template< std::
size_t order, std::
size_t dim,
typename Data_T >
406 template<
typename Index_T >
409 for( std::size_t k = 0; k < order; ++k )
411 WAssert( static_cast< std::size_t >( indices[ k ] ) < dim,
"" );
413 std::size_t p =
getPos( indices );
417 template< std::
size_t order, std::
size_t dim,
typename Data_T >
423 template< std::
size_t order, std::
size_t dim,
typename Data_T >
439 template< std::
size_t dim,
typename Data_T >
446 friend class ::WTensorBaseTest;
449 friend class ::WTensorFuncTest;
481 m_data = t.template
operator[]< std::size_t >( NULL );
506 m_data = t.template
operator[]< std::size_t >( NULL );
535 template<
typename Index_T >
546 template<
typename Index_T >
547 Data_T
const&
operator[] ( std::vector< Index_T >
const& )
const
557 template<
typename Index_T >
568 template<
typename Index_T >
605 template<
typename Index_T >
606 static inline std::size_t
getPos( Index_T[] )
644 template< std::
size_t order, std::
size_t dim,
typename Data_T >
653 friend class ::WTensorBaseSymTest;
656 friend class ::WTensorFuncTest;
691 explicit WTensorBaseSym(
const boost::array< Data_T, dataSize >& data );
735 void setValues( boost::array< Data_T, dataSize >
const& values );
744 template<
typename Index_T >
745 Data_T&
operator[] ( std::vector< Index_T >
const& indices );
754 template<
typename Index_T >
755 Data_T
const&
operator[] ( std::vector< Index_T >
const& indices )
const;
766 template<
typename Index_T >
778 template<
typename Index_T >
779 Data_T
const&
operator[] ( Index_T indices[] )
const;
827 template<
typename Index_T >
828 inline std::size_t
operator[] ( Index_T pos[] )
const;
855 template< std::
size_t order, std::
size_t dim,
typename Data_T >
860 template< std::
size_t order, std::
size_t dim,
typename Data_T >
864 std::map< boost::array< std::size_t, order >, std::size_t > m;
868 boost::array< std::size_t, order > pos;
871 for( std::size_t k = 0; k <
dataSize; ++k )
875 m.insert( std::make_pair( pos, k ) );
878 positionIterateSortedOneStep< order, dim >( pos );
884 boost::array< std::size_t, order > _p;
887 for( std::size_t k = 0; k < WPower< dim, order >::value; ++k )
892 std::sort( _p.begin(), _p.end() );
899 WAssert( m.size() ==
dataSize,
"" );
902 positionIterateOneStep< order, dim >( pos );
906 template< std::
size_t order, std::
size_t dim,
typename Data_T >
907 template<
typename Index_T >
910 return m_positions[ pos ];
915 template< std::
size_t order, std::
size_t dim,
typename Data_T >
918 m_data.assign( Data_T() );
921 template< std::
size_t order, std::
size_t dim,
typename Data_T >
924 WAssert(
dataSize ==
m_data.size(),
"Number of given components does not match the order and dimension of this symmetric tensor" );
925 std::copy( &data[ 0 ], &data[ 0 ] + data.
size(), &
m_data[ 0 ] );
928 template< std::
size_t order, std::
size_t dim,
typename Data_T >
934 template< std::
size_t order, std::
size_t dim,
typename Data_T >
940 template< std::
size_t order, std::
size_t dim,
typename Data_T >
947 template< std::
size_t order, std::
size_t dim,
typename Data_T >
953 template< std::
size_t order, std::
size_t dim,
typename Data_T >
959 template< std::
size_t order, std::
size_t dim,
typename Data_T >
962 WAssert( m_data.size() == values.
size(),
"Number of given components does not match the order and dimension of this symmetric tensor" );
963 std::copy( &values[ 0 ], &values[ 0 ] + values.
size(), &m_data[ 0 ] );
966 template< std::
size_t order, std::
size_t dim,
typename Data_T >
969 std::copy( &values[ 0 ], &values[ 0 ] + dataSize, &m_data[ 0 ] );
972 template< std::
size_t order, std::
size_t dim,
typename Data_T >
973 template<
typename Index_T >
976 return const_cast< Data_T&
>(
static_cast< WTensorBaseSym const&
>( *this ).operator[] ( indices ) );
979 template< std::
size_t order, std::
size_t dim,
typename Data_T >
980 template<
typename Index_T >
983 WAssert( indices.size() >= order,
"" );
984 return operator[] ( &indices[ 0 ] );
987 template< std::
size_t order, std::
size_t dim,
typename Data_T >
988 template<
typename Index_T >
991 return const_cast< Data_T&
>(
static_cast< WTensorBaseSym const&
>( *this ).operator[] ( indices ) );
994 template< std::
size_t order, std::
size_t dim,
typename Data_T >
995 template<
typename Index_T >
998 std::size_t p = m_indexer[ indices ];
999 WAssert( p < m_data.size(),
"" );
1003 template< std::
size_t order, std::
size_t dim,
typename Data_T >
1006 return m_data == other.
m_data;
1009 template< std::
size_t order, std::
size_t dim,
typename Data_T >
1012 return m_data != other.
m_data;
1025 template< std::
size_t dim,
typename Data_T >
1028 friend class ::WTensorBaseSymTest;
1029 friend class ::WTensorFuncTest;
1091 template<
typename Index_T >
1102 template<
typename Index_T >
1113 template<
typename Index_T >
1124 template<
typename Index_T >
1186 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1210 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1212 : TensorBase_T< order, dim, Data_T >()
1216 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1218 : TensorBase_T< order, dim, Data_T >( data )
1222 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1224 : TensorBase_T< order, dim, Data_T >( data )
1237 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1238 class WTensorFunc< TensorBase_T, 6, dim, Data_T > :
public TensorBase_T< 6, dim, Data_T >
1272 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 );
1286 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;
1289 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1291 : TensorBase_T< 6, dim, Data_T >()
1295 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1297 : TensorBase_T< 6, dim, Data_T >( data )
1301 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1303 : TensorBase_T< 6, dim, Data_T >( data )
1307 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1309 std::size_t i3, std::size_t i4, std::size_t i5 )
1311 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3, i4, i5 ) );
1314 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1316 std::size_t i3, std::size_t i4, std::size_t i5 )
const
1318 std::size_t p[] = { i0, i1, i2, i3, i4, i5 };
1333 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1334 class WTensorFunc< TensorBase_T, 5, dim, Data_T > :
public TensorBase_T< 5, dim, Data_T >
1348 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4 );
1361 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;
1364 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1366 std::size_t i3, std::size_t i4 )
1368 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3, i4 ) );
1371 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1373 std::size_t i3, std::size_t i4 )
const
1375 std::size_t p[] = { i0, i1, i2, i3, i4 };
1390 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1391 class WTensorFunc< TensorBase_T, 4, dim, Data_T > :
public TensorBase_T< 4, dim, Data_T >
1423 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3 );
1435 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3 )
const;
1438 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1440 : TensorBase_T< 4, dim, Data_T >()
1444 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1446 : TensorBase_T< 4, dim, Data_T >( data )
1450 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1452 : TensorBase_T< 4, dim, Data_T >( data )
1456 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1459 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3 ) );
1462 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1465 std::size_t p[] = { i0, i1, i2, i3 };
1479 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1480 class WTensorFunc< TensorBase_T, 3, dim, Data_T > :
public TensorBase_T< 3, dim, Data_T >
1492 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2 );
1503 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2 )
const;
1506 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1509 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2 ) );
1512 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1515 std::size_t p[] = { i0, i1, i2 };
1527 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1528 class WTensorFunc< TensorBase_T, 2, dim, Data_T > :
public TensorBase_T< 2, dim, Data_T >
1558 Data_T& operator() ( std::size_t i0, std::size_t i1 );
1568 Data_T
const& operator() ( std::size_t i0, std::size_t i1 )
const;
1576 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1578 : TensorBase_T< 2, dim, Data_T >()
1582 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1584 : TensorBase_T< 2, dim, Data_T >( data )
1588 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1590 : TensorBase_T< 2, dim, Data_T >( data )
1594 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1597 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1 ) );
1600 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1603 std::size_t p[] = { i0, i1 };
1607 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1611 for( std::size_t i = 0; i < dim; ++i )
1613 for( std::size_t j = 0; j < dim; ++j )
1615 m( i, j ) = this->operator() ( i, j );
1629 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1630 class WTensorFunc< TensorBase_T, 1, dim, Data_T > :
public TensorBase_T< 1, dim, Data_T >
1640 Data_T& operator() ( std::size_t i0 );
1649 Data_T
const& operator() ( std::size_t i0 )
const;
1657 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1660 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0 ) );
1663 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1666 std::size_t p[] = { i0 };
1670 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1675 for( std::size_t k = 0; k < dim; ++k )
1677 v[ k ] = this->operator() ( k );
1691 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1692 class WTensorFunc< TensorBase_T, 0, dim, Data_T > :
public TensorBase_T< 0, dim, Data_T >
1700 Data_T& operator() ();
1707 Data_T
const& operator() ()
const;
1712 operator Data_T()
const;
1715 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1718 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() () );
1721 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1727 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1733 #endif // WTENSORBASE_H
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.
BOOST_STATIC_ASSERT(dim!=0)
For dim == 0, create an artificial compiler error.
std::size_t getDimension() const
Get the dimension of this tensor.
std::size_t getDimension() const
Get the dimension of this tensor.
Data_T m_data
Stores the value.
std::size_t operator[](Index_T pos[]) const
Get the mapped position.
Normal tensor base class.
Symmetric tensor base class.
void setValues(WValue< Data_T > const &values)
Set internal data from a WValue.
std::size_t getDimension() const
Get the dimension of this tensor.
Compute the nth power of a value.
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()
Standard constructor.
std::size_t getOrder() const
Get the order of this tensor.
bool operator!=(WTensorBase const &other) const
Compare this WTensorBase to another one.
WTensorBase const & operator=(WTensorBase const &t)
Copy operator.
WTensorBase()
Standard constructor.
boost::array< Data_T, dataSize > m_data
Stores the elements of this tensor lexicographical ordered on their indices, where for each set of pe...
std::size_t getOrder() const
Get the order of this tensor.
WTensorBase()
Standard constructor.
bool operator!=(WTensorBaseSym const &other) const
Compare this WTensorBaseSym to another one.
WTensorFunc()
Default constructor.
Implements functions that should only be defined for certain values of order.
WTensorBaseSym const & operator=(WTensorBaseSym const &t)
Copy operator.
bool operator==(WTensorBaseSym const &other) const
Compare this WTensorBaseSym to another one.
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.
static PositionIndexer const m_indexer
A static PositionIndexer that maps tensor indices to vector positions.
boost::array< Data_T, dataSize > m_data
Stores all elements.
WTensorBase< order, dim, std::size_t > m_positions
Maps the indices to a vector element position.
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.
std::size_t getDimension() const
Get the dimension of this tensor.
Test class for WTensorBase.
Test class for WTensorBaseSym.
The number of elements to store.
Data_T & operator[](std::vector< Index_T > const &indices)
Get the element at a specific position.
bool operator==(WTensorBase const &other) const
Compare this WTensorBase to another one.