libMesh
Loading...
Searching...
No Matches
Public Member Functions | Protected Attributes | Private Attributes | List of all members
EigenSparseMatrixTest Class Reference
Inheritance diagram for EigenSparseMatrixTest:
[legend]

Public Member Functions

 EigenSparseMatrixTest ()
 
void setUp ()
 
 CPPUNIT_TEST_SUITE (EigenSparseMatrixTest)
 
SPARSEMATRIXTEST CPPUNIT_TEST_SUITE_END ()
 
void tearDown ()
 
void setValues ()
 
void testValues ()
 
void testGetAndSet ()
 
void testReadMatlab (const std::string &filename)
 
void testReadMatlab1 ()
 
void testReadMatlab2 ()
 
void testReadMatlab4 ()
 
void testReadHDF5 ()
 
void testTransposeNorms ()
 
void testWriteAndRead (const std::string &filename)
 
void testWriteAndReadHDF5 ()
 
void testWriteAndReadMatlab ()
 
void testWriteAndReadZippedMatlab ()
 
void testClone ()
 

Protected Attributes

std::string libmesh_suite_name
 
libMesh::Parallel::Communicatormy_comm
 
std::unique_ptr< EigenSparseMatrix< Number > > matrix
 
libMesh::numeric_index_type nonsquare
 
libMesh::numeric_index_type local_m
 
libMesh::numeric_index_type local_n
 
libMesh::numeric_index_type global_m
 
libMesh::numeric_index_type global_n
 
const libMesh::Real _tolerance
 

Private Attributes

Parallel::Communicator comm_self
 

Detailed Description

Definition at line 11 of file eigen_sparse_matrix_test.C.

Constructor & Destructor Documentation

◆ EigenSparseMatrixTest()

EigenSparseMatrixTest::EigenSparseMatrixTest ( )
inline

Member Function Documentation

◆ CPPUNIT_TEST_SUITE()

EigenSparseMatrixTest::CPPUNIT_TEST_SUITE ( EigenSparseMatrixTest  )

◆ CPPUNIT_TEST_SUITE_END()

SPARSEMATRIXTEST EigenSparseMatrixTest::CPPUNIT_TEST_SUITE_END ( )

◆ setUp()

void EigenSparseMatrixTest::setUp ( )
inline

Definition at line 22 of file eigen_sparse_matrix_test.C.

23 {
24 // EigenSparseMatrix is serial; we'll tell it to use MPI_COMM_SELF
25 // so we just do these tests embarrassingly parallel
27
28 // EigenSparseMatrix doesn't support non-square matrices?
29 nonsquare = 0;
30
32 }
Parallel::Communicator comm_self

References comm_self, SparseMatrixTest< EigenSparseMatrix< Number > >::my_comm, SparseMatrixTest< EigenSparseMatrix< Number > >::nonsquare, and setUp().

Referenced by setUp().

◆ setValues()

void SparseMatrixTest< EigenSparseMatrix< Number > >::setValues ( )
inlineinherited

Definition at line 93 of file sparse_matrix_test.h.

94 {
95 std::vector<libMesh::numeric_index_type> rows(local_m);
96 std::iota(rows.begin(), rows.end(), matrix->row_start());
97 std::vector<libMesh::numeric_index_type> cols(local_n);
98 std::iota(cols.begin(), cols.end(), matrix->col_start());
99
101
102 for (auto i : libMesh::make_range(local_m))
103 for (auto j : libMesh::make_range(local_n))
104 local(i, j) = (i + 1) * (j + 1) * (my_comm->rank() + 1);
105
106 matrix->zero();
107
108 matrix->add_matrix(local, rows, cols);
109 matrix->close();
110 }
std::unique_ptr< EigenSparseMatrix< Number > > matrix
Defines a dense matrix for use in Finite Element-type computations.
The libMesh namespace provides an interface to certain functionality in the library.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition int_range.h:176

◆ tearDown()

void SparseMatrixTest< EigenSparseMatrix< Number > >::tearDown ( )
inlineinherited

Definition at line 90 of file sparse_matrix_test.h.

90{}

◆ testClone()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testClone ( )
inlineinherited

Definition at line 296 of file sparse_matrix_test.h.

