42 #ifndef ANASAZI_TraceMinBase_SOLMGR_HPP 
   43 #define ANASAZI_TraceMinBase_SOLMGR_HPP 
   61 #include "AnasaziStatusTestSpecTrans.hpp" 
   69 #include "Teuchos_FancyOStream.hpp" 
   75 namespace Experimental {
 
  110 template<
class ScalarType, 
class MV, 
class OP>
 
  198      return Teuchos::tuple(_timerSolve, _timerRestarting, _timerLocking);
 
  257   int blockSize_, numBlocks_, numRestartBlocks_;
 
  263   MagnitudeType convTol_;
 
  268   MagnitudeType lockTol_;
 
  269   int maxLocked_, lockQuorum_;
 
  270   bool useLocking_, relLockTol_;
 
  274   enum WhenToShiftType whenToShift_;
 
  275   MagnitudeType traceThresh_, shiftTol_;
 
  276   enum HowToShiftType howToShift_;
 
  277   bool useMultipleShifts_, relShiftTol_, considerClusters_;
 
  278   std::string shiftNorm_;
 
  282   std::string ortho_, which_;
 
  283   enum SaddleSolType saddleSolType_;
 
  284   bool projectAllVecs_, projectLockedVecs_, computeAllRes_, useRHSR_, useHarmonic_, noSort_;
 
  285   MagnitudeType alpha_;
 
  300   void printParameters(std::ostream &os) 
const;
 
  318 template<
class ScalarType, 
class MV, 
class OP>
 
  323 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
 
  324   , _timerSolve(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: TraceMinBaseSolMgr::solve()")),
 
  325   _timerRestarting(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: TraceMinBaseSolMgr restarting")),
 
  326   _timerLocking(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: TraceMinBaseSolMgr locking"))
 
  332   TEUCHOS_TEST_FOR_EXCEPTION(problem_->getInitVec() == Teuchos::null,std::invalid_argument, 
"Problem does not contain initial vectors to clone from.");
 
  355   int osProc = pl.
get(
"Output Processor", 0);
 
  361     osp = Teuchos::getParameter<Teuchos::RCP<Teuchos::FancyOStream> >(pl,
"Output Stream");
 
  369     if (Teuchos::isParameterType<int>(pl,
"Verbosity")) {
 
  370       verbosity = pl.
get(
"Verbosity", verbosity);
 
  372       verbosity = (int)Teuchos::getParameter<Anasazi::MsgType>(pl,
"Verbosity");
 
  381   convTol_ = pl.
get(
"Convergence Tolerance",
MT::prec());
 
  383                      "Anasazi::TraceMinBaseSolMgr: \"Convergence Tolerance\" must be nonnegative.");
 
  385   relConvTol_ = pl.
get(
"Relative Convergence Tolerance",
true);
 
  386   strtmp = pl.
get(
"Convergence Norm",std::string(
"2"));
 
  388     convNorm_ = RES_2NORM;
 
  390   else if (strtmp == 
"M") {
 
  391     convNorm_ = RES_ORTH;
 
  395         "Anasazi::TraceMinBaseSolMgr: Invalid Convergence Norm.");
 
  400   useLocking_ = pl.
get(
"Use Locking",
true);
 
  401   relLockTol_ = pl.
get(
"Relative Locking Tolerance",
true);
 
  402   lockTol_ = pl.
get(
"Locking Tolerance",convTol_/10);
 
  405          "Anasazi::TraceMinBaseSolMgr: \"Relative Convergence Tolerance\" and \"Relative Locking Tolerance\" have different values.  If you set one, you should always set the other.");
 
  408                      "Anasazi::TraceMinBaseSolMgr: \"Locking Tolerance\" must be nonnegative.");
 
  410   strtmp = pl.
get(
"Locking Norm",std::string(
"2"));
 
  412     lockNorm_ = RES_2NORM;
 
  414   else if (strtmp == 
"M") {
 
  415     lockNorm_ = RES_ORTH;
 
  419         "Anasazi::TraceMinBaseSolMgr: Invalid Locking Norm.");
 
  424     maxLocked_ = pl.
get(
"Max Locked",problem_->getNEV());
 
  426            "Anasazi::TraceMinBaseSolMgr: \"Max Locked\" must be strictly positive.");
 
  433     lockQuorum_ = pl.
get(
"Locking Quorum",1);
 
  435                        "Anasazi::TraceMinBaseSolMgr: \"Locking Quorum\" must be strictly positive.");
 
  442   strtmp = pl.
get(
"When To Shift", 
"Always");
 
  444   if(strtmp == 
"Never")
 
  445     whenToShift_ = NEVER_SHIFT;
 
  446   else if(strtmp == 
"After Trace Levels")
 
  447     whenToShift_ = SHIFT_WHEN_TRACE_LEVELS;
 
  448   else if(strtmp == 
"Residual Becomes Small")
 
  449     whenToShift_ = SHIFT_WHEN_RESID_SMALL;
 
  450   else if(strtmp == 
"Always")
 
  451     whenToShift_ = ALWAYS_SHIFT;
 
  454            "Anasazi::TraceMinBaseSolMgr: Invalid value for \"When To Shift\"; valid options are \"Never\", \"After Trace Levels\", \"Residual Becomes Small\", \"Always\".");  
 
  458   traceThresh_ = pl.
get(
"Trace Threshold", 0.02);
 
  461                        "Anasazi::TraceMinBaseSolMgr: \"Trace Threshold\" must be nonnegative.");
 
  464   shiftTol_ = pl.
get(
"Shift Tolerance", 0.1);
 
  467                        "Anasazi::TraceMinBaseSolMgr: \"Shift Tolerance\" must be nonnegative.");
 
  470   relShiftTol_ = pl.
