00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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::RCP<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::RCP<const Thyra::VectorSpaceBase<Scalar> >
00084 vs = v.space();
00085 Teuchos::RCP<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 {
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
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 }
00146
00147 #endif // THYRA_VECTOR_TESTER_HPP