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

38  {
39  // By default we'll use the whole communicator in parallel;
40  // Serial-only NumericVector subclasses will need to override
41  // this and set something else first.
42  if (!my_comm)
44 
45  matrix = std::make_unique<DerivedClass>(*my_comm);
46 
47  // Use the same even partitioning that we'll auto-deduce in matrix
48  // read, to make it easier to test parallel reads
49 
50  global_m = global_n = my_comm->size() * 5.75 - 1;
51  if (nonsquare)
52  global_n *= 1.3;
53 
55  row_start = my_comm->rank() * global_m / my_comm->size(),
56  row_stop = (my_comm->rank()+1) * global_m / my_comm->size();
58  col_start = my_comm->rank() * global_n / my_comm->size(),
59  col_stop = (my_comm->rank()+1) * global_n / my_comm->size();
60 
61  local_m = row_stop - row_start;
62  local_n = col_stop - col_start;
63 
64  // Let's just play around with locally dense blocks for now
65  matrix->init(global_m,
66  global_n,
67  local_m,
68  local_n,
69  /*nnz=*/local_n,
70  /*noz=*/5);
71  }
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 77 of file sparse_matrix_test.h.

78  {
79  std::vector<libMesh::numeric_index_type> rows(local_m);
80  std::iota(rows.begin(), rows.end(), matrix->row_start());
81  std::vector<libMesh::numeric_index_type> cols(local_n);
82  std::iota(cols.begin(), cols.end(), matrix->col_start());
83 
85 
86  for (auto i : libMesh::make_range(local_m))
87  for (auto j : libMesh::make_range(local_n))
88  local(i, j) = (i + 1) * (j + 1) * (my_comm->rank() + 1);
89 
90  matrix->zero();
91 
92  matrix->add_matrix(local, rows, cols);
93  matrix->close();
94  }
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 74 of file sparse_matrix_test.h.

74 {}

◆ testClone()

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

Definition at line 223 of file sparse_matrix_test.h.

224  {
225  LOG_UNIT_TEST;
226 
227  setValues();
228 
229  // Matrix must be closed before it can be cloned.
230  matrix->close();
231 
232  {
233  // Create copy, test that it can go out of scope
234  auto copy = matrix->clone();
235 
236  // Check that matrices have the same local/global sizes
237  CPPUNIT_ASSERT_EQUAL(copy->m(), matrix->m());
238  CPPUNIT_ASSERT_EQUAL(copy->n(), matrix->n());
239  CPPUNIT_ASSERT_EQUAL(copy->local_m(), matrix->local_m());
240  CPPUNIT_ASSERT_EQUAL(copy->row_start(), matrix->row_start());
241  CPPUNIT_ASSERT_EQUAL(copy->row_stop(), matrix->row_stop());
242 
243  // Check that copy has same values as original
244  LIBMESH_ASSERT_FP_EQUAL(copy->l1_norm(), matrix->l1_norm(), _tolerance);
245  CPPUNIT_ASSERT(relative_fuzzy_equals(*matrix, *copy));
246  copy->scale(2);
247  CPPUNIT_ASSERT(!relative_fuzzy_equals(*matrix, *copy));
248  }
249 
250  {
251  // Create zero copy
252  auto zero_copy = matrix->zero_clone();
253 
254  // Check that matrices have the same local/global sizes
255  CPPUNIT_ASSERT_EQUAL(zero_copy->m(), matrix->m());
256  CPPUNIT_ASSERT_EQUAL(zero_copy->n(), matrix->n());
257  CPPUNIT_ASSERT_EQUAL(zero_copy->local_m(), matrix->local_m());
258  CPPUNIT_ASSERT_EQUAL(zero_copy->row_start(), matrix->row_start());
259  CPPUNIT_ASSERT_EQUAL(zero_copy->row_stop(), matrix->row_stop());
260 
261  // Check that zero_copy has same values as original
262  LIBMESH_ASSERT_FP_EQUAL(0.0, zero_copy->l1_norm(), _tolerance);
263  }
264  }
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 137 of file sparse_matrix_test.h.

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

◆ 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

◆ testReadMatlab()

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

Definition at line 146 of file sparse_matrix_test.h.

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

◆ testReadMatlab1()

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

Definition at line 170 of file sparse_matrix_test.h.

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

◆ testReadMatlab2()

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

Definition at line 177 of file sparse_matrix_test.h.

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

◆ testReadMatlab4()

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

Definition at line 184 of file sparse_matrix_test.h.

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

◆ testValues()

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

Definition at line 97 of file sparse_matrix_test.h.

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

192  {
193  LOG_UNIT_TEST;
194 
195  setValues();
196 
197  // If we're working with serial matrices then just print one of
198  // them so they don't step on the others' toes.
199  if (matrix->n_processors() > 1 ||
200  TestCommWorld->rank() == 0)
201  matrix->print_matlab(libmesh_suite_name+"_matrix.m");
202 
203  matrix->clear();
204 
205  // Let's make sure we don't have any race conditions; we have
206  // multiple SparseMatrix subclasses that might be trying to read
207  // and write the same file.
208 
210 
211 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
212  // We're not supporting complex reads quite yet
213  return;
214 #endif
215 
216  matrix->read(libmesh_suite_name+"_matrix.m");
217 
219 
220  testValues();
221  }
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 278 of file sparse_matrix_test.h.

◆ global_m

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

Definition at line 274 of file sparse_matrix_test.h.

◆ global_n

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

Definition at line 274 of file sparse_matrix_test.h.

◆ libmesh_suite_name

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

Definition at line 268 of file sparse_matrix_test.h.

◆ local_m

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

Definition at line 274 of file sparse_matrix_test.h.

◆ local_n

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

Definition at line 274 of file sparse_matrix_test.h.

◆ matrix

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

Definition at line 272 of file sparse_matrix_test.h.

◆ my_comm

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

Definition at line 270 of file sparse_matrix_test.h.

◆ nonsquare

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

Definition at line 274 of file sparse_matrix_test.h.


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