From 814c8dfe607ddfc9a4331fe782f8bca50c90dc61 Mon Sep 17 00:00:00 2001
From: Kutscher <kutscher@irmb.tu-bs.de>
Date: Thu, 19 Oct 2023 16:50:28 +0200
Subject: [PATCH] refactoring BCStrategy

---
 apps/cpu/MultiphaseSymmetryTest/droplet.cpp   | 12 ++-
 .../BoundaryConditions/MultiphaseBCStrategy.h | 56 ++++++++++++
 .../MultiphaseNoSlipBCStrategy.cpp            | 85 +++++++++----------
 .../MultiphaseNoSlipBCStrategy.h              |  4 +-
 ...ltiphaseNonReflectingOutflowBCStrategy.cpp |  3 +-
 ...MultiphaseNonReflectingOutflowBCStrategy.h |  4 +-
 .../MultiphasePressureBCStrategy.cpp          |  3 +-
 .../MultiphasePressureBCStrategy.h            |  4 +-
 .../MultiphaseSlipBCStrategy.cpp              |  3 +-
 .../MultiphaseSlipBCStrategy.h                |  4 +-
 .../MultiphaseVelocityBC.cpp                  |  2 +-
 .../MultiphaseVelocityBCStrategy.cpp          |  3 +-
 .../MultiphaseVelocityBCStrategy.h            |  4 +-
 src/cpu/MultiphaseFlow/MultiphaseFlow.h       |  3 +-
 ...ltiphaseBoundaryConditionsBlockVisitor.cpp | 24 ++----
 ...MultiphaseBoundaryConditionsBlockVisitor.h |  8 --
 .../NonNewtonianBCStrategy.h                  | 56 ++++++++++++
 .../RheologyBinghamModelNoSlipBCStrategy.h    |  9 +-
 .../RheologyBinghamModelVelocityBCStrategy.h  |  2 -
 ...logyHerschelBulkleyModelNoSlipBCStrategy.h |  2 -
 .../RheologyNoSlipBCStrategy.h                |  4 +-
 ...heologyPowellEyringModelNoSlipBCStrategy.h |  9 +-
 .../RheologyVelocityBCStrategy.h              |  4 +-
 .../ThixotropyDensityBCStrategy.cpp           |  3 -
 .../ThixotropyDensityBCStrategy.h             |  4 +-
 .../ThixotropyNoSlipBCStrategy.cpp            |  4 -
 .../ThixotropyNoSlipBCStrategy.h              |  4 +-
 ...ixotropyNonReflectingOutflowBCStrategy.cpp |  3 -
 ...ThixotropyNonReflectingOutflowBCStrategy.h |  4 +-
 .../ThixotropyVelocityBCStrategy.cpp          |  3 -
 .../ThixotropyVelocityBCStrategy.h            |  4 +-
 ...hixotropyVelocityWithDensityBCStrategy.cpp |  2 -
 .../ThixotropyVelocityWithDensityBCStrategy.h |  4 +-
 .../NonNewtonianFluids/NonNewtonianFluids.h   |  2 +
 ...wtonianBoundaryConditionsBlockVisitor.cpp} | 47 +++-------
 ...NewtonianBoundaryConditionsBlockVisitor.h} | 19 ++---
 .../BoundaryConditions/BC.cpp                 |  3 +
 .../VirtualFluidsCore/BoundaryConditions/BC.h | 18 ++--
 .../BoundaryConditions/BCStrategy.cpp         |  2 -
 .../BoundaryConditions/BCStrategy.h           | 35 --------
 .../BoundaryConditions/BCStrategyRegister.cpp | 25 ++++++
 ...{BCStrategyType.h => BCStrategyRegister.h} | 57 ++++++-------
 .../BoundaryConditions/BoundaryConditions.h   |  6 +-
 .../BoundaryConditions/DensityBC.cpp          |  2 +-
 .../EqDensityBCStrategy.cpp                   |  2 -
 .../HighViscosityNoSlipBCStrategy.cpp         |  2 -
 .../MultiphaseBCStrategyType.h                | 73 ++++++++++++++++
 .../BoundaryConditions/NoSlipBC.h             |  2 +-
 .../BoundaryConditions/NoSlipBCStrategy.cpp   |  2 -
 .../NonEqDensityBCStrategy.cpp                |  2 -
 .../NonReflectingInflowBCStrategy.cpp         |  2 -
 .../NonReflectingOutflowBCStrategy.cpp        |  2 -
 ...lectingOutflowWithRelaxationBCStrategy.cpp |  2 -
 .../SimpleSlipBCStrategy.cpp                  |  2 -
 .../SimpleVelocityBCStrategy.cpp              |  2 -
 .../BoundaryConditions/SlipBC.cpp             |  2 +-
 .../BoundaryConditions/SlipBCStrategy.cpp     |  2 -
 .../BoundaryConditions/ThinWallBCSet.cpp      |  3 +-
 .../ThinWallNoSlipBCStrategy.cpp              | 12 ++-
 .../ThinWallNoSlipBCStrategy.h                |  1 +
 .../BoundaryConditions/VelocityBC.cpp         |  2 +-
 .../BoundaryConditions/VelocityBCStrategy.cpp |  2 -
 .../VelocityWithDensityBCStrategy.cpp         |  2 -
 .../Parallel/MPIIODataStructures.h            |  2 +-
 .../MPIIOMigrationBESimulationObserver.cpp    |  4 +-
 .../MPIIOMigrationSimulationObserver.cpp      |  4 +-
 .../MPIIORestartSimulationObserver.cpp        |  4 +-
 .../BoundaryConditionsBlockVisitor.cpp        | 10 +--
 .../Visitors/BoundaryConditionsBlockVisitor.h |  9 +-
 69 files changed, 397 insertions(+), 314 deletions(-)
 create mode 100644 src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h
 create mode 100644 src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h
 rename src/cpu/NonNewtonianFluids/Visitors/{RheologyBoundaryConditionsBlockVisitor.cpp => NonNewtonianBoundaryConditionsBlockVisitor.cpp} (63%)
 rename src/cpu/NonNewtonianFluids/Visitors/{RheologyBoundaryConditionsBlockVisitor.h => NonNewtonianBoundaryConditionsBlockVisitor.h} (85%)
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/BC.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp
 rename src/cpu/VirtualFluidsCore/BoundaryConditions/{BCStrategyType.h => BCStrategyRegister.h} (58%)
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h

diff --git a/apps/cpu/MultiphaseSymmetryTest/droplet.cpp b/apps/cpu/MultiphaseSymmetryTest/droplet.cpp
index fc8d28363..17406ccc6 100644
--- a/apps/cpu/MultiphaseSymmetryTest/droplet.cpp
+++ b/apps/cpu/MultiphaseSymmetryTest/droplet.cpp
@@ -188,18 +188,22 @@ void run(string configname)
         kernel->setBCSet(bcProc);
 
         SPtr<BC> noSlipBC(new NoSlipBC());
-        noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
+
+        SPtr<BCStrategy> noSlipStrategy = std::make_shared<MultiphaseNoSlipBCStrategy>();
+        noSlipBC->setBCStrategy(noSlipStrategy);
 
         SPtr<BC> outflowBC(new DensityBC(rhoLB));
         outflowBC->setBCStrategy(SPtr<BCStrategy>(new MultiphasePressureBCStrategy()));
         //outflowBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNonReflectingOutflowBCStrategy()));
