libMesh
Public Member Functions | Protected Attributes | List of all members
PetscVectorTest Class Reference
Inheritance diagram for PetscVectorTest:
[legend]

Public Member Functions

 PetscVectorTest ()
 
 CPPUNIT_TEST_SUITE (PetscVectorTest)
 
NUMERICVECTORTEST CPPUNIT_TEST (testGetArray)
 
 CPPUNIT_TEST (testPetscOperations)
 
 CPPUNIT_TEST_SUITE_END ()
 
void testGetArray ()
 
void testPetscOperations ()
 
void setUp ()
 
void tearDown ()
 
void Operations ()
 
void WriteAndRead ()
 
void Norms ()
 
void Localize (bool to_one=false)
 
void LocalizeIndices ()
 
void testLocalize ()
 
void testLocalizeBase ()
 
void testLocalizeToOne ()
 
void testLocalizeToOneBase ()
 
void testLocalizeIndices ()
 
void testLocalizeIndicesBase ()
 
void testNorms ()
 
void testNormsBase ()
 
void testOperations ()
 
void testOperationsBase ()
 
void testWriteAndRead ()
 
void testWriteAndReadBase ()
 

Protected Attributes

libMesh::Parallel::Communicatormy_comm
 
std::string libmesh_suite_name
 
unsigned int block_size
 
unsigned int local_size
 
unsigned int global_size
 

Detailed Description

Definition at line 10 of file petsc_vector_test.C.

Constructor & Destructor Documentation

◆ PetscVectorTest()

PetscVectorTest::PetscVectorTest ( )
inline

Definition at line 12 of file petsc_vector_test.C.

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

12  :
15  this->libmesh_suite_name = "NumericVectorTest";
16  else
17  this->libmesh_suite_name = "PetscVectorTest";
18  }
bool summarized_logs_enabled()
Definition: perf_log.h:202
libMesh::PerfLog * unitlog
Definition: driver.C:173

Member Function Documentation

◆ CPPUNIT_TEST() [1/2]

NUMERICVECTORTEST PetscVectorTest::CPPUNIT_TEST ( testGetArray  )

◆ CPPUNIT_TEST() [2/2]

PetscVectorTest::CPPUNIT_TEST ( testPetscOperations  )

◆ CPPUNIT_TEST_SUITE()

PetscVectorTest::CPPUNIT_TEST_SUITE ( PetscVectorTest  )

◆ CPPUNIT_TEST_SUITE_END()

PetscVectorTest::CPPUNIT_TEST_SUITE_END ( )

◆ Localize()

void NumericVectorTest< PetscVector< Number > >::Localize ( bool  to_one = false)
inlineinherited

Definition at line 245 of file numeric_vector_test.h.

246  {
247  const libMesh::processor_id_type root_pid = 0;
248 
249  {
250  auto v_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
251  Base & v = *v_ptr;
252  std::vector<libMesh::Number> l(global_size);
253 
255  first = v.first_local_index(),
256  last = v.last_local_index();
257 
258  for (libMesh::dof_id_type n=first; n != last; n++)
259  v.set (n, static_cast<libMesh::Number>(n));
260  v.close();
261  for (libMesh::dof_id_type n=first; n != last; n++)
262  v.add (n, static_cast<libMesh::Number>(n));
263  v.close();
264 
265  if (!to_one)
266  v.localize(l);
267  else
268  v.localize_to_one(l,root_pid);
269 
270  if (!to_one || my_comm->rank() == root_pid)
271  // Yes I really mean v.size()
272  for (libMesh::dof_id_type i=0; i<v.size(); i++)
273  LIBMESH_ASSERT_NUMBERS_EQUAL
275 
276  for (libMesh::dof_id_type n=first; n != last; n++)
277  {
278  const auto value = static_cast<libMesh::Number>(n);
279  v.insert (&value, std::vector<libMesh::numeric_index_type>({n}));
280  }
281  v.close();
282 
283  if (!to_one)
284  v.localize(l);
285  else
286  v.localize_to_one(l,root_pid);
287 
288  if (!to_one || my_comm->rank() == root_pid)
289  // Yes I really mean v.size()
290  for (libMesh::dof_id_type i=0; i<v.size(); i++)
291  LIBMESH_ASSERT_NUMBERS_EQUAL
293  }
294  }
static constexpr Real TOLERANCE
processor_id_type rank() const
uint8_t processor_id_type
Definition: id_types.h:104
libMesh::Parallel::Communicator * my_comm
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const bool value
Definition: xdr_io.C:54
uint8_t dof_id_type
Definition: id_types.h:67

