libMesh
type_vector_test.h
Go to the documentation of this file.
1 #ifndef TYPE_VECTOR_TEST_H
2 #define TYPE_VECTOR_TEST_H
3 
4 #include <libmesh/type_vector.h>
5 
6 #include "libmesh_cppunit.h"
7 
8 #define TYPEVECTORTEST \
9  CPPUNIT_TEST( testNorm ); \
10  CPPUNIT_TEST( testNormSq ); \
11  \
12  CPPUNIT_TEST( testValue ); \
13  CPPUNIT_TEST( testZero ); \
14  \
15  CPPUNIT_TEST( testEquality ); \
16  CPPUNIT_TEST( testInEquality ); \
17  CPPUNIT_TEST( testAssignment ); \
18  \
19  CPPUNIT_TEST( testScalarMult ); \
20  CPPUNIT_TEST( testScalarDiv ); \
21  CPPUNIT_TEST( testScalarMultAssign ); \
22  CPPUNIT_TEST( testScalarDivAssign ); \
23  \
24  CPPUNIT_TEST( testVectorAdd ); \
25  CPPUNIT_TEST( testVectorAddScaled ); \
26  CPPUNIT_TEST( testVectorSub ); \
27  CPPUNIT_TEST( testVectorMult ); \
28  CPPUNIT_TEST( testVectorAddAssign ); \
29  CPPUNIT_TEST( testVectorSubAssign ); \
30  \
31  CPPUNIT_TEST( testNormBase ); \
32  CPPUNIT_TEST( testNormSqBase ); \
33  CPPUNIT_TEST( testValueBase ); \
34  CPPUNIT_TEST( testZeroBase ); \
35  \
36  CPPUNIT_TEST( testIsZero ); \
37  \
38  CPPUNIT_TEST( testEqualityBase ); \
39  CPPUNIT_TEST( testInEqualityBase ); \
40  CPPUNIT_TEST( testAssignmentBase ); \
41  \
42  CPPUNIT_TEST( testScalarMultBase ); \
43  CPPUNIT_TEST( testScalarDivBase ); \
44  CPPUNIT_TEST( testScalarMultAssignBase ); \
45  CPPUNIT_TEST( testScalarDivAssignBase ); \
46  \
47  CPPUNIT_TEST( testVectorAddBase ); \
48  CPPUNIT_TEST( testVectorAddScaledBase ); \
49  CPPUNIT_TEST( testVectorSubBase ); \
50  CPPUNIT_TEST( testVectorMultBase ); \
51  CPPUNIT_TEST( testVectorAddAssignBase ); \
52  CPPUNIT_TEST( testVectorSubAssignBase ); \
53  CPPUNIT_TEST( testReplaceAlgebraicType );
54 
55 
56 using namespace libMesh;
57 
58 template <class DerivedClass>
59 class TypeVectorTestBase : public CppUnit::TestCase {
60 
61 protected:
62  typedef typename DerivedClass::value_type T;
63 
64  std::string libmesh_suite_name;
65 
66 private:
67  std::unique_ptr<DerivedClass> m_1_1_1;
68  std::unique_ptr<DerivedClass> m_n1_1_n1;
69  TypeVector<T> *basem_1_1_1, *basem_n1_1_n1;
70 
71 public:
72  virtual void setUp()
73  {
74  m_1_1_1 = std::make_unique<DerivedClass>(1);
75  m_n1_1_n1 = std::make_unique<DerivedClass>(-1);
76 
77 #if LIBMESH_DIM > 1
78  (*m_1_1_1)(1) = 1;
79  (*m_n1_1_n1)(1) = 1;
80 #endif
81 #if LIBMESH_DIM > 2
82  (*m_1_1_1)(2) = 1;
83  (*m_n1_1_n1)(2) = -1;
84 #endif
85 
86 
87  basem_1_1_1 = m_1_1_1.get();
88  basem_n1_1_n1 = m_n1_1_n1.get();
89  }
90 
91  virtual void tearDown() {}
92 
93  void testValue()
94  {
95  LOG_UNIT_TEST;
96 
97  CPPUNIT_ASSERT_EQUAL( T(1), (*m_1_1_1)(0));
98  CPPUNIT_ASSERT_EQUAL( T(-1), (*m_n1_1_n1)(0));
99 
100 #if LIBMESH_DIM > 1
101  CPPUNIT_ASSERT_EQUAL( T(1), (*m_1_1_1)(1));
102  CPPUNIT_ASSERT_EQUAL( T(1) , (*m_n1_1_n1)(1));
103 #endif
104 
105 #if LIBMESH_DIM > 2
106  CPPUNIT_ASSERT_EQUAL( T(1), (*m_1_1_1)(2));
107  CPPUNIT_ASSERT_EQUAL( T(-1), (*m_n1_1_n1)(2));
108 #endif
109  }
110 
111  void testZero()
112  {
113  LOG_UNIT_TEST;
114 
115 #if LIBMESH_DIM > 2
116  DerivedClass avector(1,1,1);
117 #elif LIBMESH_DIM > 1
118  DerivedClass avector(1,1);
119 #else
120  DerivedClass avector(1);
121 #endif
122  avector.zero();
123 
124  for (int i = 0; i != LIBMESH_DIM; ++i)
125  CPPUNIT_ASSERT_EQUAL( T(0), avector(i));
126  }
127 
128  void testNorm()
129  {
130  LOG_UNIT_TEST;
131 
132  LIBMESH_ASSERT_FP_EQUAL(m_1_1_1->norm() , std::sqrt(Real(LIBMESH_DIM)) , TOLERANCE*TOLERANCE );
133  }
134 
135  void testNormSq()
136  {
137  LOG_UNIT_TEST;
138 
139  LIBMESH_ASSERT_FP_EQUAL(m_1_1_1->norm_sq() , Real(LIBMESH_DIM) , TOLERANCE*TOLERANCE );
140  }
141 
143  {
144  LOG_UNIT_TEST;
145 
146  CPPUNIT_ASSERT( (*m_1_1_1) == (*m_1_1_1) );
147 #if LIBMESH_DIM > 1
148  CPPUNIT_ASSERT( !((*m_1_1_1) == (*m_n1_1_n1)) );
149 #endif
150  }
151 
153  {
154  LOG_UNIT_TEST;
155 
156  CPPUNIT_ASSERT( !((*m_1_1_1) != (*m_1_1_1)) );
157 #if LIBMESH_DIM > 1
158  CPPUNIT_ASSERT( (*m_1_1_1) != (*m_n1_1_n1) );
159 #endif
160  }
161 
163  {
164  LOG_UNIT_TEST;
165 
166  DerivedClass avector {*basem_1_1_1};
167 
168  for (int i = 0; i != LIBMESH_DIM; ++i)
169  CPPUNIT_ASSERT_EQUAL( T(1), (avector)(i) );
170  }
171 
172  void testScalarInit() // Not valid for all derived classes!
173  {
174  LOG_UNIT_TEST;
175 
176  DerivedClass avector = 0;
177  for (int i = 0; i != LIBMESH_DIM; ++i)
178  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
179 
180  DerivedClass bvector = 2.0;
181  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(bvector(0)) , TOLERANCE*TOLERANCE );
182  for (int i = 1; i != LIBMESH_DIM; ++i)
183  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(bvector(i)) , TOLERANCE*TOLERANCE );
184  }
185 
187  {
188  LOG_UNIT_TEST;
189 
190  for (int i = 0; i != LIBMESH_DIM; ++i)
191  {
192  LIBMESH_ASSERT_FP_EQUAL( 5.0 , libmesh_real(((*m_1_1_1)*5.0)(i)) , TOLERANCE*TOLERANCE );
193  LIBMESH_ASSERT_FP_EQUAL( 5.0 , libmesh_real(outer_product(*m_1_1_1,5.0)(i)) , TOLERANCE*TOLERANCE );
194  LIBMESH_ASSERT_FP_EQUAL( 5.0 , libmesh_real(outer_product(5.0,*m_1_1_1)(i)) , TOLERANCE*TOLERANCE );
195  }
196  }
197 
199  {
200  LOG_UNIT_TEST;
201 
202  for (int i = 0; i != LIBMESH_DIM; ++i)
203  LIBMESH_ASSERT_FP_EQUAL( 1/Real(5) , libmesh_real(((*m_1_1_1)/5.0)(i)) , TOLERANCE*TOLERANCE );
204  }
205 
207  {
208  LOG_UNIT_TEST;
209 
210  DerivedClass avector {*basem_1_1_1};
211  avector*=5.0;
212 
213  for (int i = 0; i != LIBMESH_DIM; ++i)
214  LIBMESH_ASSERT_FP_EQUAL( 5.0 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
215  }
216 
218  {
219  LOG_UNIT_TEST;
220 
221  DerivedClass avector {*basem_1_1_1};
222  avector/=5.0;
223 
224  for (int i = 0; i != LIBMESH_DIM; ++i)
225  LIBMESH_ASSERT_FP_EQUAL( 1/Real(5) , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
226  }
227 
229  {
230  LOG_UNIT_TEST;
231 
232  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(((*m_1_1_1)+(*m_n1_1_n1))(0)) , TOLERANCE*TOLERANCE );
233  if (LIBMESH_DIM > 1)
234  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(((*m_1_1_1)+(*m_n1_1_n1))(1)) , TOLERANCE*TOLERANCE );
235  if (LIBMESH_DIM > 2)
236  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(((*m_1_1_1)+(*m_n1_1_n1))(2)) , TOLERANCE*TOLERANCE );
237  }
238 
240  {
241  LOG_UNIT_TEST;
242 
243  DerivedClass avector {*basem_1_1_1};
244  avector.add_scaled((*m_1_1_1),0.5);
245 
246  for (int i = 0; i != LIBMESH_DIM; ++i)
247  LIBMESH_ASSERT_FP_EQUAL( 1.5 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
248  }
249 
251  {
252  LOG_UNIT_TEST;
253 
254  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(((*m_1_1_1)-(*m_n1_1_n1))(0)) , TOLERANCE*TOLERANCE );
255  if (LIBMESH_DIM > 1)
256  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(((*m_1_1_1)-(*m_n1_1_n1))(1)) , TOLERANCE*TOLERANCE );
257  if (LIBMESH_DIM > 2)
258  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(((*m_1_1_1)-(*m_n1_1_n1))(2)) , TOLERANCE*TOLERANCE );
259  }
260 
262  {
263  LOG_UNIT_TEST;
264 
265  if (LIBMESH_DIM == 2)
266  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real((*m_1_1_1)*(*m_n1_1_n1)) , TOLERANCE*TOLERANCE );
267  else
268  LIBMESH_ASSERT_FP_EQUAL( -1.0 , libmesh_real((*m_1_1_1)*(*m_n1_1_n1)) , TOLERANCE*TOLERANCE );
269  }
270 
272  {
273  LOG_UNIT_TEST;
274 
275  DerivedClass avector {*basem_1_1_1};
276  avector+=(*m_1_1_1);
277 
278  for (int i = 0; i != LIBMESH_DIM; ++i)
279  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
280  }
281 
283  {
284  LOG_UNIT_TEST;
285 
286  DerivedClass avector {*basem_1_1_1};
287  avector-=(*m_n1_1_n1);
288 
289  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(avector(0)) , TOLERANCE*TOLERANCE );
290  if (LIBMESH_DIM > 1)
291  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(avector(1)) , TOLERANCE*TOLERANCE );
292  if (LIBMESH_DIM > 2)
293  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(avector(2)) , TOLERANCE*TOLERANCE );
294  }
295 
297  {
298  LOG_UNIT_TEST;
299 
300  for (int i = 0; i != LIBMESH_DIM; ++i)
301  CPPUNIT_ASSERT_EQUAL( T(1), (*basem_1_1_1)(i));
302 
303  CPPUNIT_ASSERT_EQUAL( T(-1), (*basem_n1_1_n1)(0));
304  if (LIBMESH_DIM > 1)
305  CPPUNIT_ASSERT_EQUAL( T(1 ), (*basem_n1_1_n1)(1));
306  if (LIBMESH_DIM > 2)
307  CPPUNIT_ASSERT_EQUAL( T(-1), (*basem_n1_1_n1)(2));
308  }
309 
311  {
312  LOG_UNIT_TEST;
313 
314  TypeVector<T> avector((*basem_1_1_1));
315  avector.zero();
316 
317  for (int i = 0; i != LIBMESH_DIM; ++i)
318  CPPUNIT_ASSERT_EQUAL( T(0), avector(i));
319  }
320 
321  void testIsZero()
322  {
323  LOG_UNIT_TEST;
324 
325  {
326 #if LIBMESH_DIM > 2
327  DerivedClass avector(0,0,0);
328 #elif LIBMESH_DIM > 1
329  DerivedClass avector(0,0);
330 #else
331  DerivedClass avector(0);
332 #endif
333  CPPUNIT_ASSERT(avector.is_zero());
334  }
335  {
336 #if LIBMESH_DIM > 2
337  DerivedClass avector(1,1,1);
338 #elif LIBMESH_DIM > 1
339  DerivedClass avector(1,1);
340 #else
341  DerivedClass avector(1);
342 #endif
343  CPPUNIT_ASSERT(!avector.is_zero());
344  }
345  }
346 
348  {
349  LOG_UNIT_TEST;
350 
351  LIBMESH_ASSERT_FP_EQUAL( std::sqrt(Real(LIBMESH_DIM)) , basem_1_1_1->norm() , TOLERANCE*TOLERANCE );
352  }
353 
355  {
356  LOG_UNIT_TEST;
357 
358  LIBMESH_ASSERT_FP_EQUAL( Real(LIBMESH_DIM) , basem_1_1_1->norm_sq() , TOLERANCE*TOLERANCE );
359  }
360 
362  {
363  LOG_UNIT_TEST;
364 
365  CPPUNIT_ASSERT( (*basem_1_1_1) == (*basem_1_1_1) );
366  CPPUNIT_ASSERT( !((*basem_1_1_1) == (*basem_n1_1_n1)) );
367  }
368 
370  {
371  LOG_UNIT_TEST;
372 
373  CPPUNIT_ASSERT( !((*basem_1_1_1) != (*basem_1_1_1)) );
374  CPPUNIT_ASSERT( (*basem_1_1_1) != (*basem_n1_1_n1) );
375  }
376 
378  {
379  LOG_UNIT_TEST;
380 
381  TypeVector<T> avector = (*basem_1_1_1);
382 
383  for (int i = 0; i != LIBMESH_DIM; ++i)
384  CPPUNIT_ASSERT_EQUAL( T(1), (avector)(i) );
385  }
386 
388  {
389  LOG_UNIT_TEST;
390 
391  for (int i = 0; i != LIBMESH_DIM; ++i)
392  LIBMESH_ASSERT_FP_EQUAL( 5.0 , libmesh_real(((*basem_1_1_1)*5.0)(i)) , TOLERANCE*TOLERANCE );
393  }
394 
396  {
397  LOG_UNIT_TEST;
398 
399  for (int i = 0; i != LIBMESH_DIM; ++i)
400  LIBMESH_ASSERT_FP_EQUAL( 1/Real(5) , libmesh_real(((*basem_1_1_1)/5.0)(i)) , TOLERANCE*TOLERANCE );
401  }
402 
404  {
405  LOG_UNIT_TEST;
406 
407  TypeVector<T> avector(*m_1_1_1);
408  avector*=5.0;
409 
410  for (int i = 0; i != LIBMESH_DIM; ++i)
411  LIBMESH_ASSERT_FP_EQUAL( 5.0 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
412  }
413 
415  {
416  LOG_UNIT_TEST;
417 
418  TypeVector<T> avector(*m_1_1_1);
419  avector/=5.0;
420 
421  for (int i = 0; i != LIBMESH_DIM; ++i)
422  LIBMESH_ASSERT_FP_EQUAL( 1/Real(5) , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
423  }
424 
426  {
427  LOG_UNIT_TEST;
428 
429  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(((*basem_1_1_1)+(*basem_n1_1_n1))(0)) , TOLERANCE*TOLERANCE );
430  if (LIBMESH_DIM > 1)
431  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(((*basem_1_1_1)+(*basem_n1_1_n1))(1)) , TOLERANCE*TOLERANCE );
432  if (LIBMESH_DIM > 2)
433  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(((*basem_1_1_1)+(*basem_n1_1_n1))(2)) , TOLERANCE*TOLERANCE );
434  }
435 
437  {
438  LOG_UNIT_TEST;
439 
440  TypeVector<T> avector(*m_1_1_1);
441  avector.add_scaled((*basem_1_1_1),0.5);
442 
443  for (int i = 0; i != LIBMESH_DIM; ++i)
444  LIBMESH_ASSERT_FP_EQUAL( 1.5 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
445  }
446 
448  {
449  LOG_UNIT_TEST;
450 
451  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(((*basem_1_1_1)-(*basem_n1_1_n1))(0)) , TOLERANCE*TOLERANCE );
452  if (LIBMESH_DIM > 1)
453  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(((*basem_1_1_1)-(*basem_n1_1_n1))(1)) , TOLERANCE*TOLERANCE );
454  if (LIBMESH_DIM > 2)
455  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(((*basem_1_1_1)-(*basem_n1_1_n1))(2)) , TOLERANCE*TOLERANCE );
456  }
457 
459  {
460  LOG_UNIT_TEST;
461 
462  if (LIBMESH_DIM == 2)
463  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real((*basem_1_1_1)*(*basem_n1_1_n1)) , TOLERANCE*TOLERANCE );
464  else
465  LIBMESH_ASSERT_FP_EQUAL( -1.0 , libmesh_real((*basem_1_1_1)*(*basem_n1_1_n1)) , TOLERANCE*TOLERANCE );
466  }
467 
469  {
470  LOG_UNIT_TEST;
471 
472  TypeVector<T> avector(*m_1_1_1);
473  avector+=(*basem_1_1_1);
474 
475  for (int i = 0; i != LIBMESH_DIM; ++i)
476  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(avector(i)) , TOLERANCE*TOLERANCE );
477  }
478 
480  {
481  LOG_UNIT_TEST;
482 
483  TypeVector<T> avector(*m_1_1_1);
484  avector-=(*basem_n1_1_n1);
485 
486  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(avector(0)) , TOLERANCE*TOLERANCE );
487  if (LIBMESH_DIM > 1)
488  LIBMESH_ASSERT_FP_EQUAL( 0.0 , libmesh_real(avector(1)) , TOLERANCE*TOLERANCE );
489  if (LIBMESH_DIM > 2)
490  LIBMESH_ASSERT_FP_EQUAL( 2.0 , libmesh_real(avector(2)) , TOLERANCE*TOLERANCE );
491  }
492 
494  {
495 #ifdef LIBMESH_HAVE_METAPHYSICL
496  typedef typename MetaPhysicL::ReplaceAlgebraicType<
497  std::vector<TypeVector<double>>,
499  typename MetaPhysicL::ValueType<std::vector<TypeVector<double>>>::type>::type>::type
500  ReplacedType;
501  constexpr bool assertion =
502  std::is_same<ReplacedType, std::vector<TensorValue<double>>>::value;
503  CPPUNIT_ASSERT(assertion);
504 #endif
505  }
506 };
507 
508 #endif
T libmesh_real(T a)
void add_scaled(const TypeVector< T2 > &, const T &)
Add a scaled value to this vector without creating a temporary.
Definition: type_vector.h:651
TypeTensor< typename CompareTypes< T, T2 >::supertype > outer_product(const TypeVector< T > &a, const TypeVector< T2 > &b)
Definition: type_tensor.h:1393
auto norm() const -> decltype(std::norm(T()))
Definition: type_vector.h:929
virtual void setUp()
static constexpr Real TOLERANCE
TypeVector< T > * basem_n1_1_n1
virtual void tearDown()
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:53
The libMesh namespace provides an interface to certain functionality in the library.
std::unique_ptr< DerivedClass > m_1_1_1
auto norm_sq() const -> decltype(std::norm(T()))
Definition: type_vector.h:948
void zero()
Set all entries of the vector to 0.
Definition: type_vector.h:938
std::unique_ptr< DerivedClass > m_n1_1_n1
This class defines a vector in LIBMESH_DIM dimensional space of type T.
Definition: tensor_tools.h:34
std::string libmesh_suite_name
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const bool value
Definition: xdr_io.C:54
DerivedClass::value_type T