131 typedef Teuchos::ScalarTraits<ScalarType>
SCT;
149 Teuchos::ParameterList ¶ms );
263 if (!initialized_)
return 0;
296 TEUCHOS_TEST_FOR_EXCEPTION(blockSize!=1,std::invalid_argument,
"Belos::GCRODRIter::setBlockSize(): Cannot use a block size that is not one.");
300 void setSize(
int recycledBlocks,
int numBlocks ) {
302 if ( (recycledBlocks_ != recycledBlocks) || (numBlocks_ != numBlocks) ) {
303 recycledBlocks_ = recycledBlocks;
304 numBlocks_ = numBlocks;
305 cs_.sizeUninitialized( numBlocks_+1 );
306 sn_.sizeUninitialized( numBlocks_+1 );
307 z_.sizeUninitialized( numBlocks_+1 );
308 R_.shapeUninitialized( numBlocks_+1,numBlocks );
326 const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > lp_;
327 const Teuchos::RCP<OutputManager<ScalarType> > om_;
328 const Teuchos::RCP<StatusTest<ScalarType,MV,OP> > stest_;
329 const Teuchos::RCP<OrthoManager<ScalarType,MV> > ortho_;
341 Teuchos::SerialDenseVector<int,ScalarType> sn_;
342 Teuchos::SerialDenseVector<int,MagnitudeType> cs_;
362 Teuchos::RCP<MV> U_, C_;
366 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > H_;
369 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > B_;
374 Teuchos::SerialDenseMatrix<int,ScalarType> R_;
375 Teuchos::SerialDenseVector<int,ScalarType> z_;
385 Teuchos::ParameterList ¶ms ):
386 lp_(problem), om_(printer), stest_(tester), ortho_(ortho) {
389 initialized_ =
false;
399 TEUCHOS_TEST_FOR_EXCEPTION(!params.isParameter(
"Num Blocks"), std::invalid_argument,
"Belos::GCRODRIter::constructor: mandatory parameter \"Num Blocks\" is not specified.");
400 int nb = Teuchos::getParameter<int>(params,
"Num Blocks");
402 TEUCHOS_TEST_FOR_EXCEPTION(!params.isParameter(
"Recycled Blocks"), std::invalid_argument,
"Belos::GCRODRIter::constructor: mandatory parameter \"Recycled Blocks\" is not specified.");
403 int rb = Teuchos::getParameter<int>(params,
"Recycled Blocks");
405 TEUCHOS_TEST_FOR_EXCEPTION(nb <= 0, std::invalid_argument,
"Belos::GCRODRIter() was passed a non-positive argument for \"Num Blocks\".");
406 TEUCHOS_TEST_FOR_EXCEPTION(rb >= nb, std::invalid_argument,
"Belos::GCRODRIter() the number of recycled blocks is larger than the allowable subspace.");
409 recycledBlocks_ = rb;
411 cs_.sizeUninitialized( numBlocks_+1 );
412 sn_.sizeUninitialized( numBlocks_+1 );
413 z_.sizeUninitialized( numBlocks_+1 );
414 R_.shapeUninitialized( numBlocks_+1,numBlocks_ );
426 Teuchos::RCP<MV> currentUpdate = Teuchos::null;
428 return currentUpdate;
430 const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one();
431 const ScalarType zero = Teuchos::ScalarTraits<ScalarType>::zero();
432 Teuchos::BLAS<int,ScalarType> blas;
437 Teuchos::SerialDenseMatrix<int,ScalarType> y( Teuchos::Copy, z_, curDim_, 1 );
441 blas.TRSM( Teuchos::LEFT_SIDE, Teuchos::UPPER_TRI, Teuchos::NO_TRANS,
442 Teuchos::NON_UNIT_DIAG, curDim_, 1, one,
443 R_.values(), R_.stride(), y.values(), y.stride() );
447 std::vector<int> index(curDim_);
448 for (
int i=0; i<curDim_; i++ ) index[i] = i;
454 if (U_ != Teuchos::null) {
455 Teuchos::SerialDenseMatrix<int,ScalarType> z(recycledBlocks_,1);
456 Teuchos::SerialDenseMatrix<int,ScalarType> subB( Teuchos::View, *B_, recycledBlocks_, curDim_ );
457 z.multiply( Teuchos::NO_TRANS, Teuchos::NO_TRANS, one, subB, y, zero );
461 return currentUpdate;
514 TEUCHOS_TEST_FOR_EXCEPTION( initialized_ ==
false,
GCRODRIterInitFailure,
"Belos::GCRODRIter::iterate(): GCRODRIter class not initialized." );
517 setSize( recycledBlocks_, numBlocks_ );
519 Teuchos::RCP<MV> Vnext;
520 Teuchos::RCP<const MV> Vprev;
521 std::vector<int> curind(1);
531 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > z0 =
532 Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(1,1) );
533 int rank = ortho_->normalize( *Vnext, z0 );
534 TEUCHOS_TEST_FOR_EXCEPTION(rank != 1,
GCRODRIterOrthoFailure,
"Belos::GCRODRIter::iterate(): couldn't generate basis of full rank.");
538 std::vector<int> prevind(numBlocks_+1);
545 if (U_ == Teuchos::null) {
546 while (stest_->checkStatus(
this) !=
Passed && curDim_+1 <= numBlocks_) {
548 int lclDim = curDim_ + 1;
559 lp_->apply(*Vprev,*Vnext);
564 prevind.resize(lclDim);
565 for (
int i=0; i<lclDim; i++) { prevind[i] = i; }
567 Teuchos::Array<Teuchos::RCP<const MV> > AVprev(1, Vprev);
570 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
571 subH = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType> ( Teuchos::View,*H_,lclDim,1,0,curDim_ ) );
572 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > > AsubH;
573 AsubH.append( subH );
576 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
577 subR = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType> ( Teuchos::View,*H_,1,1,lclDim,curDim_ ) );
580 rank = ortho_->projectAndNormalize(*Vnext,AsubH,subR,AVprev);
583 Teuchos::SerialDenseMatrix<int,ScalarType> subR2( Teuchos::View,R_,lclDim+1,1,0,curDim_ );
584 Teuchos::SerialDenseMatrix<int,ScalarType> subH2( Teuchos::View,*H_,lclDim+1,1,0,curDim_ );
587 TEUCHOS_TEST_FOR_EXCEPTION(rank != 1,
GCRODRIterOrthoFailure,
"Belos::GCRODRIter::iterate(): couldn't generate basis of full rank.");
597 while (stest_->checkStatus(
this) !=
Passed && curDim_+1 <= numBlocks_) {
599 int lclDim = curDim_ + 1;
611 lp_->apply(*Vprev,*Vnext);
612 Vprev = Teuchos::null;
615 Teuchos::Array<Teuchos::RCP<const MV> > C(1, C_);
616 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
617 subB = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType> ( Teuchos::View,*B_,recycledBlocks_,1,0,curDim_ ) );
618 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > > AsubB;
619 AsubB.append( subB );
622 ortho_->project( *Vnext, AsubB, C );
626 prevind.resize(lclDim);
627 for (
int i=0; i<lclDim; i++) { prevind[i] = i; }
629 Teuchos::Array<Teuchos::RCP<const MV> > AVprev(1, Vprev);
632 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > subH = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType> ( Teuchos::View,*H_,lclDim,1,0,curDim_ ) );
633 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > > AsubH;
634 AsubH.append( subH );
637 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > subR = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType> ( Teuchos::View,*H_,1,1,lclDim,curDim_ ) );
640 rank = ortho_->projectAndNormalize(*Vnext,AsubH,subR,AVprev);
643 Teuchos::SerialDenseMatrix<int,ScalarType> subR2( Teuchos::View,R_,lclDim+1,1,0,curDim_ );
644 Teuchos::SerialDenseMatrix<int,ScalarType> subH2( Teuchos::View,*H_,lclDim+1,1,0,curDim_ );
647 TEUCHOS_TEST_FOR_EXCEPTION(rank != 1,
GCRODRIterOrthoFailure,
"Belos::GCRODRIter::iterate(): couldn't generate basis of full rank.");
665 const ScalarType zero = Teuchos::ScalarTraits<ScalarType>::zero();
670 int curDim = curDim_;
674 Teuchos::BLAS<int, ScalarType> blas;
681 for (i=0; i<curDim; i++) {
685 blas.ROT( 1, &R_(i,curDim), 1, &R_(i+1, curDim), 1, &cs_[i], &sn_[i] );
690 blas.ROTG( &R_(curDim,curDim), &R_(curDim+1,curDim), &cs_[curDim], &sn_[curDim] );
691 R_(curDim+1,curDim) = zero;
695 blas.ROT( 1, &z_(curDim), 1, &z_(curDim+1), 1, &cs_[curDim], &sn_[curDim] );
GCRODRIter(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< OutputManager< ScalarType > > &printer, const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &tester, const Teuchos::RCP< MatOrthoManager< ScalarType, MV, OP > > &ortho, Teuchos::ParameterList ¶ms)
GCRODRIter constructor with linear problem, solver utilities, and parameter list of solver options.