42 #ifndef ANASAZI_MVOPTESTER_HPP 
   43 #define ANASAZI_MVOPTESTER_HPP 
   66 #include "Teuchos_SetScientific.hpp" 
   77   template< 
class ScalarType, 
class MV >
 
  161     typedef typename SCT::magnitudeType       MagType;
 
  163     const ScalarType one      = SCT::one();
 
  164     const ScalarType zero     = SCT::zero();
 
  166     const MagType    tol = SCT::eps()*100;
 
  169     const int numvecs   = 10;
 
  170     const int numvecs_2 = 5;
 
  172     std::vector<int> ind(numvecs_2);
 
  193     if ( MVT::GetNumberVecs(*A) <= 0 ) {
 
  195         << 
"*** ERROR *** MultiVectorTraits::GetNumberVecs()." << endl
 
  196         << 
"Returned <= 0." << endl;
 
  204     if ( MVT::GetGlobalLength(*A) <= 0 ) {
 
  206         << 
"*** ERROR *** MultiVectorTraitsExt::GetGlobalLength()" << endl
 
  207         << 
"Returned <= 0." << endl;
 
  219       std::vector<MagType> norms(2*numvecs);
 
  220       bool ResizeWarning = 
false;
 
  221       if ( MVT::GetNumberVecs(*B) != numvecs ) {
 
  223           << 
"*** ERROR *** MultiVecTraits::Clone()." << endl
 
  224           << 
"Did not allocate requested number of vectors." << endl;
 
  227       if ( MVT::GetGlobalLength(*B) != MVT::GetGlobalLength(*A) ) {
 
  229           << 
"*** ERROR *** MultiVecTraits::Clone()." << endl
 
  230           << 
"Did not allocate requested number of vectors." << endl;
 
  233       MVT::MvNorm(*B, norms);
 
  234       if ( (
int)norms.size() != 2*numvecs && (ResizeWarning == 
false) ) {
 
  236           << 
"*** WARNING *** MultiVecTraits::MvNorm()." << endl
 
  237           << 
"Method resized the output vector." << endl;
 
  238         ResizeWarning = 
true;
 
  240       for (
int i=0; i<numvecs; i++) {
 
  241         if ( norms[i] < zero_mag ) {
 
  243             << 
"*** ERROR *** MultiVecTraits::Clone()." << endl
 
  244             << 
"Vector had negative norm." << endl;
 
  268       std::vector<MagType> norms(numvecs), norms2(numvecs);
 
  271       MVT::MvNorm(*B, norms);
 
  272       for (
int i=0; i<numvecs; i++) {
 
  273         if ( norms[i] != zero_mag ) {
 
  275             << 
"*** ERROR *** MultiVecTraits::MvInit() " 
  276             << 
"and MultiVecTraits::MvNorm()" << endl
 
  277             << 
"Supposedly zero vector has non-zero norm." << endl;
 
  282       MVT::MvNorm(*B, norms);
 
  284       MVT::MvNorm(*B, norms2);
 
  285       for (
int i=0; i<numvecs; i++) {
 
  286         if ( norms[i] == zero_mag || norms2[i] == zero_mag ) {
 
  288             << 
"*** ERROR *** MultiVecTraits::MvRandom()." << endl
 
  289             << 
"Random vector was empty (very unlikely)." << endl;
 
  292         else if ( norms[i] < zero_mag || norms2[i] < zero_mag ) {
 
  294             << 
"*** ERROR *** MultiVecTraits::MvRandom()." << endl
 
  295             << 
"Vector had negative norm." << endl;
 
  298         else if ( norms[i] == norms2[i] ) {
 
  300             << 
"*** ERROR *** MutliVecTraits::MvRandom()." << endl
 
  301             << 
"Vectors not random enough." << endl;
 
  317       std::vector<MagType> norms(numvecs);
 
  320       MVT::MvScale(*B,SCT::zero());
 
  321       MVT::MvNorm(*B, norms);
 
  322       for (
int i=0; i<numvecs; i++) {
 
  323         if ( norms[i] != zero_mag ) {
 
  325             << 
"*** ERROR *** MultiVecTraits::MvScale(alpha) " 
  326             << 
"Supposedly zero vector has non-zero norm." << endl;
 
  332       std::vector<ScalarType> zeros(numvecs,SCT::zero());
 
  333       MVT::MvScale(*B,zeros);
 
  334       MVT::MvNorm(*B, norms);
 
  335       for (
int i=0; i<numvecs; i++) {
 
  336         if ( norms[i] != zero_mag ) {
 
  338             << 
"*** ERROR *** MultiVecTraits::MvScale(alphas) " 
  339             << 
"Supposedly zero vector has non-zero norm." << endl;
 
  361       std::vector<MagType> norms(numvecs);
 
  364       MVT::MvNorm(*B, norms);
 
  365       bool BadNormWarning = 
false;
 
  366       for (
int i=0; i<numvecs; i++) {
 
  367         if ( norms[i] < zero_mag ) {
 
  369             << 
"*** ERROR *** MultiVecTraits::MvRandom()." << endl
 
  370             << 
"Vector had negative norm." << endl;
 
  373         else if ( norms[i] != SCT::squareroot(MVT::GetGlobalLength(*B)) && !BadNormWarning ) {
 
  376             << 
"Warning testing MultiVecTraits::MvInit()." << endl
 
  377             << 
"Ones vector should have norm sqrt(dim)." << endl
 
  378             << 
"norms[i]: " << norms[i] << 
"\tdim: " << MVT::GetGlobalLength(*B) << endl << endl;
 
  379           BadNormWarning = 
true;
 
  394       std::vector<MagType> norms(numvecs);
 
  395       MVT::MvInit(*B, zero_mag);
 
  396       MVT::MvNorm(*B, norms);
 
  397       for (
int i=0; i<numvecs; i++) {
 
  398         if ( norms[i] < zero_mag ) {
 
  400             << 
"*** ERROR *** MultiVecTraits::MvInit()." << endl
 
  401             << 
"Vector had negative norm." << endl;
 
  404         else if ( norms[i] != zero_mag ) {
 
  406             << 
"*** ERROR *** MultiVecTraits::MvInit()." << endl
 
  407             << 
"Zero vector should have norm zero." << endl;
 
  421       std::vector<MagType> norms(numvecs), norms2(ind.size());
 
  423       B = MVT::Clone(*A,numvecs);
 
  425       MVT::MvNorm(*B, norms);
 
  426       C = MVT::CloneCopy(*B,ind);
 
  427       MVT::MvNorm(*C, norms2);
 
  428       if ( MVT::GetNumberVecs(*C) != numvecs_2 ) {
 
  430           << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  431           << 
"Wrong number of vectors." << endl;
 
  434       if ( MVT::GetGlobalLength(*C) != MVT::GetGlobalLength(*B) ) {
 
  436           << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  437           << 
"Vector lengths don't match." << endl;
 
  440       for (
int i=0; i<numvecs_2; i++) {
 
  441         if ( SCT::magnitude( norms2[i] - norms[ind[i]] ) > tol ) {
 
  443             << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  444             << 
"Copied vectors do not agree:"  
  445             << norms2[i] << 
" != " << norms[ind[i]] << endl
 
  446             << 
"Difference " << SCT::magnitude (norms2[i] - norms[ind[i]])
 
  447             << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  452       MVT::MvInit(*B,zero);
 
  453       MVT::MvNorm(*C, norms2); 
 
  454       for (
int i=0; i<numvecs_2; i++) {
 
  455         if ( SCT::magnitude( norms2[i] - norms2[i] ) > tol ) {
 
  457             << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  458             << 
"Copied vectors were not independent." << endl
 
  459             << 
"Difference " << SCT::magnitude (norms2[i] - norms[i])
 
  460             << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  474       std::vector<MagType> norms(numvecs), norms2(numvecs);
 
  476       B = MVT::Clone(*A,numvecs);
 
  478       MVT::MvNorm(*B, norms);
 
  479       C = MVT::CloneCopy(*B);
 
  480       MVT::MvNorm(*C, norms2);
 
  481       if ( MVT::GetNumberVecs(*C) != numvecs ) {
 
  483           << 
"*** ERROR *** MultiVecTraits::CloneCopy()." << endl
 
  484           << 
"Wrong number of vectors." << endl;
 
  487       for (
int i=0; i<numvecs; i++) {
 
  488         if ( SCT::magnitude( norms2[i] - norms[i] ) > tol ) {
 
  490             << 
"*** ERROR *** MultiVecTraits::CloneCopy()." << endl
 
  491             << 
"Copied vectors do not agree." << endl
 
  492             << 
"Difference " << SCT::magnitude (norms2[i] - norms[i])
 
  493             << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  497       MVT::MvInit(*B,zero);
 
  498       MVT::MvNorm(*C, norms); 
 
  499       for (
int i=0; i<numvecs; i++) {
 
  500         if ( SCT::magnitude( norms2[i] - norms[i] ) > tol ) {
 
  502             << 
"*** ERROR *** MultiVecTraits::CloneCopy()." << endl
 
  503             << 
"Copied vectors were not independent." << endl
 
  504             << 
"Difference " << SCT::magnitude (norms2[i] - norms[i])
 
  505             << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  520       std::vector<MagType> norms(numvecs), norms2(ind.size());
 
  522       B = MVT::Clone(*A,numvecs); 
 
  524       MVT::MvNorm(*B, norms);
 
  525       C = MVT::CloneViewNonConst(*B,ind);
 
  526       MVT::MvNorm(*C, norms2);
 
  527       if ( MVT::GetNumberVecs(*C) != numvecs_2 ) {
 
  529           << 
"*** ERROR *** MultiVecTraits::CloneView(ind)." << endl
 
  530           << 
"Wrong number of vectors." << endl;
 
  533       for (
int i=0; i<numvecs_2; i++) {
 
  534         if ( SCT::magnitude( norms2[i] - norms[ind[i]] ) > tol ) {
 
  536             << 
"*** ERROR *** MultiVecTraits::CloneView(ind)." << endl
 
  537             << 
"Viewed vectors do not agree." << endl;
 
  553       std::vector<MagType> normsB(numvecs), normsC(ind.size());
 
  554       std::vector<int> allind(numvecs);
 
  555       for (
int i=0; i<numvecs; i++) {
 
  559       B = MVT::Clone(*A,numvecs);
 
  561       MVT::MvNorm(*B, normsB);
 
  562       C = MVT::CloneView(*B,ind);
 
  563       MVT::MvNorm(*C, normsC);
 
  564       if ( MVT::GetNumberVecs(*C) != numvecs_2 ) {
 
  566           << 
"*** ERROR *** const MultiVecTraits::CloneView(ind)." << endl
 
  567           << 
"Wrong number of vectors." << endl;
 
  570       for (
int i=0; i<numvecs_2; i++) {
 
  571         if ( SCT::magnitude( normsC[i] - normsB[ind[i]] ) > tol ) {
 
  573             << 
"*** ERROR *** const MultiVecTraits::CloneView(ind)." << endl
 
  574             << 
"Viewed vectors do not agree." << endl;
 
  594       std::vector<MagType> normsB1(numvecs), normsB2(numvecs),
 
  595                            normsC1(numvecs_2), normsC2(numvecs_2);
 
  597       B = MVT::Clone(*A,numvecs);
 
  598       C = MVT::Clone(*A,numvecs_2);
 
  600       ind.resize(numvecs_2);
 
  601       for (
int i=0; i<numvecs_2; i++) {
 
  607       MVT::MvNorm(*B,normsB1);
 
  608       MVT::MvNorm(*C,normsC1);
 
  609       MVT::SetBlock(*C,ind,*B);
 
  610       MVT::MvNorm(*B,normsB2);
 
  611       MVT::MvNorm(*C,normsC2);
 
  614       for (
int i=0; i<numvecs_2; i++) {
 
  615         if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  617             << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  618             << 
"Operation modified source vectors." << endl;
 
  624       for (
int i=0; i<numvecs; i++) {
 
  627           if ( SCT::magnitude(normsB2[i]-normsC1[i/2]) > tol ) {
 
  629               << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  630               << 
"Copied vectors do not agree." << endl
 
  631               << 
"Difference " << SCT::magnitude (normsB2[i] - normsC1[i/2])
 
  632               << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  638           if ( SCT::magnitude(normsB1[i]-normsB2[i]) > tol ) {
 
  640               << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  641               << 
"Incorrect vectors were modified." << endl;
 
  646       MVT::MvInit(*C,zero);
 
  647       MVT::MvNorm(*B,normsB1);
 
  649       for (
int i=0; i<numvecs; i++) {
 
  650         if ( SCT::magnitude(normsB1[i]-normsB2[i]) > tol ) {
 
  652             << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  653             << 
"Copied vectors were not independent." << endl;
 
  687       std::vector<MagType> normsB(p), normsC(q);
 
  690       B = MVT::Clone(*A,p);
 
  691       C = MVT::Clone(*A,q);
 
  695       MVT::MvNorm(*B,normsB);
 
  697       MVT::MvNorm(*C,normsC);
 
  700       MVT::MvTransMv( zero, *B, *C, SDM );
 
  705           << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  706           << 
"Routine resized SerialDenseMatrix." << endl;
 
  713           << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  714           << 
"Scalar argument processed incorrectly." << endl;
 
  719       MVT::MvTransMv( one, *B, *C, SDM );
 
  723       for (
int i=0; i<p; i++) {
 
  724         for (
int j=0; j<q; j++) {
 
  725           if (   SCT::magnitude(SDM(i,j)) 
 
  726                > SCT::magnitude(normsB[i]*normsC[j]) ) {
 
  728               << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  729               << 
"Triangle inequality did not hold: "  
  730               << SCT::magnitude(SDM(i,j)) 
 
  732               << SCT::magnitude(normsB[i]*normsC[j]) 
 
  740       MVT::MvTransMv( one, *B, *C, SDM );
 
  741       for (
int i=0; i<p; i++) {
 
  742         for (
int j=0; j<q; j++) {
 
  743           if ( SDM(i,j) != zero ) {
 
  745               << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  746               << 
"Inner products not zero for C==0." << endl;
 
  753       MVT::MvTransMv( one, *B, *C, SDM );
 
  754       for (
int i=0; i<p; i++) {
 
  755         for (
int j=0; j<q; j++) {
 
  756           if ( SDM(i,j) != zero ) {
 
  758               << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  759               << 
"Inner products not zero for B==0." << endl;
 
  777       MVT::MvTransMv( one, *B, *C, SDM2 );
 
  778       for (
int i=0; i<p; i++) {
 
  779         for (
int j=0; j<q; j++) {
 
  780           if ( SDM2(i,j) != zero ) {
 
  782               << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  783               << 
"Inner products not zero for C==0 when using a view into Teuchos::SerialDenseMatrix<>." << endl;
 
  801       std::vector<ScalarType> iprods(q);
 
  802       std::vector<MagType> normsB(p), normsC(p);
 
  804       B = MVT::Clone(*A,p);
 
  805       C = MVT::Clone(*A,p);
 
  809       MVT::MvNorm(*B,normsB);
 
  810       MVT::MvNorm(*C,normsC);
 
  811       MVT::MvDot( *B, *C, iprods );
 
  812       if ( (
int)iprods.size() != q ) {
 
  814           << 
"*** ERROR *** MultiVecTraits::MvDot." << endl
 
  815           << 
"Routine resized results vector." << endl;
 
  818       for (
int i=0; i<p; i++) {
 
  819         if ( SCT::magnitude(iprods[i]) 
 
  820              > SCT::magnitude(normsB[i]*normsC[i]) ) {
 
  822             << 
"*** ERROR *** MultiVecTraits::MvDot()." << endl
 
  823             << 
"Inner products not valid." << endl;
 
  829       MVT::MvDot( *B, *C, iprods );
 
  830       for (
int i=0; i<p; i++) {
 
  831         if ( iprods[i] != zero ) {
 
  833             << 
"*** ERROR *** MultiVecTraits::MvDot()." << endl
 
  834             << 
"Inner products not zero for B==0." << endl;
 
  840       MVT::MvDot( *B, *C, iprods );
 
  841       for (
int i=0; i<p; i++) {
 
  842         if ( iprods[i] != zero ) {
 
  844             << 
"*** ERROR *** MultiVecTraits::MvDot()." << endl
 
  845             << 
"Inner products not zero for C==0." << endl;
 
  862       std::vector<MagType> normsB1(p), normsB2(p),
 
  863                            normsC1(p), normsC2(p),
 
  864                            normsD1(p), normsD2(p);
 
  865       ScalarType alpha = MagType(0.5) * SCT::one();
 
  866       ScalarType beta = MagType(0.33) * SCT::one();
 
  868       B = MVT::Clone(*A,p);
 
  869       C = MVT::Clone(*A,p);
 
  870       D = MVT::Clone(*A,p);
 
  874       MVT::MvNorm(*B,normsB1);
 
  875       MVT::MvNorm(*C,normsC1);
 
  878       MVT::MvAddMv(zero,*B,one,*C,*D);
 
  879       MVT::MvNorm(*B,normsB2);
 
  880       MVT::MvNorm(*C,normsC2);
 
  881       MVT::MvNorm(*D,normsD1);
 
  882       for (
int i=0; i<p; i++) {
 
  883         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  885             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  886             << 
"Input arguments were modified." << endl;
 
  889         else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  891             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  892             << 
"Input arguments were modified." << endl;
 
  895         else if ( SCT::magnitude(normsC1[i]-normsD1[i]) > tol ) {
 
  897             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  898             << 
"Assignment did not work." << endl;
 
  904       MVT::MvAddMv(one,*B,zero,*C,*D);
 
  905       MVT::MvNorm(*B,normsB2);
 
  906       MVT::MvNorm(*C,normsC2);
 
  907       MVT::MvNorm(*D,normsD1);
 
  908       for (
int i=0; i<p; i++) {
 
  909         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  911             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  912             << 
"Input arguments were modified." << endl;
 
  915         else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  917             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  918             << 
"Input arguments were modified." << endl;
 
  921         else if ( SCT::magnitude( normsB1[i] - normsD1[i] ) > tol ) {
 
  923             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  924             << 
"Assignment did not work." << endl;
 
  932       MVT::MvAddMv(alpha,*B,beta,*C,*D);
 
  933       MVT::MvNorm(*B,normsB2);
 
  934       MVT::MvNorm(*C,normsC2);
 
  935       MVT::MvNorm(*D,normsD1);
 
  937       for (
int i=0; i<p; i++) {
 
  938         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  940             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  941             << 
"Input arguments were modified." << endl;
 
  944         else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  946             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  947             << 
"Input arguments were modified." << endl;
 
  953       MVT::MvAddMv(alpha,*B,beta,*C,*D);
 
  954       MVT::MvNorm(*B,normsB2);
 
  955       MVT::MvNorm(*C,normsC2);
 
  956       MVT::MvNorm(*D,normsD2);
 
  959       for (
int i=0; i<p; i++) {
 
  960         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  962             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  963             << 
"Input arguments were modified." << endl;
 
  966         else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  968             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  969             << 
"Input arguments were modified." << endl;
 
  972         else if ( SCT::magnitude( normsD1[i] - normsD2[i] ) > tol ) {
 
  974             << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  975             << 
"Results varies depending on initial state of dest vectors." << endl;
 
 1003       std::vector<MagType> normsB(p),
 
 1005       std::vector<int> lclindex(p);
 
 1006       for (
int i=0; i<p; i++) lclindex[i] = i;
 
 1008       B = MVT::Clone(*A,p);
 
 1009       C = MVT::CloneView(*B,lclindex);
 
 1010       D = MVT::CloneViewNonConst(*B,lclindex);
 
 1013       MVT::MvNorm(*B,normsB);
 
 1016       MVT::MvAddMv(zero,*B,one,*C,*D);
 
 1017       MVT::MvNorm(*D,normsD);
 
 1018       for (
int i=0; i<p; i++) {
 
 1019         if ( SCT::magnitude( normsB[i] - normsD[i] ) > tol ) {
 
 1021             << 
"*** ERROR *** MultiVecTraits::MvAddMv() #2" << endl
 
 1022             << 
"Assignment did not work." << endl;
 
 1028       MVT::MvAddMv(one,*B,zero,*C,*D);
 
 1029       MVT::MvNorm(*D,normsD);
 
 1030       for (
int i=0; i<p; i++) {
 
 1031         if ( SCT::magnitude( normsB[i] - normsD[i] ) > tol ) {
 
 1033             << 
"*** ERROR *** MultiVecTraits::MvAddMv() #2" << endl
 
 1034             << 
"Assignment did not work." << endl;
 
 1052       const int p = 7, q = 5;
 
 1057       std::vector<MagType> normsC1(q), normsC2(q),
 
 1058                            normsB1(p), normsB2(p);
 
 1060       B = MVT::Clone(*A,p);
 
 1061       C = MVT::Clone(*A,q);
 
 1064       Vp = MVT::Clone(*A,p);
 
 1065       Vq = MVT::Clone(*A,q);
 
 1068       MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1073       MVT::MvNorm(*B,normsB1);
 
 1074       MVT::MvNorm(*C,normsC1);
 
 1075       MVT::MvTimesMatAddMv(zero,*B,SDM,one,*C);
 
 1076       MVT::MvNorm(*B,normsB2);
 
 1077       MVT::MvNorm(*C,normsC2);
 
 1078       for (
int i=0; i<p; i++) {
 
 1079         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1081             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1082             << 
"Input vectors were modified." << endl;
 
 1086       for (
int i=0; i<q; i++) {
 
 1087         if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1089             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1090             << 
"Arithmetic test 1 failed." << endl;
 
 1098       MVT::MvNorm(*B,normsB1);
 
 1099       MVT::MvNorm(*C,normsC1);
 
 1102       MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1103       MVT::MvTimesMatAddMv(zero,*B,SDM,zero,*C);
 
 1104       MVT::MvNorm(*B,normsB2);
 
 1105       MVT::MvNorm(*C,normsC2);
 
 1106       for (
int i=0; i<p; i++) {
 
 1107         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1109             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1110             << 
"Input vectors were modified." << endl;
 
 1114       for (
int i=0; i<q; i++) {
 
 1115         if ( normsC2[i] != zero ) {
 
 1117             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1118             << 
"Arithmetic test 2 failed: "  
 1131       MVT::MvNorm(*B,normsB1);
 
 1132       MVT::MvNorm(*C,normsC1);
 
 1134       for (
int i=0; i<q; i++) {
 
 1137       MVT::MvTimesMatAddMv(one,*B,SDM,zero,*C);
 
 1138       MVT::MvNorm(*B,normsB2);
 
 1139       MVT::MvNorm(*C,normsC2);
 
 1140       for (
int i=0; i<p; i++) {
 
 1141         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1143             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1144             << 
"Input vectors were modified." << endl;
 
 1148       for (
int i=0; i<q; i++) {
 
 1149         if ( SCT::magnitude( normsB1[i] - normsC2[i] ) > tol ) {
 
 1151             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1152             << 
"Arithmetic test 3 failed: " 
 1164       MVT::MvNorm(*B,normsB1);
 
 1165       MVT::MvNorm(*C,normsC1);
 
 1167       MVT::MvTimesMatAddMv(one,*B,SDM,one,*C);
 
 1168       MVT::MvNorm(*B,normsB2);
 
 1169       MVT::MvNorm(*C,normsC2);
 
 1170       for (
int i=0; i<p; i++) {
 
 1171         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1173             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1174             << 
"Input vectors were modified." << endl;
 
 1178       for (
int i=0; i<q; i++) {
 
 1179         if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1181             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1182             << 
"Arithmetic test 4 failed." << endl;
 
 1198       const int p = 5, q = 7;
 
 1202       std::vector<MagType> normsC1(q), normsC2(q),
 
 1203                            normsB1(p), normsB2(p);
 
 1205       B = MVT::Clone(*A,p);
 
 1206       C = MVT::Clone(*A,q);
 
 1209       Vp = MVT::Clone(*A,p);
 
 1210       Vq = MVT::Clone(*A,q);
 
 1213       MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1218       MVT::MvNorm(*B,normsB1);
 
 1219       MVT::MvNorm(*C,normsC1);
 
 1220       MVT::MvTimesMatAddMv(zero,*B,SDM,one,*C);
 
 1221       MVT::MvNorm(*B,normsB2);
 
 1222       MVT::MvNorm(*C,normsC2);
 
 1223       for (
int i=0; i<p; i++) {
 
 1224         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1226             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1227             << 
"Input vectors were modified." << endl;
 
 1231       for (
int i=0; i<q; i++) {
 
 1232         if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1234             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1235             << 
"Arithmetic test 5 failed." << endl;
 
 1243       MVT::MvNorm(*B,normsB1);
 
 1244       MVT::MvNorm(*C,normsC1);
 
 1247       MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1248       MVT::MvTimesMatAddMv(zero,*B,SDM,zero,*C);
 
 1249       MVT::MvNorm(*B,normsB2);
 
 1250       MVT::MvNorm(*C,normsC2);
 
 1251       for (
int i=0; i<p; i++) {
 
 1252         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1254             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1255             << 
"Input vectors were modified." << endl;
 
 1259       for (
int i=0; i<q; i++) {
 
 1260         if ( normsC2[i] != zero ) {
 
 1262             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1263             << 
"Arithmetic test 6 failed: "  
 1275       MVT::MvNorm(*B,normsB1);
 
 1276       MVT::MvNorm(*C,normsC1);
 
 1278       for (
int i=0; i<p; i++) {
 
 1281       MVT::MvTimesMatAddMv(one,*B,SDM,zero,*C);
 
 1282       MVT::MvNorm(*B,normsB2);
 
 1283       MVT::MvNorm(*C,normsC2);
 
 1284       for (
int i=0; i<p; i++) {
 
 1285         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1287             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1288             << 
"Input vectors were modified." << endl;
 
 1292       for (
int i=0; i<p; i++) {
 
 1293         if ( SCT::magnitude( normsB1[i] - normsC2[i] ) > tol ) {
 
 1295             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1296             << 
"Arithmetic test 7 failed." << endl;
 
 1300       for (
int i=p; i<q; i++) {
 
 1301         if ( normsC2[i] != zero ) {
 
 1303             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1304             << 
"Arithmetic test 7 failed." << endl;
 
 1312       MVT::MvNorm(*B,normsB1);
 
 1313       MVT::MvNorm(*C,normsC1);
 
 1315       MVT::MvTimesMatAddMv(one,*B,SDM,one,*C);
 
 1316       MVT::MvNorm(*B,normsB2);
 
 1317       MVT::MvNorm(*C,normsC2);
 
 1318       for (
int i=0; i<p; i++) {
 
 1319         if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1321             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1322             << 
"Input vectors were modified." << endl;
 
 1326       for (
int i=0; i<q; i++) {
 
 1327         if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1329             << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1330             << 
"Arithmetic test 8 failed." << endl;
 
 1347   template< 
class ScalarType, 
class MV, 
class OP>
 
 1365     typedef typename SCT::magnitudeType        MagType;
 
 1367     const MagType    tol = SCT::eps()*100;
 
 1369     const int numvecs = 10;
 
 1372                              C = MVT::Clone(*A,numvecs);
 
 1374     std::vector<MagType> normsB1(numvecs), normsB2(numvecs),
 
 1375                          normsC1(numvecs), normsC2(numvecs);
 
 1386     MVT::MvNorm(*B,normsB1);
 
 1387     OPT::Apply(*M,*B,*C);
 
 1388     MVT::MvNorm(*B,normsB2);
 
 1389     MVT::MvNorm(*C,normsC2);
 
 1390     for (
int i=0; i<numvecs; i++) {
 
 1391       if ( SCT::magnitude( normsB2[i] - normsB1[i] ) > tol ) {
 
 1393           << 
"*** ERROR *** OperatorTraits::Apply() [1]" << endl
 
 1394           << 
"Apply() modified the input vectors." << endl;
 
 1397       if (normsC2[i] != SCT::zero()) {
 
 1399           << 
"*** ERROR *** OperatorTraits::Apply() [1]" << endl
 
 1400           << 
"Operator applied to zero did not return zero." << endl;
 
 1407     MVT::MvNorm(*B,normsB1);
 
 1408     OPT::Apply(*M,*B,*C);
 
 1409     MVT::MvNorm(*B,normsB2);
 
 1410     MVT::MvNorm(*C,normsC2);
 
 1411     bool ZeroWarning = 
false;
 
 1412     for (
int i=0; i<numvecs; i++) {
 
 1413       if ( SCT::magnitude( normsB2[i] - normsB1[i] ) > tol ) {
 
 1415           << 
"*** ERROR *** OperatorTraits::Apply() [2]" << endl
 
 1416           << 
"Apply() modified the input vectors." << endl;
 
 1419       if (normsC2[i] == SCT::zero() && ZeroWarning==
false ) {
 
 1421           << 
"*** ERROR *** OperatorTraits::Apply() [2]" << endl
 
 1422           << 
"Operator applied to random vectors returned zero." << endl;
 
 1429     MVT::MvNorm(*B,normsB1);
 
 1431     OPT::Apply(*M,*B,*C);
 
 1432     MVT::MvNorm(*B,normsB2);
 
 1433     MVT::MvNorm(*C,normsC1);
 
 1434     for (
int i=0; i<numvecs; i++) {
 
 1435       if ( SCT::magnitude( normsB2[i] - normsB1[i] ) > tol ) {
 
 1437           << 
"*** ERROR *** OperatorTraits::Apply() [3]" << endl
 
 1438           << 
"Apply() modified the input vectors." << endl;
 
 1449     OPT::Apply(*M,*B,*C);
 
 1450     MVT::MvNorm(*B,normsB2);
 
 1451     MVT::MvNorm(*C,normsC2);
 
 1452     for (
int i=0; i<numvecs; i++) {
 
 1453       if ( SCT::magnitude( normsB2[i] - normsB1[i] ) > tol ) {
 
 1455           << 
"*** ERROR *** OperatorTraits::Apply() [4]" << endl
 
 1456           << 
"Apply() modified the input vectors." << endl;
 
 1459       if ( SCT::magnitude( normsC1[i] - normsC2[i]) > tol ) {
 
 1462           << 
"*** WARNING *** OperatorTraits::Apply() [4]" << endl
 
 1463           << 
"Apply() returned two different results." << endl << endl;
 
ScalarTraits< ScalarType >::magnitudeType normOne() const 
bool TestOperatorTraits(const Teuchos::RCP< OutputManager< ScalarType > > &om, const Teuchos::RCP< const MV > &A, const Teuchos::RCP< const OP > &M)
This function tests the correctness of an operator implementation with respect to an OperatorTraits s...
Declaration of basic traits for the multivector type. 
Virtual base class which defines basic traits for the operator type. 
int scale(const ScalarType alpha)
Abstract class definition for Anasazi Output Managers. 
Output managers remove the need for the eigensolver to know any information about the required output...
int putScalar(const ScalarType value=Teuchos::ScalarTraits< ScalarType >::zero())
Traits class which defines basic operations on multivectors. 
Virtual base class which defines basic traits for the operator type. 
bool TestMultiVecTraits(const Teuchos::RCP< OutputManager< ScalarType > > &om, const Teuchos::RCP< const MV > &A)
This is a function to test the correctness of a MultiVecTraits specialization and multivector impleme...
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
OrdinalType numCols() const 
Types and exceptions used within Anasazi solvers and interfaces. 
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
OrdinalType numRows() const