Merge branch 'charm' of charmgit:charm into charm
[charm.git] / src / conv-com / gridrouter.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /**
9    @addtogroup ConvComlibRouter
10    @{
11    @file 
12    @brief Class for grid based routing 
13 */
14
15
16 #ifndef _GRIDROUTER_H
17 #define _GRIDROUTER_H
18
19 #include <math.h>
20 //#include <converse.h>
21 #include "petable.h"
22
23 #define ROWLEN COLLEN
24 #define RowLen(pe) ColLen(pe)
25 #define PELISTSIZE ((ROWLEN-1)/sizeof(int)+1)
26
27 inline int ColLen(int npes)
28 {
29   int len= (int)sqrt((double)npes);
30   if (npes > (len*len)) len++;
31   return(len);
32 }
33
34 inline int Expect(int pe, int npes)
35 {
36   int i, len=ColLen(npes);
37   for (i=len-1;i>=0;i--) {
38         int myrow=pe/len;
39         int toprep=i*len;
40         int offset=pe-myrow*len;
41         if ((toprep+offset) <= (npes-1)) return(i+1);
42   }
43   return(len);
44 }
45
46 #include "persistent.h"
47
48 //Grid based router
49 class GridRouter : public Router
50 {
51  private:
52     PeTable *PeMesh, *PeMesh1, *PeMesh2;
53     int *onerow, *gpes, 
54         *rowVector, *colVector, 
55         *growVector, *gcolVector;
56
57     int myrow, mycol;
58     int rvecSize, cvecSize;
59     int MyPe, NumPes, COLLEN;
60     int LPMsgCount, LPMsgExpected;
61     int recvExpected, recvCount;
62     void InitVars();
63     void LocalProcMsg(comID id); 
64     void sendRow(comID id);
65     
66  public:
67     GridRouter(int, int, Strategy*);
68     ~GridRouter();
69     void NumDeposits(comID, int);
70     
71     void EachToAllMulticast(comID , int , void *, int);
72     void EachToManyMulticast(comID , int , void *, int, int *, int);
73     void EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq);
74         
75     void RecvManyMsg(comID, char *);
76     void ProcManyMsg(comID, char *);
77     void DummyEP(comID id, int);
78     void ProcMsg(int, msgstruct **) {;}
79     void SetMap(int *);
80 };
81
82 #endif
83
84 /*@}*/