Nektar++
Functions
Nektar::BlockMatrixUnitTests Namespace Reference

Functions

 BOOST_AUTO_TEST_CASE (TestEqualSizedBlockConstruction)
 
 BOOST_AUTO_TEST_CASE (TestElementAccessBlockMatrix)
 
 BOOST_AUTO_TEST_CASE (TestEmptyRowElementAccess)
 
 BOOST_AUTO_TEST_CASE (TestEmptyRowElementMultiplication)
 
 BOOST_AUTO_TEST_CASE (TestRowsAndColumnsPerBlockAccess)
 
 BOOST_AUTO_TEST_CASE (TestMultiplication)
 
 BOOST_AUTO_TEST_CASE (TestBlockMatrixTranspose)
 
 BOOST_AUTO_TEST_CASE (TestBlockScaledMatrix)
 
 BOOST_AUTO_TEST_CASE (TestBlockBlockMatrixTranspose)
 
 BOOST_AUTO_TEST_CASE (TestBlockBlockScaledMatrixTranspose)
 
 BOOST_AUTO_TEST_CASE (TestMultiplicationBlock_1)
 
 BOOST_AUTO_TEST_CASE (TestDiagonalBlockMatrixMultiplication)
 
 BOOST_AUTO_TEST_CASE (TestDiagonalBlockMatrixMultiplicationWith0SizeBlocks)
 
 BOOST_AUTO_TEST_CASE (TestBlockMatrixMultiplicationWith0SizeBlocks)
 
 BOOST_AUTO_TEST_CASE (TestBlockMatrixErrorFrom6_10)
 

Function Documentation

◆ BOOST_AUTO_TEST_CASE() [1/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestBlockBlockMatrixTranspose  )

Definition at line 367 of file TestBlockMatrix.cpp.

368{
372
373 double m_00_buf[] = {1, 2, 3, 4, 5, 6};
374 double m_01_buf[] = {7, 8, 9, 10, 11, 12, 13, 14};
375 double m_10_buf[] = {15, 16, 17, 18, 19, 20};
376 double m_11_buf[] = {21, 22, 23, 24, 25, 26, 27, 28};
377 double m_20_buf[] = {29, 30, 31, 32, 33, 34};
378 double m_21_buf[] = {35, 36, 37, 38, 39, 40, 41, 42};
379 std::shared_ptr<Matrix> m00(new Matrix(2, 3, m_00_buf));
380 std::shared_ptr<Matrix> m01(new Matrix(2, 4, m_01_buf));
381 std::shared_ptr<Matrix> m10(new Matrix(2, 3, m_10_buf));
382 std::shared_ptr<Matrix> m11(new Matrix(2, 4, m_11_buf));
383 std::shared_ptr<Matrix> m20(new Matrix(2, 3, m_20_buf));
384 std::shared_ptr<Matrix> m21(new Matrix(2, 4, m_21_buf));
385
386 unsigned int rowCounts[] = {2, 2, 2};
387 unsigned int colCounts[] = {3, 4};
388
389 std::vector<std::shared_ptr<InnerMatrix>> innerMatrices;
390
391 for (int i = 0; i < 6; ++i)
392 {
393 std::shared_ptr<Matrix> t00(new Matrix(*m00));
394 std::shared_ptr<Matrix> t01(new Matrix(*m01));
395 std::shared_ptr<Matrix> t10(new Matrix(*m10));
396 std::shared_ptr<Matrix> t11(new Matrix(*m11));
397 std::shared_ptr<Matrix> t20(new Matrix(*m20));
398 std::shared_ptr<Matrix> t21(new Matrix(*m21));
399
400 (*t00) *= (i + 1);
401 (*t01) *= (i + 1);
402 (*t10) *= (i + 1);
403 (*t11) *= (i + 1);
404 (*t20) *= (i + 1);
405 (*t21) *= (i + 1);
406
407 std::shared_ptr<InnerMatrix> matrix(
408 new InnerMatrix(3, 2, rowCounts, colCounts));
409 matrix->SetBlock(0, 0, t00);
410 matrix->SetBlock(0, 1, t01);
411 matrix->SetBlock(1, 0, t10);
412 matrix->SetBlock(1, 1, t11);
413 matrix->SetBlock(2, 0, t20);
414 matrix->SetBlock(2, 1, t21);
415
416 innerMatrices.push_back(matrix);
417 }
418
419 unsigned int topLevelRowCounts[] = {6, 6};
420 unsigned int topLevelColumnCounts[] = {7, 7, 7};
421 BlockMatrix topLevelMatrix(2, 3, topLevelRowCounts, topLevelColumnCounts);
422 topLevelMatrix.SetBlock(0, 0, innerMatrices[0]);
423 topLevelMatrix.SetBlock(0, 1, innerMatrices[1]);
424 topLevelMatrix.SetBlock(0, 2, innerMatrices[2]);
425 topLevelMatrix.SetBlock(1, 0, innerMatrices[3]);
426 topLevelMatrix.SetBlock(1, 1, innerMatrices[4]);
427 topLevelMatrix.SetBlock(1, 2, innerMatrices[5]);
428
429 double v_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
430 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
431 NekVector<double> v(21, v_buf);
432
433 NekVector<double> result = topLevelMatrix * v;
434
435 double expected_result_buf[] = {4256, 4816, 12096, 12656, 19936, 20496,
436 9611, 10864, 27153, 28406, 44695, 45948};
437 NekVector<double> expected_result(12, expected_result_buf);
438
439 BOOST_CHECK_EQUAL(expected_result, result);
440
441 topLevelMatrix.Transpose();
442
443 double transposed_v_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
444 NekVector<double> transposed_v(12, transposed_v_buf);
445 NekVector<double> transposed_result = topLevelMatrix * transposed_v;
446
447 double expected_transpose_result_buf[] = {
448 4427, 4925, 5423, 5921, 6419, 6917, 7415, 5863, 6517, 7171, 7825,
449 8479, 9133, 9787, 7299, 8109, 8919, 9729, 10539, 11349, 12159};
450 NekVector<double> expected_transpose_result(21,
451 expected_transpose_result_buf);
452
453 BOOST_CHECK_EQUAL(expected_transpose_result, transposed_result);
454}
NekMatrix< DenseMatrix, BlockMatrixTag > BlockMatrix
Definition: NekTypeDefs.hpp:59

◆ BOOST_AUTO_TEST_CASE() [2/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestBlockBlockScaledMatrixTranspose  )

Definition at line 456 of file TestBlockMatrix.cpp.

457{
459 typedef NekMatrix<NekMatrix<double>, ScaledMatrixTag> ScaledMatrix;
462
463 double m_00_buf[] = {1, 2, 3, 4, 5, 6};
464 double m_01_buf[] = {7, 8, 9, 10, 11, 12, 13, 14};
465 double m_10_buf[] = {15, 16, 17, 18, 19, 20};
466 double m_11_buf[] = {21, 22, 23, 24, 25, 26, 27, 28};
467 double m_20_buf[] = {29, 30, 31, 32, 33, 34};
468 double m_21_buf[] = {35, 36, 37, 38, 39, 40, 41, 42};
469 std::shared_ptr<Matrix> m00(new Matrix(2, 3, m_00_buf));
470 std::shared_ptr<Matrix> m01(new Matrix(2, 4, m_01_buf));
471 std::shared_ptr<Matrix> m10(new Matrix(2, 3, m_10_buf));
472 std::shared_ptr<Matrix> m11(new Matrix(2, 4, m_11_buf));
473 std::shared_ptr<Matrix> m20(new Matrix(2, 3, m_20_buf));
474 std::shared_ptr<Matrix> m21(new Matrix(2, 4, m_21_buf));
475
476 unsigned int rowCounts[] = {2, 2, 2};
477 unsigned int colCounts[] = {3, 4};
478
479 std::vector<std::shared_ptr<InnerMatrix>> innerMatrices;
480
481 for (int i = 0; i < 6; ++i)
482 {
483 std::shared_ptr<Matrix> t00(new Matrix(*m00));
484 std::shared_ptr<Matrix> t01(new Matrix(*m01));
485 std::shared_ptr<Matrix> t10(new Matrix(*m10));
486 std::shared_ptr<Matrix> t11(new Matrix(*m11));
487 std::shared_ptr<Matrix> t20(new Matrix(*m20));
488 std::shared_ptr<Matrix> t21(new Matrix(*m21));
489
490 std::shared_ptr<ScaledMatrix> s00(new ScaledMatrix(i + 1, t00));
491 std::shared_ptr<ScaledMatrix> s01(new ScaledMatrix(i + 1, t01));
492 std::shared_ptr<ScaledMatrix> s10(new ScaledMatrix(i + 1, t10));
493 std::shared_ptr<ScaledMatrix> s11(new ScaledMatrix(i + 1, t11));
494 std::shared_ptr<ScaledMatrix> s20(new ScaledMatrix(i + 1, t20));
495 std::shared_ptr<ScaledMatrix> s21(new ScaledMatrix(i + 1, t21));
496
497 std::shared_ptr<InnerMatrix> matrix(
498 new InnerMatrix(3, 2, rowCounts, colCounts));
499 matrix->SetBlock(0, 0, s00);
500 matrix->SetBlock(0, 1, s01);
501 matrix->SetBlock(1, 0, s10);
502 matrix->SetBlock(1, 1, s11);
503 matrix->SetBlock(2, 0, s20);
504 matrix->SetBlock(2, 1, s21);
505
506 innerMatrices.push_back(matrix);
507 }
508
509 unsigned int topLevelRowCounts[] = {6, 6};
510 unsigned int topLevelColumnCounts[] = {7, 7, 7};
511 BlockMatrix topLevelMatrix(2, 3, topLevelRowCounts, topLevelColumnCounts);
512 topLevelMatrix.SetBlock(0, 0, innerMatrices[0]);
513 topLevelMatrix.SetBlock(0, 1, innerMatrices[1]);
514 topLevelMatrix.SetBlock(0, 2, innerMatrices[2]);
515 topLevelMatrix.SetBlock(1, 0, innerMatrices[3]);
516 topLevelMatrix.SetBlock(1, 1, innerMatrices[4]);
517 topLevelMatrix.SetBlock(1, 2, innerMatrices[5]);
518
519 double v_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
520 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
521 NekVector<double> v(21, v_buf);
522
523 NekVector<double> result = topLevelMatrix * v;
524
525 double expected_result_buf[] = {4256, 4816, 12096, 12656, 19936, 20496,
526 9611, 10864, 27153, 28406, 44695, 45948};
527 NekVector<double> expected_result(12, expected_result_buf);
528
529 BOOST_CHECK_EQUAL(expected_result, result);
530
531 topLevelMatrix.Transpose();
532
533 double transposed_v_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
534 NekVector<double> transposed_v(12, transposed_v_buf);
535 NekVector<double> transposed_result = topLevelMatrix * transposed_v;
536
537 double expected_transpose_result_buf[] = {
538 4427, 4925, 5423, 5921, 6419, 6917, 7415, 5863, 6517, 7171, 7825,
539 8479, 9133, 9787, 7299, 8109, 8919, 9729, 10539, 11349, 12159};
540 NekVector<double> expected_transpose_result(21,
541 expected_transpose_result_buf);
542
543 BOOST_CHECK_EQUAL(expected_transpose_result, transposed_result);
544}
NekMatrix< DenseMatrix, ScaledMatrixTag > ScaledMatrix
Definition: NekTypeDefs.hpp:55