+        //outflowBC->setBCStrategy(SPtr<BCStrategy>(new ThixotropyNonReflectingOutflowBCStrategy()));
         
 
         //////////////////////////////////////////////////////////////////////////////////
         // BC visitor
         MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-        bcVisitor.addBC(noSlipBC);
-        bcVisitor.addBC(outflowBC);
+        //NonNewtonianBoundaryConditionsBlockVisitor bcVisitor;
+        //bcVisitor.addBC(noSlipBC);
+        //bcVisitor.addBC(outflowBC);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
         grid->setDeltaX(dx);
@@ -261,7 +265,7 @@ void run(string configname)
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
-            //intHelper.addInteractor(wallYminInt);
+            intHelper.addInteractor(wallYminInt);
             //intHelper.addInteractor(wallYmaxInt);
             intHelper.selectBlocks();
 
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h
new file mode 100644
index 000000000..b2d114672
--- /dev/null
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h
@@ -0,0 +1,56 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file MultiphaseBCStrategy.h
+//! \ingroup BoundaryConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef MultiphaseBCStrategy_H
+#define MultiphaseBCStrategy_H
+
+#include "BCStrategy.h"
+
+class DistributionArray3D;
+
+class MultiphaseBCStrategy : public BCStrategy
+{
+public:
+    MultiphaseBCStrategy() = default;
+    virtual ~MultiphaseBCStrategy() = default;
+
+    virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
+    virtual void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) {}
+
+protected:
+    SPtr<DistributionArray3D> distributionsH;
+    SPtr<DistributionArray3D> distributionsH2;
+};
+
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
index ef2c7ac21..b9e02f9b5 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
@@ -32,74 +32,71 @@
 //=======================================================================================
 
 #include "MultiphaseNoSlipBCStrategy.h"
