#ifndef SPECIALISED_CONSTRUCTORS_H #define SPECIALISED_CONSTRUCTORS_H //----------------------------------------------------------------------------------------------------------// template::type=0> FASTOR_INLINE Tensor(const TensorFixedViewExpr2D,Seq0,Seq1,2>& src) { using scalar_type_ = T; constexpr FASTOR_INDEX Stride_ = simd_size_v; #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr FASTOR_INDEX M = get_value<1,Rest...>::value; constexpr FASTOR_INDEX N = get_value<2,Rest...>::value; for (FASTOR_INDEX i = 0; i (i,j).store(&_data[i*N+j], false); } for (; j < N; ++j) { _data[i*N+j] = src.template eval_s(i,j); } } } template = false> FASTOR_INLINE Tensor(const TensorFixedViewExprnD,Fseqs...>& src) { #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); #endif constexpr int DimensionHolder[dimension_t::value] = {Rest...}; std::array as = {}; int jt, counter=0; if (src.is_vectorisable() || src.is_strided_vectorisable()) { using V = SIMDVector; V _vec; while(counter < size()) { _vec = src.template teval(as); _vec.store(&_data[counter],false); counter+=V::Size; for(jt = dimension_t::value-1; jt>=0; jt--) { if (jt == dimension_t::value-1) as[jt]+=V::Size; else as[jt] +=1; if(as[jt](as); counter++; for(jt = dimension_t::value-1; jt>=0; jt--) { as[jt] +=1; if(as[jt] && !has_tensor_fixed_view_nd_v && has_tensor_fixed_view_2d_v && DIMS==sizeof...(Rest) && requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { // const typename Derived::result_type& tmp = evaluate(src_.self()); FASTOR_ASSERT(src_.self().size()==this->size(), "TENSOR SIZE MISMATCH"); assign(*this,src_.self()); } template && !has_tensor_fixed_view_nd_v && has_tensor_fixed_view_2d_v && DIMS==sizeof...(Rest) && !requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { using scalar_type_ = typename scalar_type_finder::type; constexpr FASTOR_INDEX Stride_ = simd_size_v; const Derived &src = src_.self(); #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr FASTOR_INDEX M = get_value<1,Rest...>::value; constexpr FASTOR_INDEX N = get_value<2,Rest...>::value; FASTOR_IF_CONSTEXPR(!is_boolean_expression_v) { for (FASTOR_INDEX i = 0; i (i,j).store(&_data[i*N+j], false); } for (; j (i,j); } } } else { for (FASTOR_INDEX i = 0; i (i,j); } } } } template && has_tensor_fixed_view_nd_v && DIMS!=2 && DIMS==sizeof...(Rest) && requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { FASTOR_ASSERT(src_.self().size()==this->size(), "TENSOR SIZE MISMATCH"); assign(*this,src_.self()); } template && has_tensor_fixed_view_nd_v && DIMS!=2 && DIMS==sizeof...(Rest) && !requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { const Derived &src = src_.self(); #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr int DimensionHolder[dimension_t::value] = {Rest...}; std::array as = {}; int jt, counter=0; while(counter < size()) { _data[counter] = src.template teval_s(as); counter++; for(jt = dimension_t::value-1; jt>=0; jt--) { as[jt] +=1; if(as[jt] = false> FASTOR_INLINE Tensor(const TensorViewExpr,2>& src) { using scalar_type_ = T; constexpr FASTOR_INDEX Stride_ = simd_size_v; #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr FASTOR_INDEX M = get_value<1,Rest...>::value; constexpr FASTOR_INDEX N = get_value<2,Rest...>::value; for (FASTOR_INDEX i = 0; i (i,j).store(&_data[i*N+j], false); } for (; j < N; ++j) { _data[i*N+j] = src.template eval_s(i,j); } } } template::value,bool> = false> FASTOR_INLINE Tensor(const TensorViewExpr,sizeof...(Rest)>& src) { #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr int DimensionHolder[dimension_t::value] = {Rest...}; std::array as = {}; int jt, counter=0; if (src.is_vectorisable() || src.is_strided_vectorisable()) { using V = SIMDVector; V _vec; while(counter < size()) { _vec = src.template teval(as); _vec.store(&_data[counter],false); counter+=V::Size; for(jt = dimension_t::value-1; jt>=0; jt--) { if (jt == dimension_t::value-1) as[jt]+=V::Size; else as[jt] +=1; if(as[jt](as); counter++; for(jt = dimension_t::value-1; jt>=0; jt--) { as[jt] +=1; if(as[jt] && DIMS==2 && DIMS==sizeof...(Rest) && requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { FASTOR_ASSERT(src_.self().size()==this->size(), "TENSOR SIZE MISMATCH"); assign(*this,src_.self()); } template && DIMS==2 && DIMS==sizeof...(Rest) && !requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { using scalar_type_ = typename scalar_type_finder::type; constexpr FASTOR_INDEX Stride_ = simd_size_v; const Derived &src = src_.self(); #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr FASTOR_INDEX M = get_value<1,Rest...>::value; constexpr FASTOR_INDEX N = get_value<2,Rest...>::value; FASTOR_IF_CONSTEXPR(!is_boolean_expression_v) { for (FASTOR_INDEX i = 0; i (i,j).store(&_data[i*N+j], false); } for (; j < N; ++j) { _data[i*N+j] = src.template eval_s(i,j); } } } else { for (FASTOR_INDEX i = 0; i (i,j); } } } } template && DIMS!=2 && DIMS==sizeof...(Rest) && requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { FASTOR_ASSERT(src_.self().size()==this->size(), "TENSOR SIZE MISMATCH"); assign(*this,src_.self()); } template && DIMS!=2 && DIMS==sizeof...(Rest) && !requires_evaluation_v,bool> = false> FASTOR_INLINE Tensor(const AbstractTensor& src_) { // using scalar_type_ = typename scalar_type_finder::type; // constexpr FASTOR_INDEX Stride_ = simd_size_v; const Derived &src = src_.self(); #ifndef NDEBUG FASTOR_ASSERT(src.size()==this->size(), "TENSOR SIZE MISMATCH"); for (FASTOR_INDEX i = 0; idimension(i), "TENSOR SHAPE MISMATCH"); } #endif constexpr int DimensionHolder[dimension_t::value] = {Rest...}; std::array as = {}; int jt, counter=0; while(counter < size()) { _data[counter] = src.template teval_s(as); counter++; for(jt = dimension_t::value-1; jt>=0; jt--) { as[jt] +=1; if(as[jt]; // while(counter < size()) // { // const FASTOR_INDEX remainder = DimensionHolder[dimension_t::value-1] - as[dimension_t::value-1]; // if (remainder > V::Size) { // // V _vec = src.template eval(counter); // V _vec = src.template teval(as); // _vec.store(&_data[counter],false); // counter+=V::Size; // } // else { // // _data[counter] = src.template eval_s(counter); // _data[counter] = src.template teval_s(as); // counter++; // } // for(jt = dimension_t::value-1; jt>=0; jt--) // { // if (jt == dimension_t::value-1 && remainder > V::Size) as[jt]+=V::Size; // else as[jt] +=1; // if(as[jt]