Fixed a bug in get_hop_count
[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,int min_hop_cnt);
38   virtual double per_hop_delay(int last_hop);
39   virtual void get_pairwise_hop_count(double **dist);
40 };
41
42 #define LBTOPO_MACRO(x) \
43   static LBTopology * create##x(int np) {       \
44                 return new x(np);       \
45   }
46
47 class LBTopo_ring: public LBTopology {
48 public:
49   LBTopo_ring(int p): LBTopology(p) {}
50   virtual int max_neighbors();
51   virtual void neighbors(int mype, int* _n, int &nb);
52   virtual int get_hop_count(int src,int dest);
53 };
54
55 class LBTopo_torus2d: public LBTopology {
56 private:
57   int width;
58   int goodcoor(int, int);
59 public:
60   LBTopo_torus2d(int p);
61   virtual int max_neighbors();
62   virtual void neighbors(int mype, int* _n, int &nb);
63   virtual int get_hop_count(int src,int dest);
64 };
65
66 class LBTopo_torus3d: public LBTopology {
67 private:
68   int width;
69   int goodcoor(int, int, int);
70 public:
71   LBTopo_torus3d(int p);
72   virtual int max_neighbors();
73   virtual void neighbors(int mype, int* _n, int &nb);
74 };
75
76 class LBTopo_graph: public LBTopology {
77 public:
78   LBTopo_graph(int p): LBTopology(p) {}
79   virtual int max_neighbors();
80   virtual void neighbors(int mype, int* _n, int &nb);
81 };
82
83 typedef  LBTopology* (*LBtopoFn)(int);
84
85 #else
86 typedef  void* (*LBtopoFn)();
87 #endif   /* __cplusplus */
88
89 #ifdef __cplusplus
90 extern "C" {
91 #endif
92 LBtopoFn LBTopoLookup(char *);
93 int getTopoMaxNeighbors(void *topo);
94 void getTopoNeighbors(void *topo, int myid, int* na, int *n);
95 void printoutTopo();
96 #ifdef __cplusplus
97 }
98 #endif
99
100 #endif