48 RCP<Matrix> A = Get<RCP<Matrix> >(level,
"A");
49 RCP<BlockedCrsMatrix> bA = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(A);
50 RCP<const Map> rowMap;
51 if (bA != Teuchos::null) {
53 RCP<const Map> bArowMap = bA->getRowMap();
54 RCP<const BlockedMap> bRowMap = Teuchos::rcp_dynamic_cast<const BlockedMap>(bArowMap);
55 rowMap = bRowMap->getFullMap();
57 rowMap = A->getRowMap();
60 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,
LocalOrdinal,
GlobalOrdinal,
Node> double_multivector_type;
61 RCP<double_multivector_type> Coords = Get<RCP<double_multivector_type> >(level,
"Coordinates");
62 size_t dim = Coords->getNumVectors();
63 int numParts = Get<int>(level,
"number of partitions");
65 if (numParts == 1 || numParts == -1) {
67 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
true);
68 Set(level,
"Partition", decomposition);
70 }
else if (numParts == -1) {
72 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Teuchos::null;
73 Set(level,
"Partition", decomposition);
78 Zoltan_Initialize(0, NULL, &zoltanVersion_);
80 RCP<const Teuchos::MpiComm<int> > dupMpiComm = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(rowMap->getComm()->duplicate());
81 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > zoltanComm = dupMpiComm->getRawMpiComm();
83 RCP<Zoltan> zoltanObj_ = rcp(
new Zoltan((*zoltanComm)()));
84 if (zoltanObj_ == Teuchos::null)
91 if ((rv = zoltanObj_->Set_Param(
"num_gid_entries",
"1")) != ZOLTAN_OK)
92 throw Exceptions::RuntimeError(
"MueLu::Zoltan::Setup : setting parameter 'num_gid_entries' returned error code " + Teuchos::toString(rv));
93 if ((rv = zoltanObj_->Set_Param(
"num_lid_entries",
"0")) != ZOLTAN_OK)
94 throw Exceptions::RuntimeError(
"MueLu::Zoltan::Setup : setting parameter 'num_lid_entries' returned error code " + Teuchos::toString(rv));
95 if ((rv = zoltanObj_->Set_Param(
"obj_weight_dim",
"1")) != ZOLTAN_OK)
96 throw Exceptions::RuntimeError(
"MueLu::Zoltan::Setup : setting parameter 'obj_weight_dim' returned error code " + Teuchos::toString(rv));
99 zoltanObj_->Set_Param(
"debug_level",
"1");
101 zoltanObj_->Set_Param(
"debug_level",
"0");
103 zoltanObj_->Set_Param(
"num_global_partitions",
toString(numParts));
105 zoltanObj_->Set_Num_Obj_Fn(GetLocalNumberOfRows, (
void *)A.getRawPtr());
106 zoltanObj_->Set_Obj_List_Fn(GetLocalNumberOfNonzeros, (
void *)A.getRawPtr());
107 zoltanObj_->Set_Num_Geom_Fn(GetProblemDimension, (
void *)&dim);
108 zoltanObj_->Set_Geom_Multi_Fn(GetProblemGeometry, (
void *)Coords.get());
111 ZOLTAN_ID_PTR import_gids = NULL;
112 ZOLTAN_ID_PTR import_lids = NULL;
113 int *import_procs = NULL;
114 int *import_to_part = NULL;
115 ZOLTAN_ID_PTR export_gids = NULL;
116 ZOLTAN_ID_PTR export_lids = NULL;
117 int *export_procs = NULL;
118 int *export_to_part = NULL;
127 rv = zoltanObj_->LB_Partition(newDecomp, num_gid_entries, num_lid_entries,
128 num_imported, import_gids, import_lids, import_procs, import_to_part,
129 num_exported, export_gids, export_lids, export_procs, export_to_part);
130 if (rv == ZOLTAN_FATAL)
136 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition;
138 decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap,
false);
139 ArrayRCP<GO> decompEntries = decomposition->getDataNonConst(0);
141 int mypid = rowMap->getComm()->getRank();
142 for (
typename ArrayRCP<GO>::iterator i = decompEntries.begin(); i != decompEntries.end(); ++i)
145 LO blockSize = A->GetFixedBlockSize();
146 for (
int i = 0; i < num_exported; ++i) {
149 LO localEl = rowMap->getLocalElement(export_gids[i]);
150 int partNum = export_to_part[i];
151 for (LO j = 0; j < blockSize; ++j)
152 decompEntries[localEl + j] = partNum;
156 Set(level,
"Partition", decomposition);
158 zoltanObj_->LB_Free_Part(&import_gids, &import_lids, &import_procs, &import_to_part);
159 zoltanObj_->LB_Free_Part(&export_gids, &export_lids, &export_procs, &export_to_part);
189 ZOLTAN_ID_PTR ,
int ,
float *weights,
int *ierr) {
190 if (data == NULL || NumGidEntries < 1) {
191 *ierr = ZOLTAN_FATAL;
197 Matrix *A = (Matrix *)data;
198 RCP<const Map> map = A->getRowMap();
200 LO blockSize = A->GetFixedBlockSize();
203 size_t numElements = map->getLocalNumElements();
204 ArrayView<const GO> mapGIDs = map->getLocalElementList();
206 if (blockSize == 1) {
207 for (
size_t i = 0; i < numElements; i++) {
208 gids[i] = as<ZOLTAN_ID_TYPE>(mapGIDs[i]);
209 weights[i] = A->getNumEntriesInLocalRow(i);
213 LO numBlockElements = numElements / blockSize;
215 for (LO i = 0; i < numBlockElements; i++) {
218 gids[i] = as<ZOLTAN_ID_TYPE>(mapGIDs[i * blockSize]);
220 for (LO j = 0; j < blockSize; j++)
221 weights[i] += A->getNumEntriesInLocalRow(i * blockSize + j);
246 ZOLTAN_ID_PTR , ZOLTAN_ID_PTR ,
int dim,
double *coordinates,
int *ierr) {
248 *ierr = ZOLTAN_FATAL;
252 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node> double_multivector_type;
253 double_multivector_type *Coords = (double_multivector_type *)data;
255 if (dim != Teuchos::as<int>(Coords->getNumVectors())) {
257 *ierr = ZOLTAN_FATAL;
261 TEUCHOS_TEST_FOR_EXCEPTION(numObjectIDs != Teuchos::as<int>(Coords->getLocalLength()),
Exceptions::Incompatible,
"Length of coordinates must be the same as the number of objects");
263 ArrayRCP<ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> > CoordsData(dim);
264 for (
int j = 0; j < dim; ++j)
265 CoordsData[j] = Coords->getData(j);
267 size_t numElements = Coords->getLocalLength();
268 for (
size_t i = 0; i < numElements; ++i)
269 for (
int j = 0; j < dim; ++j)
270 coordinates[i * dim + j] = (
double)CoordsData[j][i];