libMesh
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 testWriteAndRead ()
 
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.

References libMesh::PerfLog::summarized_logs_enabled(), and unitlog.

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

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 38 of file sparse_matrix_test.h.

39  {
40  // By default we'll use the whole communicator in parallel;
41  // Serial-only NumericVector subclasses will need to override
42  // this and set something else first.
43  if (!my_comm)
45 
46  matrix = std::make_unique<DerivedClass>(*my_comm);
47 
48  // Use the same even partitioning that we'll auto-deduce in matrix
49  // read, to make it easier to test parallel reads
50 
51  global_m = global_n = my_comm->size() * 5.75 - 1;
52  if (nonsquare)
53  global_n *= 1.3;
54 
56  row_start = my_comm->rank() * global_m / my_comm->size(),
57  row_stop = (my_comm->rank()+1) * global_m / my_comm->size();
59  col_start = my_comm->rank() * global_n / my_comm->size(),
60  col_stop = (my_comm->rank()+1) * global_n / my_comm->size();
61 
62  local_m = row_stop - row_start;
63  local_n = col_stop - col_start;
64 
65  // Let's just play around with locally dense blocks for now
66  matrix->init(global_m,
67  global_n,
68  local_m,
69  local_n,
70  /*nnz=*/local_n,
71  /*noz=*/5);
72  }
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:171
libMesh::Parallel::Communicator * my_comm
processor_id_type rank() const
processor_id_type size() const
std::unique_ptr< PetscMatrix< Number > > matrix
uint8_t dof_id_type
Definition: id_types.h:67

◆ setValues()

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

Definition at line 78 of file sparse_matrix_test.h.

79  {
80  std::vector<libMesh::numeric_index_type> rows(local_m);
81  std::iota(rows.begin(), rows.end(), matrix->row_start());
82  std::vector<libMesh::numeric_index_type> cols(local_n);
83  std::iota(cols.begin(), cols.end(), matrix->col_start());
84 
86 
87  for (auto i : libMesh::make_range(local_m))
88  for (auto j : libMesh::make_range(local_n))
89  local(i, j) = (i + 1) * (j + 1) * (my_comm->rank() + 1);
90 
91  matrix->zero();
92 
93  matrix->add_matrix(local, rows, cols);
94  matrix->close();
95  }
libMesh::Parallel::Communicator * my_comm
processor_id_type rank() const
void iota(ForwardIter first, ForwardIter last, T value)
Utility::iota was created back when std::iota was just an SGI STL extension.
Definition: utility.h:229
std::unique_ptr< PetscMatrix< Number > > matrix
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:140
Defines a dense matrix for use in Finite Element-type computations.
Definition: dof_map.h:75

◆ tearDown()

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

Definition at line 75 of file sparse_matrix_test.h.

75 {}

◆ testClone()

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

Definition at line 244 of file sparse_matrix_test.h.

245  {
246  LOG_UNIT_TEST;
247 
248  setValues();
249 
250  // Matrix must be closed before it can be cloned.
251  matrix->close();
252 
253  {
254  // Create copy, test that it can go out of scope
255  auto copy = matrix->clone();
256 
257  // Check that matrices have the same local/global sizes
258  CPPUNIT_ASSERT_EQUAL(copy->m(), matrix->m());
259  CPPUNIT_ASSERT_EQUAL(copy->n(), matrix->n());
260  CPPUNIT_ASSERT_EQUAL(copy->local_m(), matrix->local_m());
261  CPPUNIT_ASSERT_EQUAL(copy->row_start(), matrix->row_start());
262  CPPUNIT_ASSERT_EQUAL(copy->row_stop(), matrix->row_stop());
263 
264  // Check that copy has same values as original
265  LIBMESH_ASSERT_FP_EQUAL(copy->l1_norm(), matrix->l1_norm(), _tolerance);
266  CPPUNIT_ASSERT(relative_fuzzy_equals(*matrix, *copy));
267  copy->scale(2);
268  CPPUNIT_ASSERT(!relative_fuzzy_equals(*matrix, *copy));
269  }
270 
271  {
272  // Create zero copy
273  auto zero_copy = matrix->zero_clone();
274 
275  // Check that matrices have the same local/global sizes
276  CPPUNIT_ASSERT_EQUAL(zero_copy->m(), matrix->m());
277  CPPUNIT_ASSERT_EQUAL(zero_copy->n(), matrix->n());
278  CPPUNIT_ASSERT_EQUAL(zero_copy->local_m(), matrix->local_m());
279  CPPUNIT_ASSERT_EQUAL(zero_copy->row_start(), matrix->row_start());
280  CPPUNIT_ASSERT_EQUAL(zero_copy->row_stop(), matrix->row_stop());
281 
282  // Check that zero_copy has same values as original
283  LIBMESH_ASSERT_FP_EQUAL(0.0, zero_copy->l1_norm(), _tolerance);
284  }
285  }
std::unique_ptr< PetscMatrix< Number > > matrix
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.
Definition: fuzzy_equals.h:78

