21#include <Kokkos_Core.hpp>
31template <
typename Types,
int VectorLength>
37struct is_soa_impl :
public std::false_type
41template <
class DataTypes,
int VectorLength>
42struct is_soa_impl<
SoA<DataTypes, VectorLength>> :
public std::true_type
49struct is_soa :
public is_soa_impl<typename std::remove_cv<T>::type>::type
62template <
typename T, std::
size_t Rank,
int VectorLength>
63struct InnerArrayTypeImpl;
66template <
typename T,
int VectorLength>
67struct InnerArrayTypeImpl<T, 0, VectorLength>
69 using value_type =
typename std::remove_all_extents<T>::type;
70 using type = value_type[VectorLength];
74template <
typename T,
int VectorLength>
75struct InnerArrayTypeImpl<T, 1, VectorLength>
77 using value_type =
typename std::remove_all_extents<T>::type;
78 static constexpr std::size_t D0 = std::extent<T, 0>::value;
79 using type = value_type[D0][VectorLength];
83template <
typename T,
int VectorLength>
84struct InnerArrayTypeImpl<T, 2, VectorLength>
86 using value_type =
typename std::remove_all_extents<T>::type;
87 static constexpr std::size_t D0 = std::extent<T, 0>::value;
88 static constexpr std::size_t D1 = std::extent<T, 1>::value;
89 using type = value_type[D0][D1][VectorLength];
93template <
typename T,
int VectorLength>
94struct InnerArrayTypeImpl<T, 3, VectorLength>
96 using value_type =
typename std::remove_all_extents<T>::type;
97 static constexpr std::size_t D0 = std::extent<T, 0>::value;
98 static constexpr std::size_t D1 = std::extent<T, 1>::value;
99 static constexpr std::size_t D2 = std::extent<T, 2>::value;
100 using type = value_type[D0][D1][D2][VectorLength];
105template <
typename T,
int VectorLength>
109 typename InnerArrayTypeImpl<T, std::rank<T>::value, VectorLength>::type;
120template <std::
size_t M,
int VectorLength,
typename T>
123 using array_type =
typename InnerArrayType<T, VectorLength>::type;
129template <
int VectorLength,
typename Sequence,
typename... Types>
132template <
int VectorLength, std::size_t... Indices,
typename... Types>
133struct SoAImpl<VectorLength, std::index_sequence<Indices...>, Types...>
134 : StructMember<Indices, VectorLength, Types>...
140template <std::
size_t M,
class SoA_t>
141KOKKOS_FORCEINLINE_FUNCTION
const typename SoA_t::template base<M>&
142soaMemberCast(
const SoA_t& soa )
144 static_assert( is_soa<SoA_t>::value,
"soaMemberCast only for SoAs" );
145 return static_cast<const typename SoA_t::template base<M>&
>( soa );
148template <std::
size_t M,
class SoA_t>
149KOKKOS_FORCEINLINE_FUNCTION
typename SoA_t::template base<M>&
150soaMemberCast( SoA_t& soa )
152 static_assert( is_soa<SoA_t>::value,
"soaMemberCast only for SoAs" );
153 return static_cast<typename SoA_t::template base<M>&
>( soa );
158template <std::
size_t M,
class SoA_t>
159typename SoA_t::template member_pointer_type<M> soaMemberPtr( SoA_t* p )
161 static_assert( is_soa<SoA_t>::value,
"soaMemberPtr only for SoAs" );
162 void* member =
static_cast<typename SoA_t::template base<M>*
>( p );
163 return static_cast<typename SoA_t::template member_pointer_type<M>
>(
176template <std::
size_t M,
class SoA_t>
177KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
179 typename SoA_t::template member_reference_type<M>>::type
180get( SoA_t& soa,
const std::size_t a )
182 return Impl::soaMemberCast<M>( soa )._data[a];
186template <std::
size_t M,
class SoA_t>
187KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
188 is_soa<SoA_t>::value,
189 typename SoA_t::template member_const_reference_type<M>>::type
190get(
const SoA_t& soa,
const std::size_t a )
192 return Impl::soaMemberCast<M>( soa )._data[a];
196template <std::
size_t M,
class SoA_t>
197KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
198 is_soa<SoA_t>::value,
199 typename SoA_t::template member_reference_type<M>>::type
200get( SoA_t& soa,
const std::size_t a,
const std::size_t d0 )
202 return Impl::soaMemberCast<M>( soa )._data[d0][a];
206template <std::
size_t M,
class SoA_t>
207KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
208 is_soa<SoA_t>::value,
209 typename SoA_t::template member_const_reference_type<M>>::type
210get(
const SoA_t& soa,
const std::size_t a,
const std::size_t d0 )
212 return Impl::soaMemberCast<M>( soa )._data[d0][a];
216template <std::
size_t M,
class SoA_t>
217KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
218 is_soa<SoA_t>::value,
219 typename SoA_t::template member_reference_type<M>>::type
220get( SoA_t& soa,
const std::size_t a,
const std::size_t d0,
221 const std::size_t d1 )
223 return Impl::soaMemberCast<M>( soa )._data[d0][d1][a];
227template <std::
size_t M,
class SoA_t>
228KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
229 is_soa<SoA_t>::value,
230 typename SoA_t::template member_const_reference_type<M>>::type
231get(
const SoA_t& soa,
const std::size_t a,
const std::size_t d0,
232 const std::size_t d1 )
234 return Impl::soaMemberCast<M>( soa )._data[d0][d1][a];
238template <std::
size_t M,
class SoA_t>
239KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
240 is_soa<SoA_t>::value,
241 typename SoA_t::template member_reference_type<M>>::type
242get( SoA_t& soa,
const std::size_t a,
const std::size_t d0,
243 const std::size_t d1,
const std::size_t d2 )
245 return Impl::soaMemberCast<M>( soa )._data[d0][d1][d2][a];
249template <std::
size_t M,
class SoA_t>
250KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
251 is_soa<SoA_t>::value,
252 typename SoA_t::template member_const_reference_type<M>>::type
253get(
const SoA_t& soa,
const std::size_t a,
const std::size_t d0,
254 const std::size_t d1,
const std::size_t d2 )
256 return Impl::soaMemberCast<M>( soa )._data[d0][d1][d2][a];
269template <
typename... Types,
int VectorLength>
271 : Impl::SoAImpl<VectorLength, std::make_index_sequence<sizeof...( Types )>,
287 template <std::
size_t M>
291 template <std::
size_t M>
293 typename std::remove_all_extents<member_data_type<M>>::type;
296 template <std::
size_t M>
300 template <std::
size_t M>
304 template <std::
size_t M>
306 typename std::add_pointer<member_value_type<M>>::type;
309 template <std::
size_t M>
310 using base = Impl::StructMember<M, vector_length, member_data_type<M>>;
322 template <std::
size_t M>
323 KOKKOS_FORCEINLINE_FUNCTION
constexpr std::size_t
rank()
const
325 return std::rank<member_data_type<M>>::value;
337 template <std::
size_t M, std::
size_t D>
338 KOKKOS_FORCEINLINE_FUNCTION
constexpr std::size_t
extent()
const
340 return std::extent<member_data_type<M>, D>::value;
357template <std::size_t M,
int DstVectorLength,
int SrcVectorLength,
359KOKKOS_INLINE_FUNCTION
typename std::enable_if<
360 ( 0 == std::rank<
typename MemberTypeAtIndex<
361 M, MemberTypes<Types...>>::type>::value ),
363soaElementMemberCopy( SoA<MemberTypes<Types...>, DstVectorLength>& dst,
364 const std::size_t dst_idx,
365 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
366 const std::size_t src_idx )
372template <std::size_t M,
int DstVectorLength,
int SrcVectorLength,
374KOKKOS_INLINE_FUNCTION
typename std::enable_if<
375 ( 1 == std::rank<
typename MemberTypeAtIndex<
376 M, MemberTypes<Types...>>::type>::value ),
378soaElementMemberCopy( SoA<MemberTypes<Types...>, DstVectorLength>& dst,
379 const std::size_t dst_idx,
380 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
381 const std::size_t src_idx )
383 for ( std::size_t i0 = 0; i0 < dst.template extent<M, 0>(); ++i0 )
384 get<M>( dst, dst_idx, i0 ) =
get<M>( src, src_idx, i0 );
388template <std::size_t M,
int DstVectorLength,
int SrcVectorLength,
390KOKKOS_INLINE_FUNCTION
typename std::enable_if<
391 ( 2 == std::rank<
typename MemberTypeAtIndex<
392 M, MemberTypes<Types...>>::type>::value ),
394soaElementMemberCopy( SoA<MemberTypes<Types...>, DstVectorLength>& dst,
395 const std::size_t dst_idx,
396 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
397 const std::size_t src_idx )
399 for ( std::size_t i0 = 0; i0 < dst.template extent<M, 0>(); ++i0 )
400 for ( std::size_t i1 = 0; i1 < dst.template extent<M, 1>(); ++i1 )
401 get<M>( dst, dst_idx, i0, i1 ) =
get<M>( src, src_idx, i0, i1 );
405template <std::size_t M,
int DstVectorLength,
int SrcVectorLength,
407KOKKOS_INLINE_FUNCTION
typename std::enable_if<
408 ( 3 == std::rank<
typename MemberTypeAtIndex<
409 M, MemberTypes<Types...>>::type>::value ),
411soaElementMemberCopy( SoA<MemberTypes<Types...>, DstVectorLength>& dst,
412 const std::size_t dst_idx,
413 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
414 const std::size_t src_idx )
416 for ( std::size_t i0 = 0; i0 < dst.template extent<M, 0>(); ++i0 )
417 for ( std::size_t i1 = 0; i1 < dst.template extent<M, 1>(); ++i1 )
418 for ( std::size_t i2 = 0; i2 < dst.template extent<M, 2>(); ++i2 )
419 get<M>( dst, dst_idx, i0, i1, i2 ) =
420 get<M>( src, src_idx, i0, i1, i2 );
425template <std::size_t M,
int DstVectorLength,
int SrcVectorLength,
427KOKKOS_INLINE_FUNCTION
void soaElementCopy(
428 SoA<MemberTypes<Types...>, DstVectorLength>& dst,
const std::size_t dst_idx,
429 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
430 const std::size_t src_idx, std::integral_constant<std::size_t, M> )
432 soaElementMemberCopy<M>( dst, dst_idx, src, src_idx );
433 soaElementCopy( dst, dst_idx, src, src_idx,
434 std::integral_constant<std::size_t, M - 1>() );
437template <
int DstVectorLength,
int SrcVectorLength,
typename... Types>
438KOKKOS_INLINE_FUNCTION
void soaElementCopy(
439 SoA<MemberTypes<Types...>, DstVectorLength>& dst,
const std::size_t dst_idx,
440 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
441 const std::size_t src_idx, std::integral_constant<std::size_t, 0> )
443 soaElementMemberCopy<0>( dst, dst_idx, src, src_idx );
447template <
int DstVectorLength,
int SrcVectorLength,
typename... Types>
448KOKKOS_INLINE_FUNCTION
void
449tupleCopy( SoA<MemberTypes<Types...>, DstVectorLength>& dst,
450 const std::size_t dst_idx,
451 const SoA<MemberTypes<Types...>, SrcVectorLength>& src,
452 const std::size_t src_idx )
455 dst, dst_idx, src, src_idx,
456 std::integral_constant<std::size_t,
sizeof...( Types ) - 1>() );
AoSoA tuple member types.
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
KOKKOS_FORCEINLINE_FUNCTION std::enable_if< is_parameter_pack< ParameterPack_t >::value, typenameParameterPack_t::templatevalue_type< N > & >::type get(ParameterPack_t &pp)
Get an element from a parameter pack.
Definition Cabana_ParameterPack.hpp:129
Get the type of the member at a given index.
Definition Cabana_MemberTypes.hpp:75
General sequence of types for SoA and AoSoA member data.
Definition Cabana_MemberTypes.hpp:28
static constexpr std::size_t size
Definition Cabana_MemberTypes.hpp:30
KOKKOS_FORCEINLINE_FUNCTION constexpr std::size_t extent() const
Get the extent of a given member data dimension.
Definition Cabana_SoA.hpp:338
static constexpr std::size_t max_supported_rank
The maximum rank supported for member types.
Definition Cabana_SoA.hpp:284
MemberTypes< Types... > member_types
Member data types.
Definition Cabana_SoA.hpp:278
KOKKOS_FORCEINLINE_FUNCTION constexpr std::size_t rank() const
Get the rank of the data for a given member at index M.
Definition Cabana_SoA.hpp:323
member_value_type< M > const & member_const_reference_type
Const reference type at a given index M.
Definition Cabana_SoA.hpp:301
Impl::StructMember< M, vector_length, member_data_type< M > > base
Base type.
Definition Cabana_SoA.hpp:310
typename std::add_pointer< member_value_type< M > >::type member_pointer_type
Pointer type at a given index M.
Definition Cabana_SoA.hpp:305
typename std::remove_all_extents< member_data_type< M > >::type member_value_type
Value type at a given index M.
Definition Cabana_SoA.hpp:292
member_value_type< M > & member_reference_type
Reference type at a given index M.
Definition Cabana_SoA.hpp:297
static constexpr int vector_length
Vector length.
Definition Cabana_SoA.hpp:275
typename MemberTypeAtIndex< M, member_types >::type member_data_type
Member data type.
Definition Cabana_SoA.hpp:288
static constexpr std::size_t number_of_members
Number of member types.
Definition Cabana_SoA.hpp:281
Definition Cabana_SoA.hpp:32
SoA static type checker.
Definition Cabana_SoA.hpp:50