From 9a0e9e8b153ddd285ce9df9e5beb3a060752a3c8 Mon Sep 17 00:00:00 2001
From: Ansgar Burchardt <Ansgar.Burchardt@tu-dresden.de>
Date: Fri, 27 Apr 2018 17:14:24 +0200
Subject: [PATCH] DDD: access `DDD_CTRL` object via `ddd_ctrl(context)`

This allows removing the global object later.
---
 gm/ugm.cc                  |  8 ++--
 parallel/dddif/debugger.cc |  4 +-
 parallel/dddif/handler.cc  | 98 +++++++++++++++++++-------------------
 parallel/dddif/identify.cc | 22 ++++-----
 parallel/dddif/initddd.cc  | 63 ++++++++++++------------
 parallel/dddif/parallel.h  | 26 ++++++++--
 parallel/dddif/pgmcheck.cc | 11 +++--
 parallel/dddif/trans.cc    |  1 +
 8 files changed, 129 insertions(+), 104 deletions(-)

diff --git a/gm/ugm.cc b/gm/ugm.cc
index 54a5fadbf..df90ca0b3 100644
--- a/gm/ugm.cc
+++ b/gm/ugm.cc
@@ -278,9 +278,9 @@ static void ConstructDDDObject (DDD::DDDContext& context, void *obj, INT size, I
   {
     memset(obj,0,size);
     /* link this object to DDD management */
-    if (HAS_DDDHDR(type))
+    if (HAS_DDDHDR(context, type))
     {
-      DDD_TYPE dddtype = DDDTYPE(type);
+      DDD_TYPE dddtype = DDDTYPE(context, type);
       DDD_HDR dddhdr = (DDD_HDR)(((char *)obj) + DDD_InfoHdrOffset(context, dddtype));
       DDD_HdrConstructor(context, dddhdr, dddtype, PrioMaster, 0);
     }
@@ -326,10 +326,10 @@ static void DestructDDDObject(DDD::DDDContext& context, void *object, INT type)
   if (type!=NOOBJ)
   {
     /* unlink object from DDD management */
-    if (HAS_DDDHDR(type))
+    if (HAS_DDDHDR(context, type))
     {
       DDD_HDR dddhdr = (DDD_HDR)
-                       (((char *)object)+DDD_InfoHdrOffset(context, DDDTYPE(type)));
+                       (((char *)object)+DDD_InfoHdrOffset(context, DDDTYPE(context, type)));
       DDD_HdrDestructor(context, dddhdr);
     }
   }
diff --git a/parallel/dddif/debugger.cc b/parallel/dddif/debugger.cc
index c0c83b4cd..b009e23eb 100644
--- a/parallel/dddif/debugger.cc
+++ b/parallel/dddif/debugger.cc
@@ -87,7 +87,7 @@ void NS_DIM_PREFIX ddd_pstat(DDD::DDDContext& context, char *arg)
   switch (cmd)
   {
   case 'X' :
-    dddif_PrintGridRelations(dddctrl.currMG);
+    dddif_PrintGridRelations(ddd_ctrl(context).currMG);
     break;
 
   case 'm' :
@@ -162,7 +162,7 @@ void NS_DIM_PREFIX ddd_pstat(DDD::DDDContext& context, char *arg)
     break;
 
   case 'b' :
-    buggy(dddctrl.currMG);
+    buggy(ddd_ctrl(context).currMG);
     UserWrite("BUGGY: returning control to caller\n");
     break;
   }
diff --git a/parallel/dddif/handler.cc b/parallel/dddif/handler.cc
index 65f8b84a0..7d620900a 100644
--- a/parallel/dddif/handler.cc
+++ b/parallel/dddif/handler.cc
@@ -217,11 +217,11 @@ static GRID *GetGridOnDemand (MULTIGRID *mg, int level)
 /****************************************************************************/
 /****************************************************************************/
 
-static void VectorUpdate (DDD::DDDContext&, DDD_OBJ obj)
+static void VectorUpdate (DDD::DDDContext& context, DDD_OBJ obj)
 {
   VECTOR  *pv                     = (VECTOR *)obj;
   INT level           = ATTR_TO_GLEVEL(DDD_InfoAttr(PARHDR(pv)));
-  GRID    *theGrid        = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID    *theGrid        = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
   INT prio            = PRIO(pv);
 
   PRINTDEBUG(dddif,1,(PFMT " VectorUpdate(): v=" VINDEX_FMTX
@@ -270,7 +270,7 @@ static void VectorXferCopy(DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC proc,
   /*
           else
           {
-                  GRID *theGrid = GRID_ON_LEVEL(dddctrl.currMG,level);
+                  GRID *theGrid = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
                   MATRIX *theMatrix,*next;
 
                   for (theMatrix=VSTART(pv); theMatrix!=NULL; theMatrix = next) {
@@ -321,13 +321,13 @@ static void VectorGatherMatX (DDD::DDDContext&, DDD_OBJ obj, int cnt, DDD_TYPE t
 }
 
 
-static void VectorScatterConnX (DDD::DDDContext&, DDD_OBJ obj, int cnt, DDD_TYPE type_id, char **Data, int newness)
+static void VectorScatterConnX (DDD::DDDContext& context, DDD_OBJ obj, int cnt, DDD_TYPE type_id, char **Data, int newness)
 {
   VECTOR          *vec            = (VECTOR *)obj;
   CONNECTION      *first          = NULL,
   *last           = NULL;
   INT level           = ATTR_TO_GLEVEL(DDD_InfoAttr(PARHDR(vec)));
-  GRID            *theGrid        = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID            *theGrid        = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
   INT prio            = PRIO(vec);
   INT i;
   INT nconn           = 0;
@@ -398,7 +398,7 @@ static void VectorScatterConnX (DDD::DDDContext&, DDD_OBJ obj, int cnt, DDD_TYPE
         {
           /* matrix diagonal entry, no other vector is involved */
           CONNECTION *conn = (CONNECTION *)
-                             GetMemoryForObject(dddctrl.currMG,UG_MSIZE(mcopy),MAOBJ);
+                             GetMemoryForObject(ddd_ctrl(context).currMG,UG_MSIZE(mcopy),MAOBJ);
 
           nconn++; newconn++;
 
@@ -445,7 +445,7 @@ static void VectorScatterConnX (DDD::DDDContext&, DDD_OBJ obj, int cnt, DDD_TYPE
           {
             MATRIX *otherm;
             CONNECTION *conn = (CONNECTION *)
-                               GetMemoryForObject(dddctrl.currMG,2*UG_MSIZE(mcopy),MAOBJ);
+                               GetMemoryForObject(ddd_ctrl(context).currMG,2*UG_MSIZE(mcopy),MAOBJ);
 
             nconn++; newconn++;
 
@@ -584,12 +584,12 @@ static void VectorScatterConnX (DDD::DDDContext&, DDD_OBJ obj, int cnt, DDD_TYPE
 
 
 
-static void VectorObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
+static void VectorObjMkCons (DDD::DDDContext& context, DDD_OBJ obj, int newness)
 {
   VECTOR          *vec            = (VECTOR *) obj;
   MATRIX          *theMatrix,*Prev,*Next;
   INT level           = ATTR_TO_GLEVEL(DDD_InfoAttr(PARHDR(vec)));
-  GRID        *theGrid    = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID        *theGrid    = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
 
 
   PRINTDEBUG(dddif,2,(PFMT " VectorObjMkCons(): v=" VINDEX_FMTX
@@ -626,7 +626,7 @@ static void VectorObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
 
       {
         INT size = ((MDIAG(theMatrix)) ? UG_MSIZE(theMatrix) : 2*UG_MSIZE(theMatrix));
-        PutFreeObject(dddctrl.currMG,MMYCON(theMatrix),size,MAOBJ);
+        PutFreeObject(ddd_ctrl(context).currMG,MMYCON(theMatrix),size,MAOBJ);
       }
 
 
@@ -639,11 +639,11 @@ static void VectorObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
   }
 }
 
-static void VectorPriorityUpdate (DDD::DDDContext&, DDD_OBJ obj, DDD_PRIO isnew)
+static void VectorPriorityUpdate (DDD::DDDContext& context, DDD_OBJ obj, DDD_PRIO isnew)
 {
   VECTOR  *pv                     = (VECTOR *)obj;
   INT level           = ATTR_TO_GLEVEL(DDD_InfoAttr(PARHDR(pv)));
-  GRID    *theGrid        = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID    *theGrid        = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
   INT old                     = PRIO(pv);
 
   PRINTDEBUG(dddif,2,(PFMT " VectorPriorityUpdate(): v=" VINDEX_FMTX
@@ -739,11 +739,11 @@ static void BVertexLDataConstructor (DDD::DDDContext&, DDD_OBJ obj)
 }
 
 
-static void VertexUpdate (DDD::DDDContext&, DDD_OBJ obj)
+static void VertexUpdate (DDD::DDDContext& context, DDD_OBJ obj)
 {
   VERTEX  *theVertex      = (VERTEX *) obj;
   INT level           = LEVEL(theVertex);
-  GRID    *theGrid        = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID    *theGrid        = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
   INT prio            = VXPRIO(theVertex);
 
   PRINTDEBUG(dddif,1,(PFMT " VertexUpdate(): v=" VID_FMTX " I/BVOBJ=%d\n",
@@ -830,11 +830,11 @@ static void BVertexScatter (DDD::DDDContext&, DDD_OBJ obj, int cnt, DDD_TYPE typ
 }
 
 
-static void VertexPriorityUpdate (DDD::DDDContext&, DDD_OBJ obj, DDD_PRIO new_)
+static void VertexPriorityUpdate (DDD::DDDContext& context, DDD_OBJ obj, DDD_PRIO new_)
 {
   VERTEX      *theVertex                      = (VERTEX *)obj;
   INT level           = LEVEL(theVertex);
-  GRID        *theGrid        = GetGridOnDemand(dddctrl.currMG,level);
+  GRID        *theGrid        = GetGridOnDemand(ddd_ctrl(context).currMG,level);
   INT old                     = VXPRIO(theVertex);
 
   PRINTDEBUG(dddif,2,(PFMT " VertexPriorityUpdate(): v=" VID_FMTX
@@ -894,7 +894,7 @@ static void NodeObjInit(DDD::DDDContext&, DDD_OBJ obj)
 }
 
 
-static void NodeObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
+static void NodeObjMkCons (DDD::DDDContext& context, DDD_OBJ obj, int newness)
 {
   NODE *theNode   = (NODE *) obj;
 
@@ -940,7 +940,7 @@ static void NodeObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
         #endif
 
   /* set pointer of vector to its node */
-  if (dddctrl.nodeData && NVECTOR(theNode))
+  if (ddd_ctrl(context).nodeData && NVECTOR(theNode))
 #ifdef __PERIODIC_BOUNDARY__
     if (VOBJECT(NVECTOR(theNode))==NULL || PRIO((NODE *)VOBJECT(NVECTOR(theNode)))<PRIO(theNode))
 #endif
@@ -962,12 +962,12 @@ static void NodeObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
 /*																			*/
 /****************************************************************************/
 
-static void NodeUpdate (DDD::DDDContext&, DDD_OBJ obj)
+static void NodeUpdate (DDD::DDDContext& context, DDD_OBJ obj)
 {
   NODE    *theNode        = (NODE *)obj;
   VERTEX  *theVertex      = MYVERTEX(theNode);
   INT level           = LEVEL(theNode);
-  GRID    *theGrid        = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID    *theGrid        = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
   INT prio            = PRIO(theNode);
 
   PRINTDEBUG(dddif,1,(PFMT " NodeUpdate(): n=" ID_FMTX " NDOBJ=%d\n",
@@ -1071,12 +1071,12 @@ static void NodeXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC proc,
   DDD_XferCopyObj(context, PARHDRV(MYVERTEX(theNode)), proc, prio);
 
   /* copy vector if defined */
-  if (dddctrl.nodeData)
+  if (ddd_ctrl(context).nodeData)
   {
     vec = NVECTOR(theNode);
     if (vec != NULL) {
       INT Size = sizeof(VECTOR)-sizeof(DOUBLE)
-             +FMT_S_VEC_TP(MGFORMAT(dddctrl.currMG),VTYPE(vec));
+             +FMT_S_VEC_TP(MGFORMAT(ddd_ctrl(context).currMG),VTYPE(vec));
 
       PRINTDEBUG(dddif,2,(PFMT " NodeXferCopy(): n=" ID_FMTX
                           " Xfer NODEVEC=" VINDEX_FMTX " size=%d\n",
@@ -1088,11 +1088,11 @@ static void NodeXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC proc,
 }
 
 
-static void NodePriorityUpdate (DDD::DDDContext&, DDD_OBJ obj, DDD_PRIO new_)
+static void NodePriorityUpdate (DDD::DDDContext& context, DDD_OBJ obj, DDD_PRIO new_)
 {
   NODE    *pn                     = (NODE *)obj;
   INT level           = LEVEL(pn);
-  GRID    *theGrid        = GetGridOnDemand(dddctrl.currMG,level);
+  GRID    *theGrid        = GetGridOnDemand(ddd_ctrl(context).currMG,level);
   INT old                     = PRIO(pn);
 
   PRINTDEBUG(dddif,2,(PFMT " NodePriorityUpdate(): n=" ID_FMTX " old=%d new=%d "
@@ -1174,12 +1174,12 @@ DDD_TYPE NS_DIM_PREFIX NFatherObjType(DDD::DDDContext&, DDD_OBJ obj, DDD_OBJ ref
 /*																			*/
 /****************************************************************************/
 
-static void ElementLDataConstructor (DDD::DDDContext&, DDD_OBJ obj)
+static void ElementLDataConstructor (DDD::DDDContext& context, DDD_OBJ obj)
 {
   INT i;
   ELEMENT *pe                     = (ELEMENT *)obj;
   INT level           = LEVEL(pe);
-  GRID    *theGrid        = GetGridOnDemand(dddctrl.currMG,level);
+  GRID    *theGrid        = GetGridOnDemand(ddd_ctrl(context).currMG,level);
   INT prio            = EPRIO(pe);
 
   pe->message_buffer(nullptr, 0);
@@ -1245,11 +1245,11 @@ static void ElementUpdate (DDD::DDDContext&, DDD_OBJ obj)
 /*																			*/
 /****************************************************************************/
 
-static void ElementDelete (DDD::DDDContext&, DDD_OBJ obj)
+static void ElementDelete (DDD::DDDContext& context, DDD_OBJ obj)
 {
   ELEMENT *pe                     = (ELEMENT *)obj;
   INT level           = LEVEL(pe);
-  GRID    *theGrid        = GRID_ON_LEVEL(dddctrl.currMG,level);
+  GRID    *theGrid        = GRID_ON_LEVEL(ddd_ctrl(context).currMG,level);
 
   PRINTDEBUG(dddif,1,(PFMT " ElementDelete(): e=" EID_FMTX " EOBJ=%d l=%d "
                       "ncon=%d\n",
@@ -1342,12 +1342,12 @@ static void ElementXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC pro
 
     DDD_XferCopyObj(context, PARHDR(edge), proc, prio);
 
-    if (dddctrl.edgeData) {
+    if (ddd_ctrl(context).edgeData) {
       VECTOR *vec = EDVECTOR(edge);
 
       if (vec != NULL) {
         int Size = sizeof(VECTOR)-sizeof(DOUBLE)
-               +FMT_S_VEC_TP(MGFORMAT(dddctrl.currMG),VTYPE(vec));
+               +FMT_S_VEC_TP(MGFORMAT(ddd_ctrl(context).currMG),VTYPE(vec));
         PRINTDEBUG(dddif,3,(PFMT " ElementXferCopy():  e=" EID_FMTX
                             " EDGEVEC=" VINDEX_FMTX " size=%d\n",
                             me,EID_PRTX(pe),VINDEX_PRTX(vec),Size))
@@ -1359,13 +1359,13 @@ static void ElementXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC pro
 
 
   /* copy element vector */
-  if (dddctrl.elemData)
+  if (ddd_ctrl(context).elemData)
   {
     vec = EVECTOR(pe);
 
     if (vec != NULL) {
       Size = sizeof(VECTOR)-sizeof(DOUBLE)
-             +FMT_S_VEC_TP(MGFORMAT(dddctrl.currMG),VTYPE(vec));
+             +FMT_S_VEC_TP(MGFORMAT(ddd_ctrl(context).currMG),VTYPE(vec));
 
       PRINTDEBUG(dddif,2,(PFMT " ElementXferCopy(): e=" EID_FMTX
                           " ELEMVEC=" VINDEX_FMTX " size=%d\n",
@@ -1376,7 +1376,7 @@ static void ElementXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC pro
   }
 
   /* copy sidevectors */
-  if (dddctrl.sideData)
+  if (ddd_ctrl(context).sideData)
   {
     for (i=0; i<SIDES_OF_ELEM(pe); i++)
     {
@@ -1384,7 +1384,7 @@ static void ElementXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC pro
 
       if (vec != NULL) {
         Size = sizeof(VECTOR)-sizeof(DOUBLE)
-               +FMT_S_VEC_TP(MGFORMAT(dddctrl.currMG),VTYPE(vec));
+               +FMT_S_VEC_TP(MGFORMAT(ddd_ctrl(context).currMG),VTYPE(vec));
 
         PRINTDEBUG(dddif,2,(PFMT " ElementXferCopy(): e=" EID_FMTX
                             " SIDEVEC=" VINDEX_FMTX " size=%d\n",
@@ -1399,10 +1399,10 @@ static void ElementXferCopy (DDD::DDDContext& context, DDD_OBJ obj, DDD_PROC pro
 /****************************************************************************/
 
 #ifdef __TWODIM__
-static void ElemGatherEdge (DDD::DDDContext&, ELEMENT *pe, int cnt, char *data)
+static void ElemGatherEdge (DDD::DDDContext& context, ELEMENT *pe, int cnt, char *data)
 {
   INT i;
-  INT size = sizeof(EDGE) - ((dddctrl.edgeData) ? 0 : sizeof(VECTOR*));
+  INT size = sizeof(EDGE) - ((ddd_ctrl(context).edgeData) ? 0 : sizeof(VECTOR*));
 
   PRINTDEBUG(dddif,3,(PFMT " ElemGatherEdge(): pe=" EID_FMTX " cnt=%d size=%d\n",
                       me,EID_PRTX(pe),cnt,size))
@@ -1425,12 +1425,12 @@ static void ElemGatherEdge (DDD::DDDContext&, ELEMENT *pe, int cnt, char *data)
 }
 
 
-static void ElemScatterEdge (DDD::DDDContext&, ELEMENT *pe, int cnt, char *data, int newness)
+static void ElemScatterEdge (DDD::DDDContext& context, ELEMENT *pe, int cnt, char *data, int newness)
 {
   INT i;
-  INT size    = sizeof(EDGE) - ((dddctrl.edgeData) ? 0 : sizeof(VECTOR*));
+  INT size    = sizeof(EDGE) - ((ddd_ctrl(context).edgeData) ? 0 : sizeof(VECTOR*));
   INT level   = LEVEL(pe);
-  GRID    *theGrid = GetGridOnDemand(dddctrl.currMG,level);
+  GRID    *theGrid = GetGridOnDemand(ddd_ctrl(context).currMG,level);
 
   PRINTDEBUG(dddif,3,(PFMT " ElemScatterEdge(): pe=" EID_FMTX
                       " cnt=%d newness=%d\n",
@@ -1558,7 +1558,7 @@ static void ElemScatterEdge (DDD::DDDContext&, ELEMENT *pe, int cnt, char *data,
 
     /* copy edge vector pointer */
     if (newness == XFER_NEW)
-      if (dddctrl.edgeData)
+      if (ddd_ctrl(context).edgeData)
         if (EDVECTOR(ecopy) != NULL) {
           EDVECTOR(enew) = EDVECTOR(ecopy);
           VOBJECT(EDVECTOR(enew)) = (GEOM_OBJECT *)enew;
@@ -1667,7 +1667,7 @@ static void ElemScatterB (DDD::DDDContext& context, DDD_OBJ obj, int cnt, DDD_TY
 /****************************************************************************/
 
 
-static void ElementObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
+static void ElementObjMkCons (DDD::DDDContext& context, DDD_OBJ obj, int newness)
 {
   INT i,j;
   INT lostson         = 0;
@@ -1678,7 +1678,7 @@ static void ElementObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
   ELEMENT *theFather      = EFATHER(pe);
   ELEMENT *NbElement;
   INT level           = LEVEL(pe);
-  GRID    *theGrid        = GetGridOnDemand(dddctrl.currMG,level);
+  GRID    *theGrid        = GetGridOnDemand(ddd_ctrl(context).currMG,level);
 
 
   PRINTDEBUG(dddif,1,(PFMT " ElementObjMkCons(): pe=" EID_FMTX
@@ -1704,9 +1704,9 @@ static void ElementObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
   }
 
   /* reconstruct pointer from vectors */
-  if (dddctrl.elemData) VOBJECT(EVECTOR(pe)) = (GEOM_OBJECT*)pe;
+  if (ddd_ctrl(context).elemData) VOBJECT(EVECTOR(pe)) = (GEOM_OBJECT*)pe;
 
-  if (dddctrl.sideData)
+  if (ddd_ctrl(context).sideData)
     for (i=0; i<SIDES_OF_ELEM(pe); i++) {
       VOBJECT(SVECTOR(pe,i)) = (GEOM_OBJECT*)pe;
       SETVECTORSIDE(SVECTOR(pe,i), i);
@@ -1849,13 +1849,13 @@ static void ElementObjMkCons (DDD::DDDContext&, DDD_OBJ obj, int newness)
 }
 
 
-static void ElementPriorityUpdate (DDD::DDDContext&, DDD_OBJ obj, DDD_PRIO new_)
+static void ElementPriorityUpdate (DDD::DDDContext& context, DDD_OBJ obj, DDD_PRIO new_)
 {
   ELEMENT *pe                     = (ELEMENT *)obj;
   ELEMENT *theFather      = EFATHER(pe);
   ELEMENT *succe          = SUCCE(pe);
   INT level           = LEVEL(pe);
-  GRID    *theGrid        = GetGridOnDemand(dddctrl.currMG,level);
+  GRID    *theGrid        = GetGridOnDemand(ddd_ctrl(context).currMG,level);
   INT old                     = EPRIO(pe);
   INT lostson         = 1;
 
@@ -1996,7 +1996,7 @@ static void EdgeUpdate (DDD::DDDContext& context, DDD_OBJ obj)
 {
   EDGE    *pe                     = (EDGE *)obj;
   INT level           = LEVEL(NBNODE(LINK0(pe)));
-  GRID    *theGrid        = GetGridOnDemand(dddctrl.currMG,level);
+  GRID    *theGrid        = GetGridOnDemand(ddd_ctrl(context).currMG,level);
 
   PRINTDEBUG(dddif,1,(PFMT " EdgeUpdate(): edge=%x/%08x EDOBJT=%d "
                       " NO_OF_ELEM=%d\n",
@@ -2044,7 +2044,7 @@ static void EdgePriorityUpdate (DDD::DDDContext& context, DDD_OBJ obj, DDD_PRIO
   INT level           = LEVEL(theEdge);
   DUNE_UNUSED INT old                     = PRIO(theEdge);
 
-  GetGridOnDemand(dddctrl.currMG,level);
+  GetGridOnDemand(ddd_ctrl(context).currMG,level);
 
   PRINTDEBUG(dddif,2,(PFMT " EdgePriorityUpdate(): n=" ID_FMTX " old=%d new_=%d "
                       "level=%d\n",me,ID_PRTX(theEdge),old,new_,level))
@@ -2058,7 +2058,7 @@ static void EdgeObjMkCons (DDD::DDDContext& context, DDD_OBJ obj, int newness)
                       me,ID_PRTX(theEdge),OBJT(theEdge)))
 
   /* set pointer of vector to its edge */
-  if (dddctrl.edgeData && EDVECTOR(theEdge))
+  if (ddd_ctrl(context).edgeData && EDVECTOR(theEdge))
     VOBJECT(EDVECTOR(theEdge)) = (GEOM_OBJECT*)theEdge;
 
   ASSERT(OBJT(theEdge) == EDOBJ);
diff --git a/parallel/dddif/identify.cc b/parallel/dddif/identify.cc
index 85486b0fb..3fdc806db 100644
--- a/parallel/dddif/identify.cc
+++ b/parallel/dddif/identify.cc
@@ -1288,7 +1288,7 @@ static int Scatter_IdentSonNode (DDD::DDDContext& context, DDD_OBJ obj, void *da
         }
 
         DDD_IdentifyObject(context, PARHDR(SonNode),proc,PARHDR(theNode));
-        if (dddctrl.nodeData && NVECTOR(SonNode)!=NULL)
+        if (ddd_ctrl(context).nodeData && NVECTOR(SonNode)!=NULL)
           DDD_IdentifyObject(context, PARHDR(NVECTOR(SonNode)),proc,PARHDR(theNode));
       }
     }
@@ -1502,7 +1502,7 @@ static int Scatter_IdentSonEdge (DDD::DDDContext& context, DDD_OBJ obj, void *da
         }
 
         DDD_IdentifyObject(context, PARHDR(SonEdge),proc,PARHDR(theEdge));
-        if (dddctrl.edgeData && EDVECTOR(SonEdge)!=NULL)
+        if (ddd_ctrl(context).edgeData && EDVECTOR(SonEdge)!=NULL)
           DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdge)),proc,PARHDR(theEdge));
       }
     }
@@ -1582,7 +1582,7 @@ static int Scatter_IdentSonObjects (DDD::DDDContext& context, DDD_OBJ obj, void
         ASSERT(newsonobjects & 0x2);
 
         DDD_IdentifyObject(context, PARHDR(SonEdges[0]),proc,PARHDR(theEdge));
-        if (dddctrl.edgeData && EDVECTOR(SonEdges[0])!=NULL)
+        if (ddd_ctrl(context).edgeData && EDVECTOR(SonEdges[0])!=NULL)
           DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdges[0])),proc,PARHDR(theEdge));
       }
     }
@@ -1602,7 +1602,7 @@ static int Scatter_IdentSonObjects (DDD::DDDContext& context, DDD_OBJ obj, void
         {
           DDD_IdentifyObject(context, PARHDR(MidNode),proc,PARHDR(theEdge));
           DDD_IdentifyObject(context, PARHDRV(MYVERTEX(MidNode)),proc,PARHDR(theEdge));
-          if (dddctrl.nodeData && NVECTOR(MidNode)!=NULL)
+          if (ddd_ctrl(context).nodeData && NVECTOR(MidNode)!=NULL)
             DDD_IdentifyObject(context, PARHDR(NVECTOR(MidNode)),proc,PARHDR(theEdge));
         }
         else
@@ -1613,7 +1613,7 @@ static int Scatter_IdentSonObjects (DDD::DDDContext& context, DDD_OBJ obj, void
           DDD_IdentifyObject(context, PARHDR(MidNode),proc,PARHDR(Node1));
           DDD_IdentifyObject(context, PARHDRV(MYVERTEX(MidNode)),proc,PARHDR(Node0));
           DDD_IdentifyObject(context, PARHDRV(MYVERTEX(MidNode)),proc,PARHDR(Node1));
-          if (dddctrl.nodeData && NVECTOR(MidNode)!=NULL)
+          if (ddd_ctrl(context).nodeData && NVECTOR(MidNode)!=NULL)
           {
             DDD_IdentifyObject(context, PARHDR(NVECTOR(MidNode)),proc,PARHDR(Node0));
             DDD_IdentifyObject(context, PARHDR(NVECTOR(MidNode)),proc,PARHDR(Node1));
@@ -1643,7 +1643,7 @@ static int Scatter_IdentSonObjects (DDD::DDDContext& context, DDD_OBJ obj, void
         }
         DDD_IdentifyObject(context, PARHDR(SonEdges[0]),proc,PARHDR(theEdge));
         DDD_IdentifyObject(context, PARHDR(SonEdges[0]),proc,PARHDR((NODE *)NFATHER(IdentNode)));
-        if (dddctrl.edgeData && EDVECTOR(SonEdges[0])!=NULL)
+        if (ddd_ctrl(context).edgeData && EDVECTOR(SonEdges[0])!=NULL)
         {
           DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdges[0])),proc,PARHDR(theEdge));
           DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdges[0])),proc,PARHDR((NODE *)NFATHER(IdentNode)));
@@ -1672,7 +1672,7 @@ static int Scatter_IdentSonObjects (DDD::DDDContext& context, DDD_OBJ obj, void
         }
         DDD_IdentifyObject(context, PARHDR(SonEdges[1]),proc,PARHDR(theEdge));
         DDD_IdentifyObject(context, PARHDR(SonEdges[1]),proc,PARHDR((NODE *)NFATHER(IdentNode)));
-        if (dddctrl.edgeData && EDVECTOR(SonEdges[1])!=NULL)
+        if (ddd_ctrl(context).edgeData && EDVECTOR(SonEdges[1])!=NULL)
         {
           DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdges[1])),proc,PARHDR(theEdge));
           DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdges[1])),proc,PARHDR((NODE *)NFATHER(IdentNode)));
@@ -1759,10 +1759,10 @@ static int Scatter_SonNodeInfo (DDD::DDDContext& context, DDD_OBJ obj, void *dat
     if (has_sonnode)
     {
       DDD_IdentifyObject(context, PARHDR(SonNode),proc,PARHDR(theNode));
-      if (dddctrl.nodeData && NVECTOR(SonNode)!=NULL)
+      if (ddd_ctrl(context).nodeData && NVECTOR(SonNode)!=NULL)
         DDD_IdentifyObject(context, PARHDR(NVECTOR(SonNode)),proc,PARHDR(theNode));
       IFDEBUG(dddif,1)
-      if (dddctrl.nodeData && NVECTOR(SonNode)!=NULL)
+      if (ddd_ctrl(context).nodeData && NVECTOR(SonNode)!=NULL)
         PrintDebug ("l=%d IdentHdr: %d Proc: %d me:%d IdentObjectHdr: %d %d\n",
                     identlevel,GID(theNode),proc,me,GID(SonNode),GID(EDVECTOR(SonNode)));
       else
@@ -1853,10 +1853,10 @@ static int Scatter_SonEdgeInfo (DDD::DDDContext& context, DDD_OBJ obj, void *dat
     if (has_sonedge)
     {
       DDD_IdentifyObject(context, PARHDR(SonEdge),proc,PARHDR(theEdge));
-      if (dddctrl.edgeData && EDVECTOR(SonEdge)!=NULL)
+      if (ddd_ctrl(context).edgeData && EDVECTOR(SonEdge)!=NULL)
         DDD_IdentifyObject(context, PARHDR(EDVECTOR(SonEdge)),proc,PARHDR(theEdge));
       IFDEBUG(dddif,1)
-      if (dddctrl.edgeData && EDVECTOR(SonEdge)!=NULL)
+      if (ddd_ctrl(context).edgeData && EDVECTOR(SonEdge)!=NULL)
         PrintDebug ("l=%d IdentHdr: %d Proc: %d me:%d IdentObjectHdr: %d %d\n",
                     identlevel,GID(theEdge),proc,me,GID(SonEdge),GID(EDVECTOR(SonEdge)));
       else
diff --git a/parallel/dddif/initddd.cc b/parallel/dddif/initddd.cc
index 6681d7bd6..dbed9d8af 100644
--- a/parallel/dddif/initddd.cc
+++ b/parallel/dddif/initddd.cc
@@ -61,8 +61,8 @@ using namespace PPIF;
 
 /* macro for easy definition of type mapping UG<->DDD */
 #define MAP_TYPES(ugt,dddt)   { int _ugt=(ugt); \
-                                dddctrl.ugtypes[(dddt)] = _ugt;     \
-                                dddctrl.types[_ugt] = (dddt);       \
+                                ddd_ctrl(context).ugtypes[(dddt)] = _ugt;     \
+                                ddd_ctrl(context).types[_ugt] = (dddt);       \
 }
 
 
@@ -220,13 +220,13 @@ static void ddd_InitGenericElement(DDD::DDDContext& context, INT tag, DDD_TYPE d
 
   /* optional components */
 
-  if (dddctrl.elemData)
+  if (ddd_ctrl(context).elemData)
     DDD_TypeDefine(context, dddType, ge,
                    EL_OBJPTR, r+evector_offset[tag], ps*1,     TypeVector,
                    EL_CONTINUE);
 
         #ifdef __THREEDIM__
-  if (dddctrl.sideData)
+  if (ddd_ctrl(context).sideData)
     DDD_TypeDefine(context, dddType, ge,
                    EL_OBJPTR, r+svector_offset[tag], ps*desc->sides_of_elem, TypeVector,
                    EL_CONTINUE);
@@ -238,7 +238,7 @@ static void ddd_InitGenericElement(DDD::DDDContext& context, INT tag, DDD_TYPE d
 
     /* init type mapping arrays */
     MAP_TYPES(MAPPED_INNER_OBJT_TAG(tag), dddType);
-    dddctrl.dddObj[MAPPED_INNER_OBJT_TAG(tag)] = true;
+    ddd_ctrl(context).dddObj[MAPPED_INNER_OBJT_TAG(tag)] = true;
   }
   else
   {
@@ -248,7 +248,7 @@ static void ddd_InitGenericElement(DDD::DDDContext& context, INT tag, DDD_TYPE d
 
     /* init type mapping arrays */
     MAP_TYPES(MAPPED_BND_OBJT_TAG(tag), dddType);
-    dddctrl.dddObj[MAPPED_BND_OBJT_TAG(tag)] = true;
+    ddd_ctrl(context).dddObj[MAPPED_BND_OBJT_TAG(tag)] = true;
   }
 
   /* set mergemode to maximum */
@@ -314,10 +314,10 @@ static void ddd_DeclareTypes(DDD::DDDContext& context)
           - variables TypeXXXX containing the proper DDD_TYPEs may be
             superfluous. it would be possible to replace all occurences
             by macros like DDDType(VEOBJ), which would be implemented as
-     #define DDDType(ugtype)  (dddctrl.types[ugtype])
+     #define DDDType(ugtype)  (ddd_ctrl(context).types[ugtype])
             TODO check this!
             pros: no double information. currently, TypeXXX may differ
-                  from corresponding dddctrl.types[] entry.
+                  from corresponding ddd_ctrl(context).types[] entry.
             cons: will this be compatible with alloc/dealloc and TypeDefine
                   of ug-general-elements?
    */
@@ -327,19 +327,19 @@ static void ddd_DeclareTypes(DDD::DDDContext& context)
 
   TypeVector      = DDD_TypeDeclare(context, "Vector");
   MAP_TYPES(VEOBJ, TypeVector);
-  dddctrl.dddObj[VEOBJ] = true;
+  ddd_ctrl(context).dddObj[VEOBJ] = true;
 
   TypeIVertex     = DDD_TypeDeclare(context, "IVertex");
   MAP_TYPES(IVOBJ, TypeIVertex);
-  dddctrl.dddObj[IVOBJ] = true;
+  ddd_ctrl(context).dddObj[IVOBJ] = true;
 
   TypeBVertex     = DDD_TypeDeclare(context, "BVertex");
   MAP_TYPES(BVOBJ, TypeBVertex);
-  dddctrl.dddObj[BVOBJ] = true;
+  ddd_ctrl(context).dddObj[BVOBJ] = true;
 
   TypeNode        = DDD_TypeDeclare(context, "Node");
   MAP_TYPES(NDOBJ, TypeNode);
-  dddctrl.dddObj[NDOBJ] = true;
+  ddd_ctrl(context).dddObj[NDOBJ] = true;
 
         #ifdef __TWODIM__
   TypeTrElem      = DDD_TypeDeclare(context, "TrElem");
@@ -364,7 +364,7 @@ static void ddd_DeclareTypes(DDD::DDDContext& context)
   /* edge is DDD data object for 2D           */
   TypeEdge        = DDD_TypeDeclare(context, "Edge");
   MAP_TYPES(EDOBJ, TypeEdge);
-  dddctrl.dddObj[EDOBJ] = true;
+  ddd_ctrl(context).dddObj[EDOBJ] = true;
 
   /* 2. DDD data objects (without DDD_HEADER) */
 
@@ -550,7 +550,7 @@ static void ddd_DefineTypes(DDD::DDDContext& context)
                  EL_OBJPTR, ELDEF(n.myvertex), TypeIVertex,
                  EL_CONTINUE);
 
-  if (dddctrl.nodeData)
+  if (ddd_ctrl(context).nodeData)
     DDD_TypeDefine(context, TypeNode, &n,
                    EL_OBJPTR, ELDEF(n.vector), TypeVector,
                    EL_CONTINUE);
@@ -561,7 +561,7 @@ static void ddd_DefineTypes(DDD::DDDContext& context)
    * size of the NODE decreases by the size of one VECTOR*.
    * Compare the corresponding computation in the method CreateNode (in ugm.c)
    */
-  size = sizeof(NODE) - ((dddctrl.nodeData) ? 0 : sizeof(VECTOR*));
+  size = sizeof(NODE) - ((ddd_ctrl(context).nodeData) ? 0 : sizeof(VECTOR*));
   DDD_TypeDefine(context, TypeNode, &n,
                  EL_END, ((char *)&n)+size);
 
@@ -634,14 +634,14 @@ static void ddd_DefineTypes(DDD::DDDContext& context)
                  EL_OBJPTR, ELDEF(e.midnode),  TypeNode,
                  EL_CONTINUE);
 
-  if (dddctrl.edgeData)
+  if (ddd_ctrl(context).edgeData)
     DDD_TypeDefine(context, TypeEdge, &e,
                    EL_OBJPTR, ELDEF(e.vector), TypeVector,
                    EL_CONTINUE);
 
   /* See the corresponding line for TypeNode for an explanation of why
    * the object size is modified here. */
-  size = sizeof(EDGE) - ((dddctrl.edgeData) ? 0 : sizeof(VECTOR*));
+  size = sizeof(EDGE) - ((ddd_ctrl(context).edgeData) ? 0 : sizeof(VECTOR*));
   DDD_TypeDefine(context, TypeEdge, &e, EL_END, ((char *)&e)+size);
 
   /* set mergemode to maximum */
@@ -855,9 +855,9 @@ static void ddd_IfInit(DDD::DDDContext& context)
 static void InitDDDTypes(DDD::DDDContext& context)
 {
   /* prevent from multiple execution */
-  if (dddctrl.allTypesDefined)
+  if (ddd_ctrl(context).allTypesDefined)
     return;
-  dddctrl.allTypesDefined = true;
+  ddd_ctrl(context).allTypesDefined = true;
 
   ddd_DefineTypes(context);
 
@@ -921,6 +921,7 @@ static void InitDDDTypes(DDD::DDDContext& context)
 
 void NS_DIM_PREFIX InitCurrMG (MULTIGRID *MG)
 {
+  auto& dddctrl = ddd_ctrl(MG->dddContext());
   dddctrl.currMG = MG;
 
   dddctrl.nodeData = VEC_DEF_IN_OBJ_OF_MG(dddctrl.currMG,NODEVEC);
@@ -966,7 +967,7 @@ void NS_DIM_PREFIX InitCurrMG (MULTIGRID *MG)
 /****************************************************************************/
 
 
-static int CheckInitParallel (void)
+static int CheckInitParallel(const DDD::DDDContext& context)
 {
   int i;
 
@@ -977,21 +978,21 @@ static int CheckInitParallel (void)
     return(__LINE__);
   }
 
-  for(i=1; i<MAXDDDTYPES && UGTYPE(i)>=0; i++)
+  for(i=1; i<MAXDDDTYPES && UGTYPE(context, i)>=0; i++)
   {
     /* check for valid UGTYPE for given DDD_TYPE */
-    if (UGTYPE(i) > OBJT_MAX)
+    if (UGTYPE(context, i) > OBJT_MAX)
     {
       printf("ERROR in InitParallel: OBJT=%d > OBJT_MAX=%d\n",
-             UGTYPE(i), OBJT_MAX);
+             UGTYPE(context, i), OBJT_MAX);
       return(__LINE__);
     }
 
     /* check for correct mapping and re-mapping */
-    if (DDDTYPE(UGTYPE(i))!=i)
+    if (DDDTYPE(context, UGTYPE(context, i))!=i)
     {
       printf("ERROR in InitParallel: invalid type mapping for OBJT=%d\n",
-             UGTYPE(i));
+             UGTYPE(context, i));
       return(__LINE__);
     }
   }
@@ -1052,25 +1053,25 @@ int NS_DIM_PREFIX InitDDD(DDD::DDDContext& context)
   /* initialize type mapping arrays */
   for(i=0; i<MAXOBJECTS; i++)
   {
-    dddctrl.types[i] = -1;
-    dddctrl.dddObj[i] = false;
+    ddd_ctrl(context).types[i] = -1;
+    ddd_ctrl(context).dddObj[i] = false;
   }
   for(i=0; i<MAXDDDTYPES; i++)
   {
-    dddctrl.ugtypes[i] = -1;
+    ddd_ctrl(context).ugtypes[i] = -1;
   }
-  dddctrl.currFormat = NULL;
+  ddd_ctrl(context).currFormat = NULL;
 
   /* declare DDD_TYPES, definition must be done later */
   ddd_DeclareTypes(context);
-  dddctrl.allTypesDefined = false;
+  ddd_ctrl(context).allTypesDefined = false;
 
   DomInitParallel(TypeBndP,TypeBndS);
 
   ddd_IfInit(context);
 
   /* check for correct initialization */
-  if ((err=CheckInitParallel())!=0)
+  if ((err=CheckInitParallel(context))!=0)
   {
     SetHiWrd(err,__LINE__);
     return(err);
diff --git a/parallel/dddif/parallel.h b/parallel/dddif/parallel.h
index fa886aa95..ebec186f4 100644
--- a/parallel/dddif/parallel.h
+++ b/parallel/dddif/parallel.h
@@ -91,9 +91,9 @@ enum HandlerSets
 #define DDD_PrioritySet(context, h,p) {ObjectPriorityUpdate(context, (DDD_OBJ)h,p); DDD_PrioChange(context, h,p);}
 #endif
 
-#define UGTYPE(t)          (dddctrl.ugtypes[(t)])
-#define DDDTYPE(t)         (dddctrl.types[(t)])
-#define HAS_DDDHDR(t)      (dddctrl.dddObj[(t)])
+#define UGTYPE(context, t)     (ddd_ctrl(context).ugtypes[(t)])
+#define DDDTYPE(context, t)    (ddd_ctrl(context).types[(t)])
+#define HAS_DDDHDR(context, t) (ddd_ctrl(context).dddObj[(t)])
 
 #define DDD_DOMAIN_DATA    DDD_USER_DATA+1
 #define DDD_EXTRA_DATA     DDD_USER_DATA+2
@@ -261,6 +261,26 @@ extern DDD_CTRL dddctrl;
 
 #ifdef ModelP
 
+/**
+ * accessor function for DDD user context
+ */
+inline
+const DDD_CTRL& ddd_ctrl(const DDD::DDDContext& context)
+{
+  return dddctrl;
+  // return *static_cast<const DDD_CTRL*>(context.data());
+}
+
+/**
+ * accessor function for DDD user context
+ */
+inline
+DDD_CTRL& ddd_ctrl(DDD::DDDContext& context)
+{
+  return dddctrl;
+  // return *static_cast<DDD_CTRL*>(context.data());
+}
+
 /* from initddd.c */
 int             InitDDD(DDD::DDDContext& context);
 int             ExitDDD(DDD::DDDContext& context);
diff --git a/parallel/dddif/pgmcheck.cc b/parallel/dddif/pgmcheck.cc
index ed26ee6a7..7b87c810e 100644
--- a/parallel/dddif/pgmcheck.cc
+++ b/parallel/dddif/pgmcheck.cc
@@ -326,7 +326,7 @@ static INT CheckNodePrio (DDD::DDDContext& context, ELEMENT *theElement, NODE *t
     nerrors++;
   }
 
-  if (dddctrl.nodeData)
+  if (ddd_ctrl(context).nodeData)
   {
     if (NVECTOR(theNode) != NULL)
     {
@@ -386,7 +386,7 @@ static INT CheckEdgePrio (DDD::DDDContext& context, ELEMENT *theElement, EDGE *t
   }
         #endif
 
-  if (dddctrl.edgeData)
+  if (ddd_ctrl(context).edgeData)
     if (EDVECTOR(theEdge) != NULL)
       nerrors += CheckVectorPrio(context, theElement,EDVECTOR(theEdge));
 
@@ -498,11 +498,11 @@ static INT CheckElementPrio (DDD::DDDContext& context, ELEMENT *theElement)
     }
   }
 
-  if (dddctrl.elemData)
+  if (ddd_ctrl(context).elemData)
     if (EVECTOR(theElement) != NULL)
       nerrors += CheckVectorPrio(context, theElement,EVECTOR(theElement));
 
-  if (dddctrl.sideData)
+  if (ddd_ctrl(context).sideData)
   {
     for (i=0; i<SIDES_OF_ELEM(theElement); i++)
       if (SVECTOR(theElement,i) != NULL)
@@ -761,6 +761,9 @@ static INT CheckDistributedObjects (GRID *theGrid)
 
 INT NS_DIM_PREFIX CheckInterfaces (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  auto& dddctrl = ddd_ctrl(context);
+
   INT i,j;
   ELEMENT *theElement;
   NODE    *theNode;
diff --git a/parallel/dddif/trans.cc b/parallel/dddif/trans.cc
index dd342f3c0..88691b3f9 100644
--- a/parallel/dddif/trans.cc
+++ b/parallel/dddif/trans.cc
@@ -512,6 +512,7 @@ static int ComputeGhostCmds (MULTIGRID *theMG)
 #ifdef __OVERLAP2__
 static int XferNodesForOverlap2 (GRID *theGrid)
 {
+  auto& dddctrl = ddd_ctrl(theGrid->dddContext());
   ELEMENT *theElement;
   NODE    *theNode;
   INT i,part;
-- 
GitLab