00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _INTMAP_H_
00023 #define _INTMAP_H_
00024 extern int numPes;
00025
00026
00027 class IntMap4 {
00028 private:
00029 int ****Map;
00030 int keyWmax;
00031 int keyXmax;
00032 int keyYmax;
00033 int keyZmax;
00034 int keyStep;
00035 int *stepTable;
00036 public:
00037
00038 IntMap4(int keyW, int keyX, int keyY, int keyZ, int step)
00039 : keyWmax(keyW), keyXmax(keyX), keyYmax(keyY), keyZmax(keyZ), keyStep(step)
00040 {
00041 Map=new int***[keyWmax];
00042 for(int w=0;w<keyWmax;w++)
00043 {
00044 Map[w]= new int**[keyXmax];
00045 for(int x=0;x<keyXmax;x++)
00046 {
00047 Map[w][x]= new int*[keyYmax];
00048 for(int y=0;y<keyYmax;y++)
00049 Map[w][x][y]= new int[keyZmax];
00050 }
00051
00052 }
00053 stepTable= new int [keyXmax*keyStep];
00054 for(int s=0;s<keyXmax*keyStep;s++)
00055 stepTable[s]=s/keyStep;
00056 }
00057 ~IntMap4(){
00058 if(Map!=NULL)
00059 {
00060 for(int w=0;w<keyWmax;w++)
00061 {
00062 for(int x=0;x<keyXmax;x++)
00063 {
00064 for(int y=0;y<keyYmax;y++)
00065 delete [] Map[w][x][y];
00066 delete [] Map[w][x];
00067 }
00068 delete [] Map[w];
00069 }
00070 delete [] Map;
00071 Map=NULL;
00072 }
00073
00074 }
00075
00076 void buildMap(int keyW=1, int keyX=1, int keyY=1, int keyZ=1, int step=1)
00077 {
00078 CkAssert(keyW>0);
00079 CkAssert(keyX>0);
00080 CkAssert(keyY>0);
00081 CkAssert(keyZ>0);
00082 keyWmax=keyW;
00083 keyXmax=keyX;
00084 keyYmax=keyY;
00085 keyZmax=keyZ;
00086 keyStep=step;
00087 Map=new int***[keyWmax];
00088 for(int w=0;w<keyWmax;w++)
00089 {
00090 Map[w]= new int**[keyXmax];
00091 for(int x=0;x<keyXmax;x++)
00092 {
00093 Map[w][x]= new int*[keyYmax];
00094 for(int y=0;y<keyYmax;y++)
00095 Map[w][x][y]= new int[keyZmax];
00096 }
00097 }
00098 stepTable= new int [keyXmax*keyStep];
00099 for(int s=0;s<keyXmax*keyStep;s++)
00100 stepTable[s]=s/keyStep;
00101 }
00102 void pup(PUP::er &p)
00103 {
00104 p|keyWmax;
00105 p|keyXmax;
00106 p|keyYmax;
00107 p|keyZmax;
00108 p|keyStep;
00109 if(p.isUnpacking())
00110 Map=new int***[keyWmax];
00111 for(int w=0;w<keyWmax;w++)
00112 {
00113 if(p.isUnpacking())
00114 Map[w]= new int**[keyXmax];
00115 for(int x=0;x<keyXmax;x++)
00116 {
00117 if(p.isUnpacking())
00118 Map[w][x]= new int*[keyYmax];
00119 for(int y=0;y<keyYmax;y++)
00120 {
00121 if(p.isUnpacking())
00122 Map[w][x][y]= new int[keyZmax];
00123 PUParray(p,Map[w][x][y],keyZmax);
00124 }
00125 }
00126 }
00127 if(p.isUnpacking())
00128 stepTable= new int[keyXmax*keyStep];
00129 PUParray(p,stepTable,keyXmax*keyStep);
00130
00131 }
00132 inline int getWmax(){return(keyWmax);}
00133 inline int getXmax(){return(keyXmax);}
00134 inline int getYmax(){return(keyYmax);}
00135 inline int getZmax(){return(keyZmax);}
00136 inline int get(int W, int X, int Y, int Z) {
00137
00138
00139
00140
00141
00142
00143 #define USE_INT_MAP_MATH
00144 #ifdef USE_INT_MAP_MATH
00145 return(Map[W][X/keyStep][Y/keyStep][Z]);
00146 #else
00147 return(Map[W][stepTable[X]][stepTable[Y]][Z]);
00148 #endif
00149 }
00150
00151 inline void set(int W, int X, int Y, int Z, int value){
00152 CkAssert(W<keyWmax);
00153 CkAssert(X/keyStep<keyXmax);
00154 CkAssert(Y/keyStep<keyYmax);
00155 CkAssert(Z<keyZmax);
00156 CkAssert(numPes>value);
00157 Map[W][X/keyStep][Y/keyStep][Z]=value;
00158 }
00159 void dump()
00160 {
00161 for(int w=0;w<keyWmax;w++)
00162 for(int x=0;x<keyXmax;x++)
00163 for(int y=0;y<keyYmax;y++)
00164 for(int z=0;z<keyZmax;z++)
00165 CkPrintf("%d %d %d %d %d \n",w,x,y,z, get(w,x*keyStep,y*keyStep,z));
00166 }
00167 IntMap4(){keyWmax=0;keyXmax=0; keyYmax=0, keyZmax=0; keyStep=1; Map=NULL;}
00168 };
00169
00170 class IntMap3 {
00171 private:
00172 int ***Map;
00173 int keyXmax;
00174 int keyYmax;
00175 int keyZmax;
00176
00177 public:
00178
00179 IntMap3(int keyX, int keyY, int keyZ, int step)
00180 : keyXmax(keyX), keyYmax(keyY), keyZmax(keyZ)
00181 {
00182 Map=new int**[keyXmax];
00183 for(int x=0;x<keyXmax;x++)
00184 {
00185 Map[x]= new int*[keyYmax];
00186 for(int y=0;y<keyYmax;y++)
00187 {
00188 Map[x][y]= new int[keyZmax];
00189 memset(Map[x][y],-1,keyZmax*sizeof(int));
00190 }
00191 }
00192 }
00193 ~IntMap3(){
00194 if(Map!=NULL)
00195 {
00196 for(int x=0;x<keyXmax;x++)
00197 {
00198 for(int y=0;y<keyYmax;y++)
00199 delete [] Map[x][y];
00200 delete [] Map[x];
00201 }
00202 Map=NULL;
00203 }
00204
00205 }
00206
00207 void buildMap(int keyX=1, int keyY=1, int keyZ=1, int step=1)
00208 {
00209 CkAssert(keyX>0);
00210 CkAssert(keyY>0);
00211 CkAssert(keyZ>0);
00212 keyXmax=keyX;
00213 keyYmax=keyY;
00214 keyZmax=keyZ;
00215 Map=new int**[keyXmax];
00216 for(int x=0;x<keyXmax;x++)
00217 {
00218 Map[x]= new int*[keyYmax];
00219 for(int y=0;y<keyYmax;y++)
00220 {
00221 Map[x][y]= new int[keyZmax];
00222 memset(Map[x][y],-1,keyZmax*sizeof(int));
00223 }
00224 }
00225 }
00226 void pup(PUP::er &p)
00227 {
00228 p|keyXmax;
00229 p|keyYmax;
00230 p|keyZmax;
00231 if(p.isUnpacking())
00232 Map=new int**[keyXmax];
00233 for(int x=0;x<keyXmax;x++)
00234 {
00235 if(p.isUnpacking())
00236 Map[x]= new int*[keyYmax];
00237 for(int y=0;y<keyYmax;y++)
00238 {
00239 if(p.isUnpacking())
00240 Map[x][y]= new int[keyZmax];
00241 PUParray(p,Map[x][y],keyZmax);
00242 }
00243 }
00244 }
00245 inline int getXmax(){return(keyXmax);}
00246 inline int getYmax(){return(keyYmax);}
00247 inline int getZmax(){return(keyZmax);}
00248 inline int get(int X, int Y, int Z) {
00249 return(Map[X][Y][Z]);
00250 }
00251
00252 inline void set(int X, int Y, int Z, int value){
00253 CkAssert(X<keyXmax);
00254 CkAssert(Y<keyYmax);
00255 CkAssert(Z<keyZmax);
00256 CkAssert(numPes>value);
00257 Map[X][Y][Z]=value;
00258 }
00259 int getCentroid(int torusMap);
00260 void dump()
00261 {
00262 for(int x=0;x<keyXmax;x++)
00263 for(int y=0;y<keyYmax;y++)
00264 for(int z=0;z<keyZmax;z++)
00265 CkPrintf("%d %d %d %d \n",x,y,z, get(x,y,z));
00266 }
00267 IntMap3(){keyXmax=0; keyYmax=0, keyZmax=0; Map=NULL;}
00268 };
00269
00270 class IntMap2on2 {
00271 private:
00272 int **Map;
00273 int keyXmax;
00274 int keyYmax;
00275 public:
00276 IntMap2on2(){keyXmax=0; keyYmax=0; Map=NULL;}
00277 ~IntMap2on2(){
00278 if(Map!=NULL)
00279 {
00280 for(int x=0;x<keyXmax;x++)
00281 delete [] Map[x];
00282 delete [] Map;
00283 Map=NULL;
00284 }
00285 }
00286 IntMap2on2(int keyX, int keyY): keyXmax(keyX), keyYmax(keyY)
00287 {
00288 Map= new int*[keyXmax];
00289 for(int x=0;x<keyXmax;x++)
00290 {
00291 Map[x]= new int[keyYmax];
00292 memset(Map[x],-1,keyYmax*sizeof(int));
00293 }
00294
00295 }
00296 void buildMap(int keyX=1, int keyY=1)
00297 {
00298 CkAssert(keyX>0);
00299 CkAssert(keyY>0);
00300 keyXmax=keyX;
00301 keyYmax=keyY;
00302 Map= new int*[keyXmax];
00303 for(int x=0;x<keyXmax;x++)
00304 {
00305 Map[x]= new int[keyYmax];
00306 memset(Map[x],-1,keyYmax*sizeof(int));
00307 }
00308
00309 }
00310 void pup(PUP::er &p)
00311 {
00312 p|keyXmax;
00313 p|keyYmax;
00314 if(p.isUnpacking())
00315 Map=new int*[keyXmax];
00316 for(int x=0;x<keyXmax;x++)
00317 {
00318 if(p.isUnpacking())
00319 Map[x]= new int[keyYmax];
00320 PUParray(p,Map[x], keyYmax);
00321 }
00322 }
00323 inline int getXmax(){return(keyXmax);}
00324 inline int getYmax(){return(keyYmax);}
00325 int getCentroid(int torusMap);
00326 inline int get(int X, int Y) {
00327
00328
00329
00330
00331 return(Map[X][Y]);
00332 }
00333
00334 inline void set(int X, int Y, int value){
00335 CkAssert(numPes>value);
00336 CkAssert(X<keyXmax);
00337 CkAssert(Y<keyYmax);
00338 Map[X][Y]=value;
00339 }
00340 void dump()
00341 {
00342 for(int x=0;x<keyXmax;x++)
00343 for(int y=0;y<keyYmax;y++)
00344 CkPrintf("%d %d %d \n",x,y, get(x,y));
00345 }
00346 };
00347
00348
00349 class IntMap2on1 {
00350 private:
00351 int *Map;
00352 int keyXmax;
00353 int keyYmax;
00354 int keymax;
00355 public:
00356 ~IntMap2on1(){
00357 if(keymax>0 && Map!=NULL)
00358 {
00359 delete [] Map;
00360 Map=NULL;
00361 }
00362 }
00363 IntMap2on1(){keyXmax=0; keyYmax=0; keymax=0;Map=NULL;}
00364 IntMap2on1(int keyX, int keyY): keyXmax(keyX), keyYmax(keyY)
00365 {
00366 CkAssert(keyXmax>0);
00367 CkAssert(keyYmax>0);
00368 CkAssert(keyXmax>keyYmax);
00369 keymax=keyXmax*keyYmax;
00370 Map= new int[keymax];
00371 }
00372 void buildMap(int keyX=1, int keyY=1)
00373 {
00374 CkAssert(keyX>0);
00375 CkAssert(keyY>0);
00376 keyXmax=keyX;
00377 keyYmax=keyY;
00378 CkAssert(keyXmax>keyYmax);
00379 keymax=keyXmax*keyYmax;
00380 Map= new int[keyXmax];
00381 }
00382 void pup(PUP::er &p)
00383 {
00384 p|keyXmax;
00385 p|keyYmax;
00386 p|keymax;
00387 if(p.isUnpacking())
00388 Map=new int[keymax];
00389 PUParray(p,Map,keymax);
00390
00391 }
00392 inline int getXmax(){return(keyXmax);}
00393 inline int getYmax(){return(keyYmax);}
00394 inline int getmax(){return(keymax);}
00395 inline int get(int X, int Y) {
00396
00397
00398
00399
00400 return(Map[Y*keyXmax +X]);
00401 }
00402
00403 inline void set(int X, int Y, int value){
00404 CkAssert(numPes>value);
00405 CkAssert(X<keyXmax);
00406 CkAssert(Y<keyYmax);
00407 Map[Y*keyXmax +X]=value;
00408 }
00409 void dump()
00410 {
00411 for(int x=0;x<keyXmax;x++)
00412 for(int y=0;y<keyYmax;y++)
00413 CkPrintf("%d %d %d \n",x,y, get(x,y));
00414 }
00415 };
00416
00417
00418 #endif
00419