Sacado Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Tay_CommTests.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#include "Teuchos_TestingHelpers.hpp"
30#include "Teuchos_CommHelpers.hpp"
31#include "Teuchos_DefaultComm.hpp"
32#include "Teuchos_Array.hpp"
33#include "Teuchos_Comm.hpp"
34
35#include "Sacado_mpl_apply.hpp"
36#include "Sacado_Random.hpp"
37
38using Teuchos::RCP;
39using Teuchos::rcp;
40using Teuchos::ValueTypeSerializer;
41
42template <typename TayType>
43bool checkFadArrays(const Teuchos::Array<TayType>& x,
44 const Teuchos::Array<TayType>& x2,
45 const std::string& tag,
46 Teuchos::FancyOStream& out) {
47
48 // Check sizes match
49 bool success = (x.size() == x2.size());
50 out << tag << " Taylor array size test";
51 if (success)
52 out << " passed";
53 else
54 out << " failed";
55 out << ": \n\tExpected: " << x.size() << ", \n\tGot: " << x2.size()
56 << "." << std::endl;
57
58 // Check coefficients match
59 for (int i=0; i<x.size(); i++) {
60 bool success2 = Sacado::IsEqual<TayType>::eval(x[i], x2[i]);
61 out << tag << " Taylor array comparison test " << i;
62 if (success2)
63 out << " passed";
64 else
65 out << " failed";
66 out << ": \n\tExpected: " << x[i] << ", \n\tGot: " << x2[i] << "."
67 << std::endl;
68 success = success && success2;
69 }
70
71 return success;
72}
73
74template<typename Ordinal>
76 const Teuchos::Comm<Ordinal> &comm,
77 Teuchos::FancyOStream &out,
78 const bool result
79 )
80{
81 out << "\nChecking that the above test passed in all processes ...";
82 int thisResult = ( result ? 1 : 0 );
83 int sumResult = -1;
84 Teuchos::reduceAll(comm,Teuchos::REDUCE_SUM,Ordinal(1),&thisResult,
85 &sumResult);
86 const bool passed = sumResult==Teuchos::size(comm);
87 if(passed)
88 out << " passed\n";
89 else
90 out << " (sumResult="<<sumResult<<"!=numProcs="<<Teuchos::size(comm)<<") failed\n";
91 return passed;
92}
93
94#define TAY_COMM_TESTS(TayType, TAY) \
95TEUCHOS_UNIT_TEST( TAY##_Comm, Broadcast ) { \
96 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
97 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
98 \
99 int n = 7; \
100 int p = 5; \
101 ValueTypeSerializer<int,TayType> tts( \
102 rcp(new ValueTypeSerializer<int,double>), p+1); \
103 \
104 Teuchos::Array<TayType> x(n), x2(n), x3(n); \
105 for (int i=0; i<n; i++) { \
106 x[i] = TayType(p, rnd.number()); \
107 for (int j=0; j<=p; j++) \
108 x[i].fastAccessCoeff(j) = rnd.number(); \
109 } \
110 for (int i=0; i<n; i++) { \
111 x2[i] = TayType(p, 0.0); \
112 } \
113 if (comm->getRank() == 0) { \
114 x2 = x; \
115 x3 = x; \
116 } \
117 \
118 Teuchos::broadcast(*comm, 0, n, &x2[0]); \
119 bool success1 = checkFadArrays( \
120 x, x2, std::string(#TAY)+" Broadcast", out); \
121 success1 = checkResultOnAllProcs(*comm, out, success1); \
122 \
123 Teuchos::broadcast(*comm, tts, 0, n, &x3[0]); \
124 bool success2 = checkFadArrays( \
125 x, x3, std::string(#TAY)+" Broadcast TTS", out); \
126 success2 = checkResultOnAllProcs(*comm, out, success2); \
127 \
128 success = success1 && success2; \
129} \
130 \
131TEUCHOS_UNIT_TEST( TAY##_Comm, GatherAll ) { \
132 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
133 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
134 \
135 int n = 7; \
136 int p = 5; \
137 int size = comm->getSize(); \
138 int rank = comm->getRank(); \
139 int N = n*size; \
140 ValueTypeSerializer<int,TayType> tts( \
141 rcp(new ValueTypeSerializer<int,double>), p+1); \
142 \
143 Teuchos::Array<TayType> x(n), x2(N), x3(N), x4(N); \
144 for (int i=0; i<n; i++) { \
145 x[i] = TayType(p, (rank+1)*(i+1)); \
146 for (int j=0; j<=p; j++) \
147 x[i].fastAccessCoeff(j) = (rank+1)*(i+1)*(j+1); \
148 } \
149 for (int i=0; i<N; i++) { \
150 x2[i] = TayType(p, 0.0); \
151 } \
152 for (int j=0; j<size; j++) { \
153 for (int i=0; i<n; i++) { \
154 x3[n*j+i] = TayType(p, (j+1)*(i+1)); \
155 for (int k=0; k<=p; k++) \
156 x3[n*j+i].fastAccessCoeff(k) = (j+1)*(i+1)*(k+1); \
157 } \
158 } \
159 \
160 Teuchos::gatherAll(*comm, n, &x[0], N, &x2[0]); \
161 bool success1 = checkFadArrays( \
162 x3, x2, std::string(#TAY)+" Gather All", out); \
163 success1 = checkResultOnAllProcs(*comm, out, success1); \
164 \
165 Teuchos::gatherAll(*comm, tts, n, &x[0], N, &x4[0]); \
166 bool success2 = checkFadArrays( \
167 x3, x4, std::string(#TAY)+" Gather All TTS", out); \
168 success2 = checkResultOnAllProcs(*comm, out, success2); \
169 \
170 success = success1 && success2; \
171} \
172 \
173TEUCHOS_UNIT_TEST( TAY##_Comm, SumAll ) { \
174 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
175 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
176 \
177 int n = 7; \
178 int p = 5; \
179 int num_proc = comm->getSize(); \
180 ValueTypeSerializer<int,TayType> tts( \
181 rcp(new ValueTypeSerializer<int,double>), p+1); \
182 \
183 Teuchos::Array<TayType> x(n), sums(n), sums2(n), sums3(n); \
184 for (int i=0; i<n; i++) { \
185 x[i] = TayType(p, 1.0*(i+1)); \
186 for (int j=0; j<=p; j++) \
187 x[i].fastAccessCoeff(j) = 2.0*(i+1); \
188 } \
189 for (int i=0; i<n; i++) { \
190 sums[i] = TayType(p, 1.0*(i+1)*num_proc); \
191 for (int j=0; j<=p; j++) \
192 sums[i].fastAccessCoeff(j) = 2.0*(i+1)*num_proc; \
193 } \
194 for (int i=0; i<n; i++) { \
195 sums2[i] = TayType(p, 0.0); \
196 } \
197 \
198 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, n, &x[0], &sums2[0]); \
199 bool success1 = checkFadArrays( \
200 sums, sums2, std::string(#TAY)+" Sum All", out); \
201 success1 = checkResultOnAllProcs(*comm, out, success1); \
202 \
203 Teuchos::reduceAll(*comm, tts, Teuchos::REDUCE_SUM, n, &x[0], &sums3[0]); \
204 bool success2 = checkFadArrays( \
205 sums, sums3, std::string(#TAY)+" Sum All TTS", out); \
206 success2 = checkResultOnAllProcs(*comm, out, success2); \
207 \
208 success = success1 && success2; \
209} \
210 \
211TEUCHOS_UNIT_TEST( TAY##_Comm, MaxAll ) { \
212 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
213 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
214 \
215 int n = 7; \
216 int p = 5; \
217 int rank = comm->getRank(); \
218 int num_proc = comm->getSize(); \
219 ValueTypeSerializer<int,TayType> tts( \
220 rcp(new ValueTypeSerializer<int,double>), p+1); \
221 \
222 Teuchos::Array<TayType> x(n), maxs(n), maxs2(n), maxs3(n); \
223 for (int i=0; i<n; i++) { \
224 x[i] = TayType(p, 1.0*(i+1)*(rank+1)); \
225 for (int j=0; j<=p; j++) \
226 x[i].fastAccessCoeff(j) = 2.0*(i+1)*(rank+1); \
227 } \
228 for (int i=0; i<n; i++) { \
229 maxs[i] = TayType(p, 1.0*(i+1)*num_proc); \
230 for (int j=0; j<=p; j++) \
231 maxs[i].fastAccessCoeff(j) = 2.0*(i+1)*num_proc; \
232 } \
233 for (int i=0; i<n; i++) { \
234 maxs2[i] = TayType(p, 0.0); \
235 } \
236 \
237 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, n, &x[0], &maxs2[0]); \
238 bool success1 = checkFadArrays( \
239 maxs, maxs2, std::string(#TAY)+" Max All", out); \
240 success1 = checkResultOnAllProcs(*comm, out, success1); \
241 \
242 Teuchos::reduceAll(*comm, tts, Teuchos::REDUCE_MAX, n, &x[0], &maxs3[0]); \
243 bool success2 = checkFadArrays( \
244 maxs, maxs3, std::string(#TAY)+" Max All TTS", out); \
245 success2 = checkResultOnAllProcs(*comm, out, success2); \
246 \
247 success = success1 && success2; \
248} \
249 \
250TEUCHOS_UNIT_TEST( TAY##_Comm, MinAll ) { \
251 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
252 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
253 \
254 int n = 7; \
255 int p = 5; \
256 int rank = comm->getRank(); \
257 ValueTypeSerializer<int,TayType> tts( \
258 rcp(new ValueTypeSerializer<int,double>), p+1); \
259 \
260 Teuchos::Array<TayType> x(n), mins(n), mins2(n), mins3(n); \
261 for (int i=0; i<n; i++) { \
262 x[i] = TayType(p, 1.0*(i+1)*(rank+1)); \
263 for (int j=0; j<=p; j++) \
264 x[i].fastAccessCoeff(j) = 2.0*(i+1)*(rank+1); \
265 } \
266 for (int i=0; i<n; i++) { \
267 mins[i] = TayType(p, 1.0*(i+1)); \
268 for (int j=0; j<=p; j++) \
269 mins[i].fastAccessCoeff(j) = 2.0*(i+1); \
270 } \
271 for (int i=0; i<n; i++) { \
272 mins2[i] = TayType(p, 0.0); \
273 } \
274 \
275 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MIN, n, &x[0], &mins2[0]); \
276 bool success1 = checkFadArrays( \
277 mins, mins2, std::string(#TAY)+" Min All", out); \
278 success1 = checkResultOnAllProcs(*comm, out, success1); \
279 \
280 Teuchos::reduceAll(*comm, tts, Teuchos::REDUCE_MIN, n, &x[0], &mins3[0]); \
281 bool success2 = checkFadArrays( \
282 mins, mins3, std::string(#TAY)+" Min All TTS", out); \
283 success2 = checkResultOnAllProcs(*comm, out, success2); \
284 \
285 success = success1 && success2; \
286} \
287 \
288TEUCHOS_UNIT_TEST( TAY##_Comm, ScanSum ) { \
289 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
290 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
291 \
292 int n = 7; \
293 int p = 5; \
294 int rank = comm->getRank(); \
295 ValueTypeSerializer<int,TayType> tts( \
296 rcp(new ValueTypeSerializer<int,double>), p+1); \
297 \
298 Teuchos::Array<TayType> x(n), sums(n), sums2(n), sums3(n); \
299 for (int i=0; i<n; i++) { \
300 x[i] = TayType(p, 1.0*(i+1)); \
301 for (int j=0; j<=p; j++) \
302 x[i].fastAccessCoeff(j) = 2.0*(i+1); \
303 } \
304 for (int i=0; i<n; i++) { \
305 sums[i] = TayType(p, 1.0*(i+1)*(rank+1)); \
306 for (int j=0; j<=p; j++) \
307 sums[i].fastAccessCoeff(j) = 2.0*(i+1)*(rank+1); \
308 } \
309 for (int i=0; i<n; i++) { \
310 sums2[i] = TayType(p, 0.0); \
311 } \
312 \
313 Teuchos::scan(*comm, Teuchos::REDUCE_SUM, n, &x[0], &sums2[0]); \
314 bool success1 = checkFadArrays( \
315 sums, sums2, std::string(#TAY)+" Scan Sum", out); \
316 success1 = checkResultOnAllProcs(*comm, out, success1); \
317 \
318 Teuchos::scan(*comm, tts, Teuchos::REDUCE_SUM, n, &x[0], &sums3[0]); \
319 bool success2 = checkFadArrays( \
320 sums, sums3, std::string(#TAY)+" Scan Sum TTS", out); \
321 success2 = checkResultOnAllProcs(*comm, out, success2); \
322 \
323 success = success1 && success2; \
324} \
325 \
326TEUCHOS_UNIT_TEST( TAY##_Comm, ScanMax ) { \
327 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
328 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
329 \
330 int n = 7; \
331 int p = 5; \
332 int rank = comm->getRank(); \
333 ValueTypeSerializer<int,TayType> tts( \
334 rcp(new ValueTypeSerializer<int,double>), p+1); \
335 \
336 Teuchos::Array<TayType> x(n), maxs(n), maxs2(n), maxs3(n); \
337 for (int i=0; i<n; i++) { \
338 x[i] = TayType(p, 1.0*(i+1)*(rank+1)); \
339 for (int j=0; j<=p; j++) \
340 x[i].fastAccessCoeff(j) = 2.0*(i+1)*(rank+1); \
341 } \
342 for (int i=0; i<n; i++) { \
343 maxs[i] = TayType(p, 1.0*(i+1)*(rank+1)); \
344 for (int j=0; j<=p; j++) \
345 maxs[i].fastAccessCoeff(j) = 2.0*(i+1)*(rank+1); \
346 } \
347 for (int i=0; i<n; i++) { \
348 maxs2[i] = TayType(p, 0.0); \
349 } \
350 \
351 Teuchos::scan(*comm, Teuchos::REDUCE_MAX, n, &x[0], &maxs2[0]); \
352 bool success1 = checkFadArrays( \
353 maxs, maxs2, std::string(#TAY)+" Scan Max", out); \
354 success1 = checkResultOnAllProcs(*comm, out, success1); \
355 \
356 Teuchos::scan(*comm, tts, Teuchos::REDUCE_MAX, n, &x[0], &maxs3[0]); \
357 bool success2 = checkFadArrays( \
358 maxs, maxs3, std::string(#TAY)+" Scan Max TTS", out); \
359 success2 = checkResultOnAllProcs(*comm, out, success2); \
360 \
361 success = success1 && success2; \
362} \
363 \
364TEUCHOS_UNIT_TEST( TAY##_Comm, ScanMin ) { \
365 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
366 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
367 \
368 int n = 7; \
369 int p = 5; \
370 int rank = comm->getRank(); \
371 ValueTypeSerializer<int,TayType> tts( \
372 rcp(new ValueTypeSerializer<int,double>), p+1); \
373 \
374 Teuchos::Array<TayType> x(n), mins(n), mins2(n), mins3(n); \
375 for (int i=0; i<n; i++) { \
376 x[i] = TayType(p, 1.0*(i+1)*(rank+1)); \
377 for (int j=0; j<=p; j++) \
378 x[i].fastAccessCoeff(j) = 2.0*(i+1)*(rank+1); \
379 } \
380 for (int i=0; i<n; i++) { \
381 mins[i] = TayType(p, 1.0*(i+1)); \
382 for (int j=0; j<=p; j++) \
383 mins[i].fastAccessCoeff(j) = 2.0*(i+1); \
384 } \
385 for (int i=0; i<n; i++) { \
386 mins2[i] = TayType(p, 0.0); \
387 } \
388 \
389 Teuchos::scan(*comm, Teuchos::REDUCE_MIN, n, &x[0], &mins2[0]); \
390 bool success1 = checkFadArrays( \
391 mins, mins2, std::string(#TAY)+" Scan Min", out); \
392 success1 = checkResultOnAllProcs(*comm, out, success1); \
393 \
394 Teuchos::scan(*comm, tts, Teuchos::REDUCE_MIN, n, &x[0], &mins3[0]); \
395 bool success2 = checkFadArrays( \
396 mins, mins3, std::string(#TAY)+" Scan Min TTS", out); \
397 success2 = checkResultOnAllProcs(*comm, out, success2); \
398 \
399 success = success1 && success2; \
400} \
401 \
402TEUCHOS_UNIT_TEST( TAY##_Comm, SendReceive ) { \
403 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
404 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
405 \
406 int num_proc = comm->getSize(); \
407 if (num_proc > 1) { \
408 int rank = comm->getRank(); \
409 int n = 7; \
410 int p = 5; \
411 ValueTypeSerializer<int,TayType> tts( \
412 rcp(new ValueTypeSerializer<int,double>), p+1); \
413 \
414 Teuchos::Array<TayType> x(n), x2(n), x3(n); \
415 for (int i=0; i<n; i++) { \
416 x[i] = TayType(p, 1.0*(i+1)); \
417 for (int j=0; j<=p; j++) \
418 x[i].fastAccessCoeff(j) = 2.0*(i+1)*(j+1); \
419 } \
420 for (int i=0; i<n; i++) { \
421 x2[i] = TayType(p, 0.0); \
422 } \
423 if (rank != 1) { \
424 x2 = x; \
425 x3 = x2; \
426 } \
427 \
428 if (rank == 0) Teuchos::send(*comm, n, &x[0], 1); \
429 if (rank == 1) Teuchos::receive(*comm, 0, n, &x2[0]); \
430 bool success1 = checkFadArrays( \
431 x, x2, std::string(#TAY)+" Send/Receive", out); \
432 success1 = checkResultOnAllProcs(*comm, out, success1); \
433 \
434 if (rank == 0) Teuchos::send(*comm, tts, n, &x[0], 1); \
435 if (rank == 1) Teuchos::receive(*comm, tts, 0, n, &x3[0]); \
436 bool success2 = checkFadArrays( \
437 x, x3, std::string(#TAY)+" Send/Receive TTS", out); \
438 success2 = checkResultOnAllProcs(*comm, out, success2); \
439 \
440 success = success1 && success2; \
441 } \
442 else \
443 success = true; \
444} \
445 \
446TEUCHOS_UNIT_TEST( TAY##_Comm, NestedBroadcast ) { \
447 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
448 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
449 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
450 \
451 int n = 7; \
452 int p1 = 5; \
453 int p2 = 5; \
454 RCP< ValueTypeSerializer<int,TayType> > tts = \
455 rcp(new ValueTypeSerializer<int,TayType>( \
456 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
457 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
458 \
459 Teuchos::Array<TayTayType> x(n), x2(n), x3(n); \
460 for (int i=0; i<n; i++) { \
461 TayType f(p1, rnd.number()); \
462 for (int k=0; k<=p1; k++) \
463 f.fastAccessCoeff(k) = rnd.number(); \
464 x[i] = TayTayType(p2, f); \
465 for (int j=0; j<=p2; j++) { \
466 TayType g(p1, rnd.number()); \
467 for (int k=0; k<=p1; k++) \
468 g.fastAccessCoeff(k) = rnd.number(); \
469 x[i].fastAccessCoeff(j) = g; \
470 } \
471 } \
472 for (int i=0; i<n; i++) { \
473 x2[i] = TayTayType(p2, TayType(p1, 0.0)); \
474 for (int j=0; j<=p2; j++) \
475 x2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
476 } \
477 if (comm->getRank() == 0) { \
478 x2 = x; \
479 x3 = x; \
480 } \
481 \
482 Teuchos::broadcast(*comm, 0, n, &x2[0]); \
483 bool success1 = checkFadArrays( \
484 x, x2, std::string(#TAY)+"<"+#TAY+"> Broadcast", out); \
485 success1 = checkResultOnAllProcs(*comm, out, success1); \
486 \
487 Teuchos::broadcast(*comm, ttts, 0, n, &x3[0]); \
488 bool success2 = checkFadArrays( \
489 x, x3, std::string(#TAY)+"<"+#TAY+"> Broadcast TTS", out); \
490 success2 = checkResultOnAllProcs(*comm, out, success2); \
491 \
492 success = success1 && success2; \
493} \
494 \
495TEUCHOS_UNIT_TEST( TAY##_Comm, NestedGatherAll ) { \
496 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
497 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
498 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
499 \
500 int n = 7; \
501 int p1 = 5; \
502 int p2 = 5; \
503 RCP< ValueTypeSerializer<int,TayType> > tts = \
504 rcp(new ValueTypeSerializer<int,TayType>( \
505 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
506 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
507 \
508 int size = comm->getSize(); \
509 int rank = comm->getRank(); \
510 int N = n*size; \
511 Teuchos::Array<TayTayType> x(n), x2(N), x3(N), x4(N); \
512 for (int i=0; i<n; i++) { \
513 TayType f(p1, (rank+1)*(i+1)); \
514 for (int k=0; k<=p1; k++) \
515 f.fastAccessCoeff(k) = (rank+1)*(i+1)*(k+1); \
516 x[i] = TayTayType(p2, f); \
517 for (int j=0; j<=p2; j++) { \
518 x[i].fastAccessCoeff(j) = f; \
519 } \
520 } \
521 for (int i=0; i<N; i++) { \
522 x2[i] = TayTayType(p2, TayType(p1, 0.0)); \
523 for (int j=0; j<=p2; j++) \
524 x2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
525 } \
526 for (int j=0; j<size; j++) { \
527 for (int i=0; i<n; i++) { \
528 TayType f(p1, (j+1)*(i+1)); \
529 for (int k=0; k<=p1; k++) \
530 f.fastAccessCoeff(k) = (j+1)*(i+1)*(k+1); \
531 x3[n*j+i] = TayTayType(p2, f); \
532 for (int k=0; k<=p2; k++) \
533 x3[n*j+i].fastAccessCoeff(k) = f; \
534 } \
535 } \
536 \
537 Teuchos::gatherAll(*comm, n, &x[0], N, &x2[0]); \
538 bool success1 = checkFadArrays( \
539 x3, x2, std::string(#TAY)+"<"+#TAY+"> Gather All", out); \
540 success1 = checkResultOnAllProcs(*comm, out, success1); \
541 \
542 Teuchos::gatherAll(*comm, ttts, n, &x[0], N, &x4[0]); \
543 bool success2 = checkFadArrays( \
544 x3, x4, std::string(#TAY)+"<"+#TAY+"> Gather All FTS", out); \
545 success2 = checkResultOnAllProcs(*comm, out, success2); \
546 \
547 success = success1 && success2; \
548} \
549 \
550TEUCHOS_UNIT_TEST( TAY##_Comm, NestedSumAll ) { \
551 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
552 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
553 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
554 \
555 int n = 7; \
556 int p1 = 5; \
557 int p2 = 5; \
558 int num_proc = comm->getSize(); \
559 RCP< ValueTypeSerializer<int,TayType> > tts = \
560 rcp(new ValueTypeSerializer<int,TayType>( \
561 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
562 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
563 \
564 Teuchos::Array<TayTayType> x(n), sums(n), sums2(n), sums3(n); \
565 for (int i=0; i<n; i++) { \
566 TayType f(p1, 1.0*(i+1)); \
567 for (int k=0; k<=p1; k++) \
568 f.fastAccessCoeff(k) = 2.0*(i+1); \
569 x[i] = TayTayType(p2, f); \
570 for (int j=0; j<=p2; j++) { \
571 x[i].fastAccessCoeff(j) = f; \
572 } \
573 } \
574 for (int i=0; i<n; i++) { \
575 TayType f(p1, 1.0*(i+1)*num_proc); \
576 for (int k=0; k<=p1; k++) \
577 f.fastAccessCoeff(k) = 2.0*(i+1)*num_proc; \
578 sums[i] = TayTayType(p2, f); \
579 for (int j=0; j<=p2; j++) \
580 sums[i].fastAccessCoeff(j) = f; \
581 } \
582 for (int i=0; i<n; i++) { \
583 sums2[i] = TayTayType(p2, TayType(p1, 0.0)); \
584 for (int j=0; j<=p2; j++) \
585 sums2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
586 } \
587 \
588 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, n, &x[0], &sums2[0]); \
589 bool success1 = checkFadArrays( \
590 sums, sums2, std::string(#TAY)+"<"+#TAY+"> Sum All", out); \
591 success1 = checkResultOnAllProcs(*comm, out, success1); \
592 \
593 Teuchos::reduceAll(*comm, ttts, Teuchos::REDUCE_SUM, n, &x[0], &sums3[0]); \
594 bool success2 = checkFadArrays( \
595 sums, sums3, std::string(#TAY)+"<"+#TAY+"> Sum All", out); \
596 success2 = checkResultOnAllProcs(*comm, out, success2); \
597 \
598 success = success1 && success2; \
599} \
600 \
601TEUCHOS_UNIT_TEST( TAY##_Comm, NestedMaxAll ) { \
602 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
603 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
604 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
605 \
606 int n = 7; \
607 int p1 = 5; \
608 int p2 = 5; \
609 int rank = comm->getRank(); \
610 int num_proc = comm->getSize(); \
611 RCP< ValueTypeSerializer<int,TayType> > tts = \
612 rcp(new ValueTypeSerializer<int,TayType>( \
613 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
614 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
615 \
616 Teuchos::Array<TayTayType> x(n), maxs(n), maxs2(n), maxs3(n); \
617 for (int i=0; i<n; i++) { \
618 TayType f(p1, 1.0*(i+1)*(rank+1)); \
619 for (int k=0; k<=p1; k++) \
620 f.fastAccessCoeff(k) = 2.0*(i+1)*(rank+1); \
621 x[i] = TayTayType(p2, f); \
622 for (int j=0; j<=p2; j++) { \
623 x[i].fastAccessCoeff(j) = f; \
624 } \
625 } \
626 for (int i=0; i<n; i++) { \
627 TayType f(p1, 1.0*(i+1)*num_proc); \
628 for (int k=0; k<=p1; k++) \
629 f.fastAccessCoeff(k) = 2.0*(i+1)*num_proc; \
630 maxs[i] = TayTayType(p2, f); \
631 for (int j=0; j<=p2; j++) \
632 maxs[i].fastAccessCoeff(j) = f; \
633 } \
634 for (int i=0; i<n; i++) { \
635 maxs2[i] = TayTayType(p2, TayType(p1, 0.0)); \
636 for (int j=0; j<=p2; j++) \
637 maxs2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
638 } \
639 \
640 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, n, &x[0], &maxs2[0]); \
641 bool success1 = checkFadArrays( \
642 maxs, maxs2, std::string(#TAY)+"<"+#TAY+"> Max All", out); \
643 success1 = checkResultOnAllProcs(*comm, out, success1); \
644 \
645 Teuchos::reduceAll(*comm, ttts, Teuchos::REDUCE_MAX, n, &x[0], &maxs3[0]); \
646 bool success2 = checkFadArrays( \
647 maxs, maxs3, std::string(#TAY)+"<"+#TAY+"> Max All FTS", out); \
648 success2 = checkResultOnAllProcs(*comm, out, success2); \
649 \
650 success = success1 && success2; \
651} \
652 \
653TEUCHOS_UNIT_TEST( TAY##_Comm, NestedMinAll ) { \
654 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
655 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
656 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
657 \
658 int n = 7; \
659 int p1 = 5; \
660 int p2 = 5; \
661 int rank = comm->getRank(); \
662 RCP< ValueTypeSerializer<int,TayType> > tts = \
663 rcp(new ValueTypeSerializer<int,TayType>( \
664 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
665 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
666 \
667 Teuchos::Array<TayTayType> x(n), mins(n), mins2(n), mins3(n); \
668 for (int i=0; i<n; i++) { \
669 TayType f(p1, 1.0*(i+1)*(rank+1)); \
670 for (int k=0; k<=p1; k++) \
671 f.fastAccessCoeff(k) = 2.0*(i+1)*(rank+1); \
672 x[i] = TayTayType(p2, f); \
673 for (int j=0; j<=p2; j++) { \
674 x[i].fastAccessCoeff(j) = f; \
675 } \
676 } \
677 for (int i=0; i<n; i++) { \
678 TayType f(p1, 1.0*(i+1)); \
679 for (int k=0; k<=p1; k++) \
680 f.fastAccessCoeff(k) = 2.0*(i+1); \
681 mins[i] = TayTayType(p2, f); \
682 for (int j=0; j<=p2; j++) \
683 mins[i].fastAccessCoeff(j) = f; \
684 } \
685 for (int i=0; i<n; i++) { \
686 mins2[i] = TayTayType(p2, TayType(p1, 0.0)); \
687 for (int j=0; j<=p2; j++) \
688 mins2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
689 } \
690 \
691 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MIN, n, &x[0], &mins2[0]); \
692 bool success1 = checkFadArrays( \
693 mins, mins2, std::string(#TAY)+"<"+#TAY+"> Min All", out); \
694 success1 = checkResultOnAllProcs(*comm, out, success1); \
695 \
696 Teuchos::reduceAll(*comm, ttts, Teuchos::REDUCE_MIN, n, &x[0], &mins3[0]); \
697 bool success2 = checkFadArrays( \
698 mins, mins3, std::string(#TAY)+"<"+#TAY+"> Min All FTS", out); \
699 success2 = checkResultOnAllProcs(*comm, out, success2); \
700 \
701 success = success1 && success2; \
702} \
703 \
704TEUCHOS_UNIT_TEST( TAY##_Comm, NestedScanSum ) { \
705 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
706 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
707 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
708 \
709 int n = 7; \
710 int p1 = 5; \
711 int p2 = 5; \
712 int rank = comm->getRank(); \
713 RCP< ValueTypeSerializer<int,TayType> > tts = \
714 rcp(new ValueTypeSerializer<int,TayType>( \
715 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
716 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
717 \
718 Teuchos::Array<TayTayType> x(n), sums(n), sums2(n), sums3(n); \
719 for (int i=0; i<n; i++) { \
720 TayType f(p1, 1.0*(i+1)); \
721 for (int k=0; k<=p1; k++) \
722 f.fastAccessCoeff(k) = 2.0*(i+1); \
723 x[i] = TayTayType(p2, f); \
724 for (int j=0; j<=p2; j++) { \
725 x[i].fastAccessCoeff(j) = f; \
726 } \
727 } \
728 for (int i=0; i<n; i++) { \
729 TayType f(p1, 1.0*(i+1)*(rank+1)); \
730 for (int k=0; k<=p1; k++) \
731 f.fastAccessCoeff(k) = 2.0*(i+1)*(rank+1); \
732 sums[i] = TayTayType(p2, f); \
733 for (int j=0; j<=p2; j++) \
734 sums[i].fastAccessCoeff(j) = f; \
735 } \
736 for (int i=0; i<n; i++) { \
737 sums2[i] = TayTayType(p2, TayType(p1, 0.0)); \
738 for (int j=0; j<=p2; j++) \
739 sums2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
740 } \
741 \
742 Teuchos::scan(*comm, Teuchos::REDUCE_SUM, n, &x[0], &sums2[0]); \
743 bool success1 = checkFadArrays( \
744 sums, sums2, std::string(#TAY)+"<"+#TAY+"> Scan Sum", out); \
745 success1 = checkResultOnAllProcs(*comm, out, success1); \
746 \
747 Teuchos::scan(*comm, ttts, Teuchos::REDUCE_SUM, n, &x[0], &sums3[0]); \
748 bool success2 = checkFadArrays( \
749 sums, sums3, std::string(#TAY)+"<"+#TAY+"> Scan Sum FTS", out); \
750 success2 = checkResultOnAllProcs(*comm, out, success2); \
751 \
752 success = success1 && success2; \
753} \
754 \
755TEUCHOS_UNIT_TEST( TAY##_Comm, NestedScanMax ) { \
756 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
757 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
758 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
759 \
760 int n = 7; \
761 int p1 = 5; \
762 int p2 = 5; \
763 int rank = comm->getRank(); \
764 RCP< ValueTypeSerializer<int,TayType> > tts = \
765 rcp(new ValueTypeSerializer<int,TayType>( \
766 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
767 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
768 \
769 Teuchos::Array<TayTayType> x(n), maxs(n), maxs2(n), maxs3(n); \
770 for (int i=0; i<n; i++) { \
771 TayType f(p1, 1.0*(i+1)*(rank+1)); \
772 for (int k=0; k<=p1; k++) \
773 f.fastAccessCoeff(k) = 2.0*(i+1)*(rank+1); \
774 x[i] = TayTayType(p2, f); \
775 for (int j=0; j<=p2; j++) { \
776 x[i].fastAccessCoeff(j) = f; \
777 } \
778 } \
779 for (int i=0; i<n; i++) { \
780 TayType f(p1, 1.0*(i+1)*(rank+1)); \
781 for (int k=0; k<=p1; k++) \
782 f.fastAccessCoeff(k) = 2.0*(i+1)*(rank+1); \
783 maxs[i] = TayTayType(p2, f); \
784 for (int j=0; j<=p2; j++) \
785 maxs[i].fastAccessCoeff(j) = f; \
786 } \
787 for (int i=0; i<n; i++) { \
788 maxs2[i] = TayTayType(p2, TayType(p1, 0.0)); \
789 for (int j=0; j<=p2; j++) \
790 maxs2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
791 } \
792 \
793 Teuchos::scan(*comm, Teuchos::REDUCE_MAX, n, &x[0], &maxs2[0]); \
794 bool success1 = checkFadArrays( \
795 maxs, maxs2, std::string(#TAY)+"<"+#TAY+"> Scan Max", out); \
796 success1 = checkResultOnAllProcs(*comm, out, success1); \
797 \
798 Teuchos::scan(*comm, ttts, Teuchos::REDUCE_MAX, n, &x[0], &maxs3[0]); \
799 bool success2 = checkFadArrays( \
800 maxs, maxs3, std::string(#TAY)+"<"+#TAY+"> Scan Max FTS", out); \
801 success2 = checkResultOnAllProcs(*comm, out, success2); \
802 \
803 success = success1 && success2; \
804} \
805 \
806TEUCHOS_UNIT_TEST( TAY##_Comm, NestedScanMin ) { \
807 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
808 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
809 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
810 \
811 int n = 7; \
812 int p1 = 5; \
813 int p2 = 5; \
814 int rank = comm->getRank(); \
815 RCP< ValueTypeSerializer<int,TayType> > tts = \
816 rcp(new ValueTypeSerializer<int,TayType>( \
817 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
818 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
819 \
820 Teuchos::Array<TayTayType> x(n), mins(n), mins2(n), mins3(n); \
821 for (int i=0; i<n; i++) { \
822 TayType f(p1, 1.0*(i+1)*(rank+1)); \
823 for (int k=0; k<=p1; k++) \
824 f.fastAccessCoeff(k) = 2.0*(i+1)*(rank+1); \
825 x[i] = TayTayType(p2, f); \
826 for (int j=0; j<=p2; j++) { \
827 x[i].fastAccessCoeff(j) = f; \
828 } \
829 } \
830 for (int i=0; i<n; i++) { \
831 TayType f(p1, 1.0*(i+1)); \
832 for (int k=0; k<=p1; k++) \
833 f.fastAccessCoeff(k) = 2.0*(i+1); \
834 mins[i] = TayTayType(p2, f); \
835 for (int j=0; j<=p2; j++) \
836 mins[i].fastAccessCoeff(j) = f; \
837 } \
838 for (int i=0; i<n; i++) { \
839 mins2[i] = TayTayType(p2, TayType(p1, 0.0)); \
840 for (int j=0; j<=p2; j++) \
841 mins2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
842 } \
843 \
844 Teuchos::scan(*comm, Teuchos::REDUCE_MIN, n, &x[0], &mins2[0]); \
845 bool success1 = checkFadArrays( \
846 mins, mins2, std::string(#TAY)+"<"+#TAY+"> Scan Min", out); \
847 success1 = checkResultOnAllProcs(*comm, out, success1); \
848 \
849 Teuchos::scan(*comm, ttts, Teuchos::REDUCE_MIN, n, &x[0], &mins3[0]); \
850 bool success2 = checkFadArrays( \
851 mins, mins3, std::string(#TAY)+"<"+#TAY+"> Scan Min FTS", out); \
852 success2 = checkResultOnAllProcs(*comm, out, success2); \
853 \
854 success = success1 && success2; \
855} \
856 \
857TEUCHOS_UNIT_TEST( TAY##_Comm, NestedSendReceive ) { \
858 typedef Sacado::mpl::apply<TayType,TayType>::type TayTayType; \
859 Teuchos::RCP<const Teuchos::Comm<Ordinal> > \
860 comm = Teuchos::DefaultComm<Ordinal>::getComm(); \
861 \
862 int num_proc = comm->getSize(); \
863 if (num_proc > 1) { \
864 int rank = comm->getRank(); \
865 int n = 7; \
866 int p1 = 5; \
867 int p2 = 5; \
868 RCP< ValueTypeSerializer<int,TayType> > tts = \
869 rcp(new ValueTypeSerializer<int,TayType>( \
870 rcp(new ValueTypeSerializer<int,double>), p1+1)); \
871 ValueTypeSerializer<int,TayTayType> ttts(tts, p2+1); \
872 \
873 Teuchos::Array<TayTayType> x(n), x2(n), x3(n); \
874 for (int i=0; i<n; i++) { \
875 TayType f(p1, 1.0*(i+1)); \
876 for (int k=0; k<=p1; k++) \
877 f.fastAccessCoeff(k) = 2.0*(i+1)*(k+1); \
878 x[i] = TayTayType(p2, f); \
879 for (int j=0; j<=p2; j++) \
880 x[i].fastAccessCoeff(j) = f; \
881 } \
882 for (int i=0; i<n; i++) { \
883 x2[i] = TayTayType(p2, TayType(p1, 0.0)); \
884 for (int j=0; j<=p2; j++) \
885 x2[i].fastAccessCoeff(j) = TayType(p1, 0.0); \
886 } \
887 if (rank != 1) { \
888 x2 = x; \
889 x3 = x2; \
890 } \
891 \
892 if (rank == 0) Teuchos::send(*comm, n, &x[0], 1); \
893 if (rank == 1) Teuchos::receive(*comm, 0, n, &x2[0]); \
894 bool success1 = checkFadArrays( \
895 x, x2, std::string(#TAY)+"<"+#TAY+"> Send/Receive", out); \
896 success1 = checkResultOnAllProcs(*comm, out, success1); \
897 \
898 if (rank == 0) Teuchos::send(*comm, ttts, n, &x[0], 1); \
899 if (rank == 1) Teuchos::receive(*comm, ttts, 0, n, &x3[0]); \
900 bool success2 = checkFadArrays( \
901 x, x3, std::string(#TAY)+"<"+#TAY+"> Send/Receive FTS", out); \
902 success2 = checkResultOnAllProcs(*comm, out, success2); \
903 \
904 success = success1 && success2; \
905 } \
906 else \
907 success = true; \
908}
int Ordinal
bool checkResultOnAllProcs(const Teuchos::Comm< Ordinal > &comm, Teuchos::FancyOStream &out, const bool result)
bool checkFadArrays(const Teuchos::Array< TayType > &x, const Teuchos::Array< TayType > &x2, const std::string &tag, Teuchos::FancyOStream &out)
static SACADO_INLINE_FUNCTION bool eval(const T &x, const T &y)