176 Teuchos::RCP<Teuchos::FancyOStream> fos = Teuchos::getFancyOStream(Teuchos::rcpFromRef(std::cout));
178 SC zero = Teuchos::ScalarTraits<SC>::zero(), one = Teuchos::ScalarTraits<SC>::one();
189 RCP<MultiVector> rcpX = Teuchos::rcpFromRef(X);
190 RCP<const MultiVector> rcpB = Teuchos::rcpFromRef(B);
193 bool bCopyResultX =
false;
194 bool bReorderX =
false;
195 bool bReorderB =
false;
196 RCP<BlockedCrsMatrix> bA = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(
A_);
198 RCP<BlockedMultiVector> bX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(rcpX);
199 RCP<const BlockedMultiVector> bB = Teuchos::rcp_dynamic_cast<const BlockedMultiVector>(rcpB);
202 RCP<Xpetra::ReorderedBlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > rbA =
203 Teuchos::rcp_dynamic_cast<Xpetra::ReorderedBlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(bA);
205 if(rbA.is_null() ==
false) {
210 if (bX.is_null() ==
true) {
211 RCP<MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(rbA->getBlockedCrsMatrix()->getBlockedDomainMap(), rcpX));
212 rcpX.swap(vectorWithBlockedMap);
218 if (bB.is_null() ==
true) {
219 RCP<const MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(rbA->getBlockedCrsMatrix()->getBlockedRangeMap(), rcpB));
220 rcpB.swap(vectorWithBlockedMap);
226 if (bX.is_null() ==
true) {
227 RCP<MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(bA->getBlockedDomainMap(), rcpX));
228 rcpX.swap(vectorWithBlockedMap);
232 if(bB.is_null() ==
true) {
233 RCP<const MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(bA->getBlockedRangeMap(),rcpB));
234 rcpB.swap(vectorWithBlockedMap);
239 bX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(rcpX);
240 bB = Teuchos::rcp_dynamic_cast<const BlockedMultiVector>(rcpB);
243 if(rbA.is_null() ==
false) {
245 Teuchos::RCP<const Xpetra::BlockReorderManager > brm = rbA->getBlockReorderManager();
248 if(bX->getBlockedMap()->getNumMaps() != bA->getDomainMapExtractor()->NumMaps() || bReorderX) {
250 Teuchos::RCP<MultiVector> reorderedBlockedVector = buildReorderedBlockedMultiVector(brm, bX);
251 rcpX.swap(reorderedBlockedVector);
254 if(bB->getBlockedMap()->getNumMaps() != bA->getRangeMapExtractor()->NumMaps() || bReorderB) {
256 Teuchos::RCP<const MultiVector> reorderedBlockedVector = buildReorderedBlockedMultiVector(brm, bB);
257 rcpB.swap(reorderedBlockedVector);
265 RCP<MultiVector> residual = MultiVectorFactory::Build(rcpB->getMap(), rcpB->getNumVectors());
266 RCP<BlockedMultiVector> bresidual = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(residual);
267 Teuchos::RCP<MultiVector> r1 = bresidual->getMultiVector(0,bRangeThyraMode);
268 Teuchos::RCP<MultiVector> r2 = bresidual->getMultiVector(1,bRangeThyraMode);
271 RCP<MultiVector> xtilde = MultiVectorFactory::Build(rcpX->getMap(), rcpX->getNumVectors());
272 RCP<BlockedMultiVector> bxtilde = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xtilde);
273 RCP<MultiVector> xtilde1 = bxtilde->getMultiVector(0,bDomainThyraMode);
274 RCP<MultiVector> xtilde2 = bxtilde->getMultiVector(1,bDomainThyraMode);
279 residual->update(one,*rcpB,zero);
280 A_->apply(*rcpX, *residual, Teuchos::NO_TRANS, -one, one);
284 bxtilde->putScalar(zero);
289 RCP<MultiVector> schurCompRHS = MultiVectorFactory::Build(r2->getMap(),rcpB->getNumVectors());
290 D_->apply(*xtilde1,*schurCompRHS);
291 schurCompRHS->update(one,*r2,-one);
297 rcpX->update(omega,*bxtilde,one);
300 if (bCopyResultX ==
true) {
301 RCP<MultiVector> Xmerged = bX->Merge();
302 X.update(one, *Xmerged, zero);