42 #ifndef BELOS_RCG_SOLMGR_HPP 43 #define BELOS_RCG_SOLMGR_HPP 64 #include "Teuchos_BLAS.hpp" 65 #include "Teuchos_LAPACK.hpp" 66 #include "Teuchos_as.hpp" 67 #ifdef BELOS_TEUCHOS_TIME_MONITOR 68 #include "Teuchos_TimeMonitor.hpp" 150 template<
class ScalarType,
class MV,
class OP,
151 const bool supportsScalarType =
153 ! Teuchos::ScalarTraits<ScalarType>::isComplex>
156 Belos::Details::LapackSupportsScalar<ScalarType>::value &&
157 ! Teuchos::ScalarTraits<ScalarType>::isComplex>
159 static const bool scalarTypeIsSupported =
161 ! Teuchos::ScalarTraits<ScalarType>::isComplex;
170 const Teuchos::RCP<Teuchos::ParameterList> &pl) :
179 template<
class ScalarType,
class MV,
class OP>
185 typedef Teuchos::ScalarTraits<ScalarType> SCT;
186 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
187 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
223 const Teuchos::RCP<Teuchos::ParameterList> &pl );
237 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters()
const;
247 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
248 return Teuchos::tuple(timerSolve_);
276 void setParameters(
const Teuchos::RCP<Teuchos::ParameterList> ¶ms );
289 if ((type &
Belos::Problem) && !Teuchos::is_null(problem_)) problem_->setProblem();
322 std::string description()
const;
333 void getHarmonicVecs(
const Teuchos::SerialDenseMatrix<int,ScalarType> &F,
334 const Teuchos::SerialDenseMatrix<int,ScalarType> &G,
335 Teuchos::SerialDenseMatrix<int,ScalarType>& Y);
338 void sort(std::vector<ScalarType>& dlist,
int n, std::vector<int>& iperm);
341 void initializeStateStorage();
344 Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > problem_;
347 Teuchos::RCP<OutputManager<ScalarType> > printer_;
348 Teuchos::RCP<std::ostream> outputStream_;
351 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > sTest_;
352 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP> > maxIterTest_;
353 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> > convTest_;
354 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputTest_;
357 Teuchos::RCP<Teuchos::ParameterList> params_;
360 static const MagnitudeType convtol_default_;
361 static const int maxIters_default_;
362 static const int blockSize_default_;
363 static const int numBlocks_default_;
364 static const int recycleBlocks_default_;
365 static const bool showMaxResNormOnly_default_;
366 static const int verbosity_default_;
367 static const int outputStyle_default_;
368 static const int outputFreq_default_;
369 static const std::string label_default_;
370 static const Teuchos::RCP<std::ostream> outputStream_default_;
377 MagnitudeType convtol_;
383 MagnitudeType achievedTol_;
391 int numBlocks_, recycleBlocks_;
392 bool showMaxResNormOnly_;
393 int verbosity_, outputStyle_, outputFreq_;
402 Teuchos::RCP<MV> Ap_;
417 Teuchos::RCP<MV> U_, AU_;
420 Teuchos::RCP<MV> U1_;
423 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > Alpha_;
424 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > Beta_;
425 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > D_;
428 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > Delta_;
431 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > UTAU_;
434 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > LUUTAU_;
437 Teuchos::RCP<std::vector<int> > ipiv_;
440 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > AUTAU_;
443 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > rTz_old_;
446 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > F_,G_,Y_;
449 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > L2_,DeltaL2_,AU1TUDeltaL2_;
450 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > AU1TAU1_, AU1TU1_, AU1TAP_;
451 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > FY_,GY_;
452 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > APTAP_;
453 Teuchos::RCP<MV> U1Y1_, PY2_;
454 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > AUTAP_, AU1TU_;
460 Teuchos::RCP<Teuchos::Time> timerSolve_;
468 template<
class ScalarType,
class MV,
class OP>
472 template<
class ScalarType,
class MV,
class OP>
475 template<
class ScalarType,
class MV,
class OP>
478 template<
class ScalarType,
class MV,
class OP>
481 template<
class ScalarType,
class MV,
class OP>
484 template<
class ScalarType,
class MV,
class OP>
487 template<
class ScalarType,
class MV,
class OP>
490 template<
class ScalarType,
class MV,
class OP>
493 template<
class ScalarType,
class MV,
class OP>
496 template<
class ScalarType,
class MV,
class OP>
499 template<
class ScalarType,
class MV,
class OP>
503 template<
class ScalarType,
class MV,
class OP>
512 template<
class ScalarType,
class MV,
class OP>
515 const Teuchos::RCP<Teuchos::ParameterList> &pl ) :
521 TEUCHOS_TEST_FOR_EXCEPTION(problem_ == Teuchos::null, std::invalid_argument,
"Problem not given to solver manager.");
524 if ( !is_null(pl) ) {
530 template<
class ScalarType,
class MV,
class OP>
533 outputStream_ = outputStream_default_;
534 convtol_ = convtol_default_;
535 maxIters_ = maxIters_default_;
536 numBlocks_ = numBlocks_default_;
537 recycleBlocks_ = recycleBlocks_default_;
538 verbosity_ = verbosity_default_;
539 outputStyle_= outputStyle_default_;
540 outputFreq_= outputFreq_default_;
541 showMaxResNormOnly_ = showMaxResNormOnly_default_;
542 label_ = label_default_;
553 Alpha_ = Teuchos::null;
554 Beta_ = Teuchos::null;
556 Delta_ = Teuchos::null;
557 UTAU_ = Teuchos::null;
558 LUUTAU_ = Teuchos::null;
559 ipiv_ = Teuchos::null;
560 AUTAU_ = Teuchos::null;
561 rTz_old_ = Teuchos::null;
566 DeltaL2_ = Teuchos::null;
567 AU1TUDeltaL2_ = Teuchos::null;
568 AU1TAU1_ = Teuchos::null;
569 AU1TU1_ = Teuchos::null;
570 AU1TAP_ = Teuchos::null;
573 APTAP_ = Teuchos::null;
574 U1Y1_ = Teuchos::null;
575 PY2_ = Teuchos::null;
576 AUTAP_ = Teuchos::null;
577 AU1TU_ = Teuchos::null;
581 template<
class ScalarType,
class MV,
class OP>
585 if (params_ == Teuchos::null) {
586 params_ = Teuchos::rcp(
new Teuchos::ParameterList(*getValidParameters()) );
589 params->validateParameters(*getValidParameters());
593 if (params->isParameter(
"Maximum Iterations")) {
594 maxIters_ = params->get(
"Maximum Iterations",maxIters_default_);
597 params_->set(
"Maximum Iterations", maxIters_);
598 if (maxIterTest_!=Teuchos::null)
599 maxIterTest_->setMaxIters( maxIters_ );
603 if (params->isParameter(
"Num Blocks")) {
604 numBlocks_ = params->get(
"Num Blocks",numBlocks_default_);
605 TEUCHOS_TEST_FOR_EXCEPTION(numBlocks_ <= 0, std::invalid_argument,
606 "Belos::RCGSolMgr: \"Num Blocks\" must be strictly positive.");
609 params_->set(
"Num Blocks", numBlocks_);
613 if (params->isParameter(
"Num Recycled Blocks")) {
614 recycleBlocks_ = params->get(
"Num Recycled Blocks",recycleBlocks_default_);
615 TEUCHOS_TEST_FOR_EXCEPTION(recycleBlocks_ <= 0, std::invalid_argument,
616 "Belos::RCGSolMgr: \"Num Recycled Blocks\" must be strictly positive.");
618 TEUCHOS_TEST_FOR_EXCEPTION(recycleBlocks_ >= numBlocks_, std::invalid_argument,
619 "Belos::RCGSolMgr: \"Num Recycled Blocks\" must be less than \"Num Blocks\".");
622 params_->set(
"Num Recycled Blocks", recycleBlocks_);
626 if (params->isParameter(
"Timer Label")) {
627 std::string tempLabel = params->get(
"Timer Label", label_default_);
630 if (tempLabel != label_) {
632 params_->set(
"Timer Label", label_);
633 std::string solveLabel = label_ +
": RCGSolMgr total solve time";
634 #ifdef BELOS_TEUCHOS_TIME_MONITOR 635 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
641 if (params->isParameter(
"Verbosity")) {
642 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
643 verbosity_ = params->get(
"Verbosity", verbosity_default_);
645 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
649 params_->set(
"Verbosity", verbosity_);
650 if (printer_ != Teuchos::null)
651 printer_->setVerbosity(verbosity_);
655 if (params->isParameter(
"Output Style")) {
656 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
657 outputStyle_ = params->get(
"Output Style", outputStyle_default_);
659 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
663 params_->set(
"Output Style", outputStyle_);
664 outputTest_ = Teuchos::null;
668 if (params->isParameter(
"Output Stream")) {
669 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
672 params_->set(
"Output Stream", outputStream_);
673 if (printer_ != Teuchos::null)
674 printer_->setOStream( outputStream_ );
679 if (params->isParameter(
"Output Frequency")) {
680 outputFreq_ = params->get(
"Output Frequency", outputFreq_default_);
684 params_->set(
"Output Frequency", outputFreq_);
685 if (outputTest_ != Teuchos::null)
686 outputTest_->setOutputFrequency( outputFreq_ );
690 if (printer_ == Teuchos::null) {
699 if (params->isParameter(
"Convergence Tolerance")) {
700 convtol_ = params->get(
"Convergence Tolerance",convtol_default_);
703 params_->set(
"Convergence Tolerance", convtol_);
704 if (convTest_ != Teuchos::null)
708 if (params->isParameter(
"Show Maximum Residual Norm Only")) {
709 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
712 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
713 if (convTest_ != Teuchos::null)
714 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
720 if (maxIterTest_ == Teuchos::null)
724 if (convTest_ == Teuchos::null)
725 convTest_ = Teuchos::rcp(
new StatusTestResNorm_t( convtol_, 1 ) );
727 if (sTest_ == Teuchos::null)
728 sTest_ = Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
730 if (outputTest_ == Teuchos::null) {
738 std::string solverDesc =
" Recycling CG ";
739 outputTest_->setSolverDesc( solverDesc );
743 if (timerSolve_ == Teuchos::null) {
744 std::string solveLabel = label_ +
": RCGSolMgr total solve time";
745 #ifdef BELOS_TEUCHOS_TIME_MONITOR 746 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
755 template<
class ScalarType,
class MV,
class OP>
756 Teuchos::RCP<const Teuchos::ParameterList>
759 static Teuchos::RCP<const Teuchos::ParameterList> validPL;
762 if(is_null(validPL)) {
763 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
764 pl->set(
"Convergence Tolerance", convtol_default_,
765 "The relative residual tolerance that needs to be achieved by the\n" 766 "iterative solver in order for the linear system to be declared converged.");
767 pl->set(
"Maximum Iterations", maxIters_default_,
768 "The maximum number of block iterations allowed for each\n" 769 "set of RHS solved.");
770 pl->set(
"Block Size", blockSize_default_,
771 "Block Size Parameter -- currently must be 1 for RCG");
772 pl->set(
"Num Blocks", numBlocks_default_,
773 "The length of a cycle (and this max number of search vectors kept)\n");
774 pl->set(
"Num Recycled Blocks", recycleBlocks_default_,
775 "The number of vectors in the recycle subspace.");
776 pl->set(
"Verbosity", verbosity_default_,
777 "What type(s) of solver information should be outputted\n" 778 "to the output stream.");
779 pl->set(
"Output Style", outputStyle_default_,
780 "What style is used for the solver information outputted\n" 781 "to the output stream.");
782 pl->set(
"Output Frequency", outputFreq_default_,
783 "How often convergence information should be outputted\n" 784 "to the output stream.");
785 pl->set(
"Output Stream", outputStream_default_,
786 "A reference-counted pointer to the output stream where all\n" 787 "solver output is sent.");
788 pl->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_default_,
789 "When convergence information is printed, only show the maximum\n" 790 "relative residual norm when the block size is greater than one.");
791 pl->set(
"Timer Label", label_default_,
792 "The string to use as a prefix for the timer labels.");
799 template<
class ScalarType,
class MV,
class OP>
803 Teuchos::RCP<const MV> rhsMV = problem_->getRHS();
804 if (rhsMV == Teuchos::null) {
811 TEUCHOS_TEST_FOR_EXCEPTION(static_cast<ptrdiff_t>(numBlocks_) > MVT::GetGlobalLength(*rhsMV),std::invalid_argument,
812 "Belos::RCGSolMgr::initializeStateStorage(): Cannot generate a Krylov basis with dimension larger the operator!");
815 if (P_ == Teuchos::null) {
816 P_ = MVT::Clone( *rhsMV, numBlocks_+2 );
820 if (MVT::GetNumberVecs(*P_) < numBlocks_+2) {
821 Teuchos::RCP<const MV> tmp = P_;
822 P_ = MVT::Clone( *tmp, numBlocks_+2 );
827 if (Ap_ == Teuchos::null)
828 Ap_ = MVT::Clone( *rhsMV, 1 );
831 if (r_ == Teuchos::null)
832 r_ = MVT::Clone( *rhsMV, 1 );
835 if (z_ == Teuchos::null)
836 z_ = MVT::Clone( *rhsMV, 1 );
839 if (U_ == Teuchos::null) {
840 U_ = MVT::Clone( *rhsMV, recycleBlocks_ );
844 if (MVT::GetNumberVecs(*U_) < recycleBlocks_) {
845 Teuchos::RCP<const MV> tmp = U_;
846 U_ = MVT::Clone( *tmp, recycleBlocks_ );
851 if (AU_ == Teuchos::null) {
852 AU_ = MVT::Clone( *rhsMV, recycleBlocks_ );
856 if (MVT::GetNumberVecs(*AU_) < recycleBlocks_) {
857 Teuchos::RCP<const MV> tmp = AU_;
858 AU_ = MVT::Clone( *tmp, recycleBlocks_ );
863 if (U1_ == Teuchos::null) {
864 U1_ = MVT::Clone( *rhsMV, recycleBlocks_ );
868 if (MVT::GetNumberVecs(*U1_) < recycleBlocks_) {
869 Teuchos::RCP<const MV> tmp = U1_;
870 U1_ = MVT::Clone( *tmp, recycleBlocks_ );
875 if (Alpha_ == Teuchos::null)
876 Alpha_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_, 1 ) );
878 if ( (Alpha_->numRows() != numBlocks_) || (Alpha_->numCols() != 1) )
879 Alpha_->reshape( numBlocks_, 1 );
883 if (Beta_ == Teuchos::null)
884 Beta_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_ + 1, 1 ) );
886 if ( (Beta_->numRows() != (numBlocks_+1)) || (Beta_->numCols() != 1) )
887 Beta_->reshape( numBlocks_ + 1, 1 );
891 if (D_ == Teuchos::null)
892 D_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_ , 1 ) );
894 if ( (D_->numRows() != numBlocks_) || (D_->numCols() != 1) )
895 D_->reshape( numBlocks_, 1 );
899 if (Delta_ == Teuchos::null)
900 Delta_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, numBlocks_ + 1 ) );
902 if ( (Delta_->numRows() != recycleBlocks_) || (Delta_->numCols() != (numBlocks_ + 1)) )
903 Delta_->reshape( recycleBlocks_, numBlocks_ + 1 );
907 if (UTAU_ == Teuchos::null)
908 UTAU_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, recycleBlocks_ ) );
910 if ( (UTAU_->numRows() != recycleBlocks_) || (UTAU_->numCols() != recycleBlocks_) )
911 UTAU_->reshape( recycleBlocks_, recycleBlocks_ );
915 if (LUUTAU_ == Teuchos::null)
916 LUUTAU_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, recycleBlocks_ ) );
918 if ( (LUUTAU_->numRows() != recycleBlocks_) || (LUUTAU_->numCols() != recycleBlocks_) )
919 LUUTAU_->reshape( recycleBlocks_, recycleBlocks_ );
923 if (ipiv_ == Teuchos::null)
924 ipiv_ = Teuchos::rcp(
new std::vector<int>(recycleBlocks_) );
926 if ( (
int)ipiv_->size() != recycleBlocks_ )
927 ipiv_->resize(recycleBlocks_);
931 if (AUTAU_ == Teuchos::null)
932 AUTAU_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, recycleBlocks_ ) );
934 if ( (AUTAU_->numRows() != recycleBlocks_) || (AUTAU_->numCols() != recycleBlocks_) )
935 AUTAU_->reshape( recycleBlocks_, recycleBlocks_ );
939 if (rTz_old_ == Teuchos::null)
940 rTz_old_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( 1, 1 ) );
942 if ( (rTz_old_->numRows() != 1) || (rTz_old_->numCols() != 1) )
943 rTz_old_->reshape( 1, 1 );
947 if (F_ == Teuchos::null)
948 F_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_+recycleBlocks_, numBlocks_+recycleBlocks_ ) );
950 if ( (F_->numRows() != (numBlocks_+recycleBlocks_)) || (F_->numCols() != numBlocks_+recycleBlocks_) )
951 F_->reshape( numBlocks_+recycleBlocks_, numBlocks_+recycleBlocks_ );
955 if (G_ == Teuchos::null)
956 G_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_+recycleBlocks_, numBlocks_+recycleBlocks_ ) );
958 if ( (G_->numRows() != (numBlocks_+recycleBlocks_)) || (G_->numCols() != numBlocks_+recycleBlocks_) )
959 G_->reshape( numBlocks_+recycleBlocks_, numBlocks_+recycleBlocks_ );
963 if (Y_ == Teuchos::null)
964 Y_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_+recycleBlocks_, recycleBlocks_ ) );
966 if ( (Y_->numRows() != (numBlocks_+recycleBlocks_)) || (Y_->numCols() != numBlocks_+recycleBlocks_) )
967 Y_->reshape( numBlocks_+recycleBlocks_, numBlocks_+recycleBlocks_ );
971 if (L2_ == Teuchos::null)
972 L2_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_+1, numBlocks_ ) );
974 if ( (L2_->numRows() != (numBlocks_+1)) || (L2_->numCols() != numBlocks_) )
975 L2_->reshape( numBlocks_+1, numBlocks_ );
979 if (DeltaL2_ == Teuchos::null)
980 DeltaL2_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, numBlocks_ ) );
982 if ( (DeltaL2_->numRows() != (recycleBlocks_)) || (DeltaL2_->numCols() != (numBlocks_) ) )
983 DeltaL2_->reshape( recycleBlocks_, numBlocks_ );
987 if (AU1TUDeltaL2_ == Teuchos::null)
988 AU1TUDeltaL2_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, numBlocks_ ) );
990 if ( (AU1TUDeltaL2_->numRows() != (recycleBlocks_)) || (AU1TUDeltaL2_->numCols() != (numBlocks_) ) )
991 AU1TUDeltaL2_->reshape( recycleBlocks_, numBlocks_ );
995 if (AU1TAU1_ == Teuchos::null)
996 AU1TAU1_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, recycleBlocks_ ) );
998 if ( (AU1TAU1_->numRows() != (recycleBlocks_)) || (AU1TAU1_->numCols() != (recycleBlocks_) ) )
999 AU1TAU1_->reshape( recycleBlocks_, recycleBlocks_ );
1003 if (GY_ == Teuchos::null)
1004 GY_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_ + recycleBlocks_, recycleBlocks_ ) );
1006 if ( (GY_->numRows() != (numBlocks_ + recycleBlocks_)) || (GY_->numCols() != (recycleBlocks_) ) )
1007 GY_->reshape( numBlocks_+recycleBlocks_, recycleBlocks_ );
1011 if (AU1TU1_ == Teuchos::null)
1012 AU1TU1_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, recycleBlocks_ ) );
1014 if ( (AU1TU1_->numRows() != (recycleBlocks_)) || (AU1TU1_->numCols() != (recycleBlocks_) ) )
1015 AU1TU1_->reshape( recycleBlocks_, recycleBlocks_ );
1019 if (FY_ == Teuchos::null)
1020 FY_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_ + recycleBlocks_, recycleBlocks_ ) );
1022 if ( (FY_->numRows() != (numBlocks_ + recycleBlocks_)) || (FY_->numCols() != (recycleBlocks_) ) )
1023 FY_->reshape( numBlocks_+recycleBlocks_, recycleBlocks_ );
1027 if (AU1TAP_ == Teuchos::null)
1028 AU1TAP_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, numBlocks_ ) );
1030 if ( (AU1TAP_->numRows() != (recycleBlocks_)) || (AU1TAP_->numCols() != (numBlocks_) ) )
1031 AU1TAP_->reshape( recycleBlocks_, numBlocks_ );
1035 if (APTAP_ == Teuchos::null)
1036 APTAP_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( numBlocks_, numBlocks_ ) );
1038 if ( (APTAP_->numRows() != (numBlocks_)) || (APTAP_->numCols() != (numBlocks_) ) )
1039 APTAP_->reshape( numBlocks_, numBlocks_ );
1043 if (U1Y1_ == Teuchos::null) {
1044 U1Y1_ = MVT::Clone( *rhsMV, recycleBlocks_ );
1048 if (MVT::GetNumberVecs(*U1Y1_) < recycleBlocks_) {
1049 Teuchos::RCP<const MV> tmp = U1Y1_;
1050 U1Y1_ = MVT::Clone( *tmp, recycleBlocks_ );
1055 if (PY2_ == Teuchos::null) {
1056 PY2_ = MVT::Clone( *rhsMV, recycleBlocks_ );
1060 if (MVT::GetNumberVecs(*PY2_) < recycleBlocks_) {
1061 Teuchos::RCP<const MV> tmp = PY2_;
1062 PY2_ = MVT::Clone( *tmp, recycleBlocks_ );
1067 if (AUTAP_ == Teuchos::null)
1068 AUTAP_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, numBlocks_ ) );
1070 if ( (AUTAP_->numRows() != (recycleBlocks_)) || (AUTAP_->numCols() != (numBlocks_) ) )
1071 AUTAP_->reshape( recycleBlocks_, numBlocks_ );
1075 if (AU1TU_ == Teuchos::null)
1076 AU1TU_ = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( recycleBlocks_, recycleBlocks_ ) );
1078 if ( (AU1TU_->numRows() != (recycleBlocks_)) || (AU1TU_->numCols() != (recycleBlocks_) ) )
1079 AU1TU_->reshape( recycleBlocks_, recycleBlocks_ );
1086 template<
class ScalarType,
class MV,
class OP>
1089 Teuchos::LAPACK<int,ScalarType> lapack;
1090 std::vector<int> index(recycleBlocks_);
1091 ScalarType one = Teuchos::ScalarTraits<ScalarType>::one();
1092 ScalarType zero = Teuchos::ScalarTraits<ScalarType>::zero();
1101 setParameters(Teuchos::parameterList(*getValidParameters()));
1105 "Belos::RCGSolMgr::solve(): Linear problem is not a valid object.");
1107 "Belos::RCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
1108 TEUCHOS_TEST_FOR_EXCEPTION((problem_->getLeftPrec() != Teuchos::null)&&(problem_->getRightPrec() != Teuchos::null),
1110 "Belos::RCGSolMgr::solve(): RCG does not support split preconditioning, only set left or right preconditioner.");
1113 Teuchos::RCP<OP> precObj;
1114 if (problem_->getLeftPrec() != Teuchos::null) {
1115 precObj = Teuchos::rcp_const_cast<OP>(problem_->getLeftPrec());
1117 else if (problem_->getRightPrec() != Teuchos::null) {
1118 precObj = Teuchos::rcp_const_cast<OP>(problem_->getRightPrec());
1122 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
1123 std::vector<int> currIdx(1);
1127 problem_->setLSIndex( currIdx );
1130 ptrdiff_t dim = MVT::GetGlobalLength( *(problem_->getRHS()) );
1131 if (numBlocks_ > dim) {
1132 numBlocks_ = Teuchos::asSafe<int>(dim);
1133 params_->set(
"Num Blocks", numBlocks_);
1135 "Warning! Requested Krylov subspace dimension is larger than operator dimension!" << std::endl <<
1136 " The maximum number of blocks allowed for the Krylov subspace will be adjusted to " << numBlocks_ << std::endl;
1140 initializeStateStorage();
1143 Teuchos::ParameterList plist;
1144 plist.set(
"Num Blocks",numBlocks_);
1145 plist.set(
"Recycled Blocks",recycleBlocks_);
1148 outputTest_->reset();
1151 bool isConverged =
true;
1155 index.resize(recycleBlocks_);
1156 for (
int i=0; i<recycleBlocks_; ++i) { index[i] = i; }
1157 Teuchos::RCP<const MV> Utmp = MVT::CloneView( *U_, index );
1158 index.resize(recycleBlocks_);
1159 for (
int i=0; i<recycleBlocks_; ++i) { index[i] = i; }
1160 Teuchos::RCP<MV> AUtmp = MVT::CloneViewNonConst( *AU_, index );
1162 problem_->applyOp( *Utmp, *AUtmp );
1164 Teuchos::SerialDenseMatrix<int,ScalarType> UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1165 MVT::MvTransMv( one, *Utmp, *AUtmp, UTAUtmp );
1167 Teuchos::SerialDenseMatrix<int,ScalarType> AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1168 if ( precObj != Teuchos::null ) {
1169 index.resize(recycleBlocks_);
1170 for (
int i=0; i<recycleBlocks_; ++i) { index[i] = i; }
1171 index.resize(recycleBlocks_);
1172 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1173 Teuchos::RCP<MV> PCAU = MVT::CloneViewNonConst( *U1_, index );
1174 OPT::Apply( *precObj, *AUtmp, *PCAU );
1175 MVT::MvTransMv( one, *AUtmp, *PCAU, AUTAUtmp );
1177 MVT::MvTransMv( one, *AUtmp, *AUtmp, AUTAUtmp );
1184 Teuchos::RCP<RCGIter<ScalarType,MV,OP> > rcg_iter;
1189 #ifdef BELOS_TEUCHOS_TIME_MONITOR 1190 Teuchos::TimeMonitor slvtimer(*timerSolve_);
1193 while ( numRHS2Solve > 0 ) {
1196 if (printer_->isVerbosity(
Debug ) ) {
1197 if (existU_) printer_->print(
Debug,
"Using recycle space generated from previous call to solve()." );
1198 else printer_->print(
Debug,
"No recycle space exists." );
1202 rcg_iter->resetNumIters();
1205 rcg_iter->setSize( recycleBlocks_, numBlocks_ );
1208 outputTest_->resetNumCalls();
1217 problem_->computeCurrResVec( &*r_ );
1222 Teuchos::SerialDenseMatrix<int,ScalarType> Utr(recycleBlocks_,1);
1223 index.resize(recycleBlocks_);
1224 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1225 Teuchos::RCP<const MV> Utmp = MVT::CloneView( *U_, index );
1226 MVT::MvTransMv( one, *Utmp, *r_, Utr );
1227 Teuchos::SerialDenseMatrix<int,ScalarType> UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1228 Teuchos::SerialDenseMatrix<int,ScalarType> LUUTAUtmp( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ );
1229 LUUTAUtmp.assign(UTAUtmp);
1231 lapack.GESV(recycleBlocks_, 1, LUUTAUtmp.values(), LUUTAUtmp.stride(), &(*ipiv_)[0], Utr.values(), Utr.stride(), &info);
1233 "Belos::RCGSolMgr::solve(): LAPACK GESV failed to compute a solution.");
1236 MVT::MvTimesMatAddMv( one, *Utmp, Utr, one, *problem_->getCurrLHSVec() );
1239 index.resize(recycleBlocks_);
1240 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1241 Teuchos::RCP<const MV> AUtmp = MVT::CloneView( *AU_, index );
1242 MVT::MvTimesMatAddMv( -one, *AUtmp, Utr, one, *r_ );
1245 if ( precObj != Teuchos::null ) {
1246 OPT::Apply( *precObj, *r_, *z_ );
1252 MVT::MvTransMv( one, *r_, *z_, *rTz_old_ );
1256 Teuchos::SerialDenseMatrix<int,ScalarType> mu( Teuchos::View, *Delta_, recycleBlocks_, 1);
1257 index.resize(recycleBlocks_);
1258 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1259 Teuchos::RCP<const MV> AUtmp = MVT::CloneView( *AU_, index );
1260 MVT::MvTransMv( one, *AUtmp, *z_, mu );
1261 Teuchos::SerialDenseMatrix<int,ScalarType> LUUTAUtmp( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ );
1264 lapack.GETRS( TRANS, recycleBlocks_, 1, LUUTAUtmp.values(), LUUTAUtmp.stride(), &(*ipiv_)[0], mu.values(), mu.stride(), &info );
1266 "Belos::RCGSolMgr::solve(): LAPACK GETRS failed to compute a solution.");
1270 Teuchos::RCP<MV> Ptmp = MVT::CloneViewNonConst( *P_, index );
1271 MVT::MvAddMv(one,*z_,zero,*z_,*Ptmp);
1272 MVT::MvTimesMatAddMv( -one, *U_, mu, one, *Ptmp );
1277 Teuchos::RCP<MV> Ptmp = MVT::CloneViewNonConst( *P_, index );
1278 MVT::MvAddMv(one,*z_,zero,*z_,*Ptmp);
1285 index.resize( numBlocks_+1 );
1286 for (
int ii=0; ii<(numBlocks_+1); ++ii) { index[ii] = ii; }
1287 newstate.
P = MVT::CloneViewNonConst( *P_, index );
1288 index.resize( recycleBlocks_ );
1289 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1290 newstate.
U = MVT::CloneViewNonConst( *U_, index );
1291 index.resize( recycleBlocks_ );
1292 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1293 newstate.
AU = MVT::CloneViewNonConst( *AU_, index );
1294 newstate.
Alpha = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Alpha_, numBlocks_, 1 ) );
1295 newstate.
Beta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Beta_, numBlocks_, 1 ) );
1296 newstate.
D = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *D_, numBlocks_, 1 ) );
1297 newstate.
Delta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_, 0, 1 ) );
1298 newstate.
LUUTAU = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ ) );
1304 newstate.
existU = existU_;
1305 newstate.
ipiv = ipiv_;
1308 rcg_iter->initialize(newstate);
1314 rcg_iter->iterate();
1321 if ( convTest_->getStatus() ==
Passed ) {
1330 else if ( maxIterTest_->getStatus() ==
Passed ) {
1332 isConverged =
false;
1340 else if ( rcg_iter->getCurSubspaceDim() == rcg_iter->getMaxSubspaceDim() ) {
1345 if (recycleBlocks_ > 0) {
1349 Teuchos::SerialDenseMatrix<int,ScalarType> Ftmp( Teuchos::View, *F_, numBlocks_, numBlocks_ );
1350 Teuchos::SerialDenseMatrix<int,ScalarType> Gtmp( Teuchos::View, *G_, numBlocks_, numBlocks_ );
1351 Teuchos::SerialDenseMatrix<int,ScalarType> Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1352 Teuchos::SerialDenseMatrix<int,ScalarType> Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1353 Teuchos::SerialDenseMatrix<int,ScalarType> Betatmp( Teuchos::View, *Beta_, numBlocks_, 1 );
1354 Ftmp.putScalar(zero);
1355 Gtmp.putScalar(zero);
1356 for (
int ii=0;ii<numBlocks_;ii++) {
1357 Gtmp(ii,ii) = (Dtmp(ii,0) / Alphatmp(ii,0))*(1 + Betatmp(ii,0));
1359 Gtmp(ii-1,ii) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1360 Gtmp(ii,ii-1) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1362 Ftmp(ii,ii) = Dtmp(ii,0);
1366 Teuchos::SerialDenseMatrix<int,ScalarType> Ytmp( Teuchos::View, *Y_, numBlocks_, recycleBlocks_ );
1367 getHarmonicVecs(Ftmp,Gtmp,Ytmp);
1370 index.resize( numBlocks_ );
1371 for (
int ii=0; ii<numBlocks_; ++ii) { index[ii] = ii; }
1372 Teuchos::RCP<const MV> Ptmp = MVT::CloneView( *P_, index );
1373 index.resize( recycleBlocks_ );
1374 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1375 Teuchos::RCP<MV> U1tmp = MVT::CloneViewNonConst( *U1_, index );
1376 MVT::MvTimesMatAddMv( one, *Ptmp, Ytmp, zero, *U1tmp );
1381 Teuchos::SerialDenseMatrix<int,ScalarType> GYtmp( Teuchos::View, *GY_, numBlocks_, recycleBlocks_ );
1382 GYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Gtmp,Ytmp,zero);
1383 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1384 AU1TAU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,GYtmp,zero);
1387 Teuchos::SerialDenseMatrix<int,ScalarType> FYtmp( Teuchos::View, *FY_, numBlocks_, recycleBlocks_ );
1388 FYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Ftmp,Ytmp,zero);
1389 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1390 AU1TU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,FYtmp,zero);
1392 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, 1 );
1394 AU1TAPtmp.putScalar(zero);
1396 ScalarType alphatmp = -1.0 / Alphatmp(numBlocks_-1,0);
1397 for (
int ii=0; ii<recycleBlocks_; ++ii) {
1398 AU1TAPtmp(ii,0) = Ytmp(numBlocks_-1,ii) * alphatmp;
1406 lastBeta = numBlocks_-1;
1413 Teuchos::SerialDenseMatrix<int,ScalarType> Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1414 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, numBlocks_ );
1415 AU1TAPtmp.scale(Dtmp(0,0));
1417 Teuchos::SerialDenseMatrix<int,ScalarType> Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1418 Teuchos::SerialDenseMatrix<int,ScalarType> Betatmp( Teuchos::View, *Beta_, numBlocks_+1, 1 );
1419 Teuchos::SerialDenseMatrix<int,ScalarType> APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1420 APTAPtmp.putScalar(zero);
1421 for (
int ii=0; ii<numBlocks_; ii++) {
1422 APTAPtmp(ii,ii) = (Dtmp(ii,0) / Alphatmp(ii,0))*(1 + Betatmp(ii+1,0));
1424 APTAPtmp(ii-1,ii) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1425 APTAPtmp(ii,ii-1) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1430 Teuchos::SerialDenseMatrix<int,ScalarType> Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1431 Teuchos::SerialDenseMatrix<int,ScalarType> F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1432 Teuchos::SerialDenseMatrix<int,ScalarType> F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1433 Teuchos::SerialDenseMatrix<int,ScalarType> F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1434 Teuchos::SerialDenseMatrix<int,ScalarType> F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1435 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1436 F11.assign(AU1TU1tmp);
1437 F12.putScalar(zero);
1438 F21.putScalar(zero);
1439 F22.putScalar(zero);
1440 for(
int ii=0;ii<numBlocks_;ii++) {
1441 F22(ii,ii) = Dtmp(ii,0);
1445 Teuchos::SerialDenseMatrix<int,ScalarType> Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1446 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1447 Teuchos::SerialDenseMatrix<int,ScalarType> G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1448 Teuchos::SerialDenseMatrix<int,ScalarType> G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1449 Teuchos::SerialDenseMatrix<int,ScalarType> G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1450 Teuchos::SerialDenseMatrix<int,ScalarType> G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1451 G11.assign(AU1TAU1tmp);
1452 G12.assign(AU1TAPtmp);
1454 for (
int ii=0;ii<recycleBlocks_;++ii)
1455 for (
int jj=0;jj<numBlocks_;++jj)
1456 G21(jj,ii) = G12(ii,jj);
1457 G22.assign(APTAPtmp);
1460 Teuchos::SerialDenseMatrix<int,ScalarType> Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1461 getHarmonicVecs(Ftmp,Gtmp,Ytmp);
1464 index.resize( numBlocks_ );
1465 for (
int ii=0; ii<numBlocks_; ++ii) { index[ii] = ii+1; }
1466 Teuchos::RCP<const MV> Ptmp = MVT::CloneView( *P_, index );
1467 index.resize( recycleBlocks_ );
1468 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1469 Teuchos::RCP<MV> PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1470 Teuchos::SerialDenseMatrix<int,ScalarType> Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1471 index.resize( recycleBlocks_ );
1472 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1473 Teuchos::RCP<MV> U1tmp = MVT::CloneViewNonConst( *U1_, index );
1474 index.resize( recycleBlocks_ );
1475 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1476 Teuchos::RCP<MV> U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1477 Teuchos::SerialDenseMatrix<int,ScalarType> Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1478 MVT::MvTimesMatAddMv( one, *Ptmp, Y2, zero, *PY2tmp );
1479 MVT::MvTimesMatAddMv( one, *U1tmp, Y1, zero, *U1Y1tmp );
1480 MVT::MvAddMv(one,*U1Y1tmp, one, *PY2tmp, *U1tmp);
1485 Teuchos::SerialDenseMatrix<int,ScalarType> GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1486 GYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Gtmp,Ytmp,zero);
1487 AU1TAU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,GYtmp,zero);
1491 AU1TAPtmp.putScalar(zero);
1492 ScalarType alphatmp = -1.0 / Alphatmp(numBlocks_-1,0);
1493 for (
int ii=0; ii<recycleBlocks_; ++ii) {
1494 AU1TAPtmp(ii,0) = Ytmp(numBlocks_+recycleBlocks_-1,ii) * alphatmp;
1498 Teuchos::SerialDenseMatrix<int,ScalarType> FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1499 FYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Ftmp,Ytmp,zero);
1501 AU1TU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,FYtmp,zero);
1504 lastp = numBlocks_+1;
1505 lastBeta = numBlocks_;
1511 Teuchos::SerialDenseMatrix<int,ScalarType> Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1512 Teuchos::SerialDenseMatrix<int,ScalarType> Betatmp( Teuchos::View, *Beta_, numBlocks_, 1 );
1513 Teuchos::SerialDenseMatrix<int,ScalarType> Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1514 Teuchos::SerialDenseMatrix<int,ScalarType> APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1515 APTAPtmp.putScalar(zero);
1516 for (
int ii=0; ii<numBlocks_; ii++) {
1517 APTAPtmp(ii,ii) = (Dtmp(ii,0) / Alphatmp(ii,0))*(1 + Betatmp(ii,0));
1519 APTAPtmp(ii-1,ii) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1520 APTAPtmp(ii,ii-1) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1524 Teuchos::SerialDenseMatrix<int,ScalarType> L2tmp( Teuchos::View, *L2_, numBlocks_+1, numBlocks_ );
1525 L2tmp.putScalar(zero);
1526 for(
int ii=0;ii<numBlocks_;ii++) {
1527 L2tmp(ii,ii) = 1./Alphatmp(ii,0);
1528 L2tmp(ii+1,ii) = -1./Alphatmp(ii,0);
1532 Teuchos::SerialDenseMatrix<int,ScalarType> AUTAPtmp( Teuchos::View, *AUTAP_, recycleBlocks_, numBlocks_ );
1533 Teuchos::SerialDenseMatrix<int,ScalarType> UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1534 Teuchos::SerialDenseMatrix<int,ScalarType> Deltatmp( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_+1 );
1535 Teuchos::SerialDenseMatrix<int,ScalarType> DeltaL2tmp( Teuchos::View, *DeltaL2_, recycleBlocks_, numBlocks_ );
1536 DeltaL2tmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Deltatmp,L2tmp,zero);
1537 AUTAPtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,UTAUtmp,DeltaL2tmp,zero);
1540 Teuchos::SerialDenseMatrix<int,ScalarType> Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1541 Teuchos::SerialDenseMatrix<int,ScalarType> F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1542 Teuchos::SerialDenseMatrix<int,ScalarType> F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1543 Teuchos::SerialDenseMatrix<int,ScalarType> F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1544 Teuchos::SerialDenseMatrix<int,ScalarType> F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1545 F11.assign(UTAUtmp);
1546 F12.putScalar(zero);
1547 F21.putScalar(zero);
1548 F22.putScalar(zero);
1549 for(
int ii=0;ii<numBlocks_;ii++) {
1550 F22(ii,ii) = Dtmp(ii,0);
1554 Teuchos::SerialDenseMatrix<int,ScalarType> Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1555 Teuchos::SerialDenseMatrix<int,ScalarType> G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1556 Teuchos::SerialDenseMatrix<int,ScalarType> G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1557 Teuchos::SerialDenseMatrix<int,ScalarType> G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1558 Teuchos::SerialDenseMatrix<int,ScalarType> G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1559 Teuchos::SerialDenseMatrix<int,ScalarType> AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1560 G11.assign(AUTAUtmp);
1561 G12.assign(AUTAPtmp);
1563 for (
int ii=0;ii<recycleBlocks_;++ii)
1564 for (
int jj=0;jj<numBlocks_;++jj)
1565 G21(jj,ii) = G12(ii,jj);
1566 G22.assign(APTAPtmp);
1569 Teuchos::SerialDenseMatrix<int,ScalarType> Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1570 getHarmonicVecs(Ftmp,Gtmp,Ytmp);
1573 index.resize( recycleBlocks_ );
1574 for (
int ii=0; ii<(recycleBlocks_); ++ii) { index[ii] = ii; }
1575 Teuchos::RCP<const MV> Utmp = MVT::CloneView( *U_, index );
1576 index.resize( numBlocks_ );
1577 for (
int ii=0; ii<numBlocks_; ++ii) { index[ii] = ii; }
1578 Teuchos::RCP<const MV> Ptmp = MVT::CloneView( *P_, index );
1579 index.resize( recycleBlocks_ );
1580 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1581 Teuchos::RCP<MV> PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1582 Teuchos::SerialDenseMatrix<int,ScalarType> Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1583 index.resize( recycleBlocks_ );
1584 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1585 Teuchos::RCP<MV> UY1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1586 Teuchos::SerialDenseMatrix<int,ScalarType> Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1587 index.resize( recycleBlocks_ );
1588 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1589 Teuchos::RCP<MV> U1tmp = MVT::CloneViewNonConst( *U1_, index );
1590 MVT::MvTimesMatAddMv( one, *Ptmp, Y2, zero, *PY2tmp );
1591 MVT::MvTimesMatAddMv( one, *Utmp, Y1, zero, *UY1tmp );
1592 MVT::MvAddMv(one,*UY1tmp, one, *PY2tmp, *U1tmp);
1597 Teuchos::SerialDenseMatrix<int,ScalarType> GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1598 GYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Gtmp,Ytmp,zero);
1599 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1600 AU1TAU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,GYtmp,zero);
1603 Teuchos::SerialDenseMatrix<int,ScalarType> FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1604 FYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Ftmp,Ytmp,zero);
1605 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1606 AU1TU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,FYtmp,zero);
1609 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TUtmp( Teuchos::View, *AU1TU_, recycleBlocks_, recycleBlocks_ );
1610 AU1TUtmp.assign(UTAUtmp);
1613 dold = Dtmp(numBlocks_-1,0);
1620 lastBeta = numBlocks_-1;
1623 Teuchos::SerialDenseMatrix<int,ScalarType> Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1624 Teuchos::SerialDenseMatrix<int,ScalarType> Betatmp( Teuchos::View, *Beta_, numBlocks_+1, 1 );
1625 Teuchos::SerialDenseMatrix<int,ScalarType> Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1626 Teuchos::SerialDenseMatrix<int,ScalarType> APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1627 for (
int ii=0; ii<numBlocks_; ii++) {
1628 APTAPtmp(ii,ii) = (Dtmp(ii,0) / Alphatmp(ii,0))*(1 + Betatmp(ii+1,0));
1630 APTAPtmp(ii-1,ii) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1631 APTAPtmp(ii,ii-1) = -Dtmp(ii,0)/Alphatmp(ii-1,0);
1635 Teuchos::SerialDenseMatrix<int,ScalarType> L2tmp( Teuchos::View, *L2_, numBlocks_+1, numBlocks_ );
1636 for(
int ii=0;ii<numBlocks_;ii++) {
1637 L2tmp(ii,ii) = 1./Alphatmp(ii,0);
1638 L2tmp(ii+1,ii) = -1./Alphatmp(ii,0);
1643 Teuchos::SerialDenseMatrix<int,ScalarType> DeltaL2( Teuchos::View, *DeltaL2_, recycleBlocks_, numBlocks_ );
1644 Teuchos::SerialDenseMatrix<int,ScalarType> Deltatmp( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_+1 );
1645 DeltaL2.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Deltatmp,L2tmp,zero);
1646 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TUDeltaL2( Teuchos::View, *AU1TUDeltaL2_, recycleBlocks_, numBlocks_ );
1647 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TUtmp( Teuchos::View, *AU1TU_, recycleBlocks_, recycleBlocks_ );
1648 AU1TUDeltaL2.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,AU1TUtmp,DeltaL2,zero);
1649 Teuchos::SerialDenseMatrix<int,ScalarType> Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1650 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, numBlocks_ );
1651 AU1TAPtmp.putScalar(zero);
1652 AU1TAPtmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Y1,AU1TUDeltaL2,zero);
1653 Teuchos::SerialDenseMatrix<int,ScalarType> Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1654 ScalarType val = dold * (-Betatmp(0,0)/Alphatmp(0,0));
1655 for(
int ii=0;ii<recycleBlocks_;ii++) {
1656 AU1TAPtmp(ii,0) += Y2(numBlocks_-1,ii)*val;
1660 Teuchos::SerialDenseMatrix<int,ScalarType> Y1TAU1TU( Teuchos::View, *GY_, recycleBlocks_, recycleBlocks_ );
1661 Y1TAU1TU.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Y1,AU1TUtmp,zero);
1662 AU1TUtmp.assign(Y1TAU1TU);
1665 Teuchos::SerialDenseMatrix<int,ScalarType> Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1666 Teuchos::SerialDenseMatrix<int,ScalarType> F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1667 Teuchos::SerialDenseMatrix<int,ScalarType> F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1668 Teuchos::SerialDenseMatrix<int,ScalarType> F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1669 Teuchos::SerialDenseMatrix<int,ScalarType> F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1670 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1671 F11.assign(AU1TU1tmp);
1672 for(
int ii=0;ii<numBlocks_;ii++) {
1673 F22(ii,ii) = Dtmp(ii,0);
1677 Teuchos::SerialDenseMatrix<int,ScalarType> Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1678 Teuchos::SerialDenseMatrix<int,ScalarType> G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1679 Teuchos::SerialDenseMatrix<int,ScalarType> G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1680 Teuchos::SerialDenseMatrix<int,ScalarType> G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1681 Teuchos::SerialDenseMatrix<int,ScalarType> G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1682 Teuchos::SerialDenseMatrix<int,ScalarType> AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1683 G11.assign(AU1TAU1tmp);
1684 G12.assign(AU1TAPtmp);
1686 for (
int ii=0;ii<recycleBlocks_;++ii)
1687 for (
int jj=0;jj<numBlocks_;++jj)
1688 G21(jj,ii) = G12(ii,jj);
1689 G22.assign(APTAPtmp);
1692 Teuchos::SerialDenseMatrix<int,ScalarType> Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1693 getHarmonicVecs(Ftmp,Gtmp,Ytmp);
1696 index.resize( numBlocks_ );
1697 for (
int ii=0; ii<numBlocks_; ++ii) { index[ii] = ii+1; }
1698 Teuchos::RCP<const MV> Ptmp = MVT::CloneView( *P_, index );
1699 index.resize( recycleBlocks_ );
1700 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1701 Teuchos::RCP<MV> PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1702 index.resize( recycleBlocks_ );
1703 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1704 Teuchos::RCP<MV> U1tmp = MVT::CloneViewNonConst( *U1_, index );
1705 index.resize( recycleBlocks_ );
1706 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1707 Teuchos::RCP<MV> U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1708 MVT::MvTimesMatAddMv( one, *Ptmp, Y2, zero, *PY2tmp );
1709 MVT::MvTimesMatAddMv( one, *U1tmp, Y1, zero, *U1Y1tmp );
1710 MVT::MvAddMv(one,*U1Y1tmp, one, *PY2tmp, *U1tmp);
1715 Teuchos::SerialDenseMatrix<int,ScalarType> GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1716 GYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Gtmp,Ytmp,zero);
1717 AU1TAU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,GYtmp,zero);
1720 Teuchos::SerialDenseMatrix<int,ScalarType> FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1721 FYtmp.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,one,Ftmp,Ytmp,zero);
1722 AU1TU1tmp.multiply(
Teuchos::TRANS,Teuchos::NO_TRANS,one,Ytmp,FYtmp,zero);
1725 dold = Dtmp(numBlocks_-1,0);
1728 lastp = numBlocks_+1;
1729 lastBeta = numBlocks_;
1739 index[0] = lastp-1; index[1] = lastp;
1740 Teuchos::RCP<const MV> Ptmp2 = MVT::CloneView( *P_, index );
1741 index[0] = 0; index[1] = 1;
1742 MVT::SetBlock(*Ptmp2,index,*P_);
1745 (*Beta_)(0,0) = (*Beta_)(lastBeta,0);
1749 Teuchos::SerialDenseMatrix<int,ScalarType> mu1( Teuchos::View, *Delta_, recycleBlocks_, 1, 0, 0 );
1750 Teuchos::SerialDenseMatrix<int,ScalarType> mu2( Teuchos::View, *Delta_, recycleBlocks_, 1, 0, numBlocks_ );
1755 newstate.
P = Teuchos::null;
1756 index.resize( numBlocks_+1 );
1757 for (
int ii=0; ii<(numBlocks_+1); ++ii) { index[ii] = ii+1; }
1758 newstate.
P = MVT::CloneViewNonConst( *P_, index );
1760 newstate.
Beta = Teuchos::null;
1761 newstate.
Beta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Beta_, numBlocks_, 1, 1, 0 ) );
1763 newstate.
Delta = Teuchos::null;
1764 newstate.
Delta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_, 0, 1 ) );
1769 rcg_iter->initialize(newstate);
1782 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
1783 "Belos::RCGSolMgr::solve(): Invalid return from RCGIter::iterate().");
1786 catch (
const std::exception &e) {
1787 printer_->stream(
Errors) <<
"Error! Caught std::exception in RCGIter::iterate() at iteration " 1788 << rcg_iter->getNumIters() << std::endl
1789 << e.what() << std::endl;
1795 problem_->setCurrLS();
1799 if ( numRHS2Solve > 0 ) {
1802 problem_->setLSIndex( currIdx );
1805 currIdx.resize( numRHS2Solve );
1811 index.resize(recycleBlocks_);
1812 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1813 MVT::SetBlock(*U1_,index,*U_);
1816 if (numRHS2Solve > 0) {
1818 newstate.
P = Teuchos::null;
1819 newstate.
Ap = Teuchos::null;
1820 newstate.
r = Teuchos::null;
1821 newstate.
z = Teuchos::null;
1822 newstate.
U = Teuchos::null;
1823 newstate.
AU = Teuchos::null;
1824 newstate.
Alpha = Teuchos::null;
1825 newstate.
Beta = Teuchos::null;
1826 newstate.
D = Teuchos::null;
1827 newstate.
Delta = Teuchos::null;
1828 newstate.
LUUTAU = Teuchos::null;
1829 newstate.
ipiv = Teuchos::null;
1830 newstate.
rTz_old = Teuchos::null;
1833 index.resize(recycleBlocks_);
1834 for (
int i=0; i<recycleBlocks_; ++i) { index[i] = i; }
1835 Teuchos::RCP<const MV> Utmp = MVT::CloneView( *U_, index );
1836 index.resize(recycleBlocks_);
1837 for (
int i=0; i<recycleBlocks_; ++i) { index[i] = i; }
1838 Teuchos::RCP<MV> AUtmp = MVT::CloneViewNonConst( *AU_, index );
1840 problem_->applyOp( *Utmp, *AUtmp );
1842 Teuchos::SerialDenseMatrix<int,ScalarType> UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1843 MVT::MvTransMv( one, *Utmp, *AUtmp, UTAUtmp );
1845 Teuchos::SerialDenseMatrix<int,ScalarType> AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1846 if ( precObj != Teuchos::null ) {
1847 index.resize(recycleBlocks_);
1848 for (
int i=0; i<recycleBlocks_; ++i) { index[i] = i; }
1849 index.resize(recycleBlocks_);
1850 for (
int ii=0; ii<recycleBlocks_; ++ii) { index[ii] = ii; }
1851 Teuchos::RCP<MV> LeftPCAU = MVT::CloneViewNonConst( *U1_, index );
1852 OPT::Apply( *precObj, *AUtmp, *LeftPCAU );
1853 MVT::MvTransMv( one, *AUtmp, *LeftPCAU, AUTAUtmp );
1855 MVT::MvTransMv( one, *AUtmp, *AUtmp, AUTAUtmp );
1868 #ifdef BELOS_TEUCHOS_TIME_MONITOR 1873 Teuchos::TimeMonitor::summarize( printer_->stream(TimingDetails) );
1877 numIters_ = maxIterTest_->getNumIters();
1881 using Teuchos::rcp_dynamic_cast;
1884 const std::vector<MagnitudeType>* pTestValues =
1885 rcp_dynamic_cast<conv_test_type>(convTest_)->getTestValue();
1887 TEUCHOS_TEST_FOR_EXCEPTION(pTestValues == NULL, std::logic_error,
1888 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() " 1889 "method returned NULL. Please report this bug to the Belos developers.");
1891 TEUCHOS_TEST_FOR_EXCEPTION(pTestValues->size() < 1, std::logic_error,
1892 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() " 1893 "method returned a vector of length zero. Please report this bug to the " 1894 "Belos developers.");
1899 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
1909 template<
class ScalarType,
class MV,
class OP>
1911 const Teuchos::SerialDenseMatrix<int,ScalarType>& G,
1912 Teuchos::SerialDenseMatrix<int,ScalarType>& Y) {
1914 int n = F.numCols();
1917 Teuchos::LAPACK<int,ScalarType> lapack;
1920 std::vector<MagnitudeType> w(n);
1923 std::vector<int> iperm(n);
1930 std::vector<ScalarType> work(1);
1934 Teuchos::SerialDenseMatrix<int,ScalarType> F2( Teuchos::Copy, *F_ );
1935 Teuchos::SerialDenseMatrix<int,ScalarType> G2( Teuchos::Copy, *G_ );
1938 lapack.SYGV(itype, jobz, uplo, n, G2.values(), G2.stride(), F2.values(), F2.stride(), &w[0], &work[0], lwork, &info);
1940 "Belos::RCGSolMgr::solve(): LAPACK SYGV failed to query optimal work size.");
1941 lwork = (int)work[0];
1943 lapack.SYGV(itype, jobz, uplo, n, G2.values(), G2.stride(), F2.values(), F2.stride(), &w[0], &work[0], lwork, &info);
1945 "Belos::RCGSolMgr::solve(): LAPACK SYGV failed to compute eigensolutions.");
1949 this->sort(w,n,iperm);
1952 for(
int i=0; i<recycleBlocks_; i++ ) {
1953 for(
int j=0; j<n; j++ ) {
1954 Y(j,i) = G2(j,iperm[i]);
1961 template<
class ScalarType,
class MV,
class OP>
1964 int l, r, j, i, flag;
1993 if (dlist[j] > dlist[j - 1]) j = j + 1;
1995 if (dlist[j - 1] > dK) {
1996 dlist[i - 1] = dlist[j - 1];
1997 iperm[i - 1] = iperm[j - 1];
2010 dlist[r] = dlist[0];
2011 iperm[r] = iperm[0];
2026 template<
class ScalarType,
class MV,
class OP>
2029 std::ostringstream oss;
2030 oss <<
"Belos::RCGSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<
">";
Teuchos::RCP< MV > r
The current residual.
Collection of types and exceptions used within the Belos solvers.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > rTz_old
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
Teuchos::RCP< MV > P
The current Krylov basis.
Teuchos::RCP< std::vector< int > > ipiv
Data from LU factorization of U^T A U.
Class which manages the output and verbosity of the Belos solvers.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem)
Set the linear problem that needs to be solved.
RCGSolMgrRecyclingFailure is thrown when any problem occurs in using/creating the recycling subspace...
virtual ~RCGSolMgr()
Destructor.
Teuchos::RCP< MV > U
The recycled subspace and its image.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > LUUTAU
The LU factorization of the matrix U^T A U.
Base class for Belos::SolverManager subclasses which normally can only compile with real ScalarType t...
A factory class for generating StatusTestOutput objects.
Implementation of the RCG (Recycling Conjugate Gradient) iterative linear solver. ...
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Beta
This class implements the RCG iteration, where a single-std::vector Krylov subspace is constructed...
An implementation of StatusTestResNorm using a family of residual norms.
int getNumIters() const
Get the iteration count for the most recent call to solve().
Belos::StatusTest class for specifying a maximum number of iterations.
A factory class for generating StatusTestOutput objects.
Iterated Modified Gram-Schmidt (IMGS) implementation of the Belos::OrthoManager class.
RCGSolMgrLinearProblemFailure(const std::string &what_arg)
RCGSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i.e.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
Structure to contain pointers to RCGIter state variables.
Belos concrete class for performing the RCG iteration.
Classical Gram-Schmidt (with DGKS correction) implementation of the Belos::OrthoManager class...
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
A Belos::StatusTest class for specifying a maximum number of iterations.
ResetType
How to reset the solver.
bool existU
Flag to indicate the recycle space should be used.
Pure virtual base class which describes the basic interface for a solver manager. ...
Teuchos::RCP< MV > z
The current preconditioned residual.
Teuchos::RCP< MV > Ap
A times current search vector.
MagnitudeType achievedTol() const
Tolerance achieved by the last solve() invocation.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
Type traits class that says whether Teuchos::LAPACK has a valid implementation for the given ScalarTy...
ReturnType
Whether the Belos solve converged for all linear systems.
bool isLOADetected() const
Return whether a loss of accuracy was detected by this solver during the most current solve...
Iterated Classical Gram-Schmidt (ICGS) implementation of the Belos::OrthoManager class.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Alpha
Coefficients arising in RCG iteration.
int setTolerance(MagnitudeType tolerance)
Set the value of the tolerance.
Teuchos::RCP< StatusTestOutput< ScalarType, MV, OP > > create(const Teuchos::RCP< OutputManager< ScalarType > > &printer, Teuchos::RCP< StatusTest< ScalarType, MV, OP > > test, int mod, int printStates)
Create the StatusTestOutput object specified by the outputStyle.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
int curDim
The current dimension of the reduction.
RCGSolMgrLAPACKFailure(const std::string &what_arg)
void reset(const ResetType type)
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
RCGSolMgr(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< Teuchos::ParameterList > &pl)
A class for extending the status testing capabilities of Belos via logical combinations.
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const
Get a parameter list containing the current parameters for this object.
Class which defines basic traits for the operator type.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > D
Parent class to all Belos exceptions.
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Return a reference to the linear problem being solved by this solver manager.
RCGSolMgrRecyclingFailure(const std::string &what_arg)
Belos header file which uses auto-configuration information to include necessary C++ headers...
RCGSolMgrLAPACKFailure is thrown when a nonzero value is retuned from an LAPACK call.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Delta
Solutions to local least-squares problems.