Sacado Package Browser (Single Doxygen Collection)
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
src
Kokkos_ViewFactory.hpp
Go to the documentation of this file.
1
// @HEADER
2
// ***********************************************************************
3
//
4
// Sacado Package
5
// Copyright (2006) Sandia Corporation
6
//
7
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8
// the U.S. Government retains certain rights in this software.
9
//
10
// This library is free software; you can redistribute it and/or modify
11
// it under the terms of the GNU Lesser General Public License as
12
// published by the Free Software Foundation; either version 2.1 of the
13
// License, or (at your option) any later version.
14
//
15
// This library is distributed in the hope that it will be useful, but
16
// WITHOUT ANY WARRANTY; without even the implied warranty of
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
// Lesser General Public License for more details.
19
//
20
// You should have received a copy of the GNU Lesser General Public
21
// License along with this library; if not, write to the Free Software
22
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23
// USA
24
// Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
25
// (etphipp@sandia.gov).
26
//
27
// ***********************************************************************
28
// @HEADER
29
30
#ifndef KOKKOS_VIEW_FACTORY_HPP
31
#define KOKKOS_VIEW_FACTORY_HPP
32
33
#include <type_traits>
34
35
#include "
Sacado_Traits.hpp
"
36
#include "
KokkosExp_View_Fad.hpp
"
37
#include "
Kokkos_DynRankView_Fad.hpp
"
38
39
namespace
Kokkos
{
40
41
namespace
Impl
{
42
43
// Class to determine the value_type for a view as a function of one or more
44
// input views
45
template
<
class
... ViewPack>
46
struct
ViewFactoryType
{};
47
48
template
<
class
View>
49
struct
ViewFactoryType
<
View
> {
50
typedef
typename
View::value_type
type
;
51
};
52
53
template
<
class
View
,
class
... ViewPack>
54
struct
ViewFactoryType
<
View
,ViewPack...> {
55
typedef
typename
Sacado::Promote
<
56
typename
View::value_type,
57
typename
ViewFactoryType
<ViewPack...>
::type
58
>
::type
type
;
59
};
60
61
}
62
63
// Function to compute the scalar dimension (e.g., Fad dimesion) from one or
64
// more views. It relies on the overload for a single view provided by Sacado
65
66
// Traits class used to create a view for a given rank and dimension as a
67
// function of one or more views. The value_type for the view is determined
68
// by value_type, and the view is created through the create_view() function.
69
// The calling code must determine the rank and dimensions of the view to create
70
// however internal Sacado dimension will be determined automatically.
71
template
<
class
... ViewPack>
72
struct
ViewFactory
{
73
74
typedef
typename
Impl::ViewFactoryType
<ViewPack...>
::type
value_type
;
75
76
template
<
class
ResultView,
class
CtorProp,
class
... Dims>
77
static
ResultView
78
create_view
(
const
ViewPack& ... views,
79
const
CtorProp& prop,
80
const
Dims ... dims) {
81
82
using
nc_value_type =
typename
ResultView::non_const_value_type;
83
constexpr
bool
is_scalar =
Sacado::IsScalarType<nc_value_type>::value
;
84
constexpr
bool
is_dyn_rank = is_dyn_rank_view<ResultView>::value;
85
86
// rank == number of arguments
87
constexpr
unsigned
rank =
sizeof
...(Dims);
88
89
// Check rank is valid
90
static_assert
( rank <= 7,
"Invalid rank...too many dimension arguments"
);
91
92
// Create layout from our dimension arguments
93
typename
ResultView::array_layout layout(dims...);
94
95
// Set scalar dimension
96
layout.dimension[rank] = dimension_scalar(views...);
97
98
// Handle the case where all of the input view's are scalar's, but the
99
// result isn't (e.g., a Fad), in which case we have to specify a valid
100
// scalar dimension
101
if
(!is_scalar && layout.dimension[rank] == 0)
102
layout.dimension[rank] = 1;
103
104
// Reconstruct layout for dynamic rank
105
if
(is_dyn_rank) {
106
constexpr
unsigned
r = is_scalar ? rank : rank + 1;
107
layout = Impl::reconstructLayout(layout, r);
108
}
109
110
return
ResultView(prop, layout);
111
}
112
113
};
114
116
template
<
typename
ResultViewType,
typename
InputViewType,
typename
CtorProp,
117
typename
... Dims>
118
typename
std::enable_if<
119
is_view<InputViewType>::value || is_dyn_rank_view<InputViewType>::value,
120
ResultViewType>
::type
121
createDynRankViewWithType
(
const
InputViewType&
a
,
122
const
CtorProp& prop,
123
const
Dims... dims)
124
{
125
using
view_factory =
Kokkos::ViewFactory<InputViewType>
;
126
return
view_factory::template create_view<ResultViewType>(
a
,prop,dims...);
127
}
128
129
namespace
Impl {
130
// Helper type trait to determine type of resulting DynRankView from
131
// createDynRankView below
132
template
<
typename
InputView>
133
struct
ResultDynRankView
{
134
// Allow for use of LayoutStride in InputViewType. We don't want to create
135
// a new view with LayoutStride, so replace it with the default layout
136
// instead.
137
using
input_value
=
typename
InputView::non_const_value_type;
138
using
input_layout
=
typename
InputView::array_layout;
139
using
input_device
=
typename
InputView::device_type;
140
using
default_layout
=
typename
input_device::execution_space::array_layout;
141
using
result_layout
=
142
typename
std::conditional<
143
std::is_same< input_layout, Kokkos::LayoutStride >::value,
144
default_layout
,
145
input_layout
>
::type
;
146
using
type
=
147
Kokkos::DynRankView<input_value, result_layout, input_device>;
148
};
149
150
}
151
153
template
<
typename
InputViewType,
typename
CtorProp,
typename
... Dims >
154
typename
std::enable_if<
155
is_view<InputViewType>::value || is_dyn_rank_view<InputViewType>::value,
156
typename
Impl::ResultDynRankView<InputViewType>::type
157
>
::type
158
createDynRankView
(
const
InputViewType&
a
,
159
const
CtorProp& prop,
160
const
Dims... dims)
161
{
162
using
ResultViewType =
typename
Impl::ResultDynRankView<InputViewType>::type
;
163
return
createDynRankViewWithType<ResultViewType>
(
a
, prop, dims...);
164
}
165
167
template
<
typename
ResultViewType,
typename
InputViewType,
typename
CtorProp,
168
typename
... Dims>
169
typename
std::enable_if<
170
is_view<InputViewType>::value || is_dyn_rank_view<InputViewType>::value,
171
ResultViewType>
::type
172
createViewWithType
(
const
InputViewType&
a
,
173
const
CtorProp& prop,
174
const
Dims... dims)
175
{
176
using
view_factory =
Kokkos::ViewFactory<InputViewType>
;
177
return
view_factory::template create_view<ResultViewType>(
a
,prop,dims...);
178
}
179
180
}
181
182
#endif
/* #ifndef KOKKOS_VIEW_FACTORY_HPP */
View
View
KokkosExp_View_Fad.hpp
Kokkos_DynRankView_Fad.hpp
a
a
Definition
Sacado_CacheFad_Ops.hpp:426
Sacado_Traits.hpp
Kokkos::Impl
Definition
Kokkos_LayoutContiguous.hpp:114
Kokkos
Definition
Kokkos_LayoutContiguous.hpp:46
Kokkos::createDynRankView
std::enable_if< is_view< InputViewType >::value||is_dyn_rank_view< InputViewType >::value, typenameImpl::ResultDynRankView< InputViewType >::type >::type createDynRankView(const InputViewType &a, const CtorProp &prop, const Dims... dims)
Wrapper to simplify use of Sacado ViewFactory.
Definition
Kokkos_ViewFactory.hpp:158
Kokkos::createViewWithType
std::enable_if< is_view< InputViewType >::value||is_dyn_rank_view< InputViewType >::value, ResultViewType >::type createViewWithType(const InputViewType &a, const CtorProp &prop, const Dims... dims)
Wrapper to simplify use of Sacado ViewFactory.
Definition
Kokkos_ViewFactory.hpp:172
Kokkos::createDynRankViewWithType
std::enable_if< is_view< InputViewType >::value||is_dyn_rank_view< InputViewType >::value, ResultViewType >::type createDynRankViewWithType(const InputViewType &a, const CtorProp &prop, const Dims... dims)
Wrapper to simplify use of Sacado ViewFactory.
Definition
Kokkos_ViewFactory.hpp:121
Kokkos::Impl::ResultDynRankView
Definition
Kokkos_ViewFactory.hpp:133
Kokkos::Impl::ResultDynRankView::input_value
typename InputView::non_const_value_type input_value
Definition
Kokkos_ViewFactory.hpp:137
Kokkos::Impl::ResultDynRankView::input_device
typename InputView::device_type input_device
Definition
Kokkos_ViewFactory.hpp:139
Kokkos::Impl::ResultDynRankView::result_layout
typename std::conditional< std::is_same< input_layout, Kokkos::LayoutStride >::value, default_layout, input_layout >::type result_layout
Definition
Kokkos_ViewFactory.hpp:141
Kokkos::Impl::ResultDynRankView::type
Kokkos::DynRankView< input_value, result_layout, input_device > type
Definition
Kokkos_ViewFactory.hpp:146
Kokkos::Impl::ResultDynRankView::input_layout
typename InputView::array_layout input_layout
Definition
Kokkos_ViewFactory.hpp:138
Kokkos::Impl::ResultDynRankView::default_layout
typename input_device::execution_space::array_layout default_layout
Definition
Kokkos_ViewFactory.hpp:140
Kokkos::Impl::ViewFactoryType< View, ViewPack... >::type
Sacado::Promote< typenameView::value_type, typenameViewFactoryType< ViewPack... >::type >::type type
Definition
Kokkos_ViewFactory.hpp:58
Kokkos::Impl::ViewFactoryType< View >::type
View::value_type type
Definition
Kokkos_ViewFactory.hpp:50
Kokkos::Impl::ViewFactoryType
Definition
Kokkos_ViewFactory.hpp:46
Kokkos::ViewFactory
Definition
Kokkos_ViewFactory.hpp:72
Kokkos::ViewFactory::value_type
Impl::ViewFactoryType< ViewPack... >::type value_type
Definition
Kokkos_ViewFactory.hpp:74
Kokkos::ViewFactory::create_view
static ResultView create_view(const ViewPack &... views, const CtorProp &prop, const Dims ... dims)
Definition
Kokkos_ViewFactory.hpp:78
type
Sacado::IsScalarType::value
static const bool value
Definition
Sacado_Traits.hpp:347
Sacado::Promote
Base template specification for Promote.
Definition
Sacado_Traits.hpp:106
Generated by
1.17.0