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

Public Member Functions

 PetscMatrixTest ()
 
 CPPUNIT_TEST_SUITE (PetscMatrixTest)
 
SPARSEMATRIXTEST CPPUNIT_TEST (testPetscBinaryRead)
 
 CPPUNIT_TEST (testPetscBinaryWrite)
 
 CPPUNIT_TEST (testPetscCopyFromHash)
 
 CPPUNIT_TEST_SUITE_END ()
 
void testPetscBinaryRead ()
 
void testPetscBinaryWrite ()
 
void testPetscHDF5Write ()
 
void testPetscCopyFromHash ()
 
void setUp ()
 
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< PetscMatrix< 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
 

Detailed Description

Definition at line 11 of file petsc_matrix_test.C.

Constructor & Destructor Documentation

◆ PetscMatrixTest()

PetscMatrixTest::PetscMatrixTest ( )
inline

Definition at line 14 of file petsc_matrix_test.C.

14 :
17 this->libmesh_suite_name = "SparseMatrixTest";
18 else
19 this->libmesh_suite_name = "PetscMatrixTest";
20 }
bool summarized_logs_enabled()
Definition perf_log.h:210
libMesh::PerfLog * unitlog
Definition driver.C:220

References SparseMatrixTest< PetscMatrix< Number > >::libmesh_suite_name, libMesh::PerfLog::summarized_logs_enabled(), and unitlog.

Member Function Documentation

◆ CPPUNIT_TEST() [1/3]

SPARSEMATRIXTEST PetscMatrixTest::CPPUNIT_TEST ( testPetscBinaryRead  )

◆ CPPUNIT_TEST() [2/3]

PetscMatrixTest::CPPUNIT_TEST ( testPetscBinaryWrite  )

◆ CPPUNIT_TEST() [3/3]

PetscMatrixTest::CPPUNIT_TEST ( testPetscCopyFromHash  )

◆ CPPUNIT_TEST_SUITE()

PetscMatrixTest::CPPUNIT_TEST_SUITE ( PetscMatrixTest  )

◆ CPPUNIT_TEST_SUITE_END()

PetscMatrixTest::CPPUNIT_TEST_SUITE_END ( )

◆ setUp()

void SparseMatrixTest< PetscMatrix< Number > >::setUp ( )
inlineinherited

Definition at line 53 of file sparse_matrix_test.h.

54 {
55 // By default we'll use the whole communicator in parallel;
56 // Serial-only NumericVector subclasses will need to override
57 // this and set something else first.
58 if (!my_comm)
60
61 matrix = std::make_unique<DerivedClass>(*my_comm);
62
63 // Use the same even partitioning that we'll auto-deduce in matrix
64 // read, to make it easier to test parallel reads
65
66 global_m = global_n = my_comm->size() * 5.75 - 1;
67 if (nonsquare)
68 global_n *= 1.3;
69
71 row_start = my_comm->rank() * global_m / my_comm->size(),
72 row_stop = (my_comm->rank()+1) * global_m / my_comm->size();
74 col_start = my_comm->rank() * global_n / my_comm->size(),
75 col_stop = (my_comm->rank()+1) * global_n / my_comm->size();
76
77 local_m = row_stop - row_start;
78 local_n = col_stop - col_start;
79
80 // Let's just play around with locally dense blocks for now
81 matrix->init(global_m,
83 local_m,
84 local_n,
85 /*nnz=*/local_n,
86 /*noz=*/5);
87 }
libMesh::Parallel::Communicator * my_comm
std::unique_ptr< PetscMatrix< Number > > matrix
processor_id_type size() const
processor_id_type rank() const
Communicator * TestCommWorld
uint8_t dof_id_type
Definition id_types.h:67

◆ setValues()

void SparseMatrixTest< PetscMatrix< 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 }
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< PetscMatrix< Number > >::tearDown ( )
inlineinherited

Definition at line 90 of file sparse_matrix_test.h.

90{}

◆ testClone()

void SparseMatrixTest< PetscMatrix< 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< PetscMatrix< 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 }

◆ testPetscBinaryRead()

void PetscMatrixTest::testPetscBinaryRead ( )
inline

Definition at line 42 of file petsc_matrix_test.C.

43 {
44 auto mat_to_read = std::make_unique<PetscMatrix<Number>>(*my_comm);
45
46 // Petsc binary formats depend on sizeof(PetscInt) and
47 // sizeof(PetscScalar)
48#if LIBMESH_DOF_ID_BYTES == 4 && LIBMESH_DEFAULT_DOUBLE_PRECISION
49 mat_to_read->read("matrices/geom_1_extraction_op.petsc32");
50#elif LIBMESH_DOF_ID_BYTES == 8 && LIBMESH_DEFAULT_DOUBLE_PRECISION
51 mat_to_read->read("matrices/geom_1_extraction_op.petsc64");
52#else
53 return;
54#endif
55
56 CPPUNIT_ASSERT_EQUAL(mat_to_read->m(), dof_id_type(27));
57 CPPUNIT_ASSERT_EQUAL(mat_to_read->n(), dof_id_type(27));
58
59 // Our read_matlab partitioning doesn't necessarily match PETSc's
60 // MatLoad partitioning, so we'll partition a matrix to compare
61 // against manually. These particular files have bandwidth 8,
62 // so we'll ask for sufficient n_nz and n_oz to handle that
63 // regardless of partitioning.
64 auto mat_ascii_format = std::make_unique<PetscMatrix<Number>>(*my_comm);
65 mat_ascii_format->init(mat_to_read->m(), mat_to_read->n(),
66 mat_to_read->local_m(), mat_to_read->local_n(),
67 8, 7);
68
69 mat_ascii_format->read_matlab("matrices/geom_1_extraction_op.m");
70
71 mat_ascii_format->add(-1, *mat_to_read);
72 CPPUNIT_ASSERT_LESS(TOLERANCE, mat_ascii_format->l1_norm());
73 }
static constexpr Real TOLERANCE

