115 void partition(
const RCP<PartitioningSolution<Adapter> > &solution)
117 env->debug(DETAILED_STATUS, std::string(
"Entering AlgBlock"));
119 int rank = env->myRank_;
120 int nprocs = env->numProcs_;
129 IdentifierModel<typename Adapter::base_adapter_t> ids(adapter, env, problemComm, modelFlag);
130 size_t numGnos = ids.getLocalNumIdentifiers();
132 ArrayView<const gno_t> idList;
133 typedef StridedData<lno_t, scalar_t> input_t;
134 ArrayView<input_t> wgtList;
136 ids.getIdentifierList(idList, wgtList);
139 bool uniformWeights = (wgtList.size() == 0);
146 const Teuchos::ParameterList &pl = env->getParameters();
147 const Teuchos::ParameterEntry *pe;
149 pe = pl.getEntryPtr(
"partitioning_objective");
151 std::string po = pe->getValue<std::string>(&po);
152 if (po == std::string(
"balance_object_count"))
153 uniformWeights =
true;
156 double imbalanceTolerance=1.1;
157 pe = pl.getEntryPtr(
"imbalance_tolerance");
158 if (pe) imbalanceTolerance = pe->getValue<
double>(&imbalanceTolerance);
164 size_t numGlobalParts = solution->getTargetGlobalNumberOfParts();
166 Array<scalar_t> part_sizes(numGlobalParts);
168 if (solution->criteriaHasUniformPartSizes(0))
169 for (
unsigned int i=0; i<numGlobalParts; i++)
170 part_sizes[i] = 1.0 / numGlobalParts;
172 for (
unsigned int i=0; i<numGlobalParts; i++)
173 part_sizes[i] = solution->getCriteriaPartSize(0, i);
175 for (
unsigned int i=1; i<numGlobalParts; i++)
176 part_sizes[i] += part_sizes[i-1];
191 if (!uniformWeights) {
192 for (
size_t i=0; i<numGnos; i++)
193 wtsum += wgtList[0][i];
196 wtsum =
static_cast<scalar_t>(numGnos);
198 Array<scalar_t> scansum(nprocs+1, 0);
200 Teuchos::gatherAll<int, scalar_t>(*problemComm, 1, &wtsum, nprocs,
201 scansum.getRawPtr()+1);
205 for (
int i=2; i<=nprocs; i++)
206 scansum[i] += scansum[i-1];
208 scalar_t globalTotalWeight = scansum[nprocs];
210 if (env->getDebugLevel() >= VERBOSE_DETAILED_STATUS) {
211 std::ostringstream oss(
"Part sizes: ");
212 for (
unsigned int i=0; i < numGlobalParts; i++)
213 oss << part_sizes[i] <<
" ";
214 oss << std::endl << std::endl <<
"Weights : ";
215 for (
int i=0; i <= nprocs; i++)
216 oss << scansum[i] <<
" ";
218 env->debug(VERBOSE_DETAILED_STATUS, oss.str());
223 wtsum = scansum[rank];
224 Array<scalar_t> partTotal(numGlobalParts, 0);
225 ArrayRCP<part_t> gnoPart= arcp(
new part_t[numGnos], 0, numGnos);
227 env->memory(
"Block algorithm memory");
229 for (
size_t i=0; i<numGnos; i++){
230 scalar_t gnoWeight = (uniformWeights ? 1.0 : wgtList[0][i]);
234 while (
unsigned(part)<numGlobalParts-1 &&
235 (wtsum+0.5*gnoWeight) > part_sizes[part]*globalTotalWeight)
238 partTotal[part] += gnoWeight;
245 solution->setParts(gnoPart);
247 env->debug(DETAILED_STATUS, std::string(
"Exiting AlgBlock"));