297 {
298 LOG_UNIT_TEST;
299
300 setValues();
301
302 // Matrix must be closed before it can be cloned.
303 matrix->close();
304
305 {
306 // Create copy, test that it can go out of scope
307 auto copy = matrix->clone();
308
309 // Check that matrices have the same local/global sizes
310 CPPUNIT_ASSERT_EQUAL(copy->m(), matrix->m());
311 CPPUNIT_ASSERT_EQUAL(copy->n(), matrix->n());
312 CPPUNIT_ASSERT_EQUAL(copy->local_m(), matrix->local_m());
313 CPPUNIT_ASSERT_EQUAL(copy->row_start(), matrix->row_start());
314 CPPUNIT_ASSERT_EQUAL(copy->row_stop(), matrix->row_stop());
315
316 // Check that copy has same values as original
317 LIBMESH_ASSERT_FP_EQUAL(copy->l1_norm(), matrix->l1_norm(), _tolerance);
318 CPPUNIT_ASSERT(relative_fuzzy_equals(*matrix, *copy));
319 copy->scale(2);
320 CPPUNIT_ASSERT(!relative_fuzzy_equals(*matrix, *copy));
321 }
322
323 {
324 // Create zero copy
325 auto zero_copy = matrix->zero_clone();
326
327 // Check that matrices have the same local/global sizes
328 CPPUNIT_ASSERT_EQUAL(zero_copy->m(), matrix->m());
329 CPPUNIT_ASSERT_EQUAL(zero_copy->n(), matrix->n());
330 CPPUNIT_ASSERT_EQUAL(zero_copy->local_m(), matrix->local_m());
331 CPPUNIT_ASSERT_EQUAL(zero_copy->row_start(), matrix->row_start());
332 CPPUNIT_ASSERT_EQUAL(zero_copy->row_stop(), matrix->row_stop());
333
334 // Check that zero_copy has same values as original
335 LIBMESH_ASSERT_FP_EQUAL(0.0, zero_copy->l1_norm(), _tolerance);
336 }
337 }
bool relative_fuzzy_equals(const T &var1, const T2 &var2, const Real tol=TOLERANCE *TOLERANCE)
Function to check whether two variables are equal within a relative tolerance.

◆ testGetAndSet()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testGetAndSet ( )
inlineinherited

Definition at line 153 of file sparse_matrix_test.h.

154 {
155 LOG_UNIT_TEST;
156
157 setValues();
158
159 testValues();
160 }

◆ testReadHDF5()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testReadHDF5 ( )
inlineinherited

Definition at line 209 of file sparse_matrix_test.h.

210 {
211 LOG_UNIT_TEST;
212
213 matrix->clear();
214 auto matrix2 = std::make_unique<DerivedClass>(*my_comm);
215 matrix->read("matrices/geom_1_extraction_op.m");
216 matrix2->read("matrices/geom_1_extraction_op.h5");
217
218 // We need some more SparseMatrix operators, but not today
219 CPPUNIT_ASSERT(matrix->l1_norm() == matrix2->l1_norm());
220 CPPUNIT_ASSERT(matrix->linfty_norm() == matrix2->linfty_norm());
221 }

◆ testReadMatlab()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testReadMatlab ( const std::string &  filename)
inlineinherited

Definition at line 163 of file sparse_matrix_test.h.

164 {
165 // Laspack doesn't handle non-square matrices)
166 if (matrix->solver_package() == libMesh::LASPACK_SOLVERS)
167 return;
168
169 matrix->clear();
170
171 auto matrix2 = std::make_unique<DerivedClass>(*my_comm);
172
173 matrix->read(filename);
174
175#ifndef LIBMESH_HAVE_GZSTREAM
176 return;
177#endif
178
179 matrix2->read(std::string(filename)+".gz");
180
181 // We need some more SparseMatrix operators, but not today
182 CPPUNIT_ASSERT(matrix->l1_norm() == matrix2->l1_norm());
183 CPPUNIT_ASSERT(matrix->linfty_norm() == matrix2->linfty_norm());
184 }

◆ testReadMatlab1()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testReadMatlab1 ( )
inlineinherited

Definition at line 187 of file sparse_matrix_test.h.

188 {
189 LOG_UNIT_TEST;
190 testReadMatlab("matrices/geom_1_extraction_op.m");
191 }
void testReadMatlab(const std::string &filename)

◆ testReadMatlab2()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testReadMatlab2 ( )
inlineinherited

Definition at line 194 of file sparse_matrix_test.h.

195 {
196 LOG_UNIT_TEST;
197 testReadMatlab("matrices/geom_2_extraction_op.m");
198 }

◆ testReadMatlab4()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testReadMatlab4 ( )
inlineinherited

Definition at line 201 of file sparse_matrix_test.h.

202 {
203 LOG_UNIT_TEST;
204 testReadMatlab("matrices/geom_4_extraction_op.m");
205 }

◆ testTransposeNorms()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testTransposeNorms ( )
inlineinherited

Definition at line 225 of file sparse_matrix_test.h.

226 {
227 LOG_UNIT_TEST;
228
229 setValues();
230
231 auto matrix2 = std::make_unique<DerivedClass>(*my_comm);
232 matrix->get_transpose(*matrix2);
233 LIBMESH_ASSERT_FP_EQUAL(matrix->l1_norm(), matrix2->linfty_norm(), _tolerance);
234 LIBMESH_ASSERT_FP_EQUAL(matrix2->l1_norm(), matrix->linfty_norm(), _tolerance);
235 }

◆ testValues()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testValues ( )
inlineinherited

Definition at line 113 of file sparse_matrix_test.h.