◆ LocalizeIndices()

void NumericVectorTest< PetscVector< Number > >::LocalizeIndices ( )
inlineinherited

Definition at line 298 of file numeric_vector_test.h.

299  {
300  {
301  auto v_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
302  Base & v = *v_ptr;
303 
304  // Let's try pulling the same number of entries from each processor
305  std::vector<libMesh::Number> values(block_size * my_comm->size());
306  std::vector<libMesh::dof_id_type> indices;
307  indices.reserve(block_size * my_comm->size());
308 
310  first = v.first_local_index(),
311  last = v.last_local_index();
312 
313  for (libMesh::dof_id_type n=first; n != last; n++)
314  v.set (n, static_cast<libMesh::Number>(n));
315  v.close();
316 
317  libMesh::dof_id_type end_index = 0;
318  for (libMesh::processor_id_type p=0; p<my_comm->size(); p++)
319  {
320  end_index += block_size + p;
321  for (unsigned int j = 0; j != block_size; ++j)
322  indices.push_back(end_index-j-1);
323  }
324 
325  v.localize(values, indices);
326 
327  end_index = 0;
328  for (libMesh::processor_id_type p=0; p<my_comm->size(); p++)
329  {
330  end_index += block_size + p;
331  for (unsigned int j = 0; j != block_size; ++j)
332  LIBMESH_ASSERT_NUMBERS_EQUAL
333  (values[p*block_size+j], libMesh::Real(end_index-j-1),
335  }
336  }
337  }
static constexpr Real TOLERANCE
uint8_t processor_id_type
Definition: id_types.h:104
processor_id_type size() const
libMesh::Parallel::Communicator * my_comm
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
uint8_t dof_id_type
Definition: id_types.h:67

◆ Norms()

void NumericVectorTest< PetscVector< Number > >::Norms ( )
inlineinherited

Definition at line 191 of file numeric_vector_test.h.

192  {
193  auto v_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
194  Base & v = *v_ptr;
195 
197  first = v.first_local_index(),
198  last = v.last_local_index();
199 
200  for (libMesh::dof_id_type n=first; n != last; n++)
201  v.set (n, -static_cast<libMesh::Number>(n));
202  v.close();
203  for (libMesh::dof_id_type n=first; n != last; n++)
204  v.add (n, -static_cast<libMesh::Number>(n));
205  v.close();
206 
207  const libMesh::Real exact_l1 =
209  const libMesh::Real exact_l2 =
210  std::sqrt(libMesh::Real(global_size-1) *
211  (2*global_size) *
212  (2*global_size-1) / 3);
213  LIBMESH_ASSERT_NUMBERS_EQUAL(v.sum(), -exact_l1,
215  LIBMESH_ASSERT_FP_EQUAL(v.l1_norm(), exact_l1,
217  LIBMESH_ASSERT_FP_EQUAL(v.l2_norm(), exact_l2,
219  LIBMESH_ASSERT_FP_EQUAL(v.linfty_norm(), 2*(global_size-libMesh::Real(1)),
221 
222  auto u_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
223  Base & u = *u_ptr;
224  for (libMesh::dof_id_type n=first; n != last; n++)
225  u.set (n, -static_cast<libMesh::Number>(n * n));
226  u.close();
227 
228  Derived diff_derived(*my_comm, global_size, local_size);
229  Base & diff = diff_derived;
230  diff = u;
231  diff -= v;
232  diff.close();
233 
234  // Use a relative tolerance here; the norms are O(1e5) when our
235  // processor count gets big enough, at which point O(1e-12) is
236  // testing for exact equality...
237  const auto diff_norm = diff.l2_norm();
238  const auto norm_diff = u.l2_norm_diff(v);
239  LIBMESH_ASSERT_FP_EQUAL(diff_norm, norm_diff,
240  (std::abs(diff_norm)+std::abs(norm_diff)) *
242  }
static constexpr Real TOLERANCE
libMesh::Parallel::Communicator * my_comm
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
uint8_t dof_id_type
Definition: id_types.h:67

◆ Operations()

void NumericVectorTest< PetscVector< Number > >::Operations ( )
inlineinherited

Definition at line 64 of file numeric_vector_test.h.

65  {
66  auto v_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
67  Base & v = *v_ptr;
68 
70  first = v.first_local_index(),
71  last = v.last_local_index();
72 
73  for (libMesh::dof_id_type n=first; n != last; n++)
74  v.set (n, static_cast<libMesh::Number>(n+1));
75  v.close();
76 
77  auto v_clone = v.clone();
78  auto & vorig = *v_clone;
79 
80  CPPUNIT_ASSERT(relative_fuzzy_equals(v, vorig));
81 
82  v += v;
83 
84  CPPUNIT_ASSERT(!relative_fuzzy_equals(v, vorig));
85 
86  for (libMesh::dof_id_type n=first; n != last; n++)
87  LIBMESH_ASSERT_NUMBERS_EQUAL
88  (v(n), libMesh::Real(2*n+2),
90 
91  v *= v;
92 
93  for (libMesh::dof_id_type n=first; n != last; n++)
94  LIBMESH_ASSERT_NUMBERS_EQUAL
95  (v(n), libMesh::Real(4*n*n+8*n+4),
97 
98  v -= vorig;
99 
100  for (libMesh::dof_id_type n=first; n != last; n++)
101  LIBMESH_ASSERT_NUMBERS_EQUAL
102  (v(n), libMesh::Real(4*n*n+7*n+3),
104 
105  v /= vorig;
106 
107  for (libMesh::dof_id_type n=first; n != last; n++)
108  LIBMESH_ASSERT_NUMBERS_EQUAL
109  (v(n), libMesh::Real(4*n+3),
111 
112  v.add(1);
113  for (libMesh::dof_id_type n=first; n != last; n++)
114  LIBMESH_ASSERT_NUMBERS_EQUAL
115  (v(n), libMesh::Real(4*n+4),
117 
118  v.add(2, vorig);
119  for (libMesh::dof_id_type n=first; n != last; n++)
120  LIBMESH_ASSERT_NUMBERS_EQUAL
121  (v(n), libMesh::Real(6*n+6),
123 
124  v.scale(1/libMesh::Real(3));
125  for (libMesh::dof_id_type n=first; n != last; n++)
126  LIBMESH_ASSERT_NUMBERS_EQUAL
127  (v(n), libMesh::Real(2*n+2),
129 
130  v = 4;
131  for (libMesh::dof_id_type n=first; n != last; n++)
132  LIBMESH_ASSERT_NUMBERS_EQUAL
133  (v(n), libMesh::Real(4),
135 
136  v = vorig;
137  for (libMesh::dof_id_type n=first; n != last; n++)
138  LIBMESH_ASSERT_NUMBERS_EQUAL
139  (v(n), libMesh::Real(n+1),
141 
142  v.reciprocal();
143  for (libMesh::dof_id_type n=first; n != last; n++)
144  LIBMESH_ASSERT_NUMBERS_EQUAL
145  (v(n), 1/libMesh::Real(n+1),
147 
148  LIBMESH_ASSERT_NUMBERS_EQUAL
149  (v.dot(vorig), libMesh::Real(global_size),
151  }
static constexpr Real TOLERANCE
libMesh::Parallel::Communicator * my_comm
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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
uint8_t dof_id_type
Definition: id_types.h:67

◆ setUp()

void NumericVectorTest< PetscVector< Number > >::setUp ( )
inlineinherited

Definition at line 41 of file numeric_vector_test.h.

42  {
43  // By default we'll use the whole communicator in parallel;
44  // Serial-only NumericVector subclasses will need to override
45  // this and set something else first.
46  if (!my_comm)
48 
49  block_size = 10;
50 
51  // a different size on each processor.
53  static_cast<unsigned int>(my_comm->rank());
54 
55  global_size = 0;
56  for (libMesh::processor_id_type p=0; p<my_comm->size(); p++)
57  global_size += (block_size + static_cast<unsigned int>(p));
58  }
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:171
processor_id_type rank() const
uint8_t processor_id_type
Definition: id_types.h:104
processor_id_type size() const
libMesh::Parallel::Communicator * my_comm

◆ tearDown()

void NumericVectorTest< PetscVector< Number > >::tearDown ( )
inlineinherited

Definition at line 60 of file numeric_vector_test.h.

61  {}

◆ testGetArray()

void PetscVectorTest::testGetArray ( )
inline

Definition at line 30 of file petsc_vector_test.C.

References libMesh::PetscVector< T >::close(), libMesh::PetscVector< T >::get_array(), libMesh::PetscVector< T >::get_array_read(), libMesh::PetscVector< T >::restore_array(), libMesh::PetscVector< T >::set(), and libMesh::TOLERANCE.

31  {
32  LOG_UNIT_TEST;
33 
34  unsigned int min_block_size = 2;
35 
36  // a different size on each processor.
37  unsigned int my_p = my_comm->rank();
38  unsigned int local_size = (min_block_size + my_p);
39  unsigned int global_size = 0;
40  unsigned int my_offset = 0;
41 
42  for (libMesh::processor_id_type p=0; p<my_comm->size(); p++)
43  {
44  const unsigned int p_size =
45  (min_block_size + static_cast<unsigned int>(p));
46  global_size += p_size;
47  if (p < my_p)
48  my_offset += p_size;
49  }
50 
52 
53  PetscScalar * values = v.get_array();
54 
55  for (unsigned int i=0; i<local_size; i++)
56  values[i] = i;
57 
58  v.restore_array();
59 
60  v.close();
61 
62  // Check the values through the interface
63  for (unsigned int i=0; i<local_size; i++)
64  LIBMESH_ASSERT_FP_EQUAL(i, std::abs(v(my_offset + i)), TOLERANCE*TOLERANCE);
65 
66  // Check that we can see the same thing with get_array_read
67  const PetscScalar * read_only_values = v.get_array_read();
68 
69  for (unsigned int i=0; i<local_size; i++)
70  LIBMESH_ASSERT_FP_EQUAL(i, std::abs(read_only_values[i]), TOLERANCE*TOLERANCE);
71 
72  v.restore_array();
73 
74  // Test getting a read only array after getting a writable array
75  values = v.get_array();
76  read_only_values = v.get_array_read();
77  CPPUNIT_ASSERT_EQUAL(read_only_values, const_cast<const PetscScalar *>(values));
78 
79  v.restore_array();
80 
81  // Test to make sure we can get arrays after other operators
82  for (unsigned int i = 0; i < local_size; i++)
83  v.set(my_offset + i, i * 2.0);
84  v.close();
85  for (unsigned int i = 0; i < local_size; i++)
86  LIBMESH_ASSERT_FP_EQUAL(i * 2.0, std::abs(v(my_offset + i)), TOLERANCE * TOLERANCE);
87  values = v.get_array();
88  read_only_values = v.get_array_read();
89  for (unsigned int i = 0; i < local_size; i++)
90  {
91  LIBMESH_ASSERT_FP_EQUAL(i * 2.0, std::abs(values[i]), TOLERANCE * TOLERANCE);
92  LIBMESH_ASSERT_FP_EQUAL(i * 2.0, std::abs(read_only_values[i]), TOLERANCE * TOLERANCE);
93  }
94  v.restore_array();
95  }
This class provides a nice interface to PETSc&#39;s Vec object.
Definition: petsc_vector.h:73
static constexpr Real TOLERANCE
processor_id_type rank() const
uint8_t processor_id_type
Definition: id_types.h:104
processor_id_type size() const
libMesh::Parallel::Communicator * my_comm

◆ testLocalize()

void NumericVectorTest< PetscVector< Number > >::testLocalize ( )
inlineinherited

Definition at line 339 of file numeric_vector_test.h.

340  {
341  LOG_UNIT_TEST;
342 
343  Localize<DerivedClass,DerivedClass>();
344  }

◆ testLocalizeBase()

void NumericVectorTest< PetscVector< Number > >::testLocalizeBase ( )
inlineinherited

Definition at line 346 of file numeric_vector_test.h.

347  {
348  LOG_UNIT_TEST;
349 
350  Localize<libMesh::NumericVector<libMesh::Number>,DerivedClass>();
351  }

◆ testLocalizeIndices()

void NumericVectorTest< PetscVector< Number > >::testLocalizeIndices ( )
inlineinherited

Definition at line 367 of file numeric_vector_test.h.

368  {
369  LOG_UNIT_TEST;
370 
371  LocalizeIndices<DerivedClass,DerivedClass >();
372  }

◆ testLocalizeIndicesBase()

void NumericVectorTest< PetscVector< Number > >::testLocalizeIndicesBase ( )
inlineinherited

Definition at line 374 of file numeric_vector_test.h.

375  {
376  LOG_UNIT_TEST;
377 
378  LocalizeIndices<libMesh::NumericVector<libMesh::Number>,DerivedClass>();
379  }

◆ testLocalizeToOne()

void NumericVectorTest< PetscVector< Number > >::testLocalizeToOne ( )
inlineinherited

Definition at line 353 of file numeric_vector_test.h.

354  {
355  LOG_UNIT_TEST;
356 
357  Localize<DerivedClass,DerivedClass >(true);
358  }

◆ testLocalizeToOneBase()

void NumericVectorTest< PetscVector< Number > >::testLocalizeToOneBase ( )
inlineinherited

Definition at line 360 of file numeric_vector_test.h.

361  {
362  LOG_UNIT_TEST;
363 
364  Localize<libMesh::NumericVector<libMesh::Number>,DerivedClass>(true);
365  }

◆ testNorms()

void NumericVectorTest< PetscVector< Number > >::testNorms ( )
inlineinherited

Definition at line 381 of file numeric_vector_test.h.

382  {
383  LOG_UNIT_TEST;
384 
385  Norms<DerivedClass,DerivedClass >();
386  }

◆ testNormsBase()

void NumericVectorTest< PetscVector< Number > >::testNormsBase ( )
inlineinherited

Definition at line 388 of file numeric_vector_test.h.

389  {
390  LOG_UNIT_TEST;
391 
392  Norms<libMesh::NumericVector<libMesh::Number>,DerivedClass>();
393  }

◆ testOperations()

void NumericVectorTest< PetscVector< Number > >::testOperations ( )
inlineinherited

Definition at line 395 of file numeric_vector_test.h.

396  {
397  LOG_UNIT_TEST;
398 
399  Operations<DerivedClass,DerivedClass >();
400  }

◆ testOperationsBase()

void NumericVectorTest< PetscVector< Number > >::testOperationsBase ( )
inlineinherited

Definition at line 402 of file numeric_vector_test.h.

403  {
404  LOG_UNIT_TEST;
405 
406  Operations<libMesh::NumericVector<libMesh::Number>,DerivedClass>();
407  }

◆ testPetscOperations()

void PetscVectorTest::testPetscOperations ( )
inline

Definition at line 97 of file petsc_vector_test.C.

References libMesh::PetscVector< T >::clone(), libMesh::PetscVector< T >::close(), libMesh::PetscVector< T >::first_local_index(), libMesh::PetscVector< T >::last_local_index(), libMesh::Real, libMesh::PetscVector< T >::set(), and libMesh::TOLERANCE.

98  {
100  auto v2 = v1.clone();
101 
103  first = v1.first_local_index(),
104  last = v1.last_local_index();
105 
106  for (libMesh::dof_id_type n=first; n != last; n++)
107  {
108  v1.set (n, static_cast<libMesh::Number>(n+1));
109  v2->set (n, static_cast<libMesh::Number>(2*(n+1)));
110  }
111  v1.close();
112  v2->close();
113 
114  auto v_working_ptr = v1.clone();
115  auto & v_working = *v_working_ptr;
116 
117  v_working.pointwise_mult(v1, *v2);
118 
119  for (libMesh::dof_id_type n=first; n != last; n++)
120  LIBMESH_ASSERT_NUMBERS_EQUAL
121  (v_working(n), libMesh::Real((n+1)*2*(n+1)),
123 
124  v_working.pointwise_divide(v1, *v2);
125 
126  for (libMesh::dof_id_type n=first; n != last; n++)
127  LIBMESH_ASSERT_NUMBERS_EQUAL
128  (v_working(n), libMesh::Real(0.5),
130  }
This class provides a nice interface to PETSc&#39;s Vec object.
Definition: petsc_vector.h:73
static constexpr Real TOLERANCE
libMesh::Parallel::Communicator * my_comm
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
uint8_t dof_id_type
Definition: id_types.h:67

◆ testWriteAndRead()

void NumericVectorTest< PetscVector< Number > >::testWriteAndRead ( )
inlineinherited

Definition at line 409 of file numeric_vector_test.h.

410  {
411  LOG_UNIT_TEST;
412 
413  WriteAndRead<DerivedClass,DerivedClass >();
414  }

◆ testWriteAndReadBase()

void NumericVectorTest< PetscVector< Number > >::testWriteAndReadBase ( )
inlineinherited

Definition at line 416 of file numeric_vector_test.h.

417  {
418  LOG_UNIT_TEST;
419 
420  WriteAndRead<libMesh::NumericVector<libMesh::Number>,DerivedClass>();
421  }

◆ WriteAndRead()

void NumericVectorTest< PetscVector< Number > >::WriteAndRead ( )
inlineinherited

Definition at line 154 of file numeric_vector_test.h.

155  {
156  auto v_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
157  Base & v = *v_ptr;
158 
160  first = v.first_local_index(),
161  last = v.last_local_index();
162 
163  for (libMesh::dof_id_type n=first; n != last; n++)
164  v.set (n, static_cast<libMesh::Number>(n+1));
165  v.close();
166 
167  v.print_matlab(libmesh_suite_name+"_vector.m");
168 
169  // Let's make sure we don't have any race conditions; we have
170  // multiple SparseMatrix subclasses that might be trying to read
171  // and write the same file.
172 
174 
175 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
176  // We're not supporting complex reads quite yet
177  return;
178 #endif
179 
180  auto v_new_ptr = std::make_unique<Derived>(*my_comm, global_size, local_size);
181  Base & v_new = *v_new_ptr;
182 
183  v_new.read_matlab(libmesh_suite_name+"_vector.m");
184 
186 
187  CPPUNIT_ASSERT_EQUAL(v.l1_norm_diff(v_new), libMesh::Real(0));
188  }
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:171
void barrier() const
libMesh::Parallel::Communicator * my_comm
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
uint8_t dof_id_type
Definition: id_types.h:67

Member Data Documentation

◆ block_size

unsigned int NumericVectorTest< PetscVector< Number > >::block_size
protectedinherited

Definition at line 38 of file numeric_vector_test.h.

◆ global_size

unsigned int NumericVectorTest< PetscVector< Number > >::global_size
protectedinherited

Definition at line 38 of file numeric_vector_test.h.

◆ libmesh_suite_name

std::string NumericVectorTest< PetscVector< Number > >::libmesh_suite_name
protectedinherited

Definition at line 36 of file numeric_vector_test.h.

◆ local_size

unsigned int NumericVectorTest< PetscVector< Number > >::local_size
protectedinherited

Definition at line 38 of file numeric_vector_test.h.

◆ my_comm

libMesh::Parallel::Communicator* NumericVectorTest< PetscVector< Number > >::my_comm
protectedinherited

Definition at line 34 of file numeric_vector_test.h.


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