Added support for "long double".
[charm.git] / src / libs / ck-libs / idxl / idxlc.h
1 /**
2  * IDXL--Index List communication library.
3  * C Header file.
4  */
5 #ifndef _CHARM_IDXL_C_H
6 #define _CHARM_IDXL_C_H
7
8 #ifdef __cplusplus
9   extern "C" {
10 #endif
11
12 /** Initialize the IDXL library.  Must have already called MPI_Init. */
13 void IDXL_Init(int comm);
14
15 /** An index list, the fundamental datatype of this library. */
16 typedef int IDXL_t;
17 #define IDXL_DYNAMIC_IDXL_T 1540000000
18 #define IDXL_STATIC_IDXL_T 1550000000
19 #define IDXL_LAST_IDXL_T 1560000000
20
21 /** Create a new, empty index list. Must eventually call IDXL_Destroy on this list. */
22 IDXL_t IDXL_Create(void);
23
24 /** Print the send and recv indices in this communications list: */
25 void IDXL_Print(IDXL_t l);
26
27 /** Copy the indices in src into l. */
28 void IDXL_Copy(IDXL_t l,IDXL_t src);
29
30 /** Shift the indices of this list by this amount. */
31 void IDXL_Shift(IDXL_t l,int startSend,int startRecv);
32
33 /** Add these indices into our list.  Any duplicates will get listed twice.
34  * @param l the list to add indices to.
35  * @param src the list of indices to read from and add.
36  * @param startSend New first index to send from.
37  * @param startRecv New first index to recv values into.
38  */
39 void IDXL_Combine(IDXL_t l,IDXL_t src,int startSend,int startRecv);
40
41 /** Add the intersection of the entities listed in between
42  * to the new entity at newIdx. */
43 void IDXL_Add_entity(IDXL_t l, int newIdx, int nBetween,int *between);
44
45 /** Sort the indices in this list by these 2D coordinates */
46 void IDXL_Sort_2d(IDXL_t l,double *coord2d);
47 /** Sort the indices in this list by these 3D coordinates */
48 void IDXL_Sort_3d(IDXL_t l,double *coord3d);
49
50 /** Throw away this index list */
51 void IDXL_Destroy(IDXL_t l);
52
53
54 /** Extract the indices out of this index list:
55  */
56 typedef int IDXL_Side_t;
57 #define IDXL_SHIFT_SIDE_T_SEND 100000000 /* 16x0000000 */
58 #define IDXL_SHIFT_SIDE_T_RECV 200000000 /* 17x0000000 */
59 IDXL_Side_t IDXL_Get_send(IDXL_t l);
60 IDXL_Side_t IDXL_Get_recv(IDXL_t l);
61 int IDXL_Get_partners(IDXL_Side_t s);
62 int IDXL_Get_partner(IDXL_Side_t s,int partnerNo);
63 int IDXL_Get_count(IDXL_Side_t s,int partnerNo);
64 void IDXL_Get_list(IDXL_Side_t s,int partnerNo,int *list);
65 int IDXL_Get_index(IDXL_Side_t s,int partnerNo,int listIndex);
66 void IDXL_Get_end(IDXL_Side_t l);
67
68 /** Return the chunk this (ghost) local number is received from */
69 int IDXL_Get_source(IDXL_t l,int localNo);
70
71
72 /* Messaging */
73
74 /* datatypes: keep in sync with fem and idxlf.h */
75 #define IDXL_FIRST_DATATYPE 1510000000 /*first valid IDXL datatype*/
76 #define IDXL_BYTE   (IDXL_FIRST_DATATYPE+0)
77 #define IDXL_INT    (IDXL_FIRST_DATATYPE+1) 
78 #define IDXL_REAL   (IDXL_FIRST_DATATYPE+2)
79 #define IDXL_FLOAT IDXL_REAL /*alias*/
80 #define IDXL_DOUBLE (IDXL_FIRST_DATATYPE+3)
81 #define IDXL_INDEX_0 (IDXL_FIRST_DATATYPE+4) /*zero-based integer (c-style indexing) */
82 #define IDXL_INDEX_1 (IDXL_FIRST_DATATYPE+5) /*one-based integer (Fortran-style indexing) */
83 #define IDXL_LONG_DOUBLE (IDXL_FIRST_DATATYPE+6)
84
85 /** An IDXL_Layout_t describes the in-memory layout of a user data array */
86 typedef int IDXL_Layout_t;
87 #define IDXL_FIRST_IDXL_LAYOUT_T 1560000000
88
89 IDXL_Layout_t IDXL_Layout_create(int type,int width);
90 IDXL_Layout_t IDXL_Layout_offset(
91         int type, int width, int offsetBytes, int distanceBytes,int skewBytes);
92
93 int IDXL_Get_layout_type(IDXL_Layout_t l);
94 int IDXL_Get_layout_width(IDXL_Layout_t l);
95 int IDXL_Get_layout_distance(IDXL_Layout_t l);
96
97 void IDXL_Layout_destroy(IDXL_Layout_t l);
98
99 /** IDXL_Comm is the transient representation for an in-progress message exchange.*/
100 typedef int IDXL_Comm_t;
101
102 /** Comm_begin begins a message exchange.  It is currently 
103  * a collective routine, and exactly one exchange can be outstanding;
104  * but these restrictions may be relaxed later. 
105  * @param tag a user-defined "tag" for this exchange.
106  * @param context an MPI communicator, or 0 for the default. 
107  */
108 IDXL_Comm_t IDXL_Comm_begin(int tag, int context); 
109
110 /** Remote-copy this data on flush/wait. If m is zero, includes begin&wait. */
111 void IDXL_Comm_sendrecv(IDXL_Comm_t m,IDXL_t dest, IDXL_Layout_t l, void *data);
112 /** Remote-sum this data on flush/wait. If m is zero, includes begin&wait. */
113 void IDXL_Comm_sendsum(IDXL_Comm_t m,IDXL_t dest, IDXL_Layout_t l, void *data);
114
115 /** Send this data out when flush is called. Must be paired with a recv or sum call */
116 void IDXL_Comm_send(IDXL_Comm_t m,IDXL_t dest, IDXL_Layout_t l, const void *srcData);
117 /** Copy this data from the remote values when wait is called. */
118 void IDXL_Comm_recv(IDXL_Comm_t m,IDXL_t dest, IDXL_Layout_t l, void *destData);
119 /** Add this data with the remote values when wait is called. */
120 void IDXL_Comm_sum(IDXL_Comm_t m,IDXL_t dest, IDXL_Layout_t l, void *sumData);
121
122 /** Send all outgoing data. */
123 void IDXL_Comm_flush(IDXL_Comm_t m);
124
125 /** Block until all communication is complete. This destroys the IDXL_Comm. */
126 void IDXL_Comm_wait(IDXL_Comm_t m);
127
128
129 /* Collective Operations */
130 #define IDXL_FIRST_REDTYPE 1520000000 /*first valid IDXL reduction type*/
131 #define IDXL_SUM (IDXL_FIRST_REDTYPE+0)
132 #define IDXL_PROD (IDXL_FIRST_REDTYPE+1)
133 #define IDXL_MAX (IDXL_FIRST_REDTYPE+2)
134 #define IDXL_MIN (IDXL_FIRST_REDTYPE+3)
135
136
137 #ifdef __cplusplus
138   };
139 #endif
140
141 #endif