#ifndef TENSOR_METHODS_NONCONST_H #define TENSOR_METHODS_NONCONST_H FASTOR_INLINE void fill(T num0) { FASTOR_INDEX i = 0UL; using V = simd_vector_type; V _vec(num0); for (; i(num0); // using V = SIMDVector; // V _vec; // FASTOR_INDEX i=0; // for (; ifill(static_cast(1)); } FASTOR_INLINE void eye2() { // Second order identity tensor (identity matrices) static_assert(sizeof...(Rest)==2, "CANNOT BUILD AN IDENTITY TENSOR"); static_assert(no_of_unique::value==1, "TENSOR MUST BE UNIFORM"); constexpr FASTOR_INDEX N = get_value<2,Rest...>::value; zeros(); for (FASTOR_INDEX i=0; i=2, "CANNOT BUILD AN IDENTITY TENSOR"); static_assert(no_of_unique::value==1, "TENSOR MUST BE UNIFORM"); zeros(); constexpr int ndim = sizeof...(Rest); constexpr std::array maxes_a = {Rest...}; std::array products; std::fill(products.begin(),products.end(),0); for (int j=ndim-1; j>0; --j) { int num = maxes_a[ndim-1]; for (int k=0; k(1); } } FASTOR_INLINE void random() { //! Populate tensor with random FP numbers for (FASTOR_INDEX i=0; i; V vec; FASTOR_INDEX i = 0; for (; i< ROUND_DOWN(size(),V::Size); i+=V::Size) { vec.load(&tmp[size() - i - V::Size],false); vec.reverse().store(&_data[i],false); } for (; i< size(); ++i) { _data[i] = tmp[size()-i-1]; } } #endif // TENSOR_METHODS_NONCONST_H #ifndef TENSOR_METHODS_CONST_H #define TENSOR_METHODS_CONST_H FASTOR_INLINE T sum() const { if ((size()==0) || (size()==1)) return _data[0]; using V = SIMDVector; V vec = static_cast(0); V _vec_in; FASTOR_INDEX i = 0; for (; i(0); for (; i< size(); ++i) { scalar += _data[i]; } return vec.sum() + scalar; } FASTOR_INLINE T product() const { if ((size()==0) || (size()==1)) return _data[0]; using V = SIMDVector; FASTOR_INDEX i = 0; V vec = static_cast(1); for (; i< ROUND_DOWN(size(),V::Size); i+=V::Size) { vec *= V(&_data[i],false); } T scalar = static_cast(1); for (; i< size(); ++i) { scalar *= _data[i]; } return vec.product()*scalar; } #endif // TENSOR_METHODS_CONST_H