|
Thyra Package Browser (Single Doxygen Collection) Version of the Day
|
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
1.7.4