30 #ifndef KOKKOS_DYN_RANK_VIEW_SACADO_FAD_HPP 31 #define KOKKOS_DYN_RANK_VIEW_SACADO_FAD_HPP 38 #if defined(HAVE_SACADO_KOKKOSCONTAINERS) 40 #include "Kokkos_DynRankView.hpp" 42 #if defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC) 47 namespace Experimental {
51 struct DynRankDimTraits<ViewSpecializeSacadoFad> {
53 enum :
size_t{unspecified = ~size_t(0)};
58 static size_t computeRank(
const size_t N0
68 ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified && N2 == unspecified && N1 == unspecified && N0 == unspecified) ? 0
69 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified && N2 == unspecified && N1 == unspecified) ? 0
70 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified && N2 == unspecified) ? 1
71 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified && N3 == unspecified) ? 2
72 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified && N4 == unspecified) ? 3
73 : ( (N7 == unspecified && N6 == unspecified && N5 == unspecified) ? 4
74 : ( (N7 == unspecified && N6 == unspecified) ? 5
75 : ( (N7 == unspecified) ? 6
80 template <
typename Layout>
82 static size_t computeRank(
const Layout& layout )
84 return computeRank( layout.dimension[0]
91 , layout.dimension[7] );
97 template <
typename Layout>
99 static typename std::enable_if< (std::is_same<Layout , Kokkos::LayoutRight>::value || std::is_same<Layout , Kokkos::LayoutLeft>::value) , Layout >::type createLayout(
const Layout& layout )
101 Layout l( layout.dimension[0] != unspecified ? layout.dimension[0] : 1
102 , layout.dimension[1] != unspecified ? layout.dimension[1] : 1
103 , layout.dimension[2] != unspecified ? layout.dimension[2] : 1
104 , layout.dimension[3] != unspecified ? layout.dimension[3] : 1
105 , layout.dimension[4] != unspecified ? layout.dimension[4] : 1
106 , layout.dimension[5] != unspecified ? layout.dimension[5] : 1
107 , layout.dimension[6] != unspecified ? layout.dimension[6] : 1
108 , layout.dimension[7] != unspecified ? layout.dimension[7] : 1 );
109 const unsigned fad_dim = computeRank(layout);
110 const size_t fad_size = layout.dimension[fad_dim];
111 l.dimension[fad_dim] = 1;
112 l.dimension[7] = fad_size;
118 template <
typename Layout>
120 static typename std::enable_if< (std::is_same<Layout , Kokkos::LayoutStride>::value) , Layout>::type createLayout(
const Layout& layout )
122 Layout l( layout.dimension[0] != unspecified ? layout.dimension[0] : 1
124 , layout.dimension[1] != unspecified ? layout.dimension[1] : 1
126 , layout.dimension[2] != unspecified ? layout.dimension[2] : 1
128 , layout.dimension[3] != unspecified ? layout.dimension[3] : 1
130 , layout.dimension[4] != unspecified ? layout.dimension[4] : 1
132 , layout.dimension[5] != unspecified ? layout.dimension[5] : 1
134 , layout.dimension[6] != unspecified ? layout.dimension[6] : 1
136 , layout.dimension[7] != unspecified ? layout.dimension[7] : 1
139 const unsigned fad_dim = computeRank(layout);
140 const size_t fad_size = layout.dimension[fad_dim];
141 l.dimension[fad_dim] = 1;
142 l.dimension[7] = fad_size;
149 template <
typename ViewType,
typename ViewArg>
150 static ViewType createView(
const ViewArg& arg
160 typename ViewType::array_layout l( N0, N1, N2, N3, N4, N5, N6, N7 );
161 typename ViewType::array_layout l_fad = createLayout(l);
170 , l_fad.dimension[7] );
176 template <
unsigned>
struct AssignFadStride {};
177 template <>
struct AssignFadStride<0u> {
178 template <
typename Src,
typename Dst>
180 static void eval(Dst& dst,
const Src& src) {
181 dst.m_stride.S0 = 0 ;
182 dst.m_stride.S1 = 0 ;
183 dst.m_stride.S2 = 0 ;
184 dst.m_stride.S3 = 0 ;
185 dst.m_stride.S4 = 0 ;
186 dst.m_stride.S5 = 0 ;
187 dst.m_stride.S6 = 0 ;
188 dst.m_stride.S7 = src.m_stride.S0 ;
191 template <>
struct AssignFadStride<1u> {
192 template <
typename Src,
typename Dst>
194 static void eval(Dst& dst,
const Src& src) {
195 dst.m_stride.S0 = src.m_stride.S0 ;
196 dst.m_stride.S1 = 0 ;
197 dst.m_stride.S2 = 0 ;
198 dst.m_stride.S3 = 0 ;
199 dst.m_stride.S4 = 0 ;
200 dst.m_stride.S5 = 0 ;
201 dst.m_stride.S6 = 0 ;
202 dst.m_stride.S7 = src.m_stride.S1 ;
205 template <>
struct AssignFadStride<2u> {
206 template <
typename Src,
typename Dst>
208 static void eval(Dst& dst,
const Src& src) {
209 dst.m_stride.S0 = src.m_stride.S0 ;
210 dst.m_stride.S1 = src.m_stride.S1 ;
211 dst.m_stride.S2 = 0 ;
212 dst.m_stride.S3 = 0 ;
213 dst.m_stride.S4 = 0 ;
214 dst.m_stride.S5 = 0 ;
215 dst.m_stride.S6 = 0 ;
216 dst.m_stride.S7 = src.m_stride.S2 ;
219 template <>
struct AssignFadStride<3u> {
220 template <
typename Src,
typename Dst>
222 static void eval(Dst& dst,
const Src& src) {
223 dst.m_stride.S0 = src.m_stride.S0 ;
224 dst.m_stride.S1 = src.m_stride.S1 ;
225 dst.m_stride.S2 = src.m_stride.S2 ;
226 dst.m_stride.S3 = 0 ;
227 dst.m_stride.S4 = 0 ;
228 dst.m_stride.S5 = 0 ;
229 dst.m_stride.S6 = 0 ;
230 dst.m_stride.S7 = src.m_stride.S3 ;
233 template <>
struct AssignFadStride<4u> {
234 template <
typename Src,
typename Dst>
236 static void eval(Dst& dst,
const Src& src) {
237 dst.m_stride.S0 = src.m_stride.S0 ;
238 dst.m_stride.S1 = src.m_stride.S1 ;
239 dst.m_stride.S2 = src.m_stride.S2 ;
240 dst.m_stride.S3 = src.m_stride.S3 ;
241 dst.m_stride.S4 = 0 ;
242 dst.m_stride.S5 = 0 ;
243 dst.m_stride.S6 = 0 ;
244 dst.m_stride.S7 = src.m_stride.S4 ;
247 template <>
struct AssignFadStride<5u> {
248 template <
typename Src,
typename Dst>
250 static void eval(Dst& dst,
const Src& src) {
251 dst.m_stride.S0 = src.m_stride.S0 ;
252 dst.m_stride.S1 = src.m_stride.S1 ;
253 dst.m_stride.S2 = src.m_stride.S2 ;
254 dst.m_stride.S3 = src.m_stride.S3 ;
255 dst.m_stride.S4 = src.m_stride.S4 ;
256 dst.m_stride.S5 = 0 ;
257 dst.m_stride.S6 = 0 ;
258 dst.m_stride.S7 = src.m_stride.S5 ;
261 template <>
struct AssignFadStride<6u> {
262 template <
typename Src,
typename Dst>
264 static void eval(Dst& dst,
const Src& src) {
265 dst.m_stride.S0 = src.m_stride.S0 ;
266 dst.m_stride.S1 = src.m_stride.S1 ;
267 dst.m_stride.S2 = src.m_stride.S2 ;
268 dst.m_stride.S3 = src.m_stride.S3 ;
269 dst.m_stride.S4 = src.m_stride.S4 ;
270 dst.m_stride.S5 = src.m_stride.S5 ;
271 dst.m_stride.S6 = 0 ;
272 dst.m_stride.S7 = src.m_stride.S6 ;
275 template <>
struct AssignFadStride<7u> {
276 template <
typename Src,
typename Dst>
278 static void eval(Dst& dst,
const Src& src) {
279 dst.m_stride.S0 = src.m_stride.S0 ;
280 dst.m_stride.S1 = src.m_stride.S1 ;
281 dst.m_stride.S2 = src.m_stride.S2 ;
282 dst.m_stride.S3 = src.m_stride.S3 ;
283 dst.m_stride.S4 = src.m_stride.S4 ;
284 dst.m_stride.S5 = src.m_stride.S5 ;
285 dst.m_stride.S6 = src.m_stride.S6 ;
286 dst.m_stride.S7 = src.m_stride.S7 ;
290 template <
unsigned>
struct AssignDim7 {
291 template <
typename Src,
typename Dst>
293 static void eval(Dst& dst,
const Src& src) {}
295 template <>
struct AssignDim7<0u> {
296 template <
typename Src,
typename Dst>
298 static void eval(Dst& dst,
const Src& src) {
299 dst.m_dim.N7 = src.m_dim.N7;
304 template<
class SrcTraits ,
class ... Args >
306 < typename
std::enable_if<(
307 std::is_same< typename SrcTraits::specialize ,
308 ViewSpecializeSacadoFad >::value
311 std::is_same< typename SrcTraits::array_layout
312 , Kokkos::LayoutLeft >::value ||
313 std::is_same< typename SrcTraits::array_layout
314 , Kokkos::LayoutRight >::value ||
315 std::is_same< typename SrcTraits::array_layout
316 , Kokkos::LayoutStride >::value
318 ), DynRankSubviewTag >::type
326 , R0 = bool(is_integral_extent<0,Args...>::value)
327 , R1 = bool(is_integral_extent<1,Args...>::value)
328 , R2 = bool(is_integral_extent<2,Args...>::value)
329 , R3 = bool(is_integral_extent<3,Args...>::value)
330 , R4 = bool(is_integral_extent<4,Args...>::value)
331 , R5 = bool(is_integral_extent<5,Args...>::value)
332 , R6 = bool(is_integral_extent<6,Args...>::value)
335 enum { rank = unsigned(R0) + unsigned(R1) + unsigned(R2) + unsigned(R3)
336 + unsigned(R4) + unsigned(R5) + unsigned(R6) };
338 typedef Kokkos::LayoutStride array_layout ;
340 typedef typename SrcTraits::value_type value_type ;
342 typedef value_type******* data_type ;
346 typedef Kokkos::Experimental::ViewTraits
349 ,
typename SrcTraits::device_type
350 ,
typename SrcTraits::memory_traits > traits_type ;
352 typedef Kokkos::Experimental::View
355 ,
typename SrcTraits::device_type
356 ,
typename SrcTraits::memory_traits > type ;
359 template<
class MemoryTraits >
362 static_assert( Kokkos::Impl::is_memory_traits< MemoryTraits >::value ,
"" );
364 typedef Kokkos::Experimental::ViewTraits
367 ,
typename SrcTraits::device_type
368 , MemoryTraits > traits_type ;
370 typedef Kokkos::Experimental::View
373 ,
typename SrcTraits::device_type
374 , MemoryTraits > type ;
378 template <
class Arg0 =
int,
class Arg1 =
int,
class Arg2 =
int,
class Arg3 =
int,
class Arg4 =
int,
class Arg5 =
int,
class Arg6 =
int >
379 struct ExtentGenerator {
380 template <
typename dimension>
382 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() )
384 return SubviewExtents< 8 , rank+1 >( dim , arg0 , arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , Kokkos::ALL() );
388 typedef DynRankView< value_type , array_layout , typename SrcTraits::device_type , typename SrcTraits::memory_traits > ret_type;
390 template <
typename T ,
class ... P >
392 static ret_type subview(
const unsigned src_rank , Kokkos::Experimental::DynRankView< T , P...>
const & src , Args ... args )
395 typedef ViewMapping< traits_type, void > DstType ;
396 typedef ViewMapping< SrcTraits, void> SrcType;
397 enum { FadStaticDim = SrcType::FadStaticDimension };
398 typedef typename std::conditional< (rank==0) , ViewDimension<FadStaticDim>
399 ,
typename std::conditional< (rank==1) , ViewDimension<0,FadStaticDim>
400 ,
typename std::conditional< (rank==2) , ViewDimension<0,0,FadStaticDim>
401 ,
typename std::conditional< (rank==3) , ViewDimension<0,0,0,FadStaticDim>
402 ,
typename std::conditional< (rank==4) , ViewDimension<0,0,0,0,FadStaticDim>
403 ,
typename std::conditional< (rank==5) , ViewDimension<0,0,0,0,0,FadStaticDim>
404 ,
typename std::conditional< (rank==6) , ViewDimension<0,0,0,0,0,0,FadStaticDim>
405 , ViewDimension<0,0,0,0,0,0,0,FadStaticDim>
406 >::type >::type >::type >::type >::type >::type >::type DstDimType ;
408 typedef ViewOffset< DstDimType , Kokkos::LayoutStride > dst_offset_type ;
409 typedef typename DstType::handle_type dst_handle_type ;
413 const SubviewExtents< 8 , rank+1 > extents =
414 ExtentGenerator< Args ... >::generator( src.m_map.m_offset.m_dim , args... ) ;
416 dst_offset_type tempdst( src.m_map.m_offset , extents ) ;
418 dst.m_track = src.m_track ;
420 dst.m_map.m_offset.m_dim.N0 = tempdst.m_dim.N0 ;
421 dst.m_map.m_offset.m_dim.N1 = tempdst.m_dim.N1 ;
422 dst.m_map.m_offset.m_dim.N2 = tempdst.m_dim.N2 ;
423 dst.m_map.m_offset.m_dim.N3 = tempdst.m_dim.N3 ;
424 dst.m_map.m_offset.m_dim.N4 = tempdst.m_dim.N4 ;
425 dst.m_map.m_offset.m_dim.N5 = tempdst.m_dim.N5 ;
426 dst.m_map.m_offset.m_dim.N6 = tempdst.m_dim.N6 ;
430 AssignDim7<FadStaticDim>::eval( dst.m_map.m_offset, tempdst );
435 AssignFadStride<rank>::eval( dst.m_map.m_offset, tempdst );
437 dst.m_track = src.m_track ;
440 dst_handle_type( src.m_map.m_handle +
441 src.m_map.m_offset( extents.domain_offset(0)
442 , extents.domain_offset(1)
443 , extents.domain_offset(2)
444 , extents.domain_offset(3)
445 , extents.domain_offset(4)
446 , extents.domain_offset(5)
447 , extents.domain_offset(6)
448 , extents.domain_offset(7)
451 dst.m_map.m_fad_size = src.m_map.m_fad_size;
452 dst.m_map.m_fad_stride = src.m_map.m_fad_stride.value;
454 dst.m_rank = ( src_rank > 0 ? unsigned(R0) : 0 )
455 + ( src_rank > 1 ? unsigned(R1) : 0 )
456 + ( src_rank > 2 ? unsigned(R2) : 0 )
457 + ( src_rank > 3 ? unsigned(R3) : 0 )
458 + ( src_rank > 4 ? unsigned(R4) : 0 )
459 + ( src_rank > 5 ? unsigned(R5) : 0 )
460 + ( src_rank > 6 ? unsigned(R6) : 0 ) ;
467 template <
unsigned>
struct AssignFadDim7 {
468 template <
typename Src,
typename Dst>
470 static void eval(Dst& dst,
const Src& src ,
const unsigned dim ) {}
473 template <>
struct AssignFadDim7<0u> {
474 template <
typename Src,
typename Dst>
476 static void eval(Dst& dst,
const Src& src ,
const unsigned dim ) {
477 dst.m_dim.N7 = src.m_dim.extent(dim);
482 template <
unsigned ,
unsigned>
struct AssignDim {};
484 template <
unsigned FadStaticDim>
struct AssignDim<0u,FadStaticDim> {
485 template <
typename Src,
typename Dst>
487 static void eval(Dst& dst,
const Src& src) {
495 AssignFadDim7<FadStaticDim>::eval( dst , src , 0 );
499 template <
unsigned FadStaticDim>
struct AssignDim<1u,FadStaticDim> {
500 template <
typename Src,
typename Dst>
502 static void eval(Dst& dst,
const Src& src) {
503 dst.m_dim.N0 = src.m_dim.N0;
510 AssignFadDim7<FadStaticDim>::eval( dst , src , 1 );
514 template <
unsigned FadStaticDim>
struct AssignDim<2u,FadStaticDim> {
515 template <
typename Src,
typename Dst>
517 static void eval(Dst& dst,
const Src& src) {
518 dst.m_dim.N0 = src.m_dim.N0;
519 dst.m_dim.N1 = src.m_dim.N1;
525 AssignFadDim7<FadStaticDim>::eval( dst , src , 2 );
529 template <
unsigned FadStaticDim>
struct AssignDim<3u,FadStaticDim> {
530 template <
typename Src,
typename Dst>
532 static void eval(Dst& dst,
const Src& src) {
533 dst.m_dim.N0 = src.m_dim.N0;
534 dst.m_dim.N1 = src.m_dim.N1;
535 dst.m_dim.N2 = src.m_dim.N2;
540 AssignFadDim7<FadStaticDim>::eval( dst , src , 3 );
544 template <
unsigned FadStaticDim>
struct AssignDim<4u,FadStaticDim> {
545 template <
typename Src,
typename Dst>
547 static void eval(Dst& dst,
const Src& src) {
548 dst.m_dim.N0 = src.m_dim.N0;
549 dst.m_dim.N1 = src.m_dim.N1;
550 dst.m_dim.N2 = src.m_dim.N2;
551 dst.m_dim.N3 = src.m_dim.N3;
555 AssignFadDim7<FadStaticDim>::eval( dst , src , 4 );
559 template <
unsigned FadStaticDim>
struct AssignDim<5u,FadStaticDim> {
560 template <
typename Src,
typename Dst>
562 static void eval(Dst& dst,
const Src& src) {
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;
570 AssignFadDim7<FadStaticDim>::eval( dst , src , 5 );
574 template <
unsigned FadStaticDim>
struct AssignDim<6u,FadStaticDim> {
575 template <
typename Src,
typename Dst>
577 static void eval(Dst& dst,
const Src& src) {
578 dst.m_dim.N0 = src.m_dim.N0;
579 dst.m_dim.N1 = src.m_dim.N1;
580 dst.m_dim.N2 = src.m_dim.N2;
581 dst.m_dim.N3 = src.m_dim.N3;
582 dst.m_dim.N4 = src.m_dim.N4;
583 dst.m_dim.N5 = src.m_dim.N5;
585 AssignFadDim7<FadStaticDim>::eval( dst , src , 6 );
589 template <
unsigned FadStaticDim>
struct AssignDim<7u,FadStaticDim> {
590 template <
typename Src,
typename Dst>
592 static void eval(Dst& dst,
const Src& src) {
593 dst.m_dim.N0 = src.m_dim.N0;
594 dst.m_dim.N1 = src.m_dim.N1;
595 dst.m_dim.N2 = src.m_dim.N2;
596 dst.m_dim.N3 = src.m_dim.N3;
597 dst.m_dim.N4 = src.m_dim.N4;
598 dst.m_dim.N5 = src.m_dim.N5;
599 dst.m_dim.N6 = src.m_dim.N6;
600 AssignFadDim7<FadStaticDim>::eval( dst , src , 7 );
610 template<
class DstTraits ,
class SrcTraits >
611 class ViewMapping< DstTraits , SrcTraits ,
612 typename
std::enable_if<(
613 std::is_same< typename DstTraits::memory_space
614 , typename SrcTraits::memory_space >::value
617 ( std::is_same< typename DstTraits::specialize
618 , ViewSpecializeSacadoFad >::value
620 std::is_same< typename DstTraits::specialize , void >::value
624 std::is_same< typename SrcTraits::specialize
625 , ViewSpecializeSacadoFad >::value
626 ), ViewToDynRankViewTag >::type >
630 enum { is_assignable =
true };
632 typedef Kokkos::Experimental::Impl::SharedAllocationTracker TrackType ;
633 typedef ViewMapping< DstTraits , void > DstType ;
634 typedef ViewMapping< SrcTraits , void > SrcFadType ;
636 template<
class S ,
class D >
638 typename std::enable_if<(
639 std::is_same< S , ViewSpecializeSacadoFad >::value
641 assign_fad_size(
D & dst ,
const SrcFadType & src )
642 { dst.m_fad_size = src.m_fad_size.value ;
643 dst.m_fad_stride = src.m_fad_stride.value ;
646 template<
class S ,
class D >
648 typename std::enable_if<(
649 ! std::is_same< S , ViewSpecializeSacadoFad >::value
651 assign_fad_size(
D & ,
const SrcFadType & ) {}
654 template <
typename DT ,
typename ... DP ,
typename ST ,
typename ... SP >
656 void assign( Kokkos::DynRankView< DT , DP... > & dst
657 ,
const Kokkos::View< ST , SP... >& src )
661 std::is_same<
typename DstTraits::array_layout
662 , Kokkos::LayoutLeft >::value ||
663 std::is_same<
typename DstTraits::array_layout
664 , Kokkos::LayoutRight >::value ||
665 std::is_same<
typename DstTraits::array_layout
666 , Kokkos::LayoutStride >::value
670 std::is_same<
typename SrcTraits::array_layout
671 , Kokkos::LayoutLeft >::value ||
672 std::is_same<
typename SrcTraits::array_layout
673 , Kokkos::LayoutRight >::value ||
674 std::is_same<
typename SrcTraits::array_layout
675 , Kokkos::LayoutStride >::value
677 ,
"View of FAD requires LayoutLeft, LayoutRight, or LayoutStride" );
680 std::is_same<
typename DstTraits::value_type
681 ,
typename SrcTraits::value_type >::value ||
682 std::is_same<
typename DstTraits::value_type
683 ,
typename SrcTraits::const_value_type >::value ,
684 "View assignment must have same value type or const = non-const" );
686 typedef ViewMapping< SrcTraits, void> SrcType;
687 enum { FadStaticDim = SrcType::FadStaticDimension };
689 AssignDim<SrcTraits::rank,FadStaticDim>::eval(dst.m_map.m_offset, src.m_map.m_offset);
691 dst.m_map.m_handle = src.m_map.m_handle ;
692 dst.m_rank = src.Rank ;
693 dst.m_map.m_offset.m_stride = src.m_map.m_offset.m_stride ;
695 ViewMapping::template assign_fad_size< typename DstTraits::specialize >( dst.m_map , src.m_map );
703 template <
typename view_type>
704 struct is_dynrankview_fad {
static const bool value =
false; };
706 template <
typename T,
typename ... P>
707 struct is_dynrankview_fad< DynRankView<
T,P...> > {
708 typedef DynRankView<
T,P...> view_type;
709 static const bool value =
710 std::is_same<
typename view_type::specialize,
711 Experimental::Impl::ViewSpecializeSacadoFad >::value;
714 template <
typename T,
typename ... P>
717 std::enable_if< is_dynrankview_fad< DynRankView<
T,P...> >::value,
unsigned >::type
719 return view.implementation_map().dimension_scalar();
722 namespace Experimental {
725 template<
class DT,
class ... DP >
727 const DynRankView<DT,DP...> & view ,
728 const typename Sacado::ScalarType<
typename DynRankView<DT,DP...>::value_type >::type & value
729 ,
typename std::enable_if<(
730 std::is_same<
typename ViewTraits<DT,DP...>::specialize
731 , Kokkos::Experimental::Impl::ViewSpecializeSacadoFad >::value
735 std::is_same<
typename ViewTraits<DT,DP...>::value_type ,
736 typename ViewTraits<DT,DP...>::non_const_value_type >::value
737 ,
"Can only deep copy into non-const type" );
739 Kokkos::Experimental::Impl::DynRankViewFill< DynRankView<DT,DP...> >( view , value );
743 template<
class DT,
class ... DP >
745 const DynRankView<DT,DP...> & view ,
746 const typename DynRankView<DT,DP...>::value_type & value
747 ,
typename std::enable_if<(
748 std::is_same<
typename ViewTraits<DT,DP...>::specialize
749 , Kokkos::Experimental::Impl::ViewSpecializeSacadoFad >::value
753 std::is_same<
typename ViewTraits<DT,DP...>::value_type ,
754 typename ViewTraits<DT,DP...>::non_const_value_type >::value
755 ,
"Can only deep copy into non-const type" );
757 Kokkos::Experimental::Impl::DynRankViewFill< DynRankView<DT,DP...> >( view , value );
760 template<
class DstType ,
class SrcType >
763 (
const DstType & dst
764 ,
const SrcType & src
765 ,
typename std::enable_if<(
766 std::is_same<
typename DstType::traits::specialize
767 , Kokkos::Experimental::Impl::ViewSpecializeSacadoFad >::value
769 std::is_same<
typename SrcType::traits::specialize
770 , Kokkos::Experimental::Impl::ViewSpecializeSacadoFad >::value
772 ( Kokkos::Experimental::is_dyn_rank_view<DstType>::value || Kokkos::Experimental::is_dyn_rank_view<SrcType
777 std::is_same<
typename DstType::traits::value_type ,
778 typename DstType::traits::non_const_value_type >::value
779 ,
"deep_copy requires non-const destination type" );
781 typedef DstType dst_type ;
782 typedef SrcType src_type ;;
784 typedef typename dst_type::execution_space dst_execution_space ;
785 typedef typename src_type::execution_space src_execution_space ;
786 typedef typename dst_type::memory_space dst_memory_space ;
787 typedef typename src_type::memory_space src_memory_space ;
789 enum { DstExecCanAccessSrc =
790 Kokkos::Impl::VerifyExecutionCanAccessMemorySpace< typename dst_execution_space::memory_space , src_memory_space >::value };
792 enum { SrcExecCanAccessDst =
793 Kokkos::Impl::VerifyExecutionCanAccessMemorySpace< typename src_execution_space::memory_space , dst_memory_space >::value };
795 if ( (
void *) dst.data() != (
void*) src.data() ) {
801 if ( rank(src) == 0 && rank(dst) == 0 )
803 typedef typename dst_type::value_type value_type ;
804 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() ,
sizeof(value_type) );
806 else if ( std::is_same<
typename DstType::traits::value_type ,
807 typename SrcType::traits::non_const_value_type >::value &&
809 ( std::is_same<
typename DstType::traits::array_layout ,
810 typename SrcType::traits::array_layout >::value
812 ( std::is_same<
typename DstType::traits::array_layout ,
813 typename Kokkos::LayoutLeft>::value
815 std::is_same<
typename DstType::traits::array_layout ,
816 typename Kokkos::LayoutRight>::value
828 dst.span() == src.span() &&
829 dst.dimension_0() == src.dimension_0() &&
830 dst.dimension_1() == src.dimension_1() &&
831 dst.dimension_2() == src.dimension_2() &&
832 dst.dimension_3() == src.dimension_3() &&
833 dst.dimension_4() == src.dimension_4() &&
834 dst.dimension_5() == src.dimension_5() &&
835 dst.dimension_6() == src.dimension_6() &&
836 dst.dimension_7() == src.dimension_7() ) {
840 const size_t nbytes =
sizeof(
typename dst_type::value_type::value_type) * dst.span() ;
843 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() , nbytes );
845 else if ( std::is_same<
typename DstType::traits::value_type ,
846 typename SrcType::traits::non_const_value_type >::value &&
848 ( std::is_same<
typename DstType::traits::array_layout ,
849 typename SrcType::traits::array_layout >::value
851 std::is_same<
typename DstType::traits::array_layout ,
852 typename Kokkos::LayoutStride>::value
863 dst.span() == src.span() &&
864 dst.dimension_0() == src.dimension_0() &&
865 dst.dimension_1() == src.dimension_1() &&
866 dst.dimension_2() == src.dimension_2() &&
867 dst.dimension_3() == src.dimension_3() &&
868 dst.dimension_4() == src.dimension_4() &&
869 dst.dimension_5() == src.dimension_5() &&
870 dst.dimension_6() == src.dimension_6() &&
871 dst.dimension_7() == src.dimension_7() &&
872 dst.stride_0() == src.stride_0() &&
873 dst.stride_1() == src.stride_1() &&
874 dst.stride_2() == src.stride_2() &&
875 dst.stride_3() == src.stride_3() &&
876 dst.stride_4() == src.stride_4() &&
877 dst.stride_5() == src.stride_5() &&
878 dst.stride_6() == src.stride_6() &&
879 dst.stride_7() == src.stride_7()
882 const size_t nbytes =
sizeof(
typename dst_type::value_type::value_type) * dst.span() ;
884 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() , nbytes );
886 else if ( DstExecCanAccessSrc ) {
888 Kokkos::Experimental::Impl::DynRankViewRemap< dst_type , src_type >( dst , src );
890 else if ( SrcExecCanAccessDst ) {
892 Kokkos::Experimental::Impl::DynRankViewRemap< dst_type , src_type , src_execution_space >( dst , src );
895 Kokkos::Impl::throw_runtime_exception(
"deep_copy given views that would require a temporary allocation");
902 using Kokkos::Experimental::deep_copy;
906 #endif //defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC) 908 #endif // defined(HAVE_SACADO_KOKKOSCONTAINERS)
Base template specification for ScalarType.
#define KOKKOS_INLINE_FUNCTION
unsigned dimension_scalar(const View &v, const ViewPack &... views)