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_STD_OPS_TESTER_HPP
00030 #define THYRA_VECTOR_STD_OPS_TESTER_HPP
00031
00032 #include "Thyra_VectorStdOpsTesterDecl.hpp"
00033 #include "Thyra_TestingTools.hpp"
00034 #include "Teuchos_arrayArg.hpp"
00035
00036
00037
00038 #ifdef THYRA_VECTOR_STD_OPS_TESTER_DUMP
00039 # include "RTOpPack_SPMD_apply_op_decl.hpp"
00040 # include "Thyra_SpmdVectorBase.hpp"
00041 #endif // THYRA_VECTOR_STD_OPS_TESTER_DUMP
00042
00043 namespace Thyra {
00044
00045
00046
00047 template <bool isComparable, class Scalar>
00048 class VectorStdOpsTesterComparable {
00049 public:
00050 static bool checkComparableStdOps(
00051 const VectorSpaceBase<Scalar> &vecSpc
00052 ,VectorBase<Scalar> *z
00053 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType &error_tol
00054 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType &warning_tol
00055 ,std::ostream *out
00056 ,const bool &dumpAll
00057 )
00058 {
00059 return Teuchos::ScalarTraits<Scalar>::ThisShouldNotCompile();
00060 }
00061 };
00062
00063 template <class Scalar>
00064 class VectorStdOpsTesterComparable<false,Scalar> {
00065 public:
00066 static bool checkComparableStdOps(
00067 const VectorSpaceBase<Scalar> &vecSpc
00068 ,VectorBase<Scalar> *z
00069 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType &error_tol
00070 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType &warning_tol
00071 ,std::ostream *out
00072 ,const bool &dumpAll
00073 )
00074 {
00075 if(out) *out << "\nThis scalar type does not support comparable operations so we can not test min(), max() and other such functions.\n";
00076 return true;
00077 }
00078 };
00079
00080 template <class Scalar>
00081 class VectorStdOpsTesterComparable<true,Scalar> {
00082 public:
00083 static bool checkComparableStdOps(
00084 const VectorSpaceBase<Scalar> &vecSpc
00085 ,VectorBase<Scalar> *z
00086 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType &error_tol
00087 ,const typename Teuchos::ScalarTraits<Scalar>::magnitudeType &warning_tol
00088 ,std::ostream *out
00089 ,const bool &dumpAll
00090 )
00091 {
00092 typedef Teuchos::ScalarTraits<Scalar> ST;
00093
00094 bool success = true, result;
00095
00096 if(out) *out << "\nTesting comparable operations ...\n";
00097
00098 const Scalar scalarSmall(1e-5), scalarMedium(2.0), scalarLarge(100.0);
00099 if(out) *out << "\nassign(&*z,"<<scalarMedium<<");\n";
00100 assign(&*z,Scalar(scalarMedium));
00101 if(out && dumpAll) *out << "\nz =\n" << *z;
00102 if(out) *out << "\nset_ele(0,"<<scalarSmall<<",&*z);\n";
00103 set_ele(0,scalarSmall,&*z);
00104 if(out && dumpAll) *out << "\nz =\n" << *z;
00105 if(out) *out << "\nset_ele(1,"<<scalarLarge<<",&*z);\n";
00106 set_ele(1,scalarLarge,&*z);
00107 if(out && dumpAll) *out << "\nz =\n" << *z;
00108 if(out) *out << "\nset_ele(vecSpc.dim()-2,"<<scalarSmall<<",&*z);\n";
00109 set_ele(vecSpc.dim()-2,scalarSmall,&*z);
00110 if(out && dumpAll) *out << "\nz =\n" << *z;
00111 if(out) *out << "\nset_ele(vecSpc.dim()-1,"<<scalarLarge<<",&*z);\n";
00112 set_ele(vecSpc.dim()-1,scalarLarge,&*z);
00113 if(out && dumpAll) *out << "\nz =\n" << *z;
00114
00115 Scalar minEle; Index minIndex;
00116 Scalar maxEle; Index maxIndex;
00117
00118 if(!testRelErr<Scalar>(
00119 "min(*z)",min(*z),"scalarSmall",scalarSmall
00120 ,"error_tol",error_tol,"warning_tol",warning_tol,out
00121 )
00122 ) success=false;
00123
00124 if(out) *out << "\nmin(*z,&minEle,&minIndex);\n";
00125 minEle = ST::zero(); minIndex = 0;
00126 min(*z,&minEle,&minIndex);
00127 if(!testRelErr<Scalar>(
00128 "minEle",minEle,"scalarSmall",scalarSmall
00129 ,"error_tol",error_tol,"warning_tol",warning_tol,out
00130 )
00131 ) success=false;
00132 result = minIndex == 0;
00133 if(out) *out << "\nminIndex = " << minIndex << " == 0 ? " << passfail(result) << std::endl;
00134 if(!result) success = false;
00135
00136 if(out) *out << "\nminGreaterThanBound(*z,"<<scalarMedium<<",&minEle,&minIndex);\n";
00137 minEle = ST::zero(); minIndex = 0;
00138 minGreaterThanBound(*z,scalarMedium,&minEle,&minIndex);
00139 if(!testRelErr<Scalar>(
00140 "minEle",minEle,"scalarLarge",scalarLarge
00141 ,"error_tol",error_tol,"warning_tol",warning_tol,out
00142 )
00143 ) success=false;
00144 result = minIndex == 1;
00145 if(out) *out << "\nminIndex = " << minIndex << " == 1 ? " << passfail(result) << std::endl;
00146 if(!result) success = false;
00147
00148 if(out) *out << "\nminGreaterThanBound(*z,"<<scalarLarge<<",&minEle,&minIndex);\n";
00149 minEle = ST::zero(); minIndex = 0;
00150 minGreaterThanBound(*z,scalarLarge,&minEle,&minIndex);
00151 result = minIndex < 0;
00152 if(out) *out << "\nminIndex = " << minIndex << " < 0 ? " << passfail(result) << std::endl;
00153 if(!result) success = false;
00154
00155 if(!testRelErr<Scalar>(
00156 "max(*z)",max(*z),"scalarLarge",scalarLarge
00157 ,"error_tol",error_tol,"warning_tol",warning_tol,out)
00158 ) success=false;
00159
00160 if(out) *out << "\nmax(*z,&maxEle,&maxIndex);\n";
00161 maxEle = ST::zero(); maxIndex = 0;
00162 max(*z,&maxEle,&maxIndex);
00163 if(!testRelErr<Scalar>(
00164 "maxEle",maxEle,"scalarLarge",scalarLarge
00165 ,"error_tol",error_tol,"warning_tol",warning_tol,out)
00166 ) success=false;
00167 result = maxIndex == 1;
00168 if(out) *out << "\nmaxIndex = " << maxIndex << " == 1 ? " << passfail(result) << std::endl;
00169 if(!result) success = false;
00170
00171 if(out) *out << "\nmaxLessThanBound(*z,"<<scalarMedium<<",&maxEle,&maxIndex);\n";
00172 maxEle = ST::zero(); maxIndex = 0;
00173 maxLessThanBound(*z,scalarMedium,&maxEle,&maxIndex);
00174 if(!testRelErr<Scalar>(
00175 "maxEle",maxEle,"scalarSmall",scalarSmall
00176 ,"error_tol",error_tol,"warning_tol",warning_tol,out)
00177 ) success=false;
00178 result = maxIndex == 0;
00179 if(out) *out << "\nmaxIndex = " << maxIndex << " == 0 ? " << passfail(result) << std::endl;
00180 if(!result) success = false;
00181
00182 if(out) *out << "\nmaxLessThanBound(*z,"<<scalarSmall<<",&maxEle,&maxIndex);\n";
00183 maxEle = ST::zero(); maxIndex = 0;
00184 maxLessThanBound(*z,scalarSmall,&maxEle,&maxIndex);
00185 result = ( maxIndex < 0 );
00186 if(out) *out << "\nmaxIndex = " << maxIndex << " < 0 ? " << passfail(result) << std::endl;
00187 if(!result) success = false;
00188
00189 return success;
00190 }
00191 };
00192
00193
00194
00195
00196 template <class Scalar>
00197 VectorStdOpsTester<Scalar>::VectorStdOpsTester(
00198 const ScalarMag &warning_tol
00199 ,const ScalarMag &error_tol
00200 )
00201 :warning_tol_(warning_tol)
00202 ,error_tol_(error_tol)
00203 {}
00204
00205 template <class Scalar>
00206 bool VectorStdOpsTester<Scalar>::checkStdOps(
00207 const VectorSpaceBase<Scalar> &vecSpc
00208 ,std::ostream *out
00209 ,const bool &dumpAll
00210 )
00211 {
00212 using Teuchos::arrayArg;
00213 using Teuchos::outArg;
00214 typedef Teuchos::ScalarTraits<Scalar> ST;
00215
00216 if(out)
00217 *out << "\n*** Entering VectorStdOpsTester<"<<ST::name()<<">::checkStdOps(...) ...\n"
00218 << "using a \'" << vecSpc.description() << "\' object ...\n";
00219
00220 bool success = true;
00221 if(out) *out << "\nvecSpc.dim() = " << vecSpc.dim() << std::endl;
00222
00223 if(out) *out << "\nCreating vectors v1, v2, v3, v4, x and z ...\n";
00224 Teuchos::RCP<VectorBase<Scalar> >
00225 v1 = createMember(vecSpc),
00226 v2 = createMember(vecSpc),
00227 v3 = createMember(vecSpc),
00228 v4 = createMember(vecSpc),
00229 x = createMember(vecSpc),
00230 z = createMember(vecSpc);
00231
00232 if(out) *out << "\nassign(&*v1,-2.0);\n";
00233 assign(&*v1,Scalar(-2.0));
00234 if(out) *out << "\nassign(&*v2,-3.0);\n";
00235 assign(&*v2,Scalar(-3.0));
00236 if(out) *out << "\nassign(&*v3,-4.0);\n";
00237 assign(&*v3,Scalar(-4.0));
00238
00239 if(!testRelErr<Scalar>(
00240 "norm_inf(*v1)",norm_inf(*v1),"2.0",Scalar(2.0)
00241 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out)
00242 ) success=false;
00243
00244 if(!testRelErr<Scalar>(
00245 "norm_2(*v1)",norm_2(*v1),"2.0*sqrt(vecSpc.dim())",Scalar(2.0)*ST::squareroot(vecSpc.dim())
00246 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out)
00247 ) success=false;
00248
00249 if(!testRelErr<Scalar>(
00250 "norm_1(*v1)",norm_1(*v1),"2.0*vecSpc.dim()",Scalar(2.0)*Scalar(vecSpc.dim())
00251 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out)
00252 ) success=false;
00253
00254 if(out) *out << "\nabs(&*z,*v1);\n";
00255 abs(&*z,*v1);
00256 #ifdef THYRA_VECTOR_STD_OPS_TESTER_DUMP
00257 SpmdVectorBase<Scalar>::show_dump = true;
00258 RTOpPack::show_spmd_apply_op_dump = true;
00259 #endif // THYRA_VECTOR_STD_OPS_TESTER_DUMP
00260 if(!testRelErr<Scalar>(
00261 "sum(*z)",sum(*z),"2.0*vecSpc.dim()",Scalar(2.0)*Scalar(vecSpc.dim())
00262 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out)
00263 ) success=false;
00264 #ifdef THYRA_VECTOR_STD_OPS_TESTER_DUMP
00265 SpmdVectorBase<Scalar>::show_dump = false;
00266 RTOpPack::show_spmd_apply_op_dump = false;
00267 #endif // THYRA_VECTOR_STD_OPS_TESTER_DUMP
00268
00269 if(out) *out << "\nreciprocal(&*z,*v1);\n";
00270 reciprocal(&*z,*v1);
00271 if(!testRelErr<Scalar>(
00272 "sum(*z)",sum(*z),"-0.5*vecSpc.dim()",Scalar(-0.5)*Scalar(vecSpc.dim())
00273 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out)
00274 ) success=false;
00275
00276 if(out) *out << "\nlinear_combination(2,{0.5,0.25},{&*v1,&*v2},0.0,&*z);\n";
00277 linear_combination(2,arrayArg<Scalar>(0.5,0.25)(),arrayArg<const VectorBase<Scalar>*>(&*v1,&*v2)(),Scalar(0.0),&*z);
00278 if(!testRelErr<Scalar>(
00279 "sum(*z)",sum(*z),"(-0.5*2.0-0.25*3.0)*vecSpc.dim()",Scalar(-0.5*2.0-0.25*3.0)*Scalar(vecSpc.dim())
00280 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out)
00281 ) success=false;
00282
00283 if(out) *out << "\nassign(&*z,2.0);\n";
00284 assign(&*z,Scalar(2.0));
00285 if(out) *out << "\nlinear_combination(3,{0.5,0.25,0.125},{&*v1,&*v2,&*v2},0.5,&*z);\n";
00286 linear_combination(3,arrayArg<Scalar>(0.5,0.25,0.125)(),arrayArg<const VectorBase<Scalar>*>(&*v1,&*v2,&*v3)(),Scalar(0.5),&*z);
00287 if(!testRelErr<Scalar>(
00288 "sum(*z)",sum(*z)
00289 ,"(0.5*2.0-0.5*2.0-0.25*3.0-0.125*4.0)*vecSpc.dim()",Scalar(0.5*2.0-0.5*2.0-0.25*3.0-0.125*4.0)*Scalar(vecSpc.dim())
00290 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00291 )
00292 ) success=false;
00293
00294 if(out) *out << "\nassign(&*z,2.0);\n";
00295 assign(&*z,Scalar(2.0));
00296 if(!testRelErr<Scalar>(
00297 "norm_2(*z,*v2)",norm_2(*z,*v2)
00298 ,"sqrt(2.0*3.0*3.0*vecSpc.dim())",ST::magnitude(ST::squareroot(Scalar(2.0*3.0*3.0)*Scalar(vecSpc.dim())))
00299 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00300 )
00301 ) success=false;
00302
00303 if(!VectorStdOpsTesterComparable<ST::isComparable,Scalar>::checkComparableStdOps(
00304 vecSpc,&*z,error_tol(),warning_tol(),out,dumpAll)
00305 ) success=false;
00306
00307
00308
00309 Scalar alpha;
00310 Scalar beta;
00311
00312
00313 if(out) *out << "\nTesting Vt_S(&*z,alpha) ...\n";
00314 v1 = createMember(vecSpc);
00315 v2 = createMember(vecSpc);
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325 alpha = Scalar(1.2345);
00326 seed_randomize<Scalar>(12345);
00327 randomize(Scalar(-ST::one()),ST::one(),&*v1);
00328 V_V(&*v2,*v1);
00329 Vt_S(&*v1,alpha);
00330 Scalar norm_alpha_v1 = norm_2(*v1);
00331 Scalar alpha_norm_v1 = ST::magnitude(alpha)*norm_2(*v2);
00332 if(!testMaxErr<Scalar>(
00333 "norm_alpha_v1 - alpha_norm_v1",ST::magnitude(norm_alpha_v1-alpha_norm_v1)
00334 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00335 )
00336 ) success=false;
00337
00338
00339 if(out) *out << "\nTesting V_StV(&*z,alpha,*v) ...\n";
00340 v1 = createMember(vecSpc);
00341 v2 = createMember(vecSpc);
00342 z = createMember(vecSpc);
00343 alpha = Scalar(-1.2345);
00344 seed_randomize<Scalar>(12345);
00345 randomize(Scalar(-ST::one()),ST::one(),&*v1);
00346 V_StV(&*v2,alpha,*v1);
00347 Vt_S(&*v1,alpha);
00348 V_V(&*z,*v1);
00349 Vp_V(&*z,*v2,Scalar(-ST::one()));
00350 if(!testMaxErr<Scalar>(
00351 "norm_2(*z)",norm_2(*z)
00352 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00353 )
00354 ) success=false;
00355
00356
00357
00358 if(out) *out << "\nTesting Vp_StV(&*z,alpha,*v) ...\n";
00359 v1 = createMember(vecSpc);
00360 v2 = createMember(vecSpc);
00361 v3 = createMember(vecSpc);
00362 z = createMember(vecSpc);
00363 alpha = Scalar(-1.2345);
00364 seed_randomize<Scalar>(12345);
00365 randomize(Scalar(-ST::one()),ST::one(),&*v1);
00366 randomize(Scalar(-ST::one()),ST::one(),&*v2);
00367 V_V(&*v3,*v1);
00368 Vp_StV(&*v1,alpha,*v2);
00369 V_StV(&*z,alpha,*v2);
00370 Vp_V(&*z,*v3);
00371 V_V(&*v3,*v1);
00372 Vp_V(&*v3,*z,Scalar(-ST::one()));
00373 if(!testMaxErr<Scalar>(
00374 "norm_2(*v3)",norm_2(*v3)
00375 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00376 )
00377 ) success=false;
00378
00379
00380 if(out) *out << "\nTesting ele_wise_prod(alpha,*v1, *v2, &*z) ...\n";
00381 v1 = createMember(vecSpc);
00382 v2 = createMember(vecSpc);
00383 v3 = createMember(vecSpc);
00384 z = createMember(vecSpc);
00385 alpha = Scalar(-1.2345);
00386 seed_randomize<Scalar>(12345);
00387 randomize(Scalar(-ST::one()),ST::one(),&*v1);
00388 randomize(Scalar(-ST::one()),ST::one(),&*v2);
00389 randomize(Scalar(-ST::one()),ST::one(),&*v3);
00390 V_V(&*v4, *v1);
00391 V_V(&*z, *v2);
00392 ele_wise_prod(alpha, *v2, *v3, &*v1);
00393 ele_wise_prod_update(alpha, *v3, &*z);
00394 Vp_V(&*z, *v4);
00395 V_V(&*v2, *v1);
00396 Vp_V(&*v2, *z, Scalar(-ST::one()));
00397 if(!testMaxErr<Scalar>(
00398 "norm_2(*v2)",norm_2(*v2)
00399 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00400 )
00401 ) success=false;
00402
00403
00404 if(out) *out << "\nTesting Vt_StV(&*z, alpha, *v) ...\n";
00405 v1 = createMember(vecSpc);
00406 v2 = createMember(vecSpc);
00407 v3 = createMember(vecSpc);
00408 z = createMember(vecSpc);
00409 alpha = Scalar(-1.2345);
00410 seed_randomize<Scalar>(12345);
00411 randomize(Scalar(-ST::one()),ST::one(),&*v1);
00412 randomize(Scalar(-ST::one()),ST::one(),&*v2);
00413 V_V(&*v3,*v1);
00414 Vt_StV(&*v1,alpha,*v2);
00415 V_S(&*z,ST::zero());
00416 Vp_StVtV(&*z,alpha,*v3,*v2);
00417 V_V(&*v2,*v1);
00418 Vp_V(&*v2,*z,Scalar(-ST::one()));
00419 if(!testMaxErr<Scalar>(
00420 "norm_2(*v2)",norm_2(*v2)
00421 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00422 )
00423 ) success=false;
00424
00425
00426 if(out) *out << "\nTesting V_StVpV(&*z,alpha,*v1,*v2) ...\n";
00427 v1 = createMember(vecSpc);
00428 v2 = createMember(vecSpc);
00429 v3 = createMember(vecSpc);
00430 x = createMember(vecSpc);
00431 z = createMember(vecSpc);
00432 alpha = Scalar(1.2345);
00433 seed_randomize<Scalar>(12345);
00434 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v1);
00435 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v2);
00436 V_StVpV(&*v3,alpha,*v1,*v2);
00437 V_V(&*z,*v1);
00438 Vp_V(&*z,*v2,alpha);
00439 V_V(&*x,*v3);
00440 Vp_V(&*x,*z,Scalar(-ST::one()));
00441 if(!testMaxErr<Scalar>(
00442 "norm_2(*x)",norm_2(*x)
00443 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00444 )
00445 ) success=false;
00446
00447
00448 if(out) *out << "\nTesting V_VpStV(&*z,*v1,alpha,*v2) ...\n";
00449 {
00450 v1 = createMember(vecSpc);
00451 v2 = createMember(vecSpc);
00452 v3 = createMember(vecSpc);
00453 x = createMember(vecSpc);
00454 z = createMember(vecSpc);
00455 alpha = Scalar(1.2345);
00456 seed_randomize<Scalar>(12345);
00457 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v1);
00458 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v2);
00459 V_VpStV(outArg(*v3), *v1, alpha, *v2);
00460 V_V(&*z, *v1);
00461 Vp_StV(&*z, alpha, *v2);
00462 V_VmV(outArg(*x), *z, *v3);
00463 if(!testMaxErr<Scalar>(
00464 "norm_2(*x)",norm_2(*x)
00465 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00466 )
00467 ) success=false;
00468 }
00469
00470 if(out) *out << "\nTesting V_StVpStV(&*z,alpha,*v1,beta,*v2) ...\n";
00471 v1 = createMember(vecSpc);
00472 v2 = createMember(vecSpc);
00473 v3 = createMember(vecSpc);
00474 x = createMember(vecSpc);
00475 z = createMember(vecSpc);
00476 alpha = Scalar(1.2345);
00477 beta = Scalar(5.4321);
00478 seed_randomize<Scalar>(12345);
00479 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v1);
00480 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v2);
00481 V_StVpStV(&*v3,alpha,*v1,beta,*v2);
00482 V_StV(&*z,alpha,*v1);
00483 Vp_StV(&*z,beta,*v2);
00484 V_V(&*x,*v3);
00485 Vp_V(&*x,*z,Scalar(-ST::one()));
00486 if(!testMaxErr<Scalar>(
00487 "norm_2(*x)",norm_2(*x)
00488 ,"10*error_tol",ScalarMag(ScalarMag(10)*error_tol()),"warning_tol",warning_tol(),out
00489 )
00490 ) success=false;
00491
00492
00493 if(out) *out << "\nTesting Vp_V(&*v1,*v2,beta) ...\n";
00494 v1 = createMember(vecSpc);
00495 v2 = createMember(vecSpc);
00496 v3 = createMember(vecSpc);
00497 x = createMember(vecSpc);
00498 z = createMember(vecSpc);
00499 alpha = Scalar(-2.0);
00500 beta = Scalar(10.0);
00501 V_S(&*v1,alpha);
00502 seed_randomize<Scalar>(12345);
00503 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v2);
00504 Vp_V(&*v1,*v2,beta);
00505 V_S(&*v3,alpha);
00506 V_StVpV(&*z,beta,*v3,*v2);
00507 V_StVpV(&*x,Scalar(-ST::one()),*z,*v1);
00508 if(!testMaxErr<Scalar>(
00509 "norm_2(*x)",norm_2(*x)
00510 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00511 )
00512 ) success=false;
00513
00514
00515 if(out) *out << "\nTesting Vp_V(&*v1,*v2) ...\n";
00516 v1 = createMember(vecSpc);
00517 v2 = createMember(vecSpc);
00518 v3 = createMember(vecSpc);
00519 x = createMember(vecSpc);
00520 z = createMember(vecSpc);
00521 alpha = Scalar(-2.0);
00522 V_S(&*v1,alpha);
00523 seed_randomize<Scalar>(12345);
00524 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v2);
00525 Vp_V(&*v1,*v2);
00526 V_S(&*v3,alpha);
00527 V_StVpV(&*z,ST::one(),*v3,*v2);
00528 V_StVpV(&*x,Scalar(-ST::one()),*z,*v1);
00529 if(!testMaxErr<Scalar>(
00530 "norm_2(*x)",norm_2(*x)
00531 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00532 )
00533 ) success=false;
00534
00535
00536 if(out) *out << "\nTesting V_S(&*v1,alpha) ...\n";
00537 v1 = createMember(vecSpc);
00538 v2 = createMember(vecSpc);
00539 z = createMember(vecSpc);
00540 alpha = Scalar(1.2345);
00541 assign(&*v1,alpha);
00542 V_S(&*v2,alpha);
00543 V_StVpV(&*z,Scalar(-ST::one()),*v1,*v2);
00544 if(!testMaxErr<Scalar>(
00545 "norm_2(*z)",norm_2(*z)
00546 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00547 )
00548 ) success=false;
00549
00550
00551
00552 if(out) *out << "\nTesting V_V(&*v1,*v2) ...\n";
00553 v1 = createMember(vecSpc);
00554 v2 = createMember(vecSpc);
00555 z = createMember(vecSpc);
00556 seed_randomize<Scalar>(12345);
00557 randomize(Scalar(Scalar(-10)*ST::one()),Scalar(Scalar(10)*ST::one()),&*v1);
00558 V_V(&*v2,*v1);
00559 V_StVpV(&*z,Scalar(-ST::one()),*v1,*v2);
00560 if(!testMaxErr<Scalar>(
00561 "norm_2(*z)",norm_2(*z)
00562 ,"error_tol",error_tol(),"warning_tol",warning_tol(),out
00563 )
00564 ) success=false;
00565
00566
00567
00568 if(out) *out
00569 << "\n*** Leaving VectorStdOpsTester<"<<ST::name()<<">::checkStdOps(...) ...\n";
00570
00571 return success;
00572
00573 }
00574
00575 }
00576
00577 #endif // THYRA_VECTOR_STD_OPS_TESTER_HPP