Stokhos Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Stokhos_KokkosViewFadMPVectorUnitTest.hpp
Go to the documentation of this file.
1// @HEADER
2// ***********************************************************************
3//
4// Stokhos Package
5// Copyright (2009) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Eric T. Phipps (etphipp@sandia.gov).
38//
39// ***********************************************************************
40// @HEADER
41
42#include "Teuchos_TestingHelpers.hpp"
43#include "Teuchos_UnitTestHelpers.hpp"
45
46#include "Kokkos_View_Fad_Fwd.hpp"
48#include "Stokhos_Ensemble_Sizes.hpp"
49#include "Sacado.hpp"
51
52// For computing DeviceConfig
53#include "Kokkos_Core.hpp"
54
55//
56// Tests various View< Fad< Sacado::MP::Vector<...> >,...> operations work
57// as expected
58//
59
60// Helper functions
61
62template <typename scalar, typename ordinal>
63inline
64scalar generate_vector_coefficient( const ordinal nFEM,
65 const ordinal nStoch,
66 const ordinal iColFEM,
67 const ordinal iStoch )
68{
69 const scalar X_fem = 100.0 + scalar(iColFEM) / scalar(nFEM);
70 const scalar X_stoch = 1.0 + scalar(iStoch) / scalar(nStoch);
71 return X_fem + X_stoch;
72 //return 1.0;
73}
74
75template <typename ViewType>
76bool
77checkVectorView(const ViewType& v,
78 Teuchos::FancyOStream& out) {
79 typedef ViewType view_type;
80 typedef typename view_type::size_type size_type;
81 typedef typename view_type::HostMirror host_view_type;
82 typedef typename host_view_type::array_type host_array_type;
83 typedef typename host_array_type::value_type scalar_type;
84
85 // Copy to host
86 host_view_type h_v = Kokkos::create_mirror_view(v);
87 Kokkos::deep_copy(h_v, v);
88 host_array_type h_a = h_v;
89
90 size_type num_rows, num_cols;
91
92 // For static, layout left, sacado dimension becomes first dimension
93 // instead of last
94 bool is_right = std::is_same< typename ViewType::array_layout,
95 Kokkos::LayoutRight >::value;
96 if (is_right || !view_type::is_contiguous) {
97 num_rows = h_a.extent(0);
98 num_cols = h_a.extent(1);
99 }
100 else {
101 num_rows = h_a.extent(1);
102 num_cols = h_a.extent(0);
103 }
104 bool success = true;
105 if (is_right || !view_type::is_contiguous) {
106 for (size_type i=0; i<num_rows; ++i) {
107 for (size_type j=0; j<num_cols; ++j) {
108 scalar_type val = h_a(i,j);
109 scalar_type val_expected =
110 generate_vector_coefficient<scalar_type>(
111 num_rows, num_cols, i, j);
112 TEUCHOS_TEST_EQUALITY(val, val_expected, out, success);
113 }
114 }
115 }
116 else {
117 for (size_type i=0; i<num_rows; ++i) {
118 for (size_type j=0; j<num_cols; ++j) {
119 scalar_type val = h_a(j,i);
120 scalar_type val_expected =
121 generate_vector_coefficient<scalar_type>(
122 num_rows, num_cols, i, j);
123 TEUCHOS_TEST_EQUALITY(val, val_expected, out, success);
124 }
125 }
126 }
127
128 return success;
129}
130
131template <typename ViewType>
132bool
133checkConstantFadVectorView(const ViewType& view,
134 const typename ViewType::value_type& v,
135 Teuchos::FancyOStream& out) {
136 typedef ViewType view_type;
137 typedef typename view_type::value_type fad_vector_type;
138 typedef typename fad_vector_type::value_type vector_type;
139 typedef typename vector_type::storage_type storage_type;
140 typedef typename view_type::size_type size_type;
141 typedef typename view_type::HostMirror host_view_type;
142
143 // Copy to host
144 host_view_type h_view = Kokkos::create_mirror_view(view);
145 Kokkos::deep_copy(h_view, view);
146
147 const size_type num_rows = h_view.extent(0);
148 const size_type num_fad = Kokkos::dimension_scalar(h_view)-1;
149 const size_type num_ensemble = storage_type::static_size;
150 bool success = true;
151 for (size_type i=0; i<num_rows; ++i) {
152 for (size_type k=0; k<num_ensemble; ++k) {
153 TEUCHOS_TEST_EQUALITY(h_view(i).val().coeff(k), v.val().coeff(k), out, success);
154 for (size_type j=0; j<num_fad; ++j) {
155 TEUCHOS_TEST_EQUALITY(h_view(i).dx(j).coeff(k), v.dx(j).coeff(k), out, success);
156 }
157 }
158 }
159
160 return success;
161}
162
163template <typename ViewType>
164bool
165checkConstantFadVectorView2(const ViewType& view,
166 const typename ViewType::value_type& v,
167 Teuchos::FancyOStream& out) {
168 typedef ViewType view_type;
169 typedef typename view_type::value_type fad_vector_type;
170 typedef typename fad_vector_type::value_type vector_type;
171 typedef typename vector_type::storage_type storage_type;
172 typedef typename view_type::size_type size_type;
173 typedef typename view_type::HostMirror host_view_type;
174
175 // Copy to host
176 host_view_type h_view = Kokkos::create_mirror_view(view);
177 Kokkos::deep_copy(h_view, view);
178
179 bool success = true;
180 const size_type num_fad = Kokkos::dimension_scalar(h_view)-1;
181 const size_type num_ensemble = storage_type::static_size;
182 for (size_type i0=0; i0<h_view.extent(0); ++i0) {
183 for (size_type i1=0; i1<h_view.extent(1); ++i1) {
184 for (size_type i2=0; i2<h_view.extent(2); ++i2) {
185 for (size_type i3=0; i3<h_view.extent(3); ++i3) {
186 for (size_type i4=0; i4<h_view.extent(4); ++i4) {
187 for (size_type i5=0; i5<h_view.extent(5); ++i5) {
188 for (size_type i6=0; i6<h_view.extent(6); ++i6) {
189 for (size_type k=0; k<num_ensemble; ++k)
190 TEUCHOS_TEST_EQUALITY(h_view.access(i0,i1,i2,i3,i4,i5,i6,0).val().coeff(k),
191 v.val().coeff(k), out, success);
192 for (size_type j=0; j<num_fad; ++j) {
193 for (size_type k=0; k<num_ensemble; ++k)
194 TEUCHOS_TEST_EQUALITY(h_view.access(i0,i1,i2,i3,i4,i5,i6,0).dx(j).coeff(k),
195 v.dx(j).coeff(k), out, success);
196 }
197 }}}}}}}
198
199 return success;
200}
201
202template <typename DataType, typename LayoutType, typename ExecutionSpace>
203struct ApplyView {
204 typedef Kokkos::View<DataType,LayoutType,ExecutionSpace> type;
205};
206
207struct NoLayout {};
208template <typename DataType, typename ExecutionSpace>
209struct ApplyView<DataType,NoLayout,ExecutionSpace> {
210 typedef Kokkos::View<DataType,ExecutionSpace> type;
211};
212
213//
214// Tests
215//
216
217const int global_num_rows = 11;
218const int global_ensemble_size = STOKHOS_DEFAULT_ENSEMBLE_SIZE;
219const int global_fad_size = 5;
220
221TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Kokkos_View_Fad_MP, Size, Scalar, Layout )
222{
223 typedef typename Scalar::value_type Vector;
224 typedef typename Vector::execution_space Device;
225 typedef typename ApplyView<Scalar*,Layout,Device>::type ViewType;
226 typedef typename ViewType::size_type size_type;
227
228 const size_type num_rows = global_num_rows;
229 const size_type num_cols = global_fad_size+1;
230 ViewType v("view", num_rows, num_cols);
231 TEUCHOS_TEST_EQUALITY(v.size(), num_rows, out, success);
232}
233
234TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Kokkos_View_Fad_MP, DeepCopy_ConstantScalar, Scalar, Layout )
235{
236 typedef typename Scalar::value_type Vector;
237 typedef typename Vector::value_type BaseScalar;
238 typedef typename Vector::execution_space Device;
239 typedef typename ApplyView<Scalar*,Layout,Device>::type ViewType;
240 typedef typename ViewType::size_type size_type;
241
242 const size_type num_rows = global_num_rows;
243 const size_type num_cols = global_fad_size+1;
244 ViewType v("view", num_rows, num_cols);
245 BaseScalar val = 1.2345;
246
247 Kokkos::deep_copy( v, val );
248
249 success = checkConstantFadVectorView(v, Scalar(val), out);
250}
251
252TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Kokkos_View_Fad_MP, Rank6, Scalar, Layout )
253{
254 // Try and create a rank-6 view
255 typedef typename Scalar::value_type Vector;
256 typedef typename Vector::value_type BaseScalar;
257 typedef typename Vector::execution_space Device;
258 typedef typename ApplyView<Scalar******,Layout,Device>::type ViewType;
259
260 ViewType v("view", 1, 2, 3, 4, 4, 3, global_fad_size+1);
261 BaseScalar val = 1.2345;
262
263 Kokkos::deep_copy( v, val );
264
265 success = checkConstantFadVectorView2(v, Scalar(val), out);
266}
267
268#define VIEW_FAD_MP_VECTOR_TESTS_SCALAR_LAYOUT( SCALAR, LAYOUT ) \
269 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( \
270 Kokkos_View_Fad_MP, Size, SCALAR, LAYOUT ) \
271 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( \
272 Kokkos_View_Fad_MP, DeepCopy_ConstantScalar, SCALAR, LAYOUT ) \
273 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( \
274 Kokkos_View_Fad_MP, Rank6, SCALAR, LAYOUT )
275
276#define VIEW_FAD_MP_VECTOR_TESTS_SCALAR( SCALAR ) \
277 using Kokkos::LayoutLeft; \
278 using Kokkos::LayoutRight; \
279 VIEW_FAD_MP_VECTOR_TESTS_SCALAR_LAYOUT(SCALAR, NoLayout) \
280 VIEW_FAD_MP_VECTOR_TESTS_SCALAR_LAYOUT(SCALAR, LayoutLeft) \
281 VIEW_FAD_MP_VECTOR_TESTS_SCALAR_LAYOUT(SCALAR, LayoutRight)
282
283#define VIEW_FAD_MP_VECTOR_TESTS_DEVICE( DEVICE ) \
284 typedef Stokhos::StaticFixedStorage<int,double,global_ensemble_size,DEVICE> SFS; \
285 typedef Sacado::MP::Vector< SFS > MP_SFS; \
286 typedef Sacado::Fad::DFad< MP_SFS > Fad_MP_SFS; \
287 VIEW_FAD_MP_VECTOR_TESTS_SCALAR( Fad_MP_SFS )
expr val()
expr expr expr dx(i, j)
TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL(Kokkos_View_Fad_MP, Size, Scalar, Layout)
bool checkConstantFadVectorView2(const ViewType &view, const typename ViewType::value_type &v, Teuchos::FancyOStream &out)
bool checkVectorView(const ViewType &v, Teuchos::FancyOStream &out)
bool checkConstantFadVectorView(const ViewType &view, const typename ViewType::value_type &v, Teuchos::FancyOStream &out)
scalar generate_vector_coefficient(const ordinal nFEM, const ordinal nStoch, const ordinal iColFEM, const ordinal iStoch)
Stokhos::StandardStorage< int, double > storage_type
KOKKOS_INLINE_FUNCTION constexpr std::enable_if< is_view_uq_pce< View< T, P... > >::value, unsigned >::type dimension_scalar(const View< T, P... > &view)
Kokkos::View< DataType, LayoutType, ExecutionSpace > type