2 #include <libmesh/diagonal_matrix.h>
3 #include <libmesh/parallel.h>
4 #include <libmesh/auto_ptr.h>
5 #include <libmesh/dense_matrix.h>
6 #include <libmesh/id_types.h>
7 #include <libmesh/numeric_vector.h>
25 return n * (n + 1) / 2;
34 CPPUNIT_TEST(testSizes);
35 CPPUNIT_TEST(testNumerics);
37 CPPUNIT_TEST_SUITE_END();
43 _matrix = libmesh_make_unique<DiagonalMatrix<Number>>(*_comm);
46 _local_size = root_block_size + static_cast<numeric_index_type>(_comm->rank());
53 _global_size += block_size;
54 _i.push_back(_global_size);
57 _matrix->init(_global_size, UNUSED, _local_size, UNUSED);
64 CPPUNIT_ASSERT_EQUAL(_global_size, _matrix->m());
65 CPPUNIT_ASSERT_EQUAL(_global_size, _matrix->n());
66 CPPUNIT_ASSERT_EQUAL(_i[_comm->rank()], _matrix->row_start());
67 CPPUNIT_ASSERT_EQUAL(_i[_comm->rank() + 1], _matrix->row_stop());
75 CPPUNIT_ASSERT_EQUAL(_local_size,
numeric_index_type(_matrix->row_stop() - _matrix->row_start()));
81 _matrix->add(beginning_index, beginning_index + 1, 1);
82 _matrix->set(beginning_index + 1, beginning_index, 1);
85 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(beginning_index, beginning_index + 1)), 0, _tolerance);
86 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(beginning_index + 1, beginning_index)), 0, _tolerance);
91 _matrix->add(i, i, i);
94 _matrix->add(0, 0, 1);
96 CPPUNIT_ASSERT(!_matrix->closed());
99 CPPUNIT_ASSERT(_matrix->closed());
104 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), i, _tolerance);
106 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), _comm->size(), _tolerance);
113 if (i != _global_size - 1)
114 _matrix->set(i, i, i);
116 if (_comm->rank() == 0)
117 _matrix->set(_global_size - 1, _global_size - 1, 0);
119 CPPUNIT_ASSERT(!_matrix->closed());
122 CPPUNIT_ASSERT(_matrix->closed());
126 if (i != _global_size - 1)
127 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), i, _tolerance);
129 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), 0, _tolerance);
133 std::vector<numeric_index_type> rows(_local_size);
134 std::iota(rows.begin(), rows.end(), beginning_index);
141 local_index < _local_size;
142 ++local_index, ++global_index)
143 dense(local_index, local_index) = global_index;
148 _matrix->add_matrix(dense, rows, rows);
155 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), i, _tolerance);
160 diagonal->init(_matrix->diagonal());
162 _matrix->get_diagonal(*diagonal);
169 copy = std::move(*diagonal);
172 _matrix->add_matrix(dense, rows);
176 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), 2 * i, _tolerance);
179 _matrix->add(-1, copy);
182 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, i)), i, _tolerance);
184 _matrix->get_transpose(copy);
187 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real(copy(i, i)), i, _tolerance);
192 LIBMESH_ASSERT_FP_EQUAL(termial(_global_size - 1), _matrix->l1_norm(), _tolerance);
193 LIBMESH_ASSERT_FP_EQUAL(_global_size - 1, _matrix->linfty_norm(), _tolerance);
198 _matrix->zero_rows(rows, 1);
203 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, j)), 1, _tolerance);
205 LIBMESH_ASSERT_FP_EQUAL(
libmesh_real((*_matrix)(i, j)), 0, _tolerance);
213 std::unique_ptr<DiagonalMatrix<Number>>
_matrix;
215 std::vector<numeric_index_type>
_i;