-#include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
+#include "DistributionArray3D.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseNoSlipBCStrategy::MultiphaseNoSlipBCStrategy()
 {
-   BCStrategy::type = BCStrategy::MultiphaseNoSlipBCStrategy;
-   BCStrategy::preCollision = false;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
 MultiphaseNoSlipBCStrategy::~MultiphaseNoSlipBCStrategy()
 {
-
 }
 //////////////////////////////////////////////////////////////////////////
 SPtr<BCStrategy> MultiphaseNoSlipBCStrategy::clone()
 {
-   SPtr<BCStrategy> bc(new MultiphaseNoSlipBCStrategy());
-   return bc;
+    SPtr<BCStrategy> bc(new MultiphaseNoSlipBCStrategy());
+    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
-   this->distributions = distributions;
+    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseNoSlipBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
 {
-	this->distributionsH = distributionsH;
+    this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseNoSlipBCStrategy::applyBC()
 {
-   real f[D3Q27System::ENDF+1];
-   real h[D3Q27System::ENDF+1];
-   real h2[D3Q27System::ENDF + 1];
-   //LBMReal feq[D3Q27System::ENDF+1];
-   //LBMReal heq[D3Q27System::ENDF+1];
-   distributions ->getDistributionInv(f, x1, x2, x3);
-   if (distributionsH2)
-       distributionsH2->getDistributionInv(h2, x1, x2, x3);
-   distributionsH->getDistributionInv(h, x1, x2, x3);
-  // LBMReal phi, vx1, vx2, vx3, p1;
-   
- //  D3Q27System::calcDensity(h, phi);
-   
- //  calcMacrosFct(f, p1, vx1, vx2, vx3);
- //  D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
- //  D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); 
+    real f[D3Q27System::ENDF + 1];
+    real h[D3Q27System::ENDF + 1];
+    real h2[D3Q27System::ENDF + 1];
+    // LBMReal feq[D3Q27System::ENDF+1];
+    // LBMReal heq[D3Q27System::ENDF+1];
+    distributions->getDistributionInv(f, x1, x2, x3);
+    if (distributionsH2) distributionsH2->getDistributionInv(h2, x1, x2, x3);
+    distributionsH->getDistributionInv(h, x1, x2, x3);
+    // LBMReal phi, vx1, vx2, vx3, p1;
+
+    //  D3Q27System::calcDensity(h, phi);
 
-   for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
-   {
-      if (bcPtr->hasNoSlipBoundaryFlag(fdir))
-      {
-         //quadratic bounce back
-         const int invDir = D3Q27System::INVDIR[fdir];
-		 real fReturn = f[invDir];
-         distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
-         //distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB 
-         real hReturn = h[invDir];
-		 distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
-         //distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB  
-         if (distributionsH2)
-         {
-             real h2Return = h2[invDir];
-             distributionsH2->setDistributionForDirection(h2Return, x1, x2, x3, invDir);//delay BB
-            // distributionsH2->setDistributionForDirection(h2Return, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+    //  calcMacrosFct(f, p1, vx1, vx2, vx3);
+    //  D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
+    //  D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3);
 
-         }
-      }
-   }
+    for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) {
+        if (bcPtr->hasNoSlipBoundaryFlag(fdir)) {
+            // quadratic bounce back
+            const int invDir = D3Q27System::INVDIR[fdir];
+            real fReturn = f[invDir];
+            distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir],
+                                                       x3 + D3Q27System::DX3[invDir], fdir);
+            // distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB
+            real hReturn = h[invDir];
+            distributionsH->setDistributionForDirection(hReturn, x1 + D3Q27System::DX1[invDir],
+                                                        x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+            // distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB
+            if (distributionsH2) {
+                real h2Return = h2[invDir];
+                distributionsH2->setDistributionForDirection(h2Return, x1, x2, x3, invDir); // delay BB
+                // distributionsH2->setDistributionForDirection(h2Return, x1 + D3Q27System::DX1[invDir], x2 +
+                // D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+            }
+        }
+    }
 }
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
index 390c2952e..f9a62a8a4 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
@@ -34,10 +34,10 @@
 #ifndef MultiphaseNoSlipBCStrategy_h__
 #define MultiphaseNoSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 
 //! A class implements no-slip boundary condition for multiphase simulations
-class MultiphaseNoSlipBCStrategy : public BCStrategy
+class MultiphaseNoSlipBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphaseNoSlipBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
index 34fae58a7..1dc704630 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
@@ -35,11 +35,10 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseNonReflectingOutflowBCStrategy::MultiphaseNonReflectingOutflowBCStrategy()
 {
-    BCStrategy::type = BCStrategyType::NonReflectingOutflowBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
index 3aae2ce03..874a12079 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
@@ -34,9 +34,9 @@
 #ifndef MultiphaseNonReflectingOutflowBCStrategy_h__
 #define MultiphaseNonReflectingOutflowBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 //! A class implements non reflecting outflow boundary condition for multiphase simulations
-class MultiphaseNonReflectingOutflowBCStrategy : public BCStrategy
+class MultiphaseNonReflectingOutflowBCStrategy : public MultiphaseBCStrategy
 {
 public:
     MultiphaseNonReflectingOutflowBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp
index 0ea532c2b..aa5150677 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp
@@ -34,12 +34,11 @@
 #include "MultiphasePressureBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 
 MultiphasePressureBCStrategy::MultiphasePressureBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::MultiphasePressureBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h
index cb6c6cf5e..f22efefdd 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h
@@ -34,9 +34,9 @@
 #ifndef MultiphasePressureBCStrategy_h__
 #define MultiphasePressureBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 //! A class implements velocity boundary condition for multiphase simulations
-class MultiphasePressureBCStrategy : public BCStrategy
+class MultiphasePressureBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphasePressureBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
index 92bc57c81..73edf8f99 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
@@ -34,11 +34,10 @@
 #include "MultiphaseSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseSlipBCStrategy::MultiphaseSlipBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::SlipBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
index 1eb25a958..990615907 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
@@ -34,10 +34,10 @@
 #ifndef MultiphaseSlipBCStrategy_h__
 #define MultiphaseSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 
 //! A class implements slip boundary condition for multiphase simulation
-class MultiphaseSlipBCStrategy : public BCStrategy
+class MultiphaseSlipBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphaseSlipBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
index 6a79904e6..b71bb2135 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
@@ -280,7 +280,7 @@ void MultiphaseVelocityBC::adaptBCForDirection( const D3Q27Interactor& interacto
 void MultiphaseVelocityBC::adaptBC( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& time ) 
 {
    this->setNodeVelocity(interactor,bc,worldX1,worldX2,worldX3,time);
-   bc->setBCStrategyType(strategyType);
+   bc->setBCStrategyKey(bcStrategyKey);
 }
 /*==========================================================*/
 void MultiphaseVelocityBC::setNodeVelocity( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& timestep) 
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
index dd364e85e..c4755f178 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
@@ -34,11 +34,10 @@
 #include "MultiphaseVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseVelocityBCStrategy::MultiphaseVelocityBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::MultiphaseVelocityBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
index 4e99c876a..217e141f5 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
@@ -34,9 +34,9 @@
 #ifndef MultiphaseVelocityBCStrategy_h__
 #define MultiphaseVelocityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 //! A class implements velocity boundary condition for multiphase simulations
-class MultiphaseVelocityBCStrategy : public BCStrategy
+class MultiphaseVelocityBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphaseVelocityBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/MultiphaseFlow.h b/src/cpu/MultiphaseFlow/MultiphaseFlow.h
index 79c2ce806..c7cceb223 100644
--- a/src/cpu/MultiphaseFlow/MultiphaseFlow.h
+++ b/src/cpu/MultiphaseFlow/MultiphaseFlow.h
@@ -40,7 +40,8 @@
 #include "MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h"
 #include "MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h"
 #include "MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h"
-          
+#include "MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h"
+
 #include "MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.h"
 #include "MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h"
 #include "MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.h"
diff --git a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
index ba8e9c4f1..cf2bc2700 100644
--- a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
@@ -44,6 +44,7 @@
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "LBMKernel.h"
+#include "MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h"
 
 MultiphaseBoundaryConditionsBlockVisitor::MultiphaseBoundaryConditionsBlockVisitor() :
 Block3DVisitor(0, D3Q27System::MAXLEVEL)
@@ -77,13 +78,6 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
       SPtr<BCArray3D> bcArray = bcSet->getBCArray();
 
       bool compressible = kernel->getCompressible();
-      real collFactorL = kernel->getCollisionFactorL();
-	  real collFactorG = kernel->getCollisionFactorG();
-	  real collFactorPh = 1.0/kernel->getPhaseFieldRelaxation();
-	  real densityRatio = kernel->getDensityRatio();
-	  real phiL = kernel->getPhiL();
-	  real phiH = kernel->getPhiH();
-      //int level = block->getLevel();
 
       int minX1 = 0;
       int minX2 = 0;
@@ -109,19 +103,19 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
                {
                   if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL)
                   {
-                     char alg = bcPtr->getBCStrategyType();
-                     SPtr<BCStrategy> bca = bcMap[alg];
+                     char bcStrategy = bcPtr->getBCStrategyKey();
+                     SPtr<BCStrategy> bca = BCStrategyRegister::getInstance()->getBCStrategy(bcStrategy);
                      
                      if (bca)
                      {
                         bca = bca->clone();
                         bca->setNodeIndex(x1, x2, x3);
                         bca->setBcPointer(bcPtr);
-                        //bca->addDistributions(distributions, distributionsH);
 						bca->addDistributions(distributions);
-						bca->addDistributionsH(distributionsH);
+                        if (distributionsH)
+                            dynamicPointerCast<MultiphaseBCStrategy>(bca)->addDistributionsH(distributionsH);
                         if (distributionsH2)
-                            bca->addDistributionsH2(distributionsH2);
+                            dynamicPointerCast<MultiphaseBCStrategy>(bca)->addDistributionsH2(distributionsH2);
                         bca->setCompressible(compressible);
                         bca->setBcArray(bcArray);
                         bcSet->addBC(bca);
@@ -133,11 +127,7 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
       }
    }
 }
-//////////////////////////////////////////////////////////////////////////
-void MultiphaseBoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
-{
-   bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getBCStrategy()));
-}
+
 
 
 
diff --git a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
index cc04246d4..22878fb73 100644
--- a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
@@ -35,10 +35,6 @@
 #define MultiphaseBoundaryConditionsBlockVisitor_h__
 
 #include "Block3DVisitor.h"
-#include <map>
-
-class BC;
-class BCStrategy;
 
 class MultiphaseBoundaryConditionsBlockVisitor : public Block3DVisitor
 {
@@ -47,9 +43,5 @@ public:
    virtual ~MultiphaseBoundaryConditionsBlockVisitor();
    
    void visit(SPtr<Grid3D> grid, SPtr<Block3D> block);
-   void addBC(SPtr<BC> bc);
-protected:
-private:
-   std::map<char, SPtr<BCStrategy>> bcMap;
 };
 #endif // MultiphaseBoundaryConditionsBlockVisitor_h__
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h
new file mode 100644
index 000000000..0797ee70c
--- /dev/null
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h
@@ -0,0 +1,56 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file NonNewtonianBCStrategy.h
+//! \ingroup BoundaryConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef NonNewtonianBCStrategy_H
+#define NonNewtonianBCStrategy_H
+
+#include "BCStrategy.h"
+
+class DistributionArray3D;
+
+class NonNewtonianBCStrategy : public BCStrategy
+{
+public:
+    NonNewtonianBCStrategy() = default;
+    virtual ~NonNewtonianBCStrategy() = default;
+
+    virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
+    virtual void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) {}
+
+protected:
+    SPtr<DistributionArray3D> distributionsH;
+    SPtr<DistributionArray3D> distributionsH2;
+};
+
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
index 24c96da39..7707c12d9 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
@@ -42,19 +42,18 @@ class RheologyBinghamModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 public:
    RheologyBinghamModelNoSlipBCStrategy()
    {
-      BCStrategy::type = BCStrategy::RheologyBinghamModelNoSlipBCStrategy;
-      BCStrategy::preCollision = true;
+       BCStrategy::preCollision = true;
    }
    ~RheologyBinghamModelNoSlipBCStrategy() {}
    SPtr<BCStrategy> clone() override
    {
-      SPtr<BCStrategy> bc(new RheologyBinghamModelNoSlipBCStrategy());
-      return bc;
+       SPtr<BCStrategy> bc(new RheologyBinghamModelNoSlipBCStrategy());
+       return bc;
    }
 protected:
    real getRheologyCollFactor(real omegaInf, real shearRate, real drho) const override 
    { 
-      return Rheology::getBinghamCollFactor(omegaInf, shearRate, drho);
+       return Rheology::getBinghamCollFactor(omegaInf, shearRate, drho);
    }
 };
 #endif // BinghamModelNoSlipBCStrategy_h__
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
index 9039d00ad..f175cc6fb 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
@@ -36,14 +36,12 @@
 
 #include "RheologyVelocityBCStrategy.h"
 #include "cpu/NonNewtonianFluids/LBM/Rheology.h"
