Added a new topology (mesh 3D) to simulate a 3D simulation space.
[charm.git] / tests / charm++ / load_balancing / lb_test / Topo.h
1 #ifndef TOPO_H
2 #define TOPO_H
3
4 #include "Topo.decl.h"
5
6 enum { N_BYTES=1000 };
7
8 class TopoInitMsg : public CMessage_TopoInitMsg {
9 public:
10   int elements;
11   int topology;
12   int seed;
13   int min_us;
14   int max_us;
15 };
16
17 enum TopoType { TopoRing, TopoMesh2D, TopoMesh3D, TopoRandGraph, TopoError=-1 };
18
19 static const struct { 
20   const char* name;
21   const char* desc;
22   TopoType id;
23 } TopoTable[] = {
24   { "Ring",
25     "ring - use ring topology",
26     TopoRing },
27   { "Mesh2D", 
28     "mesh2d - construct a 2D mesh, with holes", 
29     TopoMesh2D },
30   { "Mesh3D", 
31     "mesh3d - construct a 3D mesh, with holes", 
32     TopoMesh3D },
33   { "RandGraph", 
34     "randgraph - construct a graph, with 25% of links used",
35     TopoRandGraph },
36   { NULL, NULL, TopoError }
37 };
38
39 class Topo : public Group {
40 public:
41   struct MsgInfo {
42     int obj;
43     int bytes;
44   };
45
46   Topo(CkMigrateMessage *m) {}
47   Topo(TopoInitMsg*);
48   double Work(int indx) { return elemlist[indx].work; };
49   static CkGroupID Create(const int _elem, const char*_topo, 
50                     const int meanms, const int devms);
51   int SendCount(int index);
52   void SendTo(int index, MsgInfo* who);
53   int RecvCount(int index);
54   void RecvFrom(int index, MsgInfo* who);
55
56 private:
57   struct Elem;
58   friend struct Elem;  // Apparently, a private struct can't access another
59                        // private struct without this!
60
61   static int Select(const char*);
62   void FindComputeTimes();
63   void ConstructRing();
64   void ConstructMesh2D();
65   void ConstructMesh3D();
66   void ConstructRandGraph();
67   float gasdev();
68
69   struct Elem {
70     double work;
71     int receiving;
72     int sending;
73     MsgInfo* receivefrom;
74     MsgInfo* sendto;
75   };
76
77   TopoType topo;
78   int elements;
79   int seed;
80   int min_us;
81   int max_us;
82   static Elem* elemlist;
83 };
84
85 #endif