91 "MueLu::BlockedDirectSolver::Apply(): Setup() has not been called");
93 RCP<MultiVector> rcpX = Teuchos::rcpFromRef(X);
94 RCP<const MultiVector> rcpB = Teuchos::rcpFromRef(B);
95 RCP<BlockedMultiVector> bX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(rcpX);
96 RCP<const BlockedMultiVector> bB = Teuchos::rcp_dynamic_cast<const BlockedMultiVector>(rcpB);
99 RCP<BlockedCrsMatrix> bA = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(A_);
100 if (bB.is_null() ==
false) {
103 TEUCHOS_TEST_FOR_EXCEPTION(bA->getFullRangeMap()->isSameAs(*(B.getMap())) ==
false,
Exceptions::RuntimeError,
"MueLu::BlockedDirectSolver::Apply(): The map of RHS vector B is not the same as range map of the blocked operator A. Please check the map of B and A.");
105 if (bX.is_null() ==
false) {
108 TEUCHOS_TEST_FOR_EXCEPTION(bA->getFullDomainMap()->isSameAs(*(X.getMap())) ==
false,
Exceptions::RuntimeError,
"MueLu::BlockedDirectSolver::Apply(): The map of the solution vector X is not the same as domain map of the blocked operator A. Please check the map of X and A.");
112 if (bB.is_null() ==
true && bX.is_null() ==
true) {
114 s_->Apply(X, B, InitialGuessIsZero);
115 }
else if (bB.is_null() ==
false && bX.is_null() ==
false) {
117 RCP<MultiVector> mergedX = bX->Merge();
118 RCP<const MultiVector> mergedB = bB->Merge();
119 s_->Apply(*mergedX, *mergedB, InitialGuessIsZero);
120 RCP<MultiVector> xx = Teuchos::rcp(
new BlockedMultiVector(bX->getBlockedMap(), mergedX));
121 SC zero = Teuchos::ScalarTraits<SC>::zero(), one = Teuchos::ScalarTraits<SC>::one();
122 X.update(one, *xx, zero);
123 }
else if (bB.is_null() ==
true && bX.is_null() ==
false) {
125 RCP<MultiVector> mergedX = bX->Merge();
126 s_->Apply(*mergedX, B, InitialGuessIsZero);
127 RCP<MultiVector> xx = Teuchos::rcp(
new BlockedMultiVector(bX->getBlockedMap(), mergedX));
128 SC zero = Teuchos::ScalarTraits<SC>::zero(), one = Teuchos::ScalarTraits<SC>::one();
129 X.update(one, *xx, zero);
130 }
else if (bB.is_null() ==
false && bX.is_null() ==
true) {
132 RCP<const MultiVector> mergedB = bB->Merge();
133 s_->Apply(X, *mergedB, InitialGuessIsZero);
138RCP<MueLu::SmootherPrototype<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()