◆ testGetAndSet()

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

Definition at line 138 of file sparse_matrix_test.h.

139  {
140  LOG_UNIT_TEST;
141 
142  setValues();
143 
144  testValues();
145  }

◆ testPetscBinaryRead()

void PetscMatrixTest::testPetscBinaryRead ( )
inline

Definition at line 42 of file petsc_matrix_test.C.

References libMesh::TOLERANCE.

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
uint8_t dof_id_type
Definition: id_types.h:67

◆ testPetscBinaryWrite()

void PetscMatrixTest::testPetscBinaryWrite ( )
inline

Definition at line 76 of file petsc_matrix_test.C.

References libMesh::TOLERANCE.

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  }
static constexpr Real TOLERANCE

◆ testPetscCopyFromHash()

void PetscMatrixTest::testPetscCopyFromHash ( )
inline

Definition at line 113 of file petsc_matrix_test.C.

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(), and libMesh::SparseMatrix< T >::use_hash_table().

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  }
libMesh::Parallel::Communicator * my_comm
processor_id_type rank() const
processor_id_type size() const
dof_id_type numeric_index_type
Definition: id_types.h:99
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:140
This class provides a nice interface to the PETSc C-based AIJ data structures for parallel...
Definition: petsc_matrix.h:61

◆ testPetscHDF5Write()

void PetscMatrixTest::testPetscHDF5Write ( )
inline

Definition at line 99 of file petsc_matrix_test.C.

References libMesh::TOLERANCE.

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  }
static constexpr Real TOLERANCE

◆ testReadHDF5()

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

Definition at line 192 of file sparse_matrix_test.h.

193  {
194 #ifdef LIBMESH_HAVE_HDF5
195  LOG_UNIT_TEST;
196 
197  matrix->clear();
198  auto matrix2 = std::make_unique<DerivedClass>(*my_comm);
199  matrix->read("matrices/geom_1_extraction_op.m");
200  matrix2->read("matrices/geom_1_extraction_op.h5");
201 
202  // We need some more SparseMatrix operators, but not today
203  CPPUNIT_ASSERT(matrix->l1_norm() == matrix2->l1_norm());
204  CPPUNIT_ASSERT(matrix->linfty_norm() == matrix2->linfty_norm());
205 #endif // LIBMESH_HAVE_HDF5
206  }
std::unique_ptr< PetscMatrix< Number > > matrix

◆ testReadMatlab()

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

Definition at line 147 of file sparse_matrix_test.h.

148  {
149  // Laspack doesn't handle non-square matrices)
150  if (matrix->solver_package() == libMesh::LASPACK_SOLVERS)
151  return;
152 
153  matrix->clear();
154 
155  auto matrix2 = std::make_unique<DerivedClass>(*my_comm);
156 
157  matrix->read(filename);
158 
159 #ifndef LIBMESH_HAVE_GZSTREAM
160  return;
161 #endif
162 
163  matrix2->read(std::string(filename)+".gz");
164 
165  // We need some more SparseMatrix operators, but not today
166  CPPUNIT_ASSERT(matrix->l1_norm() == matrix2->l1_norm());
167  CPPUNIT_ASSERT(matrix->linfty_norm() == matrix2->linfty_norm());
168  }
std::unique_ptr< PetscMatrix< Number > > matrix

◆ testReadMatlab1()

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

Definition at line 171 of file sparse_matrix_test.h.

