Intrepid
test_01.cpp
Go to the documentation of this file.
1// @HEADER
2// ************************************************************************
3//
4// Intrepid Package
5// Copyright (2007) 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 Pavel Bochev (pbboche@sandia.gov)
38// Denis Ridzal (dridzal@sandia.gov), or
39// Kara Peterson (kjpeter@sandia.gov)
40//
41// ************************************************************************
42// @HEADER
43
51#include "Teuchos_oblackholestream.hpp"
52#include "Teuchos_RCP.hpp"
53#include "Teuchos_ScalarTraits.hpp"
54#include "Teuchos_GlobalMPISession.hpp"
55
56
57using namespace std;
58using namespace Intrepid;
59
60int main(int argc, char *argv[]) {
61
62 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
63
64 // This little trick lets us print to std::cout only if
65 // a (dummy) command-line argument is provided.
66 int iprint = argc - 1;
67 Teuchos::RCP<std::ostream> outStream;
68 Teuchos::oblackholestream bhs; // outputs nothing
69 if (iprint > 0)
70 outStream = Teuchos::rcp(&std::cout, false);
71 else
72 outStream = Teuchos::rcp(&bhs, false);
73
74 // Save the format state of the original std::cout.
75 Teuchos::oblackholestream oldFormatState;
76 oldFormatState.copyfmt(std::cout);
77
78 *outStream \
79 << "===============================================================================\n" \
80 << "| |\n" \
81 << "| Unit Test (RealSpaceTools) |\n" \
82 << "| |\n" \
83 << "| 1) Vector operations in 1D, 2D, and 3D real space |\n" \
84 << "| 2) Matrix / matrix-vector operations in 1D, 2D, and 3D real space |\n" \
85 << "| |\n" \
86 << "| Questions? Contact Pavel Bochev (pbboche@sandia.gov) or |\n" \
87 << "| Denis Ridzal (dridzal@sandia.gov). |\n" \
88 << "| |\n" \
89 << "| Intrepid's website: http://trilinos.sandia.gov/packages/intrepid |\n" \
90 << "| Trilinos website: http://trilinos.sandia.gov |\n" \
91 << "| |\n" \
92 << "===============================================================================\n";
93
94
95 typedef RealSpaceTools<double> rst;
96
97
98 int errorFlag = 0;
99#ifdef HAVE_INTREPID_DEBUG
100 int beginThrowNumber = Teuchos::TestForException_getThrowNumber();
101 int endThrowNumber = beginThrowNumber + 49;
102#ifndef HAVE_INTREPID_DEBUG_INF_CHECK
103 endThrowNumber = beginThrowNumber + 44;
104#endif
105
106#endif
107
108 *outStream \
109 << "\n"
110 << "===============================================================================\n"\
111 << "| TEST 1: vector exceptions |\n"\
112 << "===============================================================================\n";
113
114 try{
115
116 FieldContainer<double> a_2_2(2, 2);
117 FieldContainer<double> a_10_2(10, 2);
118 FieldContainer<double> a_10_3(10, 3);
119 FieldContainer<double> a_10_2_2(10, 2, 2);
120 FieldContainer<double> a_10_2_3(10, 2, 3);
121 FieldContainer<double> a_10_2_2_3(10, 2, 2, 3);
122
123#ifdef HAVE_INTREPID_DEBUG
124
125 *outStream << "-> vector norm with multidimensional arrays:\n";
126
127 try {
128 rst::vectorNorm(a_2_2, NORM_TWO);
129 }
130 catch (const std::logic_error & err) {
131 *outStream << "Expected Error ----------------------------------------------------------------\n";
132 *outStream << err.what() << '\n';
133 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
134 };
135 try {
136 rst::vectorNorm(a_10_2_2, a_10_2_2, NORM_TWO);
137 }
138 catch (const std::logic_error & err) {
139 *outStream << "Expected Error ----------------------------------------------------------------\n";
140 *outStream << err.what() << '\n';
141 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
142 };
143 try {
144 rst::vectorNorm(a_10_2_2, a_10_2_2_3, NORM_TWO);
145 }
146 catch (const std::logic_error & err) {
147 *outStream << "Expected Error ----------------------------------------------------------------\n";
148 *outStream << err.what() << '\n';
149 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
150 };
151 try {
152 rst::vectorNorm(a_10_3, a_10_2_2, NORM_TWO);
153 }
154 catch (const std::logic_error & err) {
155 *outStream << "Expected Error ----------------------------------------------------------------\n";
156 *outStream << err.what() << '\n';
157 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
158 };
159
160 *outStream << "-> add with multidimensional arrays:\n";
161
162 try {
163 rst::add(a_10_2_2, a_10_2, a_2_2);
164 }
165 catch (const std::logic_error & err) {
166 *outStream << "Expected Error ----------------------------------------------------------------\n";
167 *outStream << err.what() << '\n';
168 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
169 };
170 try {
171 rst::add(a_10_2_3, a_10_2_2, a_10_2_2);
172 }
173 catch (const std::logic_error & err) {
174 *outStream << "Expected Error ----------------------------------------------------------------\n";
175 *outStream << err.what() << '\n';
176 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
177 };
178 try {
179 rst::add(a_10_2_2, a_10_2_2_3);
180 }
181 catch (const std::logic_error & err) {
182 *outStream << "Expected Error ----------------------------------------------------------------\n";
183 *outStream << err.what() << '\n';
184 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
185 };
186 try {
187 rst::add(a_10_2_3, a_10_2_2);
188 }
189 catch (const std::logic_error & err) {
190 *outStream << "Expected Error ----------------------------------------------------------------\n";
191 *outStream << err.what() << '\n';
192 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
193 };
194
195 *outStream << "-> subtract with multidimensional arrays:\n";
196
197 try {
198 rst::subtract(a_10_2_2, a_10_2, a_2_2);
199 }
200 catch (const std::logic_error & err) {
201 *outStream << "Expected Error ----------------------------------------------------------------\n";
202 *outStream << err.what() << '\n';
203 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
204 };
205 try {
206 rst::subtract(a_10_2_3, a_10_2_2, a_10_2_2);
207 }
208 catch (const std::logic_error & err) {
209 *outStream << "Expected Error ----------------------------------------------------------------\n";
210 *outStream << err.what() << '\n';
211 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
212 };
213 try {
214 rst::subtract(a_10_2_2, a_10_2_2_3);
215 }
216 catch (const std::logic_error & err) {
217 *outStream << "Expected Error ----------------------------------------------------------------\n";
218 *outStream << err.what() << '\n';
219 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
220 };
221 try {
222 rst::subtract(a_10_2_3, a_10_2_2);
223 }
224 catch (const std::logic_error & err) {
225 *outStream << "Expected Error ----------------------------------------------------------------\n";
226 *outStream << err.what() << '\n';
227 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
228 };
229
230 *outStream << "-> dot product norm with multidimensional arrays:\n";
231
232 try {
233 rst::dot(a_10_2, a_10_2_2_3, a_10_2_2_3);
234 }
235 catch (const std::logic_error & err) {
236 *outStream << "Expected Error ----------------------------------------------------------------\n";
237 *outStream << err.what() << '\n';
238 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
239 };
240 try {
241 rst::dot(a_10_2, a_10_2_2, a_10_2_2_3);
242 }
243 catch (const std::logic_error & err) {
244 *outStream << "Expected Error ----------------------------------------------------------------\n";
245 *outStream << err.what() << '\n';
246 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
247 };
248 try {
249 rst::dot(a_10_2_2, a_10_2_2_3, a_10_2_2_3);
250 }
251 catch (const std::logic_error & err) {
252 *outStream << "Expected Error ----------------------------------------------------------------\n";
253 *outStream << err.what() << '\n';
254 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
255 };
256 try {
257 rst::dot(a_10_2, a_10_2_2, a_10_2_3);
258 }
259 catch (const std::logic_error & err) {
260 *outStream << "Expected Error ----------------------------------------------------------------\n";
261 *outStream << err.what() << '\n';
262 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
263 };
264 try {
265 rst::dot(a_10_3, a_10_2_3, a_10_2_3);
266 }
267 catch (const std::logic_error & err) {
268 *outStream << "Expected Error ----------------------------------------------------------------\n";
269 *outStream << err.what() << '\n';
270 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
271 };
272
273 *outStream << "-> absolute value with multidimensional arrays:\n";
274
275 try {
276 rst::absval(a_10_3, a_10_2_3);
277 }
278 catch (const std::logic_error & err) {
279 *outStream << "Expected Error ----------------------------------------------------------------\n";
280 *outStream << err.what() << '\n';
281 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
282 };
283 try {
284 rst::absval(a_10_2_2, a_10_2_3);
285 }
286 catch (const std::logic_error & err) {
287 *outStream << "Expected Error ----------------------------------------------------------------\n";
288 *outStream << err.what() << '\n';
289 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
290 };
291#endif
292
293 }
294 catch (const std::logic_error & err) {
295 *outStream << "UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
296 *outStream << err.what() << '\n';
297 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
298 errorFlag = -1000;
299 };
300
301
302
303 *outStream \
304 << "\n"
305 << "===============================================================================\n"\
306 << "| TEST 2: matrix / matrix-vector exceptions |\n"\
307 << "===============================================================================\n";
308
309 try{
310
311 FieldContainer<double> a_10_1_2_3_4(10, 1, 2, 3, 4);
312 FieldContainer<double> b_10_1_2_3_4(10, 1, 2, 3, 4);
313 FieldContainer<double> a_10(10);
314 FieldContainer<double> a_9(9);
315 FieldContainer<double> b_10(10);
316 FieldContainer<double> a_10_15_4_4(10, 15, 4, 4);
317 FieldContainer<double> b_10_15_4_4(10, 15, 4, 4);
318 FieldContainer<double> a_10_2_2(10, 2, 2);
319 FieldContainer<double> a_10_2_3(10, 2, 3);
320 FieldContainer<double> b_10_2_3(10, 2, 3);
321
322 FieldContainer<double> a_1_1(1, 1);
323 FieldContainer<double> b_1_1(1, 1);
324 FieldContainer<double> a_2_2(2, 2);
325 FieldContainer<double> b_2_2(2, 2);
326 FieldContainer<double> a_3_3(3, 3);
327 FieldContainer<double> b_3_3(3, 3);
328 FieldContainer<double> a_2_3(2, 3);
329 FieldContainer<double> a_4_4(4, 4);
330
331 FieldContainer<double> a_10_15_1_1(10, 15, 1, 1);
332 FieldContainer<double> b_10_15_1_1(10, 15, 1, 1);
333 FieldContainer<double> a_10_15_2_2(10, 15, 2, 2);
334 FieldContainer<double> b_10_15_2_2(10, 15, 2, 2);
335 FieldContainer<double> a_10_15_3_3(10, 15, 3, 3);
336 FieldContainer<double> a_10_15_3_2(10, 15, 3, 2);
337 FieldContainer<double> b_10_15_3_3(10, 15, 3, 3);
338 FieldContainer<double> b_10_14(10, 14);
339 FieldContainer<double> b_10_15(10, 15);
340 FieldContainer<double> b_10_14_3(10, 14, 3);
341 FieldContainer<double> b_10_15_3(10, 15, 3);
342
343
344#ifdef HAVE_INTREPID_DEBUG
345
346 *outStream << "-> inverse with multidimensional arrays:\n";
347
348 try {
349 rst::inverse(a_2_2, a_10_2_2);
350 }
351 catch (const std::logic_error & err) {
352 *outStream << "Expected Error ----------------------------------------------------------------\n";
353 *outStream << err.what() << '\n';
354 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
355 };
356 try {
357 rst::inverse(b_10_1_2_3_4, a_10_1_2_3_4);
358 }
359 catch (const std::logic_error & err) {
360 *outStream << "Expected Error ----------------------------------------------------------------\n";
361 *outStream << err.what() << '\n';
362 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
363 };
364 try {
365 rst::inverse(b_10, a_10);
366 }
367 catch (const std::logic_error & err) {
368 *outStream << "Expected Error ----------------------------------------------------------------\n";
369 *outStream << err.what() << '\n';
370 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
371 };
372 try {
373 rst::inverse(a_10_2_2, a_10_2_3);
374 }
375 catch (const std::logic_error & err) {
376 *outStream << "Expected Error ----------------------------------------------------------------\n";
377 *outStream << err.what() << '\n';
378 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
379 };
380 try {
381 rst::inverse(b_10_2_3, a_10_2_3);
382 }
383 catch (const std::logic_error & err) {
384 *outStream << "Expected Error ----------------------------------------------------------------\n";
385 *outStream << err.what() << '\n';
386 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
387 };
388 try {
389 rst::inverse(b_10_15_4_4, a_10_15_4_4);
390 }
391 catch (const std::logic_error & err) {
392 *outStream << "Expected Error ----------------------------------------------------------------\n";
393 *outStream << err.what() << '\n';
394 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
395 };
396 try {
397 rst::inverse(b_1_1, a_1_1);
398 }
399 catch (const std::logic_error & err) {
400 *outStream << "Expected Error ----------------------------------------------------------------\n";
401 *outStream << err.what() << '\n';
402 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
403 };
404 try {
405 rst::inverse(b_2_2, a_2_2);
406 }
407 catch (const std::logic_error & err) {
408 *outStream << "Expected Error ----------------------------------------------------------------\n";
409 *outStream << err.what() << '\n';
410 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
411 };
412 try {
413 rst::inverse(b_3_3, a_3_3);
414 }
415 catch (const std::logic_error & err) {
416 *outStream << "Expected Error ----------------------------------------------------------------\n";
417 *outStream << err.what() << '\n';
418 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
419 };
420 a_2_2[0] = 1.0;
421 a_3_3[0] = 1.0;
422 try {
423 rst::inverse(b_2_2, a_2_2);
424 }
425 catch (const std::logic_error & err) {
426 *outStream << "Expected Error ----------------------------------------------------------------\n";
427 *outStream << err.what() << '\n';
428 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
429 };
430 try {
431 rst::inverse(b_3_3, a_3_3);
432 }
433 catch (const std::logic_error & err) {
434 *outStream << "Expected Error ----------------------------------------------------------------\n";
435 *outStream << err.what() << '\n';
436 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
437 };
438
439 *outStream << "-> transpose with multidimensional arrays:\n";
440
441 try {
442 rst::transpose(a_2_2, a_10_2_2);
443 }
444 catch (const std::logic_error & err) {
445 *outStream << "Expected Error ----------------------------------------------------------------\n";
446 *outStream << err.what() << '\n';
447 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
448 };
449 try {
450 rst::transpose(b_10_1_2_3_4, a_10_1_2_3_4);
451 }
452 catch (const std::logic_error & err) {
453 *outStream << "Expected Error ----------------------------------------------------------------\n";
454 *outStream << err.what() << '\n';
455 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
456 };
457 try {
458 rst::transpose(b_10, a_10);
459 }
460 catch (const std::logic_error & err) {
461 *outStream << "Expected Error ----------------------------------------------------------------\n";
462 *outStream << err.what() << '\n';
463 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
464 };
465 try {
466 rst::transpose(a_10_2_2, a_10_2_3);
467 }
468 catch (const std::logic_error & err) {
469 *outStream << "Expected Error ----------------------------------------------------------------\n";
470 *outStream << err.what() << '\n';
471 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
472 };
473 try {
474 rst::transpose(b_10_2_3, a_10_2_3);
475 }
476 catch (const std::logic_error & err) {
477 *outStream << "Expected Error ----------------------------------------------------------------\n";
478 *outStream << err.what() << '\n';
479 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
480 };
481
482 *outStream << "-> determinant with multidimensional arrays:\n";
483
484 try {
485 rst::det(a_2_2, a_10_2_2);
486 }
487 catch (const std::logic_error & err) {
488 *outStream << "Expected Error ----------------------------------------------------------------\n";
489 *outStream << err.what() << '\n';
490 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
491 };
492 try {
493 rst::det(a_10_2_2, a_10_1_2_3_4);
494 }
495 catch (const std::logic_error & err) {
496 *outStream << "Expected Error ----------------------------------------------------------------\n";
497 *outStream << err.what() << '\n';
498 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
499 };
500 try {
501 rst::det(b_10_14, a_10_15_3_3);
502 }
503 catch (const std::logic_error & err) {
504 *outStream << "Expected Error ----------------------------------------------------------------\n";
505 *outStream << err.what() << '\n';
506 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
507 };
508 try {
509 rst::det(a_9, a_10_2_2);
510 }
511 catch (const std::logic_error & err) {
512 *outStream << "Expected Error ----------------------------------------------------------------\n";
513 *outStream << err.what() << '\n';
514 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
515 };
516 try {
517 rst::det(b_10, a_10_2_3);
518 }
519 catch (const std::logic_error & err) {
520 *outStream << "Expected Error ----------------------------------------------------------------\n";
521 *outStream << err.what() << '\n';
522 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
523 };
524 try {
525 rst::det(b_10_15, a_10_15_4_4);
526 }
527 catch (const std::logic_error & err) {
528 *outStream << "Expected Error ----------------------------------------------------------------\n";
529 *outStream << err.what() << '\n';
530 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
531 };
532 try {
533 rst::det(a_10_15_4_4);
534 }
535 catch (const std::logic_error & err) {
536 *outStream << "Expected Error ----------------------------------------------------------------\n";
537 *outStream << err.what() << '\n';
538 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
539 };
540 try {
541 rst::det(a_2_3);
542 }
543 catch (const std::logic_error & err) {
544 *outStream << "Expected Error ----------------------------------------------------------------\n";
545 *outStream << err.what() << '\n';
546 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
547 };
548 try {
549 rst::det(a_4_4);
550 }
551 catch (const std::logic_error & err) {
552 *outStream << "Expected Error ----------------------------------------------------------------\n";
553 *outStream << err.what() << '\n';
554 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
555 };
556
557 *outStream << "-> matrix-vector product with multidimensional arrays:\n";
558
559 try {
560 rst::matvec(a_10_2_2, a_10_2_3, b_10_2_3);
561 }
562 catch (const std::logic_error & err) {
563 *outStream << "Expected Error ----------------------------------------------------------------\n";
564 *outStream << err.what() << '\n';
565 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
566 };
567 try {
568 rst::matvec(a_2_2, a_2_2, a_10);
569 }
570 catch (const std::logic_error & err) {
571 *outStream << "Expected Error ----------------------------------------------------------------\n";
572 *outStream << err.what() << '\n';
573 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
574 };
575 try {
576 rst::matvec(a_9, a_10_2_2, a_2_2);
577 }
578 catch (const std::logic_error & err) {
579 *outStream << "Expected Error ----------------------------------------------------------------\n";
580 *outStream << err.what() << '\n';
581 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
582 };
583 try {
584 rst::matvec(b_10_15_3, a_10_15_3_3, b_10_14_3);
585 }
586 catch (const std::logic_error & err) {
587 *outStream << "Expected Error ----------------------------------------------------------------\n";
588 *outStream << err.what() << '\n';
589 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
590 };
591 try {
592 rst::matvec(b_10_14_3, a_10_15_3_3, b_10_15_3);
593 }
594 catch (const std::logic_error & err) {
595 *outStream << "Expected Error ----------------------------------------------------------------\n";
596 *outStream << err.what() << '\n';
597 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
598 };
599 try {
600 rst::matvec(b_10_15_3, a_10_15_3_2, b_10_15_3);
601 }
602 catch (const std::logic_error & err) {
603 *outStream << "Expected Error ----------------------------------------------------------------\n";
604 *outStream << err.what() << '\n';
605 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
606 };
607
608#endif
609
610 }
611 catch (const std::logic_error & err) {
612 *outStream << "UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
613 *outStream << err.what() << '\n';
614 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
615 errorFlag = -1000;
616 };
617#ifdef HAVE_INTREPID_DEBUG
618 if (Teuchos::TestForException_getThrowNumber() != endThrowNumber)
619 errorFlag++;
620#endif
621
622
623 *outStream \
624 << "\n"
625 << "===============================================================================\n"\
626 << "| TEST 2: correctness of math operations |\n"\
627 << "===============================================================================\n";
628
629 outStream->precision(20);
630
631 try{
632
633 // two-dimensional base containers
634 for (int dim=3; dim>0; dim--) {
635 int i0=4, i1=5;
636 FieldContainer<double> ma_x_x_d_d(i0, i1, dim, dim);
637 FieldContainer<double> mb_x_x_d_d(i0, i1, dim, dim);
638 FieldContainer<double> mc_x_x_d_d(i0, i1, dim, dim);
639 FieldContainer<double> va_x_x_d(i0, i1, dim);
640 FieldContainer<double> vb_x_x_d(i0, i1, dim);
641 FieldContainer<double> vc_x_x_d(i0, i1, dim);
642 FieldContainer<double> vdot_x_x(i0, i1);
643 FieldContainer<double> vnorms_x_x(i0, i1);
644 FieldContainer<double> vnorms_x(i0);
645 double zero = INTREPID_TOL*100.0;
646
647 // fill with random numbers
648 for (int i=0; i<ma_x_x_d_d.size(); i++) {
649 ma_x_x_d_d[i] = Teuchos::ScalarTraits<double>::random();
650 }
651 for (int i=0; i<va_x_x_d.size(); i++) {
652 va_x_x_d[i] = Teuchos::ScalarTraits<double>::random();
653 }
654
655 *outStream << "\n************ Checking vectorNorm ************\n";
656
657 rst::vectorNorm(vnorms_x_x, va_x_x_d, NORM_TWO);
658 *outStream << va_x_x_d;
659 *outStream << vnorms_x_x;
660 if ( std::abs(rst::vectorNorm(&vnorms_x_x[0], vnorms_x_x.size(), NORM_TWO) -
661 rst::vectorNorm(&va_x_x_d[0], va_x_x_d.size(), NORM_TWO)) > zero) {
662 *outStream << "\n\nINCORRECT vectorNorm NORM_TWO\n\n";
663 errorFlag = -1000;
664 }
665
666 rst::vectorNorm(vnorms_x_x, va_x_x_d, NORM_ONE);
667 *outStream << va_x_x_d;
668 *outStream << vnorms_x_x;
669 if ( std::abs(rst::vectorNorm(&vnorms_x_x[0], vnorms_x_x.size(), NORM_ONE) -
670 rst::vectorNorm(&va_x_x_d[0], va_x_x_d.size(), NORM_ONE)) > zero) {
671 *outStream << "\n\nINCORRECT vectorNorm NORM_ONE\n\n";
672 errorFlag = -1000;
673 }
674
675 rst::vectorNorm(vnorms_x_x, va_x_x_d, NORM_INF);
676 *outStream << va_x_x_d;
677 *outStream << vnorms_x_x;
678 if ( std::abs(rst::vectorNorm(&vnorms_x_x[0], vnorms_x_x.size(), NORM_INF) -
679 rst::vectorNorm(&va_x_x_d[0], va_x_x_d.size(), NORM_INF)) > zero) {
680 *outStream << "\n\nINCORRECT vectorNorm NORM_INF\n\n";
681 errorFlag = -1000;
682 }
683
684 /******************************************/
685
686
687 *outStream << "\n************ Checking inverse, subtract, and vectorNorm ************\n";
688
689 rst::inverse(mb_x_x_d_d, ma_x_x_d_d); // B = inv(A)
690 rst::inverse(mc_x_x_d_d, mb_x_x_d_d); // C = inv(B) ~= A
691 *outStream << ma_x_x_d_d << mb_x_x_d_d << mc_x_x_d_d;
692
693 rst::subtract(&mc_x_x_d_d[0], &ma_x_x_d_d[0], ma_x_x_d_d.size()); // C = C - A ~= 0
694
695 if (rst::vectorNorm(&mc_x_x_d_d[0], mc_x_x_d_d.size(), NORM_ONE) > zero) {
696 *outStream << "\n\nINCORRECT inverse OR subtract OR vectorNorm\n\n";
697 errorFlag = -1000;
698 }
699
700 /******************************************/
701
702
703 *outStream << "\n********** Checking determinant **********\n";
704
705 FieldContainer<double> detA_x_x(i0, i1);
706 FieldContainer<double> detB_x_x(i0, i1);
707
708 rst::det(detA_x_x, ma_x_x_d_d);
709 rst::det(detB_x_x, mb_x_x_d_d);
710 *outStream << detA_x_x << detB_x_x;
711
712 if ( (rst::dot(&detA_x_x[0], &detB_x_x[0], detA_x_x.size()) - (double)(i0*i1)) > zero) {
713 *outStream << "\n\nINCORRECT det\n\n" ;
714 errorFlag = -1000;
715 }
716
717 *outStream << "\n det(A)*det(inv(A)) = " <<
718 rst::det(&ma_x_x_d_d[0], ma_x_x_d_d.dimension(3))*rst::det(&mb_x_x_d_d[0], mb_x_x_d_d.dimension(3))
719 << "\n";
720
721 if ( (rst::det(&ma_x_x_d_d[0], ma_x_x_d_d.dimension(3))*
722 rst::det(&mb_x_x_d_d[0], mb_x_x_d_d.dimension(3)) - (double)1) > zero) {
723 *outStream << "\n\nINCORRECT det\n\n" ;
724 errorFlag = -1000;
725 }
726
727 /******************************************/
728
729
730 *outStream << "\n************ Checking transpose and subtract ************\n";
731
732 rst::transpose(mb_x_x_d_d, ma_x_x_d_d); // B = A^T
733 rst::transpose(mc_x_x_d_d, mb_x_x_d_d); // C = B^T = A
734 *outStream << ma_x_x_d_d << mb_x_x_d_d << mc_x_x_d_d;
735
736 rst::subtract(&mc_x_x_d_d[0], &ma_x_x_d_d[0], ma_x_x_d_d.size()); // C = C - A = 0
737
738 if (rst::vectorNorm(&mc_x_x_d_d[0], mc_x_x_d_d.size(), NORM_ONE) > zero) {
739 *outStream << "\n\nINCORRECT transpose OR subtract OR vectorNorm\n\n" ;
740 errorFlag = -1000;
741 }
742
743 /******************************************/
744
745
746 *outStream << "\n************ Checking matvec, vectorNorm, subtract, and inverse ************\n";
747
748 rst::inverse(mb_x_x_d_d, ma_x_x_d_d); // B = inv(A)
749 rst::inverse(mc_x_x_d_d, mb_x_x_d_d); // C = inv(B) ~= A
750 rst::matvec(vb_x_x_d, ma_x_x_d_d, va_x_x_d); // b = A*a
751 rst::matvec(vc_x_x_d, mb_x_x_d_d, vb_x_x_d); // c = inv(A)*(A*a) ~= a
752 rst::subtract(vc_x_x_d, va_x_x_d); // c = c - a ~= 0
753 *outStream << vc_x_x_d;
754
755 rst::vectorNorm(vnorms_x_x, vc_x_x_d, NORM_ONE);
756 rst::vectorNorm(vnorms_x, vnorms_x_x, NORM_INF);
757 if (rst::vectorNorm(vnorms_x, NORM_TWO) > zero) {
758 *outStream << "\n\nINCORRECT matvec OR inverse OR subtract OR vectorNorm\n\n";
759 errorFlag = -1000;
760 }
761
762 /******************************************/
763
764
765 *outStream << "\n************ Checking add, subtract, absval, and scale ************\n";
766
767 double x = 1.234;
768 rst::add(vc_x_x_d, va_x_x_d, vb_x_x_d); // c = a + b
769 rst::subtract(vc_x_x_d, vb_x_x_d); // c = c - b = a
770 rst::scale(vb_x_x_d, vc_x_x_d, x); // b = c*x;
771 rst::scale(vc_x_x_d, vb_x_x_d, (1.0/x)); // c = b*(1/x) = a;
772 rst::subtract(vb_x_x_d, vc_x_x_d, va_x_x_d); // b = c - a ~= 0
773 rst::absval(vc_x_x_d, vb_x_x_d); // c = |b|
774 rst::scale(vb_x_x_d, vc_x_x_d, -1.0); // b = -c
775 rst::absval(vc_x_x_d, vb_x_x_d); // c = |b|
776 rst::add(vc_x_x_d, vb_x_x_d); // c = c + b === 0
777 *outStream << vc_x_x_d;
778
779 rst::vectorNorm(vnorms_x_x, vc_x_x_d, NORM_ONE);
780 rst::vectorNorm(vnorms_x, vnorms_x_x, NORM_INF);
781 if (rst::vectorNorm(vnorms_x, NORM_TWO) > (double)0) {
782 *outStream << "\n\nSign flips combined with std::abs might not be invertible on this platform!\n"
783 << "Potential IEEE compliance issues!\n\n";
784 if (rst::vectorNorm(vnorms_x, NORM_TWO) > zero) {
785 *outStream << "\n\nINCORRECT add OR subtract OR scale OR absval OR vectorNorm\n\n";
786 errorFlag = -1000;
787 }
788 }
789
790 /******************************************/
791
792
793 *outStream << "\n************ Checking dot and vectorNorm ************\n";
794
795 for (int i=0; i<va_x_x_d.size(); i++) {
796 va_x_x_d[i] = 2.0;
797 }
798
799 rst::dot(vdot_x_x, va_x_x_d, va_x_x_d); // dot = a'*a
800 *outStream << vdot_x_x;
801
802 rst::vectorNorm(vnorms_x, vdot_x_x, NORM_ONE);
803 if (rst::vectorNorm(vnorms_x, NORM_ONE) - (double)(4.0*dim*i0*i1) > zero) {
804 *outStream << "\n\nINCORRECT dot OR vectorNorm\n\n";
805 errorFlag = -1000;
806 }
807
808 /******************************************/
809
810 *outStream << "\n";
811 }
812
813 // one-dimensional base containers
814 for (int dim=3; dim>0; dim--) {
815 int i0=7;
816 FieldContainer<double> ma_x_d_d(i0, dim, dim);
817 FieldContainer<double> mb_x_d_d(i0, dim, dim);
818 FieldContainer<double> mc_x_d_d(i0, dim, dim);
819 FieldContainer<double> va_x_d(i0, dim);
820 FieldContainer<double> vb_x_d(i0, dim);
821 FieldContainer<double> vc_x_d(i0, dim);
822 FieldContainer<double> vdot_x(i0);
823 FieldContainer<double> vnorms_x(i0);
824 double zero = INTREPID_TOL*100.0;
825
826 // fill with random numbers
827 for (int i=0; i<ma_x_d_d.size(); i++) {
828 ma_x_d_d[i] = Teuchos::ScalarTraits<double>::random();
829 }
830 for (int i=0; i<va_x_d.size(); i++) {
831 va_x_d[i] = Teuchos::ScalarTraits<double>::random();
832 }
833
834 *outStream << "\n************ Checking vectorNorm ************\n";
835
836 rst::vectorNorm(vnorms_x, va_x_d, NORM_TWO);
837 *outStream << va_x_d;
838 *outStream << vnorms_x;
839 if ( std::abs(rst::vectorNorm(&vnorms_x[0], vnorms_x.size(), NORM_TWO) -
840 rst::vectorNorm(&va_x_d[0], va_x_d.size(), NORM_TWO)) > zero) {
841 *outStream << "\n\nINCORRECT vectorNorm NORM_TWO\n\n";
842 errorFlag = -1000;
843 }
844
845 rst::vectorNorm(vnorms_x, va_x_d, NORM_ONE);
846 *outStream << va_x_d;
847 *outStream << vnorms_x;
848 if ( std::abs(rst::vectorNorm(&vnorms_x[0], vnorms_x.size(), NORM_ONE) -
849 rst::vectorNorm(&va_x_d[0], va_x_d.size(), NORM_ONE)) > zero) {
850 *outStream << "\n\nINCORRECT vectorNorm NORM_ONE\n\n";
851 errorFlag = -1000;
852 }
853
854 rst::vectorNorm(vnorms_x, va_x_d, NORM_INF);
855 *outStream << va_x_d;
856 *outStream << vnorms_x;
857 if ( std::abs(rst::vectorNorm(&vnorms_x[0], vnorms_x.size(), NORM_INF) -
858 rst::vectorNorm(&va_x_d[0], va_x_d.size(), NORM_INF)) > zero) {
859 *outStream << "\n\nINCORRECT vectorNorm NORM_INF\n\n";
860 errorFlag = -1000;
861 }
862
863 /******************************************/
864
865
866 *outStream << "\n************ Checking inverse, subtract, and vectorNorm ************\n";
867
868 rst::inverse(mb_x_d_d, ma_x_d_d); // B = inv(A)
869 rst::inverse(mc_x_d_d, mb_x_d_d); // C = inv(B) ~= A
870 *outStream << ma_x_d_d << mb_x_d_d << mc_x_d_d;
871
872 rst::subtract(&mc_x_d_d[0], &ma_x_d_d[0], ma_x_d_d.size()); // C = C - A ~= 0
873
874 if (rst::vectorNorm(&mc_x_d_d[0], mc_x_d_d.size(), NORM_ONE) > zero) {
875 *outStream << "\n\nINCORRECT inverse OR subtract OR vectorNorm\n\n";
876 errorFlag = -1000;
877 }
878
879 /******************************************/
880
881
882 *outStream << "\n********** Checking determinant **********\n";
883
884 FieldContainer<double> detA_x(i0);
885 FieldContainer<double> detB_x(i0);
886
887 rst::det(detA_x, ma_x_d_d);
888 rst::det(detB_x, mb_x_d_d);
889 *outStream << detA_x << detB_x;
890
891 if ( (rst::dot(&detA_x[0], &detB_x[0], detA_x.size()) - (double)i0) > zero) {
892 *outStream << "\n\nINCORRECT det\n\n" ;
893 errorFlag = -1000;
894 }
895
896 *outStream << "\n det(A)*det(inv(A)) = " <<
897 rst::det(&ma_x_d_d[0], ma_x_d_d.dimension(2))*rst::det(&mb_x_d_d[0], mb_x_d_d.dimension(2))
898 << "\n";
899
900 if ( (rst::det(&ma_x_d_d[0], ma_x_d_d.dimension(2))*
901 rst::det(&mb_x_d_d[0], mb_x_d_d.dimension(2)) - (double)1) > zero) {
902 *outStream << "\n\nINCORRECT det\n\n" ;
903 errorFlag = -1000;
904 }
905
906 /******************************************/
907
908
909 *outStream << "\n************ Checking transpose and subtract ************\n";
910
911 rst::transpose(mb_x_d_d, ma_x_d_d); // B = A^T
912 rst::transpose(mc_x_d_d, mb_x_d_d); // C = B^T = A
913 *outStream << ma_x_d_d << mb_x_d_d << mc_x_d_d;
914
915 rst::subtract(&mc_x_d_d[0], &ma_x_d_d[0], ma_x_d_d.size()); // C = C - A = 0
916
917 if (rst::vectorNorm(&mc_x_d_d[0], mc_x_d_d.size(), NORM_ONE) > zero) {
918 *outStream << "\n\nINCORRECT transpose OR subtract OR vectorNorm\n\n" ;
919 errorFlag = -1000;
920 }
921
922 /******************************************/
923
924
925 *outStream << "\n************ Checking matvec, vectorNorm, subtract, and inverse ************\n";
926
927 rst::inverse(mb_x_d_d, ma_x_d_d); // B = inv(A)
928 rst::inverse(mc_x_d_d, mb_x_d_d); // C = inv(B) ~= A
929 rst::matvec(vb_x_d, ma_x_d_d, va_x_d); // b = A*a
930 rst::matvec(vc_x_d, mb_x_d_d, vb_x_d); // c = inv(A)*(A*a) ~= a
931 rst::subtract(vc_x_d, va_x_d); // c = c - a ~= 0
932 *outStream << vc_x_d;
933
934 rst::vectorNorm(vnorms_x, vc_x_d, NORM_ONE);
935 if (rst::vectorNorm(vnorms_x, NORM_TWO) > zero) {
936 *outStream << "\n\nINCORRECT matvec OR inverse OR subtract OR vectorNorm\n\n";
937 errorFlag = -1000;
938 }
939
940 /******************************************/
941
942
943 *outStream << "\n************ Checking add, subtract, absval, and scale ************\n";
944
945 double x = 1.234;
946 rst::add(vc_x_d, va_x_d, vb_x_d); // c = a + b
947 rst::subtract(vc_x_d, vb_x_d); // c = c - b = a
948 rst::scale(vb_x_d, vc_x_d, x); // b = c*x;
949 rst::scale(vc_x_d, vb_x_d, (1.0/x)); // c = b*(1/x) = a;
950 rst::subtract(vb_x_d, vc_x_d, va_x_d); // b = c - a ~= 0
951 rst::absval(vc_x_d, vb_x_d); // c = |b|
952 rst::scale(vb_x_d, vc_x_d, -1.0); // b = -c
953 rst::absval(vc_x_d, vb_x_d); // c = |b|
954 rst::add(vc_x_d, vb_x_d); // c = c + b === 0
955 *outStream << vc_x_d;
956
957 rst::vectorNorm(vnorms_x, vc_x_d, NORM_ONE);
958 if (rst::vectorNorm(vnorms_x, NORM_TWO) > (double)0) {
959 *outStream << "\n\nSign flips combined with std::abs might not be invertible on this platform!\n"
960 << "Potential IEEE compliance issues!\n\n";
961 if (rst::vectorNorm(vnorms_x, NORM_TWO) > zero) {
962 *outStream << "\n\nINCORRECT add OR subtract OR scale OR absval OR vectorNorm\n\n";
963 errorFlag = -1000;
964 }
965 }
966
967 /******************************************/
968
969
970 *outStream << "\n************ Checking dot and vectorNorm ************\n";
971
972 for (int i=0; i<va_x_d.size(); i++) {
973 va_x_d[i] = 2.0;
974 }
975 rst::dot(vdot_x, va_x_d, va_x_d); // dot = a'*a
976 *outStream << vdot_x;
977
978 if (rst::vectorNorm(vdot_x, NORM_ONE) - (double)(4.0*dim*i0) > zero) {
979 *outStream << "\n\nINCORRECT dot OR vectorNorm\n\n";
980 errorFlag = -1000;
981 }
982
983 /******************************************/
984
985 *outStream << "\n";
986 }
987 }
988 catch (const std::logic_error & err) {
989 *outStream << "UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
990 *outStream << err.what() << '\n';
991 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
992 errorFlag = -1000;
993 };
994
995 if (errorFlag != 0)
996 std::cout << "End Result: TEST FAILED\n";
997 else
998 std::cout << "End Result: TEST PASSED\n";
999
1000 // reset format state of std::cout
1001 std::cout.copyfmt(oldFormatState);
1002
1003 return errorFlag;
1004}
Header file for utility class to provide multidimensional containers.
Header file for classes providing basic linear algebra functionality in 1D, 2D and 3D.