30 #ifndef KOKKOS_DYN_RANK_VIEW_SACADO_FAD_HPP
31 #define KOKKOS_DYN_RANK_VIEW_SACADO_FAD_HPP
38 #if defined(HAVE_SACADO_KOKKOS)
42 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
43 #define KOKKOS_IMPL_PUBLIC_INCLUDE
44 #define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
48 #include "Kokkos_Core_fwd.hpp"
49 #include "Kokkos_Layout.hpp"
51 #ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
52 #undef KOKKOS_IMPL_PUBLIC_INCLUDE
53 #undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
58 template<
class DataType ,
class ... Properties >
61 template<
class DataType ,
class ... Properties >
66 template<
class Space,
class T,
class ... P>
71 template <
typename view_type>
72 struct is_dynrankview_fad {
static const bool value =
false; };
74 template <
typename view_type>
75 struct is_dynrankview_fad_contiguous {
static const bool value =
false; };
79 #if defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
88 template<
class T ,
class ... P >
90 typename Kokkos::DynRankView<
T,P...>::HostMirror
92 const Kokkos::DynRankView<T,P...> & src,
93 typename std::enable_if<
94 ( std::is_same<
typename ViewTraits<T,P...>::specialize ,
95 Kokkos::Impl::ViewSpecializeSacadoFad >::
value ||
96 std::is_same<
typename ViewTraits<T,P...>::specialize ,
97 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::
value ) &&
98 !std::is_same<
typename Kokkos::ViewTraits<T,P...>::array_layout,
99 Kokkos::LayoutStride >::
value >::type * = 0);
102 template<
class T ,
class ... P >
104 typename Kokkos::DynRankView<
T,P...>::HostMirror
106 const Kokkos::DynRankView<T,P...> & src,
107 typename std::enable_if<
108 ( std::is_same<
typename ViewTraits<T,P...>::specialize ,
109 Kokkos::Impl::ViewSpecializeSacadoFad >::
value ||
110 std::is_same<
typename ViewTraits<T,P...>::specialize ,
111 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::
value ) &&
112 std::is_same<
typename Kokkos::ViewTraits<T,P...>::array_layout,
113 Kokkos::LayoutStride >::
value >::type * = 0);
115 template<
class Space,
class T,
class ... P>
116 typename Impl::MirrorDRVType<Space,
T,P ...>::view_type
119 const Kokkos::DynRankView<T,P...> & src,
120 typename std::enable_if<
121 std::is_same<
typename ViewTraits<T,P...>::specialize ,
122 Kokkos::Impl::ViewSpecializeSacadoFad >::
value ||
123 std::is_same<
typename ViewTraits<T,P...>::specialize ,
124 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::
value >::type * = 0);
128 template <
unsigned N,
typename T,
typename... Args>
129 KOKKOS_FUNCTION
auto as_view_of_rank_n(
130 DynRankView<T, Args...> v,
131 typename std::enable_if<
132 ( std::is_same<
typename ViewTraits<T,Args...>::specialize,
133 Kokkos::Impl::ViewSpecializeSacadoFad >::
value ||
134 std::is_same<
typename ViewTraits<T,Args...>::specialize ,
135 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::
value )
142 #include "Kokkos_DynRankView.hpp"
148 struct DynRankDimTraits<Kokkos::Impl::ViewSpecializeSacadoFad> {
150 enum :
size_t{unspecified = ~size_t(0)};
154 KOKKOS_INLINE_FUNCTION
155 static size_t computeRank(
const size_t N0
165 ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified && N2 == unspecified && N1 == unspecified && N0 == unspecified) ? 0
166 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified && N2 == unspecified && N1 == unspecified) ? 0
167 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified && N2 == unspecified) ? 1
168 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified) ? 2
169 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified) ? 3
170 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified) ? 4
171 : ( (N7 == unspecified && N6 == unspecified) ? 5
172 : ( (N7 == unspecified) ? 6
177 template <
typename Layout>
178 KOKKOS_INLINE_FUNCTION
179 static size_t computeRank(
const Layout& layout )
181 return computeRank( layout.dimension[0]
182 , layout.dimension[1]
183 , layout.dimension[2]
184 , layout.dimension[3]
185 , layout.dimension[4]
186 , layout.dimension[5]
187 , layout.dimension[6]
188 , layout.dimension[7] );
192 template <
typename Layout,
typename ... P>
193 KOKKOS_INLINE_FUNCTION
194 static size_t computeRank(
const ViewCtorProp<P...>& ,
const Layout& layout )
196 size_t rank = computeRank( layout.dimension[0]
197 , layout.dimension[1]
198 , layout.dimension[2]
199 , layout.dimension[3]
200 , layout.dimension[4]
201 , layout.dimension[5]
202 , layout.dimension[6]
203 , layout.dimension[7] );
206 enum { test_traits_check = Kokkos::Impl::check_has_common_view_alloc_prop< P... >
::value };
207 return (test_traits_check ==
true) ? rank+1 : rank;
213 template <
typename Layout>
214 KOKKOS_INLINE_FUNCTION
217 Layout l( layout.dimension[0] != unspecified ? layout.dimension[0] : 1
218 , layout.dimension[1] != unspecified ? layout.dimension[1] : 1
219 , layout.dimension[2] != unspecified ? layout.dimension[2] : 1
220 , layout.dimension[3] != unspecified ? layout.dimension[3] : 1
221 , layout.dimension[4] != unspecified ? layout.dimension[4] : 1
222 , layout.dimension[5] != unspecified ? layout.dimension[5] : 1
223 , layout.dimension[6] != unspecified ? layout.dimension[6] : 1
224 , layout.dimension[7] != unspecified ? layout.dimension[7] : 1 );
225 const unsigned fad_dim = computeRank(layout);
226 const size_t fad_size = layout.dimension[
fad_dim];
228 l.dimension[7] = fad_size;
234 template <
typename Layout>
235 KOKKOS_INLINE_FUNCTION
238 Layout l( layout.dimension[0] != unspecified ? layout.dimension[0] : 1
240 , layout.dimension[1] != unspecified ? layout.dimension[1] : 1
242 , layout.dimension[2] != unspecified ? layout.dimension[2] : 1
244 , layout.dimension[3] != unspecified ? layout.dimension[3] : 1
246 , layout.dimension[4] != unspecified ? layout.dimension[4] : 1
248 , layout.dimension[5] != unspecified ? layout.dimension[5] : 1
250 , layout.dimension[6] != unspecified ? layout.dimension[6] : 1
252 , layout.dimension[7] != unspecified ? layout.dimension[7] : 1
255 const unsigned fad_dim = computeRank(layout);
256 const size_t fad_size = layout.dimension[
fad_dim];
258 l.dimension[7] = fad_size;
259 const size_t fad_stride = layout.stride[
fad_dim];
261 l.stride[7] = fad_stride;
268 template <
typename Traits,
typename ... P>
269 KOKKOS_INLINE_FUNCTION
272 using Layout =
typename Traits::array_layout;
274 Layout l( layout.dimension[0] != unspecified ? layout.dimension[0] : 1
275 , layout.dimension[1] != unspecified ? layout.dimension[1] : 1
276 , layout.dimension[2] != unspecified ? layout.dimension[2] : 1
277 , layout.dimension[3] != unspecified ? layout.dimension[3] : 1
278 , layout.dimension[4] != unspecified ? layout.dimension[4] : 1
279 , layout.dimension[5] != unspecified ? layout.dimension[5] : 1
280 , layout.dimension[6] != unspecified ? layout.dimension[6] : 1
281 , layout.dimension[7] != unspecified ? layout.dimension[7] : 1 );
283 enum { test_traits_check = Kokkos::Impl::check_has_common_view_alloc_prop< P... >
::value };
284 if (test_traits_check ==
true) {
285 l.dimension[7] = compute_fad_dim_from_alloc_prop<P...>::eval(arg_prop);
288 const unsigned fad_dim = computeRank(layout);
289 const size_t fad_size = layout.dimension[
fad_dim];
291 l.dimension[7] = fad_size;
299 template <
typename Traits,
typename ... P>
300 KOKKOS_INLINE_FUNCTION
303 using Layout =
typename Traits::array_layout;
305 Layout l( layout.dimension[0] != unspecified ? layout.dimension[0] : 1
307 , layout.dimension[1] != unspecified ? layout.dimension[1] : 1
309 , layout.dimension[2] != unspecified ? layout.dimension[2] : 1
311 , layout.dimension[3] != unspecified ? layout.dimension[3] : 1
313 , layout.dimension[4] != unspecified ? layout.dimension[4] : 1
315 , layout.dimension[5] != unspecified ? layout.dimension[5] : 1
317 , layout.dimension[6] != unspecified ? layout.dimension[6] : 1
319 , layout.dimension[7] != unspecified ? layout.dimension[7] : 1
323 enum { test_traits_check = Kokkos::Impl::check_has_common_view_alloc_prop< P... >
::value };
324 const unsigned fad_dim = computeRank(layout);
325 if (test_traits_check ==
true) {
327 l.dimension[7] = compute_fad_dim_from_alloc_prop<P...>::eval(arg_prop);
330 const size_t fad_size = layout.dimension[
fad_dim];
332 l.dimension[7] = fad_size;
334 const size_t fad_stride = layout.stride[
fad_dim];
336 l.stride[7] = fad_stride;
343 template <
typename ViewType,
typename ViewArg>
344 static ViewType createView(
const ViewArg& arg
354 typename ViewType::array_layout l( N0, N1, N2, N3, N4, N5, N6, N7 );
355 typename ViewType::array_layout l_fad = createLayout(l);
364 , l_fad.dimension[7] );
374 template <
unsigned>
struct AssignDim7 {
375 template <
typename Dst>
376 KOKKOS_INLINE_FUNCTION
377 static void eval(Dst& dst,
const size_t src_dim) {}
379 template <>
struct AssignDim7<0u> {
380 template <
typename Dst>
381 KOKKOS_INLINE_FUNCTION
382 static void eval(Dst& dst,
const size_t src_dim) {
388 template <
unsigned,
unsigned>
struct AssignFadDimStride {};
389 template <
unsigned StaticDim>
struct AssignFadDimStride<0u,StaticDim> {
390 template <
typename Src,
typename Dst>
391 KOKKOS_INLINE_FUNCTION
392 static void eval(Dst& dst,
const Src& src) {
393 dst.m_stride.S0 = 0 ;
394 dst.m_stride.S1 = 0 ;
395 dst.m_stride.S2 = 0 ;
396 dst.m_stride.S3 = 0 ;
397 dst.m_stride.S4 = 0 ;
398 dst.m_stride.S5 = 0 ;
399 dst.m_stride.S6 = 0 ;
400 dst.m_stride.S7 = src.m_stride.S0 ;
409 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N0 );
412 template <
unsigned StaticDim>
struct AssignFadDimStride<1u,StaticDim> {
413 template <
typename Src,
typename Dst>
414 KOKKOS_INLINE_FUNCTION
415 static void eval(Dst& dst,
const Src& src) {
416 dst.m_stride.S0 = src.m_stride.S0 ;
417 dst.m_stride.S1 = 0 ;
418 dst.m_stride.S2 = 0 ;
419 dst.m_stride.S3 = 0 ;
420 dst.m_stride.S4 = 0 ;
421 dst.m_stride.S5 = 0 ;
422 dst.m_stride.S6 = 0 ;
423 dst.m_stride.S7 = src.m_stride.S1 ;
425 dst.m_dim.N0 = src.m_dim.N0 ;
432 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N1 );
435 template <
unsigned StaticDim>
struct AssignFadDimStride<2u,StaticDim> {
436 template <
typename Src,
typename Dst>
437 KOKKOS_INLINE_FUNCTION
438 static void eval(Dst& dst,
const Src& src) {
439 dst.m_stride.S0 = src.m_stride.S0 ;
440 dst.m_stride.S1 = src.m_stride.S1 ;
441 dst.m_stride.S2 = 0 ;
442 dst.m_stride.S3 = 0 ;
443 dst.m_stride.S4 = 0 ;
444 dst.m_stride.S5 = 0 ;
445 dst.m_stride.S6 = 0 ;
446 dst.m_stride.S7 = src.m_stride.S2 ;
448 dst.m_dim.N0 = src.m_dim.N0 ;
449 dst.m_dim.N1 = src.m_dim.N1 ;
455 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N2 );
458 template <
unsigned StaticDim>
struct AssignFadDimStride<3u,StaticDim> {
459 template <
typename Src,
typename Dst>
460 KOKKOS_INLINE_FUNCTION
461 static void eval(Dst& dst,
const Src& src) {
462 dst.m_stride.S0 = src.m_stride.S0 ;
463 dst.m_stride.S1 = src.m_stride.S1 ;
464 dst.m_stride.S2 = src.m_stride.S2 ;
465 dst.m_stride.S3 = 0 ;
466 dst.m_stride.S4 = 0 ;
467 dst.m_stride.S5 = 0 ;
468 dst.m_stride.S6 = 0 ;
469 dst.m_stride.S7 = src.m_stride.S3 ;
471 dst.m_dim.N0 = src.m_dim.N0 ;
472 dst.m_dim.N1 = src.m_dim.N1 ;
473 dst.m_dim.N2 = src.m_dim.N2 ;
478 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N3 );
481 template <
unsigned StaticDim>
struct AssignFadDimStride<4u,StaticDim> {
482 template <
typename Src,
typename Dst>
483 KOKKOS_INLINE_FUNCTION
484 static void eval(Dst& dst,
const Src& src) {
485 dst.m_stride.S0 = src.m_stride.S0 ;
486 dst.m_stride.S1 = src.m_stride.S1 ;
487 dst.m_stride.S2 = src.m_stride.S2 ;
488 dst.m_stride.S3 = src.m_stride.S3 ;
489 dst.m_stride.S4 = 0 ;
490 dst.m_stride.S5 = 0 ;
491 dst.m_stride.S6 = 0 ;
492 dst.m_stride.S7 = src.m_stride.S4 ;
494 dst.m_dim.N0 = src.m_dim.N0 ;
495 dst.m_dim.N1 = src.m_dim.N1 ;
496 dst.m_dim.N2 = src.m_dim.N2 ;
497 dst.m_dim.N3 = src.m_dim.N3 ;
501 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N4 );
504 template <
unsigned StaticDim>
struct AssignFadDimStride<5u,StaticDim> {
505 template <
typename Src,
typename Dst>
506 KOKKOS_INLINE_FUNCTION
507 static void eval(Dst& dst,
const Src& src) {
508 dst.m_stride.S0 = src.m_stride.S0 ;
509 dst.m_stride.S1 = src.m_stride.S1 ;
510 dst.m_stride.S2 = src.m_stride.S2 ;
511 dst.m_stride.S3 = src.m_stride.S3 ;
512 dst.m_stride.S4 = src.m_stride.S4 ;
513 dst.m_stride.S5 = 0 ;
514 dst.m_stride.S6 = 0 ;
515 dst.m_stride.S7 = src.m_stride.S5 ;
517 dst.m_dim.N0 = src.m_dim.N0 ;
518 dst.m_dim.N1 = src.m_dim.N1 ;
519 dst.m_dim.N2 = src.m_dim.N2 ;
520 dst.m_dim.N3 = src.m_dim.N3 ;
521 dst.m_dim.N4 = src.m_dim.N4 ;
524 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N5 );
527 template <
unsigned StaticDim>
struct AssignFadDimStride<6u,StaticDim> {
528 template <
typename Src,
typename Dst>
529 KOKKOS_INLINE_FUNCTION
530 static void eval(Dst& dst,
const Src& src) {
531 dst.m_stride.S0 = src.m_stride.S0 ;
532 dst.m_stride.S1 = src.m_stride.S1 ;
533 dst.m_stride.S2 = src.m_stride.S2 ;
534 dst.m_stride.S3 = src.m_stride.S3 ;
535 dst.m_stride.S4 = src.m_stride.S4 ;
536 dst.m_stride.S5 = src.m_stride.S5 ;
537 dst.m_stride.S6 = 0 ;
538 dst.m_stride.S7 = src.m_stride.S6 ;
540 dst.m_dim.N0 = src.m_dim.N0 ;
541 dst.m_dim.N1 = src.m_dim.N1 ;
542 dst.m_dim.N2 = src.m_dim.N2 ;
543 dst.m_dim.N3 = src.m_dim.N3 ;
544 dst.m_dim.N4 = src.m_dim.N4 ;
545 dst.m_dim.N5 = src.m_dim.N5 ;
547 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N6 );
550 template <
unsigned StaticDim>
struct AssignFadDimStride<7u,StaticDim> {
551 template <
typename Src,
typename Dst>
552 KOKKOS_INLINE_FUNCTION
553 static void eval(Dst& dst,
const Src& src) {
554 dst.m_stride.S0 = src.m_stride.S0 ;
555 dst.m_stride.S1 = src.m_stride.S1 ;
556 dst.m_stride.S2 = src.m_stride.S2 ;
557 dst.m_stride.S3 = src.m_stride.S3 ;
558 dst.m_stride.S4 = src.m_stride.S4 ;
559 dst.m_stride.S5 = src.m_stride.S5 ;
560 dst.m_stride.S6 = src.m_stride.S6 ;
561 dst.m_stride.S7 = src.m_stride.S7 ;
563 dst.m_dim.N0 = src.m_dim.N0 ;
564 dst.m_dim.N1 = src.m_dim.N1 ;
565 dst.m_dim.N2 = src.m_dim.N2 ;
566 dst.m_dim.N3 = src.m_dim.N3 ;
567 dst.m_dim.N4 = src.m_dim.N4 ;
568 dst.m_dim.N5 = src.m_dim.N5 ;
569 dst.m_dim.N6 = src.m_dim.N6 ;
570 AssignDim7<StaticDim>::eval( dst.m_dim, src.m_dim.N7 );
575 template<
class SrcTraits ,
class ... Args >
577 < typename std::enable_if<(
578 std::is_same< typename SrcTraits::specialize ,
579 Kokkos::Impl::ViewSpecializeSacadoFad >::value
582 std::is_same< typename SrcTraits::array_layout
583 , Kokkos::LayoutLeft >::value ||
584 std::is_same< typename SrcTraits::array_layout
585 , Kokkos::LayoutRight >::value ||
586 std::is_same< typename SrcTraits::array_layout
587 , Kokkos::LayoutStride >::value
589 ), Kokkos::Impl::DynRankSubviewTag >::type
606 enum { rank = unsigned(R0) + unsigned(R1) + unsigned(R2) + unsigned(R3)
607 + unsigned(R4) + unsigned(R5) + unsigned(R6) };
609 typedef Kokkos::LayoutStride array_layout ;
611 typedef typename SrcTraits::value_type value_type ;
613 typedef value_type******* data_type ;
617 typedef Kokkos::ViewTraits
620 ,
typename SrcTraits::device_type
621 ,
typename SrcTraits::memory_traits > traits_type ;
626 ,
typename SrcTraits::device_type
627 ,
typename SrcTraits::memory_traits > type ;
630 template<
class MemoryTraits >
635 typedef Kokkos::ViewTraits
638 ,
typename SrcTraits::device_type
639 , MemoryTraits > traits_type ;
644 ,
typename SrcTraits::device_type
645 , MemoryTraits > type ;
648 template <
class Arg0 =
int,
class Arg1 =
int,
class Arg2 =
int,
class Arg3 =
int,
class Arg4 =
int,
class Arg5 =
int,
class Arg6 =
int >
649 struct ExtentGenerator {
650 template <
typename dimension>
651 KOKKOS_INLINE_FUNCTION
652 static SubviewExtents< 7 , rank > generator (
const dimension & dim , Arg0 arg0 = Arg0(), Arg1 arg1 = Arg1(), Arg2 arg2 = Arg2(), Arg3 arg3 = Arg3(), Arg4 arg4 = Arg4(), Arg5 arg5 = Arg5(), Arg6 arg6 = Arg6() )
654 return SubviewExtents< 7 , rank >( dim , arg0 , arg1 , arg2 , arg3 ,
655 arg4 , arg5 , arg6 );
659 template <
class Arg0 =
int,
class Arg1 =
int,
class Arg2 =
int,
class Arg3 =
int,
class Arg4 =
int,
class Arg5 =
int,
class Arg6 =
int >
660 struct ArrayExtentGenerator {
661 template <
typename dimension>
662 KOKKOS_INLINE_FUNCTION
663 static SubviewExtents< 8 , rank+1 > generator (
const dimension & dim , Arg0 arg0 = Arg0(), Arg1 arg1 = Arg1(), Arg2 arg2 = Arg2(), Arg3 arg3 = Arg3(), Arg4 arg4 = Arg4(), Arg5 arg5 = Arg5(), Arg6 arg6 = Arg6() )
665 return SubviewExtents< 8 , rank+1 >( dim , arg0 , arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , Kokkos::ALL() );
669 typedef DynRankView< value_type , array_layout , typename SrcTraits::device_type , typename SrcTraits::memory_traits > ret_type;
671 template <
typename T ,
class ... P >
672 KOKKOS_INLINE_FUNCTION
673 static ret_type subview(
const unsigned src_rank , Kokkos::DynRankView< T , P...>
const & src , Args ... args )
676 typedef ViewMapping< traits_type, typename traits_type::specialize> DstType ;
677 typedef ViewMapping< SrcTraits, typename SrcTraits::specialize> SrcType;
678 enum { FadStaticDim = SrcType::FadStaticDimension };
679 typedef typename std::conditional< (rank==0) , ViewDimension<>
680 ,
typename std::conditional< (rank==1) , ViewDimension<0>
681 ,
typename std::conditional< (rank==2) , ViewDimension<0,0>
682 ,
typename std::conditional< (rank==3) , ViewDimension<0,0,0>
683 ,
typename std::conditional< (rank==4) , ViewDimension<0,0,0,0>
684 ,
typename std::conditional< (rank==5) , ViewDimension<0,0,0,0,0>
685 ,
typename std::conditional< (rank==6) , ViewDimension<0,0,0,0,0,0>
686 , ViewDimension<0,0,0,0,0,0,0>
687 >::type >::type >::type >::type >::type >::type >::type DstDimType ;
688 typedef typename std::conditional< (rank==0) , ViewDimension<FadStaticDim>
689 ,
typename std::conditional< (rank==1) , ViewDimension<0,FadStaticDim>
690 ,
typename std::conditional< (rank==2) , ViewDimension<0,0,FadStaticDim>
691 ,
typename std::conditional< (rank==3) , ViewDimension<0,0,0,FadStaticDim>
692 ,
typename std::conditional< (rank==4) , ViewDimension<0,0,0,0,FadStaticDim>
693 ,
typename std::conditional< (rank==5) , ViewDimension<0,0,0,0,0,FadStaticDim>
694 ,
typename std::conditional< (rank==6) , ViewDimension<0,0,0,0,0,0,FadStaticDim>
695 , ViewDimension<0,0,0,0,0,0,0,FadStaticDim>
696 >::type >::type >::type >::type >::type >::type >::type DstArrayDimType ;
698 typedef ViewOffset< DstDimType , Kokkos::LayoutStride > dst_offset_type ;
699 typedef ViewOffset< DstArrayDimType , Kokkos::LayoutStride > dst_array_offset_type ;
700 typedef typename DstType::handle_type dst_handle_type ;
704 const SubviewExtents< 7 , rank > extents =
705 ExtentGenerator< Args ... >::generator(
706 src.m_map.m_impl_offset.m_dim , args... ) ;
707 const SubviewExtents< 8 , rank+1 > array_extents =
708 ArrayExtentGenerator< Args ... >::generator(
709 src.m_map.m_array_offset.m_dim , args... ) ;
711 dst_offset_type tempdst( src.m_map.m_impl_offset , extents ) ;
712 dst_array_offset_type temparraydst(
713 src.m_map.m_array_offset , array_extents ) ;
715 dst.m_track = src.m_track ;
717 dst.m_map.m_impl_offset.m_dim.N0 = tempdst.m_dim.N0 ;
718 dst.m_map.m_impl_offset.m_dim.N1 = tempdst.m_dim.N1 ;
719 dst.m_map.m_impl_offset.m_dim.N2 = tempdst.m_dim.N2 ;
720 dst.m_map.m_impl_offset.m_dim.N3 = tempdst.m_dim.N3 ;
721 dst.m_map.m_impl_offset.m_dim.N4 = tempdst.m_dim.N4 ;
722 dst.m_map.m_impl_offset.m_dim.N5 = tempdst.m_dim.N5 ;
723 dst.m_map.m_impl_offset.m_dim.N6 = tempdst.m_dim.N6 ;
725 dst.m_map.m_impl_offset.m_stride.S0 = tempdst.m_stride.S0;
726 dst.m_map.m_impl_offset.m_stride.S1 = tempdst.m_stride.S1;
727 dst.m_map.m_impl_offset.m_stride.S2 = tempdst.m_stride.S2;
728 dst.m_map.m_impl_offset.m_stride.S3 = tempdst.m_stride.S3;
729 dst.m_map.m_impl_offset.m_stride.S4 = tempdst.m_stride.S4;
730 dst.m_map.m_impl_offset.m_stride.S5 = tempdst.m_stride.S5;
731 dst.m_map.m_impl_offset.m_stride.S6 = tempdst.m_stride.S6;
740 AssignFadDimStride<rank,FadStaticDim>::eval( dst.m_map.m_array_offset, temparraydst );
742 dst.m_track = src.m_track ;
744 dst.m_map.m_impl_handle =
746 src.m_map.m_impl_handle +
747 src.m_map.m_array_offset( array_extents.domain_offset(0)
748 , array_extents.domain_offset(1)
749 , array_extents.domain_offset(2)
750 , array_extents.domain_offset(3)
751 , array_extents.domain_offset(4)
752 , array_extents.domain_offset(5)
753 , array_extents.domain_offset(6)
754 , array_extents.domain_offset(7)
757 dst.m_map.m_fad_size = src.m_map.m_fad_size;
758 dst.m_map.m_fad_stride = src.m_map.m_fad_stride.value;
760 dst.m_rank = ( src_rank > 0 ? unsigned(R0) : 0 )
761 + ( src_rank > 1 ? unsigned(R1) : 0 )
762 + ( src_rank > 2 ? unsigned(R2) : 0 )
763 + ( src_rank > 3 ? unsigned(R3) : 0 )
764 + ( src_rank > 4 ? unsigned(R4) : 0 )
765 + ( src_rank > 5 ? unsigned(R5) : 0 )
766 + ( src_rank > 6 ? unsigned(R6) : 0 ) ;
773 template <
unsigned>
struct AssignFadDim7 {
774 template <
typename Src,
typename Dst>
775 KOKKOS_INLINE_FUNCTION
776 static void eval(Dst& dst,
const Src& src ,
const unsigned dim ) {}
779 template <>
struct AssignFadDim7<0u> {
780 template <
typename Src,
typename Dst>
781 KOKKOS_INLINE_FUNCTION
782 static void eval(Dst& dst,
const Src& src ,
const unsigned dim ) {
783 dst.m_dim.N7 = src.m_dim.extent(dim);
788 template <
typename Layout>
789 KOKKOS_INLINE_FUNCTION
791 permute_fad_layout(
const Layout& src,
const unsigned rank) {
793 dst.dimension[rank] = 1;
794 dst.dimension[7] = src.dimension[rank];
797 KOKKOS_INLINE_FUNCTION
799 permute_fad_layout(
const LayoutStride& src,
const unsigned rank) {
800 LayoutStride dst = src;
801 dst.dimension[rank] = 1;
802 dst.stride[rank] = 1;
803 dst.dimension[7] = src.dimension[rank];
804 dst.stride[7] = src.stride[rank];
812 template<
class DstTraits ,
class SrcTraits >
813 class ViewMapping< DstTraits , SrcTraits ,
814 typename std::enable_if<(
815 Kokkos::Impl::MemorySpaceAccess
816 < typename DstTraits::memory_space
817 , typename SrcTraits::memory_space >::assignable
820 std::is_same< typename DstTraits::specialize
821 , Kokkos::Impl::ViewSpecializeSacadoFad >::value
824 std::is_same< typename SrcTraits::specialize
825 , Kokkos::Impl::ViewSpecializeSacadoFad >::value
826 ), Kokkos::Impl::ViewToDynRankViewTag >::type >
830 enum { is_assignable =
true };
831 enum { is_assignable_data_type =
true };
833 typedef Kokkos::Impl::SharedAllocationTracker TrackType ;
834 typedef ViewMapping< DstTraits , typename DstTraits::specialize > DstType ;
835 typedef ViewMapping< SrcTraits , typename SrcTraits::specialize > SrcFadType ;
837 template <
typename DT ,
typename ... DP ,
typename ST ,
typename ... SP >
838 KOKKOS_INLINE_FUNCTION
static
839 void assign( Kokkos::DynRankView< DT , DP... > & dst
840 ,
const Kokkos::View< ST , SP... >& src )
844 std::is_same<
typename DstTraits::array_layout
845 , Kokkos::LayoutLeft >::
value ||
846 std::is_same<
typename DstTraits::array_layout
847 , Kokkos::LayoutRight >::
value ||
848 std::is_same<
typename DstTraits::array_layout
849 , Kokkos::LayoutStride >::
value
853 std::is_same<
typename SrcTraits::array_layout
854 , Kokkos::LayoutLeft >::
value ||
855 std::is_same<
typename SrcTraits::array_layout
856 , Kokkos::LayoutRight >::
value ||
857 std::is_same<
typename SrcTraits::array_layout
858 , Kokkos::LayoutStride >::
value
860 ,
"View of FAD requires LayoutLeft, LayoutRight, or LayoutStride" );
863 std::is_same<
typename DstTraits::value_type
864 ,
typename SrcTraits::value_type >::
value ||
865 std::is_same<
typename DstTraits::value_type
866 ,
typename SrcTraits::const_value_type >::
value ,
867 "View assignment must have same value type or const = non-const" );
869 typedef typename DstType::offset_type dst_offset_type;
870 typedef typename DstType::array_offset_type dst_array_offset_type;
871 dst.m_map.m_array_offset =
872 dst_array_offset_type(std::integral_constant<unsigned,0>(),
873 permute_fad_layout(src.m_map.m_array_offset.layout(),
875 dst.m_map.m_impl_offset =
876 dst_offset_type(std::integral_constant<unsigned,0>(),
877 src.m_map.m_impl_offset.layout() );
879 dst.m_map.m_impl_handle = src.m_map.m_impl_handle ;
880 dst.m_rank = src.rank ;
882 dst.m_map.m_fad_size = src.m_map.m_fad_size ;
883 dst.m_map.m_fad_stride = src.m_map.m_fad_stride ;
891 template<
class DstTraits ,
class SrcTraits >
892 class ViewMapping< DstTraits , SrcTraits ,
893 typename std::enable_if<(
894 Kokkos::Impl::MemorySpaceAccess
895 < typename DstTraits::memory_space
896 , typename SrcTraits::memory_space >::assignable
899 std::is_same< typename DstTraits::specialize , void >::value
902 std::is_same< typename SrcTraits::specialize
903 , ViewSpecializeSacadoFad >::value
904 ), Kokkos::Impl::ViewToDynRankViewTag >::type >
908 enum { is_assignable =
true };
909 enum { is_assignable_data_type =
true };
911 typedef Kokkos::Impl::SharedAllocationTracker TrackType ;
912 typedef ViewMapping< DstTraits , typename DstTraits::specialize > DstType ;
913 typedef ViewMapping< SrcTraits , typename SrcTraits::specialize > SrcFadType ;
915 template <
typename DT ,
typename ... DP ,
typename ST ,
typename ... SP >
916 KOKKOS_INLINE_FUNCTION
static
917 void assign( Kokkos::DynRankView< DT , DP... > & dst
918 ,
const Kokkos::View< ST , SP... >& src )
922 std::is_same<
typename DstTraits::array_layout
923 , Kokkos::LayoutLeft >::
value ||
924 std::is_same<
typename DstTraits::array_layout
925 , Kokkos::LayoutRight >::
value ||
926 std::is_same<
typename DstTraits::array_layout
927 , Kokkos::LayoutStride >::
value
931 std::is_same<
typename SrcTraits::array_layout
932 , Kokkos::LayoutLeft >::
value ||
933 std::is_same<
typename SrcTraits::array_layout
934 , Kokkos::LayoutRight >::
value ||
935 std::is_same<
typename SrcTraits::array_layout
936 , Kokkos::LayoutStride >::
value
938 ,
"View of FAD requires LayoutLeft, LayoutRight, or LayoutStride" );
941 std::is_same<
typename DstTraits::value_type
942 ,
typename SrcTraits::value_type >::
value ||
943 std::is_same<
typename DstTraits::value_type
944 ,
typename SrcTraits::const_value_type >::
value ,
945 "View assignment must have same value type or const = non-const" );
947 typedef typename DstType::offset_type dst_offset_type;
948 dst.m_map.m_impl_offset =
949 dst_offset_type(std::integral_constant<unsigned,0>(),
950 permute_fad_layout(src.m_map.m_array_offset.layout(),
953 dst.m_map.m_impl_handle = src.m_map.m_impl_handle ;
954 dst.m_rank = src.Rank ;
962 template <
typename T,
typename ... P>
963 struct is_dynrankview_fad< DynRankView<
T,P...> > {
964 typedef DynRankView<
T,P...> view_type;
965 static const bool value =
966 std::is_same<
typename view_type::specialize,
967 Impl::ViewSpecializeSacadoFad >
::value ||
968 std::is_same<
typename view_type::specialize,
969 Impl::ViewSpecializeSacadoFadContiguous >
::value;
972 template <
typename T,
typename ... P>
973 struct is_dynrankview_fad_contiguous< DynRankView<
T,P...> > {
974 typedef DynRankView<
T,P...> view_type;
975 static const bool value =
976 std::is_same<
typename view_type::specialize,
977 Impl::ViewSpecializeSacadoFadContiguous >
::value;
980 template <
typename T,
typename ... P>
981 KOKKOS_INLINE_FUNCTION
983 std::enable_if< is_dynrankview_fad< DynRankView<
T,P...> >
::value,
unsigned >::type
984 dimension_scalar(
const DynRankView<T,P...>& view) {
985 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE
986 return view.implementation_map().dimension_scalar();
988 return view.impl_map().dimension_scalar();
995 template<
class DT,
class ... DP >
997 const DynRankView<DT,DP...> & view ,
999 ,
typename std::enable_if<(
1000 std::is_same<
typename ViewTraits<DT,DP...>::specialize
1001 , Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1002 std::is_same<
typename ViewTraits<DT,DP...>::specialize
1003 , Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value
1007 std::is_same<
typename ViewTraits<DT,DP...>::value_type ,
1008 typename ViewTraits<DT,DP...>::non_const_value_type >::value
1009 ,
"Can only deep copy into non-const type" );
1012 Kokkos::Impl::DynRankViewFill< DynRankView<DT,DP...> >( view ,
value );
1017 template<
class DT,
class ... DP >
1019 const DynRankView<DT,DP...> & view ,
1020 const typename DynRankView<DT,DP...>::value_type & value
1021 ,
typename std::enable_if<(
1022 std::is_same<
typename ViewTraits<DT,DP...>::specialize
1023 , Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1024 std::is_same<
typename ViewTraits<DT,DP...>::specialize
1025 , Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value
1029 std::is_same<
typename ViewTraits<DT,DP...>::value_type ,
1030 typename ViewTraits<DT,DP...>::non_const_value_type >::value
1031 ,
"Can only deep copy into non-const type" );
1034 Kokkos::Impl::DynRankViewFill< DynRankView<DT,DP...> >( view ,
value );
1038 template<
class DstType ,
class SrcType >
1041 (
const DstType & dst
1042 ,
const SrcType & src
1043 ,
typename std::enable_if<(
1044 ( std::is_same<
typename DstType::traits::specialize
1045 , Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1046 std::is_same<
typename DstType::traits::specialize
1047 , Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
1049 ( std::is_same<
typename SrcType::traits::specialize
1050 , Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1051 std::is_same<
typename SrcType::traits::specialize
1052 , Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
1059 std::is_same<
typename DstType::traits::value_type ,
1060 typename DstType::traits::non_const_value_type >::value
1061 ,
"deep_copy requires non-const destination type" );
1063 typedef DstType dst_type ;
1064 typedef SrcType src_type ;
1066 typedef typename dst_type::execution_space dst_execution_space ;
1067 typedef typename src_type::execution_space src_execution_space ;
1068 typedef typename dst_type::memory_space dst_memory_space ;
1069 typedef typename src_type::memory_space src_memory_space ;
1071 enum { DstExecCanAccessSrc =
1072 Kokkos::SpaceAccessibility< typename dst_execution_space::memory_space, src_memory_space >::accessible };
1074 enum { SrcExecCanAccessDst =
1075 Kokkos::SpaceAccessibility< typename src_execution_space::memory_space, dst_memory_space >::accessible };
1077 if ( (
void *) dst.data() != (
void*) src.data() ) {
1083 if ( rank(src) == 0 && rank(dst) == 0 )
1085 typedef typename dst_type::value_type::value_type value_type ;
1086 const size_t nbytes =
sizeof(value_type) * dst.span() ;
1088 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() , nbytes );
1091 else if ( std::is_same<
typename DstType::traits::value_type ,
1092 typename SrcType::traits::non_const_value_type >::value &&
1094 ( std::is_same<
typename DstType::traits::array_layout ,
1095 typename SrcType::traits::array_layout >::value
1097 ( std::is_same<
typename DstType::traits::array_layout ,
1098 typename Kokkos::LayoutLeft>::value
1100 std::is_same<
typename DstType::traits::array_layout ,
1101 typename Kokkos::LayoutRight>::value
1111 dst.span_is_contiguous() &&
1112 src.span_is_contiguous() &&
1113 dst.span() == src.span() &&
1114 dst.extent(0) == src.extent(0) &&
1115 dst.extent(1) == src.extent(1) &&
1116 dst.extent(2) == src.extent(2) &&
1117 dst.extent(3) == src.extent(3) &&
1118 dst.extent(4) == src.extent(4) &&
1119 dst.extent(5) == src.extent(5) &&
1120 dst.extent(6) == src.extent(6) &&
1121 dst.extent(7) == src.extent(7) ) {
1125 const size_t nbytes =
sizeof(
typename dst_type::value_type::value_type) * dst.span() ;
1128 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() , nbytes );
1131 else if ( std::is_same<
typename DstType::traits::value_type ,
1132 typename SrcType::traits::non_const_value_type >::value &&
1134 ( std::is_same<
typename DstType::traits::array_layout ,
1135 typename SrcType::traits::array_layout >::value
1137 std::is_same<
typename DstType::traits::array_layout ,
1138 typename Kokkos::LayoutStride>::value
1147 dst.span_is_contiguous() &&
1148 src.span_is_contiguous() &&
1149 dst.span() == src.span() &&
1150 dst.extent(0) == src.extent(0) &&
1151 dst.extent(1) == src.extent(1) &&
1152 dst.extent(2) == src.extent(2) &&
1153 dst.extent(3) == src.extent(3) &&
1154 dst.extent(4) == src.extent(4) &&
1155 dst.extent(5) == src.extent(5) &&
1156 dst.extent(6) == src.extent(6) &&
1157 dst.extent(7) == src.extent(7) &&
1158 dst.stride_0() == src.stride_0() &&
1159 dst.stride_1() == src.stride_1() &&
1160 dst.stride_2() == src.stride_2() &&
1161 dst.stride_3() == src.stride_3() &&
1162 dst.stride_4() == src.stride_4() &&
1163 dst.stride_5() == src.stride_5() &&
1164 dst.stride_6() == src.stride_6() &&
1165 dst.stride_7() == src.stride_7()
1168 const size_t nbytes =
sizeof(
typename dst_type::value_type::value_type) * dst.span() ;
1170 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() , nbytes );
1173 else if ( DstExecCanAccessSrc ) {
1176 Kokkos::Impl::DynRankViewRemap< dst_type , src_type >( dst , src );
1179 else if ( SrcExecCanAccessDst ) {
1182 Kokkos::Impl::DynRankViewRemap< dst_type , src_type , src_execution_space >( dst , src );
1186 Kokkos::Impl::throw_runtime_exception(
"deep_copy given views that would require a temporary allocation");
1194 template<
class T ,
class ... P >
1196 typename Kokkos::DynRankView<
T,P...>::HostMirror
1197 create_mirror(
const Kokkos::DynRankView<T,P...> & src
1198 ,
typename std::enable_if<
1199 ( std::is_same<
typename ViewTraits<T,P...>::specialize ,
1200 Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1201 std::is_same<
typename ViewTraits<T,P...>::specialize ,
1202 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
1204 ! std::is_same<
typename Kokkos::ViewTraits<T,P...>::array_layout
1205 , Kokkos::LayoutStride >::value
1209 typedef DynRankView<
T,P...> src_type ;
1210 typedef typename src_type::HostMirror dst_type ;
1212 typename src_type::array_layout layout = src.layout();
1213 layout.dimension[src.rank()] = Kokkos::dimension_scalar(src);
1215 return dst_type(std::string(src.label()).append(
"_mirror"),
1216 Impl::reconstructLayout(layout, src.rank()+1));
1219 template<
class T ,
class ... P >
1221 typename Kokkos::DynRankView<
T,P...>::HostMirror
1222 create_mirror(
const Kokkos::DynRankView<T,P...> & src
1223 ,
typename std::enable_if<
1224 ( std::is_same<
typename ViewTraits<T,P...>::specialize ,
1225 Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1226 std::is_same<
typename ViewTraits<T,P...>::specialize ,
1227 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
1229 std::is_same<
typename Kokkos::ViewTraits<T,P...>::array_layout
1230 , Kokkos::LayoutStride >::value
1234 typedef DynRankView<
T,P...> src_type ;
1235 typedef typename src_type::HostMirror dst_type ;
1237 Kokkos::LayoutStride layout ;
1239 layout.dimension[0] = src.extent(0);
1240 layout.dimension[1] = src.extent(1);
1241 layout.dimension[2] = src.extent(2);
1242 layout.dimension[3] = src.extent(3);
1243 layout.dimension[4] = src.extent(4);
1244 layout.dimension[5] = src.extent(5);
1245 layout.dimension[6] = src.extent(6);
1246 layout.dimension[7] = src.extent(7);
1248 layout.stride[0] = src.stride_0();
1249 layout.stride[1] = src.stride_1();
1250 layout.stride[2] = src.stride_2();
1251 layout.stride[3] = src.stride_3();
1252 layout.stride[4] = src.stride_4();
1253 layout.stride[5] = src.stride_5();
1254 layout.stride[6] = src.stride_6();
1255 layout.stride[7] = src.stride_7();
1257 layout.dimension[src.rank()] = Kokkos::dimension_scalar(src);
1258 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE
1259 layout.stride[src.rank()] = src.implementation_map().stride_scalar();
1261 layout.stride[src.rank()] = src.impl_map().stride_scalar();
1264 return dst_type(std::string(src.label()).append(
"_mirror"),
1265 Impl::reconstructLayout(layout, src.rank()+1));
1268 template<
class Space,
class T,
class ... P>
1269 typename Impl::MirrorDRVType<Space,
T,P ...>::view_type
1270 create_mirror(
const Space& ,
const Kokkos::DynRankView<T,P...> & src
1271 ,
typename std::enable_if<
1272 ( std::is_same<
typename ViewTraits<T,P...>::specialize ,
1273 Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1274 std::is_same<
typename ViewTraits<T,P...>::specialize ,
1275 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
1277 typedef DynRankView<
T,P...> src_type ;
1278 typename src_type::array_layout layout = src.layout();
1279 layout.dimension[src.rank()] = Kokkos::dimension_scalar(src);
1280 return typename Impl::MirrorDRVType<Space,T,P ...>::view_type(
1281 src.label(),Impl::reconstructLayout(layout, src.rank()+1));
1286 template <
unsigned N,
typename T,
typename... Args>
1287 KOKKOS_FUNCTION
auto as_view_of_rank_n(
1288 DynRankView<T, Args...> v,
1289 typename std::enable_if<
1290 ( std::is_same<
typename ViewTraits<T,Args...>::specialize,
1291 Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
1292 std::is_same<
typename ViewTraits<T,Args...>::specialize ,
1293 Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
1296 if (v.rank() !=
N) {
1298 const std::string message =
1299 "Converting DynRankView of rank " + std::to_string(v.rank()) +
1300 " to a View of mis-matched rank " + std::to_string(
N) +
"!";
1301 Kokkos::abort(message.c_str());)
1302 KOKKOS_IF_ON_DEVICE(
1303 Kokkos::abort(
"Converting DynRankView to a View of mis-matched rank!");)
1306 auto layout = v.impl_map().layout();
1307 layout.dimension[v.rank()] = Kokkos::dimension_scalar(v);
1308 return View<typename RankDataType<T, N>::type, Args...>(
1309 v.data(), Impl::reconstructLayout(layout, v.rank()+1));
1316 #endif //defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
1318 #endif // defined(HAVE_SACADO_KOKKOS)
Base template specification for ScalarType.