get(
"Relative Shift Tolerance", 
true);
 
  473   shiftNorm_ = pl.
get(
"Shift Norm", 
"2");
 
  476          "Anasazi::TraceMinBaseSolMgr: Invalid value for \"Shift Norm\"; valid options are \"2\" and \"M\".");  
 
  478   noSort_ = pl.
get(
"No Sorting", 
false);
 
  481   strtmp = pl.
get(
"How To Choose Shift", 
"Adjusted Ritz Values");
 
  483   if(strtmp == 
"Largest Converged")
 
  484     howToShift_ = LARGEST_CONVERGED_SHIFT;
 
  485   else if(strtmp == 
"Adjusted Ritz Values")
 
  486     howToShift_ = ADJUSTED_RITZ_SHIFT;
 
  487   else if(strtmp == 
"Ritz Values")
 
  488     howToShift_ = RITZ_VALUES_SHIFT;
 
  489   else if(strtmp == 
"Experimental Shift")
 
  490     howToShift_ = EXPERIMENTAL_SHIFT;
 
  493            "Anasazi::TraceMinBaseSolMgr: Invalid value for \"How To Choose Shift\"; valid options are \"Largest Converged\", \"Adjusted Ritz Values\", \"Ritz Values\".");
 
  496   considerClusters_ = pl.
get(
"Consider Clusters", 
true);
 
  499   useMultipleShifts_ = pl.
get(
"Use Multiple Shifts", 
true);
 
  505   ortho_ = pl.
get(
"Orthogonalization", 
"SVQB");
 
  507          "Anasazi::TraceMinBaseSolMgr: Invalid value for \"Orthogonalization\"; valid options are \"DGKS\", \"SVQB\", \"ICGS\".");  
 
  509   strtmp = pl.
get(
"Saddle Solver Type", 
"Projected Krylov");
 
  511   if(strtmp == 
"Projected Krylov")
 
  512     saddleSolType_ = PROJECTED_KRYLOV_SOLVER;
 
  513   else if(strtmp == 
"Schur Complement")
 
  514     saddleSolType_ = SCHUR_COMPLEMENT_SOLVER;
 
  515   else if(strtmp == 
"Block Diagonal Preconditioned Minres")
 
  516     saddleSolType_ = BD_PREC_MINRES;
 
  517   else if(strtmp == 
"HSS Preconditioned Gmres")
 
  518     saddleSolType_ = HSS_PREC_GMRES;
 
  521            "Anasazi::TraceMinBaseSolMgr: Invalid value for \"Saddle Solver Type\"; valid options are \"Projected Krylov\", \"Schur Complement\", and \"Block Diagonal Preconditioned Minres\".");
 
  523   projectAllVecs_ = pl.
get(
"Project All Vectors", 
true);
 
  524   projectLockedVecs_ = pl.
get(
"Project Locked Vectors", 
true);
 
  525   computeAllRes_ = pl.
get(
"Compute All Residuals", 
true);
 
  526   useRHSR_ = pl.
get(
"Use Residual as RHS", 
false);
 
  527   alpha_ = pl.
get(
"HSS: alpha", 1.0);
 
  530          "Anasazi::TraceMinBaseSolMgr: If you want to project out the locked vectors, you should really project out ALL the vectors of X.");
 
  533   maxKrylovIter_ = pl.
get(
"Maximum Krylov Iterations", 200);
 
  535          "Anasazi::TraceMinBaseSolMgr: \"Maximum Krylov Iterations\" must be greater than 0.");
 
  538   which_ = pl.
get(
"Which", 
"SM");
 
  540          "Anasazi::TraceMinBaseSolMgr: Invalid value for \"Which\"; valid options are \"SM\" and \"LM\".");
 
  545          "Anasazi::TraceMinBaseSolMgr: It is an exceptionally bad idea to use Ritz shifts when finding the largest eigenpairs of a standard eigenvalue problem.  If we don't use Ritz shifts, it may take extra iterations to converge, but we NEVER have to solve a single linear system.  Using Ritz shifts forces us to solve systems of the form (I + sigma A)x=f, and it probably doesn't benefit us enough to outweigh the extra cost.  We may add support for this feature in the future, but for now, please set \"When To Shift\" to \"Never\".");
 
  547 #ifdef BELOS_PSEUDO_BLOCK_GMRES_SOLMGR_HPP 
  550   TEUCHOS_TEST_FOR_EXCEPTION(problem_->getPrec() != Teuchos::null && saddleSolType_ == PROJECTED_KRYLOV_SOLVER && useMultipleShifts_, std::invalid_argument,
 
  551          "Anasazi::TraceMinBaseSolMgr: When you use the projected Krylov solver with preconditioning, the preconditioner must be projected as well.  In theory, if the preconditioner is SPD, the projected preconditioner will be SPSD, but in practice, it can have small negative eigenvalues, presumably due to machine arithmetic.  This means we can't use TraceMin's built-in MINRES, and we are forced to use Belos for now.  When you use multiple Ritz shifts, you are essentially using a different operator to solve each linear system.  Belos can't handle this right now, but we're working on a solution.  For now, please set \"Use Multiple Shifts\" to false.");
 
  558   TEUCHOS_TEST_FOR_EXCEPTION(problem_->getPrec() != Teuchos::null && saddleSolType_ == PROJECTED_KRYLOV_SOLVER, std::invalid_argument,
 
  559          "Anasazi::TraceMinBaseSolMgr: When you use the projected Krylov solver with preconditioning, the preconditioner must be projected as well.  In theory, if the preconditioner is SPD, the projected preconditioner will be SPSD, but in practice, it can have small negative eigenvalues, presumably due to machine arithmetic.  This means we can't use TraceMin's built-in MINRES, and we are forced to use Belos for now.  You didn't install Belos.  You have three options to correct this problem:\n1. Reinstall Trilinos with Belos enabled\n2. Don't use a preconditioner\n3. Choose a different method for solving the saddle-point problem (Recommended)");
 
  571 template<
