85 typedef typename Teuchos::ScalarTraits<SC>::coordinateType real_type;
86 typedef typename Xpetra::MultiVector<real_type, LO, GO, NO> RealValuedMultiVector;
89 RCP<Matrix> A = Get<RCP<Matrix> >(level,
"A");
91 int numParts = Get<int>(level,
"number of partitions");
92 if (numParts == 1 || numParts == -1) {
94 RCP<const Map> rowMap = A->getRowMap();
95 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
true);
96 Set(level,
"Partition", decomposition);
106 const ParameterList& pL = GetParameterList();
108 RCP<const ParameterList> providedList = pL.get<RCP<const ParameterList> >(
"ParameterList");
109 ParameterList Zoltan2Params;
110 if (providedList != Teuchos::null)
111 Zoltan2Params = *providedList;
115 for (ParameterList::ConstIterator param = defaultZoltan2Params->begin(); param != defaultZoltan2Params->end(); param++) {
116 const std::string& pName = defaultZoltan2Params->name(param);
117 if (!Zoltan2Params.isParameter(pName))
118 Zoltan2Params.setEntry(pName, defaultZoltan2Params->getEntry(pName));
120 Zoltan2Params.set(
"num_global_parts", Teuchos::as<int>(numParts));
122 const std::string& algo = Zoltan2Params.get<std::string>(
"algorithm");
124 if (algo ==
"multijagged" && !Zoltan2Params.isParameter(
"mj_premigration_coordinate_count")) {
125 LO heuristicTargetRowsPerProcess = Get<LO>(level,
"repartition: heuristic target rows per process");
126 Zoltan2Params.set(
"mj_premigration_coordinate_count", heuristicTargetRowsPerProcess);
129 GetOStream(
Runtime0) <<
"Zoltan2 parameters:\n----------\n"
130 << Zoltan2Params <<
"----------" << std::endl;
132 RCP<RealValuedMultiVector> coords;
134 if (algo ==
"multijagged" || algo ==
"rcb")
135 coords = Get<RCP<RealValuedMultiVector> >(level,
"Coordinates");
137 const std::string debuggingFile =
"mj_debug.lvl_" + std::to_string(level.
GetLevelID());
138 RCP<typename Util::GOVector> decomposition;
141 decomposition = Util::ComputeDecomposition(numParts, A, coords, Zoltan2Params, debuggingFile);
144 Set(level,
"Partition", decomposition);
150 Zoltan2Params.set(
"num_global_parts", numPartitions);
152 RCP<const Map> rowMap = A->getRowMap();
153 LO blkSize = A->GetFixedBlockSize();
155 const std::string& algo = Zoltan2Params.get<std::string>(
"algorithm");
157 if (algo ==
"multijagged" || algo ==
"rcb") {
158 TEUCHOS_ASSERT(coords);
159 RCP<const Map> map = coords->getMap();
160 GO numElements = map->getLocalNumElements();
163 TEUCHOS_TEST_FOR_EXCEPTION(rowMap->getLocalNumElements() / blkSize != coords->getLocalLength(),
Exceptions::Incompatible,
164 "Coordinate vector length (" +
toString(coords->getLocalLength()) <<
" is incompatible with number of block rows in A (" +
toString(rowMap->getLocalNumElements() / blkSize) +
"The vector length should be the same as the number of mesh points.");
165#ifdef HAVE_MUELU_DEBUG
166 GO indexBase = rowMap->getIndexBase();
168 ArrayView<const GO> rowElements = rowMap->getLocalElementList();
169 ArrayView<const GO> coordsElements = map->getLocalElementList();
170 for (LO i = 0; i < Teuchos::as<LO>(numElements); i++)
171 TEUCHOS_TEST_FOR_EXCEPTION((coordsElements[i] - indexBase) * blkSize + indexBase != rowElements[i * blkSize],
172 Exceptions::RuntimeError,
"i = " << i <<
", coords GID = " << coordsElements[i] <<
", row GID = " << rowElements[i * blkSize] <<
", blkSize = " << blkSize << std::endl);
175 typedef Zoltan2::XpetraMultiVectorAdapter<RealValuedMultiVector> InputAdapterType;
176 typedef Zoltan2::PartitioningProblem<InputAdapterType> ProblemType;
178 Array<real_type> weightsPerRow(numElements);
179 for (LO i = 0; i < numElements; i++) {
180 weightsPerRow[i] = 0.0;
182 for (LO j = 0; j < blkSize; j++) {
183 weightsPerRow[i] += A->getNumEntriesInLocalRow(i * blkSize + j);
187 const bool writeZoltan2DebuggingFiles = Zoltan2Params.get(
"mj_debug",
false);
188 Zoltan2Params.remove(
"mj_debug");
190 std::vector<int> strides;
191 std::vector<const real_type*> weights(1, weightsPerRow.getRawPtr());
193 RCP<const Teuchos::MpiComm<int> > dupMpiComm = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(rowMap->getComm()->duplicate());
194 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > zoltanComm = dupMpiComm->getRawMpiComm();
196 InputAdapterType adapter(coords, weights, strides);
197 RCP<ProblemType> problem(
new ProblemType(&adapter, &Zoltan2Params, (*zoltanComm)()));
200 if (writeZoltan2DebuggingFiles)
201 adapter.generateFiles(debuggingFile.c_str(), *(rowMap->getComm()));
205 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
false);
206 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
208 const typename InputAdapterType::part_t* parts = problem->getSolution().getPartListView();
210 for (GO i = 0; i < numElements; i++) {
211 int partNum = parts[i];
213 for (LO j = 0; j < blkSize; j++)
214 decompEntries[i * blkSize + j] = partNum;
217 return decomposition;
220 GO numElements = rowMap->getLocalNumElements();
222 typedef Zoltan2::XpetraCrsGraphAdapter<CrsGraph> InputAdapterType;
223 typedef Zoltan2::PartitioningProblem<InputAdapterType> ProblemType;
225 RCP<const Teuchos::MpiComm<int> > dupMpiComm = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(rowMap->getComm()->duplicate());
226 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > zoltanComm = dupMpiComm->getRawMpiComm();
228 InputAdapterType adapter(A->getCrsGraph());
229 RCP<ProblemType> problem(
new ProblemType(&adapter, &Zoltan2Params, (*zoltanComm)()));
233 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
false);
234 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
236 const typename InputAdapterType::part_t* parts = problem->getSolution().getPartListView();
239 for (GO i = 0; i < numElements / blkSize; i++) {
240 int partNum = parts[i * blkSize];
242 for (LO j = 0; j < blkSize; j++)
243 decompEntries[i * blkSize + j] = partNum;
246 return decomposition;