8 #include <Teuchos_RCP.hpp> 9 #include <Teuchos_Array.hpp> 10 #include <Teuchos_GlobalMPISession.hpp> 11 #include <Teuchos_ParameterList.hpp> 12 #include "Teuchos_XMLParameterListHelpers.hpp" 14 #include "Tpetra_MultiVector.hpp" 15 #include <Tpetra_CrsGraph.hpp> 16 #include <Tpetra_Map.hpp> 45 RCP<Zoltan2::Environment> env,
zscalar_t ** &partCenters,
zgno_t & myTasks){
47 int rank = tcomm->getRank();
51 zgno_t numGlobalTasks = nx*ny*nz;
54 myTasks = numGlobalTasks / numProcs;
55 zgno_t taskLeftOver = numGlobalTasks % numProcs;
56 if (
zgno_t(rank) < taskLeftOver ) ++myTasks;
58 zgno_t myTaskBegin = (numGlobalTasks / numProcs) * rank;
59 myTaskBegin += (taskLeftOver <
zgno_t(rank) ? taskLeftOver : rank);
60 zgno_t myTaskEnd = myTaskBegin + myTasks;
64 for(
int i = 0; i < coordDim; ++i){
70 zgno_t *task_communication_xadj_ =
new zgno_t [myTasks+1];
71 zgno_t *task_communication_adj_ =
new zgno_t [myTasks * 6];
75 task_communication_xadj_[0] = 0;
76 for (
zgno_t i = myTaskBegin; i < myTaskEnd; ++i) {
77 task_gnos[i - myTaskBegin] = i;
80 int y = (i / (nx)) % ny;
81 int z = (i / (nx)) / ny;
82 partCenters[0][i - myTaskBegin] = x;
83 partCenters[1][i - myTaskBegin] = y;
84 partCenters[2][i - myTaskBegin] = z;
87 task_communication_adj_[prevNCount++] = i - 1;
90 task_communication_adj_[prevNCount++] = i + 1;
93 task_communication_adj_[prevNCount++] = i - nx;
96 task_communication_adj_[prevNCount++] = i + nx;
99 task_communication_adj_[prevNCount++] = i - nx * ny;
102 task_communication_adj_[prevNCount++] = i + nx * ny;
104 task_communication_xadj_[i+1 - myTaskBegin] = prevNCount;
110 RCP<const mytest_map_t> map = rcp (
new mytest_map_t (numGlobalTasks, myTasks, 0, tcomm));
116 for (
zgno_t lclRow = 0; lclRow < myTasks; ++lclRow) {
117 const zgno_t gblRow = map->getGlobalElement (lclRow);
118 zgno_t begin = task_communication_xadj_[lclRow];
119 zgno_t end = task_communication_xadj_[lclRow + 1];
120 const ArrayView< const zgno_t > indices(task_communication_adj_+begin, end-begin);
121 TpetraCrsGraph->insertGlobalIndices(gblRow, indices);
123 TpetraCrsGraph->fillComplete ();
126 return TpetraCrsGraph;
131 RCP<const mytest_map_t> map,
134 const int coord_dim = 3;
135 Teuchos::Array<Teuchos::ArrayView<const zscalar_t> > coordView(coord_dim);
138 Teuchos::ArrayView<const zscalar_t> a(partCenters[0], myTasks);
140 Teuchos::ArrayView<const zscalar_t> b(partCenters[1], myTasks);
142 Teuchos::ArrayView<const zscalar_t> c(partCenters[2], myTasks);
146 Teuchos::ArrayView<const zscalar_t> a;
151 RCP<mytest_tMVector_t> coords(
new mytest_tMVector_t(map, coordView.view(0, coord_dim), coord_dim));
152 RCP<const mytest_tMVector_t> const_coords = rcp_const_cast<
const mytest_tMVector_t>(coords);
159 Teuchos::RCP<const Teuchos::Comm<int> > tcomm = global_tcomm;
161 Teuchos::ParameterList distributed_problemParams;
163 distributed_problemParams.set(
"Machine_Optimization_Level", 10);
164 distributed_problemParams.set(
"mapping_algorithm",
"geometric");
165 distributed_problemParams.set(
"distributed_input_adapter",
true);
166 distributed_problemParams.set(
"mj_enable_rcb",
true);
167 distributed_problemParams.set(
"algorithm",
"multijagged");
168 distributed_problemParams.set(
"num_global_parts", numProcs);
170 RCP<Zoltan2::Environment> env (
new Zoltan2::Environment(distributed_problemParams, global_tcomm));
172 env->setTimer(timer);
178 RCP<mytest_tcrsGraph_t> distributed_tpetra_graph =
create_tpetra_input_matrix(nx, ny, nz, numProcs, tcomm, env, partCenters, myTasks);
179 RCP<const mytest_map_t> distributed_map = distributed_tpetra_graph->getMap();
180 global_tcomm->barrier();
184 RCP<const mytest_tcrsGraph_t> const_tpetra_graph = rcp_const_cast<
const mytest_tcrsGraph_t>(distributed_tpetra_graph);
188 RCP <Zoltan2::XpetraMultiVectorAdapter<mytest_tMVector_t> > distributed_adapter =
create_multi_vector_adapter(distributed_map, partCenters, myTasks);
189 ia->setCoordinateInput(distributed_adapter.getRawPtr());
191 global_tcomm->barrier();
206 partitioning_problem.
solve();
214 Teuchos::ArrayView< const zgno_t> gids = distributed_map->getNodeElementList();
216 ArrayRCP<int> initial_part_ids(myTasks);
217 for (
zgno_t i = 0; i < myTasks; ++i){
218 initial_part_ids[i] = gids[i];
220 single_phase_mapping_solution.
setParts(initial_part_ids);
237 distributed_map_problem_1.
solve(
true);
238 distributed_map_problem_2.solve(
true);
239 distributed_map_problem_3.solve(
true);
247 timer->printAndResetToZero();
253 RCP<quality_t> metricObject_1 = rcp(
new quality_t(ia.getRawPtr(),&distributed_problemParams,global_tcomm,msoln1, distributed_map_problem_1.getMachine().getRawPtr()));
255 RCP<quality_t> metricObject_2 = rcp(
new quality_t(ia.getRawPtr(),&distributed_problemParams,global_tcomm,msoln2, distributed_map_problem_2.getMachine().getRawPtr()));
257 RCP<quality_t> metricObject_3 = rcp(
new quality_t(ia.getRawPtr(),&distributed_problemParams,global_tcomm,msoln3, distributed_map_problem_3.getMachine().getRawPtr()));
260 if (global_tcomm->getRank() == 0){
261 std::cout <<
"METRICS FOR THE FIRST CASE - TWO PHASE MAPPING" << std::endl;
262 metricObject_1->printMetrics(cout);
263 std::cout <<
"METRICS FOR THE SECOND CASE - TWO PHASE MAPPING - INITIAL ASSIGNMENT ARE ASSUMED TO BE A PART" << std::endl;
264 metricObject_2->printMetrics(cout);
265 std::cout <<
"METRICS FOR THE THIRD CASE - ONE PHASE MAPPING - EACH ELEMENT IS ASSUMED TO BE IN UNIQUE PART AT THE BEGINNING" << std::endl;
266 metricObject_3->printMetrics(cout);
274 Teuchos::RCP<const Teuchos::Comm<int> > serial_comm = Teuchos::createSerialComm<int>();
278 Teuchos::ParameterList serial_problemParams;
280 serial_problemParams.set(
"Machine_Optimization_Level", 10);
281 serial_problemParams.set(
"mapping_algorithm",
"geometric");
282 serial_problemParams.set(
"distributed_input_adapter",
false);
283 serial_problemParams.set(
"algorithm",
"multijagged");
284 serial_problemParams.set(
"num_global_parts", numProcs);
288 env->setTimer(timer);
294 RCP<mytest_tcrsGraph_t> serial_tpetra_graph =
create_tpetra_input_matrix(nx, ny, nz, numProcs, serial_comm, env, partCenters, myTasks);
295 RCP<const mytest_map_t> serial_map = serial_tpetra_graph->getMap();
296 global_tcomm->barrier();
300 RCP<const mytest_tcrsGraph_t> const_tpetra_graph = rcp_const_cast<
const mytest_tcrsGraph_t>(serial_tpetra_graph);
304 RCP <Zoltan2::XpetraMultiVectorAdapter<mytest_tMVector_t> > serial_adapter =
create_multi_vector_adapter(serial_map, partCenters, myTasks);
305 ia->setCoordinateInput(serial_adapter.getRawPtr());
307 global_tcomm->barrier();
329 Teuchos::ArrayView< const zgno_t> gids = serial_map->getNodeElementList();
331 ArrayRCP<int> initial_part_ids(myTasks);
332 for (
zgno_t i = 0; i < myTasks; ++i){
333 initial_part_ids[i] = gids[i];
335 single_phase_mapping_solution.
setParts(initial_part_ids);
347 serial_map_problem.
solve(
true);
353 timer->printAndResetToZero();
361 RCP<quality_t> metricObject_3 = rcp(
new quality_t(ia.getRawPtr(),&serial_problemParams,serial_comm,msoln3, serial_map_problem.getMachine().getRawPtr()));
363 if (global_tcomm->getRank() == 0){
364 std::cout <<
"METRICS FOR THE SERIAL CASE - ONE PHASE MAPPING - EACH ELEMENT IS ASSUMED TO BE IN UNIQUE PART AT THE BEGINNING" << std::endl;
365 metricObject_3->printMetrics(cout);
369 int main(
int argc,
char *argv[]){
372 Teuchos::GlobalMPISession session(&argc, &argv);
373 Teuchos::RCP<const Teuchos::Comm<int> > global_tcomm = Teuchos::DefaultComm<int>::getComm();
375 int nx = 16, ny = 16, nz = 16;
376 for (
int i = 1 ; i < argc ; ++i ) {
377 if ( 0 == strcasecmp( argv[i] ,
"NX" ) ) {
378 nx = atoi( argv[++i] );
380 else if ( 0 == strcasecmp( argv[i] ,
"NY" ) ) {
381 ny = atoi( argv[++i] );
383 else if ( 0 == strcasecmp( argv[i] ,
"NZ" ) ) {
384 nz = atoi( argv[++i] );
387 std::cerr <<
"Unrecognized command line argument #" << i <<
": " << argv[i] << std::endl ;
396 Teuchos::RCP<const Teuchos::Comm<int> > serial_comm = Teuchos::createSerialComm<int>();
402 part_t my_parts = 0, *my_result_parts;
405 std::cout <<
"me:" << global_tcomm->getRank() <<
" my_parts:" << my_parts <<
" myTasks:" << myTasks << std::endl;
406 if (global_tcomm->getRank() == 0) {
410 FILE *f2 = fopen(
"plot.gnuplot",
"w");
411 for (
int i = 0; i< global_tcomm->getSize(); ++i){
413 sprintf(str,
"coords%d.txt", i);
415 fprintf(f2,
"splot \"%s\"\n", str);
418 fprintf(f2,
"replot \"%s\"\n", str);
421 fprintf(f2,
"pause-1\n");
425 int myrank = global_tcomm->getRank();
426 sprintf(str,
"coords%d.txt", myrank);
427 FILE *coord_files = fopen(str,
"w");
430 for (
int j = 0; j < my_parts; ++j){
431 int findex = my_result_parts[j];
432 std::cout <<
"findex " << findex << std::endl;
433 fprintf(coord_files,
"%lf %lf %lf\n", partCenters[0][findex], partCenters[1][findex], partCenters[2][findex]);
439 if (global_tcomm->getRank() == 0){
440 cout <<
"PASS" << endl;
443 catch(std::string &s){
RCP< Zoltan2::XpetraMultiVectorAdapter< mytest_tMVector_t > > create_multi_vector_adapter(RCP< const mytest_map_t > map, zscalar_t **partCenters, zgno_t myTasks)
Time an algorithm (or other entity) as a whole.
Zoltan2::XpetraCrsGraphAdapter< mytest_tcrsGraph_t, mytest_tMVector_t > mytest_adapter_t
MappingInputDistributution
Tpetra::CrsGraph< zlno_t, zgno_t, znode_t > mytest_tcrsGraph_t
PartitionMapping maps a solution or an input distribution to ranks.
void solve(bool updateInputData=true)
Direct the problem to create a solution.
mytest_adapter_t::part_t mytest_part_t
Provides access for Zoltan2 to Xpetra::CrsGraph data.
common code used by tests
Tpetra::Map ::node_type mytest_znode_t
void test_distributed_input_adapter(int nx, int ny, int nz, Teuchos::RCP< const Teuchos::Comm< int > > global_tcomm)
Tpetra::Map< zlno_t, zgno_t, mytest_znode_t > mytest_map_t
Defines the XpetraMultiVectorAdapter.
Defines XpetraCrsGraphAdapter class.
SparseMatrixAdapter_t::part_t part_t
void test_serial_input_adapter(int nx, int ny, int nz, Teuchos::RCP< const Teuchos::Comm< int > > global_tcomm)
A PartitioningSolution is a solution to a partitioning problem.
Defines the EvaluatePartition class.
int main(int argc, char *argv[])
InputTraits< User >::part_t part_t
The user parameters, debug, timing and memory profiling output objects, and error checking methods...
An adapter for Xpetra::MultiVector.
void setParts(ArrayRCP< part_t > &partList)
The algorithm uses setParts to set the solution.
Tpetra::MultiVector< zscalar_t, zlno_t, zgno_t, znode_t > mytest_tMVector_t
Defines the MappingSolution class.
PartitioningProblem sets up partitioning problems for the user.
RCP< mytest_tcrsGraph_t > create_tpetra_input_matrix(int nx, int ny, int nz, int numProcs, Teuchos::RCP< const Teuchos::Comm< int > > tcomm, RCP< Zoltan2::Environment > env, zscalar_t **&partCenters, zgno_t &myTasks)
Defines the PartitioningProblem class.
MappingProblem enables mapping of a partition (either computed or input) to MPI ranks.
A class that computes and returns quality metrics.
void solve(bool updateInputData=true)
Direct the problem to create a solution.
Declarations for TimerManager.
Defines the MappingProblem class.