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.