37#include <boost/test/tools/floating_point_comparison.hpp>
38#include <boost/test/unit_test.hpp>
46 double values[],
double scale,
52 std::make_shared<NekMatrix<NekDouble, StandardMatrixTag>>(4, 4, values);
54 double inner_values[16];
56 values, values + 16, inner_values,
57 std::bind(std::divides<NekDouble>(), std::placeholders::_1, scale));
59 std::shared_ptr<NekMatrix<NekDouble>> inner(
61 m2 = std::make_shared<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>>(
64 double block_1_values[] = {values[0], values[1], values[4], values[5]};
65 double block_2_values[] = {values[2], values[3], values[6], values[7]};
66 double block_3_values[] = {values[8], values[9], values[12], values[13]};
67 double block_4_values[] = {values[10], values[11], values[14], values[15]};
68 std::shared_ptr<NekMatrix<NekDouble>> block1(
70 std::shared_ptr<NekMatrix<NekDouble>> block2(
72 std::shared_ptr<NekMatrix<NekDouble>> block3(
74 std::shared_ptr<NekMatrix<NekDouble>> block4(
77 m3 = std::make_shared<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>>(
79 m3->SetBlock(0, 0, block1);
80 m3->SetBlock(1, 0, block2);
81 m3->SetBlock(0, 1, block3);
82 m3->SetBlock(1, 1, block4);
91 m1 = std::make_shared<NekMatrix<NekDouble, StandardMatrixTag>>(
94 double inner_values[10];
96 values, values + 10, inner_values,
97 std::bind(std::divides<NekDouble>(), std::placeholders::_1, scale));
99 std::shared_ptr<NekMatrix<NekDouble>> inner(
101 m2 = std::make_shared<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>>(
104 double block_1_values[] = {values[0], 0.0, values[1], values[2]};
105 double block_2_values[] = {values[3], values[4], values[6], values[7]};
106 double block_4_values[] = {values[5], 0.0, values[8], values[9]};
107 std::shared_ptr<NekMatrix<NekDouble>> block1(
109 std::shared_ptr<NekMatrix<NekDouble>> block2(
111 std::shared_ptr<NekMatrix<NekDouble>> block4(
114 m3 = std::make_shared<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>>(
116 m3->SetBlock(0, 0, block1);
117 m3->SetBlock(0, 1, block2);
118 m3->SetBlock(1, 1, block4);
121namespace MatrixOperationTests
129 double lhs_values[] = {2, 10, 18, 26, 4, 12, 20, 28,
130 6, 14, 22, 30, 8, 16, 24, 32};
132 std::shared_ptr<NekMatrix<NekDouble, StandardMatrixTag>> lhs1;
133 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>> lhs2;
134 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>> lhs3;
141 double rhs_values[] = {4, 20, 36, 52, 8, 24, 40, 56,
142 12, 28, 44, 60, 16, 32, 48, 64};
143 std::shared_ptr<NekMatrix<NekDouble, StandardMatrixTag>> rhs1;
144 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>> rhs2;
145 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>> rhs3;
148 double result_values[16];
149 std::transform(lhs_values, lhs_values + 16, rhs_values, result_values,
150 std::plus<NekDouble>());
160 double buf[] = {1.0, 3.0, 2.0, 4.0};
172 BOOST_CHECK_EQUAL(result(0, 0), 2.5);
173 BOOST_CHECK_EQUAL(result(0, 1), 5.0);
174 BOOST_CHECK_EQUAL(result(1, 0), 7.5);
175 BOOST_CHECK_EQUAL(result(1, 1), 10.0);
179 double buf[] = {1.0, 2.0, 3.0, 4.0};
183 std::shared_ptr<DNekScalMat> m1(
new DNekScalMat(2.0, inner1));
184 std::shared_ptr<DNekScalMat> m2(
new DNekScalMat(3.0, inner2));
201 double lhs_values[] = {2, 4, 12, 6, 14, 22, 8, 16, 24, 32};
203 std::shared_ptr<NekMatrix<NekDouble, StandardMatrixTag>> lhs1;
204 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>> lhs2;
205 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>> lhs3;
212 double rhs_values[] = {4, 8, 24, 12, 28, 44, 16, 32, 48, 64};
213 std::shared_ptr<NekMatrix<NekDouble, StandardMatrixTag>> rhs1;
214 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>> rhs2;
215 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>> rhs3;
218 double result_values[10];
219 std::transform(lhs_values, lhs_values + 10, rhs_values, result_values,
220 std::plus<NekDouble>());
230namespace MatrixSubtractionTests
239 double lhs_values[] = {2, 10, 18, 26, 4, 12, 20, 28,
240 6, 14, 22, 30, 8, 16, 24, 32};
242 std::shared_ptr<NekMatrix<NekDouble, StandardMatrixTag>> lhs1;
243 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>> lhs2;
244 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>> lhs3;
251 double rhs_values[] = {4, 20, 36, 52, 8, 24, 40, 56,
252 12, 28, 44, 60, 16, 32, 48, 64};
253 std::shared_ptr<NekMatrix<NekDouble, StandardMatrixTag>> rhs1;
254 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, ScaledMatrixTag>> rhs2;
255 std::shared_ptr<NekMatrix<NekMatrix<NekDouble>, BlockMatrixTag>> rhs3;
258 double result_values[16];
259 std::transform(lhs_values, lhs_values + 16, rhs_values, result_values,
260 std::minus<NekDouble>());
BOOST_AUTO_TEST_CASE(TestLhsFullRhsFull)
BOOST_AUTO_TEST_CASE(TestLhsFullRhsFullSubtraction)
NekMatrix< NekMatrix< NekDouble, StandardMatrixTag >, ScaledMatrixTag > DNekScalMat
void GenerateFullMatrices(double values[], double scale, std::shared_ptr< NekMatrix< NekDouble, StandardMatrixTag > > &m1, std::shared_ptr< NekMatrix< NekMatrix< NekDouble >, ScaledMatrixTag > > &m2, std::shared_ptr< NekMatrix< NekMatrix< NekDouble >, BlockMatrixTag > > &m3)
void RunAllAddCombinations(const NekMatrix< NekDouble, StandardMatrixTag > &l1, const NekMatrix< NekMatrix< NekDouble, LhsScaledInnerMatrixType >, ScaledMatrixTag > &l2, const NekMatrix< NekMatrix< NekDouble, LhsBlockInnerMatrixType >, BlockMatrixTag > &l3, const NekMatrix< NekDouble, StandardMatrixTag > &r1, const NekMatrix< NekMatrix< NekDouble, RhsScaledInnerMatrixType >, ScaledMatrixTag > &r2, const NekMatrix< NekMatrix< NekDouble, RhsBlockInnerMatrixType >, BlockMatrixTag > &r3, const NekMatrix< NekDouble, StandardMatrixTag > &result)
std::shared_ptr< NekMatrix< NekDouble, StandardMatrixTag > > SharedNekMatrixPtr
void GenerateUpperTriangularMatrices(NekDouble values[], NekDouble scale, std::shared_ptr< NekMatrix< NekDouble, StandardMatrixTag > > &m1, std::shared_ptr< NekMatrix< NekMatrix< NekDouble >, ScaledMatrixTag > > &m2, std::shared_ptr< NekMatrix< NekMatrix< NekDouble >, BlockMatrixTag > > &m3)
void RunAllSubCombinations(const NekMatrix< NekDouble, StandardMatrixTag > &l1, const NekMatrix< NekMatrix< NekDouble, LhsScaledInnerMatrixType >, ScaledMatrixTag > &l2, const NekMatrix< NekMatrix< NekDouble, LhsBlockInnerMatrixType >, BlockMatrixTag > &l3, const NekMatrix< NekDouble, StandardMatrixTag > &r1, const NekMatrix< NekMatrix< NekDouble, RhsScaledInnerMatrixType >, ScaledMatrixTag > &r2, const NekMatrix< NekMatrix< NekDouble, RhsBlockInnerMatrixType >, BlockMatrixTag > &r3, const NekMatrix< NekDouble, StandardMatrixTag > &result)