Thyra_VectorStdOpsTester.hpp

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_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 //#define THYRA_VECTOR_STD_OPS_TESTER_DUMP
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 // VectorStdOpsTesterComparable (using partial specialization to only do tests in some cases)
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 // VectorStdOpsTester
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   // ToDo: Add tests for *all* standard operators!
00308   
00309   Scalar alpha;
00310   Scalar beta;
00311 
00312   // Test Vt_S
00313   if(out) *out << "\nTesting Vt_S(&*z,alpha) ...\n";
00314   v1  = createMember(vecSpc);
00315   v2  = createMember(vecSpc);
00316 /* RAB: I commented this out since it was not setting
00317  * (real,imag) but just the real part.
00318  */
00319 /*
00320   if (ST::isComplex)
00321     alpha = (Scalar(1.2345), Scalar(1.2345));
00322   else
00323     alpha = Scalar(1.2345);
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   // Test V_StV
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   // Test Vp_StV
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); // v1 = rand
00366   randomize(Scalar(-ST::one()),ST::one(),&*v2); // v2 = rand
00367   V_V(&*v3,*v1); // v3 = v1
00368   Vp_StV(&*v1,alpha,*v2); // v1 += alpha*v2
00369   V_StV(&*z,alpha,*v2); // z = alpha*v2
00370   Vp_V(&*z,*v3); // z += v3
00371   V_V(&*v3,*v1); // v3 = v1
00372   Vp_V(&*v3,*z,Scalar(-ST::one())); // v3 -= z
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   // Test ele_wise_prod
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); // v1 = rand
00388   randomize(Scalar(-ST::one()),ST::one(),&*v2); // v2 = rand
00389   randomize(Scalar(-ST::one()),ST::one(),&*v3); // v3 = rand
00390   V_V(&*v4, *v1); // v4 = v1
00391   V_V(&*z, *v2); // z = v2
00392   ele_wise_prod(alpha, *v2, *v3, &*v1); // v1 += alpha * v2 * v3
00393   ele_wise_prod_update(alpha, *v3, &*z); // z *= alpha * v3
00394   Vp_V(&*z, *v4); // z += v4
00395   V_V(&*v2, *v1); // v2 = v1
00396   Vp_V(&*v2, *z, Scalar(-ST::one())); // v2 -= z
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   // Test Vt_StV
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); // v1 = rand
00412   randomize(Scalar(-ST::one()),ST::one(),&*v2); // v2 = rand
00413   V_V(&*v3,*v1); // v3 = v1
00414   Vt_StV(&*v1,alpha,*v2); // v1 *= alpha*v2
00415   V_S(&*z,ST::zero()); // z = 0
00416   Vp_StVtV(&*z,alpha,*v3,*v2); // z += alpha*v3*v2
00417   V_V(&*v2,*v1); // v2 = v1
00418   Vp_V(&*v2,*z,Scalar(-ST::one())); // v2 -= z
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   // Test V_StVpV
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   // Test V_VpStV
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   // Test V_StVpStV
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   // Test Vp_V
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   // Test Vp_V
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   // Test V_S
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   // Test V_V
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 } // namespace Thyra
00576 
00577 #endif // THYRA_VECTOR_STD_OPS_TESTER_HPP

Generated on Wed May 12 21:26:55 2010 for Thyra Operator/Vector Support by  doxygen 1.4.7