Thyra_VectorTester.hpp

Go to the documentation of this file.
00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 //    Thyra: Interfaces and Support for Abstract Numerical Algorithms
00005 //                 Copyright (2004) Sandia Corporation
00006 // 
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 // 
00010 // This library is free software; you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as
00012 // published by the Free Software Foundation; either version 2.1 of the
00013 // License, or (at your option) any later version.
00014 //  
00015 // This library is distributed in the hope that it will be useful, but
00016 // WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 // Lesser General Public License for more details.
00019 //  
00020 // You should have received a copy of the GNU Lesser General Public
00021 // License along with this library; if not, write to the Free Software
00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023 // USA
00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00025 // 
00026 // ***********************************************************************
00027 // @HEADER
00028 
00029 #ifndef THYRA_VECTOR_TESTER_HPP
00030 #define THYRA_VECTOR_TESTER_HPP
00031 
00032 #include "Thyra_VectorTesterDecl.hpp"
00033 
00034 namespace Thyra {
00035 
00036 template<class Scalar>
00037 VectorTester<Scalar>::VectorTester(
00038   const ScalarMag     warning_tol
00039   ,const ScalarMag    error_tol
00040   ,const int          num_random_vectors
00041   ,const bool         show_all_tests
00042   ,const bool         dump_all
00043   )
00044   :warning_tol_(warning_tol)
00045   ,error_tol_(error_tol)
00046   ,num_random_vectors_(num_random_vectors)
00047   ,show_all_tests_(show_all_tests)
00048   ,dump_all_(dump_all)
00049 {
00050   multiVectorTester_.warning_tol(warning_tol);
00051   multiVectorTester_.error_tol(error_tol);
00052   multiVectorTester_.num_random_vectors(num_random_vectors);
00053   multiVectorTester_.show_all_tests(show_all_tests);
00054   multiVectorTester_.dump_all(dump_all);
00055 }
00056 
00057 template<class Scalar>
00058 bool VectorTester<Scalar>::check(
00059   const VectorBase<Scalar>       &v
00060   ,Teuchos::FancyOStream         *out_arg
00061   ) const
00062 {
00063 
00064   using std::endl;
00065   using Teuchos::describe;
00066   using Teuchos::FancyOStream;
00067   using Teuchos::OSTab;
00068   typedef Teuchos::ScalarTraits<Scalar> ST;
00069   typedef typename ST::magnitudeType    ScalarMag;
00070 
00071   Teuchos::RefCountPtr<FancyOStream> out = Teuchos::rcp(out_arg,false);
00072   const Teuchos::EVerbosityLevel verbLevel = (dump_all()?Teuchos::VERB_EXTREME:Teuchos::VERB_MEDIUM);
00073 
00074   OSTab tab(out,1,"THYRA");
00075 
00076   bool result, success = true;
00077 
00078   if(out.get()) *out <<endl<< "*** Entering Thyra::VectorTester<"<<ST::name()<<">::check(v,...) ...\n";
00079 
00080   if(out.get()) *out <<endl<< "Testing a VectorBase object described as:\n" << describe(v,verbLevel);
00081 
00082   if(out.get()) *out <<endl<< "A) Creating temporary vector t1, t2, t3, and t4 from v.space() ...\n";
00083   Teuchos::RefCountPtr<const Thyra::VectorSpaceBase<Scalar> >
00084     vs = v.space();
00085   Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> >
00086     t1 = createMember(vs), t2 = createMember(vs), t3 = createMember(vs), t4 = createMember(vs);
00087 
00088   if(out.get()) *out <<endl<< "B) Testing VectorBase::applyOp(...) by calling a few standard RTOp operations ... ";
00089 
00090   const Scalar
00091     one   = ST::one(),
00092     two   = Scalar(2)*one,
00093     three = Scalar(3)*one;
00094 
00095   if(1) {
00096     
00097     std::ostringstream oss;
00098     bool these_results = true;
00099     
00100     oss <<endl<< "assign(&*t1,2.0) ...\n";
00101     Thyra::assign( &*t1, two );
00102     if(dump_all()) oss <<endl<< "\nt1 =\n" << describe(*t1,verbLevel);
00103     
00104     result = testRelErr(
00105       "sum(t1)",sum(*t1),"2*vs->dim()",two*Scalar(vs->dim())
00106       ,"error_tol()",error_tol(),"warning_tol()",warning_tol()
00107       ,&oss
00108       );
00109     if(!result) these_results = false;
00110     
00111     oss <<endl<< "assign(&*t2,3.0) ...\n";
00112     Thyra::assign( &*t2, three );
00113     if(dump_all()) oss <<endl<< "t2 =\n" << *t1;
00114     
00115     result = testRelErr(
00116       "sum(t2)",sum(*t2),"3*vs->dim()",three*Scalar(vs->dim())
00117       ,"error_tol()",error_tol(),"warning_tol()",warning_tol()
00118       ,&oss
00119       );
00120     if(!result) these_results = false;
00121     
00122     result = testRelErr(
00123       "vs->scalarProd(*t1,*t2)",vs->scalarProd(*t1,*t2),"2*3*vs->dim()",two*three*Scalar(vs->dim())
00124       ,"error_tol()",error_tol(),"warning_tol()",warning_tol()
00125       ,&oss
00126       );
00127     if(!result) these_results = false;
00128 
00129     printTestResults(these_results,oss.str(),show_all_tests(),&success,out.get());
00130 
00131   }
00132     
00133   // ToDo: Test the rest of the specific VectorBase interface on v1
00134 
00135   if(out.get()) *out <<endl<< "C) Checking the MultiVectorBase interface of v ...\n";
00136   result = multiVectorTester_.check(v,out.get());
00137   if(!result) success = false;
00138 
00139   if(out.get()) *out <<endl<< "*** Leaving Thyra::VectorTester<"<<ST::name()<<">::check(v,...) ...\n";
00140   
00141   return success;
00142 
00143 }
00144 
00145 } // namespace Thyra
00146 
00147 #endif // THYRA_VECTOR_TESTER_HPP

Generated on Thu Sep 18 12:33:03 2008 for Thyra Package Browser (Single Doxygen Collection) by doxygen 1.3.9.1