-#include "BCStrategyType.h"
 
 class RheologyBinghamModelVelocityBCStrategy : public RheologyVelocityBCStrategy
 {
 public:
    RheologyBinghamModelVelocityBCStrategy()
    {
-      BCStrategy::type = BCStrategyType::RheologyBinghamModelVelocityBCStrategy;
       BCStrategy::preCollision = true;
    }
    ~RheologyBinghamModelVelocityBCStrategy() {}
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
index d5aa651d1..45a9abc16 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
@@ -35,14 +35,12 @@
 
 #include "RheologyNoSlipBCStrategy.h"
 #include "cpu/NonNewtonianFluids/LBM/Rheology.h"
-#include "BCStrategyType.h"
 
 class RheologyHerschelBulkleyModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 {
 public:
    RheologyHerschelBulkleyModelNoSlipBCStrategy() 
    {
-      BCStrategy::type = BCStrategyType::RheologyHerschelBulkleyModelNoSlipBCStrategy;
       BCStrategy::preCollision = true;
    }
    ~RheologyHerschelBulkleyModelNoSlipBCStrategy() {}
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
index 611d87bcd..ec2aef786 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
@@ -33,12 +33,12 @@
 #ifndef RheologyNoSlipBCStrategy_h__
 #define RheologyNoSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class RheologyNoSlipBCStrategy : public BCStrategy
+class RheologyNoSlipBCStrategy : public NonNewtonianBCStrategy
 {
 public:
    RheologyNoSlipBCStrategy() = default;
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
index f867ab1dc..09a2e906f 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
@@ -41,19 +41,18 @@ class RheologyPowellEyringModelNoSlipBCStrategy : public RheologyNoSlipBCStrateg
 public:
    RheologyPowellEyringModelNoSlipBCStrategy() 
    {
-      BCStrategy::type = BCStrategy::RheologyPowellEyringModelNoSlipBCStrategy;
-      BCStrategy::preCollision = true;
+       BCStrategy::preCollision = true;
    }
    ~RheologyPowellEyringModelNoSlipBCStrategy() {}
    SPtr<BCStrategy> clone() override
    {
-      SPtr<BCStrategy> bc(new RheologyPowellEyringModelNoSlipBCStrategy());
-      return bc;
+       SPtr<BCStrategy> bc(new RheologyPowellEyringModelNoSlipBCStrategy());
+       return bc;
    }
 protected:
    real getRheologyCollFactor(real omegaInf, real shearRate, real drho) const override
    {
-      return Rheology::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
+       return Rheology::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
    }
 };
 #endif // RheologyPowellEyringModelNoSlipBCStrategy_h__
\ No newline at end of file
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
index 00c08230c..bb2846871 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
@@ -33,12 +33,12 @@
 #ifndef RheologyVelocityBCStrategy_h__
 #define RheologyVelocityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class RheologyVelocityBCStrategy : public BCStrategy
+class RheologyVelocityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
    RheologyVelocityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
index f5db712e0..d9c393df3 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
@@ -34,13 +34,10 @@
 #include "ThixotropyDensityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyDensityBCStrategy::ThixotropyDensityBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyDensityBCStrategy;
 	BCStrategy::preCollision = false;
-	BCStrategy::thixotropy = true;
 	lambdaBC = 0.0;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
index a40500fe5..5dddbefc6 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
@@ -34,10 +34,10 @@
 #ifndef ThixotropyDensityBCStrategy_h__
 #define ThixotropyDensityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
 
-class ThixotropyDensityBCStrategy : public BCStrategy
+class ThixotropyDensityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyDensityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
index 57797d8b8..f8e86ca9d 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
@@ -33,14 +33,10 @@
 #include "ThixotropyNoSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyNoSlipBCStrategy::ThixotropyNoSlipBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyNoSlipBCStrategy;
 	BCStrategy::preCollision = false;
-	BCStrategy::thixotropy = true;
-	
 }
 //////////////////////////////////////////////////////////////////////////
 ThixotropyNoSlipBCStrategy::~ThixotropyNoSlipBCStrategy()
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
index edd895233..f406bad38 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
@@ -33,9 +33,9 @@
 #ifndef ThixotropyNoSlipBCStrategy_h__
 #define ThixotropyNoSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
-class ThixotropyNoSlipBCStrategy : public BCStrategy
+class ThixotropyNoSlipBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyNoSlipBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
index 74f483b41..ff71b99ed 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
@@ -33,13 +33,10 @@
 #include "ThixotropyNonReflectingOutflowBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyNonReflectingOutflowBCStrategy::ThixotropyNonReflectingOutflowBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyNonReflectingOutflowBCStrategy;
 	BCStrategy::preCollision = true;
-	BCStrategy::thixotropy = true;
 }
 //////////////////////////////////////////////////////////////////////////
 ThixotropyNonReflectingOutflowBCStrategy::~ThixotropyNonReflectingOutflowBCStrategy()
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
index 7ae90994a..5e466a5a5 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
@@ -33,10 +33,10 @@
 #ifndef ThixotropyNonReflectingOutflowBCStrategy_h__
 #define ThixotropyNonReflectingOutflowBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
 
-class ThixotropyNonReflectingOutflowBCStrategy : public BCStrategy
+class ThixotropyNonReflectingOutflowBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyNonReflectingOutflowBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
index ee1e75cb9..2e69dbaf9 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
@@ -33,13 +33,10 @@
 #include "ThixotropyVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyVelocityBCStrategy::ThixotropyVelocityBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyVelocityBCStrategy;
 	BCStrategy::preCollision = false;
-	BCStrategy::thixotropy = true;
 	lambdaBC = vf::basics::constant::c0o1;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
index 93cf6d220..aa08f4716 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
@@ -33,10 +33,10 @@
 #ifndef ThixotropyVelocityBCStrategy_h__
 #define ThixotropyVelocityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
 
-class ThixotropyVelocityBCStrategy : public BCStrategy
+class ThixotropyVelocityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyVelocityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
index 604260918..fb43ccc69 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "ThixotropyVelocityWithDensityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BCArray3D.h"
-#include "BCStrategyType.h"
 
 ThixotropyVelocityWithDensityBCStrategy::ThixotropyVelocityWithDensityBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::ThixotropyVelocityWithDensityBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
