merged with Amit's new code with topology info. Fixed include LBSimulation.h. The...
[charm.git] / src / conv-ldb / topology.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /**
9  * \addtogroup CkLdb
10 */
11 /*@{*/
12
13
14 #ifndef _LBTOPOLOGY_H
15 #define _LBTOPOLOGY_H
16
17 #define HOP_LINK_DELAY 10e-6
18 #define HOP_PROC_DELAY 10e-6
19
20 #ifdef __cplusplus
21
22 class LBTopology {
23 protected:
24   int npes;
25 public:
26   LBTopology(int p): npes(p) {}
27   virtual ~LBTopology() {}
28   virtual int max_neighbors() = 0;
29   virtual void neighbors(int mype, int* _n, int &nb) = 0;
30   //added by zshao1, these defaults mean the the topology does not support these methods
31   virtual int get_dimension() { return -1;}
32   virtual bool get_processor_coordinates(int processor_id, int* processor_coordinates) { return false; }
33   virtual bool get_processor_id(const int* processor_coordinates, int* processor_id) { return false; }
34   virtual bool coordinate_difference(const int* my_coordinates, const int* target_coordinates, int* difference) { return false;}
35   virtual bool coordinate_difference(int my_processor_id, int target_processor_id, int* difference) { return false; }
36   virtual int get_hop_count(int src,int dest);
37   virtual int rec_hop_count(int src,int dest,int max_neigh,int count,int *visited_srcs);
38   virtual double per_hop_delay(int last_hop);
39 };
40
41 #define LBTOPO_MACRO(x) \
42   static LBTopology * create##x(int np) {       \
43                 return new x(np);       \
44   }
45
46 class LBTopo_ring: public LBTopology {
47 public:
48   LBTopo_ring(int p): LBTopology(p) {}
49   virtual int max_neighbors();
50   virtual void neighbors(int mype, int* _n, int &nb);
51   virtual int get_hop_count(int src,int dest);
52 };
53
54 class LBTopo_torus2d: public LBTopology {
55 private:
56   int width;
57   int goodcoor(int, int);
58 public:
59   LBTopo_torus2d(int p);
60   virtual int max_neighbors();
61   virtual void neighbors(int mype, int* _n, int &nb);
62   virtual int get_hop_count(int src,int dest);
63 };
64
65 class LBTopo_torus3d: public LBTopology {
66 private:
67   int width;
68   int goodcoor(int, int, int);
69 public:
70   LBTopo_torus3d(int p);
71   virtual int max_neighbors();
72   virtual void neighbors(int mype, int* _n, int &nb);
73 };
74
75 class LBTopo_graph: public LBTopology {
76 public:
77   LBTopo_graph(int p): LBTopology(p) {}
78   virtual int max_neighbors();
79   virtual void neighbors(int mype, int* _n, int &nb);
80 };
81
82 typedef  LBTopology* (*LBtopoFn)(int);
83
84 #else
85 typedef  void* (*LBtopoFn)();
86 #endif   /* __cplusplus */
87
88 #ifdef __cplusplus
89 extern "C" {
90 #endif
91 LBtopoFn LBTopoLookup(char *);
92 int getTopoMaxNeighbors(void *topo);
93 void getTopoNeighbors(void *topo, int myid, int* na, int *n);
94 void printoutTopo();
95 #ifdef __cplusplus
96 }
97 #endif
98
99 #endif