From 8ff0fa809449440117d478e31606d7e39cd083a2 Mon Sep 17 00:00:00 2001
From: Ansgar Burchardt <Ansgar.Burchardt@tu-dresden.de>
Date: Mon, 30 Apr 2018 12:55:32 +0200
Subject: [PATCH] DDDIF: move interface definitions to DDD_CTRL

---
 gm/algebra.cc               |  56 +++++++++++---------
 gm/er.cc                    |  13 +++--
 gm/refine.cc                |  58 ++++++++++++++-------
 gm/ugio.cc                  |  21 +++++---
 gm/ugm.cc                   |  46 +++++++++-------
 parallel/dddif/compat.cc    |  30 +++++++++++
 parallel/dddif/identify.cc  |  48 +++++++++--------
 parallel/dddif/initddd.cc   | 101 ++++++++++++++++++------------------
 parallel/dddif/parallel.h   |  12 +++++
 parallel/dddif/partition.cc |  11 ++--
 parallel/dddif/pgmcheck.cc  |  11 ++--
 parallel/dddif/priority.cc  |  15 +++---
 parallel/dddif/trans.cc     |  18 ++++---
 13 files changed, 274 insertions(+), 166 deletions(-)

diff --git a/gm/algebra.cc b/gm/algebra.cc
index 2d46350ed..1383fd50f 100644
--- a/gm/algebra.cc
+++ b/gm/algebra.cc
@@ -2429,11 +2429,13 @@ INT NS_DIM_PREFIX CreateAlgebra (MULTIGRID *theMG)
   MGCreateConnection(theMG);
     #endif
   /* update VNEW-flags */
