48                const Teuchos::RCP<const MV> &A ) {
 
   51    using Teuchos::SetScientific;
 
  128    typedef Teuchos::ScalarTraits<ScalarType> SCT;
 
  129    typedef typename SCT::magnitudeType       MagType;
 
  131    const ScalarType one      = SCT::one();
 
  132    const ScalarType zero     = SCT::zero();
 
  133    const MagType    zero_mag = Teuchos::ScalarTraits<MagType>::zero();
 
  134    const MagType    tol = SCT::eps()*100;
 
  137    const int numvecs   = 10;
 
  138    const int numvecs_2 = 5;
 
  140    std::vector<int> ind(numvecs_2);
 
  150    TEUCHOS_TEST_FOR_EXCEPT(numvecs_2 != 5);
 
  161    if ( MVT::GetNumberVecs(*A) <= 0 ) {
 
  163        << 
"*** ERROR *** MultiVectorTraits::GetNumberVecs()." << endl
 
  164        << 
"Returned <= 0." << endl;
 
  172    if ( MVT::GetGlobalLength(*A) <= 0 ) {
 
  174        << 
"*** ERROR *** MultiVectorTraitsExt::GetGlobalLength()" << endl
 
  175        << 
"Returned <= 0." << endl;
 
  186      Teuchos::RCP<MV> B = MVT::Clone(*A,numvecs);
 
  188      std::vector<MagType> norms(2*numvecs);
 
  189      bool ResizeWarning = 
false;
 
  190      if ( MVT::GetNumberVecs(*B) != numvecs ) {
 
  192          << 
"*** ERROR *** MultiVecTraits::Clone()." << endl
 
  193          << 
"Did not allocate requested number of vectors." << endl;
 
  196      if ( MVT::GetGlobalLength(*B) != MVT::GetGlobalLength(*A) ) {
 
  198          << 
"*** ERROR *** MultiVecTraits::Clone()." << endl
 
  199          << 
"Did not allocate requested number of vectors." << endl;
 
  202      MVT::MvNorm(*B, norms);
 
  203      if ( (
int)norms.size() != 2*numvecs && (ResizeWarning == 
false) ) {
 
  205          << 
"*** WARNING *** MultiVecTraits::MvNorm()." << endl
 
  206          << 
"Method resized the output vector." << endl;
 
  207        ResizeWarning = 
true;
 
  209      for (
int i=0; i<numvecs; i++) {
 
  210        if ( norms[i] < zero_mag ) {
 
  212            << 
"*** ERROR *** MultiVecTraits::Clone()." << endl
 
  213            << 
"Vector had negative norm." << endl;
 
  236      Teuchos::RCP<MV> B = MVT::Clone(*A,numvecs);
 
  237      std::vector<MagType> norms(numvecs), norms2(numvecs);
 
  240      MVT::MvNorm(*B, norms);
 
  241      for (
int i=0; i<numvecs; i++) {
 
  242        if ( norms[i] != zero_mag ) {
 
  244            << 
"*** ERROR *** MultiVecTraits::MvInit() " 
  245            << 
"and MultiVecTraits::MvNorm()" << endl
 
  246            << 
"Supposedly zero vector has non-zero norm." << endl;
 
  251      MVT::MvNorm(*B, norms);
 
  253      MVT::MvNorm(*B, norms2);
 
  254      for (
int i=0; i<numvecs; i++) {
 
  255        if ( norms[i] == zero_mag || norms2[i] == zero_mag ) {
 
  257            << 
"*** ERROR *** MultiVecTraits::MvRandom()." << endl
 
  258            << 
"Random vector was empty (very unlikely)." << endl;
 
  261        else if ( norms[i] < zero_mag || norms2[i] < zero_mag ) {
 
  263            << 
"*** ERROR *** MultiVecTraits::MvRandom()." << endl
 
  264            << 
"Vector had negative norm." << endl;
 
  267        else if ( norms[i] == norms2[i] ) {
 
  269            << 
"*** ERROR *** MutliVecTraits::MvRandom()." << endl
 
  270            << 
"Vectors not random enough." << endl;
 
  285      Teuchos::RCP<MV> B = MVT::Clone(*A,numvecs);
 
  286      std::vector<MagType> norms(numvecs);
 
  289      MVT::MvScale(*B,SCT::zero());
 
  290      MVT::MvNorm(*B, norms);
 
  291      for (
int i=0; i<numvecs; i++) {
 
  292        if ( norms[i] != zero_mag ) {
 
  294            << 
"*** ERROR *** MultiVecTraits::MvScale(alpha) " 
  295            << 
"Supposedly zero vector has non-zero norm." << endl;
 
  301      std::vector<ScalarType> zeros(numvecs,SCT::zero());
 
  302      MVT::MvScale(*B,zeros);
 
  303      MVT::MvNorm(*B, norms);
 
  304      for (
int i=0; i<numvecs; i++) {
 
  305        if ( norms[i] != zero_mag ) {
 
  307            << 
"*** ERROR *** MultiVecTraits::MvScale(alphas) " 
  308            << 
"Supposedly zero vector has non-zero norm." << endl;
 
  329      Teuchos::RCP<MV> B = MVT::Clone(*A,numvecs);
 
  330      std::vector<MagType> norms(numvecs);
 
  333      MVT::MvNorm(*B, norms);
 
  334      bool BadNormWarning = 
false;
 
  335      for (
int i=0; i<numvecs; i++) {
 
  336        if ( norms[i] < zero_mag ) {
 
  338            << 
"*** ERROR *** MultiVecTraits::MvRandom()." << endl
 
  339            << 
"Vector had negative norm." << endl;
 
  342        else if ( norms[i] != SCT::squareroot(MVT::GetGlobalLength(*B)) && !BadNormWarning ) {
 
  345            << 
"Warning testing MultiVecTraits::MvInit()." << endl
 
  346            << 
"Ones vector should have norm sqrt(dim)." << endl
 
  347            << 
"norms[i]: " << norms[i] << 
"\tdim: " << MVT::GetGlobalLength(*B) << endl << endl;
 
  348          BadNormWarning = 
true;
 
  362      Teuchos::RCP<MV> B = MVT::Clone(*A,numvecs);
 
  363      std::vector<MagType> norms(numvecs);
 
  364      MVT::MvInit(*B, zero_mag);
 
  365      MVT::MvNorm(*B, norms);
 
  366      for (
int i=0; i<numvecs; i++) {
 
  367        if ( norms[i] < zero_mag ) {
 
  369            << 
"*** ERROR *** MultiVecTraits::MvInit()." << endl
 
  370            << 
"Vector had negative norm." << endl;
 
  373        else if ( norms[i] != zero_mag ) {
 
  375            << 
"*** ERROR *** MultiVecTraits::MvInit()." << endl
 
  376            << 
"Zero vector should have norm zero." << endl;
 
  389      Teuchos::RCP<MV> B, C;
 
  390      std::vector<MagType> norms(numvecs), norms2(ind.size());
 
  392      B = MVT::Clone(*A,numvecs);
 
  394      MVT::MvNorm(*B, norms);
 
  395      C = MVT::CloneCopy(*B,ind);
 
  396      MVT::MvNorm(*C, norms2);
 
  397      if ( MVT::GetNumberVecs(*C) != numvecs_2 ) {
 
  399          << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  400          << 
"Wrong number of vectors." << endl;
 
  403      if ( MVT::GetGlobalLength(*C) != MVT::GetGlobalLength(*B) ) {
 
  405          << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  406          << 
"Vector lengths don't match." << endl;
 
  409      for (
int i=0; i<numvecs_2; i++) {
 
  410        if ( SCT::magnitude( norms2[i] - norms[ind[i]] ) > tol ) {
 
  412            << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  413            << 
"Copied vectors do not agree:"  
  414            << norms2[i] << 
" != " << norms[ind[i]] << endl
 
  415            << 
"Difference " << SCT::magnitude (norms2[i] - norms[ind[i]])
 
  416            << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  421      MVT::MvInit(*B,zero);
 
  422      MVT::MvNorm(*C, norms2); 
 
  423      for (
int i=0; i<numvecs_2; i++) {
 
  424        if ( SCT::magnitude( norms2[i] - norms2[i] ) > tol ) {
 
  426            << 
"*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl
 
  427            << 
"Copied vectors were not independent." << endl
 
  428            << 
"Difference " << SCT::magnitude (norms2[i] - norms[i])
 
  429            << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  442      Teuchos::RCP<MV> B, C;
 
  443      std::vector<MagType> norms(numvecs), norms2(numvecs);
 
  445      B = MVT::Clone(*A,numvecs);
 
  447      MVT::MvNorm(*B, norms);
 
  448      C = MVT::CloneCopy(*B);
 
  449      MVT::MvNorm(*C, norms2);
 
  450      if ( MVT::GetNumberVecs(*C) != numvecs ) {
 
  452          << 
"*** ERROR *** MultiVecTraits::CloneCopy()." << endl
 
  453          << 
"Wrong number of vectors." << endl;
 
  456      for (
int i=0; i<numvecs; i++) {
 
  457        if ( SCT::magnitude( norms2[i] - norms[i] ) > tol ) {
 
  459            << 
"*** ERROR *** MultiVecTraits::CloneCopy()." << endl
 
  460            << 
"Copied vectors do not agree." << endl
 
  461            << 
"Difference " << SCT::magnitude (norms2[i] - norms[i])
 
  462            << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  466      MVT::MvInit(*B,zero);
 
  467      MVT::MvNorm(*C, norms); 
 
  468      for (
int i=0; i<numvecs; i++) {
 
  469        if ( SCT::magnitude( norms2[i] - norms[i] ) > tol ) {
 
  471            << 
"*** ERROR *** MultiVecTraits::CloneCopy()." << endl
 
  472            << 
"Copied vectors were not independent." << endl
 
  473            << 
"Difference " << SCT::magnitude (norms2[i] - norms[i])
 
  474            << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  488      Teuchos::RCP<MV> B, C;
 
  489      std::vector<MagType> norms(numvecs), norms2(ind.size());
 
  491      B = MVT::Clone(*A,numvecs); 
 
  493      MVT::MvNorm(*B, norms);
 
  494      C = MVT::CloneViewNonConst(*B,ind);
 
  495      MVT::MvNorm(*C, norms2);
 
  496      if ( MVT::GetNumberVecs(*C) != numvecs_2 ) {
 
  498          << 
"*** ERROR *** MultiVecTraits::CloneView(ind)." << endl
 
  499          << 
"Wrong number of vectors." << endl;
 
  502      for (
int i=0; i<numvecs_2; i++) {
 
  503        if ( SCT::magnitude( norms2[i] - norms[ind[i]] ) > tol ) {
 
  505            << 
"*** ERROR *** MultiVecTraits::CloneView(ind)." << endl
 
  506            << 
"Viewed vectors do not agree." << endl;
 
  521      Teuchos::RCP<const MV> constB, C;
 
  522      std::vector<MagType> normsB(numvecs), normsC(ind.size());
 
  523      std::vector<int> allind(numvecs);
 
  524      for (
int i=0; i<numvecs; i++) {
 
  528      B = MVT::Clone(*A,numvecs);
 
  530      MVT::MvNorm(*B, normsB);
 
  531      C = MVT::CloneView(*B,ind);
 
  532      MVT::MvNorm(*C, normsC);
 
  533      if ( MVT::GetNumberVecs(*C) != numvecs_2 ) {
 
  535          << 
"*** ERROR *** const MultiVecTraits::CloneView(ind)." << endl
 
  536          << 
"Wrong number of vectors." << endl;
 
  539      for (
int i=0; i<numvecs_2; i++) {
 
  540        if ( SCT::magnitude( normsC[i] - normsB[ind[i]] ) > tol ) {
 
  542            << 
"*** ERROR *** const MultiVecTraits::CloneView(ind)." << endl
 
  543            << 
"Viewed vectors do not agree." << endl;
 
  562      Teuchos::RCP<MV> B, C;
 
  563      std::vector<MagType> normsB1(numvecs), normsB2(numvecs),
 
  564                           normsC1(numvecs_2), normsC2(numvecs_2);
 
  566      B = MVT::Clone(*A,numvecs);
 
  567      C = MVT::Clone(*A,numvecs_2);
 
  569      ind.resize(numvecs_2);
 
  570      for (
int i=0; i<numvecs_2; i++) {
 
  576      MVT::MvNorm(*B,normsB1);
 
  577      MVT::MvNorm(*C,normsC1);
 
  578      MVT::SetBlock(*C,ind,*B);
 
  579      MVT::MvNorm(*B,normsB2);
 
  580      MVT::MvNorm(*C,normsC2);
 
  583      for (
int i=0; i<numvecs_2; i++) {
 
  584        if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  586            << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  587            << 
"Operation modified source vectors." << endl;
 
  593      for (
int i=0; i<numvecs; i++) {
 
  596          if ( SCT::magnitude(normsB2[i]-normsC1[i/2]) > tol ) {
 
  598              << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  599              << 
"Copied vectors do not agree." << endl
 
  600              << 
"Difference " << SCT::magnitude (normsB2[i] - normsC1[i/2])
 
  601              << 
" exceeds the tolerance 100*eps = " << tol << endl;
 
  607          if ( SCT::magnitude(normsB1[i]-normsB2[i]) > tol ) {
 
  609              << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  610              << 
"Incorrect vectors were modified." << endl;
 
  615      MVT::MvInit(*C,zero);
 
  616      MVT::MvNorm(*B,normsB1);
 
  618      for (
int i=0; i<numvecs; i++) {
 
  619        if ( SCT::magnitude(normsB1[i]-normsB2[i]) > tol ) {
 
  621            << 
"*** ERROR *** MultiVecTraits::SetBlock()." << endl
 
  622            << 
"Copied vectors were not independent." << endl;
 
  655      Teuchos::RCP<MV> B, C;
 
  656      std::vector<MagType> normsB(p), normsC(q);
 
  657      Teuchos::SerialDenseMatrix<int,ScalarType> SDM(p,q);
 
  659      B = MVT::Clone(*A,p);
 
  660      C = MVT::Clone(*A,q);
 
  664      MVT::MvNorm(*B,normsB);
 
  666      MVT::MvNorm(*C,normsC);
 
  669      MVT::MvTransMv( zero, *B, *C, SDM );
 
  672      if ( SDM.numRows() != p || SDM.numCols() != q ) {
 
  674          << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  675          << 
"Routine resized SerialDenseMatrix." << endl;
 
  680      if ( SDM.normOne() != zero ) {
 
  682          << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  683          << 
"Scalar argument processed incorrectly." << endl;
 
  688      MVT::MvTransMv( one, *B, *C, SDM );
 
  692      for (
int i=0; i<p; i++) {
 
  693        for (
int j=0; j<q; j++) {
 
  694          if (   SCT::magnitude(SDM(i,j)) 
 
  695               > SCT::magnitude(normsB[i]*normsC[j]) ) {
 
  697              << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  698              << 
"Triangle inequality did not hold: "  
  699              << SCT::magnitude(SDM(i,j)) 
 
  701              << SCT::magnitude(normsB[i]*normsC[j]) 
 
  709      MVT::MvTransMv( one, *B, *C, SDM );
 
  710      for (
int i=0; i<p; i++) {
 
  711        for (
int j=0; j<q; j++) {
 
  712          if ( SDM(i,j) != zero ) {
 
  714              << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  715              << 
"Inner products not zero for C==0." << endl;
 
  722      MVT::MvTransMv( one, *B, *C, SDM );
 
  723      for (
int i=0; i<p; i++) {
 
  724        for (
int j=0; j<q; j++) {
 
  725          if ( SDM(i,j) != zero ) {
 
  727              << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  728              << 
"Inner products not zero for B==0." << endl;
 
  741      Teuchos::SerialDenseMatrix<int, ScalarType> largeSDM(p+1,q+1);
 
  742      Teuchos::SerialDenseMatrix<int, ScalarType> SDM2(Teuchos::View, largeSDM, p, q);
 
  743      largeSDM.putScalar( one );
 
  746      MVT::MvTransMv( one, *B, *C, SDM2 );
 
  747      for (
int i=0; i<p; i++) {
 
  748        for (
int j=0; j<q; j++) {
 
  749          if ( SDM2(i,j) != zero ) {
 
  751              << 
"*** ERROR *** MultiVecTraits::MvTransMv()." << endl
 
  752              << 
"Inner products not zero for C==0 when using a view into Teuchos::SerialDenseMatrix<>." << endl;
 
  769      Teuchos::RCP<MV> B, C;
 
  770      std::vector<ScalarType> iprods(q);
 
  771      std::vector<MagType> normsB(p), normsC(p);
 
  773      B = MVT::Clone(*A,p);
 
  774      C = MVT::Clone(*A,p);
 
  778      MVT::MvNorm(*B,normsB);
 
  779      MVT::MvNorm(*C,normsC);
 
  780      MVT::MvDot( *B, *C, iprods );
 
  781      if ( (
int)iprods.size() != q ) {
 
  783          << 
"*** ERROR *** MultiVecTraits::MvDot." << endl
 
  784          << 
"Routine resized results vector." << endl;
 
  787      for (
int i=0; i<p; i++) {
 
  788        if ( SCT::magnitude(iprods[i]) 
 
  789             > SCT::magnitude(normsB[i]*normsC[i]) ) {
 
  791            << 
"*** ERROR *** MultiVecTraits::MvDot()." << endl
 
  792            << 
"Inner products not valid." << endl;
 
  798      MVT::MvDot( *B, *C, iprods );
 
  799      for (
int i=0; i<p; i++) {
 
  800        if ( iprods[i] != zero ) {
 
  802            << 
"*** ERROR *** MultiVecTraits::MvDot()." << endl
 
  803            << 
"Inner products not zero for B==0." << endl;
 
  809      MVT::MvDot( *B, *C, iprods );
 
  810      for (
int i=0; i<p; i++) {
 
  811        if ( iprods[i] != zero ) {
 
  813            << 
"*** ERROR *** MultiVecTraits::MvDot()." << endl
 
  814            << 
"Inner products not zero for C==0." << endl;
 
  830      Teuchos::RCP<MV> B, C, D;
 
  831      std::vector<MagType> normsB1(p), normsB2(p),
 
  832                           normsC1(p), normsC2(p),
 
  833                           normsD1(p), normsD2(p);
 
  834      ScalarType alpha = MagType(0.5) * SCT::one();
 
  835      ScalarType beta = MagType(0.33) * SCT::one();
 
  837      B = MVT::Clone(*A,p);
 
  838      C = MVT::Clone(*A,p);
 
  839      D = MVT::Clone(*A,p);
 
  843      MVT::MvNorm(*B,normsB1);
 
  844      MVT::MvNorm(*C,normsC1);
 
  847      MVT::MvAddMv(zero,*B,one,*C,*D);
 
  848      MVT::MvNorm(*B,normsB2);
 
  849      MVT::MvNorm(*C,normsC2);
 
  850      MVT::MvNorm(*D,normsD1);
 
  851      for (
int i=0; i<p; i++) {
 
  852        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  854            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  855            << 
"Input arguments were modified." << endl;
 
  858        else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  860            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  861            << 
"Input arguments were modified." << endl;
 
  864        else if ( SCT::magnitude(normsC1[i]-normsD1[i]) > tol ) {
 
  866            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  867            << 
"Assignment did not work." << endl;
 
  873      MVT::MvAddMv(one,*B,zero,*C,*D);
 
  874      MVT::MvNorm(*B,normsB2);
 
  875      MVT::MvNorm(*C,normsC2);
 
  876      MVT::MvNorm(*D,normsD1);
 
  877      for (
int i=0; i<p; i++) {
 
  878        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  880            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  881            << 
"Input arguments were modified." << endl;
 
  884        else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  886            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  887            << 
"Input arguments were modified." << endl;
 
  890        else if ( SCT::magnitude( normsB1[i] - normsD1[i] ) > tol ) {
 
  892            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  893            << 
"Assignment did not work." << endl;
 
  901      MVT::MvAddMv(alpha,*B,beta,*C,*D);
 
  902      MVT::MvNorm(*B,normsB2);
 
  903      MVT::MvNorm(*C,normsC2);
 
  904      MVT::MvNorm(*D,normsD1);
 
  906      for (
int i=0; i<p; i++) {
 
  907        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  909            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  910            << 
"Input arguments were modified." << endl;
 
  913        else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  915            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  916            << 
"Input arguments were modified." << endl;
 
  922      MVT::MvAddMv(alpha,*B,beta,*C,*D);
 
  923      MVT::MvNorm(*B,normsB2);
 
  924      MVT::MvNorm(*C,normsC2);
 
  925      MVT::MvNorm(*D,normsD2);
 
  928      for (
int i=0; i<p; i++) {
 
  929        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
  931            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  932            << 
"Input arguments were modified." << endl;
 
  935        else if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
  937            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  938            << 
"Input arguments were modified." << endl;
 
  941        else if ( SCT::magnitude( normsD1[i] - normsD2[i] ) > tol ) {
 
  943            << 
"*** ERROR *** MultiVecTraits::MvAddMv()." << endl
 
  944            << 
"Results varies depending on initial state of dest vectors." << endl;
 
  970      Teuchos::RCP<MV> B, D;
 
  971      Teuchos::RCP<const MV> C;
 
  972      std::vector<MagType> normsB(p),
 
  974      std::vector<int> lclindex(p);
 
  975      for (
int i=0; i<p; i++) lclindex[i] = i;
 
  977      B = MVT::Clone(*A,p);
 
  978      C = MVT::CloneView(*B,lclindex);
 
  979      D = MVT::CloneViewNonConst(*B,lclindex);
 
  982      MVT::MvNorm(*B,normsB);
 
  985      MVT::MvAddMv(zero,*B,one,*C,*D);
 
  986      MVT::MvNorm(*D,normsD);
 
  987      for (
int i=0; i<p; i++) {
 
  988        if ( SCT::magnitude( normsB[i] - normsD[i] ) > tol ) {
 
  990            << 
"*** ERROR *** MultiVecTraits::MvAddMv() #2" << endl
 
  991            << 
"Assignment did not work." << endl;
 
  997      MVT::MvAddMv(one,*B,zero,*C,*D);
 
  998      MVT::MvNorm(*D,normsD);
 
  999      for (
int i=0; i<p; i++) {
 
 1000        if ( SCT::magnitude( normsB[i] - normsD[i] ) > tol ) {
 
 1002            << 
"*** ERROR *** MultiVecTraits::MvAddMv() #2" << endl
 
 1003            << 
"Assignment did not work." << endl;
 
 1021      const int p = 7, q = 5;
 
 1022      Teuchos::RCP<MV> B, C;
 
 1023      Teuchos::RCP<MV> Vp, Vq;
 
 1025      Teuchos::SerialDenseMatrix<int,ScalarType> SDM(p,q);
 
 1026      std::vector<MagType> normsC1(q), normsC2(q),
 
 1027                           normsB1(p), normsB2(p);
 
 1029      B = MVT::Clone(*A,p);
 
 1030      C = MVT::Clone(*A,q);
 
 1033      Vp = MVT::Clone(*A,p);
 
 1034      Vq = MVT::Clone(*A,q);
 
 1037      MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1042      MVT::MvNorm(*B,normsB1);
 
 1043      MVT::MvNorm(*C,normsC1);
 
 1044      MVT::MvTimesMatAddMv(zero,*B,SDM,one,*C);
 
 1045      MVT::MvNorm(*B,normsB2);
 
 1046      MVT::MvNorm(*C,normsC2);
 
 1047      for (
int i=0; i<p; i++) {
 
 1048        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1050            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1051            << 
"Input vectors were modified." << endl;
 
 1055      for (
int i=0; i<q; i++) {
 
 1056        if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1058            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1059            << 
"Arithmetic test 1 failed." << endl;
 
 1067      MVT::MvNorm(*B,normsB1);
 
 1068      MVT::MvNorm(*C,normsC1);
 
 1071      MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1072      MVT::MvTimesMatAddMv(zero,*B,SDM,zero,*C);
 
 1073      MVT::MvNorm(*B,normsB2);
 
 1074      MVT::MvNorm(*C,normsC2);
 
 1075      for (
int i=0; i<p; i++) {
 
 1076        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1078            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1079            << 
"Input vectors were modified." << endl;
 
 1083      for (
int i=0; i<q; i++) {
 
 1084        if ( normsC2[i] != zero ) {
 
 1086            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1087            << 
"Arithmetic test 2 failed: "  
 1100      MVT::MvNorm(*B,normsB1);
 
 1101      MVT::MvNorm(*C,normsC1);
 
 1103      for (
int i=0; i<q; i++) {
 
 1106      MVT::MvTimesMatAddMv(one,*B,SDM,zero,*C);
 
 1107      MVT::MvNorm(*B,normsB2);
 
 1108      MVT::MvNorm(*C,normsC2);
 
 1109      for (
int i=0; i<p; i++) {
 
 1110        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1112            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1113            << 
"Input vectors were modified." << endl;
 
 1117      for (
int i=0; i<q; i++) {
 
 1118        if ( SCT::magnitude( normsB1[i] - normsC2[i] ) > tol ) {
 
 1120            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1121            << 
"Arithmetic test 3 failed: " 
 1133      MVT::MvNorm(*B,normsB1);
 
 1134      MVT::MvNorm(*C,normsC1);
 
 1136      MVT::MvTimesMatAddMv(one,*B,SDM,one,*C);
 
 1137      MVT::MvNorm(*B,normsB2);
 
 1138      MVT::MvNorm(*C,normsC2);
 
 1139      for (
int i=0; i<p; i++) {
 
 1140        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1142            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1143            << 
"Input vectors were modified." << endl;
 
 1147      for (
int i=0; i<q; i++) {
 
 1148        if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1150            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1151            << 
"Arithmetic test 4 failed." << endl;
 
 1167      const int p = 5, q = 7;
 
 1168      Teuchos::RCP<MV> B, C;
 
 1169      Teuchos::RCP<MV> Vp, Vq;
 
 1170      Teuchos::SerialDenseMatrix<int,ScalarType> SDM(p,q);
 
 1171      std::vector<MagType> normsC1(q), normsC2(q),
 
 1172                           normsB1(p), normsB2(p);
 
 1174      B = MVT::Clone(*A,p);
 
 1175      C = MVT::Clone(*A,q);
 
 1178      Vp = MVT::Clone(*A,p);
 
 1179      Vq = MVT::Clone(*A,q);
 
 1182      MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1187      MVT::MvNorm(*B,normsB1);
 
 1188      MVT::MvNorm(*C,normsC1);
 
 1189      MVT::MvTimesMatAddMv(zero,*B,SDM,one,*C);
 
 1190      MVT::MvNorm(*B,normsB2);
 
 1191      MVT::MvNorm(*C,normsC2);
 
 1192      for (
int i=0; i<p; i++) {
 
 1193        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1195            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1196            << 
"Input vectors were modified." << endl;
 
 1200      for (
int i=0; i<q; i++) {
 
 1201        if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1203            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1204            << 
"Arithmetic test 5 failed." << endl;
 
 1212      MVT::MvNorm(*B,normsB1);
 
 1213      MVT::MvNorm(*C,normsC1);
 
 1216      MVT::MvTransMv( one, *Vp, *Vq, SDM );
 
 1217      MVT::MvTimesMatAddMv(zero,*B,SDM,zero,*C);
 
 1218      MVT::MvNorm(*B,normsB2);
 
 1219      MVT::MvNorm(*C,normsC2);
 
 1220      for (
int i=0; i<p; i++) {
 
 1221        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1223            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1224            << 
"Input vectors were modified." << endl;
 
 1228      for (
int i=0; i<q; i++) {
 
 1229        if ( normsC2[i] != zero ) {
 
 1231            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1232            << 
"Arithmetic test 6 failed: "  
 1244      MVT::MvNorm(*B,normsB1);
 
 1245      MVT::MvNorm(*C,normsC1);
 
 1247      for (
int i=0; i<p; i++) {
 
 1250      MVT::MvTimesMatAddMv(one,*B,SDM,zero,*C);
 
 1251      MVT::MvNorm(*B,normsB2);
 
 1252      MVT::MvNorm(*C,normsC2);
 
 1253      for (
int i=0; i<p; i++) {
 
 1254        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1256            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1257            << 
"Input vectors were modified." << endl;
 
 1261      for (
int i=0; i<p; i++) {
 
 1262        if ( SCT::magnitude( normsB1[i] - normsC2[i] ) > tol ) {
 
 1264            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1265            << 
"Arithmetic test 7 failed." << endl;
 
 1269      for (
int i=p; i<q; i++) {
 
 1270        if ( normsC2[i] != zero ) {
 
 1272            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1273            << 
"Arithmetic test 7 failed." << endl;
 
 1281      MVT::MvNorm(*B,normsB1);
 
 1282      MVT::MvNorm(*C,normsC1);
 
 1284      MVT::MvTimesMatAddMv(one,*B,SDM,one,*C);
 
 1285      MVT::MvNorm(*B,normsB2);
 
 1286      MVT::MvNorm(*C,normsC2);
 
 1287      for (
int i=0; i<p; i++) {
 
 1288        if ( SCT::magnitude( normsB1[i] - normsB2[i] ) > tol ) {
 
 1290            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1291            << 
"Input vectors were modified." << endl;
 
 1295      for (
int i=0; i<q; i++) {
 
 1296        if ( SCT::magnitude( normsC1[i] - normsC2[i] ) > tol ) {
 
 1298            << 
"*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl
 
 1299            << 
"Arithmetic test 8 failed." << endl;