86 transformed_networkDim(3),
88 transformed_procCoords(NULL),
89 actual_procCoords(NULL),
90 transformed_machine_extent(NULL),
91 actual_machine_extent(NULL),
94 is_transformed(false),
97 actual_machine_extent =
new int[actual_networkDim];
102 group_count =
new part_t[actual_machine_extent[0]];
104 memset(group_count, 0,
sizeof(
part_t) * actual_machine_extent[0]);
107 transformed_networkDim = 1 + actual_machine_extent[1] +
108 actual_machine_extent[2];
109 transformed_machine_extent =
new int[transformed_networkDim];
112 actual_procCoords =
new pcoord_t *[actual_networkDim];
113 transformed_procCoords =
new pcoord_t *[transformed_networkDim];
115 for (
int i = 0; i < actual_networkDim; ++i) {
116 actual_procCoords[i] =
new pcoord_t[this->
numRanks];
117 memset(actual_procCoords[i], 0,
121 pcoord_t *xyz =
new pcoord_t[transformed_networkDim];
123 for (
int i = 0; i < actual_networkDim; ++i)
124 actual_procCoords[i][this->
myRank] = xyz[i];
129 part_t * tmp_vec =
new part_t[actual_machine_extent[0]];
130 memset(tmp_vec, 0,
sizeof(
part_t) * actual_machine_extent[0]);
132 Teuchos::reduceAll<int, part_t>(comm, Teuchos::REDUCE_SUM,
133 actual_machine_extent[0],
138 num_unique_groups = 0;
140 for (
int i = 0; i < actual_machine_extent[0]; ++i) {
141 if (tmp_vec[i] > 0) {
147 delete[] group_count;
148 group_count =
new part_t[num_unique_groups];
151 for (
int i = 0; i < actual_machine_extent[0]; ++i) {
152 if (tmp_vec[i] > 0) {
153 group_count[pos] = tmp_vec[i];
161 gatherMachineCoordinates(this->actual_procCoords,
162 this->actual_networkDim, comm);
182 const Teuchos::ParameterList &pl_ ):
184 transformed_networkDim(3),
185 actual_networkDim(3),
186 transformed_procCoords(NULL),
187 actual_procCoords(NULL),
188 transformed_machine_extent(NULL),
189 actual_machine_extent(NULL),
190 num_unique_groups(0),
192 is_transformed(false),
195 actual_machine_extent =
new int[actual_networkDim];
199 group_count =
new part_t[actual_machine_extent[0]];
201 memset(group_count, 0,
sizeof(
part_t) * actual_machine_extent[0]);
204 actual_procCoords =
new pcoord_t *[actual_networkDim];
205 transformed_procCoords =
new pcoord_t *[transformed_networkDim];
207 pcoord_t *xyz =
new pcoord_t[actual_networkDim];
212 part_t * tmp_vec =
new part_t[actual_machine_extent[0]];
213 memset(tmp_vec, 0,
sizeof(
part_t) * actual_machine_extent[0]);
215 Teuchos::reduceAll<int, part_t>(comm, Teuchos::REDUCE_SUM,
216 actual_machine_extent[0],
221 num_unique_groups = 0;
223 for (
int i = 0; i < actual_machine_extent[0]; ++i) {
224 if (tmp_vec[i] > 0) {
230 delete[] group_count;
231 group_count =
new part_t[num_unique_groups];
234 for (
int i = 0; i < actual_machine_extent[0]; ++i) {
235 if (tmp_vec[i] > 0) {
236 group_count[pos] = tmp_vec[i];
242 const Teuchos::ParameterEntry *pe2 =
243 this->pl->getEntryPtr(
"Machine_Optimization_Level");
247 int optimization_level;
248 optimization_level = pe2->getValue<
int>(&optimization_level);
250 if (optimization_level > 0) {
251 is_transformed =
true;
254 transformed_networkDim = 1 + actual_machine_extent[1] +
255 actual_machine_extent[2];
256 transformed_machine_extent =
new int[transformed_networkDim];
258 transformed_procCoords =
new pcoord_t *[transformed_networkDim];
261 for (
int i = 0; i < transformed_networkDim; ++i) {
262 transformed_procCoords[i] =
new pcoord_t[this->
numRanks];
263 memset(transformed_procCoords[i], 0,
268 int nx = this->actual_machine_extent[0];
269 int ny = this->actual_machine_extent[1];
270 int nz = this->actual_machine_extent[2];
272 const Teuchos::ParameterEntry *pe_x =
273 this->pl->getEntryPtr(
"Machine_X_Stretch");
274 const Teuchos::ParameterEntry *pe_y =
275 this->pl->getEntryPtr(
"Machine_Y_Stretch");
276 const Teuchos::ParameterEntry *pe_z =
277 this->pl->getEntryPtr(
"Machine_Z_Stretch");
285 x_stretch = pe_x->getValue<
int>(&x_stretch);
287 y_stretch = pe_y->getValue<
int>(&y_stretch);
289 z_stretch = pe_z->getValue<
int>(&z_stretch);
292 transformed_procCoords[0][this->
myRank] =
293 x_stretch * xyz[0] * ny * nz;
296 for (
int i = 1; i < 1 + ny; ++i) {
298 transformed_procCoords[i][this->
myRank] = 0;
301 transformed_procCoords[i][this->
myRank] = y_stretch;
304 for (
int i = 1 + ny; i < transformed_networkDim; ++i) {
306 transformed_procCoords[i][this->
myRank] = 0;
308 if (xyz[2] == i - (1 + ny))
309 transformed_procCoords[i][this->
myRank] = z_stretch;
312 this->transformed_machine_extent =
new int[transformed_networkDim];
315 this->transformed_machine_extent[0] = x_stretch * (nx - 1) * ny * nz;
316 for (
int i = 1; i < 1 + ny; ++i) {
317 this->transformed_machine_extent[i] = y_stretch;
319 for (
int i = 1 + ny; i < transformed_networkDim; ++i) {
320 this->transformed_machine_extent[i] = z_stretch;
324 gatherMachineCoordinates(this->transformed_procCoords,
325 this->transformed_networkDim, comm);
331 if (!is_transformed) {
333 for (
int i = 0; i < actual_networkDim; ++i) {
334 actual_procCoords[i] =
new pcoord_t[this->
numRanks];
335 memset(actual_procCoords[i], 0,
339 for (
int i = 0; i < actual_networkDim; ++i)
340 actual_procCoords[i][this->
myRank] = xyz[i];
343 gatherMachineCoordinates(this->actual_procCoords,
344 this->actual_networkDim, comm);
572 virtual bool getHopCount(
int rank1,
int rank2, pcoord_t &hops)
const override {
575 if (is_transformed) {
579 if (this->transformed_procCoords[0][rank1] !=
580 this->transformed_procCoords[0][rank2])
589 for (
int i = 1; i < this->transformed_networkDim; ++i) {
590 if (this->transformed_procCoords[i][rank1] !=
591 this->transformed_procCoords[i][rank2])
600 if (this->actual_procCoords[0][rank1] !=
601 this->actual_procCoords[0][rank2])
610 for (
int i = 1; i < actual_networkDim; ++i) {
611 if (this->actual_procCoords[i][rank1] !=
612 this->actual_procCoords[i][rank2])