remove unused variables and other cleanup to get a clean compilation.
[charm.git] / src / conv-com / hypercubetopology.C
1 /**
2    @addtogroup ComlibConverseStrategy
3    @{
4    @file 
5    @brief Hypercube topology
6 */
7
8 #include "hypercubetopology.h"
9
10 inline int neighbor(int pe, int dim)
11 {
12     return(pe ^ (1<<dim));
13 }
14
15 inline int maxdim(int n)
16 {
17     int maxpes=1, dim=0;
18
19     while (maxpes< n) {
20         maxpes *=2;
21         dim++;
22     }
23     if (maxpes==n) return(dim);
24     else return(dim-1);
25 }
26
27 inline int adjust(int dim, int pe)
28 {
29     int mymax=1<<dim;
30     if (pe >= mymax) return(neighbor(pe, dim));
31     else return(pe);
32 }
33
34 HypercubeTopology::HypercubeTopology(int npes, int mype) {
35     
36     int i = 0;
37     NumPes = npes;
38     MyPe = mype;
39     Dim = maxdim(npes);
40
41     next = new int *[Dim];
42     for (i=0;i<Dim;i++) {
43         next[i]=new int[NumPes];
44         for (int j=0;j<NumPes;j++) next[i][j]=-1;
45     }
46     
47     //Create and initialize the indexes to the above table
48     penum=new int[NumPes];
49     int *dp=new int[NumPes];
50     for (i=0;i<NumPes;i++) {
51         penum[i]=0;
52         dp[i]=i;
53     }
54     
55     CreateStageTable(NumPes, dp);
56     delete(dp);
57 }
58
59 void HypercubeTopology::getNeighbors(int &np, int *pelist){
60     np = Dim;
61
62     for(int count = 0; count < Dim; count ++)
63         pelist[count] = MyPe ^ (1 << (Dim - count - 1));
64 }
65
66 int HypercubeTopology::getNumStages(){
67     return Dim;
68 }
69
70 int HypercubeTopology::getNumSteps(int stage) {
71     return 1;
72 }
73
74 void HypercubeTopology::getPesToSend(int step, int stage, int &np, 
75                                      int *pelist, int &nextpe) {
76     if(step > 0) {
77         np = 0;
78         return;
79     }
80
81     np = penum[Dim - stage - 1];
82     memcpy(pelist, next[Dim - stage - 1], np *sizeof(int));
83         
84     nextpe = neighbor(MyPe, Dim - stage - 1);
85 }
86
87 int HypercubeTopology::getNumMessagesExpected(int stage) {
88     return 1;
89 }
90
91 void HypercubeTopology::CreateStageTable(int numpes, int *destpes)
92 {
93     int *dir=new int[numpes];
94     int nextdim, j, i;
95     for (i=0;i<numpes;i++) {
96         dir[i]=MyPe ^ adjust(Dim, destpes[i]);
97     }
98     
99     for (nextdim=Dim-1; nextdim>=0; nextdim--) {
100         int mask=1<<nextdim;
101         for (i=0;i<numpes;i++) {
102             if (dir[i] & mask) {
103                 dir[i]=0;
104                 for (j=0;(j<penum[nextdim]) && (destpes[i]!=next[nextdim][j]);j++);
105                 if (destpes[i]==next[nextdim][j]) { 
106                     //CmiPrintf("EQUAL %d\n", destpes[i]);
107                     continue;
108                 }
109                 next[nextdim][penum[nextdim]]=destpes[i];
110                 penum[nextdim]+=1;
111                 //CmiPrintf("%d next[%d][%d]=%d\n",MyPe, nextdim, penum[nextdim],destpes[i]);
112             }
113         }
114     }
115     delete dir;
116     return;
117 }
118 /*@}*/