本文整理汇总了C++中tpetra::MultiVector::update方法的典型用法代码示例。如果您正苦于以下问题:C++ MultiVector::update方法的具体用法?C++ MultiVector::update怎么用?C++ MultiVector::update使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类tpetra::MultiVector
的用法示例。
在下文中一共展示了MultiVector::update方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: rcp
void Hiptmair<MatrixType>::
applyHiptmairSmoother(const Tpetra::MultiVector<typename MatrixType::scalar_type,
typename MatrixType::local_ordinal_type,
typename MatrixType::global_ordinal_type,
typename MatrixType::node_type>& X,
Tpetra::MultiVector<typename MatrixType::scalar_type,
typename MatrixType::local_ordinal_type,
typename MatrixType::global_ordinal_type,
typename MatrixType::node_type>& Y) const
{
using Teuchos::RCP;
using Teuchos::rcp;
using Teuchos::rcpFromRef;
typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
global_ordinal_type, node_type> MV;
const scalar_type ZERO = STS::zero ();
const scalar_type ONE = STS::one ();
RCP<MV> res1 = rcp (new MV (A_->getRowMap (), X.getNumVectors ()));
RCP<MV> vec1 = rcp (new MV (A_->getRowMap (), X.getNumVectors ()));
RCP<MV> res2 = rcp (new MV (PtAP_->getRowMap (), X.getNumVectors ()));
RCP<MV> vec2 = rcp (new MV (PtAP_->getRowMap (), X.getNumVectors ()));
if (preOrPost_ == "pre" || preOrPost_ == "both") {
// apply initial relaxation to primary space
A_->apply (Y, *res1);
res1->update (ONE, X, -ONE);
vec1->putScalar (ZERO);
ifpack2_prec1_->apply (*res1, *vec1);
Y.update (ONE, *vec1, ONE);
}
// project to auxiliary space and smooth
A_->apply (Y, *res1);
res1->update (ONE, X, -ONE);
P_->apply (*res1, *res2, Teuchos::TRANS);
vec2->putScalar (ZERO);
ifpack2_prec2_->apply (*res2, *vec2);
P_->apply (*vec2, *vec1, Teuchos::NO_TRANS);
Y.update (ONE,*vec1,ONE);
if (preOrPost_ == "post" || preOrPost_ == "both") {
// smooth again on primary space
A_->apply (Y, *res1);
res1->update (ONE, X, -ONE);
vec1->putScalar (ZERO);
ifpack2_prec1_->apply (*res1, *vec1);
Y.update (ONE, *vec1, ONE);
}
}
示例2: X_tmp
void IdentitySolver<MatrixType>::
apply (const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& X,
Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& Y,
Teuchos::ETransp /*mode*/,
scalar_type alpha,
scalar_type beta) const
{
using Teuchos::RCP;
typedef Teuchos::ScalarTraits<scalar_type> STS;
typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
global_ordinal_type, node_type> MV;
TEUCHOS_TEST_FOR_EXCEPTION(
! isComputed (), std::runtime_error,
"Ifpack2::IdentitySolver::apply: If compute() has not yet been called, "
"or if you have changed the matrix via setMatrix(), "
"you must call compute() before you may call this method.");
// "Identity solver" does what it says: it's the identity operator.
// We have to Export if the domain and range Maps are not the same.
// Otherwise, this operator would be a permutation, not the identity.
if (export_.is_null ()) {
Y.update (alpha, X, beta);
}
else {
if (alpha == STS::one () && beta == STS::zero ()) { // the common case
Y.doExport (X, *export_, Tpetra::REPLACE);
}
else {
// We know that the domain and range Maps are compatible. First
// bring X into the range Map via Export. Then compute in place
// in Y.
MV X_tmp (Y.getMap (), Y.getNumVectors ());
X_tmp.doExport (X, *export_, Tpetra::REPLACE);
Y.update (alpha, X_tmp, beta);
}
}
++numApply_;
}