SFadUnitTests.cpp

Go to the documentation of this file.
00001 // $Id: SFadUnitTests.cpp,v 1.6.2.1 2009/03/05 19:41:30 etphipp Exp $ 
00002 // $Source: /space/CVS/Trilinos/packages/sacado/test/TestSuite/Attic/SFadUnitTests.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 "SFadUnitTests.hpp"
00033 
00034 CPPUNIT_TEST_SUITE_REGISTRATION( SFadOpsUnitTest );
00035 
00036 SFadOpsUnitTest::SFadOpsUnitTest() :
00037   urand(0.0, 1.0), n(num_comp), tol_a(1.0e-15), tol_r(1.0e-14) {}
00038 
00039 SFadOpsUnitTest::SFadOpsUnitTest(int numComponents, double absolute_tolerance, 
00040          double relative_tolerance) :
00041   urand(0.0, 1.0), 
00042   n(numComponents), 
00043   tol_a(absolute_tolerance), 
00044   tol_r(relative_tolerance) {}
00045 
00046 void SFadOpsUnitTest::setUp() {
00047   double val;
00048 
00049   val = urand.number();
00050   a_sfad = SFadType(n,val);
00051   a_fad = FAD::Fad<double>(n,val);
00052   
00053   val = urand.number();
00054   b_sfad = SFadType(n,val);
00055   b_fad = FAD::Fad<double>(n,val);
00056 
00057   for (int i=0; i<n; i++) {
00058     val = urand.number();
00059     a_sfad.fastAccessDx(i) = val;
00060     a_fad.fastAccessDx(i) = val;
00061 
00062     val = urand.number();
00063     b_sfad.fastAccessDx(i) = val;
00064     b_fad.fastAccessDx(i) = val;
00065   }
00066 }
00067 
00068 void SFadOpsUnitTest::tearDown() {}
00069 
00070 void SFadOpsUnitTest::compareFads(const SFadType& x_sfad,
00071           const FAD::Fad<double>& x_fad) {
00072 
00073   // Compare sizes
00074   CPPUNIT_ASSERT(x_sfad.size() == x_fad.size());
00075   
00076   // Compare hasFastAccess
00077   CPPUNIT_ASSERT(x_sfad.hasFastAccess() == x_fad.hasFastAccess());
00078   
00079   // Compare values
00080   compareDoubles(x_sfad.val(), x_fad.val());
00081   
00082   for (int i=0; i<x_fad.size(); i++) {
00083     
00084     // Compare dx
00085     compareDoubles(x_sfad.dx(i), x_fad.dx(i));
00086     
00087     // Compare fastAccessDx
00088     compareDoubles(x_sfad.fastAccessDx(i), x_fad.fastAccessDx(i));
00089   }
00090 }
00091 
00092 void SFadOpsUnitTest::compareDoubles(double a, double b) {
00093   CPPUNIT_ASSERT( fabs(a-b) < tol_a + tol_r*fabs(a) );
00094 }
00095 
00096 void SFadOpsUnitTest::testMax() {
00097   double val;
00098 
00099   SFadType aa_sfad = a_sfad + 1.0;
00100   c_sfad = max(aa_sfad, a_sfad);
00101   compareDoubles(c_sfad.val(), aa_sfad.val());
00102   for (int i=0; i<n; i++) {
00103     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00104     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00105   }
00106   
00107   c_sfad = max(a_sfad, aa_sfad);
00108   compareDoubles(c_sfad.val(), aa_sfad.val());
00109   for (int i=0; i<n; i++) {
00110     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00111     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00112   }
00113 
00114   c_sfad = max(a_sfad+1.0, a_sfad);
00115   compareDoubles(c_sfad.val(), aa_sfad.val());
00116   for (int i=0; i<n; i++) {
00117     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00118     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00119   }
00120   
00121   c_sfad = max(a_sfad, a_sfad+1.0);
00122   compareDoubles(c_sfad.val(), aa_sfad.val());
00123   for (int i=0; i<n; i++) {
00124     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00125     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00126   }
00127 
00128   // Expr, Expr (same)
00129   this->c_sfad = max(this->a_sfad+1.0, this->a_sfad+1.0);
00130   compareDoubles(c_sfad.val(), aa_sfad.val());
00131   for (int i=0; i<n; i++) {
00132     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00133     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00134   }
00135 
00136   // Expr, Expr (different)
00137   this->c_sfad = max(this->a_sfad+1.0, this->a_sfad-1.0);
00138   compareDoubles(c_sfad.val(), aa_sfad.val());
00139   for (int i=0; i<n; i++) {
00140     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00141     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00142   }
00143   this->c_sfad = max(this->a_sfad-1.0, this->a_sfad+1.0);
00144   compareDoubles(c_sfad.val(), aa_sfad.val());
00145   for (int i=0; i<n; i++) {
00146     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00147     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00148   }
00149   
00150   val = a_sfad.val() + 1;
00151   c_sfad = max(a_sfad, val);
00152   compareDoubles(c_sfad.val(), val);
00153   for (int i=0; i<n; i++)
00154     compareDoubles(c_sfad.dx(i), 0.0);
00155   
00156   val = a_sfad.val() - 1;
00157   c_sfad = max(a_sfad, val);
00158   compareDoubles(c_sfad.val(), a_sfad.val());
00159   for (int i=0; i<n; i++) {
00160     compareDoubles(c_sfad.dx(i), a_sfad.dx(i));
00161     compareDoubles(c_sfad.fastAccessDx(i), a_sfad.fastAccessDx(i));
00162   }
00163 
00164   val = b_sfad.val() + 1;
00165   c_sfad = max(val, b_sfad);
00166   compareDoubles(c_sfad.val(), val);
00167   for (int i=0; i<n; i++)
00168     compareDoubles(c_sfad.dx(i), 0.0);
00169   
00170   val = b_sfad.val() - 1;
00171   c_sfad = max(val, b_sfad);
00172   compareDoubles(c_sfad.val(), b_sfad.val());
00173   for (int i=0; i<n; i++) {
00174     compareDoubles(c_sfad.dx(i), b_sfad.dx(i));
00175     compareDoubles(c_sfad.fastAccessDx(i), b_sfad.fastAccessDx(i));
00176   }
00177 }
00178 
00179 void SFadOpsUnitTest::testMin() {
00180   double val;
00181 
00182   SFadType aa_sfad = a_sfad - 1.0;
00183   c_sfad = min(aa_sfad, a_sfad);
00184   compareDoubles(c_sfad.val(), aa_sfad.val());
00185   for (int i=0; i<n; i++) {
00186     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00187     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00188   }
00189 
00190   c_sfad = min(a_sfad, aa_sfad);
00191   compareDoubles(c_sfad.val(), aa_sfad.val());
00192   for (int i=0; i<n; i++) {
00193     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00194     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00195   }
00196 
00197   // Expr, Expr (same)
00198   this->c_sfad = min(this->a_sfad-1.0, this->a_sfad-1.0);
00199   compareDoubles(c_sfad.val(), aa_sfad.val());
00200   for (int i=0; i<n; i++) {
00201     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00202     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00203   }
00204 
00205   // Expr, Expr (different)
00206   this->c_sfad = min(this->a_sfad+1.0, this->a_sfad-1.0);
00207   compareDoubles(c_sfad.val(), aa_sfad.val());
00208   for (int i=0; i<n; i++) {
00209     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00210     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00211   }
00212   this->c_sfad = min(this->a_sfad-1.0, this->a_sfad+1.0);
00213   compareDoubles(c_sfad.val(), aa_sfad.val());
00214   for (int i=0; i<n; i++) {
00215     compareDoubles(c_sfad.dx(i), aa_sfad.dx(i));
00216     compareDoubles(c_sfad.fastAccessDx(i), aa_sfad.fastAccessDx(i));
00217   }
00218 
00219   val = a_sfad.val() - 1;
00220   c_sfad = min(a_sfad, val);
00221   compareDoubles(c_sfad.val(), val);
00222   for (int i=0; i<n; i++)
00223     compareDoubles(c_sfad.dx(i), 0.0);
00224   
00225   val = a_sfad.val() + 1;
00226   c_sfad = min(a_sfad, val);
00227   compareDoubles(c_sfad.val(), a_sfad.val());
00228   for (int i=0; i<n; i++) {
00229     compareDoubles(c_sfad.dx(i), a_sfad.dx(i));
00230     compareDoubles(c_sfad.fastAccessDx(i), a_sfad.fastAccessDx(i));
00231   }
00232 
00233   val = b_sfad.val() - 1;
00234   c_sfad = min(val, b_sfad);
00235   compareDoubles(c_sfad.val(), val);
00236   for (int i=0; i<n; i++)
00237     compareDoubles(c_sfad.dx(i), 0.0);
00238   
00239   val = b_sfad.val() + 1;
00240   c_sfad = min(val, b_sfad);
00241   compareDoubles(c_sfad.val(), b_sfad.val());
00242   for (int i=0; i<n; i++) {
00243     compareDoubles(c_sfad.dx(i), b_sfad.dx(i));
00244     compareDoubles(c_sfad.fastAccessDx(i), b_sfad.fastAccessDx(i));
00245   }
00246 }

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