54 #include <Tpetra_Map.hpp> 66 int main(
int argc,
char *argv[])
68 #ifdef HAVE_ZOLTAN2_MPI 69 MPI_Init(&argc, &argv);
71 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
72 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
79 typedef Tpetra::Map<> Map_t;
80 typedef Map_t::local_ordinal_type localId_t;
81 typedef Map_t::global_ordinal_type globalId_t;
83 typedef double scalar_t;
89 typedef inputAdapter_t::part_t part_t;
95 size_t localCount = 40;
98 scalar_t *coords =
new scalar_t [dim * localCount];
100 scalar_t *x = coords;
101 scalar_t *y = x + localCount;
102 scalar_t *z = y + localCount;
107 scalar_t scalingFactor = 10.0 / RAND_MAX;
109 for (
size_t i=0; i < localCount*dim; i++){
110 coords[i] = scalar_t(rand()) * scalingFactor;
115 globalId_t *globalIds =
new globalId_t [localCount];
116 globalId_t offset = rank * localCount;
118 for (
size_t i=0; i < localCount; i++)
119 globalIds[i] = offset++;
124 double tolerance = 1.1;
127 std::cout <<
"Imbalance tolerance is " << tolerance << std::endl;
129 Teuchos::ParameterList params(
"test params");
130 params.set(
"debug_level",
"basic_status");
131 params.set(
"debug_procs",
"0");
132 params.set(
"error_check_level",
"debug_mode_assertions");
134 params.set(
"algorithm",
"rcb");
135 params.set(
"imbalance_tolerance", tolerance );
136 params.set(
"num_global_parts", nprocs);
146 inputAdapter_t *ia1 =
new inputAdapter_t(localCount,globalIds,x,y,z,1,1,1);
159 quality_t *metricObject1 =
new quality_t(ia1, ¶ms,
164 metricObject1->printMetrics(cout);
168 scalar_t imb = metricObject1->getObjectCountImbalance();
169 if (imb <= tolerance)
170 std::cout <<
"pass: " << imb << std::endl;
172 std::cout <<
"fail: " << imb << std::endl;
173 std::cout << std::endl;
175 delete metricObject1;
183 scalar_t *
weights =
new scalar_t [localCount];
184 for (
size_t i=0; i < localCount; i++){
185 weights[i] = 1.0 + scalar_t(rank) / scalar_t(nprocs);
190 vector<const scalar_t *>coordVec(2);
191 vector<int> coordStrides(2);
193 coordVec[0] = x; coordStrides[0] = 1;
194 coordVec[1] = y; coordStrides[1] = 1;
196 vector<const scalar_t *>weightVec(1);
197 vector<int> weightStrides(1);
199 weightVec[0] =
weights; weightStrides[0] = 1;
201 inputAdapter_t *ia2=
new inputAdapter_t(localCount, globalIds, coordVec,
202 coordStrides,weightVec,weightStrides);
215 #ifdef HAVE_ZOLTAN2_MPI 216 quality_t *metricObject2 =
new quality_t(ia2, ¶ms,
220 quality_t *metricObject2 =
new quality_t(ia2, ¶ms, problem2->
getComm(),
226 metricObject2->printMetrics(cout);
230 scalar_t imb = metricObject2->getWeightImbalance(0);
231 if (imb <= tolerance)
232 std::cout <<
"pass: " << imb << std::endl;
234 std::cout <<
"fail: " << imb << std::endl;
235 std::cout << std::endl;
237 delete metricObject2;
252 params.set(
"partitioning_objective",
"multicriteria_minimize_total_weight");
256 weights =
new scalar_t [localCount*3];
259 for (
size_t i=0; i < localCount*3; i+=3){
260 weights[i] = 1.0 + rank / nprocs;
261 weights[i+1] = rank<nprocs/2 ? 1 : 2;
262 weights[i+2] = rand()/RAND_MAX +.5;
268 weightStrides.resize(3);
270 weightVec[0] =
weights; weightStrides[0] = 3;
271 weightVec[1] =
weights+1; weightStrides[1] = 3;
272 weightVec[2] =
weights+2; weightStrides[2] = 3;
274 inputAdapter_t *ia3=
new inputAdapter_t(localCount, globalIds, coordVec,
275 coordStrides,weightVec,weightStrides);
288 quality_t *metricObject3 =
new quality_t(ia3, ¶ms, problem3->
getComm(),
293 metricObject3->printMetrics(cout);
297 scalar_t imb = metricObject3->getWeightImbalance(0);
298 if (imb <= tolerance)
299 std::cout <<
"pass: " << imb << std::endl;
301 std::cout <<
"fail: " << imb << std::endl;
302 std::cout << std::endl;
304 delete metricObject3;
309 bool dataHasChanged =
false;
311 params.set(
"partitioning_objective",
"multicriteria_minimize_maximum_weight");
313 problem3->
solve(dataHasChanged);
317 metricObject3 =
new quality_t(ia3, ¶ms, problem3->
getComm(),
320 metricObject3->printMetrics(cout);
321 scalar_t imb = metricObject3->getWeightImbalance(0);
322 if (imb <= tolerance)
323 std::cout <<
"pass: " << imb << std::endl;
325 std::cout <<
"fail: " << imb << std::endl;
326 std::cout << std::endl;
328 delete metricObject3;
330 params.set(
"partitioning_objective",
"multicriteria_balance_total_maximum");
332 problem3->
solve(dataHasChanged);
336 metricObject3 =
new quality_t(ia3, ¶ms, problem3->
getComm(),
339 metricObject3->printMetrics(cout);
340 scalar_t imb = metricObject3->getWeightImbalance(0);
341 if (imb <= tolerance)
342 std::cout <<
"pass: " << imb << std::endl;
344 std::cout <<
"fail: " << imb << std::endl;
345 std::cout << std::endl;
347 delete metricObject3;
363 params.set(
"num_global_parts", nprocs*2);
371 scalar_t partSizes[2];
373 partIds[0] = rank*2; partSizes[0] = 0;
374 partIds[1] = rank*2+1; partSizes[1] = 1;
382 dataHasChanged =
false;
384 problem1->
solve(dataHasChanged);
395 int numInEmptyParts = 0;
396 for (
size_t i=0; i < localCount; i++){
397 if (partAssignments[i] % 2 == 0)
402 std::cout <<
"Request that " << nprocs <<
" parts be empty." <<std::endl;
406 metricObject1 =
new quality_t(ia1, ¶ms,
411 metricObject1->printMetrics(cout);
415 scalar_t imb = metricObject1->getObjectCountImbalance();
416 if (imb <= tolerance)
417 std::cout <<
"pass: " << imb << std::endl;
419 std::cout <<
"fail: " << imb << std::endl;
420 std::cout << std::endl;
422 delete metricObject1;
437 #ifdef HAVE_ZOLTAN2_MPI 442 std::cout <<
"PASS" << std::endl;
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
void setPartSizes(int len, part_t *partIds, scalar_t *partSizes, bool makeCopy=true)
Set or reset relative sizes for the parts that Zoltan2 will create.
A simple class that can be the User template argument for an InputAdapter.
void resetParameters(ParameterList *params)
Reset the list of parameters.
Defines the PartitioningSolution class.
A PartitioningSolution is a solution to a partitioning problem.
RCP< const Comm< int > > getComm()
Return the communicator used by the problem.
BasicVectorAdapter represents a vector (plus optional weights) supplied by the user as pointers to st...
const PartitioningSolution< Adapter > & getSolution()
Get the solution to the problem.
PartitioningProblem sets up partitioning problems for the user.
const part_t * getPartListView() const
Returns the part list corresponding to the global ID list.
Defines the PartitioningProblem class.
A class that computes and returns quality metrics.
Defines the BasicVectorAdapter class.
void solve(bool updateInputData=true)
Direct the problem to create a solution.
int main(int argc, char *argv[])