class ScalarType, 
class MV, 
class OP>
 
  577   const int nev = problem_->getNEV();
 
  581       out = Teuchos::getFancyOStream(Teuchos::rcpFromRef(printer_->stream(
Debug)));
 
  583     *out << 
"Entering Anasazi::TraceMinBaseSolMgr::solve()\n";
 
  596     problem_->setOperator(problem_->getM());
 
  597     problem_->setM(swapHelper);
 
  598     problem_->setProblem();
 
  606   if (globalTest_ == Teuchos::null) {
 
  610       convtest = 
rcp( 
new StatusTestSpecTrans<ScalarType,MV,OP>(convTol_,nev,convNorm_,relConvTol_,
true,problem_->getOperator()) );
 
  613     convtest = globalTest_;
 
  620     if (lockingTest_ == Teuchos::null) {
 
  624         locktest = 
rcp( 
new StatusTestSpecTrans<ScalarType,MV,OP>(lockTol_,lockQuorum_,lockNorm_,relLockTol_,
true,problem_->getOperator()) );
 
  627       locktest = lockingTest_;
 
  633   if (locktest != Teuchos::null) alltests.
push_back(locktest);
 
  634   if (debugTest_ != Teuchos::null) alltests.
push_back(debugTest_);
 
  640   if ( printer_->isVerbosity(
Debug) ) {
 
  650   if (ortho_==
"SVQB") {
 
  652   } 
else if (ortho_==
"DGKS") {
 
  654   } 
else if (ortho_==
"ICGS") {
 
  663   setParameters(plist);
 
  668     = createSolver(sorter,outputtest,ortho,plist);
 
  671   if (probauxvecs != Teuchos::null) {
 
  672     tm_solver->setAuxVecs( Teuchos::tuple< 
RCP<const MV> >(probauxvecs) );
 
  679   int curNumLocked = 0;
 
  686   if (maxLocked_ > 0) {
 
  687     lockvecs = MVT::Clone(*problem_->getInitVec(),maxLocked_);
 
  689   std::vector<MagnitudeType> lockvals;
 
  734   const ScalarType ONE = SCT::one();
 
  735   const ScalarType ZERO = SCT::zero();
 
  740   problem_->setSolution(sol);
 
  746 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 
  753         tm_solver->iterate();
 
  759         if (debugTest_ != Teuchos::null && debugTest_->getStatus() == 
Passed) {
 
  760           throw AnasaziError(
"Anasazi::TraceMinBaseSolMgr::solve(): User-specified debug status test returned Passed.");
 
  767         else if (ordertest->getStatus() == 
Passed ) {
 
  778         else if (locktest != Teuchos::null && locktest->getStatus() == 
Passed) {
 
  780 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 
  787           const int curdim = state.
curDim;
 
  792               "Anasazi::TraceMinBaseSolMgr::solve(): status test mistake: howMany() non-positive.");
 
  794               "Anasazi::TraceMinBaseSolMgr::solve(): status test mistake: howMany() not consistent with whichVecs().");
 
  797               "Anasazi::TraceMinBaseSolMgr::solve(): status test mistake: locking not deactivated.");
 
  800           std::vector<int> tmp_vector_int;
 
  801           if (curNumLocked + locktest->howMany() > maxLocked_) {
 
  803       for(
int i=0; i<maxLocked_-curNumLocked; i++)
 
  804         tmp_vector_int.push_back(locktest->whichVecs()[i]);
 
  808             tmp_vector_int = locktest->whichVecs();
 
  811           const std::vector<int> lockind(tmp_vector_int);
 
  812           const int numNewLocked = lockind.size();
 
  816           const int numUnlocked = curdim-numNewLocked;
 
  817           tmp_vector_int.resize(curdim);
 
  818           for (
int i=0; i<curdim; i++) tmp_vector_int[i] = i;
 
  819           const std::vector<int> curind(tmp_vector_int);       
 
  820           tmp_vector_int.resize(numUnlocked); 
 
  821           std::set_difference(curind.begin(),curind.end(),lockind.begin(),lockind.end(),tmp_vector_int.begin());
 
  822           const std::vector<int> unlockind(tmp_vector_int);    
 
  823           tmp_vector_int.clear();
 
  827           if (printer_->isVerbosity(
Debug)) {
 
  828             printer_->print(
Debug,
"Locking vectors: ");
 
  829             for (
unsigned int i=0; i<lockind.size(); i++) {printer_->stream(
Debug) << 
" " << lockind[i];}
 
  830             printer_->print(
Debug,
"\n");
 
  831             printer_->print(
Debug,
"Not locking vectors: ");
 
  832             for (
unsigned int i=0; i<unlockind.size(); i++) {printer_->stream(
Debug) << 
" " << unlockind[i];}
 
  833             printer_->print(
Debug,
"\n");
 
  837           std::vector<Value<ScalarType> > allvals = tm_solver->getRitzValues();
 
  838           for(
unsigned int i=0; i<allvals.size(); i++)
 
  839             printer_->stream(
Debug) << 
"Ritz value[" << i << 
"] = " << allvals[i].realpart << std::endl;
 
  840           for (
int i=0; i<numNewLocked; i++) {
 
  841             lockvals.push_back(allvals[lockind[i]].realpart);
 
  845           RCP<const MV> newLocked = MVT::CloneView(*tm_solver->getRitzVectors(),lockind);
 
  846           std::vector<int> indlock(numNewLocked);
 
  847           for (
int i=0; i<numNewLocked; i++) indlock[i] = curNumLocked+i;
 
  850             RCP<MV> tempMV = MVT::CloneCopy(*newLocked);
 
  851             ortho->normalizeMat(*tempMV);
 
  852             MVT::SetBlock(*tempMV,indlock,*lockvecs);
 
  856             MVT::SetBlock(*newLocked,indlock,*lockvecs);
 
  864             for(
unsigned int aliciaInd=0; aliciaInd<lockvals.size(); aliciaInd++)
 
  866               lockvals[aliciaInd] = 0.0;
 
  869           ordertest->setAuxVals(lockvals);
 
  873           curNumLocked += numNewLocked;
 
  875           if(ordertest->getStatus() == 
Passed)  
break;
 
  877           std::vector<int> curlockind(curNumLocked);
 
  878           for (
int i=0; i<curNumLocked; i++) curlockind[i] = i;
 
  879           RCP<const MV> curlocked = MVT::CloneView(*lockvecs,curlockind);
 
  882           if (probauxvecs != Teuchos::null) aux.
push_back(probauxvecs);
 
  884           tm_solver->setAuxVecs(aux);
 
  887           printer_->stream(
Debug) << 
"curNumLocked: " << curNumLocked << std::endl;
 
  888           printer_->stream(
Debug) << 
"maxLocked: " << maxLocked_ << std::endl;
 
  889           if (curNumLocked == maxLocked_) {
 
  891             combotest->removeTest(locktest);
 
  892             locktest = Teuchos::null;
 
  893             printer_->stream(
Debug) << 
"Removed locking test\n";
 
  896           int newdim = numRestartBlocks_*blockSize_;
 
  898           if(newdim <= numUnlocked)
 
  902               std::vector<int> desiredSubscripts(newdim);
 
  903               for(
int i=0; i<newdim; i++)
 
  905                 desiredSubscripts[i] = unlockind[i];
 
  906                 printer_->stream(
Debug) << 
"H desiredSubscripts[" << i << 
"] = " << desiredSubscripts[i] << std::endl;
 
  908               newstate.
V = MVT::CloneView(*tm_solver->getRitzVectors(),desiredSubscripts);
 
  913               std::vector<int> desiredSubscripts(newdim);
 
  914               for(
int i=0; i<newdim; i++)
 
  916                 desiredSubscripts[i] = unlockind[i];
 
  917                 printer_->stream(
Debug) << 
"desiredSubscripts[" << i << 
"] = " << desiredSubscripts[i] << std::endl;
 
  920               copyPartOfState(state, newstate, desiredSubscripts);
 
  928             int nrandom = newdim-numUnlocked;
 
  931             RCP<MV> totalV = MVT::Clone(*tm_solver->getRitzVectors(),newdim);
 
  934             tmp_vector_int.resize(numUnlocked);
 
  935             for(
int i=0; i<numUnlocked; i++) tmp_vector_int[i] = i;
 
  936             RCP<MV> oldV = MVT::CloneViewNonConst(*totalV,tmp_vector_int);
 
  940               helperMV = MVT::CloneView(*tm_solver->getRitzVectors(),unlockind);
 
  942               helperMV = MVT::CloneView(*state.
V,unlockind);
 
  943             MVT::Assign(*helperMV,*oldV);
 
  946             tmp_vector_int.resize(nrandom);
 
  947             for(
int i=0; i<nrandom; i++) tmp_vector_int[i] = i+numUnlocked;
 
  948             RCP<MV> newV = MVT::CloneViewNonConst(*totalV,tmp_vector_int);
 
  951             MVT::MvRandom(*newV);
 
  958             for(
unsigned int i=0; i<(
unsigned int)blockSize_; i++) 
 
  960               if(i < unlockind.size() && unlockind[i] < blockSize_)
 
  961                 (*helperRS)[i] = (*state.
ritzShifts)[unlockind[i]];
 
  963                 (*helperRS)[i] = ZERO;
 
  970           for(
size_t i=0; i<lockvals.size(); i++)
 
  976           newstate.
NEV = state.
NEV - numNewLocked;
 
  977           tm_solver->initialize(newstate);
 
  984         else if ( needToRestart(tm_solver) ) {
 
  986           if(performRestart(numRestarts, tm_solver) == 
false)
 
  996           TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Anasazi::TraceMinBaseSolMgr::solve(): Invalid return from tm_solver::iterate().");
 
 1001           << 
"Anasazi::TraceMinBaseSolMgr::solve() caught unexpected exception from Anasazi::TraceMinBase::iterate() at iteration " << tm_solver->getNumIters() << std::endl
 
 1002           << err.what() << std::endl
 
 1003           << 
"Anasazi::TraceMinBaseSolMgr::solve() returning Unconverged with no solutions." << std::endl;
 
 1008     sol.
numVecs = ordertest->howMany();
 
 1010       sol.
Evecs = MVT::Clone(*problem_->getInitVec(),sol.
numVecs);
 
 1013       std::vector<MagnitudeType> vals(sol.
numVecs);
 
 1016       std::vector<int> which = ordertest->whichVecs();
 
 1020       std::vector<int> inlocked(0), insolver(0);
 
 1021       for (
unsigned int i=0; i<which.size(); i++) {
 
 1022         if (which[i] >= 0) {
 
 1023           TEUCHOS_TEST_FOR_EXCEPTION(which[i] >= blockSize_,std::logic_error,
"Anasazi::TraceMinBaseSolMgr::solve(): positive indexing mistake from ordertest.");
 
 1024           insolver.push_back(which[i]);
 
 1028           TEUCHOS_TEST_FOR_EXCEPTION(which[i] < -curNumLocked,std::logic_error,
"Anasazi::TraceMinBaseSolMgr::solve(): negative indexing mistake from ordertest.");
 
 1029           inlocked.push_back(which[i] + curNumLocked);
 
 1033       TEUCHOS_TEST_FOR_EXCEPTION(insolver.size() + inlocked.size() != (
unsigned int)sol.
numVecs,std::logic_error,
"Anasazi::TraceMinBaseSolMgr::solve(): indexing mistake.");
 
 1036       if (insolver.size() > 0) {
 
 1038         int lclnum = insolver.size();
 
 1039         std::vector<int> tosol(lclnum);
 
 1040         for (
int i=0; i<lclnum; i++) tosol[i] = i;
 
 1041         RCP<const MV> v = MVT::CloneView(*tm_solver->getRitzVectors(),insolver);
 
 1042         MVT::SetBlock(*v,tosol,*sol.
Evecs);
 
 1044         std::vector<Value<ScalarType> > fromsolver = tm_solver->getRitzValues();
 
 1045         for (
unsigned int i=0; i<insolver.size(); i++) {
 
 1046           vals[i] = fromsolver[insolver[i]].realpart;
 
 1051       if (inlocked.size() > 0) {
 
 1052         int solnum = insolver.size();
 
 1054         int lclnum = inlocked.size();
 
 1055         std::vector<int> tosol(lclnum);
 
 1056         for (
int i=0; i<lclnum; i++) tosol[i] = solnum + i;
 
 1058         MVT::SetBlock(*v,tosol,*sol.
Evecs);
 
 1060         for (
unsigned int i=0; i<inlocked.size(); i++) {
 
 1061           vals[i+solnum] = lockvals[inlocked[i]];
 
 1069         for(
size_t i=0; i<vals.size(); i++)
 
 1070           vals[i] = ONE/vals[i];
 
 1075         std::vector<int> order(sol.
numVecs);
 
 1076         sorter->sort(vals,Teuchos::rcpFromRef(order),sol.
numVecs);
 
 1078         for (
int i=0; i<sol.
numVecs; i++) {
 
 1079           sol.
Evals[i].realpart = vals[i];
 
 1080           sol.
Evals[i].imagpart = MT::zero();
 
 1092   tm_solver->currentStatus(printer_->stream(
FinalSummary));
 
 1097 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 
 1103   problem_->setSolution(sol);
 
 1104   printer_->stream(
Debug) << 
"Returning " << sol.
numVecs << 
" eigenpairs to eigenproblem." << std::endl;
 
 1107   numIters_ = tm_solver->getNumIters();
 
 1116 template <
class ScalarType, 
class MV, 
class OP>
 
 1121   globalTest_ = global;
 
 1124 template <
class ScalarType, 
class MV, 
class OP>
 
 1131 template <
class ScalarType, 
class MV, 
class OP>
 
 1139 template <
class ScalarType, 
class MV, 
class OP>
 
 1146 template <
class ScalarType, 
class MV, 
class OP>
 
 1151   lockingTest_ = locking;
 
 1154 template <
class ScalarType, 
class MV, 
class OP>
 
 1158   return lockingTest_;
 
 1161 template <
class ScalarType, 
class MV, 
class OP>
 
 1167   newState.
curDim = indToCopy.size();
 
 1168   std::vector<int> fullIndices(oldState.
curDim);
 
 1169   for(
int i=0; i<oldState.
curDim; i++) fullIndices[i] = i;
 
 1177   std::vector<int> oldIndices;
 
 1178   std::vector<int> newIndices;
 
 1179   for(
int i=0; i<newState.
curDim; i++)
 
 1181     if(indToCopy[i] < blockSize_)
 
 1182       oldIndices.push_back(indToCopy[i]);
 
 1184       newIndices.push_back(indToCopy[i]);
 
 1187   int olddim = oldIndices.size();
 
 1188   int newdim = newIndices.size();
 
 1193     newState.
V  = MVT::CloneView(*oldState.
X, indToCopy);
 
 1194     newState.
R  = MVT::CloneView(*oldState.
R, indToCopy);
 
 1195     newState.
X = newState.
V;
 
 1197     if(problem_->getOperator() != Teuchos::null)
 
 1199       newState.
KV = MVT::CloneView(*oldState.
KX, indToCopy);
 
 1200       newState.
KX = newState.
KV;
 
 1204       newState.
KV = Teuchos::null;
 
 1205       newState.
KX = Teuchos::null;
 
 1208     if(problem_->getM() != Teuchos::null)
 
 1210       newState.
MopV = MVT::CloneView(*oldState.
MX, indToCopy);
 
 1211       newState.
MX = newState.
MopV;
 
 1215       newState.
MopV = Teuchos::null;
 
 1216       newState.
MX = Teuchos::null;
 
 1219   else if(newdim == 0)
 
 1221     std::vector<int> blockind(blockSize_);
 
 1222     for(
int i=0; i<blockSize_; i++)
 
 1226     newState.
V  = MVT::CloneView(*oldState.
X, blockind);
 
 1227     newState.
KV = MVT::CloneView(*oldState.
KX, blockind);
 
 1228     newState.
R  = MVT::CloneView(*oldState.
R, blockind);
 
 1229     newState.
X = MVT::CloneView(*newState.
V, blockind);
 
 1230     newState.
KX = MVT::CloneView(*newState.
KV, blockind);
 
 1232     if(problem_->getM() != Teuchos::null)
 
 1234       newState.
MopV = MVT::CloneView(*oldState.
MX, blockind);
 
 1235       newState.
MX = MVT::CloneView(*newState.
MopV, blockind);
 
 1239       newState.
MopV = Teuchos::null;
 
 1240       newState.
MX = Teuchos::null;
 
 1246     std::vector<int> oldPart(olddim);
 
 1247     for(
int i=0; i<olddim; i++) oldPart[i] = i;
 
 1248     std::vector<int> newPart(newdim);
 
 1249     for(
int i=0; i<newdim; i++) newPart[i] = olddim+i;
 
 1253     RCP<MV> oldHelper = MVT::CloneViewNonConst(*helper,oldPart);
 
 1254     RCP<MV> newHelper = MVT::CloneViewNonConst(*helper,newPart);
 
 1259     for(
int r=0; r<oldState.
curDim; r++)
 
 1261       for(
int c=0; c<newdim; c++)
 
 1262         newRV(r,c) = (*oldState.
RV)(r,newIndices[c]);
 
 1266     viewHelper = MVT::CloneView(*oldState.
V,fullIndices);
 
 1267     MVT::MvTimesMatAddMv(ONE,*viewHelper,newRV,ZERO,*newHelper);
 
 1268     viewHelper = MVT::CloneView(*oldState.
X,oldIndices);
 
 1269     MVT::Assign(*viewHelper,*oldHelper);
 
 1270     newState.
V = MVT::CloneCopy(*helper);
 
 1273     viewHelper = MVT::CloneView(*oldState.
KV,fullIndices);
 
 1274     MVT::MvTimesMatAddMv(ONE,*viewHelper,newRV,ZERO,*newHelper);
 
 1275     viewHelper = MVT::CloneView(*oldState.
KX,oldIndices);
 
 1276     MVT::Assign(*viewHelper,*oldHelper);
 
 1277     newState.
KV = MVT::CloneCopy(*helper);
 
 1280     if(problem_->getM() != Teuchos::null)
 
 1282       viewHelper = MVT::CloneView(*oldState.
MopV,fullIndices);
 
 1283       MVT::MvTimesMatAddMv(ONE,*viewHelper,newRV,ZERO,*newHelper);
 
 1284       viewHelper = MVT::CloneView(*oldState.
MX,oldIndices);
 
 1285       MVT::Assign(*viewHelper,*oldHelper);
 
 1286       newState.
MopV = MVT::CloneCopy(*helper);
 
 1289       newState.
MopV = newState.
V;
 
 1292     std::vector<int> blockVec(blockSize_);
 
 1293     for(
int i=0; i<blockSize_; i++) blockVec[i] = i;
 
 1294     newState.
X = MVT::CloneView(*newState.
V,blockVec);
 
 1295     newState.
KX = MVT::CloneView(*newState.
KV,blockVec);
 
 1296     newState.
MX = MVT::CloneView(*newState.
MopV,blockVec);
 
 1299     if(blockSize_-oldIndices.size() > 0)
 
 1302       newPart.resize(blockSize_-oldIndices.size());
 
 1303       helper = MVT::Clone(*oldState.
V,blockSize_);
 
 1304       oldHelper = MVT::CloneViewNonConst(*helper,oldPart);
 
 1305       newHelper = MVT::CloneViewNonConst(*helper,newPart);
 
 1307       RCP<MV> scaledMV = MVT::CloneCopy(*newState.
MX,newPart);
 
 1309       std::vector<ScalarType> scalarVec(blockSize_-oldIndices.size());
 
 1310       for(
unsigned int i=0; i<(
unsigned int)blockSize_-oldIndices.size(); i++) scalarVec[i] = (*oldState.
T)[newPart[i]];
 
 1311       MVT::MvScale(*scaledMV,scalarVec);
 
 1313       helper = MVT::Clone(*oldState.
V,blockSize_);
 
 1314       oldHelper = MVT::CloneViewNonConst(*helper,oldPart);
 
 1315       newHelper = MVT::CloneViewNonConst(*helper,newPart);
 
 1316       MVT::MvAddMv(ONE,*localKV,-ONE,*scaledMV,*newHelper);
 
 1317       viewHelper = MVT::CloneView(*oldState.
R,oldIndices);
 
 1318       MVT::Assign(*viewHelper,*oldHelper);
 
 1319       newState.
R = MVT::CloneCopy(*helper);
 
 1322       newState.
R = oldState.
R;
 
 1330   for(
int i=0; i<newState.
curDim; i++) (*helperT)[i] = (*oldState.
T)[indToCopy[i]];
 
 1331   newState.
T  = helperT;
 
 1335   for(
int i=0; i<newState.
curDim; i++)
 
 1336     (*newKK)(i,i) = (*newState.
T)[i];
 
 1337   newState.
KK = newKK;
 
 1341   for(
int i=0; i<newState.
curDim; i++)
 
 1342     (*newRV)(i,i) = ONE;
 
 1343   newState.
RV = newRV;
 
 1347   for(
int i=0; i<blockSize_; i++) 
 
 1349     if(indToCopy[i] < blockSize_)
 
 1350       (*helperRS)[i] = (*oldState.
ritzShifts)[indToCopy[i]];
 
 1352       (*helperRS)[i] = ZERO;
 
 1358 template <
class ScalarType, 
class MV, 
class OP>
 
 1361   pl.
set(
"Block Size", blockSize_);
 
 1362   pl.
set(
"Num Blocks", numBlocks_);
 
 1363   pl.
set(
"Num Restart Blocks", numRestartBlocks_);
 
 1364   pl.
set(
"When To Shift", whenToShift_);
 
 1365   pl.
set(
"Trace Threshold", traceThresh_);
 
 1366   pl.
set(
"Shift Tolerance", shiftTol_);
 
 1367   pl.
set(
"Relative Shift Tolerance", relShiftTol_);
 
 1368   pl.
set(
"Shift Norm", shiftNorm_);
 
 1369   pl.
set(
"How To Choose Shift", howToShift_);
 
 1370   pl.
set(
"Consider Clusters", considerClusters_);
 
 1371   pl.
set(
"Use Multiple Shifts", useMultipleShifts_);
 
 1372   pl.
set(
"Saddle Solver Type", saddleSolType_);
 
 1373   pl.
set(
"Project All Vectors", projectAllVecs_);
 
 1374   pl.
set(
"Project Locked Vectors", projectLockedVecs_);
 
 1375   pl.
set(
"Compute All Residuals", computeAllRes_);
 
 1376   pl.
set(
"Use Residual as RHS", useRHSR_);
 
 1377   pl.
set(
"Use Harmonic Ritz Values", useHarmonic_);
 
 1378   pl.
set(
"Maximum Krylov Iterations", maxKrylovIter_);
 
 1379   pl.
set(
"HSS: alpha", alpha_);
 
 1383 template <
class ScalarType, 
class MV, 
class OP>
 
 1384 void TraceMinBaseSolMgr<ScalarType,MV,OP>::printParameters(std::ostream &os)
 const 
 1387   os << 
"========================================\n";
 
 1388   os << 
"========= TraceMin parameters ==========\n";
 
 1389   os << 
"========================================\n";
 
 1390   os << 
"=========== Block parameters ===========\n";
 
 1391   os << 
"Block Size: " << blockSize_ << std::endl;
 
 1392   os << 
"Num Blocks: " << numBlocks_ << std::endl;
 
 1393   os << 
"Num Restart Blocks: " << numRestartBlocks_ << std::endl;
 
 1394   os << 
"======== Convergence parameters ========\n";
 
 1395   os << 
"Convergence Tolerance: " << convTol_ << std::endl;
 
 1396   os << 
"Relative Convergence Tolerance: " << relConvTol_ << std::endl;
 
 1397   os << 
"========== Locking parameters ==========\n";
 
 1398   os << 
"Use Locking: " << useLocking_ << std::endl;
 
 1399   os << 
"Locking Tolerance: " << lockTol_ << std::endl;
 
 1400   os << 
"Relative Locking Tolerance: " << relLockTol_ << std::endl;
 
 1401   os << 
"Max Locked: " << maxLocked_ << std::endl;
 
 1402   os << 
"Locking Quorum: " << lockQuorum_ << std::endl;
 
 1403   os << 
"========== Shifting parameters =========\n";
 
 1404   os << 
"When To Shift: ";
 
 1405   if(whenToShift_ == NEVER_SHIFT) os << 
"Never\n";
 
 1406   else if(whenToShift_ == SHIFT_WHEN_TRACE_LEVELS) os << 
"After Trace Levels\n";
 
 1407   else if(whenToShift_ == SHIFT_WHEN_RESID_SMALL) os << 
"Residual Becomes Small\n";
 
 1408   else if(whenToShift_ == ALWAYS_SHIFT) os << 
"Always\n";
 
 1409   os << 
"Consider Clusters: " << considerClusters_ << std::endl;
 
 1410   os << 
"Trace Threshohld: " << traceThresh_ << std::endl;
 
 1411   os << 
"Shift Tolerance: " << shiftTol_ << std::endl;
 
 1412   os << 
"Relative Shift Tolerance: " << relShiftTol_ << std::endl;
 
 1413   os << 
"How To Choose Shift: ";
 
 1414   if(howToShift_ == LARGEST_CONVERGED_SHIFT) os << 
"Largest Converged\n";
 
 1415   else if(howToShift_ == ADJUSTED_RITZ_SHIFT) os << 
"Adjusted Ritz Values\n";
 
 1416   else if(howToShift_ == RITZ_VALUES_SHIFT) os << 
"Ritz Values\n";
 
 1417   os << 
"Use Multiple Shifts: " << useMultipleShifts_ << std::endl;
 
 1418   os << 
"=========== Other parameters ===========\n";
 
 1419   os << 
"Orthogonalization: " << ortho_ << std::endl;
 
 1420   os << 
"Saddle Solver Type: ";
 
 1421   if(saddleSolType_ == PROJECTED_KRYLOV_SOLVER) os << 
"Projected Krylov\n";
 
 1422   else if(saddleSolType_ == SCHUR_COMPLEMENT_SOLVER) os << 
"Schur Complement\n";
 
 1423   os << 
"Project All Vectors: " << projectAllVecs_ << std::endl;
 
 1424   os << 
"Project Locked Vectors: " << projectLockedVecs_ << std::endl;
 
 1425   os << 
"Compute All Residuals: " << computeAllRes_ << std::endl;
 
 1426   os << 
"========================================\n\n\n";
 
Pure virtual base class which describes the basic interface for a solver manager. ...
 
std::vector< Value< ScalarType > > Evals
The computed eigenvalues. 
 
const RCP< StatusTest< ScalarType, MV, OP > > & getLockingStatusTest() const 
Get the status test defining locking. 
 
Abstract base class for trace minimization eigensolvers. 
 
int NEV
Number of unconverged eigenvalues. 
 
TraceMinBaseSolMgr(const RCP< Eigenproblem< ScalarType, MV, OP > > &problem, Teuchos::ParameterList &pl)
Basic constructor for TraceMinBaseSolMgr. 
 
ResType
Enumerated type used to specify which residual norm used by residual norm status tests. 
 
RCP< const MV > X
The current eigenvectors. 
 
A special StatusTest for printing other status tests. 
 
int getNumIters() const 
Get the iteration count for the most recent call to solve(). 
 
const RCP< StatusTest< ScalarType, MV, OP > > & getDebugStatusTest() const 
Get the status test for debugging. 
 
This class defines the interface required by an eigensolver and status test class to compute solution...
 
Structure to contain pointers to TraceMinBase state variables. 
 
An implementation of the Anasazi::SortManager that performs a collection of common sorting techniques...
 
RCP< const MV > V
The current basis. 
 
basic_FancyOStream & setShowProcRank(const bool showProcRank)
 
T & get(const std::string &name, T def_value)
 
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
 
RCP< const MV > MopV
The image of V under M, or Teuchos::null if M was not specified. 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
Virtual base class which defines basic traits for the operator type. 
 
Teuchos::RCP< MV > Evecs
The computed eigenvectors. 
 
An implementation of the Anasazi::GenOrthoManager that performs orthogonalization using iterated clas...
 
Status test for forming logical combinations of other status tests. 
 
The Anasazi::SolverManager is a templated virtual base class that defines the basic interface that an...
 
void setGlobalStatusTest(const RCP< StatusTest< ScalarType, MV, OP > > &global)
Set the status test defining global convergence. 
 
Basic implementation of the Anasazi::SortManager class. 
 
An implementation of the Anasazi::MatOrthoManager that performs orthogonalization using the SVQB iter...
 
An exception class parent to all Anasazi exceptions. 
 
Output managers remove the need for the eigensolver to know any information about the required output...
 
bool isOrtho
Whether V has been projected and orthonormalized already. 
 
A status test for testing the norm of the eigenvectors residuals along with a set of auxiliary eigenv...
 
Anasazi's templated, static class providing utilities for the solvers. 
 
ReturnType solve()
This method performs possibly repeated calls to the underlying eigensolver's iterate() routine until ...
 
bool isParameter(const std::string &name) const 
 
int numVecs
The number of computed eigenpairs. 
 
Anasazi's templated virtual class for providing routines for orthogonalization and orthonormalization...
 
Teuchos::RCP< MV > Espace
An orthonormal basis for the computed eigenspace. 
 
Abstract class definition for Anasazi Output Managers. 
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
Abstract base class which defines the interface required by an eigensolver and status test class to c...
 
static void summarize(Ptr< const Comm< int > > comm, std::ostream &out=std::cout, const bool alwaysWriteLocal=false, const bool writeGlobalStats=true, const bool writeZeroTimers=true, const ECounterSetOp setOp=Intersection, const std::string &filter="", const bool ignoreZeroTimers=false)
 
static magnitudeType prec()
 
ReturnType
Enumerated type used to pass back information from a solver manager. 
 
Output managers remove the need for the eigensolver to know any information about the required output...
 
Teuchos::Array< RCP< Teuchos::Time > > getTimers() const 
Return the timers for this object. 
 
A status test for testing the norm of the eigenvectors residuals. 
 
Traits class which defines basic operations on multivectors. 
 
std::vector< int > index
An index into Evecs to allow compressed storage of eigenvectors for real, non-Hermitian problems...
 
int curDim
The current dimension of the solver. 
 
RCP< const MV > KV
The image of V under K. 
 
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
 
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
 
Orthogonalization manager based on the SVQB technique described in "A Block Orthogonalization Procedu...
 
Struct for storing an eigenproblem solution. 
 
RCP< const MV > MX
The image of the current eigenvectors under M, or Teuchos::null if M was not specified. 
 
The Anasazi::TraceMinBaseSolMgr provides an abstract base class for the TraceMin series of solver man...
 
RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > RV
The current Ritz vectors. 
 
ScalarType largestSafeShift
Largest safe shift. 
 
RCP< const std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > > T
The current Ritz values. This vector is a copy of the internal data. 
 
RCP< const std::vector< ScalarType > > ritzShifts
Current Ritz shifts. 
 
void push_back(const value_type &x)
 
virtual ~TraceMinBaseSolMgr()
Destructor. 
 
Special StatusTest for printing status tests. 
 
A status test for testing the norm of the eigenvectors residuals along with a set of auxiliary eigenv...
 
RCP< const MV > KX
The image of the current eigenvectors under K. 
 
RCP< const MV > R
The current residual vectors. 
 
RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > KK
The current projected K matrix. 
 
void setLockingStatusTest(const RCP< StatusTest< ScalarType, MV, OP > > &locking)
Set the status test defining locking. 
 
Status test for forming logical combinations of other status tests. 
 
An implementation of the Anasazi::MatOrthoManager that performs orthogonalization using (potentially)...
 
Types and exceptions used within Anasazi solvers and interfaces. 
 
Abstract class definition for Anasazi output stream. 
 
This is an abstract base class for the trace minimization eigensolvers. 
 
void setDebugStatusTest(const RCP< StatusTest< ScalarType, MV, OP > > &debug)
Set the status test for debugging. 
 
Anasazi's templated pure virtual class for managing the sorting of approximate eigenvalues computed b...
 
Common interface of stopping criteria for Anasazi's solvers. 
 
A status test for testing the norm of the eigenvectors residuals. 
 
Basic implementation of the Anasazi::OrthoManager class. 
 
const Eigenproblem< ScalarType, MV, OP > & getProblem() const 
Return the eigenvalue problem. 
 
Basic implementation of the Anasazi::OrthoManager class. 
 
Class which provides internal utilities for the Anasazi solvers. 
 
const RCP< StatusTest< ScalarType, MV, OP > > & getGlobalStatusTest() const 
Get the status test defining global convergence.