90 "MueLu::BlockedDirectSolver::Apply(): Setup() has not been called");
92 RCP<MultiVector> rcpX = Teuchos::rcpFromRef(X);
93 RCP<const MultiVector> rcpB = Teuchos::rcpFromRef(B);
94 RCP<BlockedMultiVector> bX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(rcpX);
95 RCP<const BlockedMultiVector> bB = Teuchos::rcp_dynamic_cast<const BlockedMultiVector>(rcpB);
97#ifdef HAVE_MUELU_DEBUG
98 RCP<BlockedCrsMatrix> bA = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(A_);
99 if (bB.is_null() ==
false) {
102 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.");
104 if (bX.is_null() ==
false) {
107 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.");
111 if (bB.is_null() ==
true && bX.is_null() ==
true) {
113 s_->Apply(X, B, InitialGuessIsZero);
114 }
else if (bB.is_null() ==
false && bX.is_null() ==
false) {
116 RCP<MultiVector> mergedX = bX->Merge();
117 RCP<const MultiVector> mergedB = bB->Merge();
118 s_->Apply(*mergedX, *mergedB, InitialGuessIsZero);
119 RCP<MultiVector> xx = Teuchos::rcp(
new BlockedMultiVector(bX->getBlockedMap(), mergedX));
120 SC zero = Teuchos::ScalarTraits<SC>::zero(), one = Teuchos::ScalarTraits<SC>::one();
121 X.update(one, *xx, zero);
122 }
else if (bB.is_null() ==
true && bX.is_null() ==
false) {
124 RCP<MultiVector> mergedX = bX->Merge();
125 s_->Apply(*mergedX, B, InitialGuessIsZero);
126 RCP<MultiVector> xx = Teuchos::rcp(
new BlockedMultiVector(bX->getBlockedMap(), mergedX));
127 SC zero = Teuchos::ScalarTraits<SC>::zero(), one = Teuchos::ScalarTraits<SC>::one();
128 X.update(one, *xx, zero);
129 }
else if (bB.is_null() ==
false && bX.is_null() ==
true) {
131 RCP<const MultiVector> mergedB = bB->Merge();
132 s_->Apply(X, *mergedB, InitialGuessIsZero);
137RCP<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()