72 typedef Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node> BlockMap;
74 RCP<Matrix> A = Get<RCP<Matrix> >(level,
"A");
75 RCP<AmalgamationInfo> amalInfo = Get<RCP<AmalgamationInfo> >(level,
"UnAmalgamationInfo");
76 GO numParts = Get<int>(level,
"number of partitions");
78 RCP<const Map> rowMap = A->getRowMap();
79 RCP<const Map> colMap = A->getColMap();
81 if (numParts == 1 || numParts == -1) {
83 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
true);
84 Set(level,
"AmalgamatedPartition", decomposition);
101 GO indexBase = rowMap->getIndexBase();
104 LO nStridedOffset = 0;
109 if (A->IsView(
"stridedMaps") &&
110 Teuchos::rcp_dynamic_cast<const StridedMap>(A->getRowMap(
"stridedMaps")) != Teuchos::null) {
111 Xpetra::viewLabel_t oldView = A->SwitchToView(
"stridedMaps");
112 RCP<const StridedMap> strMap = Teuchos::rcp_dynamic_cast<const StridedMap>(A->getRowMap());
113 TEUCHOS_TEST_FOR_EXCEPTION(strMap == Teuchos::null,
Exceptions::BadCast,
"MueLu::IsorropiaInterface::Build: cast to strided row map failed.");
114 blockdim = strMap->getFixedBlockSize();
115 offset = strMap->getOffset();
116 blockid = strMap->getStridedBlockId();
118 std::vector<size_t> stridingInfo = strMap->getStridingData();
119 for (
size_t j = 0; j < Teuchos::as<size_t>(blockid); j++)
120 nStridedOffset += stridingInfo[j];
126 oldView = A->SwitchToView(oldView);
129 GetOStream(
Statistics0) <<
"IsorropiaInterface::Build(): no striding information available. Use blockdim=1 with offset=0" << std::endl;
133 RCP<const Map> nodeMap = amalInfo->getNodeRowMap();
134 RCP<const BlockedMap> bnodeMap = Teuchos::rcp_dynamic_cast<const BlockedMap>(nodeMap);
135 if (!bnodeMap.is_null()) nodeMap = bnodeMap->getMap();
137 GetOStream(
Statistics0) <<
"IsorropiaInterface:Build(): nodeMap " << nodeMap->getLocalNumElements() <<
"/" << nodeMap->getGlobalNumElements() <<
" elements" << std::endl;
140 RCP<CrsGraph> crsGraph = CrsGraphFactory::Build(nodeMap, A->getLocalMaxNumRowEntries() * blockdim);
143 for (LO row = 0; row < Teuchos::as<LO>(A->getRowMap()->getLocalNumElements()); row++) {
145 GO grid = rowMap->getGlobalElement(row);
150 GO nodeId = (grid - offset - indexBase) / blockdim + indexBase;
152 size_t nnz = A->getNumEntriesInLocalRow(row);
153 Teuchos::ArrayView<const LO> indices;
154 Teuchos::ArrayView<const SC> vals;
155 A->getLocalRowView(row, indices, vals);
157 RCP<std::vector<GO> > cnodeIds = Teuchos::rcp(
new std::vector<GO>);
159 for (LO col = 0; col < Teuchos::as<LO>(nnz); col++) {
160 GO gcid = colMap->getGlobalElement(indices[col]);
162 if (vals[col] != 0.0) {
165 GO cnodeId = (gcid - offset - indexBase) / blockdim + indexBase;
166 cnodeIds->push_back(cnodeId);
171 Teuchos::ArrayRCP<GO> arr_cnodeIds = Teuchos::arcp(cnodeIds);
173 if (arr_cnodeIds.size() > 0)
174 crsGraph->insertGlobalIndices(nodeId, arr_cnodeIds());
177 crsGraph->fillComplete(nodeMap, nodeMap);
180#ifdef HAVE_MUELU_ISORROPIA
183 Teuchos::ParameterList paramlist;
184 paramlist.set(
"NUM PARTS",
toString(numParts));
192 Teuchos::ParameterList& sublist = paramlist.sublist(
"Zoltan");
193 sublist.set(
"LB_APPROACH",
"PARTITION");
195#ifdef HAVE_MUELU_EPETRA
196 RCP<Xpetra::EpetraCrsGraphT<GO, Node> > epCrsGraph = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsGraphT<GO, Node> >(crsGraph);
197 if (epCrsGraph != Teuchos::null) {
198 RCP<const Epetra_CrsGraph> epetraCrsGraph = epCrsGraph->getEpetra_CrsGraph();
200 RCP<Isorropia::Epetra::Partitioner> isoPart = Teuchos::rcp(
new Isorropia::Epetra::Partitioner(epetraCrsGraph, paramlist));
203 const int* array = NULL;
204 isoPart->extractPartsView(size, array);
206 TEUCHOS_TEST_FOR_EXCEPTION(size != Teuchos::as<int>(nodeMap->getLocalNumElements()),
Exceptions::RuntimeError,
"length of array returned from extractPartsView does not match local length of rowMap");
208 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(nodeMap,
false);
209 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
212 for (
int i = 0; i < size; i++) {
213 decompEntries[i] = Teuchos::as<GO>(array[i]);
216 Set(level,
"AmalgamatedPartition", decomposition);
220#ifdef HAVE_MUELU_INST_DOUBLE_INT_INT
221 RCP<Xpetra::TpetraCrsGraph<LO, GO, Node> > tpCrsGraph = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsGraph<LO, GO, Node> >(crsGraph);
222 TEUCHOS_TEST_FOR_EXCEPTION(tpCrsGraph != Teuchos::null,
Exceptions::RuntimeError,
"Tpetra is not supported with Isorropia.");
224 TEUCHOS_TEST_FOR_EXCEPTION(
false,
Exceptions::RuntimeError,
"Isorropia is an interface to Zoltan which only has support for LO=GO=int and SC=double.");
230 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
true);
231 Set(level,
"AmalgamatedPartition", decomposition);