Thyra Package Browser (Single Doxygen Collection) Version of the Day
Thyra_VectorTester_def.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_VectorTester_decl.hpp"
00033 #include "Thyra_VectorStdOps.hpp"
00034 #include "Thyra_VectorBase.hpp"
00035 #include "Thyra_VectorSpaceBase.hpp"
00036 #include "Thyra_TestingTools.hpp"
00037 #include "Teuchos_VerbosityLevel.hpp"
00038 
00039 
00040 namespace Thyra {
00041 
00042 
00043 template<class Scalar>
00044 VectorTester<Scalar>::VectorTester(
00045   const ScalarMag     warning_tol_in
00046   ,const ScalarMag    error_tol_in
00047   ,const int          num_random_vectors_in
00048   ,const bool         show_all_tests_in
00049   ,const bool         dump_all_in
00050   )
00051   :warning_tol_(warning_tol_in)
00052   ,error_tol_(error_tol_in)
00053   ,num_random_vectors_(num_random_vectors_in)
00054   ,show_all_tests_(show_all_tests_in)
00055   ,dump_all_(dump_all_in)
00056 {}
00057 
00058 
00059 template<class Scalar>
00060 bool VectorTester<Scalar>::check(
00061   const VectorBase<Scalar>       &v
00062   ,Teuchos::FancyOStream         *out_arg
00063   ) const
00064 {
00065 
00066   using std::endl;
00067   using Teuchos::describe;
00068   using Teuchos::FancyOStream;
00069   using Teuchos::OSTab;
00070   typedef Teuchos::ScalarTraits<Scalar> ST;
00071   //typedef typename ST::magnitudeType    ScalarMag;
00072 
00073   Teuchos::RCP<FancyOStream> out = Teuchos::rcp(out_arg,false);
00074   const Teuchos::EVerbosityLevel verbLevel = (dump_all()?Teuchos::VERB_EXTREME:Teuchos::VERB_MEDIUM);
00075 
00076   OSTab tab(out,1,"THYRA");
00077 
00078   bool result, success = true;
00079 
00080   if(out.get()) *out <<endl<< "*** Entering Thyra::VectorTester<"<<ST::name()<<">::check(v,...) ...\n";
00081 
00082   if(out.get()) *out <<endl<< "Testing a VectorBase object described as:\n" << describe(v,verbLevel);
00083 
00084   if(out.get()) *out <<endl<< "A) Creating temporary vector t1, t2, t3, and t4 from v.space() ...\n";
00085   Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
00086     vs = v.space();
00087   Teuchos::RCP<Thyra::VectorBase<Scalar> >
00088     t1 = createMember(vs), t2 = createMember(vs), t3 = createMember(vs), t4 = createMember(vs);
00089 
00090   if(out.get()) *out <<endl<< "B) Testing VectorBase::applyOp(...) by calling a few standard RTOp operations ... ";
00091 
00092   const Scalar
00093     one   = ST::one(),
00094     two   = Scalar(2)*one,
00095     three = Scalar(3)*one;
00096 
00097   {
00098     
00099     std::ostringstream oss;
00100     bool these_results = true;
00101     
00102     oss <<endl<< "assign(t1.ptr(),2.0) ...\n";
00103     Thyra::assign( t1.ptr(), two );
00104     if(dump_all()) oss <<endl<< "\nt1 =\n" << describe(*t1,verbLevel);
00105     
00106     result = testRelErr(
00107       "sum(t1)",sum(*t1),"2*vs->dim()",two*Scalar(vs->dim())
00108       ,"error_tol()",error_tol(),"warning_tol()",warning_tol()
00109       ,&oss
00110       );
00111     if(!result) these_results = false;
00112     
00113     oss <<endl<< "assign(t2.ptr(),3.0) ...\n";
00114     Thyra::assign( t2.ptr(), three );
00115     if(dump_all()) oss <<endl<< "t2 =\n" << *t1;
00116     
00117     result = testRelErr(
00118       "sum(t2)",sum(*t2),"3*vs->dim()",three*Scalar(vs->dim())
00119       ,"error_tol()",error_tol(),"warning_tol()",warning_tol()
00120       ,&oss
00121       );
00122     if(!result) these_results = false;
00123     
00124     result = testRelErr(
00125       "vs->scalarProd(*t1,*t2)",vs->scalarProd(*t1,*t2),"2*3*vs->dim()",two*three*Scalar(vs->dim())
00126       ,"error_tol()",error_tol(),"warning_tol()",warning_tol()
00127       ,&oss
00128       );
00129     if(!result) these_results = false;
00130 
00131     printTestResults(these_results,oss.str(),show_all_tests(),&success,out.get());
00132 
00133   }
00134     
00135   // ToDo: Test the rest of the specific VectorBase interface on v1
00136 
00137   if(out.get()) *out <<endl<< "C) Checking the MultiVectorBase interface of v ...\n";
00138   result = multiVectorTester_.check(v, out.ptr());
00139   if(!result) success = false;
00140 
00141   if(out.get()) *out <<endl<< "*** Leaving Thyra::VectorTester<"<<ST::name()<<">::check(v,...) ...\n";
00142   
00143   return success;
00144 
00145 }
00146 
00147 
00148 } // namespace Thyra
00149 
00150 
00151 #endif // THYRA_VECTOR_TESTER_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines