void ISVDUDV::shrink(const int down, std::vector<double> &S, Epetra_SerialDenseMatrix &U, Epetra_SerialDenseMatrix &V) { // // put RU1 into an Epetra MultiVector Epetra_LocalMap LocalMap(curRank_, 0, U_->Map().Comm()); Epetra_MultiVector Uh1(Epetra_DataAccess::View, LocalMap, U.A(), U.LDA(), curRank_-down); Epetra_MultiVector Vh1(Epetra_DataAccess::View, LocalMap, V.A(), V.LDA(), curRank_-down); // // update bases Teuchos::RCP<Epetra_MultiVector> newwU, fullU, newU, newwV, fullV, newV; fullU = Teuchos::rcp( new Epetra_MultiVector(Epetra_DataAccess::View,*U_,0,curRank_) ); newwU = Teuchos::rcp( new Epetra_MultiVector(Epetra_DataAccess::View,*workU_,0,curRank_-down) ); // multiply by Uh1 int info = newwU->Multiply('N','N',1.0,*fullU,Uh1,0.0); TEUCHOS_TEST_FOR_EXCEPTION(info != 0,std::logic_error,"ISVDUDV::shrink(): Error calling EMV::Multiply(U)."); fullU = Teuchos::null; newU = Teuchos::rcp( new Epetra_MultiVector(Epetra_DataAccess::View,*U_,0,curRank_-down) ); *newU = *newwU; newU = Teuchos::null; newwU = Teuchos::null; // multiply by Vh1 // get multivector views of V(1:numProc,1:curRank) and workV(1:numProc,1:curRank-down) double *V_A, *workV_A; int V_LDA, workV_LDA; info = V_->ExtractView(&V_A,&V_LDA); TEUCHOS_TEST_FOR_EXCEPTION(info != 0, std::logic_error, "RBGen::ISVDUDV::shrink(): Error calling Epetra_MultiVector::ExtractView() on V_."); info = workV_->ExtractView(&workV_A,&workV_LDA); TEUCHOS_TEST_FOR_EXCEPTION(info != 0, std::logic_error, "RBGen::ISVDUDV::shrink(): Error calling Epetra_MultiVector::ExtractView() on workV_."); Epetra_LocalMap lclmap(numProc_,0,A_->Comm()); fullV = Teuchos::rcp( new Epetra_MultiVector(Epetra_DataAccess::View,lclmap, V_A, V_LDA,curRank_ ) ); newwV = Teuchos::rcp( new Epetra_MultiVector(Epetra_DataAccess::View,lclmap,workV_A,workV_LDA,curRank_-down) ); // multiply workV = fullV * Vh1 info = newwV->Multiply('N','N',1.0,*fullV,Vh1,0.0); TEUCHOS_TEST_FOR_EXCEPTION(info != 0,std::logic_error,"ISVDUDV::shrink(): Error calling EMV::Multiply(V)."); fullV = Teuchos::null; // now set newV = workV newV = Teuchos::rcp( new Epetra_MultiVector(Epetra_DataAccess::View,lclmap, V_A, V_LDA, curRank_-down) ); *newV = *newwV; newV = Teuchos::null; newwV = Teuchos::null; // save new singular values for (int i=0; i<curRank_-down; i++) { sigma_[i] = S[i]; } curRank_ = curRank_-down; }
void EpetraOpMultiVec::MvTimesMatAddMv ( double alpha, const MultiVec<double>& A, const Teuchos::SerialDenseMatrix<int,double>& B, double beta ) { Epetra_LocalMap LocalMap(B.numRows(), 0, Epetra_MV->Map().Comm()); Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols()); EpetraOpMultiVec *A_vec = dynamic_cast<EpetraOpMultiVec *>(&const_cast<MultiVec<double> &>(A)); TEUCHOS_TEST_FOR_EXCEPTION( A_vec==NULL, std::invalid_argument, "Anasazi::EpetraOpMultiVec::SetBlocks() cast of MultiVec<double> to EpetraOpMultiVec failed."); TEUCHOS_TEST_FOR_EXCEPTION( Epetra_MV->Multiply( 'N', 'N', alpha, *(A_vec->GetEpetraMultiVector()), B_Pvec, beta ) != 0, EpetraSpecializedMultiVecFailure, "Anasazi::EpetraOpMultiVec::MvTimesMatAddMv() call to Epetra_MultiVec::Multiply() returned a nonzero value."); }
void EpetraMultiVec::MvTransMv ( double alpha, const MultiVec<double>& A, Teuchos::SerialDenseMatrix<int,double>& B #ifdef HAVE_ANASAZI_EXPERIMENTAL , ConjType conj #endif ) const { EpetraMultiVec *A_vec = dynamic_cast<EpetraMultiVec *>(&const_cast<MultiVec<double> &>(A)); if (A_vec) { Epetra_LocalMap LocalMap(B.numRows(), 0, Map().Comm()); Epetra_MultiVector B_Pvec(View, LocalMap, B.values(), B.stride(), B.numCols()); TEUCHOS_TEST_FOR_EXCEPTION( B_Pvec.Multiply( 'T', 'N', alpha, *A_vec, *this, 0.0 ) != 0, EpetraMultiVecFailure, "Anasazi::EpetraMultiVec::MvTransMv() call to Epetra_MultiVec::Multiply() returned a nonzero value."); } }
void EpetraOpMultiVec::MvTransMv ( double alpha, const MultiVec<double>& A, Teuchos::SerialDenseMatrix<int,double>& B #ifdef HAVE_ANASAZI_EXPERIMENTAL , ConjType conj #endif ) const { EpetraOpMultiVec *A_vec = dynamic_cast<EpetraOpMultiVec *>(&const_cast<MultiVec<double> &>(A)); if (A_vec) { Epetra_LocalMap LocalMap(B.numRows(), 0, Epetra_MV->Map().Comm()); Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols()); int info = Epetra_OP->Apply( *Epetra_MV, *Epetra_MV_Temp ); TEUCHOS_TEST_FOR_EXCEPTION( info != 0, EpetraSpecializedMultiVecFailure, "Anasazi::EpetraOpMultiVec::MvTransMv(): Error returned from Epetra_Operator::Apply()" ); TEUCHOS_TEST_FOR_EXCEPTION( B_Pvec.Multiply( 'T', 'N', alpha, *(A_vec->GetEpetraMultiVector()), *Epetra_MV_Temp, 0.0 ) != 0, EpetraSpecializedMultiVecFailure, "Anasazi::EpetraOpMultiVec::MvTransMv() call to Epetra_MultiVector::Multiply() returned a nonzero value."); } }