index 74d33efc0..f590c9cff 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
@@ -34,14 +34,14 @@
 #ifndef ThixotropyVelocityWithDensityBCStrategy_h__
 #define ThixotropyVelocityWithDensityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
 //!  \brief Class implements Dirichlet boundary condition for velocity. Set density in system. It is used together with non reflecting outflow.  
 
-class ThixotropyVelocityWithDensityBCStrategy : public BCStrategy
+class ThixotropyVelocityWithDensityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
    ThixotropyVelocityWithDensityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h b/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h
index 705a07af1..de4bea429 100644
--- a/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h
+++ b/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h
@@ -56,4 +56,6 @@
 #include "NonNewtonianFluids/LBM/RheologyK17LBMKernel.h"
 #include "NonNewtonianFluids/LBM/RheologyPowellEyringModelLBMKernel.h"
 
+#include "NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h"
+
 #endif
\ No newline at end of file
diff --git a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.cpp
similarity index 63%
rename from src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp
rename to src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.cpp
index 2bb8da69a..77f064fb9 100644
--- a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.cpp
@@ -26,12 +26,12 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BoundaryConditionsBlockVisitor.cpp
+//! \file NonNewtonianBoundaryConditionsBlockVisitor.cpp
 //! \ingroup Visitors
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "BoundaryConditionsBlockVisitor.h"
+#include "NonNewtonianBoundaryConditionsBlockVisitor.h"
 #include "BC.h"
 #include "BCArray3D.h"
 #include "BCSet.h"
@@ -44,22 +44,17 @@
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "ILBMKernel.h"
-#include "BCStrategyType.h"
 
-#include "NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h"
-#include "NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h"
-#include "NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h"
-#include "NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h"
-#include "NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h"
 
+#include "NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h"
 
-BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
+NonNewtonianBoundaryConditionsBlockVisitor::NonNewtonianBoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-BoundaryConditionsBlockVisitor::~BoundaryConditionsBlockVisitor() = default;
+NonNewtonianBoundaryConditionsBlockVisitor::~NonNewtonianBoundaryConditionsBlockVisitor() = default;
 //////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
+void NonNewtonianBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
     if (block->getRank() == grid->getRank()) {
         SPtr<ILBMKernel> kernel = block->getKernel();
@@ -90,14 +85,16 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         bcSet->clearBC();
 
         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
+        SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
+        SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions();
 
         for (int x3 = minX3; x3 < maxX3; x3++) {
             for (int x2 = minX2; x2 < maxX2; x2++) {
                 for (int x1 = minX1; x1 < maxX1; x1++) {
                     if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
                         if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL) {
-                            char alg              = bcPtr->getBCStrategyType();
-                            SPtr<BCStrategy> bca = bcMap[alg];
+                            char bcStrategy = bcPtr->getBCStrategyKey();
+                            SPtr<BCStrategy> bca = BCStrategyRegister::getInstance()->getBCStrategy(bcStrategy);
 
                             if (bca) {
                                 bca = bca->clone();
@@ -106,21 +103,10 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
                                 bca->setBcPointer(bcPtr);
                                 bca->addDistributions(distributions);
 
-                                if (alg == BCStrategyType::ThixotropyVelocityBCStrategy)
-                                    std::static_pointer_cast<ThixotropyVelocityBCStrategy>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyDensityBCStrategy)
-                                    std::static_pointer_cast<ThixotropyDensityBCStrategy>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyNoSlipBCStrategy)
-                                    std::static_pointer_cast<ThixotropyNoSlipBCStrategy>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyNonReflectingOutflowBCStrategy)
-                                    std::static_pointer_cast<ThixotropyNonReflectingOutflowBCStrategy>(bca)
-                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyVelocityWithDensityBCStrategy)
-                                    std::static_pointer_cast<ThixotropyVelocityWithDensityBCStrategy>(bca)
-                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                                if (distributionsH)
+                                    dynamicPointerCast<NonNewtonianBCStrategy>(bca)->addDistributionsH(distributionsH);
+                                if (distributionsH2)
+                                    dynamicPointerCast<NonNewtonianBCStrategy>(bca)->addDistributionsH2(distributionsH2);
 
                                 bca->setCollFactor(collFactor);
                                 bca->setCompressible(compressible);
@@ -134,8 +120,3 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         }
     }
 }
-//////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
-{
-    bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getBCStrategy()));
-}
diff --git a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h
similarity index 85%
rename from src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h
rename to src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h
index 8954bf73a..759fef3b8 100644
--- a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h
+++ b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h
@@ -26,36 +26,29 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BoundaryConditionsBlockVisitor.h
+//! \file NonNewtonianBoundaryConditionsBlockVisitor.h
 //! \ingroup Visitors
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef BoundaryConditionBlockVisitor_h__
-#define BoundaryConditionBlockVisitor_h__
+#ifndef NonNewtonianBoundaryConditionsBlockVisitor_h__
+#define NonNewtonianBoundaryConditionsBlockVisitor_h__
 
 #include <PointerDefinitions.h>
-#include <map>
 
 #include "Block3DVisitor.h"
 
 class Grid3D;
 class Block3D;
-class BCStrategy;
-class BC;
 
 //! \brief set boundary conditions
-class BoundaryConditionsBlockVisitor : public Block3DVisitor
+class NonNewtonianBoundaryConditionsBlockVisitor : public Block3DVisitor
 {
 public:
-    BoundaryConditionsBlockVisitor();
-    ~BoundaryConditionsBlockVisitor() override;
+    NonNewtonianBoundaryConditionsBlockVisitor();
+    ~NonNewtonianBoundaryConditionsBlockVisitor() override;
 
     void visit(SPtr<Grid3D> grid, SPtr<Block3D> block) override;
-    void addBC(SPtr<BC> bc);
 
-protected:
-private:
-    std::map<char, SPtr<BCStrategy>> bcMap;
 };
 #endif // BoundaryConditionBlockVisitor_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.cpp
new file mode 100644
index 000000000..f6bc5c635
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.cpp
@@ -0,0 +1,3 @@
+#include "BC.h"
+
+char BC::keyCounter = 0;
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
index 5c699bf28..279b72d7a 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
@@ -37,6 +37,7 @@
 
 #include "BCStrategy.h"
 #include "BoundaryConditions.h"
+#include "BCStrategyRegister.h"
 
 class D3Q27Interactor;
 
@@ -66,24 +67,27 @@ public:
                                      const real &worldX1, const real &worldX2, const real &worldX3,
                                      const real &q, const int &fdirection, const real &time = 0) = 0;
 
-    void setBCStrategy(SPtr<BCStrategy> alg)
+    void setBCStrategy(SPtr<BCStrategy> bcStrategy)
     {
-        strategyType = alg->getType();
-        strategy     = alg;
+        bcStrategyKey = keyCounter++; 
+        BCStrategyRegister::getInstance()->setBCStrategy(bcStrategyKey, bcStrategy);
     }
-    SPtr<BCStrategy> getBCStrategy() { return strategy; }
-    char getBCStrategyType() { return strategyType; }
+    //SPtr<BCStrategy> getBCStrategy() { return bcStrategy; }
+    //char getBCStrategyKey() { return bcStrategyKey; }
 
 protected:
     short secondaryBcOption{ 0 };
 
     char type{ 0 };
 
