Nektar++
testNekSharedArray.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: testNekSharedArray.cpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: Test code for Nektar::shared_array
32//
33///////////////////////////////////////////////////////////////////////////////
34
38#include <UnitTests/util.h>
39
42
43#include <boost/test/test_tools.hpp>
44#include <boost/test/unit_test.hpp>
45#include <iostream>
46
47namespace Nektar
48{
49namespace SharedArrayUnitTests
50{
51
53{
54public:
56 {
57 a[0] = 0.0;
58 a[1] = 1.0;
59 a[2] = 2.0;
60 a[3] = 3.0;
61 a[4] = 4.0;
62 }
63
64 // out should refer to the same array as a, so any
65 // changes in out should be reflected in a.
67 {
68 out = a;
69 }
70
71 // Does nothing - the assignment goes into a temporary and is
72 // immediately lost.
74 {
75 out = a;
76 }
77
78 // The following should not compile because the assignment it going into a
79 // C++ const variable.
80 // void getNonConstByConstReference(const Array<OneD,
81 // NekDouble>& out)
82 // {
83 // out = a;
84 // }
85 //
86 // void getNonConstByConstValue(const Array<OneD, NekDouble>
87 // out)
88 // {
89 // out = a;
90 // }
91
92 // out should refer to the same array as a, so any
93 // changes in out should be reflected in a.
95 {
96 out = a;
97 }
98
99 // Does nothing - the assignment goes into a temporary and is
100 // immediately lost.
102 {
103 out = a;
104 }
105
108};
109
110BOOST_AUTO_TEST_CASE(TestParameterPopulation)
111{
113
114 Array<OneD, NekDouble> zero(5, 0.0);
115 Array<OneD, NekDouble> temp(zero);
116 Array<OneD, const NekDouble> const_zero(5, 0.0);
117 Array<OneD, const NekDouble> const_temp(const_zero);
118
119 obj.getNonConstByReference(temp);
120 BOOST_CHECK(temp == obj.a);
121
122 temp = zero;
123 obj.getNonConstByValue(temp);
124 BOOST_CHECK(temp == zero);
125 BOOST_CHECK(temp != obj.a);
126
127 // should not compile.
128 // obj.getNonConstByReference(const_temp);
129 // obj.getNonConstByValue(const_temp);
130
131 // Now the ConstArray versions.
132 obj.getConstByReference(const_temp);
133 BOOST_CHECK(const_temp == obj.a);
134 BOOST_CHECK(const_temp != const_zero);
135 const_temp = const_zero;
136 BOOST_CHECK(const_temp == const_zero);
137
138 obj.getConstByValue(const_temp);
139 BOOST_CHECK(const_temp == const_zero);
140 BOOST_CHECK(const_temp != obj.a);
141}
142
143BOOST_AUTO_TEST_CASE(TestEmptyConstructor)
144{
145 {
149 CountedObject<double>::Check(0, 0, 0, 0, 0, 0);
150
151 BOOST_CHECK(a.begin() == a.end());
152 BOOST_CHECK(b.begin() == b.end());
153
154 BOOST_CHECK_EQUAL(a.size(), 0);
155 BOOST_CHECK_EQUAL(b.size(), 0);
156
157 BOOST_CHECK_EQUAL(a.num_dimensions(), 1);
158 BOOST_CHECK_EQUAL(b.num_dimensions(), 1);
159 }
160 CountedObject<double>::Check(0, 0, 0, 0, 0, 0);
161
162 {
166 CountedObject<double>::Check(0, 0, 0, 0, 0, 0);
167
168 BOOST_CHECK(a.begin() == a.end());
169 BOOST_CHECK(b.begin() == b.end());
170
171 BOOST_CHECK_EQUAL(a.size(), 0);
172 BOOST_CHECK_EQUAL(b.size(), 0);
173
174 BOOST_CHECK_EQUAL(a.num_dimensions(), 2);
175 BOOST_CHECK_EQUAL(b.num_dimensions(), 2);
176 }
177 CountedObject<double>::Check(0, 0, 0, 0, 0, 0);
178}
179
180BOOST_AUTO_TEST_CASE(TestUninitializedConstructor)
181{
182 {
184
187 CountedObject<double>::Check(15, 0, 0, 0, 0, 0);
188
189 BOOST_CHECK(a.begin() != a.end());
190 BOOST_CHECK(b.begin() != b.end());
191
192 BOOST_CHECK_EQUAL(a.size(), 5);
193 BOOST_CHECK_EQUAL(b.size(), 10);
194
195 BOOST_CHECK_EQUAL(a.num_dimensions(), 1);
196 BOOST_CHECK_EQUAL(b.num_dimensions(), 1);
197 }
198 CountedObject<double>::Check(15, 0, 15, 0, 0, 0);
199
200 {
202
205 CountedObject<double>::Check(150, 0, 0, 0, 0, 0);
206
207 BOOST_CHECK(a.begin() != a.end());
208 BOOST_CHECK(b.begin() != b.end());
209
210 BOOST_CHECK_EQUAL(a.size(), 50);
211 BOOST_CHECK_EQUAL(b.size(), 100);
212
213 BOOST_CHECK_EQUAL(a.shape()[0], 5);
214 BOOST_CHECK_EQUAL(a.shape()[1], 10);
215 BOOST_CHECK_EQUAL(b.shape()[0], 10);
216 BOOST_CHECK_EQUAL(b.shape()[1], 10);
217
218 BOOST_CHECK_EQUAL(a.num_dimensions(), 2);
219 BOOST_CHECK_EQUAL(b.num_dimensions(), 2);
220 }
221 CountedObject<double>::Check(150, 0, 150, 0, 0, 0);
222}
223
224BOOST_AUTO_TEST_CASE(TestSingleValueInitialization)
225{
226 {
227 CountedObject<double> initValue(98);
229
231 Array<OneD, CountedObject<double>> b(10, initValue);
232 CountedObject<double>::Check(0, 0, 0, 15, 0, 0);
233
234 BOOST_CHECK(a.begin() != a.end());
235 BOOST_CHECK(b.begin() != b.end());
236
237 BOOST_CHECK_EQUAL(a.size(), 5);
238 BOOST_CHECK_EQUAL(b.size(), 10);
239
240 BOOST_CHECK_EQUAL(a.num_dimensions(), 1);
241 BOOST_CHECK_EQUAL(b.num_dimensions(), 1);
242
243 for (Array<OneD, const CountedObject<double>>::const_iterator iter =
244 a.begin();
245 iter != a.end(); ++iter)
246 {
247 BOOST_CHECK(*iter == initValue);
248 }
249
250 for (Array<OneD, CountedObject<double>>::iterator iter = b.begin();
251 iter != b.end(); ++iter)
252 {
253 BOOST_CHECK(*iter == initValue);
254 }
255 }
256 CountedObject<double>::Check(0, 0, 16, 15, 0, 0);
257
258 {
259 CountedObject<double> initValue(98);
261
262 Array<TwoD, const CountedObject<double>> a(5, 10, initValue);
263 Array<TwoD, CountedObject<double>> b(10, 10, initValue);
264 CountedObject<double>::Check(0, 0, 0, 150, 0, 0);
265
266 BOOST_CHECK(a.begin() != a.end());
267 BOOST_CHECK(b.begin() != b.end());
268
269 BOOST_CHECK_EQUAL(a.size(), 50);
270 BOOST_CHECK_EQUAL(b.size(), 100);
271
272 BOOST_CHECK_EQUAL(a.shape()[0], 5);
273 BOOST_CHECK_EQUAL(a.shape()[1], 10);
274 BOOST_CHECK_EQUAL(b.shape()[0], 10);
275 BOOST_CHECK_EQUAL(b.shape()[1], 10);
276
277 BOOST_CHECK_EQUAL(a.num_dimensions(), 2);
278 BOOST_CHECK_EQUAL(b.num_dimensions(), 2);
279
280 using size_type = Array<TwoD, double>::size_type;
281 for (size_type i = 0; i < a.shape()[0]; ++i)
282 {
283 for (size_type j = 0; j < a.shape()[1]; ++j)
284 {
285 BOOST_CHECK(a[i][j] == initValue);
286 }
287 }
288
289 for (size_type i = 0; i < b.shape()[0]; ++i)
290 {
291 for (size_type j = 0; j < b.shape()[1]; ++j)
292 {
293 BOOST_CHECK(b[i][j] == initValue);
294 }
295 }
296 }
297 CountedObject<double>::Check(0, 0, 151, 150, 0, 0);
298}
299
300BOOST_AUTO_TEST_CASE(TestPopulationFromCArray)
301{
302 {
303 CountedObject<double> a_array[] = {
306 CountedObject<double> b_array[] = {
311
314 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
315
316 BOOST_CHECK(a.begin() != a.end());
317 BOOST_CHECK(b.begin() != b.end());
318
319 BOOST_CHECK_EQUAL(a.size(), 4);
320 BOOST_CHECK_EQUAL(b.size(), 5);
321
322 BOOST_CHECK_EQUAL(a.num_dimensions(), 1);
323 BOOST_CHECK_EQUAL(b.num_dimensions(), 1);
324
325 using size_type = Array<OneD, double>::size_type;
326 for (size_type i = 0; i < a.size(); ++i)
327 {
328 BOOST_CHECK(a[i] == a_array[i]);
329 }
330
331 for (size_type i = 0; i < b.size(); ++i)
332 {
333 BOOST_CHECK(b[i] == b_array[i]);
334 }
335 }
336 CountedObject<double>::Check(0, 0, 18, 9, 0, 0);
337
338 {
339 double a_array[] = {1.0, 2.0, 3.0, 4.0};
340 double b_array[] = {5.0, 6.0, 7.0, 8.0, 9.0};
341 Array<OneD, double> a(4, a_array);
342 Array<OneD, double> b(5, b_array);
343
344 BOOST_CHECK(a.size() == 4);
345 BOOST_CHECK(b.size() == 5);
346
347 using size_type = Array<OneD, double>::size_type;
348 for (size_type i = 0; i < a.size(); ++i)
349 {
350 BOOST_CHECK(a[i] == a_array[i]);
351 }
352
353 for (size_type i = 0; i < b.size(); ++i)
354 {
355 BOOST_CHECK(b[i] == b_array[i]);
356 }
357 }
358}
359
360BOOST_AUTO_TEST_CASE(TestCopyConstruction)
361{
362 {
363 CountedObject<double> a_array[] = {
366 CountedObject<double> b_array[] = {
371
374 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
375
376 {
380
381 BOOST_CHECK_EQUAL(c.size(), a.size());
382 BOOST_CHECK_EQUAL(e.size(), a.size());
383 BOOST_CHECK_EQUAL(d.size(), b.size());
384 BOOST_CHECK(c.data() == a.data());
385 BOOST_CHECK(e.data() == a.data());
386 BOOST_CHECK(d.data() == b.data());
387
388 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
389 }
390 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
391 }
392 CountedObject<double>::Check(0, 0, 18, 9, 0, 0);
393
394 {
395 // Test offset copy constructor.
396 CountedObject<double> a_array[] = {
399 CountedObject<double> b_array[] = {
406 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
407
411
412 BOOST_CHECK_EQUAL(a_off[0].value, a[1].value);
413 BOOST_CHECK_EQUAL(a_off[1].value, a[2].value);
414 BOOST_CHECK_EQUAL(a_off[2].value, a[3].value);
415 BOOST_CHECK_EQUAL(a_off.size(), 3);
416
417 BOOST_CHECK_EQUAL(b_off[0].value, b[2].value);
418 BOOST_CHECK_EQUAL(b_off[1].value, b[3].value);
419 BOOST_CHECK_EQUAL(b_off[2].value, b[4].value);
420 BOOST_CHECK_EQUAL(b_off.size(), 3);
421
422 BOOST_CHECK_EQUAL(bb_off[0].value, b[2].value);
423 BOOST_CHECK_EQUAL(bb_off[1].value, b[3].value);
424 BOOST_CHECK_EQUAL(bb_off[2].value, b[4].value);
425 BOOST_CHECK_EQUAL(bb_off.size(), 3);
426 }
427}
428
429BOOST_AUTO_TEST_CASE(Test1DAssignmentOperator)
430{
431 {
432 // 1D
433 CountedObject<double> a_array[] = {
436 CountedObject<double> b_array[] = {
443 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
444
445 {
449 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
450
451 BOOST_CHECK_EQUAL(lhs_a.size(), 0);
452 BOOST_CHECK_EQUAL(lhs_b1.size(), 0);
453 BOOST_CHECK_EQUAL(lhs_b2.size(), 0);
454
455 {
456 lhs_a = a;
457 lhs_b1 = b;
458 lhs_b2 = b;
459 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
460
461 BOOST_CHECK_EQUAL(lhs_a.size(), a.size());
462 BOOST_CHECK_EQUAL(lhs_b1.size(), b.size());
463 BOOST_CHECK_EQUAL(lhs_b2.size(), b.size());
464 BOOST_CHECK_EQUAL(lhs_a.data(), a.data());
465 BOOST_CHECK_EQUAL(lhs_b1.data(), b.data());
466 BOOST_CHECK_EQUAL(lhs_b2.data(), b.data());
467
468 using size_type = Array<OneD, double>::size_type;
469 for (size_type i = 0; i < a.size(); ++i)
470 {
471 BOOST_CHECK(lhs_a[i] == a[i]);
472 }
473
474 for (size_type i = 0; i < b.size(); ++i)
475 {
476 BOOST_CHECK(lhs_b1[i] == b[i]);
477 BOOST_CHECK(lhs_b2[i] == b[i]);
478 }
479 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
480 }
481 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
482 }
483 CountedObject<double>::Check(0, 0, 0, 9, 0, 0);
484 }
485}
486
487BOOST_AUTO_TEST_CASE(Test2DAssignmentOperator)
488{
489 {
490 // 2D
491 CountedObject<double> initValue(98);
493
494 Array<TwoD, const CountedObject<double>> a(5, 10, initValue);
495 Array<TwoD, CountedObject<double>> b(10, 10, initValue);
496 CountedObject<double>::Check(0, 0, 0, 150, 0, 0);
497
498 BOOST_CHECK(a.begin() != a.end());
499 BOOST_CHECK(b.begin() != b.end());
500
501 BOOST_CHECK_EQUAL(a.size(), 50);
502 BOOST_CHECK_EQUAL(b.size(), 100);
503 BOOST_CHECK_EQUAL(a.shape()[0], 5);
504 BOOST_CHECK_EQUAL(a.shape()[1], 10);
505 BOOST_CHECK_EQUAL(b.shape()[0], 10);
506 BOOST_CHECK_EQUAL(b.shape()[1], 10);
507
508 BOOST_CHECK_EQUAL(a.num_dimensions(), 2);
509 BOOST_CHECK_EQUAL(b.num_dimensions(), 2);
510
511 {
515
516 BOOST_CHECK_EQUAL(lhs_a.size(), 0);
517 BOOST_CHECK_EQUAL(lhs_b1.size(), 0);
518 BOOST_CHECK_EQUAL(lhs_b2.size(), 0);
519
520 lhs_a = a;
521 lhs_b1 = b;
522 lhs_b2 = b;
523 CountedObject<double>::Check(0, 0, 0, 150, 0, 0);
524
525 BOOST_CHECK_EQUAL(lhs_a.size(), a.size());
526 BOOST_CHECK_EQUAL(lhs_b1.size(), b.size());
527 BOOST_CHECK_EQUAL(lhs_b2.size(), b.size());
528 BOOST_CHECK_EQUAL(lhs_a.shape()[0], a.shape()[0]);
529 BOOST_CHECK_EQUAL(lhs_a.shape()[1], a.shape()[1]);
530
531 BOOST_CHECK_EQUAL(lhs_b1.shape()[0], b.shape()[0]);
532 BOOST_CHECK_EQUAL(lhs_b1.shape()[1], b.shape()[1]);
533
534 BOOST_CHECK_EQUAL(lhs_b2.shape()[0], b.shape()[0]);
535 BOOST_CHECK_EQUAL(lhs_b2.shape()[1], b.shape()[1]);
536
537 using size_type = Array<TwoD, double>::size_type;
538 for (size_type i = 0; i < a.shape()[0]; ++i)
539 {
540 for (size_type j = 0; j < a.shape()[1]; ++j)
541 {
542 BOOST_CHECK(a[i][j] == initValue);
543 BOOST_CHECK(lhs_a[i][j] == a[i][j]);
544 }
545 }
546
547 for (size_type i = 0; i < b.shape()[0]; ++i)
548 {
549 for (size_type j = 0; j < b.shape()[1]; ++j)
550 {
551 BOOST_CHECK(b[i][j] == initValue);
552 BOOST_CHECK(lhs_b1[i][j] == b[i][j]);
553 BOOST_CHECK(lhs_b2[i][j] == b[i][j]);
554 }
555 }
556 }
557 CountedObject<double>::Check(0, 0, 0, 150, 0, 0);
558 }
559
560 CountedObject<double>::Check(0, 0, 151, 150, 0, 0);
561}
562
563BOOST_AUTO_TEST_CASE(TestOffsetAssignmentOperator)
564{
565 double a[] = {1.0, 2.0, 3.0, 4.0, 5.0};
566 double b[] = {10.0, 20.0, 30.0, 40.0};
567
568 Array<OneD, NekDouble> rhs_a(5, a);
570
571 Array<OneD, NekDouble> offset_a = rhs_a + 2;
572 ;
573 Array<OneD, const NekDouble> offset_b = rhs_a + 2;
574
577
578 lhs_a = offset_a;
579 lhs_b = offset_b;
580
581 BOOST_CHECK_EQUAL(lhs_a.size(), offset_a.size());
582 BOOST_CHECK_EQUAL(lhs_b.size(), offset_b.size());
583
584 using size_type = Array<TwoD, double>::size_type;
585 for (size_type i = 0; i < lhs_a.size(); ++i)
586 {
587 BOOST_CHECK(lhs_a[i] == offset_a[i]);
588 }
589
590 for (size_type i = 0; i < lhs_b.size(); ++i)
591 {
592 BOOST_CHECK(lhs_b[i] == offset_b[i]);
593 }
594}
595
596BOOST_AUTO_TEST_CASE(Test1DAccessOperator)
597{
599 // Normal access.
600 double a[] = {1.0, 2.0, 3.0, 4.0, 5.0};
601 double b[] = {10.0, 20.0, 30.0, 40.0};
602
603 Array<OneD, NekDouble> rhs_a(5, a);
605
606 BOOST_CHECK_EQUAL(rhs_a[0], 1.0);
607 BOOST_CHECK_EQUAL(rhs_a[1], 2.0);
608 BOOST_CHECK_EQUAL(rhs_a[2], 3.0);
609 BOOST_CHECK_EQUAL(rhs_a[3], 4.0);
610 BOOST_CHECK_EQUAL(rhs_a[4], 5.0);
611
612 BOOST_CHECK_EQUAL(rhs_b[0], 10.0);
613 BOOST_CHECK_EQUAL(rhs_b[1], 20.0);
614 BOOST_CHECK_EQUAL(rhs_b[2], 30.0);
615 BOOST_CHECK_EQUAL(rhs_b[3], 40.0);
616#if defined(NEKTAR_DEBUG) || defined(NEKTAR_FULL_DEBUG)
617 BOOST_CHECK_NO_THROW(rhs_a[4]);
618 BOOST_CHECK_THROW(rhs_a[5], ErrorUtil::NekError);
619 BOOST_CHECK_NO_THROW(rhs_b[3]);
620 BOOST_CHECK_THROW(rhs_b[4], ErrorUtil::NekError);
621#endif
622}
623
624BOOST_AUTO_TEST_CASE(Test2DAccessOperator)
625{
626 {
627 NekDouble a_vals[] = {1.0, 2.0, 3.0, 4.0, 5.0,
628 6.0, 7.0, 8.0, 9.0, 10.0};
629 Array<TwoD, NekDouble> a(5, 2, a_vals);
630
631 BOOST_CHECK_EQUAL(a.GetRows(), 5);
632 BOOST_CHECK_EQUAL(a.GetColumns(), 2);
633
634 using size_type = Array<TwoD, double>::size_type;
635 for (size_type i = 0; i < a.GetRows(); ++i)
636 {
637 for (size_type j = 0; j < a.GetColumns(); ++j)
638 {
639 BOOST_CHECK_EQUAL(a[i][j], a_vals[i * a.GetColumns() + j]);
640 }
641 }
642
643 // Now test assignment.
644 NekDouble rhs_vals[] = {18.0, -76.2, 45.2, 1352.246, -46.346,
645 -2463.346, 26.347, 1.0, 0.0, 23465.3};
646 for (size_type i = 0; i < a.GetRows(); ++i)
647 {
648 for (size_type j = 0; j < a.GetColumns(); ++j)
649 {
650 a[i][j] = rhs_vals[i * a.GetColumns() + j];
651 }
652 }
653
654 for (size_type i = 0; i < a.GetRows(); ++i)
655 {
656 for (size_type j = 0; j < a.GetColumns(); ++j)
657 {
658 BOOST_CHECK_EQUAL(a[i][j], rhs_vals[i * a.GetColumns() + j]);
659 }
660 }
661 }
662
663 {
664 // Test 1 Column.
665 NekDouble a_vals[] = {1.0, 3.0, 5.0, 7.0, 9.0};
666 Array<TwoD, NekDouble> a(5, 1, a_vals);
667 BOOST_CHECK_EQUAL(a.GetRows(), 5);
668 BOOST_CHECK_EQUAL(a.GetColumns(), 1);
669
670 using size_type = Array<TwoD, double>::size_type;
671 for (size_type i = 0; i < a.GetRows(); ++i)
672 {
673 BOOST_CHECK_EQUAL(a[i][0], a_vals[i]);
674 }
675 }
676
677 {
679 a[0][0] = 17.23;
680 BOOST_CHECK_EQUAL(a[0][0], 17.23);
681 }
682}
683
684BOOST_AUTO_TEST_CASE(Test1DEqualOperator)
685{
686 {
687 // integer types
688 using int_type = int;
689
690 int_type a[] = {1, 2, 3, 4, 5};
691
692 Array<OneD, int_type> nek_a(5, a);
693 Array<OneD, int_type> nek_b(5, a);
694 Array<OneD, const int_type> nek_c(5, a);
695
696 // still equal
697 BOOST_CHECK(nek_a == nek_b);
698 // equal and only one const
699 BOOST_CHECK(nek_a == nek_c);
700
701 // not equal
702 nek_b[3] += 1;
703 BOOST_CHECK(!(nek_a == nek_b));
704 }
705
706 {
707 // float types
708 using float_type = double;
709
710 float_type a[] = {1.0, 2.0, 3.0, 4.0, 5.0};
711
712 Array<OneD, float_type> nek_a(5, a);
713 Array<OneD, float_type> nek_b(5, a);
715
716 // still equal
717 nek_b[3] *= (1.0 + std::numeric_limits<float_type>::epsilon());
718 BOOST_CHECK(nek_a == nek_b);
719 // equal and only one const
720 BOOST_CHECK(nek_a == nek_c);
721
722 // not equal
723 nek_b[4] *= (1.0 + 100 * std::numeric_limits<float_type>::epsilon());
724 BOOST_CHECK(!(nek_a == nek_b));
725 }
726
727 // This should not compile
728 // {
729 // // mixed types should not compare
730 // using float_type = double;
731 // using int_type = int;
732
733 // float_type a[] = {1.0, 2.0, 3.0, 4.0, 5.0};
734 // int_type b[] = {1, 2, 3, 4, 5};
735
736 // Array<OneD, float_type> nek_a(5, a);
737 // Array<OneD, int_type> nek_b(5, b);
738
739 // // still equal
740 // BOOST_CHECK(nek_a == nek_b);
741 // }
742}
743
744BOOST_AUTO_TEST_CASE(Test2DEqualOperator)
745{
746 {
747 // integer types
748 using int_type = int;
749
750 int_type a[] = {1, 2, 3, 4, 5};
751 Array<TwoD, int_type> nek_a(5, 1, a);
752 Array<TwoD, int_type> nek_b(5, 1, a);
753 Array<TwoD, const int_type> nek_c(5, 1, a);
754
755 // still equal
756 BOOST_CHECK(nek_a == nek_b);
757 // equal and only one const
758 BOOST_CHECK(nek_a == nek_c);
759
760 // not equal
761 nek_b[3][0] += 1;
762 BOOST_CHECK(!(nek_a == nek_b));
763 }
764
765 {
766 // floating types
767 using float_type = double;
768
769 float_type a[] = {1., 2., 3., 4., 5.};
770 Array<TwoD, float_type> nek_a(5, 1, a);
771 Array<TwoD, float_type> nek_b(5, 1, a);
772 Array<TwoD, const float_type> nek_c(5, 1, a);
773
774 // still equal
775 nek_b[3][0] *= (1.0 + std::numeric_limits<float_type>::epsilon());
776 BOOST_CHECK(nek_a == nek_b);
777 // equal and only one const
778 BOOST_CHECK(nek_a == nek_c);
779
780 // not equal
781 nek_b[4][0] *= (1.0 + 100 * std::numeric_limits<float_type>::epsilon());
782 BOOST_CHECK(!(nek_a == nek_b));
783 }
784}
785
786} // namespace SharedArrayUnitTests
787} // namespace Nektar
static void Check(unsigned int expectedDefaultConstructed, unsigned int expectedConstructedFromInt, unsigned int expectedDestroyed, unsigned int expectedCopied, unsigned int expectedCloned, unsigned int expectedAssigned)
static void ClearCounters()
void getConstByReference(Array< OneD, const NekDouble > &out)
void getNonConstByValue(Array< OneD, NekDouble > out)
void getConstByValue(Array< OneD, const NekDouble > out)
void getNonConstByReference(Array< OneD, NekDouble > &out)
BOOST_AUTO_TEST_CASE(TestArrayConstructionFromConstantArray)
void RedirectCerrIfNeeded()
Definition: util.cpp:43
std::vector< double > d(NPUPPER *NPUPPER)
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
double NekDouble