diff --git a/apps/gpu/LBM/SphereScaling/SphereScaling.cpp b/apps/gpu/LBM/SphereScaling/SphereScaling.cpp
index 752f3d7ae75498d912e5c6b63902e16999141f6d..6cd7217db49925ffa2a02991e635412b3b021fb6 100644
--- a/apps/gpu/LBM/SphereScaling/SphereScaling.cpp
+++ b/apps/gpu/LBM/SphereScaling/SphereScaling.cpp
@@ -30,6 +30,7 @@
 #include "GridGenerator/grid/GridFactory.h"
 
 #include "geometries/Sphere/Sphere.h"
+#include "geometries/Cuboid/Cuboid.h"
 #include "geometries/Conglomerate/Conglomerate.h"
 #include "geometries/TriangularMesh/TriangularMesh.h"
 
@@ -118,16 +119,17 @@ void multipleLevel(const std::string& configPath)
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     bool useGridGenerator                  = true;
-    bool useStreams                        = true;
+    bool useStreams                        = false;
     bool useLevels                         = true;
-    para->useReducedCommunicationAfterFtoC = true;
+    para->useReducedCommunicationAfterFtoC = false;
     std::string scalingType                = "weak"; // "strong" // "weak"
 
     if (para->getNumprocs() == 1) {
        useStreams       = false;
        para->useReducedCommunicationAfterFtoC = false;
     }
-
+    if (scalingType != "weak" && scalingType != "strong")
+        std::cerr << "unknown scaling type" << std::endl;
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     std::string gridPath(gridPathParent); // only for GridGenerator, for GridReader the gridPath needs to be set in the config file
 
@@ -196,9 +198,12 @@ void multipleLevel(const std::string& configPath)
     if (useGridGenerator) {
         real sideLengthCube;
         if (useLevels)
-            sideLengthCube = 76; 
+            if (scalingType == "strong")
+                sideLengthCube = 70.0; // Phoenix: strong scaling with two levels = 76.0
+            else if (scalingType == "weak")
+                sideLengthCube = 70.0; // Phoenix: weak scaling with two levels = 70.0
         else
-            sideLengthCube = 86; // 60, 80 läuft
+            sideLengthCube = 86.0; // Phoenix: 86.0
         real xGridMin          = 0.0; 
         real xGridMax          = sideLengthCube;
         real yGridMin          = 0.0;
@@ -206,7 +211,8 @@ void multipleLevel(const std::string& configPath)
         real zGridMin          = 0.0;
         real zGridMax          = sideLengthCube;
         const real dSphere     = 10.0;
-        const real dSphereLev1 = 22.0;
+        const real dSphereLev1 = 22.0; // Phoenix: 22.0
+        const real dCubeLev1   = 72.0; // Phoenix: 72.0
 
         if (para->getNumprocs() > 1) {
             const uint generatePart = vf::gpu::Communicator::getInstanz()->getPID();
@@ -218,14 +224,8 @@ void multipleLevel(const std::string& configPath)
                 real zSplit = 0.5 * sideLengthCube;
                     
                 if (scalingType == "weak"){
-                    if (useLevels) {
-                        dxGrid = dxGrid / pow(2.0, (1.0/3.0));
-                        // dxGrid = round(dxGrid*100.0)/100.0  // round to tow decimal places
-                    }
-                    else {
-                        zSplit = zGridMax;
-                        zGridMax = zGridMax + sideLengthCube;
-                    }
+                    zSplit = zGridMax;
+                    zGridMax = zGridMax + sideLengthCube;
                 }
 
                 if (generatePart == 0) {
@@ -238,20 +238,29 @@ void multipleLevel(const std::string& configPath)
                 }
 
                 if (useLevels) {
-                    gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);
+                    if (scalingType == "strong"){
+                        gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);
+                    } else if (scalingType == "weak"){
+                         gridBuilder->addGrid(new Cuboid( -0.5*dCubeLev1, -0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, 
+                                                           0.5*dCubeLev1,  0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1),1);
+                    }
                 }
 
-                if (scalingType == "weak" && !useLevels) {
-                    // Sphere* sphere1 = new  Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphere);
-                    // Sphere* sphere2 = new  Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 1.5 * sideLengthCube, dSphere);
-                    // auto conglo = Conglomerate::makeShared();
-                    // conglo->add(sphere1);
-                    // conglo->add(sphere2);
-                    // gridBuilder->addGeometry(conglo.get());
-
-                   TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_2GPU.stl");
-                   gridBuilder->addGeometry(sphereSTL);
-                } else {
+                if (scalingType == "weak"){
+                    if (useLevels) {
+                        gridBuilder->addGeometry(new Sphere(0.0, 0.0, sideLengthCube, dSphere));
+                    }else{
+                        // Sphere* sphere1 = new  Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphere);
+                        // Sphere* sphere2 = new  Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 1.5 * sideLengthCube, dSphere);
+                        // auto conglo = Conglomerate::makeShared();
+                        // conglo->add(sphere1);
+                        // conglo->add(sphere2);
+                        // gridBuilder->addGeometry(conglo.get());
+
+                        TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_2GPU.stl");
+                        gridBuilder->addGeometry(sphereSTL);
+                    }                    
+                } else if (scalingType == "strong") {
                     gridBuilder->addGeometry(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphere));
                 }
 
