1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 /****************************************************************************/
4 /*                                                                          */
5 /* File:      ddd.h                                                         */
6 /*                                                                          */
7 /* Purpose:   header file for ddd module                                    */
8 /*                                                                          */
9 /* Author:    Klaus Birken                                                  */
10 /*            Rechenzentrum Uni Stuttgart                                   */
11 /*            Universitaet Stuttgart                                        */
12 /*            Allmandring 30                                                */
13 /*            70550 Stuttgart                                               */
14 /*            internet: birken@rus.uni-stuttgart.de                         */
15 /*                                                                          */
16 /*                                                                          */
17 /* History:   93/11/22 kb  begin                                            */
18 /*            94/06/27 kb  revision for usage in C++ context                */
19 /*            94/08/22 kb  major revision, corresp. to Ref.Man. V1.0        */
20 /*            94/09/13 kb  added DDD_Status                                 */
21 /*            95/01/13 kb  added range functionality                        */
22 /*            95/01/16 kb  added Statistics features                        */
23 /*            95/01/18 kb  moved Statistics to dddaddon.h                   */
24 /*            95/02/06 kb  added extended Ifs                               */
25 /*            95/03/08 kb  added UserData features                          */
26 /*            95/03/21 kb  added variable-sized Objects                     */
27 /*            95/05/22 kb  added var-sized AddData features                 */
28 /*            95/11/04 kb  complete redesign of ObjMgr and Registering      */
29 /*            95/11/06 kb  changed parameters of DDD_Init()                 */
30 /*            95/11/15 kb  ddd_hdr with arbitrary offset (started)          */
31 /*            96/01/08 kb  renamed range to attr                            */
32 /*            96/05/12 kb  xfer-unpack rewritten                            */
33 /*            96/06/05 kb  changed handler management                       */
34 /*            96/09/06 kb  xfer-module completely rewritten                 */
35 /*            96/11/28 kb  merged F_FRONTEND functionality from code branch */
36 /*            97/02/10 kb  started with CPP_FRONTEND implementation         */
37 /*            98/01/28 kb  new ddd-environment: Join.                       */
38 /*            98/05/14 kb  redesigned memory handling.                      */
39 /*            98/07/20 kb  new ddd-environment: Prio.                       */
40 /*                                                                          */
41 /* Remarks:                                                                 */
42 /*                                                                          */
43 /****************************************************************************/
44 
45 
46 #ifndef __DDD__
47 #define __DDD__
48 
49 /* for size_t */
50 #include <cstddef>
51 #include <cinttypes>
52 
53 #include <dune/uggrid/parallel/ddd/dddtypes.hh>
54 #include <dune/uggrid/parallel/ddd/dddtypes_impl.hh>
55 
56 #include <dune/uggrid/low/namespace.h>
57 
58 START_UGDIM_NAMESPACE
59 
60 using namespace DDD;
61 
62 #define DDD_VERSION    "1.9"
63 
64 /* F77SYM(lsym,usym) macro is defined in compiler.h. 961127 KB */
65 
66 /****************************************************************************/
67 /*                                                                          */
68 /* compile time constants defining static data size (i.e. arrays)           */
69 /* other constants                                                          */
70 /*                                                                          */
71 /****************************************************************************/
72 
73 
74 
75 /* return types for DDD functions */
76 enum DDD_RET {
77   DDD_RET_OK            = 0,            /* function was executed ok             */
78   DDD_RET_ERROR_UNKNOWN = 1,            /* unknown error condition              */
79   DDD_RET_ERROR_NOMEM   = 2             /* function aborted due to mem shortage */
80 };
81 
82 
83 /* types of elements for StructRegister */
84 /* (use negative values for combination with positive DDD_TYPEs) */
85 enum DDD_ELEM_TYPE {
86   EL_DDDHDR   =  0,                     /* element type: DDD header             */
87   EL_GDATA    = -1,                     /* element type: global data            */
88   EL_LDATA    = -2,                     /* element type: local data             */
89   EL_GBITS    = -3,                     /* element type: bitwise, 1=global      */
90   EL_DATAPTR  = -4,                     /* element type: data pointer           */
91   EL_OBJPTR   = -5,                     /* element type: object pointer         */
92   EL_CONTINUE = -6,                     /* continued element definition list    */
93   EL_END      = -7                      /* end of element definition list       */
94 };
95 
96 
97 
98 
99 
100 
101 /* NOTE: changes must be also done in fddd.f */
102 enum OptConsts {
103   OPT_OFF = 0,
104   OPT_ON
105 };
106 
107 enum OptConstIdent {
108   IDMODE_LISTS = 1,         /* ordering of each identify-tupel is relevant      */
109   IDMODE_SETS               /* ordering of each identify-tupel is not sensitive */
110 };
111 
112 enum OptConstXfer {
113   XFER_SHOW_NONE     = 0x0000,        /* show no statistical infos              */
114   XFER_SHOW_OBSOLETE = 0x0001,        /* show #obsolete xfer-commands           */
115   XFER_SHOW_MEMUSAGE = 0x0002,        /* show sizes of message buffers          */
116   XFER_SHOW_MSGSALL  = 0x0004         /* show message contents by LowComm stats */
117 };
118 
119 enum OptConstJoin {
120   JOIN_SHOW_NONE     = 0x0000,        /* show no statistical infos              */
121   JOIN_SHOW_OBSOLETE = 0x0001,        /* show #obsolete join-commands           */
122   JOIN_SHOW_MEMUSAGE = 0x0002,        /* show sizes of message buffers          */
123   JOIN_SHOW_MSGSALL  = 0x0004         /* show message contents by LowComm stats */
124 };
125 
126 
127 
128 /* direction of interface communication (DDD_IFOneway) */
129 /* NOTE: changes must be also done in fddd.f */
130 enum DDD_IF_DIR {
131   IF_FORWARD  = 1,                     /* communicate from A to B               */
132   IF_BACKWARD = 2                      /* communicate from B to A               */
133 };
134 
135 
136 /* ID of (predefined) standard interface */
137 enum IFConstants {
138   STD_INTERFACE = 0
139 };
140 
141 
142 /* DDD_TYPE DDD_USER_DATA: send stream of bytes with XferAddData */
143 enum XferConstants {
144   /* DDD_TYPE DDD_USER_DATA: send stream of bytes with XferAddData */
145   /* application may add small integers in order to get more
146      stream-of-byte channels, up to DDD_USER_DATA_MAX */
147   DDD_USER_DATA     = 0x4000,
148   DDD_USER_DATA_MAX = 0x4fff,
149 
150 
151   /* additional parameter for user defined handlers in xfer */
152 
153   /* object has been rejected due to RULE C3 */
154   XFER_REJECT  = 0x9000,
155 
156   /* object has been upgraded due to RULE C3 */
157   XFER_UPGRADE,
158 
159   /* object has been downgraded due to PruneDel */
160   XFER_DOWNGRADE,
161 
162   /* object is totally new */
163   XFER_NEW,
164 
165 
166   /* return value for DDD_XferIsPrunedDelete */
167   XFER_PRUNED_TRUE = 0x9100,
168   XFER_PRUNED_FALSE,
169   XFER_PRUNED_ERROR,
170 
171 
172   /* return value for DDD_XferObjIsResent */
173   XFER_RESENT_TRUE = 0x9200,
174   XFER_RESENT_FALSE,
175   XFER_RESENT_ERROR
176 };
177 
178 
179 /* several default modes for priority handling */
180 enum PrioMatrixDefaults {
181   PRIOMERGE_MAXIMUM = 0,
182   PRIOMERGE_MINIMUM
183 };
184 
185 
186 
187 /* constants for management of temporary memory allocation/deletion */
188 enum TMemRequests {
189   TMEM_ANY     = 0x0000,
190   TMEM_MSG,
191   TMEM_OBJLIST,
192   TMEM_CPL,
193 
194   TMEM_XFER    = 0x1000,
195   TMEM_LOWCOMM,
196 
197   TMEM_JOIN    = 0x2000,
198 
199   TMEM_CONS    = 0x3000,
200 
201   TMEM_IDENT   = 0x4000
202 };
203 
204 
205 
206 /****************************************************************************/
207 /*                                                                          */
208 /* data structures and new types                                            */
209 /*                                                                          */
210 /****************************************************************************/
211 
212 
213 /*
214         new DDD types, used during access of DDD functional interface
215  */
216 using DDD_GID = DDD::DDD_GID;
217 static_assert(
218   std::is_same<DDD::DDD_GID, std::uint_least64_t>::value,
219   "printf conversion specifier below expects DDD_GID to be uint_least64_t");
220 #define DDD_GID_FMT "%08" PRIxLEAST64
221 #define DDD_GID_TO_INT(A) (A)
222 
223 using DDD_TYPE = DDD::DDD_TYPE;
224 using DDD_IF = DDD::DDD_IF;
225 using DDD_PROC = DDD::DDD_PROC;
226 using DDD_PRIO = DDD::DDD_PRIO;
227 using DDD_ATTR = DDD::DDD_ATTR;
228 
229 using DDD_OBJ = DDD::DDD_OBJ;
230 using DDD_HEADER = DDD::DDD_HEADER;
231 using DDD_HDR = DDD::DDD_HDR;
232 
233 /* NULL values for DDD types */
234 #define DDD_TYPE_NULL  0
235 #define DDD_PROC_NULL  0
236 #define DDD_PRIO_NULL  0
237 #define DDD_ATTR_NULL  0
238 
239 
240 /* special feature: hybrid reftype at TypeDefine-time */
241 #define DDD_TYPE_BY_HANDLER   127   /* must be > MAX_TYPEDESC */
242 
243 
244 /****************************************************************************/
245 /*                                                                          */
246 /* macros                                                                   */
247 /*                                                                          */
248 /****************************************************************************/
249 
250 
251 /*
252         external access of elements in DDD_HEADER
253  */
254 #define DDD_InfoPriority(ddd_hdr)    ((ddd_hdr)->prio)
255 #define DDD_InfoGlobalId(ddd_hdr)    ((ddd_hdr)->gid)
256 #define DDD_InfoAttr(ddd_hdr)       ((ddd_hdr)->attr)
257 #define DDD_InfoType(ddd_hdr)       ((ddd_hdr)->typ)
258 
259 
260 /****************************************************************************/
261 /*                                                                          */
262 /* declaration of DDD functional interface                                  */
263 /*                                                                          */
264 /****************************************************************************/
265 
266 /*
267         General DDD Module
268  */
269 void     DDD_Init(DDD::DDDContext& context);
270 void     DDD_Exit(DDD::DDDContext& context);
271 void     DDD_Status(const DDD::DDDContext& context);
272 void     DDD_SetOption(DDD::DDDContext& context, DDD_OPTION, int);
273 
274 /*
275         Redirect line-oriented output, new in V1.2
276  */
277 void     DDD_LineOutRegister (void (*func)(const char *s));
278 
279 
280 /*
281         Type Manager Module
282  */
283 
284 DDD_TYPE DDD_TypeDeclare(DDD::DDDContext& context, const char *name);
285 int      DDD_InfoHdrOffset(const DDD::DDDContext& context, DDD_TYPE);
286 void     DDD_TypeDefine(DDD::DDDContext& context, DDD_TYPE, ...);
287 void     DDD_TypeDisplay(const DDD::DDDContext& context, DDD_TYPE);
288 
289 int      DDD_InfoTypes(const DDD::DDDContext& context);
290 
291 
292 /* newstyle, type-secure setting of handlers */
293 void     DDD_SetHandlerLDATACONSTRUCTOR(DDD::DDDContext& context, DDD_TYPE, HandlerLDATACONSTRUCTOR);
294 void     DDD_SetHandlerDESTRUCTOR      (DDD::DDDContext& context, DDD_TYPE, HandlerDESTRUCTOR);
295 void     DDD_SetHandlerDELETE          (DDD::DDDContext& context, DDD_TYPE, HandlerDELETE);
296 void     DDD_SetHandlerUPDATE          (DDD::DDDContext& context, DDD_TYPE, HandlerUPDATE);
297 void     DDD_SetHandlerOBJMKCONS       (DDD::DDDContext& context, DDD_TYPE, HandlerOBJMKCONS);
298 void     DDD_SetHandlerSETPRIORITY     (DDD::DDDContext& context, DDD_TYPE, HandlerSETPRIORITY);
299 void     DDD_SetHandlerXFERCOPY        (DDD::DDDContext& context, DDD_TYPE, HandlerXFERCOPY);
300 void     DDD_SetHandlerXFERDELETE      (DDD::DDDContext& context, DDD_TYPE, HandlerXFERDELETE);
301 void     DDD_SetHandlerXFERGATHER      (DDD::DDDContext& context, DDD_TYPE, HandlerXFERGATHER);
302 void     DDD_SetHandlerXFERSCATTER     (DDD::DDDContext& context, DDD_TYPE, HandlerXFERSCATTER);
303 void     DDD_SetHandlerXFERGATHERX     (DDD::DDDContext& context, DDD_TYPE, HandlerXFERGATHERX);
304 void     DDD_SetHandlerXFERSCATTERX    (DDD::DDDContext& context, DDD_TYPE, HandlerXFERSCATTERX);
305 void     DDD_SetHandlerXFERCOPYMANIP   (DDD::DDDContext& context, DDD_TYPE, HandlerXFERCOPYMANIP);
306 
307 
308 void     DDD_PrioMergeDefault (DDD::DDDContext& context, DDD_TYPE, int);
309 void     DDD_PrioMergeDefine (DDD::DDDContext& context, DDD_TYPE, DDD_PRIO, DDD_PRIO, DDD_PRIO);
310 DDD_PRIO DDD_PrioMerge (DDD::DDDContext& context, DDD_TYPE, DDD_PRIO, DDD_PRIO);
311 void     DDD_PrioMergeDisplay (DDD::DDDContext& context, DDD_TYPE);
312 
313 
314 
315 /*
316         Object Properties
317  */
318 void     DDD_PrioritySet(DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
319 void     DDD_AttrSet (DDD_HDR, DDD_ATTR); /* this shouldn't be allowed */
320 int  *   DDD_InfoProcList (DDD::DDDContext& context, DDD_HDR);
321 DDD_PROC DDD_InfoProcPrio(const DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
322 bool     DDD_InfoIsLocal(const DDD::DDDContext& context, DDD_HDR);
323 int      DDD_InfoNCopies(const DDD::DDDContext& context, DDD_HDR);
324 size_t   DDD_InfoCplMemory(const DDD::DDDContext& context);
325 
326 
327 
328 /*
329         Identification Environment Module
330  */
331 
332 void     DDD_IdentifyBegin(DDD::DDDContext& context);
333 DDD_RET  DDD_IdentifyEnd(DDD::DDDContext& context);
334 void     DDD_IdentifyNumber(DDD::DDDContext& context, DDD_HDR, DDD_PROC, int);
335 void     DDD_IdentifyString(DDD::DDDContext& context, DDD_HDR, DDD_PROC, char *);
336 void     DDD_IdentifyObject(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_HDR);
337 
338 
339 /*
340         Interface Module
341  */
342 
343 DDD_IF   DDD_IFDefine (DDD::DDDContext& context, int, DDD_TYPE O[], int, DDD_PRIO A[], int, DDD_PRIO B[]);
344 void     DDD_IFSetName (DDD::DDDContext& context, DDD_IF, const char *);
345 
346 void     DDD_IFDisplayAll(const DDD::DDDContext& context);
347 void     DDD_IFDisplay(const DDD::DDDContext& context, DDD_IF);
348 size_t   DDD_IFInfoMemoryAll(const DDD::DDDContext& context);
349 size_t   DDD_IFInfoMemory(const DDD::DDDContext& context, DDD_IF);
350 void     DDD_IFRefreshAll(DDD::DDDContext& context);
351 
352 void     DDD_IFExchange   (DDD::DDDContext& context, DDD_IF,                    size_t, ComProcPtr2,ComProcPtr2);
353 void     DDD_IFOneway     (DDD::DDDContext& context, DDD_IF,         DDD_IF_DIR,size_t, ComProcPtr2,ComProcPtr2);
354 void     DDD_IFExecLocal  (DDD::DDDContext& context, DDD_IF,                            ExecProcPtr);
355 void     DDD_IFAExchange  (DDD::DDDContext& context, DDD_IF,DDD_ATTR,           size_t, ComProcPtr2,ComProcPtr2);
356 void     DDD_IFAOneway    (DDD::DDDContext& context, DDD_IF,DDD_ATTR,DDD_IF_DIR,size_t, ComProcPtr2,ComProcPtr2);
357 void     DDD_IFAExecLocal (DDD::DDDContext& context, DDD_IF,DDD_ATTR,                   ExecProcPtr);
358 void     DDD_IFExchangeX  (DDD::DDDContext& context, DDD_IF,                    size_t, ComProcXPtr,ComProcXPtr);
359 void     DDD_IFOnewayX    (DDD::DDDContext& context, DDD_IF,         DDD_IF_DIR,size_t, ComProcXPtr,ComProcXPtr);
360 void     DDD_IFExecLocalX (DDD::DDDContext& context, DDD_IF,                            ExecProcXPtr);
361 void     DDD_IFAExchangeX (DDD::DDDContext& context, DDD_IF,DDD_ATTR,           size_t, ComProcXPtr,ComProcXPtr);
362 void     DDD_IFAOnewayX   (DDD::DDDContext& context, DDD_IF,DDD_ATTR,DDD_IF_DIR,size_t, ComProcXPtr,ComProcXPtr);
363 void     DDD_IFAExecLocalX(DDD::DDDContext& context, DDD_IF,DDD_ATTR,                   ExecProcXPtr);
364 
365 /*
366         Transfer Environment Module
367  */
368 bool     DDD_XferWithAddData(const DDD::DDDContext& context);
369 void     DDD_XferAddData(DDD::DDDContext& context, int, DDD_TYPE);
370 void     DDD_XferAddDataX(DDD::DDDContext& context, int, DDD_TYPE, size_t sizes[]);
371 int      DDD_XferIsPrunedDelete(const DDD::DDDContext& context, DDD_HDR);
372 int      DDD_XferObjIsResent(const DDD::DDDContext& context, DDD_HDR);
373 void     DDD_XferBegin(DDD::DDDContext& context);
374 DDD_RET  DDD_XferEnd(DDD::DDDContext& context);
375 void     DDD_XferCopyObj (DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
376 void     DDD_XferCopyObjX (DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO, size_t);
377 void     DDD_XferDeleteObj (DDD::DDDContext& context, DDD_HDR);
378 void     DDD_XferPrioChange(DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
379 
380 
381 /*
382         Prio Environment Module
383  */
384 void     DDD_PrioBegin(DDD::DDDContext& context);
385 DDD_RET  DDD_PrioEnd(DDD::DDDContext& context);
386 void     DDD_PrioChange(const DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
387 
388 
389 
390 /*
391         Join Environment Module
392  */
393 void     DDD_JoinBegin(DDD::DDDContext& context);
394 DDD_RET  DDD_JoinEnd(DDD::DDDContext& context);
395 void     DDD_JoinObj(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_GID);
396 
397 
398 /*
399         Object Manager
400  */
401 
402 DDD_OBJ  DDD_ObjNew (size_t, DDD_TYPE, DDD_PRIO, DDD_ATTR);
403 void     DDD_ObjDelete (DDD_OBJ, size_t, DDD_TYPE);
404 void     DDD_HdrConstructor(DDD::DDDContext& context, DDD_HDR, DDD_TYPE, DDD_PRIO, DDD_ATTR);
405 void     DDD_HdrConstructorMove(DDD::DDDContext& context, DDD_HDR, DDD_HDR);
406 void     DDD_HdrDestructor(DDD::DDDContext& context, DDD_HDR);
407 DDD_OBJ  DDD_ObjGet (DDD::DDDContext& context, size_t, DDD_TYPE, DDD_PRIO, DDD_ATTR);
408 void     DDD_ObjUnGet (DDD::DDDContext& context, DDD_HDR, size_t);
409 
410 
411 
412 /*
413         Maintainance & Debugging
414  */
415 
416 int      DDD_ConsCheck(DDD::DDDContext& context); /* returns total #errors since V1.6.6 */
417 void     DDD_ListLocalObjects(const DDD::DDDContext& context);
418 DDD_HDR  DDD_SearchHdr(DDD::DDDContext&, DDD_GID);
419 
420 
421 /****************************************************************************/
422 
423 END_UGDIM_NAMESPACE
424 
425 #endif
426