-  DDD_IFExchange(theMG->dddContext(),
-                 BorderVectorSymmIF,sizeof(INT),
+  auto& context = theMG->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+  DDD_IFExchange(context,
+                 dddctrl.BorderVectorSymmIF,sizeof(INT),
                  Gather_VectorVNew,Scatter_VectorVNew);
-  DDD_IFOneway(theMG->dddContext(),
-               VectorIF,IF_FORWARD,sizeof(INT),
+  DDD_IFOneway(context,
+               dddctrl.VectorIF,IF_FORWARD,sizeof(INT),
                Gather_VectorVNew,Scatter_GhostVectorVNew);
     #else
   MGCreateConnection(theMG);
@@ -3441,11 +3443,14 @@ static INT PropagatePeriodicVectorClass (GRID *theGrid, INT vclass)
 INT NS_DIM_PREFIX PropagateVectorClasses (GRID *theGrid)
 {
     #ifdef ModelP
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   PRINTDEBUG(gm,1,("\nPropagateVectorClasses():"
                    " 1. communication on level %d\n",GLEVEL(theGrid)))
   /* exchange VCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVClass, Scatter_VectorVClass);
     #endif
 
@@ -3455,8 +3460,8 @@ INT NS_DIM_PREFIX PropagateVectorClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\nPropagateVectorClasses(): 2. communication\n"))
   /* exchange VCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVClass, Scatter_VectorVClass);
     #endif
 
@@ -3466,8 +3471,8 @@ INT NS_DIM_PREFIX PropagateVectorClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\nPropagateVectorClasses(): 3. communication\n"))
   /* exchange VCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVClass, Scatter_VectorVClass);
     #endif
 
@@ -3478,16 +3483,16 @@ INT NS_DIM_PREFIX PropagateVectorClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\nPropagateVectorClasses(): 4. communication\n"))
   /* exchange VCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVClass, Scatter_VectorVClass);
         #endif
 #endif
 
         #ifdef ModelP
   /* send VCLASS to ghosts */
-  DDD_IFAOneway(theGrid->dddContext(),
-                VectorIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.VectorIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_VectorVClass, Scatter_GhostVectorVClass);
     #endif
 
@@ -3671,10 +3676,13 @@ static INT PropagatePeriodicNextVectorClass (GRID *theGrid)
 INT NS_DIM_PREFIX PropagateNextVectorClasses (GRID *theGrid)
 {
     #ifdef ModelP
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   PRINTDEBUG(gm,1,("\nPropagateNextVectorClasses(): 1. communication\n"))
   /* exchange VNCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVNClass, Scatter_VectorVNClass);
     #endif
 
@@ -3683,8 +3691,8 @@ INT NS_DIM_PREFIX PropagateNextVectorClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\nPropagateNextVectorClasses(): 2. communication\n"))
   /* exchange VNCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVNClass, Scatter_VectorVNClass);
     #endif
 
@@ -3693,8 +3701,8 @@ INT NS_DIM_PREFIX PropagateNextVectorClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\nPropagateNextVectorClasses(): 3. communication\n"))
   /* exchange VNCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVNClass, Scatter_VectorVNClass);
         #endif
 
@@ -3704,16 +3712,16 @@ INT NS_DIM_PREFIX PropagateNextVectorClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\nPropagateNextVectorClasses(): 4. communication\n"))
   /* exchange VNCLASS of vectors */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_VectorVNClass, Scatter_VectorVNClass);
         #endif
 #endif
 
         #ifdef ModelP
   /* send VCLASS to ghosts */
-  DDD_IFAOneway(theGrid->dddContext(),
-                VectorIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.VectorIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_VectorVNClass, Scatter_GhostVectorVNClass);
     #endif
 
diff --git a/gm/er.cc b/gm/er.cc
index 61eec0cd2..08f2734f0 100644
--- a/gm/er.cc
+++ b/gm/er.cc
@@ -994,6 +994,9 @@ static int ExtractInterfaceERule (DDD::DDDContext&, DDD_OBJ obj)
 
 static INT ExtractInterfaceRules (MULTIGRID *mg)
 {
+  auto& context = mg->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   int lev;
 
   /* TODO (HRR 971211): don't include TOPLEVEL (no elem refined there) */
@@ -1003,7 +1006,7 @@ static INT ExtractInterfaceRules (MULTIGRID *mg)
 
     /* count interface master and vhghost elements */
     global.if_elems = 1;
-    DDD_IFAExecLocal(grid->dddContext(), ElementVHIF, GRID_ATTR(grid), CountIFElements);
+    DDD_IFAExecLocal(context, dddctrl.ElementVHIF, GRID_ATTR(grid), CountIFElements);
 
     if (global.if_elems>1)
     {
@@ -1021,18 +1024,18 @@ static INT ExtractInterfaceRules (MULTIGRID *mg)
         REP_ERR_RETURN(1);
 
       /* init rules of masters */
-      DDD_IFAExecLocal(grid->dddContext(), ElementIF, GRID_ATTR(grid), InitMasterRules);
+      DDD_IFAExecLocal(context, dddctrl.ElementIF, GRID_ATTR(grid), InitMasterRules);
 
       /* communicate VHghosts --> master */
-      DDD_IFAOneway(grid->dddContext(), ElementVHIF, GRID_ATTR(grid), IF_BACKWARD, sizeof(ERULE),
+      DDD_IFAOneway(context, dddctrl.ElementVHIF, GRID_ATTR(grid), IF_BACKWARD, sizeof(ERULE),
                     Gather_ERULE, Scatter_partial_ERULE);
 
       /* communicate master --> VHghosts */
-      DDD_IFAOneway(grid->dddContext(), ElementVHIF, GRID_ATTR(grid), IF_FORWARD, sizeof(ERULE),
+      DDD_IFAOneway(context, dddctrl.ElementVHIF, GRID_ATTR(grid), IF_FORWARD, sizeof(ERULE),
                     Gather_ERULE, Scatter_ERULE);
 
       /* extract rules from interface elements */
-      DDD_IFAExecLocal(grid->dddContext(), ElementVHIF, GRID_ATTR(grid), ExtractInterfaceERule);
+      DDD_IFAExecLocal(context, dddctrl.ElementVHIF, GRID_ATTR(grid), ExtractInterfaceERule);
 
       IFDEBUG(gm,ER_DBG_GENERAL)
       long N_er = 0;
diff --git a/gm/refine.cc b/gm/refine.cc
index d7de5dd40..c8e5affb8 100644
--- a/gm/refine.cc
+++ b/gm/refine.cc
@@ -915,9 +915,12 @@ static int Scatter_ElementClosureInfo (DDD::DDDContext&, DDD_OBJ obj, void *data
 
 static INT ExchangeElementClosureInfo (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   /* exchange information of elements to compute closure */
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 ElementSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOnewayX(context,
+                 dddctrl.ElementSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                  Gather_ElementClosureInfo, Scatter_ElementClosureInfo);
 
   return(GM_OK);
@@ -954,9 +957,12 @@ static int Scatter_ElementRefine (DDD::DDDContext&, DDD_OBJ obj, void *data, DDD
 
 static INT ExchangeElementRefine (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   /* exchange information of elements to compute closure */
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 ElementSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,2*sizeof(INT),
+  DDD_IFAOnewayX(context,
+                 dddctrl.ElementSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,2*sizeof(INT),
                  Gather_ElementRefine, Scatter_ElementRefine);
 
   return(GM_OK);
@@ -1034,9 +1040,12 @@ static int Scatter_EdgeClosureInfo (DDD::DDDContext&, DDD_OBJ obj, void *data)
 
 INT     ExchangeEdgeClosureInfo (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   /* exchange information of edges to compute closure */
-  DDD_IFAOneway(theGrid->dddContext(),
-                EdgeVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.EdgeVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_EdgeClosureInfo, Scatter_EdgeClosureInfo);
 
   return(GM_OK);
@@ -1729,15 +1738,18 @@ static int Scatter_AddEdgePattern (DDD::DDDContext&, DDD_OBJ obj, void *data)
 
 static INT ExchangeAddPatterns (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   /* exchange addpatterns of edges */
         #ifdef __TWODIM__
-  DDD_IFAOneway(theGrid->dddContext(),
-                ElementVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.ElementVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_AddEdgePattern, Scatter_AddEdgePattern);
         #endif
         #ifdef __THREEDIM__
-  DDD_IFAOneway(theGrid->dddContext(),
-                EdgeVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.EdgeVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_AddEdgePattern, Scatter_AddEdgePattern);
         #endif
 
@@ -2121,9 +2133,12 @@ static int Scatter_ElementInfo (DDD::DDDContext&, DDD_OBJ obj, void *Data)
 
 static INT CheckElementInfo (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   /* exchange element info */
-  DDD_IFAOneway(theGrid->dddContext(),
-                ElementVHIF,GRID_ATTR(theGrid),IF_FORWARD,
+  DDD_IFAOneway(context,
+                dddctrl.ElementVHIF,GRID_ATTR(theGrid),IF_FORWARD,
                 CEIL(sizeof(struct generic_element))+2*sizeof(INT),
                 Gather_ElementInfo, Scatter_ElementInfo);
 
@@ -2752,10 +2767,12 @@ static INT RestrictMarks (GRID *theGrid)
   }
 #ifdef __PERIODIC_BOUNDARY__
         #ifdef ModelP
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
   PRINTDEBUG(gm,1,("\nexchange USED flag for restrict marks\n"));
   /* exchange USED flag of periodic vectors to indicate marked elements */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),Gather_USEDflag, Scatter_USEDflag);
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),sizeof(INT),Gather_USEDflag, Scatter_USEDflag);
         #endif
 
   /* if an element at a periodic boundary is marked,
@@ -6181,6 +6198,11 @@ static INT InitializePeriodicFlags(GRID *grid)
 
 static INT Grid_MakePeriodicMarksConsistent(GRID *grid)
 {
+#ifdef ModelP
+  auto& context = grid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+#endif
+
   PeriodicBoundaryInfoProcPtr IsPeriodicBnd;
   ELEMENT *elem;
   VECTOR *vec;
@@ -6229,8 +6251,8 @@ static INT Grid_MakePeriodicMarksConsistent(GRID *grid)
   /* exchange USED flag for periodic vectors */
   PRINTDEBUG(gm,1,("\n" PFMT "exchange USED flag for restrict marks in Grid_MakePeriodicMarksConsistent 1. comm.\n",me));
   /* exchange USED flag of periodic vectors to indicate marked elements */
-  DDD_IFAExchange(grid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(grid),sizeof(INT),Gather_USEDflag, Scatter_USEDflag);
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(grid),sizeof(INT),Gather_USEDflag, Scatter_USEDflag);
   #endif
 
   /* flag all periodic vectors consistently */
@@ -6277,8 +6299,8 @@ static INT Grid_MakePeriodicMarksConsistent(GRID *grid)
   /* exchange USED flag for periodic vectors */
   PRINTDEBUG(gm,1,("\n" PFMT "exchange USED flag for restrict marks in Grid_MakePeriodicMarksConsistent 2. comm.\n",me));
   /* exchange USED flag of periodic vectors to indicate marked elements */
-  DDD_IFAExchange(grid->dddContext(),
-                  BorderVectorSymmIF,GRID_ATTR(grid),sizeof(INT),Gather_USEDflag, Scatter_USEDflag);
+  DDD_IFAExchange(context,
+                  dddctrl.BorderVectorSymmIF,GRID_ATTR(grid),sizeof(INT),Gather_USEDflag, Scatter_USEDflag);
   #endif
 
   /* mark all periodic elements consistently */
diff --git a/gm/ugio.cc b/gm/ugio.cc
index da69c69d3..1bb470ffe 100644
--- a/gm/ugio.cc
+++ b/gm/ugio.cc
@@ -1948,8 +1948,11 @@ static int Scatter_RefineInfo (DDD::DDDContext&, DDD_OBJ obj, void *data)
 
 static INT SpreadRefineInfo(GRID *theGrid)
 {
-  DDD_IFAOneway(theGrid->dddContext(),
-                ElementIF,GRID_ATTR(theGrid),IF_FORWARD,4*sizeof(INT),
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
+  DDD_IFAOneway(context,
+                dddctrl.ElementIF,GRID_ATTR(theGrid),IF_FORWARD,4*sizeof(INT),
                 Gather_RefineInfo,Scatter_RefineInfo);
   return(GM_OK);
 }
@@ -1974,8 +1977,11 @@ static int Scatter_NodeType (DDD::DDDContext&, DDD_OBJ obj, void *data)
 
 static INT SpreadGridNodeTypes(GRID *theGrid)
 {
-  DDD_IFAOneway(theGrid->dddContext(),
-                NodeIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
+  DDD_IFAOneway(context,
+                dddctrl.NodeIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_NodeType,Scatter_NodeType);
   return(GM_OK);
 }
@@ -2672,8 +2678,11 @@ static int Scatter_EClasses(DDD::DDDContext&, DDD_OBJ obj, void *data)
 
 void CommunicateEClasses (MULTIGRID *theMG)
 {
-  DDD_IFOneway(theMG->dddContext(),
-               ElementVHIF,IF_FORWARD,sizeof(int),
+  auto& context = theMG->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
+  DDD_IFOneway(context,
+               dddctrl.ElementVHIF,IF_FORWARD,sizeof(int),
                Gather_EClasses, Scatter_EClasses);
   return;
 }
diff --git a/gm/ugm.cc b/gm/ugm.cc
index e3039857b..f0ec5e807 100644
--- a/gm/ugm.cc
+++ b/gm/ugm.cc
@@ -7202,11 +7202,14 @@ static INT PropagatePeriodicNodeClass (GRID *theGrid, INT nclass)
 INT NS_DIM_PREFIX PropagateNodeClasses (GRID *theGrid)
 {
     #ifdef ModelP
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNodeClasses():"
                    " 1. communication on level %d\n",theGrid->ppifContext().me(),GLEVEL(theGrid)))
   /* exchange NCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NodeClass, Scatter_NodeClass);
     #endif
 
@@ -7217,8 +7220,8 @@ INT NS_DIM_PREFIX PropagateNodeClasses (GRID *theGrid)
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNodeClasses(): 2. communication\n",
                    theGrid->ppifContext().me()))
   /* exchange NCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NodeClass, Scatter_NodeClass);
     #endif
 
@@ -7229,8 +7232,8 @@ INT NS_DIM_PREFIX PropagateNodeClasses (GRID *theGrid)
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNodeClasses(): 3. communication\n",
                    theGrid->ppifContext().me()))
   /* exchange NCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NodeClass, Scatter_NodeClass);
         #endif
 
@@ -7243,8 +7246,8 @@ INT NS_DIM_PREFIX PropagateNodeClasses (GRID *theGrid)
     PRINTDEBUG(gm,1,("\n" PFMT "PropagateNodeClasses(): 4. communication\n",
                      theGrid->ppifContext().me()))
     /* exchange NCLASS of Nodes */
-    DDD_IFAExchange(theGrid->dddContext(),
-                    BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+    DDD_IFAExchange(context,
+                    dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                     Gather_NodeClass, Scatter_NodeClass);
         #endif
   }
@@ -7252,8 +7255,8 @@ INT NS_DIM_PREFIX PropagateNodeClasses (GRID *theGrid)
 
         #ifdef ModelP
   /* send NCLASS to ghosts */
-  DDD_IFAOneway(theGrid->dddContext(),
-                NodeIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.NodeIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_NodeClass, Scatter_GhostNodeClass);
     #endif
 
@@ -7424,10 +7427,13 @@ static INT PropagatePeriodicNextNodeClass (GRID *theGrid, INT nnclass)
 INT NS_DIM_PREFIX PropagateNextNodeClasses (GRID *theGrid)
 {
     #ifdef ModelP
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNextNodeClasses(): 1. communication\n",theGrid->ppifContext().me()))
   /* exchange NNCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NextNodeClass, Scatter_NextNodeClass);
     #endif
 
@@ -7436,8 +7442,8 @@ INT NS_DIM_PREFIX PropagateNextNodeClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNextNodeClasses(): 2. communication\n",theGrid->ppifContext().me()))
   /* exchange NNCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NextNodeClass, Scatter_NextNodeClass);
     #endif
 
@@ -7446,8 +7452,8 @@ INT NS_DIM_PREFIX PropagateNextNodeClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNextNodeClasses(): 3. communication\n",theGrid->ppifContext().me()))
   /* exchange NNCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NextNodeClass, Scatter_NextNodeClass);
         #endif
 
@@ -7458,16 +7464,16 @@ INT NS_DIM_PREFIX PropagateNextNodeClasses (GRID *theGrid)
     #ifdef ModelP
   PRINTDEBUG(gm,1,("\n" PFMT "PropagateNextNodeClasses(): 4. communication\n",theGrid->ppifContext().me()))
   /* exchange NNCLASS of Nodes */
-  DDD_IFAExchange(theGrid->dddContext(),
-                  BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
+  DDD_IFAExchange(context,
+                  dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),sizeof(INT),
                   Gather_NextNodeClass, Scatter_NextNodeClass);
         #endif
 #endif
 
         #ifdef ModelP
   /* send NNCLASSn to ghosts */
-  DDD_IFAOneway(theGrid->dddContext(),
-                NodeIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+  DDD_IFAOneway(context,
+                dddctrl.NodeIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                 Gather_NextNodeClass, Scatter_GhostNextNodeClass);
     #endif
 
diff --git a/parallel/dddif/compat.cc b/parallel/dddif/compat.cc
index 0f97d9e91..3266f57c5 100644
--- a/parallel/dddif/compat.cc
+++ b/parallel/dddif/compat.cc
@@ -17,6 +17,36 @@ DDD::DDDContext& globalDDDContext()
 void globalDDDContext(const std::shared_ptr<DDD::DDDContext>& context)
 {
   globalDDDContext_ = context;
+
+  auto& dddctrl = ddd_ctrl(*context);
+
+  ElementIF = dddctrl.ElementIF;
+  ElementSymmIF = dddctrl.ElementSymmIF;
+  ElementVIF = dddctrl.ElementVIF;
+  ElementSymmVIF = dddctrl.ElementSymmVIF;
+  ElementVHIF = dddctrl.ElementVHIF;
+  ElementSymmVHIF = dddctrl.ElementSymmVHIF;
+
+  BorderNodeIF = dddctrl.BorderNodeIF;
+  BorderNodeSymmIF = dddctrl.BorderNodeSymmIF;
+  OuterNodeIF = dddctrl.OuterNodeIF;
+  NodeVIF = dddctrl.NodeVIF;
+  NodeIF = dddctrl.NodeIF;
+  NodeAllIF = dddctrl.NodeAllIF;
+
+  BorderVectorIF = dddctrl.BorderVectorIF;
+  BorderVectorSymmIF = dddctrl.BorderVectorSymmIF;
+  OuterVectorIF = dddctrl.OuterVectorIF;
+  OuterVectorSymmIF = dddctrl.OuterVectorSymmIF;
+  VectorVIF = dddctrl.VectorVIF;
+  VectorVAllIF = dddctrl.VectorVAllIF;
+  VectorIF = dddctrl.VectorIF;
+
+  EdgeIF = dddctrl.EdgeIF;
+  BorderEdgeSymmIF = dddctrl.BorderEdgeSymmIF;
+  EdgeHIF = dddctrl.EdgeHIF;
+  EdgeVHIF = dddctrl.EdgeVHIF;
+  EdgeSymmVHIF = dddctrl.EdgeSymmVHIF;
 }
 
 void globalDDDContext(std::nullptr_t)
diff --git a/parallel/dddif/identify.cc b/parallel/dddif/identify.cc
index 3fdc806db..f0e9b43ec 100644
--- a/parallel/dddif/identify.cc
+++ b/parallel/dddif/identify.cc
@@ -1890,33 +1890,35 @@ static int Scatter_SonEdgeInfo (DDD::DDDContext& context, DDD_OBJ obj, void *dat
 
 static INT Identify_SonNodes (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
 
 #ifdef IDENT_ONLY_NEW
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 NodeAllIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
+  DDD_IFAOnewayX(context,
+                 dddctrl.NodeAllIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
                  Gather_NewNodeInfo,Scatter_NewNodeInfo);
 
   if (UPGRID(theGrid) != NULL)
   {
     check_nodetype = CORNER_NODE;
     if (NIDENTASSERT)
-      DDD_IFAOnewayX(theGrid->dddContext(),
-                     NodeAllIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
+      DDD_IFAOnewayX(context,
+                     dddctrl.NodeAllIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
                      Gather_NodeInfo,Scatter_NodeInfo);
     if (0)
-      DDD_IFAOnewayX(theGrid->dddContext(),
-                     NodeAllIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
+      DDD_IFAOnewayX(context,
+                     dddctrl.NodeAllIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
                      Gather_TestNodeInfo,Scatter_TestNodeInfo);
   }
 
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 NodeAllIF,GRID_ATTR(theGrid),IF_FORWARD,2*sizeof(int),
+  DDD_IFAOnewayX(context,
+                 dddctrl.NodeAllIF,GRID_ATTR(theGrid),IF_FORWARD,2*sizeof(int),
                  Gather_IdentSonNode,Scatter_IdentSonNode);
 
 #else
 
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 NodeAllIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
+  DDD_IFAOnewayX(context,
+                 dddctrl.NodeAllIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
                  Gather_SonNodeInfo,Scatter_SonNodeInfo);
 
 #endif
@@ -1943,38 +1945,40 @@ static INT Identify_SonNodes (GRID *theGrid)
 
 INT Identify_SonEdges (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
 
 #ifdef IDENT_ONLY_NEW
 
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 EdgeSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
+  DDD_IFAOnewayX(context,
+                 dddctrl.EdgeSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
                  Gather_NewObjectInfo,Scatter_NewObjectInfo);
 
   if (UPGRID(theGrid) != NULL)
   {
     check_nodetype = MID_NODE;
-    DDD_IFAOnewayX(theGrid->dddContext(),
-                   NodeAllIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
+    DDD_IFAOnewayX(context,
+                   dddctrl.NodeAllIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
                    Gather_NodeInfo,Scatter_NodeInfo);
     if (EDIDENTASSERT)
-      DDD_IFAOnewayX(theGrid->dddContext(),
-                     EdgeSymmVHIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
+      DDD_IFAOnewayX(context,
+                     dddctrl.EdgeSymmVHIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
                      Gather_EdgeInfo,Scatter_EdgeInfo);
     if (0)
-      DDD_IFAOnewayX(theGrid->dddContext(),
-                     EdgeSymmVHIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
+      DDD_IFAOnewayX(context,
+                     dddctrl.EdgeSymmVHIF,GRID_ATTR(UPGRID(theGrid)),IF_FORWARD,sizeof(int),
                      Gather_TestEdgeInfo,Scatter_TestEdgeInfo);
   }
 
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 EdgeSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
+  DDD_IFAOnewayX(context,
+                 dddctrl.EdgeSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
                  Gather_IdentSonObjects,Scatter_IdentSonObjects);
 
 #else
 
   /* identify the sonedges */
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 EdgeSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
+  DDD_IFAOnewayX(context,
+                 dddctrl.EdgeSymmVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(int),
                  Gather_SonEdgeInfo,Scatter_SonEdgeInfo);
 
 #endif
diff --git a/parallel/dddif/initddd.cc b/parallel/dddif/initddd.cc
index aeced6c67..049ad7980 100644
--- a/parallel/dddif/initddd.cc
+++ b/parallel/dddif/initddd.cc
@@ -89,7 +89,6 @@ NS_DIM_PREFIX NodeIF, NS_DIM_PREFIX NodeAllIF;
 DDD_IF NS_DIM_PREFIX BorderVectorIF, NS_DIM_PREFIX BorderVectorSymmIF,
 NS_DIM_PREFIX OuterVectorIF, NS_DIM_PREFIX OuterVectorSymmIF,
 NS_DIM_PREFIX VectorVIF, NS_DIM_PREFIX VectorVAllIF, NS_DIM_PREFIX VectorIF;
-static DDD_IF VertexIF;
 /* DDD interfaces for edge communication */
 DDD_IF NS_DIM_PREFIX EdgeIF, NS_DIM_PREFIX BorderEdgeSymmIF, NS_DIM_PREFIX EdgeHIF, NS_DIM_PREFIX EdgeVHIF,
 NS_DIM_PREFIX EdgeSymmVHIF;
@@ -669,33 +668,33 @@ static void ddd_IfInit(DDD::DDDContext& context)
 
   A[0] = PrioMaster;
   B[0] = PrioHGhost; B[1] = PrioVHGhost;
-  ElementIF = DDD_IFDefine(context, nO,O,1,A,2,B);
-  DDD_IFSetName(context, ElementIF, "ElementIF: Master->HGhost/VHGhost");
+  dddctrl.ElementIF = DDD_IFDefine(context, nO,O,1,A,2,B);
+  DDD_IFSetName(context, dddctrl.ElementIF, "ElementIF: Master->HGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioHGhost; A[2] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioHGhost; B[2] = PrioVHGhost;
-  ElementSymmIF = DDD_IFDefine(context, nO,O,3,A,3,B);
-  DDD_IFSetName(context, ElementSymmIF, "ElementSymmIF: Master/HGhost/VHGhost");
+  dddctrl.ElementSymmIF = DDD_IFDefine(context, nO,O,3,A,3,B);
+  DDD_IFSetName(context, dddctrl.ElementSymmIF, "ElementSymmIF: Master/HGhost/VHGhost");
 
   A[0] = PrioMaster;
   B[0] = PrioVGhost; B[1] = PrioVHGhost;
-  ElementVIF = DDD_IFDefine(context, nO,O,1,A,2,B);
-  DDD_IFSetName(context, ElementVIF, "ElementVIF: Master->VGhost/VHGhost");
+  dddctrl.ElementVIF = DDD_IFDefine(context, nO,O,1,A,2,B);
+  DDD_IFSetName(context, dddctrl.ElementVIF, "ElementVIF: Master->VGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioVGhost; A[2] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioVGhost; B[2] = PrioVHGhost;
-  ElementSymmVIF = DDD_IFDefine(context, nO,O,3,A,3,B);
-  DDD_IFSetName(context, ElementSymmVIF, "ElementSymmVIF: Master/VGhost/VHGhost");
+  dddctrl.ElementSymmVIF = DDD_IFDefine(context, nO,O,3,A,3,B);
+  DDD_IFSetName(context, dddctrl.ElementSymmVIF, "ElementSymmVIF: Master/VGhost/VHGhost");
 
   A[0] = PrioMaster;
   B[0] = PrioVGhost; B[1] = PrioHGhost; B[2] = PrioVHGhost;
-  ElementVHIF = DDD_IFDefine(context, nO,O,1,A,3,B);
-  DDD_IFSetName(context, ElementVHIF, "ElementVHIF: Master->VGhost/HGhost/VHGhost");
+  dddctrl.ElementVHIF = DDD_IFDefine(context, nO,O,1,A,3,B);
+  DDD_IFSetName(context, dddctrl.ElementVHIF, "ElementVHIF: Master->VGhost/HGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioVGhost; A[2] = PrioHGhost; A[3] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioVGhost; B[2] = PrioHGhost; B[3] = PrioVHGhost;
-  ElementSymmVHIF = DDD_IFDefine(context, nO,O,4,A,4,B);
-  DDD_IFSetName(context, ElementSymmVHIF, "ElementSymmVHIF: Master/VGhost/HGhost/VHGhost");
+  dddctrl.ElementSymmVHIF = DDD_IFDefine(context, nO,O,4,A,4,B);
+  DDD_IFSetName(context, dddctrl.ElementSymmVHIF, "ElementSymmVHIF: Master/VGhost/HGhost/VHGhost");
 
 
   /* define node interfaces */
@@ -703,33 +702,33 @@ static void ddd_IfInit(DDD::DDDContext& context)
 
   A[0] = PrioBorder;
   B[0] = PrioMaster;
-  BorderNodeIF = DDD_IFDefine(context, 1,O,1,A,1,B);
-  DDD_IFSetName(context, BorderNodeIF, "BorderNodeIF: Border->Master");
+  dddctrl.BorderNodeIF = DDD_IFDefine(context, 1,O,1,A,1,B);
+  DDD_IFSetName(context, dddctrl.BorderNodeIF, "BorderNodeIF: Border->Master");
 
   A[0] = PrioMaster; A[1] = PrioBorder;
   B[0] = PrioMaster; B[1] = PrioBorder;
-  BorderNodeSymmIF = DDD_IFDefine(context, 1,O,2,A,2,B);
-  DDD_IFSetName(context, BorderNodeSymmIF, "BorderNodeSymmIF: Border/Master");
+  dddctrl.BorderNodeSymmIF = DDD_IFDefine(context, 1,O,2,A,2,B);
+  DDD_IFSetName(context, dddctrl.BorderNodeSymmIF, "BorderNodeSymmIF: Border/Master");
 
   A[0] = PrioMaster;
   B[0] = PrioHGhost; B[1] = PrioVHGhost;
-  OuterNodeIF = DDD_IFDefine(context, 1,O,1,A,2,B);
-  DDD_IFSetName(context, OuterNodeIF, "OuterNodeIF: Master->HGhost/VGhost");
+  dddctrl.OuterNodeIF = DDD_IFDefine(context, 1,O,1,A,2,B);
+  DDD_IFSetName(context, dddctrl.OuterNodeIF, "OuterNodeIF: Master->HGhost/VGhost");
 
   A[0] = PrioMaster;
   B[0] = PrioVGhost; B[1] = PrioVHGhost;
-  NodeVIF = DDD_IFDefine(context, 1,O,1,A,2,B);
-  DDD_IFSetName(context, NodeVIF, "NodeVIF: Master->VGhost/VHGhost");
+  dddctrl.NodeVIF = DDD_IFDefine(context, 1,O,1,A,2,B);
+  DDD_IFSetName(context, dddctrl.NodeVIF, "NodeVIF: Master->VGhost/VHGhost");
 
   A[0] = PrioMaster;
   B[0] = PrioVGhost; B[1] = PrioHGhost; B[2] = PrioVHGhost;
-  NodeIF = DDD_IFDefine(context, 1,O,1,A,3,B);
-  DDD_IFSetName(context, NodeIF, "NodeIF: Master->VGhost/HGhost/VHGhost");
+  dddctrl.NodeIF = DDD_IFDefine(context, 1,O,1,A,3,B);
+  DDD_IFSetName(context, dddctrl.NodeIF, "NodeIF: Master->VGhost/HGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioBorder; A[2] = PrioVGhost; A[3] = PrioHGhost; A[4] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioBorder; B[2] = PrioVGhost; B[3] = PrioHGhost; B[4] = PrioVHGhost;
-  NodeAllIF = DDD_IFDefine(context, 1,O,5,A,5,B);
-  DDD_IFSetName(context, NodeAllIF, "NodeAllIF: All/All");
+  dddctrl.NodeAllIF = DDD_IFDefine(context, 1,O,5,A,5,B);
+  DDD_IFSetName(context, dddctrl.NodeAllIF, "NodeAllIF: All/All");
 
 
   /* define vector interfaces */
@@ -737,46 +736,46 @@ static void ddd_IfInit(DDD::DDDContext& context)
 
   A[0] = PrioBorder;
   B[0] = PrioMaster;
-  BorderVectorIF = DDD_IFDefine(context, 1,O,1,A,1,B);
-  DDD_IFSetName(context, BorderVectorIF, "BorderVectorIF: Border->Master");
+  dddctrl.BorderVectorIF = DDD_IFDefine(context, 1,O,1,A,1,B);
+  DDD_IFSetName(context, dddctrl.BorderVectorIF, "BorderVectorIF: Border->Master");
 
   A[0] = PrioMaster; A[1] = PrioBorder;
   B[0] = PrioMaster; B[1] = PrioBorder;
-  BorderVectorSymmIF = DDD_IFDefine(context, 1,O,2,A,2,B);
-  DDD_IFSetName(context, BorderVectorSymmIF, "BorderVectorSymmIF: Master/Border");
+  dddctrl.BorderVectorSymmIF = DDD_IFDefine(context, 1,O,2,A,2,B);
+  DDD_IFSetName(context, dddctrl.BorderVectorSymmIF, "BorderVectorSymmIF: Master/Border");
 
   A[0] = PrioMaster;
   B[0] = PrioHGhost; B[1] = PrioVHGhost;
-  OuterVectorIF = DDD_IFDefine(context, 1,O,1,A,2,B);
-  DDD_IFSetName(context, OuterVectorIF, "OuterVectorIF: Master->HGhost/VHGhost");
+  dddctrl.OuterVectorIF = DDD_IFDefine(context, 1,O,1,A,2,B);
+  DDD_IFSetName(context, dddctrl.OuterVectorIF, "OuterVectorIF: Master->HGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioBorder; A[2] = PrioHGhost; A[3] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioBorder; B[2] = PrioHGhost; B[3] = PrioVHGhost;
-  OuterVectorSymmIF = DDD_IFDefine(context, 1,O,4,A,4,B);
-  DDD_IFSetName(context, OuterVectorSymmIF, "OuterVectorSymmIF: Master/Border/HGhost/VHGhost");
+  dddctrl.OuterVectorSymmIF = DDD_IFDefine(context, 1,O,4,A,4,B);
+  DDD_IFSetName(context, dddctrl.OuterVectorSymmIF, "OuterVectorSymmIF: Master/Border/HGhost/VHGhost");
 
   A[0] = PrioMaster;
   B[0] = PrioVGhost; B[1] = PrioVHGhost;
-  VectorVIF = DDD_IFDefine(context, 1,O,1,A,2,B);
-  DDD_IFSetName(context, VectorVIF, "VectorVIF: Master->VGhost/VHGhost");
+  dddctrl.VectorVIF = DDD_IFDefine(context, 1,O,1,A,2,B);
+  DDD_IFSetName(context, dddctrl.VectorVIF, "VectorVIF: Master->VGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioBorder; A[2] = PrioVGhost; A[3] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioBorder;
-  VectorVAllIF = DDD_IFDefine(context, 1,O,4,A,2,B);
-  DDD_IFSetName(context, VectorVAllIF, "VectorVAllIF: Master/Border/VGhost/VHGhost->Master/Border");
+  dddctrl.VectorVAllIF = DDD_IFDefine(context, 1,O,4,A,2,B);
+  DDD_IFSetName(context, dddctrl.VectorVAllIF, "VectorVAllIF: Master/Border/VGhost/VHGhost->Master/Border");
 
   A[0] = PrioMaster;
   B[0] = PrioVGhost; B[1] = PrioVHGhost; B[2] = PrioHGhost;
-  VectorIF = DDD_IFDefine(context, 1,O,1,A,3,B);
-  DDD_IFSetName(context, VectorIF, "VectorIF: Master->VGhost/VHGhost/HGhost");
+  dddctrl.VectorIF = DDD_IFDefine(context, 1,O,1,A,3,B);
+  DDD_IFSetName(context, dddctrl.VectorIF, "VectorIF: Master->VGhost/VHGhost/HGhost");
 
   /* define vertex interfaces */
   O[0] = dddctrl.TypeIVertex; O[1] = dddctrl.TypeBVertex;
 
   A[0] = PrioMaster;
   B[0] = PrioMaster;
-  VertexIF = DDD_IFDefine(context, 2,O,1,A,1,B);
-  DDD_IFSetName(context, VertexIF, "VertexIF: Master<->Master");
+  dddctrl.VertexIF = DDD_IFDefine(context, 2,O,1,A,1,B);
+  DDD_IFSetName(context, dddctrl.VertexIF, "VertexIF: Master<->Master");
 
 
   /* define edge interfaces */
@@ -784,28 +783,28 @@ static void ddd_IfInit(DDD::DDDContext& context)
 
   A[0] = PrioMaster;
   B[0] = PrioMaster;
-  EdgeIF = DDD_IFDefine(context, 1,O,1,A,1,B);
-  DDD_IFSetName(context, EdgeIF, "EdgeIF: Master<->Master");
+  dddctrl.EdgeIF = DDD_IFDefine(context, 1,O,1,A,1,B);
+  DDD_IFSetName(context, dddctrl.EdgeIF, "EdgeIF: Master<->Master");
 
   A[0] = PrioMaster; A[1] = PrioBorder;
   B[0] = PrioMaster; B[1] = PrioBorder;
-  BorderEdgeSymmIF = DDD_IFDefine(context, 1,O,2,A,2,B);
-  DDD_IFSetName(context, BorderEdgeSymmIF, "BorderEdgeSymmIF: Master/Border");
+  dddctrl.BorderEdgeSymmIF = DDD_IFDefine(context, 1,O,2,A,2,B);
+  DDD_IFSetName(context, dddctrl.BorderEdgeSymmIF, "BorderEdgeSymmIF: Master/Border");
 
   A[0] = PrioMaster; A[1] = PrioBorder;
   B[0] = PrioMaster; B[1] = PrioBorder; B[2] = PrioHGhost; B[3] = PrioVHGhost;
-  EdgeHIF = DDD_IFDefine(context, 1,O,2,A,4,B);
-  DDD_IFSetName(context, EdgeHIF, "EdgeHIF: Master/Border->Master/Border/PrioHGhost/PrioVHGhost");
+  dddctrl.EdgeHIF = DDD_IFDefine(context, 1,O,2,A,4,B);
+  DDD_IFSetName(context, dddctrl.EdgeHIF, "EdgeHIF: Master/Border->Master/Border/PrioHGhost/PrioVHGhost");
 
   A[0] = PrioMaster; A[1] = PrioBorder;
   B[0] = PrioMaster; B[1] = PrioBorder; B[2] = PrioVGhost; B[3] = PrioHGhost; B[4] = PrioVHGhost;
-  EdgeVHIF = DDD_IFDefine(context, 1,O,2,A,5,B);
-  DDD_IFSetName(context, EdgeVHIF, "EdgeVHIF: Master/Border->Master/Border/VGhost/HGhost/VHGhost");
+  dddctrl.EdgeVHIF = DDD_IFDefine(context, 1,O,2,A,5,B);
+  DDD_IFSetName(context, dddctrl.EdgeVHIF, "EdgeVHIF: Master/Border->Master/Border/VGhost/HGhost/VHGhost");
 
   A[0] = PrioMaster; A[1] = PrioBorder; A[2] = PrioVGhost; A[3] = PrioHGhost; A[4] = PrioVHGhost;
   B[0] = PrioMaster; B[1] = PrioBorder; B[2] = PrioVGhost; B[3] = PrioHGhost; B[4] = PrioVHGhost;
-  EdgeSymmVHIF = DDD_IFDefine(context, 1,O,5,A,5,B);
-  DDD_IFSetName(context, EdgeSymmVHIF, "EdgeSymmVHIF: Master/Border/VGhost/HGhost/VHGhost");
+  dddctrl.EdgeSymmVHIF = DDD_IFDefine(context, 1,O,5,A,5,B);
+  DDD_IFSetName(context, dddctrl.EdgeSymmVHIF, "EdgeSymmVHIF: Master/Border/VGhost/HGhost/VHGhost");
 
 }
 
diff --git a/parallel/dddif/parallel.h b/parallel/dddif/parallel.h
index a2fafea1a..6a5a34f2d 100644
--- a/parallel/dddif/parallel.h
+++ b/parallel/dddif/parallel.h
@@ -246,6 +246,18 @@ struct DDD_CTRL
   DDD_TYPE TypeBndP;
   DDD_TYPE TypeEdge;
   DDD_TYPE TypeBndS;
+
+  /* DDD Interfaces */
+  DDD_IF ElementIF, ElementSymmIF, ElementVIF, ElementSymmVIF,
+         ElementVHIF, ElementSymmVHIF;
+  DDD_IF BorderNodeIF, BorderNodeSymmIF, OuterNodeIF, NodeVIF,
+         NodeIF, NodeAllIF;
+  DDD_IF BorderVectorIF, BorderVectorSymmIF,
+         OuterVectorIF, OuterVectorSymmIF,
+         VectorVIF, VectorVAllIF, VectorIF;
+  DDD_IF VertexIF;
+  DDD_IF EdgeIF, BorderEdgeSymmIF, EdgeHIF, EdgeVHIF,
+         EdgeSymmVHIF;
 };
 
 #endif
diff --git a/parallel/dddif/partition.cc b/parallel/dddif/partition.cc
index 543e4107f..b44c9d47c 100644
--- a/parallel/dddif/partition.cc
+++ b/parallel/dddif/partition.cc
@@ -355,6 +355,9 @@ static int Scatter_RestrictedPartition (DDD::DDDContext&, DDD_OBJ obj, void *dat
 
 INT NS_DIM_PREFIX RestrictPartitioning (MULTIGRID *theMG)
 {
+  auto& context = theMG->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   INT i,j;
   ELEMENT *theElement;
   ELEMENT *theFather;
@@ -409,8 +412,8 @@ INT NS_DIM_PREFIX RestrictPartitioning (MULTIGRID *theMG)
       }
     }
     /* transfer restriction flags to master copies of father */
-    DDD_IFAOneway(theGrid->dddContext(),
-                  ElementVHIF,GRID_ATTR(theGrid),IF_BACKWARD,sizeof(INT),
+    DDD_IFAOneway(context,
+                  dddctrl.ElementVHIF,GRID_ATTR(theGrid),IF_BACKWARD,sizeof(INT),
                   Gather_ElementRestriction, Scatter_ElementRestriction);
   }
 
@@ -420,8 +423,8 @@ INT NS_DIM_PREFIX RestrictPartitioning (MULTIGRID *theMG)
     theGrid = GRID_ON_LEVEL(theMG,i);
 
     /* transfer (new) partitions of elements to non master copies */
-    DDD_IFAOnewayX(theGrid->dddContext(),
-                   ElementVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
+    DDD_IFAOnewayX(context,
+                   dddctrl.ElementVHIF,GRID_ATTR(theGrid),IF_FORWARD,sizeof(INT),
                    Gather_RestrictedPartition, Scatter_RestrictedPartition);
 
     for (theElement=PFIRSTELEMENT(theGrid); theElement!=NULL;
diff --git a/parallel/dddif/pgmcheck.cc b/parallel/dddif/pgmcheck.cc
index 7b87c810e..d883e2454 100644
--- a/parallel/dddif/pgmcheck.cc
+++ b/parallel/dddif/pgmcheck.cc
@@ -716,6 +716,9 @@ static int Scatter_EdgeObjectGids (DDD::DDDContext& context, DDD_OBJ obj, void *
 
 static INT CheckDistributedObjects (GRID *theGrid)
 {
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
   INT nerrors;
         #ifdef __TWODIM__
   INT size = MAX_CORNERS_OF_ELEM;       /* compare the 3/4 node ids */
@@ -727,14 +730,14 @@ static INT CheckDistributedObjects (GRID *theGrid)
   check_distributed_objects_errors = 0;
 
   // void DDD_IFAOnewayX (DDD::DDDContext&, DDD_IF, DDD_ATTR, DDD_IF_DIR, size_t, ComProcXPtr, ComProcXPtr);
-  DDD_IFAOnewayX(theGrid->dddContext(),
-                 ElementSymmVHIF,GRID_ATTR(theGrid),IF_BACKWARD,size*sizeof(DDD_GID),
+  DDD_IFAOnewayX(context,
+                 dddctrl.ElementSymmVHIF,GRID_ATTR(theGrid),IF_BACKWARD,size*sizeof(DDD_GID),
                  Gather_ElemObjectGids, Scatter_ElemObjectGids);
 
         #ifdef __THREEDIM__
   if (0)
-    DDD_IFAOnewayX(theGrid->dddContext(),
-                   BorderEdgeSymmIF,GRID_ATTR(theGrid),IF_BACKWARD,3*sizeof(DDD_GID),
+    DDD_IFAOnewayX(context,
+                   dddctrl.BorderEdgeSymmIF,GRID_ATTR(theGrid),IF_BACKWARD,3*sizeof(DDD_GID),
                    Gather_EdgeObjectGids, Scatter_EdgeObjectGids);
         #endif
 
diff --git a/parallel/dddif/priority.cc b/parallel/dddif/priority.cc
index d2cdc9d14..cc0697715 100644
--- a/parallel/dddif/priority.cc
+++ b/parallel/dddif/priority.cc
@@ -522,8 +522,11 @@ void NS_DIM_PREFIX SetGhostObjectPriorities (GRID *theGrid)
 
 INT NS_DIM_PREFIX SetBorderPriorities (GRID *theGrid)
 {
-  DDD_IFAExecLocal(theGrid->dddContext(),
-                   BorderNodeSymmIF,GRID_ATTR(theGrid),
+  auto& context = theGrid->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
+  DDD_IFAExecLocal(context,
+                   dddctrl.BorderNodeSymmIF,GRID_ATTR(theGrid),
                    ComputeNodeBorderPrios);
 
   /* TODO: distinguish two cases:
@@ -532,12 +535,12 @@ INT NS_DIM_PREFIX SetBorderPriorities (GRID *theGrid)
      2. with other vectortypes (side and/or edgevectors) use
           ComputeVectorBorderPrios
    */
-  DDD_IFAExecLocal(theGrid->dddContext(),
-                   BorderVectorSymmIF,GRID_ATTR(theGrid),
+  DDD_IFAExecLocal(context,
+                   dddctrl.BorderVectorSymmIF,GRID_ATTR(theGrid),
                    ComputeVectorBorderPrios);
 
-  DDD_IFAExecLocal(theGrid->dddContext(),
-                   BorderEdgeSymmIF,GRID_ATTR(theGrid),
+  DDD_IFAExecLocal(context,
+                   dddctrl.BorderEdgeSymmIF,GRID_ATTR(theGrid),
                    ComputeEdgeBorderPrios);
 
   return(GM_OK);
diff --git a/parallel/dddif/trans.cc b/parallel/dddif/trans.cc
index 88691b3f9..1abaf93e3 100644
--- a/parallel/dddif/trans.cc
+++ b/parallel/dddif/trans.cc
@@ -237,12 +237,15 @@ static int Scatter_ElemDest (DDD::DDDContext&, DDD_OBJ obj, void *data)
 
 static int UpdateGhostDests (MULTIGRID *theMG)
 {
-  DDD_IFOneway(theMG->dddContext(),
-               ElementIF, IF_FORWARD, sizeof(DDD_PROC),
+  auto& context = theMG->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
+  DDD_IFOneway(context,
+               dddctrl.ElementIF, IF_FORWARD, sizeof(DDD_PROC),
                Gather_ElemDest, Scatter_ElemDest);
 
-  DDD_IFOneway(theMG->dddContext(),
-               ElementVIF, IF_FORWARD, sizeof(DDD_PROC),
+  DDD_IFOneway(context,
+               dddctrl.ElementVIF, IF_FORWARD, sizeof(DDD_PROC),
                Gather_ElemDest, Scatter_ElemDest);
 
   return 0;
@@ -500,8 +503,11 @@ static int Scatter_VHGhostCmd (DDD::DDDContext& context, DDD_OBJ obj, void *data
 
 static int ComputeGhostCmds (MULTIGRID *theMG)
 {
-  DDD_IFOnewayX(theMG->dddContext(),
-                ElementVHIF, IF_FORWARD, sizeof(int),
+  auto& context = theMG->dddContext();
+  const auto& dddctrl = ddd_ctrl(context);
+
+  DDD_IFOnewayX(context,
+                dddctrl.ElementVHIF, IF_FORWARD, sizeof(int),
                 Gather_VHGhostCmd, Scatter_VHGhostCmd);
 
   return(0);
-- 
GitLab