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 #include "Thyra_DefaultSpmdVectorSpace.hpp"
00030 #include "Thyra_DefaultProductVectorSpace.hpp"
00031 #include "Thyra_VectorStdOpsTester.hpp"
00032 #include "Thyra_MultiVectorStdOpsTester.hpp"
00033 #include "Thyra_TestingTools.hpp"
00034 #include "Teuchos_GlobalMPISession.hpp"
00035 #include "Teuchos_CommandLineProcessor.hpp"
00036 #include "Teuchos_VerboseObject.hpp"
00037 #include "Teuchos_DefaultComm.hpp"
00038 #include "Teuchos_arrayArg.hpp"
00039
00040 namespace Thyra {
00041
00044 template <class Scalar>
00045 bool run_std_ops_tests(
00046 const int n
00047 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType max_rel_err
00048 ,const bool dumpAll
00049 ,Teuchos::FancyOStream *out_arg
00050 )
00051 {
00052
00053 using Teuchos::RCP;
00054 using Teuchos::rcp;
00055 using Teuchos::OSTab;
00056 typedef Teuchos::ScalarTraits<Scalar> ST;
00057 typedef typename ST::magnitudeType ScalarMag;
00058 typedef Thyra::Ordinal Index;
00059
00060 RCP<Teuchos::FancyOStream>
00061 out = rcp(new Teuchos::FancyOStream(rcp(out_arg,false)));
00062
00063 VectorStdOpsTester<Scalar> vectorStdOpsTester;
00064 vectorStdOpsTester.warning_tol(ScalarMag(0.1)*max_rel_err);
00065 vectorStdOpsTester.error_tol(max_rel_err);
00066 MultiVectorStdOpsTester<Scalar> multiVectorStdOpsTester;
00067 multiVectorStdOpsTester.warning_tol(ScalarMag(0.1)*max_rel_err);
00068 multiVectorStdOpsTester.error_tol(max_rel_err);
00069
00070 if(out.get()) *out << "\n*** Entering run_std_ops_tests<"<<ST::name()<<">(...) ...\n";
00071
00072 bool success = true;
00073
00074 if(out.get()) *out << "\nCreating a serial vector space svs with n="<<n<<" vector elements ...\n";
00075
00076 const RCP<const Teuchos::Comm<Ordinal> >
00077 comm = Teuchos::DefaultComm<Ordinal>::getComm();
00078
00079 const RCP<Thyra::VectorSpaceBase<Scalar> > svs =
00080 Thyra::defaultSpmdVectorSpace<Scalar>(comm,n,-1);
00081
00082 if(out.get()) *out << "\nTesting standard vector ops with svs ...\n";
00083 if(!vectorStdOpsTester.checkStdOps(*svs, OSTab(out).get(), dumpAll)) success = false;
00084
00085 if(out.get()) *out << "\nTesting standard multi-vector ops with svs ...\n";
00086 if(!multiVectorStdOpsTester.checkStdOps(*svs, OSTab(out).get(), dumpAll)) success = false;
00087
00088 const int numBlocks = 3;
00089
00090 if(out.get()) *out << "\nCreating a product space pvs with numBlocks="<<numBlocks<<" and n="<<n<<"vector elements per block ...\n";
00091
00092 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > >
00093 vecSpaces(numBlocks);
00094 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
00095 spaceBlock = Thyra::defaultSpmdVectorSpace<Scalar>(comm,n,-1);
00096 for( int i = 0; i < numBlocks; ++i )
00097 vecSpaces[i] = spaceBlock;
00098
00099 RCP<Thyra::DefaultProductVectorSpace<Scalar> > pvs =
00100 rcp(new Thyra::DefaultProductVectorSpace<Scalar>(numBlocks,&vecSpaces[0]));
00101
00102 if(out.get()) *out << "\nTesting standard vector ops with pvs ...\n";
00103 if(!vectorStdOpsTester.checkStdOps(*pvs, OSTab(out).get(), dumpAll)) success = false;
00104
00105 if(out.get()) *out << "\nTesting standard multi-vector ops with pvs ...\n";
00106 if(!multiVectorStdOpsTester.checkStdOps(*pvs, OSTab(out).get(), dumpAll)) success = false;
00107
00108 if(out.get()) *out << "\nCreating a nested product space ppvs with numBlocks="<<numBlocks<<" product spaces as components ...\n";
00109
00110 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > >
00111 blockVecSpaces(numBlocks);
00112 for( int i = 0; i < numBlocks; ++i )
00113 blockVecSpaces[i] = pvs;
00114
00115 RCP<Thyra::DefaultProductVectorSpace<Scalar> > ppvs =
00116 rcp(new Thyra::DefaultProductVectorSpace<Scalar>(numBlocks, &blockVecSpaces[0]));
00117
00118 if(out.get()) *out << "\nTesting standard vector ops with ppvs ...\n";
00119 if(!vectorStdOpsTester.checkStdOps(*ppvs, OSTab(out).get(), dumpAll)) success = false;
00120
00121 if(out.get()) *out << "\nTesting standard multi-vector ops with ppvs ...\n";
00122 if(!multiVectorStdOpsTester.checkStdOps(*ppvs, OSTab(out).get(), dumpAll)) success = false;
00123
00124 return success;
00125
00126 }
00127
00128 }
00129
00130 int main( int argc, char* argv[] ) {
00131
00132 using Teuchos::CommandLineProcessor;
00133
00134 bool success = true;
00135 bool verbose = true;
00136 bool dumpAll = false;
00137
00138 Teuchos::GlobalMPISession mpiSession(&argc,&argv);
00139
00140
00141
00142
00143 Teuchos::RCP<Teuchos::FancyOStream>
00144 out = Teuchos::VerboseObjectBase::getDefaultOStream();
00145
00146 try {
00147
00148
00149
00150
00151
00152
00153 CommandLineProcessor clp;
00154 clp.throwExceptions(false);
00155 clp.addOutputSetupOptions(true);
00156
00157 int local_dim = 4;
00158 clp.setOption( "local-dim", &local_dim, "Number of vector elements per process." );
00159
00160 double eps_scale = 200.0;
00161 clp.setOption( "eps-scale", &eps_scale, "Constant (greater than 1) to scale eps by in error tests." );
00162
00163 clp.setOption( "verbose", "quiet", &verbose,
00164 "Determines if any output is printed or not." );
00165
00166 clp.setOption( "dump-all", "no-dump", &dumpAll, "Determines if quantities are dumped or not." );
00167
00168 CommandLineProcessor::EParseCommandLineReturn parse_return = clp.parse(argc,argv);
00169 if( parse_return != CommandLineProcessor::PARSE_SUCCESSFUL ) return parse_return;
00170
00171
00172
00173
00174
00175 #if defined(HAVE_THYRA_FLOAT)
00176 if( !Thyra::run_std_ops_tests<float>(local_dim,float(eps_scale*Teuchos::ScalarTraits<float>::eps()),dumpAll,verbose?&*out:NULL) ) success = false;
00177 #endif
00178 if( !Thyra::run_std_ops_tests<double>(local_dim,double(eps_scale*Teuchos::ScalarTraits<double>::eps()),dumpAll,verbose?&*out:NULL) ) success = false;
00179 #if defined(HAVE_THYRA_COMPLEX) && defined(HAVE_THYRA_FLOAT)
00180 if( !Thyra::run_std_ops_tests<std::complex<float> >(local_dim,float(eps_scale*Teuchos::ScalarTraits<float>::eps()),dumpAll,verbose?&*out:NULL) ) success = false;
00181 #endif
00182 #if defined(HAVE_THYRA_COMPLEX)
00183 if( !Thyra::run_std_ops_tests<std::complex<double> >(local_dim,double(eps_scale*Teuchos::ScalarTraits<double>::eps()),dumpAll,verbose?&*out:NULL) ) success = false;
00184 #endif
00185 #ifdef HAVE_TEUCHOS_GNU_MP
00186
00187
00188
00189
00190 #endif
00191
00192 }
00193 catch( const std::exception &excpt ) {
00194 if(verbose)
00195 std::cerr << "*** Caught a standard exception : " << excpt.what() << std::endl;
00196 success = false;
00197 }
00198 catch( ... ) {
00199 if(verbose)
00200 std::cerr << "*** Caught an unknown exception!\n";
00201 success = false;
00202 }
00203
00204 if(verbose) {
00205 if(success)
00206 *out << "\nAll of the tests seem to have run successfully!\n";
00207 else
00208 *out << "\nOh no! at least one of the test failed!\n";
00209 }
00210
00211 return success ? 0 : 1;
00212
00213 }