void TFQMRIter<ScalarType,MV,OP>::initializeTFQMR(const TFQMRIterState<ScalarType,MV> & newstate) { // Initialize the state storage if it isn't already. if (!stateStorageInitialized_) setStateSize(); TEUCHOS_TEST_FOR_EXCEPTION(!stateStorageInitialized_,std::invalid_argument, "Belos::TFQMRIter::initialize(): Cannot initialize state storage!"); // NOTE: In TFQMRIter R_, the initial residual, is required!!! // std::string errstr("Belos::TFQMRIter::initialize(): Specified multivectors must have a consistent length and width."); // Create convenience variables for zero and one. const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one(); const ScalarType STzero = Teuchos::ScalarTraits<ScalarType>::zero(); const MagnitudeType MTzero = Teuchos::ScalarTraits<MagnitudeType>::zero(); if (newstate.R != Teuchos::null) { TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.R) != MVT::GetGlobalLength(*R_), std::invalid_argument, errstr ); TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.R) != 1, std::invalid_argument, errstr ); // Copy basis vectors from newstate into V if (newstate.R != R_) { // copy over the initial residual (unpreconditioned). MVT::MvAddMv( one, *newstate.R, STzero, *newstate.R, *R_ ); } // Compute initial vectors // Initially, they are set to the preconditioned residuals // W_ = MVT::CloneCopy( *R_ ); U_ = MVT::CloneCopy( *R_ ); Rtilde_ = MVT::CloneCopy( *R_ ); MVT::MvInit( *D_ ); MVT::MvInit( *solnUpdate_ ); // Multiply the current residual by Op and store in V_ // V_ = Op * R_ // lp_->apply( *U_, *V_ ); AU_ = MVT::CloneCopy( *V_ ); // // Compute initial scalars: theta, eta, tau, rho_old // theta_[0] = MTzero; MVT::MvNorm( *R_, tau_ ); // tau = ||r_0|| MVT::MvDot( *R_, *Rtilde_, rho_old_ ); // rho = (r_tilde, r0) } else { TEUCHOS_TEST_FOR_EXCEPTION(newstate.R == Teuchos::null,std::invalid_argument, "Belos::TFQMRIter::initialize(): TFQMRIterState does not have initial residual."); } // The solver is initialized initialized_ = true; }
void BlockCGIter<ScalarType,MV,OP>::initializeCG(CGIterationState<ScalarType,MV> newstate) { // Initialize the state storage if it isn't already. if (!stateStorageInitialized_) setStateSize(); TEUCHOS_TEST_FOR_EXCEPTION(!stateStorageInitialized_,std::invalid_argument, "Belos::BlockCGIter::initialize(): Cannot initialize state storage!"); // NOTE: In BlockCGIter R_, the initial residual, is required!!! // std::string errstr("Belos::BlockCGIter::initialize(): Specified multivectors must have a consistent length and width."); // Create convenience variables for zero and one. const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one(); const MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); if (newstate.R != Teuchos::null) { TEUCHOS_TEST_FOR_EXCEPTION( MVText::GetGlobalLength(*newstate.R) != MVText::GetGlobalLength(*R_), std::invalid_argument, errstr ); TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.R) != blockSize_, std::invalid_argument, errstr ); // Copy basis vectors from newstate into V if (newstate.R != R_) { // copy over the initial residual (unpreconditioned). MVT::MvAddMv( one, *newstate.R, zero, *newstate.R, *R_ ); } // Compute initial direction vectors // Initially, they are set to the preconditioned residuals // if ( lp_->getLeftPrec() != Teuchos::null ) { lp_->applyLeftPrec( *R_, *Z_ ); if ( lp_->getRightPrec() != Teuchos::null ) { Teuchos::RCP<MV> tmp = MVT::Clone( *Z_, blockSize_ ); lp_->applyRightPrec( *Z_, *tmp ); Z_ = tmp; } } else if ( lp_->getRightPrec() != Teuchos::null ) { lp_->applyRightPrec( *R_, *Z_ ); } else { Z_ = R_; } MVT::MvAddMv( one, *Z_, zero, *Z_, *P_ ); } else { TEUCHOS_TEST_FOR_EXCEPTION(newstate.R == Teuchos::null,std::invalid_argument, "Belos::BlockCGIter::initialize(): BlockCGStateIterState does not have initial residual."); } // The solver is initialized initialized_ = true; }
void FixedPointIter<ScalarType,MV,OP>::initializeFixedPoint(FixedPointIterationState<ScalarType,MV>& newstate) { // Initialize the state storage if it isn't already. if (!stateStorageInitialized_) setStateSize(); TEUCHOS_TEST_FOR_EXCEPTION(!stateStorageInitialized_,std::invalid_argument, "Belos::FixedPointIter::initialize(): Cannot initialize state storage!"); // NOTE: In FixedPointIter R_, the initial residual, is required!!! // std::string errstr("Belos::FixedPointIter::initialize(): Specified multivectors must have a consistent length and width."); // Create convenience variables for zero and one. const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one(); const ScalarType zero = Teuchos::ScalarTraits<ScalarType>::zero(); if (newstate.R != Teuchos::null) { TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*R_) != MVT::GetNumberVecs(*newstate.R), std::invalid_argument, errstr ); TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.R) != MVT::GetGlobalLength(*R_), std::invalid_argument, errstr ); TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.R) != numRHS_, std::invalid_argument, errstr ); // Copy basis vectors from newstate into V if (newstate.R != R_) { // copy over the initial residual (unpreconditioned). MVT::MvAddMv( one, *newstate.R, zero, *newstate.R, *R_ ); } } else { TEUCHOS_TEST_FOR_EXCEPTION(newstate.R == Teuchos::null,std::invalid_argument, "Belos::FixedPointIter::initialize(): FixedPointIterationState does not have initial residual."); } TEUCHOS_TEST_FOR_EXCEPTION(!lp_->getRightPrec().is_null(),std::invalid_argument, "Belos::FixedPointIter::initialize(): Does not work with right preconditioning"); // The solver is initialized initialized_ = true; }
void BlockCGIter<ScalarType,MV,OP>::setBlockSize (int blockSize) { // This routine only allocates space; it doesn't not perform any computation // any change in size will invalidate the state of the solver. TEUCHOS_TEST_FOR_EXCEPTION(blockSize <= 0, std::invalid_argument, "Belos::BlockGmresIter::setBlockSize was passed a non-positive argument."); if (blockSize == blockSize_) { // do nothing return; } if (blockSize!=blockSize_) stateStorageInitialized_ = false; blockSize_ = blockSize; initialized_ = false; // Use the current blockSize_ to initialize the state storage. setStateSize(); }
void FixedPointIter<ScalarType,MV,OP>::setBlockSize(int blockSize) { // This routine only allocates space; it doesn't not perform any computation // any change in size will invalidate the state of the solver. TEUCHOS_TEST_FOR_EXCEPTION(blockSize != MVT::GetNumberVecs(*lp_->getCurrRHSVec()), std::invalid_argument, "Belos::FixedPointIter::setBlockSize size must match # RHS."); TEUCHOS_TEST_FOR_EXCEPTION(blockSize <= 0, std::invalid_argument, "Belos::FixedPointIter::setBlockSize was passed a non-positive argument."); if (blockSize == numRHS_) { // do nothing return; } if (blockSize!=numRHS_) stateStorageInitialized_ = false; numRHS_ = blockSize; initialized_ = false; // Use the current blockSize_ to initialize the state storage. setStateSize(); }
void MinresIter<ScalarType,MV,OP>::initializeMinres(const MinresIterationState<ScalarType,MV> & newstate) { // Initialize the state storage if it isn't already. if (!stateStorageInitialized_) setStateSize(); TEUCHOS_TEST_FOR_EXCEPTION( !stateStorageInitialized_, std::invalid_argument, "Belos::MinresIter::initialize(): Cannot initialize state storage!" ); TEUCHOS_TEST_FOR_EXCEPTION( newstate.Y == Teuchos::null, std::invalid_argument, "Belos::MinresIter::initialize(): MinresIterationState does not have initial residual."); std::string errstr("Belos::MinresIter::initialize(): Specified multivectors must have a consistent length and width."); TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.Y) != MVT::GetGlobalLength(*Y_), std::invalid_argument, errstr ); TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.Y) != 1, std::invalid_argument, errstr ); // Create convenience variables for zero, one. const ScalarType one = SCT::one(); const MagnitudeType zero = SMT::zero(); // Set up y and v for the first Lanczos vector v_1. // y = beta1_ P' v1, where P = C**(-1). // v is really P' v1. MVT::MvAddMv( one, *newstate.Y, zero, *newstate.Y, *R2_ ); MVT::MvAddMv( one, *newstate.Y, zero, *newstate.Y, *R1_ ); // Initialize the W's to 0. MVT::MvInit ( *W_ ); MVT::MvInit ( *W2_ ); if ( lp_->getLeftPrec() != Teuchos::null ) { lp_->applyLeftPrec( *newstate.Y, *Y_ ); } else { if (newstate.Y != Y_) { // copy over the initial residual (unpreconditioned). MVT::MvAddMv( one, *newstate.Y, zero, *newstate.Y, *Y_ ); } } // beta1_ = b'*y; beta1_ = Teuchos::SerialDenseMatrix<int,ScalarType>( 1, 1 ); MVT::MvTransMv( one, *newstate.Y, *Y_, beta1_ ); TEUCHOS_TEST_FOR_EXCEPTION( SCT::real(beta1_(0,0)) < zero, std::invalid_argument, "The preconditioner is not positive definite." ); if( SCT::magnitude(beta1_(0,0)) == zero ) { // X = 0 Teuchos::RCP<MV> cur_soln_vec = lp_->getCurrLHSVec(); MVT::MvInit( *cur_soln_vec ); } beta1_(0,0) = SCT::squareroot( beta1_(0,0) ); // The solver is initialized initialized_ = true; }