125 if (
fullOp_->getLocalNumRows() != this->getLocalNumRows()) {
126 Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::apply(X, Y, mode, alpha, beta);
138 bool bCopyResultX =
false;
139 bool bCopyResultY =
false;
169 if (refbX == Teuchos::null && fullOp_->getLocalNumRows() == this->getLocalNumRows()) {
171 RCP<const BlockedMap> blkRgMap = Teuchos::rcp_dynamic_cast<const BlockedMap>(fullOp_->getRangeMap());
182 if (tmpbY == Teuchos::null &&
fullOp_->getLocalNumRows() == this->getLocalNumRows()) {
198 Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::apply(*refbX, *tmpbY, mode, alpha, beta);
200 if (bCopyResultX ==
true) {
205 if (bCopyResultY ==
true) {
311 typedef Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node> MapExtractor;
313 typedef Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> BlockedCrsMatrix;
314 typedef Xpetra::ReorderedBlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> ReorderedBlockedCrsMatrix;
317 size_t rowSz = rowMgr->GetNumBlocks();
318 size_t colSz = colMgr->GetNumBlocks();
322 if (rowSz == 0 && colSz == 0) {
330 if (mat == Teuchos::null)
return Teuchos::null;
334 if (matwrap != Teuchos::null) {
339 std::vector<Teuchos::RCP<const Map>> rowSubMaps(1, submap);
344 std::vector<Teuchos::RCP<const Map>> colSubMaps(1, submap2);
347 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor, doMapExtractor, 33, rowMgr, bmat));
348 rbmat->setMatrix(0, 0, mat);
351 rbmat = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(mat);
354 TEUCHOS_ASSERT(mat->getLocalNumEntries() == rbmat->getLocalNumEntries());
360 std::vector<Teuchos::RCP<const Map>> rowSubMaps(rowSz, Teuchos::null);
361 for (
size_t i = 0; i < rowSz; i++) {
367 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(rgMergedSubMaps, rowSubMaps,
false));
374 std::vector<Teuchos::RCP<const Map>> rowSubMaps(1, submap);
375 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(submap, rowSubMaps,
false));
380 std::vector<Teuchos::RCP<const Map>> colSubMaps(colSz, Teuchos::null);
381 for (
size_t j = 0; j < colSz; j++) {
387 doMapExtractor =
Teuchos::rcp(
new MapExtractor(doMergedSubMaps, colSubMaps,
false));
394 std::vector<Teuchos::RCP<const Map>> colSubMaps(1, submap);
395 doMapExtractor =
Teuchos::rcp(
new MapExtractor(submap, colSubMaps,
false));
398 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor, doMapExtractor, 33, rowMgr, bmat));
402 if (rowSz == 0 && colSz > 0) {
403 for (
size_t j = 0; j < colSz; j++) {
406 rbmat->setMatrix(0, j, Teuchos::rcp_const_cast<Matrix>(submat));
407 if (submat != Teuchos::null) cntNNZ += submat->getLocalNumEntries();
409 }
else if (rowSz > 0 && colSz == 0) {
410 for (
size_t i = 0; i < rowSz; i++) {
413 rbmat->setMatrix(i, 0, Teuchos::rcp_const_cast<Matrix>(submat));
414 if (submat != Teuchos::null) cntNNZ += submat->getLocalNumEntries();
417 for (
size_t i = 0; i < rowSz; i++) {
419 for (
size_t j = 0; j < colSz; j++) {
422 rbmat->setMatrix(i, j, Teuchos::rcp_const_cast<Matrix>(submat));
423 if (submat != Teuchos::null) cntNNZ += submat->getLocalNumEntries();
429 rbmat->fillComplete();
438 typedef Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node> MapExtractor;
440 typedef Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> BlockedCrsMatrix;
441 typedef Xpetra::ReorderedBlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> ReorderedBlockedCrsMatrix;
443 TEUCHOS_ASSERT(bmat->getRangeMapExtractor()->getThyraMode() ==
true);
444 TEUCHOS_ASSERT(bmat->getDomainMapExtractor()->getThyraMode() ==
true);
447 size_t rowSz = rowMgr->GetNumBlocks();
448 size_t colSz = colMgr->GetNumBlocks();
452 if (rowSz == 0 && colSz == 0) {
460 if (mat == Teuchos::null)
return Teuchos::null;
464 if (matwrap != Teuchos::null) {
471 std::vector<Teuchos::RCP<const Map>> rowXpSubMaps(1, xpsubmap);
472 std::vector<Teuchos::RCP<const Map>> rowTySubMaps(1, thysubmap);
480 std::vector<Teuchos::RCP<const Map>> colXpSubMaps(1, xpsubmap2);
481 std::vector<Teuchos::RCP<const Map>> colTySubMaps(1, tysubmap2);
487 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor, doMapExtractor, 33, rowMgr, bmat));
488 rbmat->setMatrix(0, 0, mat);
491 rbmat = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(mat);
494 TEUCHOS_ASSERT(mat->getLocalNumEntries() == rbmat->getLocalNumEntries());
500 std::vector<Teuchos::RCP<const Map>> rowXpSubMaps(rowSz, Teuchos::null);
501 std::vector<Teuchos::RCP<const Map>> rowTySubMaps(rowSz, Teuchos::null);
502 for (
size_t i = 0; i < rowSz; i++) {
511 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(rowXpSubMaps, rowTySubMaps));
518 std::vector<Teuchos::RCP<const Map>> rowXpSubMaps(1, xpsubmap);
519 std::vector<Teuchos::RCP<const Map>> rowTySubMaps(1, thysubmap);
521 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(rowXpSubMaps, rowTySubMaps));
526 std::vector<Teuchos::RCP<const Map>> colXpSubMaps(colSz, Teuchos::null);
527 std::vector<Teuchos::RCP<const Map>> colTySubMaps(colSz, Teuchos::null);
528 for (
size_t j = 0; j < colSz; j++) {
537 doMapExtractor =
Teuchos::rcp(
new MapExtractor(colXpSubMaps, colTySubMaps));
544 std::vector<Teuchos::RCP<const Map>> colXpSubMaps(1, xpsubmap);
545 std::vector<Teuchos::RCP<const Map>> colTySubMaps(1, tysubmap);
547 doMapExtractor =
Teuchos::rcp(
new MapExtractor(colXpSubMaps, colTySubMaps));
551 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor, doMapExtractor, 33, rowMgr, bmat));
555 if (rowSz == 0 && colSz > 0) {
556 for (
size_t j = 0; j < colSz; j++) {
559 rbmat->setMatrix(0, j, Teuchos::rcp_const_cast<Matrix>(submat));
560 if (submat != Teuchos::null) cntNNZ += submat->getLocalNumEntries();
562 }
else if (rowSz > 0 && colSz == 0) {
563 for (
size_t i = 0; i < rowSz; i++) {
566 rbmat->setMatrix(i, 0, Teuchos::rcp_const_cast<Matrix>(submat));
567 if (submat != Teuchos::null) cntNNZ += submat->getLocalNumEntries();
570 for (
size_t i = 0; i < rowSz; i++) {
572 for (
size_t j = 0; j < colSz; j++) {
575 rbmat->setMatrix(i, j, Teuchos::rcp_const_cast<Matrix>(submat));
576 if (submat != Teuchos::null) cntNNZ += submat->getLocalNumEntries();
583 rbmat->fillComplete();