aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Topology.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/src/Topology.c b/src/Topology.c
index e9b5592..4849ba9 100644
--- a/src/Topology.c
+++ b/src/Topology.c
@@ -243,7 +243,7 @@ static int FranksTopology(int dim,
int max_dir, max_length;
int free_procs = total_procs-1;
int used_procs = 1;
-
+ int *my_nprocs = (int*)malloc(dim*sizeof(int));
/* Nothing to decompose here */
if (dim == 0)
@@ -251,20 +251,11 @@ static int FranksTopology(int dim,
return TraditionalTopology(dim, total_procs, nsize,
nghostzones, nprocs);
}
- /* If there are numbers already set up or we have funny grid sizes,
- fall back */
- for (i = 0; i < dim; i++)
- {
- if (nprocs[i] || (nsize[i]<1))
- {
- return TraditionalTopology(dim, total_procs, nsize,
- nghostzones, nprocs);
- }
- }
+
/* start with a single domain */
for (i = 0; i < dim; i++)
{
- nprocs[i] = 1;
+ my_nprocs[i] = 1;
}
/* divide as long as there are processors left */
while (free_procs)
@@ -276,13 +267,13 @@ static int FranksTopology(int dim,
for (i = 0; i < dim; i++)
{
/* is one part larger than the max? (then it might be a new max) */
- if ((nsize[i] / nprocs[i] > max_length) &&
+ if ((nsize[i] / my_nprocs[i] > max_length) &&
/* would there be at least one real point if we divide? */
- (nsize[i] > 2*nghostzones[i]+nprocs[i]) &&
+ (nsize[i] > 2*nghostzones[i]+my_nprocs[i]) &&
/* do we have enough processors left to divide in this direction? */
- (used_procs/nprocs[i] <= free_procs))
+ (used_procs/my_nprocs[i] <= free_procs))
{
- max_length = nsize[i] / nprocs[i];
+ max_length = nsize[i] / my_nprocs[i];
max_dir = i;
}
}
@@ -291,11 +282,10 @@ static int FranksTopology(int dim,
{
for (i = 0; i < dim; i++)
{
- nprocs[i] = 0;
+ my_nprocs[i] = 0;
}
CCTK_WARN(CCTK_WARN_COMPLAIN,
- "Falling back to the old PUGH topology method, overwriting "
- "eventually set manual topologies");
+ "Falling back to the old PUGH topology method");
return TraditionalTopology(dim, total_procs, nsize,
nghostzones, nprocs);
}
@@ -303,8 +293,24 @@ static int FranksTopology(int dim,
/* note: this is garanteed to decrement at least by one, since the number
of used processors is naturally always >= the number of processors used
for one dimension */
- free_procs -= used_procs/nprocs[max_dir];
- nprocs[max_dir]++;
+ free_procs -= used_procs/my_nprocs[max_dir];
+ my_nprocs[max_dir]++;
+ }
+ /* If there are numbers already set up which are different from what
+ we arrive at or we have funny grid sizes, fall back */
+ for (i = 0; i < dim; i++)
+ {
+ if (nprocs[i] && (nprocs[i]!=my_nprocs[i]) || (nsize[i]<1))
+ {
+ CCTK_WARN(CCTK_WARN_COMPLAIN,
+ "Falling back to the old PUGH topology method");
+ return TraditionalTopology(dim, total_procs, nsize,
+ nghostzones, nprocs);
+ }
+ }
+ for (i = 0; i < dim; i++)
+ {
+ nprocs[i] = my_nprocs[i];
}
/* success */
return 0;