References libMesh::TOLERANCE.

◆ testPetscBinaryWrite()

void PetscMatrixTest::testPetscBinaryWrite ( )
inline

Definition at line 76 of file petsc_matrix_test.C.

77 {
78 auto mat_to_read = std::make_unique<PetscMatrix<Number>>(*my_comm);
79 mat_to_read->read_matlab("matrices/geom_1_extraction_op.m");
80 mat_to_read->print_petsc_binary("geom_1_extraction_op.petsc");
81
82 // Our read_matlab partitioning doesn't necessarily match PETSc's
83 // MatLoad partitioning, so we'll partition a matrix to compare
84 // against manually. These particular files have bandwidth 8,
85 // so we'll ask for sufficient n_nz and n_oz to handle that
86 // regardless of partitioning.
87 auto mat_reread = std::make_unique<PetscMatrix<Number>>(*my_comm);
88 mat_reread->init(mat_to_read->m(), mat_to_read->n(),
89 mat_to_read->local_m(), mat_to_read->local_n(),
90 8, 7);
91
92 mat_reread->read_petsc_binary("geom_1_extraction_op.petsc");
93
94 mat_to_read->add(-1, *mat_reread);
95 CPPUNIT_ASSERT_LESS(TOLERANCE, mat_to_read->l1_norm());
96 }

References libMesh::TOLERANCE.

◆ testPetscCopyFromHash()

void PetscMatrixTest::testPetscCopyFromHash ( )
inline

Definition at line 113 of file petsc_matrix_test.C.

114 {
116 const numeric_index_type M = my_comm->size();
117 const numeric_index_type m = 1;
118 const numeric_index_type blocksize = 1;
119 mat.use_hash_table(true);
120 mat.init_without_preallocation(M, M, m, m, blocksize);
121 mat.finish_initialization();
122
123 // We'll just write a dense row
124 for (const auto j : make_range(my_comm->size()))
125 mat.add(my_comm->rank(), j, my_comm->rank() * j);
126
127 auto copy = mat.copy_from_hash();
128 for (const auto j : make_range(my_comm->size()))
129 CPPUNIT_ASSERT_EQUAL((*copy)(my_comm->rank(), j), static_cast<Number>(my_comm->rank() * j));
130 }
This class provides a nice interface to the PETSc C-based AIJ data structures for parallel,...
dof_id_type numeric_index_type
Definition id_types.h:99

References libMesh::PetscMatrix< T >::add(), libMesh::PetscMatrix< T >::copy_from_hash(), libMesh::PetscMatrix< T >::finish_initialization(), libMesh::PetscMatrix< T >::init_without_preallocation(), libMesh::make_range(), SparseMatrixTest< PetscMatrix< Number > >::my_comm, libMesh::Parallel::Communicator::rank(), libMesh::Parallel::Communicator::size(), and libMesh::SparseMatrix< T >::use_hash_table().

◆ testPetscHDF5Write()

void PetscMatrixTest::testPetscHDF5Write ( )
inline

Definition at line 99 of file petsc_matrix_test.C.

100 {
101 auto mat_to_read = std::make_unique<PetscMatrix<Number>>(*my_comm);
102 mat_to_read->read_matlab("matrices/geom_1_extraction_op.m");
103 mat_to_read->print_petsc_hdf5("geom_1_extraction_op.hdf5");
104
105 auto mat_reread = std::make_unique<PetscMatrix<Number>>(*my_comm);
106 mat_reread->read_petsc_hdf5("geom_1_extraction_op.hdf5");
107
108 mat_to_read->add(-1, *mat_reread);
109 CPPUNIT_ASSERT_LESS(TOLERANCE, mat_to_read->l1_norm());
110 }

References libMesh::TOLERANCE.

◆ testReadHDF5()

void SparseMatrixTest< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< 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 }
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

◆ testWriteAndRead()

void SparseMatrixTest< PetscMatrix< 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 }

◆ testWriteAndReadHDF5()

void SparseMatrixTest< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< 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< PetscMatrix< Number > >::_tolerance
protectedinherited

Definition at line 351 of file sparse_matrix_test.h.

◆ global_m

libMesh::numeric_index_type SparseMatrixTest< PetscMatrix< Number > >::global_m
protectedinherited

Definition at line 349 of file sparse_matrix_test.h.

◆ global_n

libMesh::numeric_index_type SparseMatrixTest< PetscMatrix< Number > >::global_n
protectedinherited

Definition at line 349 of file sparse_matrix_test.h.

◆ libmesh_suite_name

std::string SparseMatrixTest< PetscMatrix< 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<PetscMatrix< Number > > SparseMatrixTest< PetscMatrix< 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

libMesh::numeric_index_type SparseMatrixTest< PetscMatrix< Number > >::nonsquare
protectedinherited

Definition at line 347 of file sparse_matrix_test.h.


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