1 /*********************** "private" include file for DRA *****************/
2 #if HAVE_STRING_H
3 #   include <string.h>
4 #endif
5 
6 #include "gacommon.h"
7 #include "draf2c.h"
8 #include "elio.h"
9 #include "macdecls.h"
10 
11 #define MAXDIM GA_MAX_DIM
12 
13 #ifdef FALSE
14 #undef FALSE
15 #endif
16 #ifdef TRUE
17 #undef TRUE
18 #endif
19 #define FALSE (logical) 0
20 #define TRUE  (logical) 1
21 
22 /************************* common constants **********************************/
23 #define DRA_OFFSET     5000 /**< DRA handle offset            */
24 #define DRA_BRD_TYPE  30000 /**< msg type for DRA broadcast   */
25 #define DRA_GOP_TYPE  30001 /**< msg type for DRA sum         */
26 #define DRA_MAX_NAME     72 /**< max length of array name     */
27 #define DRA_MAX_FNAME   248 /**< max length of metafile name  */
28 
29 /************************* common data structures **************************/
30 typedef struct {                 /**< stores basic DRA info */
31     Integer ndim;                /**< dimension of array */
32     Integer dims[MAXDIM];        /**< array dimensions */
33     Integer chunk[MAXDIM];       /**< data layout chunking */
34     Integer layout;              /**< date layout type */
35     int type;                    /**< data type */
36     int mode;                    /**< file/array access permissions */
37     char name[DRA_MAX_NAME+8];   /**< array name */
38     char fname[DRA_MAX_FNAME+8]; /**< metafile name */
39     Integer actv;                /**< is array active ? */
40     Integer indep;               /**< shared/independent files ? */
41     Fd_t fd;                     /**< ELIO meta-file descriptor */
42     Integer numfiles;            /**< # files on open file system */
43     Integer ioprocs;             /**< number of IO procs per node */
44 } disk_array_t;
45 
46 #define MAX_ALGN  1                /**< max # aligned subsections   */
47 #define MAX_UNLG  (2*(MAXDIM-1))   /**< max # unaligned subsections */
48 
49 typedef struct {         /**< object describing DRA/GA section */
50     Integer handle;
51     Integer ndim;
52     Integer lo[MAXDIM];
53     Integer hi[MAXDIM];
54 } section_t;
55 
56 
57 typedef struct {         /**< structure stores arguments for callback f */
58     int op;
59     int transp;
60     Integer ld[MAXDIM];
61     section_t gs_a;
62     section_t ds_a;
63     section_t ds_chunk;
64 } args_t;
65 
66 
67 typedef struct {         /**< stores info associated with DRA request */
68     Integer  d_a;       /**< disk array handle */
69     int num_pending;    /**< number of pending  asynch. I/O ops */
70     Integer list_algn[MAX_ALGN][2*MAXDIM];  /**< coordinates of aligned subsection */
71     Integer list_unlgn[MAX_UNLG][2*MAXDIM]; /**< coordinates of unaligned subsections*/
72     Integer list_cover[MAX_UNLG][2*MAXDIM]; /**< coordinates of "cover" subsections */
73     int        nu;
74     int        na;
75     int        call_id; /**< id of this request */
76 } request_t;
77 
78 typedef struct {
79     char *buf;
80     int op;
81     io_request_t io_req;
82     Integer ga_movhdl;
83     args_t args;
84     int align;
85     int callback;
86 } buf_info;
87 
88 extern disk_array_t *DRA;
89 extern logical dra_debug_flag;
90 
91 /**************************** common macros ********************************/
92 #define PARIO_MAX(a,b) (((a) >= (b)) ? (a) : (b))
93 #define PARIO_MIN(a,b) (((a) <= (b)) ? (a) : (b))
94 
95 #define dai_error pnga_error
96 
97 extern int     dai_read_param(char* filename, Integer d_a);
98 extern void    dai_write_param(char* filename, Integer d_a);
99 extern void    dai_delete_param(char* filename, Integer d_a);
100 extern int     dai_file_config(char* filename);
101 extern logical dai_section_intersect(section_t sref, section_t* sadj);
102 extern int     drai_get_num_serv(void);
103 
104 /* internal fortran calls */
105 extern Integer drai_create(Integer *type, Integer *dim1, Integer *dim2,
106         char *name, char *filename, Integer *mode,
107         Integer *reqdim1, Integer *reqdim2, Integer *d_a);
108 
109 extern Integer ndrai_create(Integer *type, Integer *ndim, Integer dims[],
110         char *name, char *filename, Integer *mode,
111         Integer reqdims[], Integer *d_a);
112 
113 extern Integer drai_open(char *filename, Integer *mode, Integer *d_a);
114 
115 extern Integer drai_inquire(Integer *d_a, Integer *type, Integer *dim1,
116         Integer *dim2, char *name, char *filename);
117 
118 extern Integer ndrai_inquire(Integer *d_a, Integer *type, Integer *ndim,
119         Integer dims[],char *name,char *filename);
120 
121 extern Integer ndrai_create_config(Integer *type, Integer *ndim, Integer dims[],
122         char *name, char *filename, Integer *mode,
123         Integer reqdims[], Integer *numfiles,
124         Integer *numioprocs,   Integer *d_a);
125 
126 /* external fortran calls */
127 #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS
128 extern Integer FATR dra_create_(Integer *type, Integer *dim1, Integer *dim2,
129         char *name, char *filename, Integer *mode, Integer *reqdim1,
130         Integer *reqdim2, Integer *d_a, int nlen, int flen);
131 extern Integer FATR ndra_create_(Integer *type, Integer *ndim, Integer dims[],
132         char *name, char *filename, Integer *mode, Integer  reqdims[],
133         Integer *d_a, int nlen, int flen);
134 extern Integer FATR dra_open_(char *filename, Integer *mode, Integer *d_a,
135         int flen);
136 extern Integer FATR dra_inquire_(Integer *d_a, Integer *type, Integer *dim1,
137         Integer *dim2, char *name, char *filename, int nlen, int flen);
138 extern Integer FATR ndra_inquire_(Integer *d_a, Integer *type, Integer *ndim,
139         Integer dims[], char *name, char *filename, int nlen, int flen);
140 extern Integer ndra_create_config_(Integer *type, Integer *ndim,
141         Integer dims[], char *name, char *filename, Integer *mode,
142         Integer reqdims[], Integer *numfiles, Integer *numioprocs,
143         Integer *d_a, int nlen, int flen);
144 #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */
145 extern Integer FATR dra_create_(Integer *type, Integer *dim1, Integer *dim2,
146         char *name, int nlen, char *filename, int flen, Integer *mode,
147         Integer *reqdim1, Integer *reqdim2, Integer *d_a);
148 extern Integer FATR ndra_create_(Integer *type, Integer *ndim, Integer  dims[],
149         char *name, int nlen, char *filename, int flen, Integer *mode,
150         Integer  reqdims[], Integer *d_a);
151 extern Integer FATR dra_open_(char *filename, int flen, Integer *mode,
152         Integer *d_a);
153 extern Integer FATR dra_inquire_(Integer *d_a, Integer *type, Integer *dim1,
154         Integer *dim2, char *name, int nlen, char *filename, int flen);
155 extern Integer FATR ndra_inquire_(Integer *d_a, Integer *type, Integer *ndim,
156         Integer dims[], char *name, int nlen, char *filename, int flen);
157 extern Integer ndra_create_config_(Integer *type, Integer *ndim,
158         Integer dims[], char *name, int nlen, char *filename, int flen,
159         Integer *mode, Integer reqdims[], Integer *numfiles,
160         Integer *numioprocs, Integer *d_a);
161 #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */
162 
163 extern Integer FATR dra_terminate_();
164 
165 extern Integer FATR dra_init_(
166         Integer *max_arrays,              /* input */
167         DoublePrecision *max_array_size,  /* input */
168         DoublePrecision *tot_disk_space,  /* input */
169         DoublePrecision *max_memory);     /* input */
170 
171 extern Integer FATR dra_probe_(
172         Integer *request,                  /*input*/
173         Integer *status);                   /*output*/
174 
175 extern Integer FATR ndra_write_(
176         Integer *g_a,                      /*input:GA handle*/
177         Integer *d_a,                      /*input:DRA handle*/
178         Integer *request);                 /*output: handle to async oper.*/
179 
180 extern Integer FATR ndra_write_section_(
181         logical *transp,                   /*input:transpose operator*/
182         Integer *g_a,                      /*input:GA handle*/
183         Integer glo[],                     /*input*/
184         Integer ghi[],                     /*input*/
185         Integer *d_a,                      /*input:DRA handle*/
186         Integer dlo[],                     /*input*/
187         Integer dhi[],                     /*input*/
188         Integer *request);                 /*output: async. request id*/
189 
190 extern Integer FATR ndra_read_(Integer* g_a, Integer* d_a, Integer* request);
191 
192 extern Integer FATR ndra_read_section_(
193         logical *transp,                   /*input:transpose operator*/
194         Integer *g_a,                      /*input:GA handle*/
195         Integer glo[],                     /*input*/
196         Integer ghi[],                     /*input*/
197         Integer *d_a,                      /*input:DRA handle*/
198         Integer dlo[],                     /*input*/
199         Integer dhi[],                     /*input*/
200         Integer *request);                  /*output: request id*/
201 
202 extern void FATR dra_print_internals_(Integer *d_a);
203 
204 extern void FATR dra_set_debug_(logical *flag);
205 
206 extern void FATR dra_set_default_config_(Integer *numfiles,
207         Integer *numioprocs);
208 
209 extern Integer FATR dra_delete_(Integer* d_a);
210 
211 extern Integer FATR dra_close_(Integer* d_a);
212 
213 extern void dra_flick_();
214 
215 extern Integer FATR dra_wait_(Integer* request);
216