checked in Shao Zheng's templated code for building arbitary dimension of Torus.This...
[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 #ifndef _LBTOPOLOGY_H
14 #define _LBTOPOLOGY_H
15
16 #ifdef __cplusplus
17
18 class LBTopology {
19 protected:
20   int npes;
21 public:
22   LBTopology(int p): npes(p) {}
23   virtual ~LBTopology() {}
24   virtual int max_neighbors() = 0;
25   virtual void neighbors(int mype, int* _n, int &nb) = 0;
26   //added by zshao1, these defaults mean the the topology does not support these methods
27   virtual int get_dimension() { return -1;}
28   virtual bool get_processor_coordinates(int processor_id, int* processor_coordinates) { return false; }
29   virtual bool get_processor_id(const int* processor_coordinates, int* processor_id) { return false; }
30   virtual bool coordinate_difference(const int* my_coordinates, const int* target_coordinates, int* difference) { return false;}
31   virtual bool coordinate_difference(int my_processor_id, int target_processor_id, int* difference) { return false; }
32 };
33
34 #define LBTOPO_MACRO(x) \
35   static LBTopology * create##x() {     \
36     return new x(CkNumPes());   \
37   }
38
39 class LBTopo_ring: public LBTopology {
40 public:
41   LBTopo_ring(int p): LBTopology(p) {}
42   virtual int max_neighbors();
43   virtual void neighbors(int mype, int* _n, int &nb);
44 };
45
46 class LBTopo_torus2d: public LBTopology {
47 private:
48   int width;
49   int goodcoor(int, int);
50 public:
51   LBTopo_torus2d(int p);
52   virtual int max_neighbors();
53   virtual void neighbors(int mype, int* _n, int &nb);
54 };
55
56 class LBTopo_torus3d: public LBTopology {
57 private:
58   int width;
59   int goodcoor(int, int, int);
60 public:
61   LBTopo_torus3d(int p);
62   virtual int max_neighbors();
63   virtual void neighbors(int mype, int* _n, int &nb);
64 };
65
66 class LBTopo_graph: public LBTopology {
67 public:
68   LBTopo_graph(int p): LBTopology(p) {}
69   virtual int max_neighbors();
70   virtual void neighbors(int mype, int* _n, int &nb);
71 };
72
73 typedef  LBTopology* (*LBtopoFn)();
74
75 #else
76 typedef  void* (*LBtopoFn)();
77 #endif   /* __cplusplus */
78
79 #ifdef __cplusplus
80 extern "C" {
81 #endif
82 void registerLBTopos();
83 LBtopoFn LBTopoLookup(char *);
84 int getTopoMaxNeighbors(void *topo);
85 void getTopoNeighbors(void *topo, int myid, int* na, int *n);
86 void printoutTopo();
87 #ifdef __cplusplus
88 }
89 #endif
90
91 #endif