84 Teuchos::RCP<Matrix> A = Get< Teuchos::RCP<Matrix> > (currentLevel,
"A");
85 Teuchos::RCP<const Teuchos::Comm< int > > comm = A->getRowMap()->getComm();
88 if (currentLevel.
IsAvailable(
"number of partitions")) {
89 GetOStream(
Warnings0) <<
"Using user-provided \"number of partitions\", the performance is unknown" << std::endl;
96 RCP<GOVector> decomposition = Teuchos::null;
99 decomposition = Get<RCP<GOVector> >(currentLevel,
"Partition");
100 ArrayRCP<const GO> decompEntries = decomposition->getData(0);
102 if (decomposition.is_null()) {
103 GetOStream(
Warnings0) <<
"No repartitioning necessary: partitions were left unchanged by the repartitioner" << std::endl;
104 Set<RCP<const Import> >(currentLevel,
"Importer", Teuchos::null);
109 Teuchos::RCP<GOVector> ret = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(A->getRowMap(),
false);
110 ArrayRCP<GO> retDecompEntries = ret->getDataNonConst(0);
116 if(A->IsView(
"stridedMaps") &&
117 Teuchos::rcp_dynamic_cast<const StridedMap>(A->getRowMap(
"stridedMaps")) != Teuchos::null) {
118 Xpetra::viewLabel_t oldView = A->SwitchToView(
"stridedMaps");
119 RCP<const StridedMap> strMap = Teuchos::rcp_dynamic_cast<const StridedMap>(A->getRowMap());
120 TEUCHOS_TEST_FOR_EXCEPTION(strMap == Teuchos::null,
Exceptions::BadCast,
"MueLu::CloneRepartitionInterface::Build: cast to strided row map failed.");
121 LocalOrdinal stridedBlock = strMap->getStridedBlockId();
122 if (stridedBlock == -1)
123 blkSize = strMap->getFixedBlockSize();
125 std::vector<size_t> strInfo = strMap->getStridingData();
126 blkSize = strInfo[stridedBlock];
128 oldView = A->SwitchToView(oldView);
129 GetOStream(
Statistics1) <<
"CloneRepartitionInterface::Build():" <<
" found blockdim=" << blkSize <<
" from strided maps."<< std::endl;
131 GetOStream(
Statistics1) <<
"CloneRepartitionInterface::Build(): no striding information available. Use blockdim=" << blkSize <<
" (DofsPerNode)." << std::endl;
132 blkSize = A->GetFixedBlockSize();
136 size_t inLocalLength = decomposition->getLocalLength();
137 size_t outLocalLength = A->getRowMap()->getLocalNumElements();
140 size_t numLocalNodes = outLocalLength / blkSize;
141 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(outLocalLength % blkSize) != 0,
MueLu::Exceptions::RuntimeError,
"CloneRepartitionInterface: inconsistent number of local DOFs (" << outLocalLength <<
") and degrees of freedoms (" << blkSize <<
")");
143 if (numLocalNodes > 0) {
144 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(inLocalLength % numLocalNodes) != 0,
MueLu::Exceptions::RuntimeError,
"CloneRepartitionInterface: inconsistent number of local DOFs (" << inLocalLength <<
") and number of local nodes (" << numLocalNodes <<
")");
145 LocalOrdinal inBlkSize = Teuchos::as<LocalOrdinal>(inLocalLength / numLocalNodes);
148 for(LO i = 0; i<Teuchos::as<LO>(numLocalNodes); i++) {
149 for(LO j = 0; j < blkSize; j++) {
150 retDecompEntries[i*blkSize + j] = Teuchos::as<GO>(decompEntries[i*inBlkSize]);
154 Set(currentLevel,
"Partition", ret);