30 #ifndef NESTED_FADUNITTESTS_HPP 31 #define NESTED_FADUNITTESTS_HPP 41 #include <cppunit/extensions/HelperMacros.h> 43 #define COMPARE_VALUES(a, b) \ 44 CPPUNIT_ASSERT( std::abs(a-b) < this->tol_a + this->tol_r*std::abs(a) ); 46 #define COMPARE_FADS(a, b) \ 47 CPPUNIT_ASSERT(a.size() == b.size()); \ 48 CPPUNIT_ASSERT(a.hasFastAccess() == b.hasFastAccess()); \ 49 COMPARE_VALUES(a.val(), b.val()); \ 50 for (int zz=0; zz<a.size(); zz++) { \ 51 COMPARE_VALUES(a.dx(zz), b.dx(zz)); \ 52 COMPARE_VALUES(a.fastAccessDx(zz), b.fastAccessDx(zz)); \ 56 #define COMPARE_NESTED_FADS(a, b) \ 57 CPPUNIT_ASSERT(a.size() == b.size()); \ 58 CPPUNIT_ASSERT(a.hasFastAccess() == b.hasFastAccess()); \ 59 COMPARE_FADS(a.val(), b.val()); \ 60 for (int z=0; z<a.size(); z++) { \ 61 COMPARE_FADS(a.dx(z), b.dx(z)); \ 62 COMPARE_FADS(a.fastAccessDx(z), b.fastAccessDx(z)); \ 66 #define BINARY_OP_TEST(TESTNAME,OP) \ 68 c_dfad = a_dfad OP b_dfad; \ 69 c_fad = a_fad OP b_fad; \ 70 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 72 double val = urand.number(); \ 73 c_dfad = a_dfad OP val; \ 74 c_fad = a_fad OP FadType(val); \ 75 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 77 c_dfad = val OP b_dfad; \ 78 c_fad = FadType(val) OP b_fad; \ 79 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 82 #define RELOP_TEST(TESTNAME,OP) \ 84 bool r1 = a_dfad OP b_dfad; \ 85 bool r2 = a_fad OP b_fad; \ 86 CPPUNIT_ASSERT(r1 == r2); \ 88 double val = urand.number(); \ 90 r2 = a_fad OP FadType(val); \ 91 CPPUNIT_ASSERT(r1 == r2); \ 94 r2 = FadType(val) OP b_fad; \ 95 CPPUNIT_ASSERT(r1 == r2); \ 98 #define BINARY_FUNC_TEST(TESTNAME,FUNC) \ 100 c_dfad = FUNC (a_dfad,b_dfad); \ 101 c_fad = FUNC (a_fad,b_fad); \ 102 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 104 double val = urand.number(); \ 105 c_dfad = FUNC (a_dfad,val); \ 106 c_fad = FUNC (a_fad,FadType(val)); \ 107 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 109 c_dfad = FUNC (val,b_dfad); \ 110 c_fad = FUNC (FadType(val),b_fad); \ 111 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 114 #define UNARY_OP_TEST(TESTNAME,OP) \ 116 c_dfad = OP a_dfad; \ 118 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 121 #define UNARY_FUNC_TEST(TESTNAME,FUNC) \ 123 c_dfad = FUNC (a_dfad); \ 124 c_fad = FUNC (a_fad); \ 125 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 128 #define UNARY_ASSIGNOP_TEST(TESTNAME,OP) \ 132 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 134 double val = urand.number(); \ 136 c_fad OP FadType(val); \ 137 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 141 template <
class FadFadType,
class ScalarType>
197 typedef typename FadFadType::value_type
FadType;
202 ScalarType absolute_tolerance,
203 ScalarType relative_tolerance);
250 template <
typename ScalarT>
264 template <
typename ScalarT>
285 FadFadType aa_dfad =
a_dfad;
286 FAD::Fad< FadType > aa_fad =
a_fad;
289 aa_dfad = aa_dfad +
b_dfad;
290 aa_fad = aa_fad +
b_fad;
295 FadFadType aa_dfad =
a_dfad;
296 FAD::Fad< FadType > aa_fad =
a_fad;
299 aa_dfad = aa_dfad -
b_dfad;
300 aa_fad = aa_fad -
b_fad;
305 FadFadType aa_dfad =
a_dfad;
306 FAD::Fad< FadType > aa_fad =
a_fad;
309 aa_dfad = aa_dfad *
b_dfad;
310 aa_fad = aa_fad *
b_fad;
315 FadFadType aa_dfad =
a_dfad;
316 FAD::Fad< FadType > aa_fad =
a_fad;
319 aa_dfad = aa_dfad /
b_dfad;
320 aa_fad = aa_fad /
b_fad;
343 template <
class FadFadType,
class ScalarType>
346 urand(), n1(5), n2(3), tol_a(1.0e-15), tol_r(1.0e-14) {}
348 template <
class FadFadType,
class ScalarType>
351 ScalarType absolute_tolerance,
352 ScalarType relative_tolerance) :
356 tol_a(absolute_tolerance),
357 tol_r(relative_tolerance) {}
359 template <
class FadFadType,
class ScalarType>
363 val = urand.number();
365 a_fad = FAD::Fad<FadType>(n1,
FadType(n2,
val));
367 val = urand.number();
369 b_fad = FAD::Fad<FadType>(n1,
FadType(n2,
val));
371 for (
int j=0; j<n2; j++) {
373 val2 = urand.number();
374 a_dfad.val().fastAccessDx(j) = val2;
375 a_fad.val().fastAccessDx(j) = val2;
377 val2 = urand.number();
378 b_dfad.val().fastAccessDx(j) = val2;
379 b_fad.val().fastAccessDx(j) = val2;
382 for (
int i=0; i<n1; i++) {
383 val = urand.number();
387 val = urand.number();
391 for (
int j=0; j<n2; j++) {
393 val2 = urand.number();
394 a_dfad.fastAccessDx(i).fastAccessDx(j) = val2;
395 a_fad.fastAccessDx(i).fastAccessDx(j) = val2;
397 val2 = urand.number();
398 b_dfad.fastAccessDx(i).fastAccessDx(j) = val2;
399 b_fad.fastAccessDx(i).fastAccessDx(j) = val2;
404 template <
class FadFadType,
class ScalarType>
408 template <
class FadFadType,
class ScalarType>
413 FadFadType aa_dfad = a_dfad + 1.0;
414 c_dfad =
max(aa_dfad, a_dfad);
416 for (
int i=0; i<n1; i++) {
418 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
421 c_dfad =
max(a_dfad, aa_dfad);
423 for (
int i=0; i<n1; i++) {
425 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
428 c_dfad =
max(a_dfad+1.0, a_dfad);
430 for (
int i=0; i<n1; i++) {
432 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
435 c_dfad =
max(a_dfad, a_dfad+1.0);
437 for (
int i=0; i<n1; i++) {
439 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
442 val = a_dfad.val() + 1;
443 c_dfad =
max(a_dfad,
val);
445 for (
int i=0; i<n1; i++) {
449 val = a_dfad.val() - 1;
450 c_dfad =
max(a_dfad,
val);
452 for (
int i=0; i<n1; i++) {
454 COMPARE_FADS(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
457 val = b_dfad.val() + 1;
458 c_dfad =
max(
val, b_dfad);
460 for (
int i=0; i<n1; i++) {
464 val = b_dfad.val() - 1;
465 c_dfad =
max(
val, b_dfad);
467 for (
int i=0; i<n1; i++) {
469 COMPARE_FADS(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
473 template <
class FadFadType,
class ScalarType>
478 FadFadType aa_dfad = a_dfad - 1.0;
479 c_dfad =
min(aa_dfad, a_dfad);
481 for (
int i=0; i<n1; i++) {
483 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
486 c_dfad =
min(a_dfad, aa_dfad);
488 for (
int i=0; i<n1; i++) {
490 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
493 val = a_dfad.val() - 1;
494 c_dfad =
min(a_dfad,
val);
496 for (
int i=0; i<n1; i++) {
500 val = a_dfad.val() + 1;
501 c_dfad =
min(a_dfad,
val);
503 for (
int i=0; i<n1; i++) {
505 COMPARE_FADS(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
508 val = b_dfad.val() - 1;
509 c_dfad =
min(
val, b_dfad);
511 for (
int i=0; i<n1; i++) {
515 val = b_dfad.val() + 1;
516 c_dfad =
min(
val, b_dfad);
518 for (
int i=0; i<n1; i++) {
520 COMPARE_FADS(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
524 #undef COMPARE_VALUES 526 #undef COMPARE_NESTED_FADS 528 #endif // NESETD_FADUNITTESTS_HPP ScalarT composite1(const ScalarT &a, const ScalarT &b)
#define COMPARE_FADS(a, b)
UNARY_OP_TEST(testUnaryPlus,+)
FAD::Fad< FadType > a_fad
Sacado::Fad::DFad< double > FadType
SimpleFad< ValueT > sqrt(const SimpleFad< ValueT > &a)
BINARY_FUNC_TEST(testPow, pow)
SimpleFad< ValueT > asin(const SimpleFad< ValueT > &a)
FAD::Fad< FadType > b_fad
BINARY_OP_TEST(testAddition,+)
SimpleFad< ValueT > log(const SimpleFad< ValueT > &a)
FAD::Fad< FadType > c_fad
SimpleFad< ValueT > exp(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan(const SimpleFad< ValueT > &a)
#define COMPARE_NESTED_FADS(a, b)
SimpleFad< ValueT > log10(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
CPPUNIT_TEST(testAddition)
UNARY_FUNC_TEST(testExp, exp)
Sacado::Random< ScalarType > urand
SimpleFad< ValueT > sin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sinh(const SimpleFad< ValueT > &a)
UNARY_ASSIGNOP_TEST(testPlusEquals,+=)
FadFadType::value_type FadType
SimpleFad< ValueT > pow(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > tan(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > cos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > cosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
ScalarT composite1_fad(const ScalarT &a, const ScalarT &b)
KOKKOS_INLINE_FUNCTION Expr< AbsOp< Expr< T > > > abs(const Expr< T > &expr)
KOKKOS_INLINE_FUNCTION Expr< FAbsOp< Expr< T > > > fabs(const Expr< T > &expr)
RELOP_TEST(testEquals,==)
CPPUNIT_TEST_SUITE(FadFadOpsUnitTest)
SimpleFad< ValueT > acos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tanh(const SimpleFad< ValueT > &a)