-    SPtr<BCStrategy> strategy;
-    char strategyType{ -1 };
+    char bcStrategyKey{ -1 };
 
     static const char TIMEDEPENDENT = 1 << 0; //'1';
     static const char TIMEPERIODIC  = 1 << 1; //'2';
+
+    static char keyCounter;
 };
 
+
+
 #endif // D3Q27BOUNDARYCONDITIONADAPTER_H
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
index e5c98ecb8..7308548c3 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
@@ -73,8 +73,6 @@ void BCStrategy::setCompressible(bool c)
 //////////////////////////////////////////////////////////////////////////
 void BCStrategy::setCollFactor(real cf) { collFactor = cf; }
 //////////////////////////////////////////////////////////////////////////
-char BCStrategy::getType() { return type; }
-//////////////////////////////////////////////////////////////////////////
 bool BCStrategy::isPreCollision() { return preCollision; }
 //////////////////////////////////////////////////////////////////////////
 SPtr<BCArray3D> BCStrategy::getBcArray() { return bcArray; }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
index 348b3b3d3..6d91cfebb 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
@@ -47,64 +47,29 @@ class Block3D;
 //! \details  BCStrategy provides interface for implementation of diferent boundary conditions
 class BCStrategy
 {
-//public:
-//    static const char VelocityBCStrategy                           = 0;
-//    static const char EqDensityBCStrategy                          = 1;
-//    static const char NonEqDensityBCStrategy                       = 2;
-//    static const char NoSlipBCStrategy                             = 3;
-//    static const char SlipBCStrategy                               = 4;
-//    static const char HighViscosityNoSlipBCStrategy                = 5;
-//    static const char ThinWallNoSlipBCStrategy                     = 6;
-//    static const char VelocityWithDensityBCStrategy                = 7;
-//    static const char NonReflectingOutflowBCStrategy               = 8;
-//    static const char ThixotropyVelocityBCStrategy                 = 9;
-//    static const char ThixotropyDensityBCStrategy                  = 10;
-//    static const char ThixotropyNoSlipBCStrategy                   = 11;
-//    static const char ThixotropyNonReflectingOutflowBCStrategy     = 12;
-//    static const char ThixotropyVelocityWithDensityBCStrategy      = 13;
-//    static const char RheologyBinghamModelNoSlipBCStrategy         = 14;
-//    static const char RheologyHerschelBulkleyModelNoSlipBCStrategy = 15;
-//    static const char SimpleVelocityBCStrategy                     = 16;
-//    static const char SimpleSlipBCStrategy                         = 17;
-//    static const char RheologyPowellEyringModelNoSlipBCStrategy    = 18;
-//    static const char RheologyBinghamModelVelocityBCStrategy       = 19;
-//    static const char MultiphaseNoSlipBCStrategy                   = 20;
-//    static const char MultiphaseVelocityBCStrategy                 = 21;
-//    static const char NonReflectingInflowBCStrategy                = 22;
-//    static const char NonReflectingOutflowWithRelaxationBCStrategy = 23;
-//    static const char MultiphasePressureBCStrategy                 = 24;
-
 public:
     BCStrategy() = default;
     virtual ~BCStrategy() = default;
 
     virtual void addDistributions(SPtr<DistributionArray3D> distributions)   = 0;
-    virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
-    virtual void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) {}
     void setBlock(SPtr<Block3D> block);
     void setNodeIndex(int x1, int x2, int x3);
     void setBcPointer(SPtr<BoundaryConditions> bcPtr);
     void setCompressible(bool c);
     void setCollFactor(real cf);
 
-    char getType();
     bool isPreCollision();
     virtual SPtr<BCStrategy> clone() = 0;
     SPtr<BCArray3D> getBcArray();
     void setBcArray(SPtr<BCArray3D> bcarray);
     virtual void applyBC() = 0;
-    bool getThixotropy(){ return thixotropy; };
 
 protected:
     bool compressible { false };
-    char type;
     bool preCollision;
-    bool thixotropy { false };
 
     SPtr<BoundaryConditions> bcPtr;
     SPtr<DistributionArray3D> distributions;
-    SPtr<DistributionArray3D> distributionsH;
-    SPtr<DistributionArray3D> distributionsH2;
     SPtr<BCArray3D> bcArray;
     SPtr<Block3D> block;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp
new file mode 100644
index 000000000..fafff9e24
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp
@@ -0,0 +1,25 @@
+#include "BCStrategyRegister.h"
+#include "BC.h"
+#include "BCStrategy.h"
+
+std::mutex BCStrategyRegister::instantiation_mutex = std::mutex();
+std::shared_ptr<BCStrategyRegister> BCStrategyRegister::instance = std::shared_ptr<BCStrategyRegister>();
+
+std::shared_ptr<BCStrategyRegister> BCStrategyRegister::getInstance()
+{
+    std::lock_guard<std::mutex> myLock(instantiation_mutex);
+    if (!instance) {
+        instance = std::shared_ptr<BCStrategyRegister>(new BCStrategyRegister);
+    }
+    return instance;
+}
+
+void BCStrategyRegister::setBCStrategy(char strategyKey, std::shared_ptr<BCStrategy> bcStrategy)
+{
+    bcMap.insert(std::make_pair(strategyKey, bcStrategy));
+}
+
+std::shared_ptr<BCStrategy> BCStrategyRegister::getBCStrategy(char strategyKey)
+{
+    return bcMap[strategyKey];
+}
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyType.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.h
similarity index 58%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyType.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.h
index fccdef64f..57cb089fe 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyType.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.h
@@ -26,41 +26,38 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BCStrategy.h
+//! \file BCStrategyRegister.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef BCStrategyType_H
-#define BCStrategyType_H
+#ifndef BCStrategyRegister_H
+#define BCStrategyRegister_H
 
-struct BCStrategyType
+#include <memory>
+#include <map>
+#include <mutex>
+
+class BC;
+class BCStrategy;
+
+class BCStrategyRegister
 {
-    static const char VelocityBCStrategy = 0;
-    static const char EqDensityBCStrategy = 1;
-    static const char NonEqDensityBCStrategy = 2;
-    static const char NoSlipBCStrategy = 3;
-    static const char SlipBCStrategy = 4;
-    static const char HighViscosityNoSlipBCStrategy = 5;
-    static const char ThinWallNoSlipBCStrategy = 6;
-    static const char VelocityWithDensityBCStrategy = 7;
-    static const char NonReflectingOutflowBCStrategy = 8;
-    static const char ThixotropyVelocityBCStrategy = 9;
-    static const char ThixotropyDensityBCStrategy = 10;
-    static const char ThixotropyNoSlipBCStrategy = 11;
-    static const char ThixotropyNonReflectingOutflowBCStrategy = 12;
-    static const char ThixotropyVelocityWithDensityBCStrategy = 13;
-    static const char RheologyBinghamModelNoSlipBCStrategy = 14;
-    static const char RheologyHerschelBulkleyModelNoSlipBCStrategy = 15;
-    static const char SimpleVelocityBCStrategy = 16;
-    static const char SimpleSlipBCStrategy = 17;
-    static const char RheologyPowellEyringModelNoSlipBCStrategy = 18;
-    static const char RheologyBinghamModelVelocityBCStrategy = 19;
-    static const char MultiphaseNoSlipBCStrategy = 20;
-    static const char MultiphaseVelocityBCStrategy = 21;
-    static const char NonReflectingInflowBCStrategy = 22;
-    static const char NonReflectingOutflowWithRelaxationBCStrategy = 23;
-    static const char MultiphasePressureBCStrategy = 24;
-};
+public:
+    BCStrategyRegister(const BCStrategyRegister &) = delete;
+    BCStrategyRegister &operator=(const BCStrategyRegister &rhs) = delete;
+    static std::shared_ptr<BCStrategyRegister> getInstance();
 