◆ BOOST_AUTO_TEST_CASE() [3/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestBlockMatrixErrorFrom6_10  )

Definition at line 717 of file TestBlockMatrix.cpp.

718{
719
720 // Array<OneD, NekDouble> f_bnd(m_BCinv->GetRows());
721 // NekVector< NekDouble > F_bnd(f_bnd.size(), f_bnd, eWrapper);
722
723 // Array<OneD, NekDouble> f_int(m_BCinv->GetColumns());
724 // NekVector< NekDouble > F_int(f_int.size(),f_int, eWrapper);
725
726 // Array<OneD, NekDouble > f_p(m_D_int->GetRows());
727 // NekVector< NekDouble > F_p(f_p.size(),f_p,eWrapper);
728
729 // typedef NekMatrix<DNekScalBlkMat, BlockMatrixTag> BlkMatDNekScalBlkMat;
730 // typedef std::shared_ptr<BlkMatDNekScalBlkMat>
731 // BlkMatDNekScalBlkMatSharedPtr;
732
733 // BlkMatDNekScalBlkMatSharedPtr m_Btilde =
734 // MemoryManager<BlkMatDNekScalBlkMat>
735 // ::AllocateSharedPtr(nsize_int,nsize_bndry,blkmatStorage);
736 // BlkMatDNekScalBlkMatSharedPtr m_Cinv =
737 // MemoryManager<BlkMatDNekScalBlkMat>
738 // ::AllocateSharedPtr(nsize_int,nsize_int,eFull);
739
740 typedef NekMatrix<double> M1;
744
745 std::vector<std::shared_ptr<M2>> scaledMatrices;
746 for (unsigned int i = 0; i < 36; ++i)
747 {
748 double values[] = {i * 4.0, i * 4.0 + 1.0, i * 4.0 + 2.0,
749 i * 4.0 + 3.0};
750 std::shared_ptr<M1> matrix(new M1(2, 2, values));
751 std::shared_ptr<M2> scaled(new M2(1.0, matrix));
752 scaledMatrices.push_back(scaled);
753 }
754
755 std::vector<std::shared_ptr<M3>> blockMatrices;
756 for (unsigned int i = 0; i < 6; ++i)
757 {
758 std::shared_ptr<M3> blockMatrix(new M3(2, 3, 2, 2));
759 blockMatrix->SetBlock(0, 0, scaledMatrices[i * 6]);
760 blockMatrix->SetBlock(0, 1, scaledMatrices[i * 6 + 1]);
761 blockMatrix->SetBlock(0, 2, scaledMatrices[i * 6 + 2]);
762 blockMatrix->SetBlock(1, 0, scaledMatrices[i * 6 + 3]);
763 blockMatrix->SetBlock(1, 1, scaledMatrices[i * 6 + 4]);
764 blockMatrix->SetBlock(1, 2, scaledMatrices[i * 6 + 5]);
765 blockMatrices.push_back(blockMatrix);
766 }
767
768 std::shared_ptr<M4> matrix(new M4(3, 2, 4, 6));
769 matrix->SetBlock(0, 0, blockMatrices[0]);
770 matrix->SetBlock(0, 1, blockMatrices[1]);
771 matrix->SetBlock(1, 0, blockMatrices[2]);
772 matrix->SetBlock(1, 1, blockMatrices[3]);
773 matrix->SetBlock(2, 0, blockMatrices[4]);
774 matrix->SetBlock(2, 1, blockMatrices[5]);
775
776 double b_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
777 NekVector<double> b(12, b_buf);
778
779 {
780 NekVector<double> result = (*matrix) * b;
781
782 double expected_buf[] = {1828, 1906, 2764, 2842, 5572, 5650,
783 6508, 6586, 9316, 9394, 10252, 10330};
784 NekVector<double> expected_result(12, expected_buf);
785 BOOST_CHECK_EQUAL(result, expected_result);
786 }
787
788 {
789 NekVector<double> result = b - (*matrix) * b;
790
791 double expected_buf[] = {-1827, -1904, -2761, -2838, -5567, -5644,
792 -6501, -6578, -9307, -9384, -10241, -10318};
793
794 NekVector<double> expected_result(12, expected_buf);
795 BOOST_CHECK_EQUAL(expected_result, result);
796 }
797
798 {
799 NekVector<double> result = b;
800 result = result - (*matrix) * b;
801
802 double expected_buf[] = {-1827, -1904, -2761, -2838, -5567, -5644,
803 -6501, -6578, -9307, -9384, -10241, -10318};
804
805 NekVector<double> expected_result(12, expected_buf);
806 BOOST_CHECK_EQUAL(expected_result, result);
807 }
808
809 //#if 0
810 // F_int = (F_int - (*m_Btilde)*F_bnd);
811 //#else
812 // for(i = 0; i < m_Btilde->GetRows(); ++i)
813 // {
814 // for(j = 0; j < m_Btilde->GetColumns(); ++j)
815 // {
816 // F_int[i] -= (*m_Btilde)(i,j)*F_bnd[j];
817 // }
818 // }
819 //#endif
820 //
821 // F_int = (F_int + Transpose(*m_D_int)*F_p);
822 //
823 //#if 0
824 // F_int = (*m_Cinv)*F_int;
825 //#else
826 // Array<OneD, NekDouble> ftmp(F_int.GetDimension(),0.0);
827 // for(i = 0; i < m_Cinv->GetRows(); ++i)
828 // {
829 // for(j = 0; j < m_Cinv->GetColumns(); ++j)
830 // {
831 // ftmp[i] += (*m_Cinv)(i,j)*F_int[j];
832 // }
833 // }
834 // for(i = 0; i < ftmp.size(); ++i)
835 // {
836 // F_int[i] = ftmp[i];
837 // }
838 //#endif
839}

◆ BOOST_AUTO_TEST_CASE() [4/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestBlockMatrixMultiplicationWith0SizeBlocks  )

Definition at line 689 of file TestBlockMatrix.cpp.

