ELRDFadUnitTests.cpp

Go to the documentation of this file.
00001 // $Id: ELRDFadUnitTests.cpp,v 1.1.2.2 2009/03/05 19:41:30 etphipp Exp $ 
00002 // $Source: /space/CVS/Trilinos/packages/sacado/test/TestSuite/Attic/ELRDFadUnitTests.cpp,v $ 
00003 // @HEADER
00004 // ***********************************************************************
00005 // 
00006 //                           Sacado Package
00007 //                 Copyright (2006) Sandia Corporation
00008 // 
00009 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00010 // the U.S. Government retains certain rights in this software.
00011 // 
00012 // This library is free software; you can redistribute it and/or modify
00013 // it under the terms of the GNU Lesser General Public License as
00014 // published by the Free Software Foundation; either version 2.1 of the
00015 // License, or (at your option) any later version.
00016 //  
00017 // This library is distributed in the hope that it will be useful, but
00018 // WITHOUT ANY WARRANTY; without even the implied warranty of
00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020 // Lesser General Public License for more details.
00021 //  
00022 // You should have received a copy of the GNU Lesser General Public
00023 // License along with this library; if not, write to the Free Software
00024 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00025 // USA
00026 // Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
00027 // (etphipp@sandia.gov).
00028 // 
00029 // ***********************************************************************
00030 // @HEADER
00031 
00032 #include "ELRDFadUnitTests.hpp"
00033 
00034 CPPUNIT_TEST_SUITE_REGISTRATION( ELRDFadOpsUnitTest );
00035 
00036 ELRDFadOpsUnitTest::ELRDFadOpsUnitTest() :
00037   urand(0.0, 1.0), n(5), tol_a(1.0e-15), tol_r(1.0e-14) {}
00038 
00039 ELRDFadOpsUnitTest::ELRDFadOpsUnitTest(int numComponents, 
00040              double absolute_tolerance, 
00041              double relative_tolerance) :
00042   urand(0.0, 1.0), 
00043   n(numComponents), 
00044   tol_a(absolute_tolerance), 
00045   tol_r(relative_tolerance) {}
00046 
00047 void ELRDFadOpsUnitTest::setUp() {
00048   double val;
00049 
00050   val = urand.number();
00051   a_dfad = DFadType(n,val);
00052   a_fad = FAD::Fad<double>(n,val);
00053   
00054   val = urand.number();
00055   b_dfad = DFadType(n,val);
00056   b_fad = FAD::Fad<double>(n,val);
00057 
00058   for (int i=0; i<n; i++) {
00059     val = urand.number();
00060     a_dfad.fastAccessDx(i) = val;
00061     a_fad.fastAccessDx(i) = val;
00062 
00063     val = urand.number();
00064     b_dfad.fastAccessDx(i) = val;
00065     b_fad.fastAccessDx(i) = val;
00066   }
00067 }
00068 
00069 void ELRDFadOpsUnitTest::tearDown() {}
00070 
00071 void ELRDFadOpsUnitTest::compareFads(const DFadType& x_dfad,
00072                const FAD::Fad<double>& x_fad) {
00073 
00074   if (x_dfad.size() != x_fad.size()) {
00075     std::cout << "x_dfad.size() = " << x_dfad.size() << std::endl
00076         << "x_fad.size() = " << x_fad.size() << std::endl
00077         << "x_dfad = " << x_dfad << std::endl
00078         << "x_fad = " << x_fad << std::endl;
00079   }
00080 
00081   // Compare sizes
00082   CPPUNIT_ASSERT(x_dfad.size() == x_fad.size());
00083   
00084   // Compare hasFastAccess
00085   CPPUNIT_ASSERT(x_dfad.hasFastAccess() == x_fad.hasFastAccess());
00086   
00087   // Compare values
00088   compareDoubles(x_dfad.val(), x_fad.val());
00089   
00090   for (int i=0; i<x_fad.size(); i++) {
00091     
00092     // Compare dx
00093     compareDoubles(x_dfad.dx(i), x_fad.dx(i));
00094     
00095     // Compare fastAccessDx
00096     compareDoubles(x_dfad.fastAccessDx(i), x_fad.fastAccessDx(i));
00097   }
00098 }
00099 
00100 void ELRDFadOpsUnitTest::compareDoubles(double a, double b) {
00101   if ( fabs(a-b) >= tol_a + tol_r*fabs(a) )
00102     std::cout << "a = " << a << std::endl
00103         << "b = " << b << std::endl;
00104   CPPUNIT_ASSERT( fabs(a-b) < tol_a + tol_r*fabs(a) );
00105 }
00106 
00107 void ELRDFadOpsUnitTest::testMax() {
00108   double val;
00109 
00110   DFadType aa_dfad = a_dfad + 1.0;
00111   c_dfad = max(aa_dfad, a_dfad);
00112   compareDoubles(c_dfad.val(), aa_dfad.val());
00113   for (int i=0; i<n; i++) {
00114     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00115     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00116   }
00117   
00118   c_dfad = max(a_dfad, aa_dfad);
00119   compareDoubles(c_dfad.val(), aa_dfad.val());
00120   for (int i=0; i<n; i++) {
00121     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00122     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00123   }
00124 
00125   c_dfad = max(a_dfad+1.0, a_dfad);
00126   compareDoubles(c_dfad.val(), aa_dfad.val());
00127   for (int i=0; i<n; i++) {
00128     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00129     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00130   }
00131   
00132   c_dfad = max(a_dfad, a_dfad+1.0);
00133   compareDoubles(c_dfad.val(), aa_dfad.val());
00134   for (int i=0; i<n; i++) {
00135     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00136     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00137   }
00138 
00139   // Expr, Expr (same)
00140   this->c_dfad = max(this->a_dfad+1.0, this->a_dfad+1.0);
00141   compareDoubles(c_dfad.val(), aa_dfad.val());
00142   for (int i=0; i<n; i++) {
00143     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00144     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00145   }
00146 
00147   // Expr, Expr (different)
00148   this->c_dfad = max(this->a_dfad+1.0, this->a_dfad-1.0);
00149   compareDoubles(c_dfad.val(), aa_dfad.val());
00150   for (int i=0; i<n; i++) {
00151     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00152     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00153   }
00154   this->c_dfad = max(this->a_dfad-1.0, this->a_dfad+1.0);
00155   compareDoubles(c_dfad.val(), aa_dfad.val());
00156   for (int i=0; i<n; i++) {
00157     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00158     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00159   }
00160   
00161   val = a_dfad.val() + 1;
00162   c_dfad = max(a_dfad, val);
00163   compareDoubles(c_dfad.val(), val);
00164   for (int i=0; i<n; i++)
00165     compareDoubles(c_dfad.dx(i), 0.0);
00166   
00167   val = a_dfad.val() - 1;
00168   c_dfad = max(a_dfad, val);
00169   compareDoubles(c_dfad.val(), a_dfad.val());
00170   for (int i=0; i<n; i++) {
00171     compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00172     compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00173   }
00174 
00175   val = b_dfad.val() + 1;
00176   c_dfad = max(val, b_dfad);
00177   compareDoubles(c_dfad.val(), val);
00178   for (int i=0; i<n; i++)
00179     compareDoubles(c_dfad.dx(i), 0.0);
00180   
00181   val = b_dfad.val() - 1;
00182   c_dfad = max(val, b_dfad);
00183   compareDoubles(c_dfad.val(), b_dfad.val());
00184   for (int i=0; i<n; i++) {
00185     compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00186     compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00187   }
00188 }
00189 
00190 void ELRDFadOpsUnitTest::testMin() {
00191   double val;
00192 
00193   DFadType aa_dfad = a_dfad - 1.0;
00194   c_dfad = min(aa_dfad, a_dfad);
00195   compareDoubles(c_dfad.val(), aa_dfad.val());
00196   for (int i=0; i<n; i++) {
00197     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00198     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00199   }
00200 
00201   c_dfad = min(a_dfad, aa_dfad);
00202   compareDoubles(c_dfad.val(), aa_dfad.val());
00203   for (int i=0; i<n; i++) {
00204     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00205     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00206   }
00207 
00208   // Expr, Expr (same)
00209   this->c_dfad = min(this->a_dfad-1.0, this->a_dfad-1.0);
00210   compareDoubles(c_dfad.val(), aa_dfad.val());
00211   for (int i=0; i<n; i++) {
00212     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00213     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00214   }
00215 
00216   // Expr, Expr (different)
00217   this->c_dfad = min(this->a_dfad+1.0, this->a_dfad-1.0);
00218   compareDoubles(c_dfad.val(), aa_dfad.val());
00219   for (int i=0; i<n; i++) {
00220     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00221     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00222   }
00223   this->c_dfad = min(this->a_dfad-1.0, this->a_dfad+1.0);
00224   compareDoubles(c_dfad.val(), aa_dfad.val());
00225   for (int i=0; i<n; i++) {
00226     compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00227     compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00228   }
00229 
00230   val = a_dfad.val() - 1;
00231   c_dfad = min(a_dfad, val);
00232   compareDoubles(c_dfad.val(), val);
00233   for (int i=0; i<n; i++)
00234     compareDoubles(c_dfad.dx(i), 0.0);
00235   
00236   val = a_dfad.val() + 1;
00237   c_dfad = min(a_dfad, val);
00238   compareDoubles(c_dfad.val(), a_dfad.val());
00239   for (int i=0; i<n; i++) {
00240     compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00241     compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00242   }
00243 
00244   val = b_dfad.val() - 1;
00245   c_dfad = min(val, b_dfad);
00246   compareDoubles(c_dfad.val(), val);
00247   for (int i=0; i<n; i++)
00248     compareDoubles(c_dfad.dx(i), 0.0);
00249   
00250   val = b_dfad.val() + 1;
00251   c_dfad = min(val, b_dfad);
00252   compareDoubles(c_dfad.val(), b_dfad.val());
00253   for (int i=0; i<n; i++) {
00254     compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00255     compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00256   }
00257 }

Generated on Tue Oct 20 12:55:02 2009 for Sacado Package Browser (Single Doxygen Collection) by doxygen 1.4.7