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
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.