122 typedef typename Teuchos::ScalarTraits<SC>::coordinateType real_type;
123 typedef typename Xpetra::MultiVector<real_type,LO,GO,NO> RealValuedMultiVector;
126 RCP<const Map> rowMap = A->getRowMap();
127 LO blkSize = A->GetFixedBlockSize();
129 int numParts =
Get<int>(level,
"number of partitions");
130 if (numParts == 1 || numParts == -1) {
132 RCP<Xpetra::Vector<GO,LO,GO,NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
true);
133 Set(level,
"Partition", decomposition);
145 RCP<const ParameterList> providedList = pL.get<RCP<const ParameterList> >(
"ParameterList");
146 ParameterList Zoltan2Params;
147 if (providedList != Teuchos::null)
148 Zoltan2Params = *providedList;
154 if (!Zoltan2Params.isParameter(pName))
157 Zoltan2Params.set(
"num_global_parts", Teuchos::as<int>(numParts));
159 GetOStream(
Runtime0) <<
"Zoltan2 parameters:\n----------\n" << Zoltan2Params <<
"----------" << std::endl;
161 const std::string& algo = Zoltan2Params.get<std::string>(
"algorithm");
163 if (algo ==
"multijagged" || algo ==
"rcb") {
166 RCP<const Map> map = coords->getMap();
167 GO numElements = map->getLocalNumElements();
170 TEUCHOS_TEST_FOR_EXCEPTION(rowMap->getLocalNumElements()/blkSize != coords->getLocalLength(),
Exceptions::Incompatible,
171 "Coordinate vector length (" +
toString(coords->getLocalLength()) <<
" is incompatible with number of block rows in A ("
172 +
toString(rowMap->getLocalNumElements()/blkSize) +
"The vector length should be the same as the number of mesh points.");
173#ifdef HAVE_MUELU_DEBUG
174 GO indexBase = rowMap->getIndexBase();
175 GetOStream(
Runtime0) <<
"Checking consistence of row and coordinates maps" << std::endl;
177 ArrayView<const GO> rowElements = rowMap->getLocalElementList();
178 ArrayView<const GO> coordsElements = map ->getLocalElementList();
179 for (LO i = 0; i < Teuchos::as<LO>(numElements); i++)
180 TEUCHOS_TEST_FOR_EXCEPTION((coordsElements[i]-indexBase)*blkSize + indexBase != rowElements[i*blkSize],
182 <<
", row GID = " << rowElements[i*blkSize] <<
", blkSize = " << blkSize << std::endl);
185 typedef Zoltan2::XpetraMultiVectorAdapter<RealValuedMultiVector> InputAdapterType;
186 typedef Zoltan2::PartitioningProblem<InputAdapterType> ProblemType;
188 Array<real_type> weightsPerRow(numElements);
189 for (LO i = 0; i < numElements; i++) {
190 weightsPerRow[i] = 0.0;
192 for (LO j = 0; j < blkSize; j++) {
193 weightsPerRow[i] += A->getNumEntriesInLocalRow(i*blkSize+j);
198 if(algo ==
"multijagged" && !Zoltan2Params.isParameter(
"mj_premigration_coordinate_count")) {
199 LO heuristicTargetRowsPerProcess =
Get<LO>(level,
"repartition: heuristic target rows per process");
200 Zoltan2Params.set(
"mj_premigration_coordinate_count", heuristicTargetRowsPerProcess);
202 const bool writeZoltan2DebuggingFiles = Zoltan2Params.get(
"mj_debug",
false);
203 Zoltan2Params.remove(
"mj_debug");
205 std::vector<int> strides;
206 std::vector<const real_type*> weights(1, weightsPerRow.getRawPtr());
208 RCP<const Teuchos::MpiComm<int> > dupMpiComm = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(rowMap->getComm()->duplicate());
209 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > zoltanComm = dupMpiComm->getRawMpiComm();
211 InputAdapterType adapter(coords, weights, strides);
212 RCP<ProblemType> problem(
new ProblemType(&adapter, &Zoltan2Params, (*zoltanComm)()));
216 if (writeZoltan2DebuggingFiles)
217 adapter.generateFiles((
"mj_debug.lvl_"+std::to_string(level.GetLevelID())).c_str(), *(rowMap->getComm()));
221 RCP<Xpetra::Vector<GO,LO,GO,NO> > decomposition = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(rowMap,
false);
222 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
224 const typename InputAdapterType::part_t * parts = problem->getSolution().getPartListView();
226 for (GO i = 0; i < numElements; i++) {
227 int partNum = parts[i];
229 for (LO j = 0; j < blkSize; j++)
230 decompEntries[i*blkSize + j] = partNum;
233 Set(level,
"Partition", decomposition);
237 GO numElements = rowMap->getLocalNumElements();
239 typedef Zoltan2::XpetraCrsGraphAdapter<CrsGraph> InputAdapterType;
240 typedef Zoltan2::PartitioningProblem<InputAdapterType> ProblemType;
242 RCP<const Teuchos::MpiComm<int> > dupMpiComm = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(rowMap->getComm()->duplicate());
243 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > zoltanComm = dupMpiComm->getRawMpiComm();
245 InputAdapterType adapter(A->getCrsGraph());
246 RCP<ProblemType> problem(
new ProblemType(&adapter, &Zoltan2Params, (*zoltanComm)()));
253 RCP<Xpetra::Vector<GO,LO,GO,NO> > decomposition = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(rowMap,
false);
254 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
256 const typename InputAdapterType::part_t * parts = problem->getSolution().getPartListView();
259 for (GO i = 0; i < numElements/blkSize; i++) {
260 int partNum = parts[i*blkSize];
262 for (LO j = 0; j < blkSize; j++)
263 decompEntries[i*blkSize + j] = partNum;
266 Set(level,
"Partition", decomposition);