86 RCP<BlockedCrsMatrix> bA = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(A);
87 RCP<const Map> rowMap;
88 if(bA != Teuchos::null) {
90 RCP<const Map> bArowMap = bA->getRowMap();
91 RCP<const BlockedMap> bRowMap = Teuchos::rcp_dynamic_cast<const BlockedMap>(bArowMap);
92 rowMap = bRowMap->getFullMap();
94 rowMap = A->getRowMap();
97 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,
LocalOrdinal,
GlobalOrdinal,
Node> double_multivector_type;
99 size_t dim = Coords->getNumVectors();
100 int numParts =
Get<int>(level,
"number of partitions");
102 if (numParts == 1 || numParts == -1) {
104 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
true);
105 Set(level,
"Partition", decomposition);
107 }
else if (numParts == -1) {
109 RCP<Xpetra::Vector<GO,LO,GO,NO> > decomposition = Teuchos::null;
110 Set(level,
"Partition", decomposition);
114 float zoltanVersion_;
115 Zoltan_Initialize(0, NULL, &zoltanVersion_);
117 RCP<const Teuchos::MpiComm<int> > dupMpiComm = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(rowMap->getComm()->duplicate());
118 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > zoltanComm = dupMpiComm->getRawMpiComm();
120 RCP<Zoltan> zoltanObj_ = rcp(
new Zoltan((*zoltanComm)()));
121 if (zoltanObj_ == Teuchos::null)
128 if ((rv = zoltanObj_->Set_Param(
"num_gid_entries",
"1")) != ZOLTAN_OK)
129 throw Exceptions::RuntimeError(
"MueLu::Zoltan::Setup : setting parameter 'num_gid_entries' returned error code " + Teuchos::toString(rv));
130 if ((rv = zoltanObj_->Set_Param(
"num_lid_entries",
"0") ) != ZOLTAN_OK)
131 throw Exceptions::RuntimeError(
"MueLu::Zoltan::Setup : setting parameter 'num_lid_entries' returned error code " + Teuchos::toString(rv));
132 if ((rv = zoltanObj_->Set_Param(
"obj_weight_dim",
"1") ) != ZOLTAN_OK)
133 throw Exceptions::RuntimeError(
"MueLu::Zoltan::Setup : setting parameter 'obj_weight_dim' returned error code " + Teuchos::toString(rv));
136 else zoltanObj_->Set_Param(
"debug_level",
"0");
138 zoltanObj_->Set_Param(
"num_global_partitions",
toString(numParts));
146 ZOLTAN_ID_PTR import_gids = NULL;
147 ZOLTAN_ID_PTR import_lids = NULL;
148 int *import_procs = NULL;
149 int *import_to_part = NULL;
150 ZOLTAN_ID_PTR export_gids = NULL;
151 ZOLTAN_ID_PTR export_lids = NULL;
152 int *export_procs = NULL;
153 int *export_to_part = NULL;
162 rv = zoltanObj_->LB_Partition(newDecomp, num_gid_entries, num_lid_entries,
163 num_imported, import_gids, import_lids, import_procs, import_to_part,
164 num_exported, export_gids, export_lids, export_procs, export_to_part);
165 if (rv == ZOLTAN_FATAL)
171 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition;
173 decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
false);
174 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
176 int mypid = rowMap->getComm()->getRank();
177 for (
typename ArrayRCP<GO>::iterator i = decompEntries.begin(); i != decompEntries.end(); ++i)
180 LO blockSize = A->GetFixedBlockSize();
181 for (
int i = 0; i < num_exported; ++i) {
184 LO localEl = rowMap->getLocalElement(export_gids[i]);
185 int partNum = export_to_part[i];
186 for (LO j = 0; j < blockSize; ++j)
187 decompEntries[localEl + j] = partNum;
191 Set(level,
"Partition", decomposition);
193 zoltanObj_->LB_Free_Part(&import_gids, &import_lids, &import_procs, &import_to_part);
194 zoltanObj_->LB_Free_Part(&export_gids, &export_lids, &export_procs, &export_to_part);
224 ZOLTAN_ID_PTR ,
int ,
float *weights,
int *ierr) {
225 if (data == NULL || NumGidEntries < 1) {
226 *ierr = ZOLTAN_FATAL;
232 Matrix *A = (Matrix*) data;
233 RCP<const Map> map = A->getRowMap();
235 LO blockSize = A->GetFixedBlockSize();
238 size_t numElements = map->getLocalNumElements();
239 ArrayView<const GO> mapGIDs = map->getLocalElementList();
241 if (blockSize == 1) {
242 for (
size_t i = 0; i < numElements; i++) {
243 gids[i] = as<ZOLTAN_ID_TYPE>(mapGIDs[i]);
244 weights[i] = A->getNumEntriesInLocalRow(i);
248 LO numBlockElements = numElements / blockSize;
250 for (LO i = 0; i < numBlockElements; i++) {
253 gids[i] = as<ZOLTAN_ID_TYPE>(mapGIDs[i*blockSize]);
255 for (LO j = 0; j < blockSize; j++)
256 weights[i] += A->getNumEntriesInLocalRow(i*blockSize+j);
283 ZOLTAN_ID_PTR , ZOLTAN_ID_PTR ,
int dim,
double *coordinates,
int *ierr)
286 *ierr = ZOLTAN_FATAL;
290 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node> double_multivector_type;
291 double_multivector_type *Coords = (double_multivector_type*) data;
293 if (dim != Teuchos::as<int>(Coords->getNumVectors())) {
295 *ierr = ZOLTAN_FATAL;
299 TEUCHOS_TEST_FOR_EXCEPTION(numObjectIDs != Teuchos::as<int>(Coords->getLocalLength()),
Exceptions::Incompatible,
"Length of coordinates must be the same as the number of objects");
301 ArrayRCP<ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> > CoordsData(dim);
302 for (
int j = 0; j < dim; ++j)
303 CoordsData[j] = Coords->getData(j);
305 size_t numElements = Coords->getLocalLength();
306 for (
size_t i = 0; i < numElements; ++i)
307 for (
int j = 0; j < dim; ++j)
308 coordinates[i*dim+j] = (
double) CoordsData[j][i];