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