@@ -292,16 +301,10 @@ void multipleLevel(const std::string& configPath)
                 real zSplit= 0.5 * sideLengthCube;
 
                 if (scalingType == "weak") {
-                    if (useLevels){
-                        dxGrid = dxGrid / pow(2.0, (2.0/3.0));
-                        // dxGrid = round(dxGrid*100.0)/100.0  // round to tow decimal places
-                    }
-                    else{
-                        ySplit = yGridMax;
-                        yGridMax = yGridMax + (yGridMax-yGridMin);
-                        zSplit = zGridMax;
-                        zGridMax = zGridMax + (zGridMax-zGridMin);
-                    }
+                    ySplit = yGridMax;
+                    yGridMax = yGridMax + (yGridMax-yGridMin);
+                    zSplit = zGridMax;
+                    zGridMax = zGridMax + (zGridMax-zGridMin);
                 }
 
                 if (generatePart == 0) {
@@ -322,13 +325,22 @@ void multipleLevel(const std::string& configPath)
                 }
 
                 if (useLevels) {
-                    gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);                    
+                    if (scalingType == "strong"){
+                        gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);
+                    } else if (scalingType == "weak"){
+                         gridBuilder->addGrid(new Cuboid( -0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, 
+                                                           0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1),1);
+                    }
                 }
 
-                if (scalingType == "weak" && !useLevels) {
-                   TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_4GPU.stl");
-                   gridBuilder->addGeometry(sphereSTL);
-                } else {
+                if (scalingType == "weak"){
+                    if (useLevels) {
+                        gridBuilder->addGeometry(new Sphere(0.0, sideLengthCube, sideLengthCube, dSphere));
+                    }else{
+                        TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_4GPU.stl");
+                        gridBuilder->addGeometry(sphereSTL);
+                    }                    
+                } else if (scalingType == "strong") {
                     gridBuilder->addGeometry(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphere));
                 }
 
@@ -400,19 +412,13 @@ void multipleLevel(const std::string& configPath)
                 real ySplit = 0.5 * sideLengthCube;
                 real zSplit = 0.5 * sideLengthCube;
 
-                if (scalingType == "weak") {
-                    if (useLevels){
-                        dxGrid = dxGrid / 2.0;
-                        // dxGrid = round(dxGrid*100.0)/100.0  // round to tow decimal places
-                    }
-                    else {
-                        xSplit = xGridMax;
-                        xGridMax = xGridMax + (xGridMax-xGridMin);
-                        ySplit = yGridMax;
-                        yGridMax = yGridMax + (yGridMax-yGridMin);
-                        zSplit = zGridMax;
-                        zGridMax = zGridMax + (zGridMax-zGridMin);
-                    }
+                if (scalingType == "weak") {                    
+                    xSplit = xGridMax;
+                    xGridMax = xGridMax + (xGridMax-xGridMin);
+                    ySplit = yGridMax;
+                    yGridMax = yGridMax + (yGridMax-yGridMin);
+                    zSplit = zGridMax;
+                    zGridMax = zGridMax + (zGridMax-zGridMin);                    
                 }
 
                 if (generatePart == 0) {
@@ -452,10 +458,24 @@ void multipleLevel(const std::string& configPath)
                     gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);                    
                 }
 
-                if (scalingType == "weak" && !useLevels) {
-                   TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_8GPU.stl");
-                   gridBuilder->addGeometry(sphereSTL);
-                } else {
+
+                if (useLevels) {
+                    if (scalingType == "strong"){
+                        gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);
+                    } else if (scalingType == "weak"){
+                         gridBuilder->addGrid(new Cuboid( sideLengthCube-0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, 
+                                                          sideLengthCube+0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1),1);
+                    }
+                }
+
+                if (scalingType == "weak"){
+                    if (useLevels) {
+                        gridBuilder->addGeometry(new Sphere(0.0, sideLengthCube, sideLengthCube, dSphere));
+                    }else{
+                        TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_8GPU.stl");
+                        gridBuilder->addGeometry(sphereSTL);
+                    }                    
+                } else if (scalingType == "strong") {
                     gridBuilder->addGeometry(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphere));
                 }
                 
@@ -611,13 +631,21 @@ void multipleLevel(const std::string& configPath)
             gridBuilder->addCoarseGrid(xGridMin, yGridMin, zGridMin, xGridMax, yGridMax, zGridMax, dxGrid);
 
             if (useLevels) {
-                gridBuilder->setNumberOfLayers(10, 8);
-                gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);
+                    gridBuilder->setNumberOfLayers(10, 8);
+                if(scalingType == "strong"){
+                    gridBuilder->addGrid(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphereLev1), 1);
+                } else if (scalingType == "weak")
+                    gridBuilder->addGrid(new Cuboid( sideLengthCube-0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, sideLengthCube-0.5*dCubeLev1, 
+                                                     sideLengthCube+0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1, sideLengthCube+0.5*dCubeLev1),1);
             }
                 
-            if (scalingType == "weak" && !useLevels){
+            if (scalingType == "weak"){
+                if(useLevels){
+                    gridBuilder->addGeometry(new Sphere(sideLengthCube, sideLengthCube, sideLengthCube, dSphere));
+                }else{
                    TriangularMesh *sphereSTL = TriangularMesh::make(stlPath + "Spheres_1GPU.stl");
                    gridBuilder->addGeometry(sphereSTL);
+                }
             } else {
                 gridBuilder->addGeometry(new Sphere(0.5 * sideLengthCube, 0.5 * sideLengthCube, 0.5 * sideLengthCube, dSphere));
             }