+    virtual ~BCStrategyRegister() = default;
+
+    void setBCStrategy(char bcStrategyKey, std::shared_ptr<BCStrategy> bcStrategy);
+    std::shared_ptr<BCStrategy> getBCStrategy(char type);
+
+private:
+    BCStrategyRegister() = default;
+    static std::mutex instantiation_mutex;
+    static std::shared_ptr<BCStrategyRegister> instance;
+  
+    std::map<char, std::shared_ptr<BCStrategy>> bcMap;
+};
 #endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
index 92cfb6f3c..cbcc2b0da 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
@@ -311,8 +311,8 @@ public:
         return (((flag >> (optionDigits * direction)) & maxOptionVal) != 0);
     }
 
-    void setBCStrategyType(char alg) { algorithmType = alg; }
-    char getBCStrategyType() { return algorithmType; }
+    void setBCStrategyKey(char key) { bcStrategyKey = key; }
+    char getBCStrategyKey() { return bcStrategyKey; }
 
 public:
     static const int optionDigits = 2;   //--> 2 bits for secondary Option --> maxOptionVal = 7
@@ -335,7 +335,7 @@ protected:
 
     float nx1{ vf::basics::constant::c0o1 }, nx2{ vf::basics::constant::c0o1 }, nx3{ vf::basics::constant::c0o1 };
 
-    char algorithmType { -1 };
+    char bcStrategyKey { -1 };
 
 private:
     friend class MPIIORestartSimulationObserver;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
index 5dacf756c..1256cfc75 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
@@ -149,7 +149,7 @@ void DensityBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditio
                                const real &worldX2, const real &worldX3, const real &time)
 {
     this->setNodeDensity(interactor, bc, worldX1, worldX2, worldX3, time);
-    bc->setBCStrategyType(strategyType);
+    bc->setBCStrategyKey(bcStrategyKey);
 }
 /*==========================================================*/
 void DensityBC::setNodeDensity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
index 720ad7cc3..26004e89b 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "EqDensityBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 EqDensityBCStrategy::EqDensityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::EqDensityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
index 1556be3ee..cae6af9ed 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "HighViscosityNoSlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 HighViscosityNoSlipBCStrategy::HighViscosityNoSlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::HighViscosityNoSlipBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h
new file mode 100644
index 000000000..ae5d830b2
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h
@@ -0,0 +1,73 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file BCStrategy.h
+//! \ingroup BoundarConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef MultiphaseBCStrategyType_H
+#define MultiphaseBCStrategyType_H
+
+struct MultiphaseBCStrategyType
+{
+    //static const char VelocityBCStrategy = 0;
+    //static const char EqDensityBCStrategy = 1;
+    //static const char NonEqDensityBCStrategy = 2;
+    //static const char NoSlipBCStrategy = 3;
+    //static const char SlipBCStrategy = 4;
+    //static const char HighViscosityNoSlipBCStrategy = 5;
+    //static const char ThinWallNoSlipBCStrategy = 6;
+    //static const char VelocityWithDensityBCStrategy = 7;
+    //static const char NonReflectingOutflowBCStrategy = 8;
+    //static const char ThixotropyVelocityBCStrategy = 9;
+    //static const char ThixotropyDensityBCStrategy = 10;
+    //static const char ThixotropyNoSlipBCStrategy = 11;
+    //static const char ThixotropyNonReflectingOutflowBCStrategy = 12;
+    //static const char ThixotropyVelocityWithDensityBCStrategy = 13;
+    //static const char RheologyBinghamModelNoSlipBCStrategy = 14;
+    //static const char RheologyHerschelBulkleyModelNoSlipBCStrategy = 15;
+    //static const char SimpleVelocityBCStrategy = 16;
+    //static const char SimpleSlipBCStrategy = 17;
+    //static const char RheologyPowellEyringModelNoSlipBCStrategy = 18;
+    //static const char RheologyBinghamModelVelocityBCStrategy = 19;
+    //static const char MultiphaseNoSlipBCStrategy = 20;
+    //static const char MultiphaseVelocityBCStrategy = 21;
+    //static const char NonReflectingInflowBCStrategy = 22;
+    //static const char NonReflectingOutflowWithRelaxationBCStrategy = 23;
+    //static const char MultiphasePressureBCStrategy = 24;
+
+
+    static const char MultiphaseNoSlipBCStrategy = 0;
+    static const char MultiphaseVelocityBCStrategy = 1;
+    static const char MultiphasePressureBCStrategy = 2;
+    static const char MultiphaseNonReflectingOutflowBCStrategy = 3;
+    static const char MultiphaseSlipBCStrategy = 4;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
index fdb8e5854..28c1f2ed1 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
@@ -56,7 +56,7 @@ public:
     void adaptBC(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc, const real & /*worldX1*/,
                  const real & /*worldX2*/, const real & /*worldX3*/, const real & /*time*/ = 0) override
     {
-        bc->setBCStrategyType(strategyType);
+        bc->setBCStrategyKey(bcStrategyKey);
     }
 
 private:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
index 1c3cef763..45c2ea759 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
@@ -34,11 +34,9 @@
 #include "NoSlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NoSlipBCStrategy::NoSlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NoSlipBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
index fd2ed61b8..dd27f84e9 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
@@ -34,11 +34,9 @@
 
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonEqDensityBCStrategy::NonEqDensityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonEqDensityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
index a9abc090c..066f59c00 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonReflectingInflowBCStrategy::NonReflectingInflowBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonReflectingInflowBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
index 8885e6c61..637787dc0 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonReflectingOutflowBCStrategy::NonReflectingOutflowBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonReflectingOutflowBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
index c69d86ba3..0e7be0e3d 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonReflectingOutflowWithRelaxationBCStrategy::NonReflectingOutflowWithRelaxationBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonReflectingOutflowWithRelaxationBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
index 79edfb8e7..c06725760 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "SimpleSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 SimpleSlipBCStrategy::SimpleSlipBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::SimpleSlipBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
index 03a3aeb1b..b37d04922 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
@@ -34,11 +34,9 @@
 #include "SimpleVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 SimpleVelocityBCStrategy::SimpleVelocityBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::SimpleVelocityBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
index 7f5e69835..35b9e22ec 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
@@ -71,5 +71,5 @@ void SlipBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions>
     else if (bc->hasSlipBoundaryFlag(DIR_00M))
         bc->setNormalVector(vf::basics::constant::c0o1, vf::basics::constant::c0o1, -vf::basics::constant::c1o1);
 
-    bc->setBCStrategyType(strategyType);
+    bc->setBCStrategyKey(bcStrategyKey);
 }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
