50 #include <Kokkos_Core.hpp>
60 template <
typename VectorType>
84 for (
int i=0; i<
sz; i++) {
85 x.fastAccessCoeff(i) = 0.1*i;
86 y.fastAccessCoeff(i) = 0.25*i;
91 #define UNARY_UNIT_TEST(VEC, OP, OPNAME) \
92 TEUCHOS_UNIT_TEST( VEC, OPNAME) { \
94 UTS::vec_type u = OP(setup.x); \
95 UTS::vec_type v(setup.sz, 0.0); \
96 for (int i=0; i<setup.sz; i++) \
97 v.fastAccessCoeff(i) = OP(setup.x.fastAccessCoeff(i)); \
98 success = compareVecs(u, "u",v, "v", \
99 setup.rtol, setup.atol, out); \
101 TEUCHOS_UNIT_TEST( VEC, OPNAME##_const) { \
103 UTS::vec_type u = OP(setup.cx); \
104 UTS::vec_type v(1, 0.0); \
105 for (int i=0; i<v.size(); i++) \
106 v.fastAccessCoeff(i) = OP(setup.cx.fastAccessCoeff(0)); \
107 success = compareVecs(u, "u",v, "v", \
108 setup.rtol, setup.atol, out); \
110 TEUCHOS_UNIT_TEST( VEC, OPNAME##_resize) { \
114 UTS::vec_type v(setup.sz, 0.0); \
115 for (int i=0; i<setup.sz; i++) \
116 v.fastAccessCoeff(i) = OP(setup.x.fastAccessCoeff(i)); \
117 success = compareVecs(u, "u",v, "v", \
118 setup.rtol, setup.atol, out); \
121 #define BINARY_UNIT_TEST(VEC, OP, OPNAME) \
122 TEUCHOS_UNIT_TEST( VEC, OPNAME) { \
124 UTS::vec_type u = setup.x OP setup.y; \
125 UTS::vec_type v(setup.sz, 0.0); \
126 for (int i=0; i<setup.sz; i++) \
127 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
128 setup.y.fastAccessCoeff(i); \
129 success = compareVecs(u, "u",v, "v", \
130 setup.rtol, setup.atol, out); \
132 TEUCHOS_UNIT_TEST( VEC, OPNAME##_left_const) { \
134 UTS::vec_type u = setup.a OP setup.y; \
135 UTS::vec_type v(setup.sz, 0.0); \
136 for (int i=0; i<setup.sz; i++) \
137 v.fastAccessCoeff(i) = setup.a OP setup.y.fastAccessCoeff(i); \
138 success = compareVecs(u, "u",v, "v", \
139 setup.rtol, setup.atol, out); \
141 TEUCHOS_UNIT_TEST( VEC, OPNAME##_right_const) { \
143 UTS::vec_type u = setup.x OP setup.a ; \
144 UTS::vec_type v(setup.sz, 0.0); \
145 for (int i=0; i<setup.sz; i++) \
146 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
148 success = compareVecs(u, "u",v, "v", \
149 setup.rtol, setup.atol, out); \
151 TEUCHOS_UNIT_TEST( VEC, OPNAME##_both_const) { \
153 UTS::vec_type u = setup.cx OP setup.cx; \
154 UTS::vec_type v(1, 0.0); \
155 for (int i=0; i<v.size(); i++) \
156 v.fastAccessCoeff(i) = setup.cx.fastAccessCoeff(0) OP \
157 setup.cx.fastAccessCoeff(0); \
158 success = compareVecs(u, "u",v, "v", \
159 setup.rtol, setup.atol, out); \
161 TEUCHOS_UNIT_TEST( VEC, OPNAME##_left_const2) { \
163 UTS::vec_type u = setup.cx OP setup.x; \
164 UTS::vec_type v(setup.sz, 0.0); \
165 for (int i=0; i<setup.sz; i++) \
166 v.fastAccessCoeff(i) = setup.cx.fastAccessCoeff(0) OP \
167 setup.x.fastAccessCoeff(i); \
168 success = compareVecs(u, "u",v, "v", \
169 setup.rtol, setup.atol, out); \
171 TEUCHOS_UNIT_TEST( VEC, OPNAME##_right_const2) { \
173 UTS::vec_type u = setup.x OP setup.cx; \
174 UTS::vec_type v(setup.sz, 0.0); \
175 for (int i=0; i<setup.sz; i++) \
176 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
177 setup.cx.fastAccessCoeff(0); \
178 success = compareVecs(u, "u",v, "v", \
179 setup.rtol, setup.atol, out); \
181 TEUCHOS_UNIT_TEST( VEC, OPNAME##_resize) { \
184 u = setup.x OP setup.y; \
185 UTS::vec_type v(setup.sz, 0.0); \
186 for (int i=0; i<setup.sz; i++) \
187 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
188 setup.y.fastAccessCoeff(i); \
189 success = compareVecs(u, "u",v, "v", \
190 setup.rtol, setup.atol, out); \
192 TEUCHOS_UNIT_TEST( VEC, OPNAME##_left_const_resize) { \
195 u = setup.a OP setup.y; \
196 UTS::vec_type v(setup.sz, 0.0); \
197 for (int i=0; i<setup.sz; i++) \
198 v.fastAccessCoeff(i) = setup.a OP \
199 setup.y.fastAccessCoeff(i); \
200 success = compareVecs(u, "u",v, "v", \
201 setup.rtol, setup.atol, out); \
203 TEUCHOS_UNIT_TEST( VEC, OPNAME##_right_const_resize) { \
206 u = setup.x OP setup.a; \
207 UTS::vec_type v(setup.sz, 0.0); \
208 for (int i=0; i<setup.sz; i++) \
209 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
211 success = compareVecs(u, "u",v, "v", \
212 setup.rtol, setup.atol, out); \
215 #define BINARYFUNC_UNIT_TEST(VEC, OP, SOP, OPNAME) \
216 TEUCHOS_UNIT_TEST( VEC, OPNAME) { \
218 UTS::vec_type u = OP(setup.x,setup.y); \
219 UTS::vec_type v(setup.sz, 0.0); \
220 for (int i=0; i<setup.sz; i++) \
221 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
222 setup.y.fastAccessCoeff(i)); \
223 success = compareVecs(u, "u",v, "v", \
224 setup.rtol, setup.atol, out); \
226 TEUCHOS_UNIT_TEST( VEC, OPNAME##_left_const) { \
228 UTS::vec_type u = OP(setup.a,setup.y); \
229 UTS::vec_type v(setup.sz, 0.0); \
230 for (int i=0; i<setup.sz; i++) \
231 v.fastAccessCoeff(i) = SOP(setup.a, \
232 setup.y.fastAccessCoeff(i)); \
233 success = compareVecs(u, "u",v, "v", \
234 setup.rtol, setup.atol, out); \
236 TEUCHOS_UNIT_TEST( VEC, OPNAME##_right_const) { \
238 UTS::vec_type u = OP(setup.x,setup.a); \
239 UTS::vec_type v(setup.sz, 0.0); \
240 for (int i=0; i<setup.sz; i++) \
241 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
243 success = compareVecs(u, "u",v, "v", \
244 setup.rtol, setup.atol, out); \
246 TEUCHOS_UNIT_TEST( VEC, OPNAME##_both_const) { \
248 UTS::vec_type u = OP(setup.cx,setup.cx); \
249 UTS::vec_type v(1, 0.0); \
250 for (int i=0; i<v.size(); i++) \
251 v.fastAccessCoeff(i) = SOP(setup.cx.fastAccessCoeff(0), \
252 setup.cx.fastAccessCoeff(0)); \
253 success = compareVecs(u, "u",v, "v", \
254 setup.rtol, setup.atol, out); \
256 TEUCHOS_UNIT_TEST( VEC, OPNAME##_left_const2) { \
258 UTS::vec_type u = OP(setup.cx,setup.x); \
259 UTS::vec_type v(setup.sz, 0.0); \
260 for (int i=0; i<setup.sz; i++) \
261 v.fastAccessCoeff(i) = SOP(setup.cx.fastAccessCoeff(0), \
262 setup.x.fastAccessCoeff(i)); \
263 success = compareVecs(u, "u",v, "v", \
264 setup.rtol, setup.atol, out); \
266 TEUCHOS_UNIT_TEST( VEC, OPNAME##_right_const2) { \
268 UTS::vec_type u = OP(setup.x,setup.cx); \
269 UTS::vec_type v(setup.sz, 0.0); \
270 for (int i=0; i<setup.sz; i++) \
271 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
272 setup.cx.fastAccessCoeff(0)); \
273 success = compareVecs(u, "u",v, "v", \
274 setup.rtol, setup.atol, out); \
276 TEUCHOS_UNIT_TEST( VEC, OPNAME##_resize) { \
279 u = OP(setup.x,setup.y); \
280 UTS::vec_type v(setup.sz, 0.0); \
281 for (int i=0; i<setup.sz; i++) \
282 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
283 setup.y.fastAccessCoeff(i)); \
284 success = compareVecs(u, "u",v, "v", \
285 setup.rtol, setup.atol, out); \
287 TEUCHOS_UNIT_TEST( VEC, OPNAME##_left_const_resize) { \
290 u = OP(setup.a,setup.y); \
291 UTS::vec_type v(setup.sz, 0.0); \
292 for (int i=0; i<setup.sz; i++) \
293 v.fastAccessCoeff(i) = SOP(setup.a, \
294 setup.y.fastAccessCoeff(i)); \
295 success = compareVecs(u, "u",v, "v", \
296 setup.rtol, setup.atol, out); \
298 TEUCHOS_UNIT_TEST( VEC, OPNAME##_right_const_resize) { \
301 u = OP(setup.x,setup.a); \
302 UTS::vec_type v(setup.sz, 0.0); \
303 for (int i=0; i<setup.sz; i++) \
304 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
306 success = compareVecs(u, "u",v, "v", \
307 setup.rtol, setup.atol, out); \
310 #define OPASSIGN_UNIT_TEST(VEC, OP, OPNAME) \
311 TEUCHOS_UNIT_TEST( VEC, OPNAME) { \
313 UTS::vec_type u = std::sin(setup.x); \
314 UTS::vec_type v = std::sin(setup.x); \
316 for (int i=0; i<setup.sz; i++) \
317 v.fastAccessCoeff(i) OP setup.x.fastAccessCoeff(i); \
318 success = compareVecs(u, "u",v, "v", \
319 setup.rtol, setup.atol, out); \
321 TEUCHOS_UNIT_TEST( VEC, OPNAME##_const) { \
323 UTS::vec_type u = std::sin(setup.x); \
324 UTS::vec_type v = std::sin(setup.x); \
326 for (int i=0; i<setup.sz; i++) \
327 v.fastAccessCoeff(i) OP setup.a; \
328 success = compareVecs(u, "u",v, "v", \
329 setup.rtol, setup.atol, out); \
331 TEUCHOS_UNIT_TEST( VEC, OPNAME##_const2) { \
333 UTS::vec_type u = std::sin(setup.x); \
334 UTS::vec_type v = std::sin(setup.x); \
336 for (int i=0; i<setup.sz; i++) \
337 v.fastAccessCoeff(i) OP setup.cx.fastAccessCoeff(0); \
338 success = compareVecs(u, "u",v, "v", \
339 setup.rtol, setup.atol, out); \
341 TEUCHOS_UNIT_TEST( VEC, OPNAME##_resize) { \
343 UTS::vec_type u = setup.a; \
344 UTS::vec_type v(setup.sz, 0.0); \
346 for (int i=0; i<setup.sz; i++) { \
347 v.fastAccessCoeff(i) = setup.a; \
348 v.fastAccessCoeff(i) OP setup.x.fastAccessCoeff(i); \
350 success = compareVecs(u, "u",v, "v", \
351 setup.rtol, setup.atol, out); \
354 #define SAXPY_UNIT_TEST(VEC) \
355 TEUCHOS_UNIT_TEST( VEC, saxpy) { \
357 UTS::vec_type u = std::sin(setup.x); \
358 UTS::vec_type v = std::sin(setup.x); \
359 u += setup.x*setup.y; \
360 for (int i=0; i<setup.sz; i++) \
361 v.fastAccessCoeff(i) += \
362 setup.x.fastAccessCoeff(i)*setup.y.fastAccessCoeff(i); \
363 success = compareVecs(u, "u",v, "v", \
364 setup.rtol, setup.atol, out); \
366 TEUCHOS_UNIT_TEST( VEC, saxpy_resize) { \
368 UTS::vec_type u = setup.cx; \
369 UTS::vec_type v(setup.sz, 0.0); \
370 u += setup.x*setup.y; \
371 for (int i=0; i<setup.sz; i++) \
372 v.fastAccessCoeff(i) = setup.cx.fastAccessCoeff(0) + \
373 setup.x.fastAccessCoeff(i)*setup.y.fastAccessCoeff(i); \
374 success = compareVecs(u, "u",v, "v", \
375 setup.rtol, setup.atol, out); \
377 TEUCHOS_UNIT_TEST( VEC, saxpy_const) { \
379 UTS::vec_type u = std::sin(setup.x); \
380 UTS::vec_type v = std::sin(setup.x); \
381 u += setup.a*setup.y; \
382 for (int i=0; i<setup.sz; i++) \
383 v.fastAccessCoeff(i) += \
384 setup.a*setup.y.fastAccessCoeff(i); \
385 success = compareVecs(u, "u",v, "v", \
386 setup.rtol, setup.atol, out); \
388 TEUCHOS_UNIT_TEST( VEC, saxpy_const2) { \
390 UTS::vec_type u = std::sin(setup.x); \
391 UTS::vec_type v = std::sin(setup.x); \
392 u += setup.cx*setup.y; \
393 for (int i=0; i<setup.sz; i++) \
394 v.fastAccessCoeff(i) += \
395 setup.cx.fastAccessCoeff(0)*setup.y.fastAccessCoeff(i); \
396 success = compareVecs(u, "u",v, "v", \
397 setup.rtol, setup.atol, out); \
400 #define TERNARY_UNIT_TEST(VEC) \
401 TEUCHOS_UNIT_TEST( VEC, ternay) { \
403 UTS::vec_type u = std::sin(setup.x); \
404 UTS::vec_type v = -std::sin(setup.x); \
405 u = u >= 0 ? -u : u; \
406 success = compareVecs(u, "u", v, "v", \
407 setup.rtol, setup.atol, out); \
410 #define VECTOR_UNIT_TESTS(VEC) \
411 UNARY_UNIT_TEST(VEC, +, UnaryPlus) \
412 UNARY_UNIT_TEST(VEC, -, UnaryMinus) \
413 UNARY_UNIT_TEST(VEC, std::exp, Exp) \
414 UNARY_UNIT_TEST(VEC, std::log, Log) \
415 UNARY_UNIT_TEST(VEC, std::log10, Log10) \
416 UNARY_UNIT_TEST(VEC, std::sqrt, Sqrt) \
417 UNARY_UNIT_TEST(VEC, std::cbrt, Cbrt) \
418 UNARY_UNIT_TEST(VEC, std::sin, Sin) \
419 UNARY_UNIT_TEST(VEC, std::cos, Cos) \
420 UNARY_UNIT_TEST(VEC, std::tan, Tan) \
421 UNARY_UNIT_TEST(VEC, std::sinh, Sinh) \
422 UNARY_UNIT_TEST(VEC, std::cosh, Cosh) \
423 UNARY_UNIT_TEST(VEC, std::tanh, Tanh) \
424 UNARY_UNIT_TEST(VEC, std::asin, ASin) \
425 UNARY_UNIT_TEST(VEC, std::acos, ACos) \
426 UNARY_UNIT_TEST(VEC, std::atan, ATan) \
427 UNARY_UNIT_TEST(VEC, std::asinh, ASinh) \
428 UNARY_UNIT_TEST(VEC, std::acosh, ACosh) \
429 UNARY_UNIT_TEST(VEC, std::atanh, ATanh) \
431 BINARY_UNIT_TEST(VEC, +, Plus) \
432 BINARY_UNIT_TEST(VEC, -, Minus) \
433 BINARY_UNIT_TEST(VEC, *, Times) \
434 BINARY_UNIT_TEST(VEC, /, Divide) \
436 BINARYFUNC_UNIT_TEST(VEC, atan2, std::atan2, ATan2) \
437 BINARYFUNC_UNIT_TEST(VEC, pow, std::pow, Pow) \
438 BINARYFUNC_UNIT_TEST(VEC, max, std::max, Max) \
439 BINARYFUNC_UNIT_TEST(VEC, min, std::min, Min) \
441 OPASSIGN_UNIT_TEST(VEC, +=, PlusEqual) \
442 OPASSIGN_UNIT_TEST(VEC, -=, MinusEqual) \
443 OPASSIGN_UNIT_TEST(VEC, *=, TimesEqual) \
444 OPASSIGN_UNIT_TEST(VEC, /=, DivideEqual) \
446 SAXPY_UNIT_TEST(VEC) \
447 TERNARY_UNIT_TEST(VEC) \
449 TEUCHOS_UNIT_TEST( VEC, initializer_list_copy ) { \
451 UTS::vec_type u = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; \
452 UTS::vec_type v(setup.sz, 0.0); \
453 for (int i=0; i<setup.sz; i++) \
454 v.fastAccessCoeff(i) = i+1; \
455 success = compareVecs(u, "u", v, "v", \
456 setup.rtol, setup.atol, out); \
458 TEUCHOS_UNIT_TEST( VEC, initializer_list_assign ) { \
461 u = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; \
462 UTS::vec_type v(setup.sz, 0.0); \
463 for (int i=0; i<setup.sz; i++) \
464 v.fastAccessCoeff(i) = i+1; \
465 success = compareVecs(u, "u", v, "v", \
466 setup.rtol, setup.atol, out); \
468 TEUCHOS_UNIT_TEST( VEC, range_based_for ) { \
470 UTS::vec_type u(setup.sz, 0.0); \
471 for (auto& z : u) { z = 3.0; } \
472 UTS::vec_type v(setup.sz, 3.0); \
473 success = compareVecs(u, "u", v, "v", \
474 setup.rtol, setup.atol, out); \
477 namespace DynamicVecTest {
485 namespace DynamicStridedVecTest {
493 namespace StaticVecTest {
501 namespace StaticFixedVecTest {
512 Kokkos::initialize();
UnitTestSetup< vec_type > UTS
Stokhos::StaticFixedStorage< int, double, 8, execution_space > storage_type
Kokkos::DefaultExecutionSpace execution_space
Statically allocated storage class.
Kokkos::DefaultExecutionSpace execution_space
UnitTestSetup< vec_type > UTS
Stokhos::DynamicStorage< int, double, execution_space > storage_type
Stokhos::DynamicStridedStorage< int, double, execution_space > storage_type
Stokhos::StaticStorage< int, double, 8, execution_space > storage_type
Sacado::MP::Vector< storage_type > vec_type
static int runUnitTestsFromMain(int argc, char *argv[])
UnitTestSetup< vec_type > UTS
#define VECTOR_UNIT_TESTS(VEC)
Kokkos::DefaultExecutionSpace execution_space
int main(int argc, char **argv)
Kokkos::DefaultExecutionSpace execution_space
Sacado::MP::Vector< storage_type > vec_type
Sacado::MP::Vector< storage_type > vec_type
Sacado::MP::Vector< storage_type > vec_type
Statically allocated storage class.
UnitTestSetup< vec_type > UTS