Zoltan2
block.cpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Zoltan2: A package of combinatorial algorithms for scientific computing
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Karen Devine (kddevin@sandia.gov)
39 // Erik Boman (egboman@sandia.gov)
40 // Siva Rajamanickam (srajama@sandia.gov)
41 //
42 // ***********************************************************************
43 //
44 // @HEADER
45 
53 
54 using namespace std;
55 
62 int main(int argc, char *argv[])
63 {
64 #ifdef HAVE_ZOLTAN2_MPI
65  MPI_Init(&argc, &argv);
66  int rank, nprocs;
67  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
68  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
69 #else
70  int rank=0, nprocs=1;
71 #endif
72 
73  // For convenience, we'll use the Tpetra defaults for local/global ID types
74  // Users can substitute their preferred local/global ID types
75  typedef Tpetra::Map<> Map_t;
76  typedef Map_t::local_ordinal_type localId_t;
77  typedef Map_t::global_ordinal_type globalId_t;
78  typedef double scalar_t;
79 
81  // Generate some input data.
82 
83  size_t localCount = 40*(rank+1);
84  globalId_t *globalIds = new globalId_t [localCount];
85 
86  if (rank==0)
87  for (int i=0, num=40; i <= nprocs ; i++, num+=40)
88  cout << "Rank " << i << " has " << num << " ids." << endl;
89 
90  globalId_t offset = 0;
91  for (int i=1; i <= rank; i++)
92  offset += 40*i;
93 
94  for (size_t i=0; i < localCount; i++)
95  globalIds[i] = offset++;
96 
98  // Create a Zoltan2 input adapter with no weights
99 
100  // TODO explain
102 
103  // TODO explain
104  typedef Zoltan2::BasicIdentifierAdapter<myTypes> inputAdapter_t;
105 
106  std::vector<const scalar_t *> noWeights;
107  std::vector<int> noStrides;
108 
109  inputAdapter_t ia(localCount, globalIds, noWeights, noStrides);
110 
112  // Create parameters for an Block problem
113 
114  Teuchos::ParameterList params("test params");
115  params.set("debug_level", "basic_status");
116  params.set("debug_procs", "0");
117  params.set("error_check_level", "debug_mode_assertions");
118 
119  params.set("algorithm", "block");
120  params.set("imbalance_tolerance", 1.1);
121  params.set("num_global_parts", nprocs);
122 
124  // Create a Zoltan2 partitioning problem
125 
128 
130  // Solve the problem
131 
132  problem->solve();
133 
135  // Check the solution.
136 
137  if (rank == 0)
138  problem->printMetrics(cout);
139 
140  if (rank == 0)
141  cout << "PASS" << endl;
142 
143  delete [] globalIds;
144  delete problem;
145 #ifdef HAVE_ZOLTAN2_MPI
146  MPI_Finalize();
147 #endif
148 }
149 
A simple class that can be the User template argument for an InputAdapter.
Defines the PartitioningSolution class.
This class represents a collection of global Identifiers and their associated weights, if any.
void printMetrics(std::ostream &os) const
Print the array of metrics.
Defines the BasicIdentifierAdapter class.
PartitioningProblem sets up partitioning problems for the user.
Defines the PartitioningProblem class.
void solve(bool updateInputData=true)
Direct the problem to create a solution.
int main(int argc, char *argv[])
Definition: block.cpp:62