index f0e246e57..1c8938e98 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
@@ -1,11 +1,9 @@
 #include "SlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 SlipBCStrategy::SlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::SlipBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
index b89b015c2..f7413101a 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
@@ -35,7 +35,6 @@
 #include "ThinWallNoSlipBCStrategy.h"
 
 #include "LBMKernel.h"
-#include "BCStrategyType.h"
 
 //////////////////////////////////////////////////////////////////////////
 ThinWallBCSet::ThinWallBCSet(SPtr<ILBMKernel> kernel) : BCSet(kernel) {}
@@ -51,7 +50,7 @@ void ThinWallBCSet::applyPostCollisionBC()
     BCSet::applyPostCollisionBC();
 
     for (SPtr<BCStrategy> bc : postBC) {
-        if (bc->getType() == BCStrategyType::ThinWallNoSlipBCStrategy) {
+        if (dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->isThinWallNoSlipBCStrategy()) {
             dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->setPass(2);
             bc->applyBC();
             dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->setPass(1);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
index 3d78fd9cc..01f0d6a4c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
@@ -34,11 +34,9 @@
 
 #include "BoundaryConditions.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
-#include "BCStrategyType.h"
 
 ThinWallNoSlipBCStrategy::ThinWallNoSlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::ThinWallNoSlipBCStrategy;
     BCStrategy::preCollision = false;
     pass                      = 1;
 }
@@ -91,4 +89,12 @@ void ThinWallNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distri
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThinWallNoSlipBCStrategy::setPass(int pass) { this->pass = pass; }
+void ThinWallNoSlipBCStrategy::setPass(int pass)
+{
+    this->pass = pass;
+}
+
+bool ThinWallNoSlipBCStrategy::isThinWallNoSlipBCStrategy()
+{
+    return true;
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
index deba685a3..441d575dd 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
@@ -46,6 +46,7 @@ public:
     SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void setPass(int pass);
+    bool isThinWallNoSlipBCStrategy();
     void applyBC() override;
 
 protected:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
index 4318cfabb..d88ab8934 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
@@ -302,7 +302,7 @@ void VelocityBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditi
                                 const real &worldX2, const real &worldX3, const real &time)
 {
     this->setNodeVelocity(interactor, bc, worldX1, worldX2, worldX3, time);
-    bc->setBCStrategyType(strategyType);
+    bc->setBCStrategyKey(bcStrategyKey);
 }
 /*==========================================================*/
 void VelocityBC::setNodeVelocity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
index c5a15631f..1b84b2de6 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 #include "Block3D.h"
-#include "BCStrategyType.h"
 
 VelocityBCStrategy::VelocityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::VelocityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
index aa8dc479d..b6a2548ae 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "VelocityWithDensityBCStrategy.h"
 #include "BCArray3D.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 VelocityWithDensityBCStrategy::VelocityWithDensityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::VelocityWithDensityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
index dd5b9935a..cb0ed8578 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
+++ b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
@@ -124,7 +124,7 @@ struct BoundaryCondition {
     float nx1, nx2, nx3;    //  not double!!!
     float  q[26];           //  not double!!!
 
-    char algorithmType;
+    char bcStrategyKey;
 };
 
 //! \struct boundCondParam
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
index 456c92eb0..068390833 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
@@ -705,7 +705,7 @@ void MPIIOMigrationBESimulationObserver::writeBoundaryConds(int step)
                     bouCond->nx3                    = bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
+                    bouCond->bcStrategyKey = bcArr->bcvector[bc]->getBCStrategyKey();
                 }
 
                 bcVector[ic].push_back(*bouCond);
@@ -1668,7 +1668,7 @@ void MPIIOMigrationBESimulationObserver::readBoundaryConds(int step)
                     bc->nx3 = bcArray[ibc].nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bc->setQ(bcArray[ibc].q[iq], iq);
-                    bc->setBCStrategyType(bcArray[ibc].algorithmType);
+                    bc->setBCStrategyKey(bcArray[ibc].bcStrategyKey);
                 }
 
                 bcVector.push_back(bc);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
index 590a2812b..b6ea1bbf6 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
@@ -786,7 +786,7 @@ void MPIIOMigrationSimulationObserver::writeBoundaryConds(int step)
                     bouCond->nx3                    = bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
+                    bouCond->bcStrategyKey = bcArr->bcvector[bc]->getBCStrategyKey();
                 }
 
                 bcVector[ic].push_back(*bouCond);
@@ -1477,7 +1477,7 @@ void MPIIOMigrationSimulationObserver::readBoundaryConds(int step)
                     bc->nx3 = bcArray[ibc].nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bc->setQ(bcArray[ibc].q[iq], iq);
-                    bc->setBCStrategyType(bcArray[ibc].algorithmType);
+                    bc->setBCStrategyKey(bcArray[ibc].bcStrategyKey);
                 }
 
                 bcVector.push_back(bc);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
index 07a63a48b..87de527b6 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
@@ -859,7 +859,7 @@ void MPIIORestartSimulationObserver::writeBoundaryConds(int step)
                     bouCond->nx3                    = bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
+                    bouCond->bcStrategyKey = bcArr->bcvector[bc]->getBCStrategyKey();
                 }
 
                 bcVector.push_back(*bouCond);
@@ -1546,7 +1546,7 @@ void MPIIORestartSimulationObserver::readBoundaryConds(int step)
                 bc->nx3 = bcArray[index].nx3;
                 for (int iq = 0; iq < 26; iq++)
                     bc->setQ(bcArray[index].q[iq], iq);
-                bc->setBCStrategyType(bcArray[index].algorithmType);
+                bc->setBCStrategyKey(bcArray[index].bcStrategyKey);
             }
 
             bcVector.push_back(bc);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
index af0fb29ca..d379284f0 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
@@ -88,8 +88,8 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
                 for (int x1 = minX1; x1 < maxX1; x1++) {
                     if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
                         if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL) {
-                            char alg              = bcPtr->getBCStrategyType();
-                            SPtr<BCStrategy> bca = bcMap[alg];
+                            char bcStrategyKey = bcPtr->getBCStrategyKey();
+                            SPtr<BCStrategy> bca = BCStrategyRegister::getInstance()->getBCStrategy(bcStrategyKey);
 
                             if (bca) {
                                 bca = bca->clone();
@@ -109,8 +109,4 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         }
     }
 }
-//////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
-{
-    bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getBCStrategy()));
-}
+
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
index 8954bf73a..61697735b 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
@@ -35,14 +35,11 @@
 #define BoundaryConditionBlockVisitor_h__
 
 #include <PointerDefinitions.h>
-#include <map>
-
 #include "Block3DVisitor.h"
 
 class Grid3D;
 class Block3D;
-class BCStrategy;
-class BC;
+
 
 //! \brief set boundary conditions
 class BoundaryConditionsBlockVisitor : public Block3DVisitor
@@ -52,10 +49,6 @@ public:
     ~BoundaryConditionsBlockVisitor() override;
 
     void visit(SPtr<Grid3D> grid, SPtr<Block3D> block) override;
-    void addBC(SPtr<BC> bc);
 
-protected:
-private:
-    std::map<char, SPtr<BCStrategy>> bcMap;
 };
 #endif // BoundaryConditionBlockVisitor_h__
-- 
GitLab