172  {
173  LOG_UNIT_TEST;
174  testReadMatlab("matrices/geom_1_extraction_op.m");
175  }
void testReadMatlab(const std::string &filename)

◆ testReadMatlab2()

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

Definition at line 178 of file sparse_matrix_test.h.

179  {
180  LOG_UNIT_TEST;
181  testReadMatlab("matrices/geom_2_extraction_op.m");
182  }
void testReadMatlab(const std::string &filename)

◆ testReadMatlab4()

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

Definition at line 185 of file sparse_matrix_test.h.

186  {
187  LOG_UNIT_TEST;
188  testReadMatlab("matrices/geom_4_extraction_op.m");
189  }
void testReadMatlab(const std::string &filename)

◆ testValues()

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

Definition at line 98 of file sparse_matrix_test.h.

99  {
100  auto functor = [this]()
101  {
102  std::vector<libMesh::numeric_index_type> cols_to_get;
103  std::vector<libMesh::Number> values;
104  const libMesh::numeric_index_type col_start =
105  matrix->col_start();
107  libMesh::make_range(matrix->row_start(),
108  matrix->row_stop()))
109  {
110  matrix->get_row(i, cols_to_get, values);
111  for (libMesh::numeric_index_type col_j :
112  libMesh::index_range(cols_to_get))
113  {
114  CPPUNIT_ASSERT_EQUAL(cols_to_get[col_j], col_start + col_j);
115  LIBMESH_ASSERT_NUMBERS_EQUAL
116  ((i - matrix->row_start() + 1) * (col_j + 1) * (my_comm->rank() + 1),
117  values[col_j], _tolerance);
118  }
119  }
120  };
121 
122 #ifdef LIBMESH_HAVE_CXX11_THREAD
123  auto num_threads = std::min(unsigned(2),
124  std::max(
125  std::thread::hardware_concurrency(),
126  unsigned(1)));
127  std::vector<std::thread> threads(num_threads);
128  for (unsigned int thread = 0; thread < num_threads; ++thread)
129  threads[thread] = std::thread(functor);
130  std::for_each(threads.begin(), threads.end(),
131  [](std::thread & x){x.join();});
132 #else
133  functor();
134 #endif
135  }
libMesh::Parallel::Communicator * my_comm
processor_id_type rank() const
dof_id_type numeric_index_type
Definition: id_types.h:99
std::unique_ptr< PetscMatrix< Number > > matrix
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:140
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:117

◆ testWriteAndRead()

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

Definition at line 209 of file sparse_matrix_test.h.

210  {
211  LOG_UNIT_TEST;
212 
213  setValues();
214 
215  // If we're working with serial matrices then just print one of
216  // them so they don't step on the others' toes.
217  //
218  // Use a very short filename, because we had a bug with that and
219  // we want to test it.
220  if (matrix->n_processors() > 1 ||
221  TestCommWorld->rank() == 0)
222  matrix->print_matlab("M.m");
223 
224  matrix->clear();
225 
226  // Let's make sure we don't have any race conditions; we have
227  // multiple SparseMatrix subclasses that might be trying to read
228  // and write the same file.
229 
231 
232 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
233  // We're not supporting complex reads quite yet
234  return;
235 #endif
236 
237  matrix->read("M.m");
238 
240 
241  testValues();
242  }
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:171
void barrier() const
processor_id_type rank() const
std::unique_ptr< PetscMatrix< Number > > matrix

Member Data Documentation

◆ _tolerance

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

Definition at line 299 of file sparse_matrix_test.h.

◆ global_m

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

Definition at line 295 of file sparse_matrix_test.h.

◆ global_n

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

Definition at line 295 of file sparse_matrix_test.h.

◆ libmesh_suite_name

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

Definition at line 289 of file sparse_matrix_test.h.

◆ local_m

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

Definition at line 295 of file sparse_matrix_test.h.

◆ local_n

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

Definition at line 295 of file sparse_matrix_test.h.

◆ matrix

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

Definition at line 293 of file sparse_matrix_test.h.

◆ my_comm

libMesh::Parallel::Communicator* SparseMatrixTest< PetscMatrix< Number > >::my_comm
protectedinherited

Definition at line 291 of file sparse_matrix_test.h.

◆ nonsquare

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

Definition at line 295 of file sparse_matrix_test.h.


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