114 {
115 auto functor = [this]()
116 {
117 std::vector<libMesh::numeric_index_type> cols_to_get;
118 std::vector<libMesh::Number> values;
119 const libMesh::numeric_index_type col_start =
120 matrix->col_start();
122 libMesh::make_range(matrix->row_start(),
123 matrix->row_stop()))
124 {
125 matrix->get_row(i, cols_to_get, values);
126 for (libMesh::numeric_index_type col_j :
127 libMesh::index_range(cols_to_get))
128 {
129 CPPUNIT_ASSERT_EQUAL(cols_to_get[col_j], col_start + col_j);
130 LIBMESH_ASSERT_NUMBERS_EQUAL
131 ((i - matrix->row_start() + 1) * (col_j + 1) * (my_comm->rank() + 1),
132 values[col_j], _tolerance);
133 }
134 }
135 };
136
137#ifdef LIBMESH_HAVE_CXX11_THREAD
138 auto num_threads = std::min(unsigned(2),
139 std::max(
140 std::thread::hardware_concurrency(),
141 unsigned(1)));
142 std::vector<std::thread> threads(num_threads);
143 for (unsigned int thread = 0; thread < num_threads; ++thread)
144 threads[thread] = std::thread(functor);
145 std::for_each(threads.begin(), threads.end(),
146 [](std::thread & x){x.join();});
147#else
148 functor();
149#endif
150 }
processor_id_type rank() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition int_range.h:153
dof_id_type numeric_index_type
Definition id_types.h:99

◆ testWriteAndRead()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testWriteAndRead ( const std::string &  filename)
inlineinherited

Definition at line 238 of file sparse_matrix_test.h.

239 {
240 LOG_UNIT_TEST;
241
242 setValues();
243
244 // If we're working with serial matrices then just print one of
245 // them so they don't step on the others' toes.
246 if (matrix->n_processors() > 1 ||
247 TestCommWorld->rank() == 0)
248 matrix->print(filename);
249
250 matrix->clear();
251
252 // Let's make sure we don't have any race conditions; we have
253 // multiple SparseMatrix subclasses that might be trying to read
254 // and write the same file.
255
256 TestCommWorld->barrier();
257
258#ifdef LIBMESH_USE_COMPLEX_NUMBERS
259 // We're not supporting complex reads quite yet
260 return;
261#endif
262
263 matrix->read(filename);
264
265 TestCommWorld->barrier();
266
267 testValues();
268 }
Communicator * TestCommWorld

◆ testWriteAndReadHDF5()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testWriteAndReadHDF5 ( )
inlineinherited

Definition at line 271 of file sparse_matrix_test.h.

272 {
273 // This capability is not yet supported when libmesh is compiled
274 // with complex number support
275#ifndef LIBMESH_USE_COMPLEX_NUMBERS
276 testWriteAndRead("M.h5");
277#endif
278 }
void testWriteAndRead(const std::string &filename)

◆ testWriteAndReadMatlab()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testWriteAndReadMatlab ( )
inlineinherited

Definition at line 282 of file sparse_matrix_test.h.

283 {
284 // Use a very short filename, because we had a bug with that and
285 // we want to test it.
286 testWriteAndRead("M.m");
287 }

◆ testWriteAndReadZippedMatlab()

void SparseMatrixTest< EigenSparseMatrix< Number > >::testWriteAndReadZippedMatlab ( )
inlineinherited

Definition at line 289 of file sparse_matrix_test.h.

290 {
291#ifdef LIBMESH_HAVE_GZSTREAM
292 testWriteAndRead("Mzipped.m.gz");
293#endif
294 }

Member Data Documentation

◆ _tolerance

const libMesh::Real SparseMatrixTest< EigenSparseMatrix< Number > >::_tolerance
protectedinherited

Definition at line 351 of file sparse_matrix_test.h.

◆ comm_self

Parallel::Communicator EigenSparseMatrixTest::comm_self
private

Definition at line 42 of file eigen_sparse_matrix_test.C.

Referenced by setUp().

◆ global_m

Definition at line 349 of file sparse_matrix_test.h.

◆ global_n

Definition at line 349 of file sparse_matrix_test.h.

◆ libmesh_suite_name

std::string SparseMatrixTest< EigenSparseMatrix< Number > >::libmesh_suite_name
protectedinherited

Definition at line 341 of file sparse_matrix_test.h.

◆ local_m

Definition at line 348 of file sparse_matrix_test.h.

◆ local_n

Definition at line 348 of file sparse_matrix_test.h.

◆ matrix

std::unique_ptr<EigenSparseMatrix< Number > > SparseMatrixTest< EigenSparseMatrix< Number > >::matrix
protectedinherited

Definition at line 345 of file sparse_matrix_test.h.

◆ my_comm

Definition at line 343 of file sparse_matrix_test.h.

◆ nonsquare

Definition at line 347 of file sparse_matrix_test.h.


The documentation for this class was generated from the following file: