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:      dddi.h                                                        */
6 /*                                                                          */
7 /* Purpose:   internal 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 /*            95/10/05 kb  added casts to mem-management macros             */
19 /*                                                                          */
20 /* Remarks:                                                                 */
21 /*                                                                          */
22 /****************************************************************************/
23 
24 
25 
26 /*
27    #define CheckIFMEM
28    #define CheckPMEM
29    #define CheckCplMEM
30    #define CheckMsgMEM
31    #define CheckTmpMEM
32    #define CheckHeapMem
33  */
34 
35 
36 /****************************************************************************/
37 /*                                                                          */
38 /* auto include mechanism and other include files                           */
39 /*                                                                          */
40 /****************************************************************************/
41 
42 #ifndef __DDDI_H__
43 #define __DDDI_H__
44 
45 #include <climits>
46 #include <memory>
47 #include <vector>
48 
49 #include <cassert>
50 
51 #include <dune/uggrid/parallel/ddd/dddcontext.hh>
52 
53 #include <dune/uggrid/low/architecture.h>
54 #include <dune/uggrid/low/ugtypes.h>
55 
56 #include <dune/uggrid/parallel/ppif/ppif.h>
57 #include <dune/uggrid/parallel/ddd/ctrl/stat.h>
58 #include <dune/uggrid/parallel/ddd/include/ddd.h>
59 #include <dune/uggrid/parallel/ddd/include/dddio.h>
60 #include <dune/uggrid/parallel/ddd/include/memmgr.h>
61 
62 START_UGDIM_NAMESPACE
63 
64 using namespace DDD;
65 
66 /*
67         macro for exiting program in case of a severe error condition
68  */
69 #define HARD_EXIT  assert(0)
70 /* #define HARD_EXIT  exit(1) */
71 
72 
73 /*
74         macros for correct return or premature abort of a procedure
75  */
76 #define RET_ON_OK      return (true)
77 #define RET_ON_ERROR   return (false)
78 #define IS_OK(p)       ((p)==true)
79 
80 
81 /****************************************************************************/
82 /*                                                                          */
83 /* defines in the following order                                           */
84 /*                                                                          */
85 /*        compile time constants defining static data size (i.e. arrays)    */
86 /*        other constants                                                   */
87 /*        macros                                                            */
88 /*                                                                          */
89 /****************************************************************************/
90 
91 /*** DDD internal parameters ***/
92 
93 #define MAX_PRIO       32     /* max. number of DDD_PRIO                    */
94 #define MAX_CPL_START  65536  /* max. number of local objects with coupling */
95 
96 #ifdef WithFullObjectTable
97 #define MAX_OBJ_START  262144 /* max. number of locally registered objects  */
98 #else
99 #define MAX_OBJ_START  MAX_CPL_START
100 #endif
101 
102 
103 
104 #define MAX_TRIES  50000000  /* max. number of tries until timeout in IF-comm */
105 
106 #ifdef DDD_MAX_PROCBITS_IN_GID
107 #define MAX_PROCBITS_IN_GID DDD_MAX_PROCBITS_IN_GID
108 #else
109 #define MAX_PROCBITS_IN_GID 24  /* this allows 2^24 procs and 2^40 objects  */
110 #endif
111 
112 /* use maximum as default, if no Priomerge-matrix is available */
113 #define PRIOMERGE_DEFAULT PRIOMERGE_MAXIMUM
114 
115 
116 
117 /*** DDD internal constants ***/
118 
119 /* maximum number of procs allowed (limited by GID construction) */
120 #define MAX_PROCS   (1<<MAX_PROCBITS_IN_GID)
121 
122 
123 #define GID_INVALID  -1            /* invalid global id                     */
124 #define PRIO_INVALID (MAX_PRIO+1)  /* invalid priority                      */
125 #define PROC_INVALID (MAX_PROCS+1) /* invalid processor number              */
126 #define ERROR        -1            /* standard error indicator              */
127 
128 
129 /* types of virtual channels (for ppif interface) */
130 enum VChanType {
131   VC_IDENT   = 15,               /* channels used for identification module     */
132   VC_IFCOMM  = 16,               /* channels used for interface module          */
133   VC_TOPO    = 17                /* channels used for xfer module (topology)    */
134 };
135 
136 
137 /* results of an prio-merge operation. see mgr/prio.c for more details. */
138 enum PrioMergeVals {
139   PRIO_ERROR = -1,
140   PRIO_UNKNOWN,
141   PRIO_FIRST,
142   PRIO_SECOND
143 };
144 
145 
146 
147 /****************************************************************************/
148 
149 /* string constants */
150 #define STR_NOMEM  "out of memory"
151 
152 
153 /****************************************************************************/
154 /*                                                                          */
155 /* data structures exported by the corresponding source file                */
156 /*                                                                          */
157 /****************************************************************************/
158 
159 /* macros for accessing COUPLING */
160 #define CPL_NEXT(cpl)   ((cpl)->_next)
161 #define CPL_PROC(cpl)   ((cpl)->_proc)
162 
163 /* macros for accessing ELEM_DESC */
164 #define EDESC_REFTYPE(ed)          ((ed)->_reftype)
165 #define EDESC_SET_REFTYPE(ed,rt)   (ed)->_reftype=(rt)
166 
167 /****************************************************************************/
168 /*                                                                          */
169 /* definitions previously hold in misc.h                                    */
170 /*                                                                          */
171 /****************************************************************************/
172 
173 #ifndef MIN
174 #define MIN(x,y) (((x)<(y)) ? (x) : (y))
175 #endif
176 
177 #ifndef MAX
178 #define MAX(x,y) (((x)>(y)) ? (x) : (y))
179 #endif
180 
181 
182 /* round up to next alignment border */
183 #ifndef CEIL
184 #define CEIL(n) ((n)+((ALIGNMENT-((n)&(ALIGNMENT-1)))&(ALIGNMENT-1)))
185 #endif
186 
187 /* round down to next alignment border */
188 #ifndef FLOOR
189 #define FLOOR(n) ((n)&ALIGNMASK)
190 #endif
191 
192 #define YES     1
193 #define ON      1
194 
195 #define NO      0
196 #define OFF     0
197 
198 
199 
200 /****************************************************************************/
201 /*                                                                          */
202 /* macros                                                                   */
203 /*                                                                          */
204 /****************************************************************************/
205 
206 
207 /* internal access of DDD_HEADER members */
208 #define ACCESS_HDR(o,c)   ((o)->c)
209 
210 /* type of object */
211 #define OBJ_TYPE(o)     ACCESS_HDR(o,typ)
212 
213 /* priority of object */
214 #define OBJ_PRIO(o)     ACCESS_HDR(o,prio)
215 
216 /* attr of object */
217 #define OBJ_ATTR(o)     ACCESS_HDR(o,attr)
218 
219 /* global id of object */
220 #define OBJ_GID(o)      ACCESS_HDR(o,gid)
221 #define OBJ_GID_FMT     DDD_GID_FMT
222 
223 /* get index into global object table */
224 #define OBJ_INDEX(o)    ACCESS_HDR(o,myIndex)
225 
226 /* internal flags of object */
227 #define OBJ_FLAGS(o)    ACCESS_HDR(o,flags)
228 
229 
230 /****************************************************************************/
231 
232 /* usage of flags in DDD_HEADER */
233 #define MASK_OBJ_PRUNED 0x00000001
234 #define OBJ_PRUNED(c) (((int)(OBJ_FLAGS(c)))&MASK_OBJ_PRUNED)
235 #define SET_OBJ_PRUNED(c,d) (OBJ_FLAGS(c)) = ((OBJ_FLAGS(c))&(~MASK_OBJ_PRUNED))|((d)&MASK_OBJ_PRUNED)
236 
237 #define MASK_OBJ_RESENT  0x00000002
238 #define SHIFT_OBJ_RESENT 1
239 #define OBJ_RESENT(c) ((((int)(OBJ_FLAGS(c)))&MASK_OBJ_RESENT)>>SHIFT_OBJ_RESENT)
240 #define SET_OBJ_RESENT(c,d) (OBJ_FLAGS(c)) = ((OBJ_FLAGS(c))&(~MASK_OBJ_RESENT))|(((d)<<SHIFT_OBJ_RESENT)&MASK_OBJ_RESENT)
241 
242 
243 /* usage of flags in COUPLING */
244 /* usage of 0x03 while interface-building, temporarily */
245 #define MASKCPLDIR 0x00000003
246 #define CPLDIR(c) (((int)((c)->_flags))&MASKCPLDIR)
247 #define SETCPLDIR(c,d) ((c)->_flags) = (((c)->_flags)&(~MASKCPLDIR))|((d)&MASKCPLDIR)
248 
249 /* usage of 0x10 for remembering the memory origin for the COUPLING struct */
250 #define MASKCPLMEM 0x00000010
251 #define CPLMEM_EXTERNAL  0x00
252 #define CPLMEM_FREELIST  0x10
253 #define CPLMEM(c) (((int)((c)->_flags))&MASKCPLMEM)
254 #define SETCPLMEM_EXTERNAL(c) ((c)->_flags) = (((c)->_flags)&(~MASKCPLMEM))|(CPLMEM_EXTERNAL)
255 #define SETCPLMEM_FREELIST(c) ((c)->_flags) = (((c)->_flags)&(~MASKCPLMEM))|(CPLMEM_FREELIST)
256 
257 
258 
259 /* convert DDD_OBJ to DDD_HDR and vice versa */
260 
261 #define OBJ2HDR(obj,desc)  ((DDD_HDR)(((char *)obj)+((desc)->offsetHeader)))
262 #define HDR2OBJ(hdr,desc)  ((DDD_OBJ)(((char *)hdr)-((desc)->offsetHeader)))
263 #define OBJ_OBJ(context, hdr) ((DDD_OBJ)(((char *)hdr)-            \
264                                       (context.typeDefs()[OBJ_TYPE(hdr)].offsetHeader)))
265 
266 
267 /****************************************************************************/
268 
269 /*
270         macros for access of coupling tables
271  */
272 
273 /* get boolean: does object have couplings? */
274 #define ObjHasCpl(context, o)      (OBJ_INDEX(o) < context.couplingContext().nCpls)
275 
276 /* get #couplings per object */
277 #define ObjNCpl(context, o)        (ObjHasCpl(context, o) ? context.couplingContext().nCplTable[OBJ_INDEX(o)] : 0)
278 #define IdxNCpl(context, i)        (context.couplingContext().nCplTable[i])
279 
280 /* get pointer to object's coupling list */
281 #define ObjCplList(context, o)     (ObjHasCpl(context, o) ? context.couplingContext().cplTable[OBJ_INDEX(o)] : nullptr)
282 #define IdxCplList(context, i)     (context.couplingContext().cplTable[i])
283 
284 
285 /* DDD_HDR may be invalid */
286 #define MarkHdrInvalid(hdr)    OBJ_INDEX(hdr)=(INT_MAX-1)
287 #define IsHdrInvalid(hdr)      OBJ_INDEX(hdr)==(INT_MAX-1)
288 
289 #ifndef WithFullObjectTable
290 #define MarkHdrLocal(hdr)      OBJ_INDEX(hdr)=(INT_MAX)
291 #define IsHdrLocal(hdr)        OBJ_INDEX(hdr)==(INT_MAX)
292 #endif
293 
294 /****************************************************************************/
295 
296 /** get default VChan to processor p */
297 inline
VCHAN_TO(const DDD::DDDContext & context,DDD_PROC p)298 const VChannelPtr VCHAN_TO(const DDD::DDDContext& context, DDD_PROC p)
299 {
300   return context.topoContext().theTopology[p];
301 }
302 
303 
304 /****************************************************************************/
305 
306 /* types for StdIf-communication functions (see if/ifstd.ct) */
307 typedef int (*ExecProcHdrPtr)(DDD::DDDContext& context, DDD_HDR);
308 typedef int (*ExecProcHdrXPtr)(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
309 typedef int (*ComProcHdrPtr)(DDD::DDDContext& context, DDD_HDR, void *);
310 typedef int (*ComProcHdrXPtr)(DDD::DDDContext& context, DDD_HDR, void *, DDD_PROC, DDD_PRIO);
311 
312 
313 /****************************************************************************/
314 /*                                                                          */
315 /* memory management                                                        */
316 /*                                                                          */
317 /****************************************************************************/
318 
319 
320 #if defined(CheckPMEM) || defined(CheckIFMEM) || defined(CheckCplMEM) || defined(CheckMsgMEM) || defined(CheckTmpMEM) || defined(CheckHeapMem)
321 
322 static void *dummy_ptr;
323 static char *mem_ptr;
324 
325 #ifndef SST
326 #define SST (CEIL(sizeof(size_t)))
327 #define GET_SSTVAL(adr)   *(size_t *)(((char *)adr)-SST)
328 #endif
329 
330 #endif
331 
332 
333 /*** mapping memory allocation calls to memmgr_ calls ***/
334 
335 #define AllocObj(s,t,p,a) memmgr_AllocOMEM((size_t)s,(int)t,(int)p,(int)a)
336 
337 
338 #ifdef CheckPMEM
339 #define AllocFix(s)  \
340   (dummy_ptr = (mem_ptr=(char *)memmgr_AllocPMEM(SST+(size_t)s)) != NULL ? \
341                mem_ptr+SST : NULL);                                     \
342   if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s;                            \
343   printf("MALL PFix adr=%08x size=%ld file=%s line=%d\n",             \
344          dummy_ptr,s,__FILE__,__LINE__)
345 #else
346 #define AllocFix(s)       memmgr_AllocPMEM((size_t)s)
347 #endif
348 
349 
350 #ifdef CheckMsgMEM
351 #define AllocMsg(s)  \
352   (dummy_ptr = (mem_ptr=(char *)memmgr_AllocTMEM(SST+(size_t)s, TMEM_MSG)) \
353                != NULL ?                                                            \
354                mem_ptr+SST : NULL);                                     \
355   if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s;                            \
356   printf("MALL TMsg adr=%08x size=%ld file=%s line=%d\n",             \
357          dummy_ptr,s,__FILE__,__LINE__)
358 #else
359 #define AllocMsg(s)       memmgr_AllocTMEM((size_t)s, TMEM_MSG)
360 #endif
361 
362 
363 #ifdef CheckTmpMEM
364 #define AllocTmp(s)  \
365   (dummy_ptr = (mem_ptr=(char *)memmgr_AllocTMEM(SST+(size_t)s, TMEM_ANY)) \
366                != NULL ?                                                            \
367                mem_ptr+SST : NULL);                                     \
368   if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s;                            \
369   printf("MALL TTmp adr=%08x size=%ld file=%s line=%d\n",             \
370          dummy_ptr,s,__FILE__,__LINE__)
371 
372 #define AllocTmpReq(s,r)  \
373   (dummy_ptr = (mem_ptr=(char *)memmgr_AllocTMEM(SST+(size_t)s, r))        \
374                != NULL ?                                                            \
375                mem_ptr+SST : NULL);                                     \
376   if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s;                            \
377   printf("MALL TTmp adr=%08x size=%ld kind=%d file=%s line=%d\n",     \
378          dummy_ptr,s,r,__FILE__,__LINE__)
379 #else
380 #define AllocTmp(s)       memmgr_AllocTMEM((size_t)s, TMEM_ANY)
381 #define AllocTmpReq(s,r)  memmgr_AllocTMEM((size_t)s, r)
382 #endif
383 
384 
385 #ifdef CheckCplMEM
386 #define AllocCpl(s)  \
387   (dummy_ptr = (mem_ptr=(char *)memmgr_AllocAMEM(SST+(size_t)s)) != NULL ? \
388                mem_ptr+SST : NULL);                                     \
389   if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s;                            \
390   printf("MALL ACpl adr=%08x size=%ld file=%s line=%d\n",             \
391          dummy_ptr,s,__FILE__,__LINE__)
392 #else
393 #define AllocCpl(s)       memmgr_AllocAMEM((size_t)s)
394 #endif
395 
396 #ifdef CheckIFMEM
397 #define AllocIF(s)  \
398   (dummy_ptr = (mem_ptr=(char *)memmgr_AllocAMEM(SST+(size_t)s)) != NULL ? \
399                mem_ptr+SST : NULL);                                     \
400   if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s;                            \
401   printf("MALL AIF  adr=%08x size=%ld file=%s line=%d\n",             \
402          dummy_ptr,s,__FILE__,__LINE__)
403 #else
404 #define AllocIF(s)        memmgr_AllocAMEM((size_t)s)
405 #endif
406 
407 
408 
409 /*** mapping memory free calls to memmgr calls ***/
410 
411 #define FreeObj(mem,s,t)  memmgr_FreeOMEM(mem,(size_t)s,(int)t)
412 
413 
414 
415 #ifdef CheckPMEM
416 #define FreeFix(mem)      {               \
417     size_t s=GET_SSTVAL(mem); \
418     memmgr_FreePMEM(((char *)mem)-SST);  \
419     printf("FREE PFix adr=%08x size=%ld file=%s line=%d\n",\
420            mem,s,__FILE__,__LINE__); }
421 #else
422 #define FreeFix(mem)      memmgr_FreePMEM(mem)
423 #endif
424 
425 #ifdef CheckMsgMEM
426 #define FreeMsg(mem,size)      {   \
427     size_t s=GET_SSTVAL(mem); \
428     memmgr_FreeTMEM(((char *)mem)-SST, TMEM_MSG);    \
429     printf("FREE TMsg adr=%08x size=%ld file=%s line=%d\n",\
430            mem,s,__FILE__,__LINE__); }
431 #else
432 #define FreeMsg(mem,size)      memmgr_FreeTMEM(mem, TMEM_MSG)
433 #endif
434 
435 
436 #ifdef CheckTmpMEM
437 #define FreeTmp(mem,size)      {                  \
438     size_t s=GET_SSTVAL(mem); \
439     memmgr_FreeTMEM(((char *)mem)-SST,TMEM_ANY);       \
440     printf("FREE TTmp adr=%08x size=%ld file=%s line=%d\n",\
441            mem,s,__FILE__,__LINE__); }
442 #define FreeTmpReq(mem,size,r)      {                  \
443     size_t s=GET_SSTVAL(mem); \
444     memmgr_FreeTMEM(((char *)mem)-SST,r);       \
445     printf("FREE TTmp adr=%08x size=%ld kind=%d file=%s line=%d\n",\
446            mem,s,r,__FILE__,__LINE__); }
447 #else
448 #define FreeTmp(mem,size)      memmgr_FreeTMEM(mem,TMEM_ANY)
449 #define FreeTmpReq(mem,size,r) memmgr_FreeTMEM(mem,r)
450 #endif
451 
452 
453 #ifdef CheckCplMEM
454 #define FreeCpl(mem)      {                   \
455     size_t s=GET_SSTVAL(mem); \
456     memmgr_FreeAMEM(((char *)mem)-SST);     \
457     printf("FREE ACpl adr=%08x size=%ld file=%s line=%d\n",\
458            mem,s,__FILE__,__LINE__); }
459 #else
460 #define FreeCpl(mem)      memmgr_FreeAMEM(mem)
461 #endif
462 
463 #ifdef CheckIFMEM
464 #define FreeIF(mem)       { \
465     size_t s=GET_SSTVAL(mem); \
466     memmgr_FreeAMEM(((char *)mem)-SST);    \
467     printf("FREE AIF  adr=%08x size=%ld file=%s line=%d\n",\
468            mem,s,__FILE__,__LINE__); }
469 #else
470 #define FreeIF(mem)       memmgr_FreeAMEM(mem)
471 #endif
472 
473 
474 
475 /****************************************************************************/
476 /*                                                                          */
477 /* function declarations                                                    */
478 /*                                                                          */
479 /****************************************************************************/
480 
481 /* ddd.c */
482 int DDD_GetOption(const DDD::DDDContext& context, DDD_OPTION);
483 
484 
485 /* typemgr.c */
486 void      ddd_TypeMgrInit(DDD::DDDContext& context);
487 void      ddd_TypeMgrExit(DDD::DDDContext& context);
488 int       ddd_TypeDefined (TYPE_DESC *);
489 
490 
491 /* objmgr.c */
492 void      ddd_ObjMgrInit(DDD::DDDContext& context);
493 void      ddd_ObjMgrExit(DDD::DDDContext& context);
494 void      ddd_EnsureObjTabSize(DDD::DDDContext& context, int);
495 
496 
497 /* cplmgr.c */
498 void      ddd_CplMgrInit(DDD::DDDContext& context);
499 void      ddd_CplMgrExit(DDD::DDDContext& context);
500 COUPLING *AddCoupling(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
501 COUPLING *ModCoupling(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
502 void      DelCoupling(DDD::DDDContext& context, DDD_HDR, DDD_PROC);
503 void      DisposeCouplingList(DDD::DDDContext& context, COUPLING *);
504 void      DDD_InfoCoupling(const DDD::DDDContext& context, DDD_HDR);
505 
506 
507 /* mgr/prio.c */
508 enum PrioMergeVals PriorityMerge (const TYPE_DESC*, DDD_PRIO, DDD_PRIO, DDD_PRIO *);
509 
510 
511 /* if/if.c */
512 void      ddd_IFInit(DDD::DDDContext& context);
513 void      ddd_IFExit(DDD::DDDContext& context);
514 void      IFAllFromScratch(DDD::DDDContext&);
515 void      DDD_InfoIFImpl(DDD::DDDContext& context, DDD_IF);
516 void      IFInvalidateShortcuts(DDD::DDDContext& context, DDD_TYPE);
517 int       DDD_CheckInterfaces(DDD::DDDContext& context);
518 
519 /* if/ifcmds.c */
520 void   ddd_StdIFExchange   (DDD::DDDContext& context, size_t, ComProcHdrPtr,ComProcHdrPtr);
521 void   ddd_StdIFExecLocal  (DDD::DDDContext& context,         ExecProcHdrPtr);
522 void   ddd_StdIFExchangeX  (DDD::DDDContext& context, size_t, ComProcHdrXPtr,ComProcHdrXPtr);
523 void   ddd_StdIFExecLocalX (DDD::DDDContext& context,         ExecProcHdrXPtr);
524 
525 
526 
527 /* xfer/xfer.c */
528 void      ddd_XferInit(DDD::DDDContext& context);
529 void      ddd_XferExit(DDD::DDDContext& context);
530 int       ddd_XferActive(const DDD::DDDContext& context);
531 void      ddd_XferRegisterDelete(DDD::DDDContext& context, DDD_HDR);
532 
533 
534 /* xfer/cmds.c */
535 void      DDD_XferPrioChange(DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
536 
537 
538 /* prio/pcmds.c */
539 void      ddd_PrioInit(DDD::DDDContext& context);
540 void      ddd_PrioExit(DDD::DDDContext& context);
541 bool      ddd_PrioActive(const DDD::DDDContext& context);
542 
543 
544 /* join/join.c */
545 void      ddd_JoinInit(DDD::DDDContext& context);
546 void      ddd_JoinExit(DDD::DDDContext& context);
547 bool      ddd_JoinActive(const DDD::DDDContext& context);
548 
549 
550 /* ident/ident.c */
551 void      ddd_IdentInit(DDD::DDDContext& context);
552 void      ddd_IdentExit(DDD::DDDContext& context);
553 
554 
555 /* basic/cons.c */
556 void      ddd_ConsInit(DDD::DDDContext& context);
557 void      ddd_ConsExit(DDD::DDDContext& context);
558 
559 END_UGDIM_NAMESPACE
560 namespace DDD {
561 /* basic/topo.c */
562 void      ddd_TopoInit(DDD::DDDContext& context);
563 void      ddd_TopoExit(DDD::DDDContext& context);
564 DDD_PROC* DDD_ProcArray(DDD::DDDContext& context);
565 RETCODE   DDD_GetChannels(DDD::DDDContext& context, int);
566 void      DDD_DisplayTopo(const DDD::DDDContext& context);
567 } /* namespace DDD */
568 START_UGDIM_NAMESPACE
569 
570 
571 /* mgr/objmgr.c */
572 void      DDD_HdrConstructorCopy(DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
573 void      ObjCopyGlobalData (TYPE_DESC *, DDD_OBJ, DDD_OBJ, size_t);
574 std::vector<DDD_HDR> LocalObjectsList(const DDD::DDDContext& context);
575 std::vector<DDD_HDR> LocalCoupledObjectsList(const DDD::DDDContext& context);
576 
577 END_UGDIM_NAMESPACE
578 namespace DDD {
579 /* basic/reduct.c */
580 int       ddd_GlobalSumInt(const DDD::DDDContext& context, int);
581 int       ddd_GlobalMaxInt(const DDD::DDDContext& context, int);
582 int       ddd_GlobalMinInt(const DDD::DDDContext& context, int);
583 } /* namespace DDD */
584 START_UGDIM_NAMESPACE
585 
586 
587 /* ctrl/stat.c */
588 void      ddd_StatInit (void);
589 void      ddd_StatExit (void);
590 
591 
592 END_UGDIM_NAMESPACE
593 
594 #endif
595