690{
691 typedef NekMatrix<double> InnerType;
692 typedef NekMatrix<InnerType, BlockMatrixTag> BlockType;
693
694 double m_22_buf[] = {1, 2, 3, 4, 5, 6, 7, 8};
695
696 std::shared_ptr<InnerType> m22(new InnerType(1, 8, m_22_buf));
697
698 unsigned int rowCounts[] = {0, 0, 1};
699 unsigned int colCounts[] = {6, 6, 8};
700
701 BlockType b(3, 3, rowCounts, colCounts, eFULL);
702 b.SetBlock(2, 2, m22);
703
704 double rhs_buf[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
705 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
706 NekVector<double> rhs(20, rhs_buf);
707
708 NekVector<double> result = b * rhs;
709
710 double expected_buf[] = {1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 5 * 5 + 6 * 6 +
711 7 * 7 + 8 * 8};
712 NekVector<double> expected_result(1, expected_buf);
713
714 BOOST_CHECK_EQUAL(expected_result, result);
715}

References Nektar::eFULL.

◆ BOOST_AUTO_TEST_CASE() [5/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestBlockMatrixTranspose  )

Definition at line 92 of file TestBlockMatrix.cpp.

93{
94 typedef NekMatrix<double> InnerType;
96
97 double m00_buf[] = {1, 2, 3, 4, 5, 6, 7, 8};
98 double m01_buf[] = {9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
99 double m02_buf[] = {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
100 double m10_buf[] = {31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42};
101 double m11_buf[] = {43, 44, 45, 46, 47, 48, 49, 50,
102 51, 52, 53, 54, 55, 56, 57};
103 double m12_buf[] = {58, 59, 60, 61, 62, 63, 64, 65, 66,
104 67, 68, 69, 70, 71, 72, 73, 74, 75};
105
106 std::shared_ptr<InnerType> m00(new InnerType(2, 4, m00_buf));
107 std::shared_ptr<InnerType> m01(new InnerType(2, 5, m01_buf));
108 std::shared_ptr<InnerType> m02(new InnerType(2, 6, m02_buf));
109 std::shared_ptr<InnerType> m10(new InnerType(3, 4, m10_buf));
110 std::shared_ptr<InnerType> m11(new InnerType(3, 5, m11_buf));
111 std::shared_ptr<InnerType> m12(new InnerType(3, 6, m12_buf));
112
113 unsigned int rowCounts[] = {2, 3};
114 unsigned int colCounts[] = {4, 5, 6};
115
116 BlockType b(2, 3, rowCounts, colCounts);
117 b.SetBlock(0, 0, m00);
118 b.SetBlock(0, 1, m01);
119 b.SetBlock(0, 2, m02);
120 b.SetBlock(1, 0, m10);
121 b.SetBlock(1, 1, m11);
122 b.SetBlock(1, 2, m12);
123
124 BOOST_CHECK_EQUAL(2, b.GetNumberOfBlockRows());
125 BOOST_CHECK_EQUAL(3, b.GetNumberOfBlockColumns());
126 BOOST_CHECK_EQUAL(2, b.GetNumberOfRowsInBlockRow(0));
127 BOOST_CHECK_EQUAL(3, b.GetNumberOfRowsInBlockRow(1));
128 BOOST_CHECK_EQUAL(4, b.GetNumberOfColumnsInBlockColumn(0));
129 BOOST_CHECK_EQUAL(5, b.GetNumberOfColumnsInBlockColumn(1));
130 BOOST_CHECK_EQUAL(6, b.GetNumberOfColumnsInBlockColumn(2));
131
132 BOOST_CHECK_EQUAL(0, b.CalculateBlockIndex(0, 0));
133 BOOST_CHECK_EQUAL(1, b.CalculateBlockIndex(1, 0));
134 BOOST_CHECK_EQUAL(2, b.CalculateBlockIndex(0, 1));
135 BOOST_CHECK_EQUAL(3, b.CalculateBlockIndex(1, 1));
136 BOOST_CHECK_EQUAL(4, b.CalculateBlockIndex(0, 2));
137 BOOST_CHECK_EQUAL(5, b.CalculateBlockIndex(1, 2));
138
139 BOOST_CHECK_EQUAL(m00->GetRawPtr(), b.GetBlock(0, 0)->GetRawPtr());
140 BOOST_CHECK_EQUAL(m01->GetRawPtr(), b.GetBlock(0, 1)->GetRawPtr());
141 BOOST_CHECK_EQUAL(m02->GetRawPtr(), b.GetBlock(0, 2)->GetRawPtr());
142 BOOST_CHECK_EQUAL(m10->GetRawPtr(), b.GetBlock(1, 0)->GetRawPtr());
143 BOOST_CHECK_EQUAL(m11->GetRawPtr(), b.GetBlock(1, 1)->GetRawPtr());
144 BOOST_CHECK_EQUAL(m12->GetRawPtr(), b.GetBlock(1, 2)->GetRawPtr());
145
146 BOOST_CHECK_EQUAL('N', b.GetBlock(0, 0)->GetTransposeFlag());
147 BOOST_CHECK_EQUAL('N', b.GetBlock(0, 1)->GetTransposeFlag());
148 BOOST_CHECK_EQUAL('N', b.GetBlock(0, 2)->GetTransposeFlag());
149 BOOST_CHECK_EQUAL('N', b.GetBlock(1, 0)->GetTransposeFlag());
150 BOOST_CHECK_EQUAL('N', b.GetBlock(1, 1)->GetTransposeFlag());
151 BOOST_CHECK_EQUAL('N', b.GetBlock(1, 2)->GetTransposeFlag());
152
153 double v_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
154 NekVector<double> v(15, v_buf);
155 NekVector<double> result = b * v;
156
157 BOOST_CHECK_EQUAL(5, result.GetRows());
158 BOOST_CHECK_EQUAL(2360, result[0]);
159 BOOST_CHECK_EQUAL(2480, result[1]);
160 BOOST_CHECK_EQUAL(7080, result[2]);
161 BOOST_CHECK_EQUAL(7200, result[3]);
162 BOOST_CHECK_EQUAL(7320, result[4]);
163
164 b.Transpose();
165
166 BOOST_CHECK_EQUAL(3, b.GetNumberOfBlockRows());
167 BOOST_CHECK_EQUAL(2, b.GetNumberOfBlockColumns());
168
169 BOOST_CHECK_EQUAL(2, b.GetNumberOfColumnsInBlockColumn(0));
170 BOOST_CHECK_EQUAL(3, b.GetNumberOfColumnsInBlockColumn(1));
171 BOOST_CHECK_EQUAL(4, b.GetNumberOfRowsInBlockRow(0));
172 BOOST_CHECK_EQUAL(5, b.GetNumberOfRowsInBlockRow(1));
173 BOOST_CHECK_EQUAL(6, b.GetNumberOfRowsInBlockRow(2));
174
175 BOOST_CHECK_EQUAL(0, b.CalculateBlockIndex(0, 0));
176 BOOST_CHECK_EQUAL(1, b.CalculateBlockIndex(0, 1));
177 BOOST_CHECK_EQUAL(2, b.CalculateBlockIndex(1, 0));
178 BOOST_CHECK_EQUAL(3, b.CalculateBlockIndex(1, 1));
179 BOOST_CHECK_EQUAL(4, b.CalculateBlockIndex(2, 0));
180 BOOST_CHECK_EQUAL(5, b.CalculateBlockIndex(2, 1));
181
182 BOOST_CHECK_EQUAL(m00->GetRawPtr(), b.GetBlock(0, 0)->GetRawPtr());
183 BOOST_CHECK_EQUAL(m01->GetRawPtr(), b.GetBlock(1, 0)->GetRawPtr());
184 BOOST_CHECK_EQUAL(m02->GetRawPtr(), b.GetBlock(2, 0)->GetRawPtr());
185 BOOST_CHECK_EQUAL(m10->GetRawPtr(), b.GetBlock(0, 1)->GetRawPtr());
186 BOOST_CHECK_EQUAL(m11->GetRawPtr(), b.GetBlock(1, 1)->GetRawPtr());
187 BOOST_CHECK_EQUAL(m12->GetRawPtr(), b.GetBlock(2, 1)->GetRawPtr());
188
189 BOOST_CHECK_EQUAL('T', b.GetBlock(0, 0)->GetTransposeFlag());
190 BOOST_CHECK_EQUAL('T', b.GetBlock(1, 0)->GetTransposeFlag());
191 BOOST_CHECK_EQUAL('T', b.GetBlock(2, 0)->GetTransposeFlag());
192 BOOST_CHECK_EQUAL('T', b.GetBlock(0, 1)->GetTransposeFlag());
193 BOOST_CHECK_EQUAL('T', b.GetBlock(1, 1)->GetTransposeFlag());
194 BOOST_CHECK_EQUAL('T', b.GetBlock(2, 1)->GetTransposeFlag());
195
196 double v_transpose_buf[] = {1, 2, 3, 4, 5};
197 NekVector<double> v_transpose(5, v_transpose_buf);
198 NekVector<double> result_transpose = b * v_transpose;
199
200 BOOST_CHECK_EQUAL(15, result_transpose.GetRows());
201 BOOST_CHECK_EQUAL(391, result_transpose[0]);
202 BOOST_CHECK_EQUAL(433, result_transpose[1]);
203 BOOST_CHECK_EQUAL(475, result_transpose[2]);
204 BOOST_CHECK_EQUAL(517, result_transpose[3]);
205 BOOST_CHECK_EQUAL(559, result_transpose[4]);
206 BOOST_CHECK_EQUAL(601, result_transpose[5]);
207 BOOST_CHECK_EQUAL(643, result_transpose[6]);
208 BOOST_CHECK_EQUAL(685, result_transpose[7]);
209 BOOST_CHECK_EQUAL(727, result_transpose[8]);
210 BOOST_CHECK_EQUAL(769, result_transpose[9]);
211 BOOST_CHECK_EQUAL(811, result_transpose[10]);
212 BOOST_CHECK_EQUAL(853, result_transpose[11]);
213 BOOST_CHECK_EQUAL(895, result_transpose[12]);
214 BOOST_CHECK_EQUAL(937, result_transpose[13]);
215 BOOST_CHECK_EQUAL(979, result_transpose[14]);
216
217 BlockType globalTranspose = Transpose(b);
218 NekVector<double> globalResult = globalTranspose * v;
219 BOOST_CHECK_EQUAL(5, globalResult.GetRows());
220 BOOST_CHECK_EQUAL(2360, globalResult[0]);
221 BOOST_CHECK_EQUAL(2480, globalResult[1]);
222 BOOST_CHECK_EQUAL(7080, globalResult[2]);
223 BOOST_CHECK_EQUAL(7200, globalResult[3]);
224 BOOST_CHECK_EQUAL(7320, globalResult[4]);
225 //
226}
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)

References Nektar::NekVector< DataType >::GetRows(), and Nektar::Transpose().

◆ BOOST_AUTO_TEST_CASE() [6/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestBlockScaledMatrix  )

Definition at line 228 of file TestBlockMatrix.cpp.

229{
230 typedef NekMatrix<NekMatrix<double>, ScaledMatrixTag> InnerType;
231 typedef NekMatrix<InnerType, BlockMatrixTag> BlockType;
232
233 double m00_buf[] = {1, 2, 3, 4, 5, 6, 7, 8};
234 double m01_buf[] = {9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
235 double m02_buf[] = {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
236 double m10_buf[] = {31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42};
237 double m11_buf[] = {43, 44, 45, 46, 47, 48, 49, 50,
238 51, 52, 53, 54, 55, 56, 57};
239 double m12_buf[] = {58, 59, 60, 61, 62, 63, 64, 65, 66,
240 67, 68, 69, 70, 71, 72, 73, 74, 75};
241
242 std::shared_ptr<NekMatrix<double>> m00(
243 new NekMatrix<double>(2, 4, m00_buf));
244 std::shared_ptr<NekMatrix<double>> m01(
245 new NekMatrix<double>(2, 5, m01_buf));
246 std::shared_ptr<NekMatrix<double>> m02(
247 new NekMatrix<double>(2, 6, m02_buf));
248 std::shared_ptr<NekMatrix<double>> m10(
249 new NekMatrix<double>(3, 4, m10_buf));
250 std::shared_ptr<NekMatrix<double>> m11(
251 new NekMatrix<double>(3, 5, m11_buf));
252 std::shared_ptr<NekMatrix<double>> m12(
253 new NekMatrix<double>(3, 6, m12_buf));
254
255 std::shared_ptr<InnerType> sm00(new InnerType(2.0, m00));
256 std::shared_ptr<InnerType> sm01(new InnerType(2.0, m01));
257 std::shared_ptr<InnerType> sm02(new InnerType(2.0, m02));
258 std::shared_ptr<InnerType> sm10(new InnerType(2.0, m10));
259 std::shared_ptr<InnerType> sm11(new InnerType(2.0, m11));
260 std::shared_ptr<InnerType> sm12(new InnerType(2.0, m12));
261
262 unsigned int rowCounts[] = {2, 3};
263 unsigned int colCounts[] = {4, 5, 6};
264
265 BlockType b(2, 3, rowCounts, colCounts);
266 b.SetBlock(0, 0, sm00);
267 b.SetBlock(0, 1, sm01);
268 b.SetBlock(0, 2, sm02);
269 b.SetBlock(1, 0, sm10);
270 b.SetBlock(1, 1, sm11);
271 b.SetBlock(1, 2, sm12);
272
273 BOOST_CHECK_EQUAL(2, b.GetNumberOfBlockRows());
274 BOOST_CHECK_EQUAL(3, b.GetNumberOfBlockColumns());
275 BOOST_CHECK_EQUAL(2, b.GetNumberOfRowsInBlockRow(0));
276 BOOST_CHECK_EQUAL(3, b.GetNumberOfRowsInBlockRow(1));
277 BOOST_CHECK_EQUAL(4, b.GetNumberOfColumnsInBlockColumn(0));
278 BOOST_CHECK_EQUAL(5, b.GetNumberOfColumnsInBlockColumn(1));
279 BOOST_CHECK_EQUAL(6, b.GetNumberOfColumnsInBlockColumn(2));
280
281 BOOST_CHECK_EQUAL(0, b.CalculateBlockIndex(0, 0));
282 BOOST_CHECK_EQUAL(1, b.CalculateBlockIndex(1, 0));
283 BOOST_CHECK_EQUAL(2, b.CalculateBlockIndex(0, 1));
284 BOOST_CHECK_EQUAL(3, b.CalculateBlockIndex(1, 1));
285 BOOST_CHECK_EQUAL(4, b.CalculateBlockIndex(0, 2));
286 BOOST_CHECK_EQUAL(5, b.CalculateBlockIndex(1, 2));
287
288 BOOST_CHECK_EQUAL(m00->GetRawPtr(), b.GetBlock(0, 0)->GetRawPtr());
289 BOOST_CHECK_EQUAL(m01->GetRawPtr(), b.GetBlock(0, 1)->GetRawPtr());
290 BOOST_CHECK_EQUAL(m02->GetRawPtr(), b.GetBlock(0, 2)->GetRawPtr());
291 BOOST_CHECK_EQUAL(m10->GetRawPtr(), b.GetBlock(1, 0)->GetRawPtr());
292 BOOST_CHECK_EQUAL(m11->GetRawPtr(), b.GetBlock(1, 1)->GetRawPtr());
293 BOOST_CHECK_EQUAL(m12->GetRawPtr(), b.GetBlock(1, 2)->GetRawPtr());
294
295 BOOST_CHECK_EQUAL('N', b.GetBlock(0, 0)->GetTransposeFlag());
296 BOOST_CHECK_EQUAL('N', b.GetBlock(0, 1)->GetTransposeFlag());
297 BOOST_CHECK_EQUAL('N', b.GetBlock(0, 2)->GetTransposeFlag());
298 BOOST_CHECK_EQUAL('N', b.GetBlock(1, 0)->GetTransposeFlag());
299 BOOST_CHECK_EQUAL('N', b.GetBlock(1, 1)->GetTransposeFlag());
300 BOOST_CHECK_EQUAL('N', b.GetBlock(1, 2)->GetTransposeFlag());
301
302 double v_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
303 NekVector<double> v(15, v_buf);
304 NekVector<double> result = b * v;
305
306 BOOST_CHECK_EQUAL(5, result.GetRows());
307 BOOST_CHECK_EQUAL(2360 * 2, result[0]);
308 BOOST_CHECK_EQUAL(2480 * 2, result[1]);
309 BOOST_CHECK_EQUAL(7080 * 2, result[2]);
310 BOOST_CHECK_EQUAL(7200 * 2, result[3]);
311 BOOST_CHECK_EQUAL(7320 * 2, result[4]);
312
313 b.Transpose();
314
315 BOOST_CHECK_EQUAL(3, b.GetNumberOfBlockRows());
316 BOOST_CHECK_EQUAL(2, b.GetNumberOfBlockColumns());
317
318 BOOST_CHECK_EQUAL(2, b.GetNumberOfColumnsInBlockColumn(0));
319 BOOST_CHECK_EQUAL(3, b.GetNumberOfColumnsInBlockColumn(1));
320 BOOST_CHECK_EQUAL(4, b.GetNumberOfRowsInBlockRow(0));
321 BOOST_CHECK_EQUAL(5, b.GetNumberOfRowsInBlockRow(1));
322 BOOST_CHECK_EQUAL(6, b.GetNumberOfRowsInBlockRow(2));
323
324 BOOST_CHECK_EQUAL(0, b.CalculateBlockIndex(0, 0));
325 BOOST_CHECK_EQUAL(1, b.CalculateBlockIndex(0, 1));
326 BOOST_CHECK_EQUAL(2, b.CalculateBlockIndex(1, 0));
327 BOOST_CHECK_EQUAL(3, b.CalculateBlockIndex(1, 1));
328 BOOST_CHECK_EQUAL(4, b.CalculateBlockIndex(2, 0));
329 BOOST_CHECK_EQUAL(5, b.CalculateBlockIndex(2, 1));
330
331 BOOST_CHECK_EQUAL(m00->GetRawPtr(), b.GetBlock(0, 0)->GetRawPtr());
332 BOOST_CHECK_EQUAL(m01->GetRawPtr(), b.GetBlock(1, 0)->GetRawPtr());
333 BOOST_CHECK_EQUAL(m02->GetRawPtr(), b.GetBlock(2, 0)->GetRawPtr());
334 BOOST_CHECK_EQUAL(m10->GetRawPtr(), b.GetBlock(0, 1)->GetRawPtr());
335 BOOST_CHECK_EQUAL(m11->GetRawPtr(), b.GetBlock(1, 1)->GetRawPtr());
336 BOOST_CHECK_EQUAL(m12->GetRawPtr(), b.GetBlock(2, 1)->GetRawPtr());
337
338 BOOST_CHECK_EQUAL('T', b.GetBlock(0, 0)->GetTransposeFlag());
339 BOOST_CHECK_EQUAL('T', b.GetBlock(1, 0)->GetTransposeFlag());
340 BOOST_CHECK_EQUAL('T', b.GetBlock(2, 0)->GetTransposeFlag());
341 BOOST_CHECK_EQUAL('T', b.GetBlock(0, 1)->GetTransposeFlag());
342 BOOST_CHECK_EQUAL('T', b.GetBlock(1, 1)->GetTransposeFlag());
343 BOOST_CHECK_EQUAL('T', b.GetBlock(2, 1)->GetTransposeFlag());
344
345 double v_transpose_buf[] = {1, 2, 3, 4, 5};
346 NekVector<double> v_transpose(5, v_transpose_buf);
347 NekVector<double> result_transpose = b * v_transpose;
348
349 BOOST_CHECK_EQUAL(15, result_transpose.GetRows());
350 BOOST_CHECK_EQUAL(391 * 2, result_transpose[0]);
351 BOOST_CHECK_EQUAL(433 * 2, result_transpose[1]);
352 BOOST_CHECK_EQUAL(475 * 2, result_transpose[2]);
353 BOOST_CHECK_EQUAL(517 * 2, result_transpose[3]);
354 BOOST_CHECK_EQUAL(559 * 2, result_transpose[4]);
355 BOOST_CHECK_EQUAL(601 * 2, result_transpose[5]);
356 BOOST_CHECK_EQUAL(643 * 2, result_transpose[6]);
357 BOOST_CHECK_EQUAL(685 * 2, result_transpose[7]);
358 BOOST_CHECK_EQUAL(727 * 2, result_transpose[8]);
359 BOOST_CHECK_EQUAL(769 * 2, result_transpose[9]);
360 BOOST_CHECK_EQUAL(811 * 2, result_transpose[10]);
361 BOOST_CHECK_EQUAL(853 * 2, result_transpose[11]);
362 BOOST_CHECK_EQUAL(895 * 2, result_transpose[12]);
363 BOOST_CHECK_EQUAL(937 * 2, result_transpose[13]);
364 BOOST_CHECK_EQUAL(979 * 2, result_transpose[14]);
365}

References Nektar::NekVector< DataType >::GetRows().

◆ BOOST_AUTO_TEST_CASE() [7/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestDiagonalBlockMatrixMultiplication  )

Definition at line 629 of file TestBlockMatrix.cpp.

630{
631 typedef NekMatrix<double> InnerType;
632 typedef NekMatrix<InnerType, BlockMatrixTag> BlockType;
633
634 double m_00_buf[] = {1, 3, 2, 4};
635 double m_11_buf[] = {1, 4, 2, 5, 3, 6};
636 double m_22_buf[] = {1, 3, 5, 2, 4, 6};
637
638 std::shared_ptr<InnerType> m00(new InnerType(2, 2, m_00_buf));
639 std::shared_ptr<InnerType> m11(new InnerType(2, 3, m_11_buf));
640 std::shared_ptr<InnerType> m22(new InnerType(3, 2, m_22_buf));
641
642 unsigned int rowCounts[] = {2, 2, 3};
643 unsigned int colCounts[] = {2, 3, 2};
644
645 BlockType b(3, 3, rowCounts, colCounts, eDIAGONAL);
646 b.SetBlock(0, 0, m00);
647 b.SetBlock(1, 1, m11);
648 b.SetBlock(2, 2, m22);
649
650 double rhs_buf[] = {1, 2, 3, 4, 5, 6, 7};
651 NekVector<double> rhs(7, rhs_buf);
652
653 NekVector<double> result = b * rhs;
654
655 double expected_buf[] = {5, 11, 26, 62, 20, 46, 72};
656 NekVector<double> expected_result(7, expected_buf);
657
658 BOOST_CHECK_EQUAL(expected_result, result);
659}

References Nektar::eDIAGONAL.

◆ BOOST_AUTO_TEST_CASE() [8/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestDiagonalBlockMatrixMultiplicationWith0SizeBlocks  )

Definition at line 661 of file TestBlockMatrix.cpp.

662{
663 typedef NekMatrix<double> InnerType;
664 typedef NekMatrix<InnerType, BlockMatrixTag> BlockType;
665
666 double m_22_buf[] = {1, 2, 3, 4, 5, 6, 7, 8};
667
668 std::shared_ptr<InnerType> m22(new InnerType(1, 8, m_22_buf));
669
670 unsigned int rowCounts[] = {0, 0, 1};
671 unsigned int colCounts[] = {6, 6, 8};
672
673 BlockType b(3, 3, rowCounts, colCounts, eDIAGONAL);
674 b.SetBlock(2, 2, m22);
675
676 double rhs_buf[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
677 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
678 NekVector<double> rhs(20, rhs_buf);
679
680 NekVector<double> result = b * rhs;
681
682 double expected_buf[] = {1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 5 * 5 + 6 * 6 +
683 7 * 7 + 8 * 8};
684 NekVector<double> expected_result(1, expected_buf);
685
686 BOOST_CHECK_EQUAL(expected_result, result);
687}

References Nektar::eDIAGONAL.

◆ BOOST_AUTO_TEST_CASE() [9/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestElementAccessBlockMatrix  )

Definition at line 64 of file BlockMatrixUnitTests.cpp.

65{
66 {
67 typedef NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag> BlockMatrixType;
68 BlockMatrixType m1(3, 2, 2, 2);
69 std::shared_ptr<ConstMatrix<NekDouble>> m2(
70 new BlockMatrixType(3, 2, 2, 2));
71
72 double vals1[] = {1.0, 3.0, 2.0, 4.0};
73 double vals2[] = {5.0, 7.0, 6.0, 8.0};
74 double vals3[] = {9.0, 11.0, 10.0, 12.0};
75 double vals4[] = {13.0, 15.0, 14.0, 16.0};
76 double vals5[] = {17.0, 19.0, 18.0, 20.0};
77 double vals6[] = {21.0, 23.0, 22.0, 24.0};
78
79 std::shared_ptr<NekMatrix<NekDouble>> sub1(
80 new NekMatrix<NekDouble>(2, 2, vals1));
81 std::shared_ptr<NekMatrix<NekDouble>> sub2(
82 new NekMatrix<NekDouble>(2, 2, vals2));
83 std::shared_ptr<NekMatrix<NekDouble>> sub3(
84 new NekMatrix<NekDouble>(2, 2, vals3));
85 std::shared_ptr<NekMatrix<NekDouble>> sub4(
86 new NekMatrix<NekDouble>(2, 2, vals4));
87 std::shared_ptr<NekMatrix<NekDouble>> sub5(
88 new NekMatrix<NekDouble>(2, 2, vals5));
89 std::shared_ptr<NekMatrix<NekDouble>> sub6(
90 new NekMatrix<NekDouble>(2, 2, vals6));
91
92 m1.SetBlock(0, 0, sub1);
93 m1.SetBlock(0, 1, sub2);
94 m1.SetBlock(1, 0, sub3);
95 m1.SetBlock(1, 1, sub4);
96 m1.SetBlock(2, 0, sub5);
97 m1.SetBlock(2, 1, sub6);
98
99 std::shared_ptr<BlockMatrixType> m2_cast =
100 std::dynamic_pointer_cast<BlockMatrixType>(m2);
101
102 m2_cast->SetBlock(0, 0, sub1);
103 m2_cast->SetBlock(0, 1, sub2);
104 m2_cast->SetBlock(1, 0, sub3);
105 m2_cast->SetBlock(1, 1, sub4);
106 m2_cast->SetBlock(2, 0, sub5);
107 m2_cast->SetBlock(2, 1, sub6);
108
109 BOOST_CHECK_EQUAL(m1(0, 0), 1.0);
110 BOOST_CHECK_EQUAL(m1(0, 1), 2.0);
111 BOOST_CHECK_EQUAL(m1(0, 2), 5.0);
112 BOOST_CHECK_EQUAL(m1(0, 3), 6.0);
113 BOOST_CHECK_EQUAL(m1(1, 0), 3.0);
114 BOOST_CHECK_EQUAL(m1(1, 1), 4.0);
115 BOOST_CHECK_EQUAL(m1(1, 2), 7.0);
116 BOOST_CHECK_EQUAL(m1(1, 3), 8.0);
117 BOOST_CHECK_EQUAL(m1(2, 0), 9.0);
118 BOOST_CHECK_EQUAL(m1(2, 1), 10.0);
119 BOOST_CHECK_EQUAL(m1(2, 2), 13.0);
120 BOOST_CHECK_EQUAL(m1(2, 3), 14.0);
121 BOOST_CHECK_EQUAL(m1(3, 0), 11.0);
122 BOOST_CHECK_EQUAL(m1(3, 1), 12.0);
123 BOOST_CHECK_EQUAL(m1(3, 2), 15.0);
124 BOOST_CHECK_EQUAL(m1(3, 3), 16.0);
125 BOOST_CHECK_EQUAL(m1(4, 0), 17.0);
126 BOOST_CHECK_EQUAL(m1(4, 1), 18.0);
127 BOOST_CHECK_EQUAL(m1(4, 2), 21.0);
128 BOOST_CHECK_EQUAL(m1(4, 3), 22.0);
129 BOOST_CHECK_EQUAL(m1(5, 0), 19.0);
130 BOOST_CHECK_EQUAL(m1(5, 1), 20.0);
131 BOOST_CHECK_EQUAL(m1(5, 2), 23.0);
132 BOOST_CHECK_EQUAL(m1(5, 3), 24.0);
133
134 BOOST_CHECK_EQUAL((*m2)(0, 0), 1.0);
135 BOOST_CHECK_EQUAL((*m2)(0, 1), 2.0);
136 BOOST_CHECK_EQUAL((*m2)(0, 2), 5.0);
137 BOOST_CHECK_EQUAL((*m2)(0, 3), 6.0);
138 BOOST_CHECK_EQUAL((*m2)(1, 0), 3.0);
139 BOOST_CHECK_EQUAL((*m2)(1, 1), 4.0);
140 BOOST_CHECK_EQUAL((*m2)(1, 2), 7.0);
141 BOOST_CHECK_EQUAL((*m2)(1, 3), 8.0);
142 BOOST_CHECK_EQUAL((*m2)(2, 0), 9.0);
143 BOOST_CHECK_EQUAL((*m2)(2, 1), 10.0);
144 BOOST_CHECK_EQUAL((*m2)(2, 2), 13.0);
145 BOOST_CHECK_EQUAL((*m2)(2, 3), 14.0);
146 BOOST_CHECK_EQUAL((*m2)(3, 0), 11.0);
147 BOOST_CHECK_EQUAL((*m2)(3, 1), 12.0);
148 BOOST_CHECK_EQUAL((*m2)(3, 2), 15.0);
149 BOOST_CHECK_EQUAL((*m2)(3, 3), 16.0);
150 BOOST_CHECK_EQUAL((*m2)(4, 0), 17.0);
151 BOOST_CHECK_EQUAL((*m2)(4, 1), 18.0);
152 BOOST_CHECK_EQUAL((*m2)(4, 2), 21.0);
153 BOOST_CHECK_EQUAL((*m2)(4, 3), 22.0);
154 BOOST_CHECK_EQUAL((*m2)(5, 0), 19.0);
155 BOOST_CHECK_EQUAL((*m2)(5, 1), 20.0);
156 BOOST_CHECK_EQUAL((*m2)(5, 2), 23.0);
157 BOOST_CHECK_EQUAL((*m2)(5, 3), 24.0);
158 }
159
160 {
161 typedef NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag> BlockMatrixType;
162 unsigned int rowSizes[] = {2, 2, 2};
163 unsigned int columnSizes[] = {2, 2};
164 BlockMatrixType m1(3, 2, rowSizes, columnSizes);
165 std::shared_ptr<ConstMatrix<NekDouble>> m2(
166 new BlockMatrixType(3, 2, rowSizes, columnSizes));
167
168 double vals1[] = {1.0, 3.0, 2.0, 4.0};
169 double vals2[] = {5.0, 7.0, 6.0, 8.0};
170 double vals3[] = {9.0, 11.0, 10.0, 12.0};
171 double vals4[] = {13.0, 15.0, 14.0, 16.0};
172 double vals5[] = {17.0, 19.0, 18.0, 20.0};
173 double vals6[] = {21.0, 23.0, 22.0, 24.0};
174
175 std::shared_ptr<NekMatrix<NekDouble>> sub1(
176 new NekMatrix<NekDouble>(2, 2, vals1));
177 std::shared_ptr<NekMatrix<NekDouble>> sub2(
178 new NekMatrix<NekDouble>(2, 2, vals2));
179 std::shared_ptr<NekMatrix<NekDouble>> sub3(
180 new NekMatrix<NekDouble>(2, 2, vals3));
181 std::shared_ptr<NekMatrix<NekDouble>> sub4(
182 new NekMatrix<NekDouble>(2, 2, vals4));
183 std::shared_ptr<NekMatrix<NekDouble>> sub5(
184 new NekMatrix<NekDouble>(2, 2, vals5));
185 std::shared_ptr<NekMatrix<NekDouble>> sub6(
186 new NekMatrix<NekDouble>(2, 2, vals6));
187
188 m1.SetBlock(0, 0, sub1);
189 m1.SetBlock(0, 1, sub2);
190 m1.SetBlock(1, 0, sub3);
191 m1.SetBlock(1, 1, sub4);
192 m1.SetBlock(2, 0, sub5);
193 m1.SetBlock(2, 1, sub6);
194
195 std::shared_ptr<BlockMatrixType> m2_cast =
196 std::dynamic_pointer_cast<BlockMatrixType>(m2);
197
198 m2_cast->SetBlock(0, 0, sub1);
199 m2_cast->SetBlock(0, 1, sub2);
200 m2_cast->SetBlock(1, 0, sub3);
201 m2_cast->SetBlock(1, 1, sub4);
202 m2_cast->SetBlock(2, 0, sub5);
203 m2_cast->SetBlock(2, 1, sub6);
204
205 BOOST_CHECK_EQUAL(m1(0, 0), 1.0);
206 BOOST_CHECK_EQUAL(m1(0, 1), 2.0);
207 BOOST_CHECK_EQUAL(m1(0, 2), 5.0);
208 BOOST_CHECK_EQUAL(m1(0, 3), 6.0);
209 BOOST_CHECK_EQUAL(m1(1, 0), 3.0);
210 BOOST_CHECK_EQUAL(m1(1, 1), 4.0);
211 BOOST_CHECK_EQUAL(m1(1, 2), 7.0);
212 BOOST_CHECK_EQUAL(m1(1, 3), 8.0);
213 BOOST_CHECK_EQUAL(m1(2, 0), 9.0);
214 BOOST_CHECK_EQUAL(m1(2, 1), 10.0);
215 BOOST_CHECK_EQUAL(m1(2, 2), 13.0);
216 BOOST_CHECK_EQUAL(m1(2, 3), 14.0);
217 BOOST_CHECK_EQUAL(m1(3, 0), 11.0);
218 BOOST_CHECK_EQUAL(m1(3, 1), 12.0);
219 BOOST_CHECK_EQUAL(m1(3, 2), 15.0);
220 BOOST_CHECK_EQUAL(m1(3, 3), 16.0);
221 BOOST_CHECK_EQUAL(m1(4, 0), 17.0);
222 BOOST_CHECK_EQUAL(m1(4, 1), 18.0);
223 BOOST_CHECK_EQUAL(m1(4, 2), 21.0);
224 BOOST_CHECK_EQUAL(m1(4, 3), 22.0);
225 BOOST_CHECK_EQUAL(m1(5, 0), 19.0);
226 BOOST_CHECK_EQUAL(m1(5, 1), 20.0);
227 BOOST_CHECK_EQUAL(m1(5, 2), 23.0);
228 BOOST_CHECK_EQUAL(m1(5, 3), 24.0);
229
230 BOOST_CHECK_EQUAL((*m2)(0, 0), 1.0);
231 BOOST_CHECK_EQUAL((*m2)(0, 1), 2.0);
232 BOOST_CHECK_EQUAL((*m2)(0, 2), 5.0);
233 BOOST_CHECK_EQUAL((*m2)(0, 3), 6.0);
234 BOOST_CHECK_EQUAL((*m2)(1, 0), 3.0);
235 BOOST_CHECK_EQUAL((*m2)(1, 1), 4.0);
236 BOOST_CHECK_EQUAL((*m2)(1, 2), 7.0);
237 BOOST_CHECK_EQUAL((*m2)(1, 3), 8.0);
238 BOOST_CHECK_EQUAL((*m2)(2, 0), 9.0);
239 BOOST_CHECK_EQUAL((*m2)(2, 1), 10.0);
240 BOOST_CHECK_EQUAL((*m2)(2, 2), 13.0);
241 BOOST_CHECK_EQUAL((*m2)(2, 3), 14.0);
242 BOOST_CHECK_EQUAL((*m2)(3, 0), 11.0);
243 BOOST_CHECK_EQUAL((*m2)(3, 1), 12.0);
244 BOOST_CHECK_EQUAL((*m2)(3, 2), 15.0);
245 BOOST_CHECK_EQUAL((*m2)(3, 3), 16.0);
246 BOOST_CHECK_EQUAL((*m2)(4, 0), 17.0);
247 BOOST_CHECK_EQUAL((*m2)(4, 1), 18.0);
248 BOOST_CHECK_EQUAL((*m2)(4, 2), 21.0);
249 BOOST_CHECK_EQUAL((*m2)(4, 3), 22.0);
250 BOOST_CHECK_EQUAL((*m2)(5, 0), 19.0);
251 BOOST_CHECK_EQUAL((*m2)(5, 1), 20.0);
252 BOOST_CHECK_EQUAL((*m2)(5, 2), 23.0);
253 BOOST_CHECK_EQUAL((*m2)(5, 3), 24.0);
254 }
255
256 {
257 typedef NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag> BlockMatrixType;
258 unsigned int rowSizesBuf[] = {2, 2, 2};
259 unsigned int columnSizesBuf[] = {2, 2};
260 Array<OneD, unsigned int> rowSizes(3, rowSizesBuf);
261 Array<OneD, unsigned int> columnSizes(2, columnSizesBuf);
262
263 BlockMatrixType m1(3, 2, rowSizes, columnSizes);
264 std::shared_ptr<ConstMatrix<NekDouble>> m2(
265 new BlockMatrixType(3, 2, rowSizes, columnSizes));
266
267 double vals1[] = {1.0, 3.0, 2.0, 4.0};
268 double vals2[] = {5.0, 7.0, 6.0, 8.0};
269 double vals3[] = {9.0, 11.0, 10.0, 12.0};
270 double vals4[] = {13.0, 15.0, 14.0, 16.0};
271 double vals5[] = {17.0, 19.0, 18.0, 20.0};
272 double vals6[] = {21.0, 23.0, 22.0, 24.0};
273
274 std::shared_ptr<NekMatrix<NekDouble>> sub1(
275 new NekMatrix<NekDouble>(2, 2, vals1));
276 std::shared_ptr<NekMatrix<NekDouble>> sub2(
277 new NekMatrix<NekDouble>(2, 2, vals2));
278 std::shared_ptr<NekMatrix<NekDouble>> sub3(
279 new NekMatrix<NekDouble>(2, 2, vals3));
280 std::shared_ptr<NekMatrix<NekDouble>> sub4(
281 new NekMatrix<NekDouble>(2, 2, vals4));
282 std::shared_ptr<NekMatrix<NekDouble>> sub5(
283 new NekMatrix<NekDouble>(2, 2, vals5));
284 std::shared_ptr<NekMatrix<NekDouble>> sub6(
285 new NekMatrix<NekDouble>(2, 2, vals6));
286
287 m1.SetBlock(0, 0, sub1);
288 m1.SetBlock(0, 1, sub2);
289 m1.SetBlock(1, 0, sub3);
290 m1.SetBlock(1, 1, sub4);
291 m1.SetBlock(2, 0, sub5);
292 m1.SetBlock(2, 1, sub6);
293
294 std::shared_ptr<BlockMatrixType> m2_cast =
295 std::dynamic_pointer_cast<BlockMatrixType>(m2);
296
297 m2_cast->SetBlock(0, 0, sub1);
298 m2_cast->SetBlock(0, 1, sub2);
299 m2_cast->SetBlock(1, 0, sub3);
300 m2_cast->SetBlock(1, 1, sub4);
301 m2_cast->SetBlock(2, 0, sub5);
302 m2_cast->SetBlock(2, 1, sub6);
303
304 BOOST_CHECK_EQUAL(m1(0, 0), 1.0);
305 BOOST_CHECK_EQUAL(m1(0, 1), 2.0);
306 BOOST_CHECK_EQUAL(m1(0, 2), 5.0);
307 BOOST_CHECK_EQUAL(m1(0, 3), 6.0);
308 BOOST_CHECK_EQUAL(m1(1, 0), 3.0);
309 BOOST_CHECK_EQUAL(m1(1, 1), 4.0);
310 BOOST_CHECK_EQUAL(m1(1, 2), 7.0);
311 BOOST_CHECK_EQUAL(m1(1, 3), 8.0);
312 BOOST_CHECK_EQUAL(m1(2, 0), 9.0);
313 BOOST_CHECK_EQUAL(m1(2, 1), 10.0);
314 BOOST_CHECK_EQUAL(m1(2, 2), 13.0);
315 BOOST_CHECK_EQUAL(m1(2, 3), 14.0);
316 BOOST_CHECK_EQUAL(m1(3, 0), 11.0);
317 BOOST_CHECK_EQUAL(m1(3, 1), 12.0);
318 BOOST_CHECK_EQUAL(m1(3, 2), 15.0);
319 BOOST_CHECK_EQUAL(m1(3, 3), 16.0);
320 BOOST_CHECK_EQUAL(m1(4, 0), 17.0);
321 BOOST_CHECK_EQUAL(m1(4, 1), 18.0);
322 BOOST_CHECK_EQUAL(m1(4, 2), 21.0);
323 BOOST_CHECK_EQUAL(m1(4, 3), 22.0);
324 BOOST_CHECK_EQUAL(m1(5, 0), 19.0);
325 BOOST_CHECK_EQUAL(m1(5, 1), 20.0);
326 BOOST_CHECK_EQUAL(m1(5, 2), 23.0);
327 BOOST_CHECK_EQUAL(m1(5, 3), 24.0);
328
329 BOOST_CHECK_EQUAL((*m2)(0, 0), 1.0);
330 BOOST_CHECK_EQUAL((*m2)(0, 1), 2.0);
331 BOOST_CHECK_EQUAL((*m2)(0, 2), 5.0);
332 BOOST_CHECK_EQUAL((*m2)(0, 3), 6.0);
333 BOOST_CHECK_EQUAL((*m2)(1, 0), 3.0);
334 BOOST_CHECK_EQUAL((*m2)(1, 1), 4.0);
335 BOOST_CHECK_EQUAL((*m2)(1, 2), 7.0);
336 BOOST_CHECK_EQUAL((*m2)(1, 3), 8.0);
337 BOOST_CHECK_EQUAL((*m2)(2, 0), 9.0);
338 BOOST_CHECK_EQUAL((*m2)(2, 1), 10.0);
339 BOOST_CHECK_EQUAL((*m2)(2, 2), 13.0);
340 BOOST_CHECK_EQUAL((*m2)(2, 3), 14.0);
341 BOOST_CHECK_EQUAL((*m2)(3, 0), 11.0);
342 BOOST_CHECK_EQUAL((*m2)(3, 1), 12.0);
343 BOOST_CHECK_EQUAL((*m2)(3, 2), 15.0);
344 BOOST_CHECK_EQUAL((*m2)(3, 3), 16.0);
345 BOOST_CHECK_EQUAL((*m2)(4, 0), 17.0);
346 BOOST_CHECK_EQUAL((*m2)(4, 1), 18.0);
347 BOOST_CHECK_EQUAL((*m2)(4, 2), 21.0);
348 BOOST_CHECK_EQUAL((*m2)(4, 3), 22.0);
349 BOOST_CHECK_EQUAL((*m2)(5, 0), 19.0);
350 BOOST_CHECK_EQUAL((*m2)(5, 1), 20.0);
351 BOOST_CHECK_EQUAL((*m2)(5, 2), 23.0);
352 BOOST_CHECK_EQUAL((*m2)(5, 3), 24.0);
353 }
354}

◆ BOOST_AUTO_TEST_CASE() [10/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestEmptyRowElementAccess  )

Definition at line 356 of file BlockMatrixUnitTests.cpp.

357{
358 typedef NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag> BlockMatrixType;
359 unsigned int rowSizes[] = {2, 0, 2, 0, 0, 2};
360 unsigned int columnSizes[] = {2, 2};
361 BlockMatrixType m1(6, 2, rowSizes, columnSizes);
362 std::shared_ptr<ConstMatrix<NekDouble>> m2(
363 new BlockMatrixType(6, 2, rowSizes, columnSizes));
364
365 double vals1[] = {1.0, 3.0, 2.0, 4.0};
366 double vals2[] = {5.0, 7.0, 6.0, 8.0};
367 double vals3[] = {9.0, 11.0, 10.0, 12.0};
368 double vals4[] = {13.0, 15.0, 14.0, 16.0};
369 double vals5[] = {17.0, 19.0, 18.0, 20.0};
370 double vals6[] = {21.0, 23.0, 22.0, 24.0};
371
372 std::shared_ptr<NekMatrix<NekDouble>> sub1(
373 new NekMatrix<NekDouble>(2, 2, vals1));
374 std::shared_ptr<NekMatrix<NekDouble>> sub2(
375 new NekMatrix<NekDouble>(2, 2, vals2));
376 std::shared_ptr<NekMatrix<NekDouble>> sub3(
377 new NekMatrix<NekDouble>(2, 2, vals3));
378 std::shared_ptr<NekMatrix<NekDouble>> sub4(
379 new NekMatrix<NekDouble>(2, 2, vals4));
380 std::shared_ptr<NekMatrix<NekDouble>> sub5(
381 new NekMatrix<NekDouble>(2, 2, vals5));
382 std::shared_ptr<NekMatrix<NekDouble>> sub6(
383 new NekMatrix<NekDouble>(2, 2, vals6));
384
385 m1.SetBlock(0, 0, sub1);
386 m1.SetBlock(0, 1, sub2);
387 m1.SetBlock(2, 0, sub3);
388 m1.SetBlock(2, 1, sub4);
389 m1.SetBlock(5, 0, sub5);
390 m1.SetBlock(5, 1, sub6);
391
392 std::shared_ptr<BlockMatrixType> m2_cast =
393 std::dynamic_pointer_cast<BlockMatrixType>(m2);
394
395 m2_cast->SetBlock(0, 0, sub1);
396 m2_cast->SetBlock(0, 1, sub2);
397 m2_cast->SetBlock(2, 0, sub3);
398 m2_cast->SetBlock(2, 1, sub4);
399 m2_cast->SetBlock(5, 0, sub5);
400 m2_cast->SetBlock(5, 1, sub6);
401
402 BOOST_CHECK_EQUAL(m1(0, 0), 1.0);
403 BOOST_CHECK_EQUAL(m1(0, 1), 2.0);
404 BOOST_CHECK_EQUAL(m1(0, 2), 5.0);
405 BOOST_CHECK_EQUAL(m1(0, 3), 6.0);
406 BOOST_CHECK_EQUAL(m1(1, 0), 3.0);
407 BOOST_CHECK_EQUAL(m1(1, 1), 4.0);
408 BOOST_CHECK_EQUAL(m1(1, 2), 7.0);
409 BOOST_CHECK_EQUAL(m1(1, 3), 8.0);
410 BOOST_CHECK_EQUAL(m1(2, 0), 9.0);
411 BOOST_CHECK_EQUAL(m1(2, 1), 10.0);
412 BOOST_CHECK_EQUAL(m1(2, 2), 13.0);
413 BOOST_CHECK_EQUAL(m1(2, 3), 14.0);
414 BOOST_CHECK_EQUAL(m1(3, 0), 11.0);
415 BOOST_CHECK_EQUAL(m1(3, 1), 12.0);
416 BOOST_CHECK_EQUAL(m1(3, 2), 15.0);
417 BOOST_CHECK_EQUAL(m1(3, 3), 16.0);
418 BOOST_CHECK_EQUAL(m1(4, 0), 17.0);
419 BOOST_CHECK_EQUAL(m1(4, 1), 18.0);
420 BOOST_CHECK_EQUAL(m1(4, 2), 21.0);
421 BOOST_CHECK_EQUAL(m1(4, 3), 22.0);
422 BOOST_CHECK_EQUAL(m1(5, 0), 19.0);
423 BOOST_CHECK_EQUAL(m1(5, 1), 20.0);
424 BOOST_CHECK_EQUAL(m1(5, 2), 23.0);
425 BOOST_CHECK_EQUAL(m1(5, 3), 24.0);
426
427 BOOST_CHECK_EQUAL((*m2)(0, 0), 1.0);
428 BOOST_CHECK_EQUAL((*m2)(0, 1), 2.0);
429 BOOST_CHECK_EQUAL((*m2)(0, 2), 5.0);
430 BOOST_CHECK_EQUAL((*m2)(0, 3), 6.0);
431 BOOST_CHECK_EQUAL((*m2)(1, 0), 3.0);
432 BOOST_CHECK_EQUAL((*m2)(1, 1), 4.0);
433 BOOST_CHECK_EQUAL((*m2)(1, 2), 7.0);
434 BOOST_CHECK_EQUAL((*m2)(1, 3), 8.0);
435 BOOST_CHECK_EQUAL((*m2)(2, 0), 9.0);
436 BOOST_CHECK_EQUAL((*m2)(2, 1), 10.0);
437 BOOST_CHECK_EQUAL((*m2)(2, 2), 13.0);
438 BOOST_CHECK_EQUAL((*m2)(2, 3), 14.0);
439 BOOST_CHECK_EQUAL((*m2)(3, 0), 11.0);
440 BOOST_CHECK_EQUAL((*m2)(3, 1), 12.0);
441 BOOST_CHECK_EQUAL((*m2)(3, 2), 15.0);
442 BOOST_CHECK_EQUAL((*m2)(3, 3), 16.0);
443 BOOST_CHECK_EQUAL((*m2)(4, 0), 17.0);
444 BOOST_CHECK_EQUAL((*m2)(4, 1), 18.0);
445 BOOST_CHECK_EQUAL((*m2)(4, 2), 21.0);
446 BOOST_CHECK_EQUAL((*m2)(4, 3), 22.0);
447 BOOST_CHECK_EQUAL((*m2)(5, 0), 19.0);
448 BOOST_CHECK_EQUAL((*m2)(5, 1), 20.0);
449 BOOST_CHECK_EQUAL((*m2)(5, 2), 23.0);
450 BOOST_CHECK_EQUAL((*m2)(5, 3), 24.0);
451}

◆ BOOST_AUTO_TEST_CASE() [11/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestEmptyRowElementMultiplication  )

Definition at line 453 of file BlockMatrixUnitTests.cpp.

454{
455 typedef NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag> BlockMatrixType;
456 unsigned int rowSizes[] = {0, 2, 0, 2, 0, 0, 2};
457 unsigned int columnSizes[] = {0, 2, 2};
458 BlockMatrixType m1(7, 3, rowSizes, columnSizes);
459
460 double vals1[] = {1.0, 3.0, 2.0, 4.0};
461 double vals2[] = {5.0, 7.0, 6.0, 8.0};
462 double vals3[] = {9.0, 11.0, 10.0, 12.0};
463 double vals4[] = {13.0, 15.0, 14.0, 16.0};
464 double vals5[] = {17.0, 19.0, 18.0, 20.0};
465 double vals6[] = {21.0, 23.0, 22.0, 24.0};
466
467 std::shared_ptr<NekMatrix<NekDouble>> sub1(
468 new NekMatrix<NekDouble>(2, 2, vals1));
469 std::shared_ptr<NekMatrix<NekDouble>> sub2(
470 new NekMatrix<NekDouble>(2, 2, vals2));
471 std::shared_ptr<NekMatrix<NekDouble>> sub3(
472 new NekMatrix<NekDouble>(2, 2, vals3));
473 std::shared_ptr<NekMatrix<NekDouble>> sub4(
474 new NekMatrix<NekDouble>(2, 2, vals4));
475 std::shared_ptr<NekMatrix<NekDouble>> sub5(
476 new NekMatrix<NekDouble>(2, 2, vals5));
477 std::shared_ptr<NekMatrix<NekDouble>> sub6(
478 new NekMatrix<NekDouble>(2, 2, vals6));
479
480 std::shared_ptr<NekMatrix<NekDouble>> empty(new NekMatrix<NekDouble>(0, 0));
481 m1.SetBlock(0, 0, empty);
482 m1.SetBlock(0, 1, empty);
483 m1.SetBlock(0, 2, empty);
484 m1.SetBlock(1, 0, empty);
485 m1.SetBlock(1, 1, sub1);
486 m1.SetBlock(1, 2, sub2);
487 m1.SetBlock(2, 0, empty);
488 m1.SetBlock(3, 1, sub3);
489 m1.SetBlock(3, 2, sub4);
490 m1.SetBlock(6, 1, sub5);
491 m1.SetBlock(6, 2, sub6);
492
493 double x_buf[] = {1, 2, 3, 4};
494 NekVector<double> x(4, x_buf);
495
496 double expected_result_buf[] = {44, 64, 124, 144, 204, 224};
497 NekVector<double> expected_result(6, expected_result_buf);
498
499 NekVector<double> result1 = m1 * x;
500 BOOST_CHECK_EQUAL(result1, expected_result);
501}

◆ BOOST_AUTO_TEST_CASE() [12/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestEqualSizedBlockConstruction  )

Definition at line 45 of file BlockMatrixUnitTests.cpp.

46{
47 {
48 typedef NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag> BlockMatrixType;
49 BlockMatrixType m1(3, 2, 2, 2);
50 std::shared_ptr<ConstMatrix<NekDouble>> m2(
51 new BlockMatrixType(2, 3, 2, 2));
52
53 BOOST_CHECK_EQUAL(m1.GetRows(), 6u);
54 BOOST_CHECK_EQUAL(m1.GetColumns(), 4u);
55 BOOST_CHECK_EQUAL(m2->GetRows(), 4u);
56 BOOST_CHECK_EQUAL(m2->GetColumns(), 6u);
57 }
58
59 // Bad Input
60 {
61 }
62}

◆ BOOST_AUTO_TEST_CASE() [13/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestMultiplication  )

Definition at line 57 of file TestBlockMatrix.cpp.

58{
59 typedef NekMatrix<double> InnerType;
61
62 double m1_buf[] = {1, 6, 2, 7, 3, 8};
63 double m2_buf[] = {4, 9, 5, 10};
64 double m3_buf[] = {11, 16, 12, 17, 13, 18};
65 double m4_buf[] = {14, 19, 15, 20};
66
67 std::shared_ptr<InnerType> m1(new InnerType(2, 3, m1_buf));
68 std::shared_ptr<InnerType> m2(new InnerType(2, 2, m2_buf));
69 std::shared_ptr<InnerType> m3(new InnerType(2, 3, m3_buf));
70 std::shared_ptr<InnerType> m4(new InnerType(2, 2, m4_buf));
71
72 unsigned int rowCounts[] = {2, 2};
73 unsigned int colCounts[] = {3, 2};
74
75 BlockType b(2, 2, rowCounts, colCounts);
76 b.SetBlock(0, 0, m1);
77 b.SetBlock(0, 1, m2);
78 b.SetBlock(1, 0, m3);
79 b.SetBlock(1, 1, m4);
80
81 double rhs_buf[] = {10, 20, 30, 40, 50};
82 NekVector<double> rhs(5, rhs_buf);
83
84 NekVector<double> result = b * rhs;
85
86 double expected_buf[] = {550, 1300, 2050, 2800};
87 NekVector<double> expected_result(4, expected_buf);
88
89 BOOST_CHECK_EQUAL(expected_result, result);
90}

◆ BOOST_AUTO_TEST_CASE() [14/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestMultiplicationBlock_1  )

Definition at line 546 of file TestBlockMatrix.cpp.

547{
548 typedef NekMatrix<double> InnerType;
549 typedef NekMatrix<InnerType, BlockMatrixTag> BlockType;
550
551 double m_00_buf[] = {3, 1, 5, 5};
552 double m_01_buf[] = {2, 4, 4, 1, 1, 3};
553 double m_02_buf[] = {3, 1, 2, 2, 4, 1, 4, 2};
554
555 double m_10_buf[] = {1, 3, 5, 1, 4, 2};
556 double m_11_buf[] = {4, 4, 1, 1, 1, 4, 5, 5, 3};
557 double m_12_buf[] = {5, 2, 1, 2, 3, 1, 1, 3, 1, 4, 1, 1};
558
559 double m_20_buf[] = {3, 1, 4, 2, 5, 1, 4, 2};
560 double m_21_buf[] = {4, 5, 2, 4, 4, 2, 3, 5, 2, 2, 5, 3};
561 double m_22_buf[] = {3, 4, 3, 1, 2, 1, 2, 4, 4, 5, 2, 3, 5, 4, 1, 1};
562
563 double m_30_buf[] = {2, 2, 1, 4, 5, 5};
564 double m_31_buf[] = {1, 1, 3, 2, 1, 2, 3, 3, 2};
565 double m_32_buf[] = {3, 1, 3, 1, 2, 2, 4, 2, 5, 5, 1, 1};
566
567 std::shared_ptr<InnerType> m00(new InnerType(2, 2, m_00_buf));
568 std::shared_ptr<InnerType> m01(new InnerType(2, 3, m_01_buf));
569 std::shared_ptr<InnerType> m02(new InnerType(2, 4, m_02_buf));
570
571 std::shared_ptr<InnerType> m10(new InnerType(3, 2, m_10_buf));
572 std::shared_ptr<InnerType> m11(new InnerType(3, 3, m_11_buf));
573 std::shared_ptr<InnerType> m12(new InnerType(3, 4, m_12_buf));
574
575 std::shared_ptr<InnerType> m20(new InnerType(4, 2, m_20_buf));
576 std::shared_ptr<InnerType> m21(new InnerType(4, 3, m_21_buf));
577 std::shared_ptr<InnerType> m22(new InnerType(4, 4, m_22_buf));
578
579 std::shared_ptr<InnerType> m30(new InnerType(3, 2, m_30_buf));
580 std::shared_ptr<InnerType> m31(new InnerType(3, 3, m_31_buf));
581 std::shared_ptr<InnerType> m32(new InnerType(3, 4, m_32_buf));
582
583 unsigned int rowCounts[] = {2, 3, 4, 3};
584 unsigned int colCounts[] = {2, 3, 4};
585
586 BlockType b(4, 3, rowCounts, colCounts);
587 b.SetBlock(0, 0, m00);
588 b.SetBlock(0, 1, m01);
589 b.SetBlock(0, 2, m02);
590 b.SetBlock(1, 0, m10);
591 b.SetBlock(1, 1, m11);
592 b.SetBlock(1, 2, m12);
593 b.SetBlock(2, 0, m20);
594 b.SetBlock(2, 1, m21);
595 b.SetBlock(2, 2, m22);
596 b.SetBlock(3, 0, m30);
597 b.SetBlock(3, 1, m31);
598 b.SetBlock(3, 2, m32);
599
600 Array<OneD, unsigned int> arrayRowCounts(4, rowCounts);
601 Array<OneD, unsigned int> arrayColCounts(3, colCounts);
602 BlockType b_initializedWithArray(arrayRowCounts, arrayColCounts);
603 b_initializedWithArray.SetBlock(0, 0, m00);
604 b_initializedWithArray.SetBlock(0, 1, m01);
605 b_initializedWithArray.SetBlock(0, 2, m02);
606 b_initializedWithArray.SetBlock(1, 0, m10);
607 b_initializedWithArray.SetBlock(1, 1, m11);
608 b_initializedWithArray.SetBlock(1, 2, m12);
609 b_initializedWithArray.SetBlock(2, 0, m20);
610 b_initializedWithArray.SetBlock(2, 1, m21);
611 b_initializedWithArray.SetBlock(2, 2, m22);
612 b_initializedWithArray.SetBlock(3, 0, m30);
613 b_initializedWithArray.SetBlock(3, 1, m31);
614 b_initializedWithArray.SetBlock(3, 2, m32);
615
616 double rhs_buf[] = {4, 2, 5, 5, 3, 1, 3, 2, 3};
617 NekVector<double> rhs(9, rhs_buf);
618
619 NekVector<double> result = b * rhs;
620 NekVector<double> result1 = b_initializedWithArray * rhs;
621
622 double expected_buf[] = {84, 63, 71, 80, 67, 100, 76, 80, 88, 69, 51, 67};
623 NekVector<double> expected_result(12, expected_buf);
624
625 BOOST_CHECK_EQUAL(expected_result, result);
626 BOOST_CHECK_EQUAL(expected_result, result1);
627}

◆ BOOST_AUTO_TEST_CASE() [15/15]

Nektar::BlockMatrixUnitTests::BOOST_AUTO_TEST_CASE ( TestRowsAndColumnsPerBlockAccess  )

Definition at line 47 of file TestBlockMatrix.cpp.

48{
49 NekMatrix<NekMatrix<double>, BlockMatrixTag> m(2, 3, 7, 10);
50 BOOST_CHECK_EQUAL(7, m.GetNumberOfRowsInBlockRow(0));
51 BOOST_CHECK_EQUAL(7, m.GetNumberOfRowsInBlockRow(1));
52 BOOST_CHECK_EQUAL(10, m.GetNumberOfColumnsInBlockColumn(0));
53 BOOST_CHECK_EQUAL(10, m.GetNumberOfColumnsInBlockColumn(1));
54 BOOST_CHECK_EQUAL(10, m.GetNumberOfColumnsInBlockColumn(2));
55}