changed for immediate msg
[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_mesh3d: public LBTopology {
77 private:
78   int width;
79   int goodcoor(int, int, int);
80 public:
81   LBTopo_mesh3d(int p);
82   virtual int max_neighbors();
83   virtual void neighbors(int mype, int* _n, int &nb);
84 };
85
86 class LBTopo_graph: public LBTopology {
87 public:
88   LBTopo_graph(int p): LBTopology(p) {}
89   virtual int max_neighbors();
90   virtual void neighbors(int mype, int* _n, int &nb);
91 };
92
93 typedef  LBTopology* (*LBtopoFn)(int);
94
95 #else
96 typedef  void* (*LBtopoFn)();
97 #endif   /* __cplusplus */
98
99 #ifdef __cplusplus
100 extern "C" {
101 #endif
102 LBtopoFn LBTopoLookup(char *);
103 int getTopoMaxNeighbors(void *topo);
104 void getTopoNeighbors(void *topo, int myid, int* na, int *n);
105 void printoutTopo();
106 #ifdef __cplusplus
107 }
108 #endif
109
110 #endif