173 "MueLu::BraessSarazinSmoother::Apply(): Setup() has not been called");
175 RCP<MultiVector> rcpX = rcpFromRef(X);
176 RCP<const MultiVector> rcpB = rcpFromRef(B);
179 bool bCopyResultX =
false;
180 bool bReorderX =
false;
181 bool bReorderB =
false;
182 RCP<BlockedCrsMatrix> bA = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(
A_);
184 RCP<BlockedMultiVector> bX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(rcpX);
185 RCP<const BlockedMultiVector> bB = Teuchos::rcp_dynamic_cast<const BlockedMultiVector>(rcpB);
188 RCP<Xpetra::ReorderedBlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > rbA =
189 Teuchos::rcp_dynamic_cast<Xpetra::ReorderedBlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(bA);
191 if(rbA.is_null() ==
false) {
196 if (bX.is_null() ==
true) {
197 RCP<MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(rbA->getBlockedCrsMatrix()->getBlockedDomainMap(), rcpX));
198 rcpX.swap(vectorWithBlockedMap);
204 if (bB.is_null() ==
true) {
205 RCP<const MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(rbA->getBlockedCrsMatrix()->getBlockedRangeMap(), rcpB));
206 rcpB.swap(vectorWithBlockedMap);
212 if (bX.is_null() ==
true) {
213 RCP<MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(bA->getBlockedDomainMap(), rcpX));
214 rcpX.swap(vectorWithBlockedMap);
218 if(bB.is_null() ==
true) {
219 RCP<const MultiVector> vectorWithBlockedMap = Teuchos::rcp(
new BlockedMultiVector(bA->getBlockedRangeMap(),rcpB));
220 rcpB.swap(vectorWithBlockedMap);
225 bX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(rcpX);
226 bB = Teuchos::rcp_dynamic_cast<const BlockedMultiVector>(rcpB);
229 if(rbA.is_null() ==
false) {
231 Teuchos::RCP<const Xpetra::BlockReorderManager > brm = rbA->getBlockReorderManager();
234 if(bX->getBlockedMap()->getNumMaps() != bA->getDomainMapExtractor()->NumMaps() || bReorderX) {
236 Teuchos::RCP<MultiVector> reorderedBlockedVector = buildReorderedBlockedMultiVector(brm, bX);
237 rcpX.swap(reorderedBlockedVector);
240 if(bB->getBlockedMap()->getNumMaps() != bA->getRangeMapExtractor()->NumMaps() || bReorderB) {
242 Teuchos::RCP<const MultiVector> reorderedBlockedVector = buildReorderedBlockedMultiVector(brm, bB);
243 rcpB.swap(reorderedBlockedVector);
253 RCP<MultiVector> deltaX = MultiVectorFactory::Build(rcpX->getMap(), rcpX->getNumVectors());
254 RCP<BlockedMultiVector> bdeltaX = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(deltaX);
255 RCP<MultiVector> deltaX0 = bdeltaX->getMultiVector(0,bDomainThyraMode);
256 RCP<MultiVector> deltaX1 = bdeltaX->getMultiVector(1,bDomainThyraMode);
258 RCP<MultiVector> Rtmp =
rangeMapExtractor_->getVector(1, rcpB->getNumVectors(), bRangeThyraMode);
261 typedef Teuchos::ScalarTraits<SC> STS;
262 SC one = STS::one(), zero = STS::zero();
266 LO nSweeps = pL.get<LO>(
"Sweeps");
269 if (InitialGuessIsZero) {
270 R = MultiVectorFactory::Build(rcpB->getMap(), rcpB->getNumVectors());
271 R->update(one, *rcpB, zero);
277 RCP<Vector> diagSVector = VectorFactory::Build(
S_->getRowMap());
278 S_->getLocalDiagCopy(*diagSVector);
280 for (LO run = 0; run < nSweeps; ++run) {
288 deltaX0->putScalar(zero);
289 deltaX0->elementWiseMultiply(one, *
D_, *R0, zero);
290 A10_->apply(*deltaX0, *Rtmp);
291 Rtmp->update(one, *R1, -one);
293 if (!pL.get<
bool>(
"q2q1 mode")) {
294 deltaX1->putScalar(zero);
297 if(Teuchos::rcp_dynamic_cast<BlockedVector>(diagSVector) == Teuchos::null) {
298 ArrayRCP<SC> Sdiag = diagSVector->getDataNonConst(0);
299 ArrayRCP<SC> deltaX1data = deltaX1->getDataNonConst(0);
300 ArrayRCP<SC> Rtmpdata = Rtmp->getDataNonConst(0);
301 for (GO row = 0; row < deltaX1data.size(); row++)
302 deltaX1data[row] = Teuchos::as<SC>(1.1)*Rtmpdata[row] / Sdiag[row];
308 smoo_->Apply(*deltaX1,*Rtmp);
311 deltaX0->putScalar(zero);
312 A01_->apply(*deltaX1, *deltaX0);
313 deltaX0->update(one, *R0, -one);
315 deltaX0->elementWiseMultiply(one, *
D_, *R0, zero);
321 X0->update(one, *deltaX0, one);
322 X1->update(one, *deltaX1, one);
327 if (run < nSweeps-1) {
333 if (bCopyResultX ==
true) {
334 RCP<MultiVector> Xmerged = bX->Merge();
335 X.update(one, *Xmerged, zero);