From 1f42d0b723f09b03b04dc1ae68928a920032977d Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Mon, 6 Nov 2023 15:38:42 +0000
Subject: [PATCH] Use const& LBMSimulationParameter instead of shared pointer

---
 .../VirtualFluids_GPU/Output/FileWriter.cpp   |  48 +++----
 .../Output/WriterUtilities.cpp                |  38 ++---
 .../Output/WriterUtilities.h                  |   6 +-
 .../Output/WriterUtilitiesTest.cpp            | 132 +++++++++---------
 .../VirtualFluids_GPU/Parameter/Parameter.cpp |   8 +-
 .../VirtualFluids_GPU/Parameter/Parameter.h   |   4 +-
 6 files changed, 118 insertions(+), 118 deletions(-)

diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
index 5bf066a73..ea53eaf93 100644
--- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
@@ -237,50 +237,50 @@ std::vector<std::string> FileWriter::writeUnstructuredGridLT(std::shared_ptr<Par
 
         //////////////////////////////////////////////////////////////////////////
         for (unsigned int pos = startPosition; pos < endPosition; pos++) {
-            const LBMSimulationParameter* parH = para->getParHConst(level).get();
-            if (parH->typeOfGridNode[pos] == GEO_FLUID) {
+            const LBMSimulationParameter& parH = para->getParHConst(level);
+            if (parH.typeOfGridNode[pos] == GEO_FLUID) {
                 //////////////////////////////////////////////////////////////////////////
-                double x1 = parH->coordinateX[pos];
-                double x2 = parH->coordinateY[pos];
-                double x3 = parH->coordinateZ[pos];
+                double x1 = parH.coordinateX[pos];
+                double x2 = parH.coordinateY[pos];
+                double x3 = parH.coordinateZ[pos];
                 //////////////////////////////////////////////////////////////////////////
                 relPosInPart = pos - startPosition;
                 //////////////////////////////////////////////////////////////////////////
                 nodes[relPosInPart] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
-                nodeData[0][relPosInPart] = (double)parH->pressure[pos] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
-                nodeData[1][relPosInPart] = (double)parH->rho[pos] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
-                nodeData[2][relPosInPart] = (double)parH->velocityX[pos] * (double)para->getVelocityRatio();
-                nodeData[3][relPosInPart] = (double)parH->velocityY[pos] * (double)para->getVelocityRatio();
-                nodeData[4][relPosInPart] = (double)parH->velocityZ[pos] * (double)para->getVelocityRatio();
-                nodeData[5][relPosInPart] = (double)parH->typeOfGridNode[pos];
+                nodeData[0][relPosInPart] = (double)parH.pressure[pos] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
+                nodeData[1][relPosInPart] = (double)parH.rho[pos] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
+                nodeData[2][relPosInPart] = (double)parH.velocityX[pos] * (double)para->getVelocityRatio();
+                nodeData[3][relPosInPart] = (double)parH.velocityY[pos] * (double)para->getVelocityRatio();
+                nodeData[4][relPosInPart] = (double)parH.velocityZ[pos] * (double)para->getVelocityRatio();
+                nodeData[5][relPosInPart] = (double)parH.typeOfGridNode[pos];
 
                 if(para->getDiffOn())
-                    nodeData[firstConcNode][relPosInPart] = (double)parH->concentration[pos];
+                    nodeData[firstConcNode][relPosInPart] = (double)parH.concentration[pos];
 
                 if(para->getIsBodyForce())
                 {
-                    nodeData[firstBodyForceNode    ][relPosInPart] = (double)parH->forceX_SP[pos] * (double)para->getScaledForceRatio(level);
-                    nodeData[firstBodyForceNode + 1][relPosInPart] = (double)parH->forceY_SP[pos] * (double)para->getScaledForceRatio(level);
-                    nodeData[firstBodyForceNode + 2][relPosInPart] = (double)parH->forceZ_SP[pos] * (double)para->getScaledForceRatio(level);
+                    nodeData[firstBodyForceNode    ][relPosInPart] = (double)parH.forceX_SP[pos] * (double)para->getScaledForceRatio(level);
+                    nodeData[firstBodyForceNode + 1][relPosInPart] = (double)parH.forceY_SP[pos] * (double)para->getScaledForceRatio(level);
+                    nodeData[firstBodyForceNode + 2][relPosInPart] = (double)parH.forceZ_SP[pos] * (double)para->getScaledForceRatio(level);
                 }
 
                 if(para->getUseTurbulentViscosity())
                 {
-                    nodeData[firstNutNode][relPosInPart] = (double)parH->turbViscosity[pos] * (double)para->getScaledViscosityRatio(level);
+                    nodeData[firstNutNode][relPosInPart] = (double)parH.turbViscosity[pos] * (double)para->getScaledViscosityRatio(level);
                 }
 
                 if (para->getCalcTurbulenceIntensity()) {
-                    nodeData[firstTurbulenceNode    ][relPosInPart] = (double)parH->vxx[pos];
-                    nodeData[firstTurbulenceNode + 1][relPosInPart] = (double)parH->vyy[pos];
-                    nodeData[firstTurbulenceNode + 2][relPosInPart] = (double)parH->vzz[pos];
-                    nodeData[firstTurbulenceNode + 3][relPosInPart] = (double)parH->vxy[pos];
-                    nodeData[firstTurbulenceNode + 4][relPosInPart] = (double)parH->vxz[pos];
-                    nodeData[firstTurbulenceNode + 5][relPosInPart] = (double)parH->vyz[pos];
+                    nodeData[firstTurbulenceNode    ][relPosInPart] = (double)parH.vxx[pos];
+                    nodeData[firstTurbulenceNode + 1][relPosInPart] = (double)parH.vyy[pos];
+                    nodeData[firstTurbulenceNode + 2][relPosInPart] = (double)parH.vzz[pos];
+                    nodeData[firstTurbulenceNode + 3][relPosInPart] = (double)parH.vxy[pos];
+                    nodeData[firstTurbulenceNode + 4][relPosInPart] = (double)parH.vxz[pos];
+                    nodeData[firstTurbulenceNode + 5][relPosInPart] = (double)parH.vyz[pos];
                 }
 
                 //////////////////////////////////////////////////////////////////////////
 
-                WriterUtilities::getIndicesOfAllNodesInOct(indicesOfOct, pos, para->getParHConst(level).get());
+                WriterUtilities::getIndicesOfAllNodesInOct(indicesOfOct, pos, para->getParHConst(level));
 
                 if (WriterUtilities::isPeriodicCell(parH, indicesOfOct[0], indicesOfOct[6])) {
                     continue;
@@ -390,7 +390,7 @@ std::vector<std::string> FileWriter::writeUnstructuredGridMedianLT(std::shared_p
                 dn7 = number7 - startPosition;
                 dn8 = number8 - startPosition;
                 //////////////////////////////////////////////////////////////////////////
-                if (WriterUtilities::isPeriodicCell(para->getParHConst(level).get(), number1, number7))
+                if (WriterUtilities::isPeriodicCell(para->getParHConst(level), number1, number7))
                     continue;
                 //////////////////////////////////////////////////////////////////////////
                 if (neighborsFluid == true) cells.push_back(makeUbTuple(dn1, dn2, dn3, dn4, dn5, dn6, dn7, dn8));
diff --git a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp
index 4db1b7efc..71177522d 100644
--- a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp
@@ -10,43 +10,43 @@ std::string WriterUtilities::makePartFileNameEnding(uint level, int ID, int part
 
 uint WriterUtilities::calculateNumberOfParts(const Parameter* parameter, uint level)
 {
-    return (uint)parameter->getParHConst(level)->numberOfNodes / parameter->getLimitOfNodesForVTK() + 1;
+    return (uint)parameter->getParHConst(level).numberOfNodes / parameter->getLimitOfNodesForVTK() + 1;
 }
 
-bool WriterUtilities::isPeriodicCell(const LBMSimulationParameter* parH, unsigned int baseNodeOfCell,
+bool WriterUtilities::isPeriodicCell(const LBMSimulationParameter& parH, unsigned int baseNodeOfCell,
                                      unsigned int otherNodeInCell)
 {
     const real distance = sqrt(
-        pow(parH->coordinateX[otherNodeInCell] - parH->coordinateX[baseNodeOfCell], 2.) +
-        pow(parH->coordinateY[otherNodeInCell] - parH->coordinateY[baseNodeOfCell], 2.) +
-        pow(parH->coordinateZ[otherNodeInCell] - parH->coordinateZ[baseNodeOfCell], 2.));
-    return distance > 1.01 * sqrt(3 * pow(parH->gridSpacing, 2.));
+        pow(parH.coordinateX[otherNodeInCell] - parH.coordinateX[baseNodeOfCell], 2.) +
+        pow(parH.coordinateY[otherNodeInCell] - parH.coordinateY[baseNodeOfCell], 2.) +
+        pow(parH.coordinateZ[otherNodeInCell] - parH.coordinateZ[baseNodeOfCell], 2.));
+    return distance > 1.01 * sqrt(3 * pow(parH.gridSpacing, 2.));
 }
 
 uint WriterUtilities::calculateNumberOfNodesInPart(const Parameter* para, uint level, uint part)
 {
     if (part >= WriterUtilities::calculateNumberOfParts(para, level))
         throw std::runtime_error("The number of nodes for a non-existing part can not be calculated");
-    if (((part + 1) * para->getLimitOfNodesForVTK()) > (uint)para->getParHConst(level)->numberOfNodes)
-        return (uint)para->getParHConst(level)->numberOfNodes - (part * para->getLimitOfNodesForVTK());
+    if (((part + 1) * para->getLimitOfNodesForVTK()) > (uint)para->getParHConst(level).numberOfNodes)
+        return (uint)para->getParHConst(level).numberOfNodes - (part * para->getLimitOfNodesForVTK());
     return para->getLimitOfNodesForVTK();
 }
 
 void WriterUtilities::getIndicesOfAllNodesInOct(std::array<uint, 8>& nodeIndices, uint baseNodeOfOct,
-                                                const LBMSimulationParameter* parH)
+                                                const LBMSimulationParameter& parH)
 {
     nodeIndices[0] = baseNodeOfOct;
-    nodeIndices[1] = parH->neighborX[nodeIndices[0]];
-    nodeIndices[2] = parH->neighborY[nodeIndices[1]];
-    nodeIndices[3] = parH->neighborY[nodeIndices[0]];
-    nodeIndices[4] = parH->neighborZ[nodeIndices[0]];
-    nodeIndices[5] = parH->neighborZ[nodeIndices[1]];
-    nodeIndices[6] = parH->neighborZ[nodeIndices[2]];
-    nodeIndices[7] = parH->neighborZ[nodeIndices[3]];
+    nodeIndices[1] = parH.neighborX[nodeIndices[0]];
+    nodeIndices[2] = parH.neighborY[nodeIndices[1]];
+    nodeIndices[3] = parH.neighborY[nodeIndices[0]];
+    nodeIndices[4] = parH.neighborZ[nodeIndices[0]];
+    nodeIndices[5] = parH.neighborZ[nodeIndices[1]];
+    nodeIndices[6] = parH.neighborZ[nodeIndices[2]];
+    nodeIndices[7] = parH.neighborZ[nodeIndices[3]];
 }
 
 void WriterUtilities::calculateRelativeNodeIndexInPart(std::array<uint, 8>& relativePositionInPart,
-                                                      const std::array<uint, 8>& indicesOfOct, uint startPositionOfPart)
+                                                       const std::array<uint, 8>& indicesOfOct, uint startPositionOfPart)
 {
     for (size_t i = 0; i < relativePositionInPart.size(); i++) {
         relativePositionInPart[i] = indicesOfOct[i] - startPositionOfPart;
@@ -54,10 +54,10 @@ void WriterUtilities::calculateRelativeNodeIndexInPart(std::array<uint, 8>& rela
 }
 
 bool WriterUtilities::areAllNodesInOctValidForWriting(const std::array<uint, 8>& indicesOfOct,
-                                                      const LBMSimulationParameter* parH, uint endPositionOfPart)
+                                                      const LBMSimulationParameter& parH, uint endPositionOfPart)
 {
     const bool neighborsAreFluid = std::all_of(indicesOfOct.begin(), indicesOfOct.end(),
-                                         [&](uint index) { return parH->typeOfGridNode[index] == GEO_FLUID; });
+                                               [&](uint index) { return parH.typeOfGridNode[index] == GEO_FLUID; });
 
     const bool neighborIsOutOfPart =
         (std::any_of(indicesOfOct.begin(), indicesOfOct.end(), [&](uint index) { return index > endPositionOfPart; }));
diff --git a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h
index eaa26dd54..dcdcd59fb 100644
--- a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h
+++ b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h
@@ -13,13 +13,13 @@ class WriterUtilities
 public:
     static uint calculateNumberOfParts(const Parameter* para, uint level);
     static uint calculateNumberOfNodesInPart(const Parameter* para, uint level, uint part);
-    static bool isPeriodicCell(const LBMSimulationParameter* parH, unsigned int baseNodeOfCell,
+    static bool isPeriodicCell(const LBMSimulationParameter& parH, unsigned int baseNodeOfCell,
                                unsigned int otherNodeInCell);
     static void getIndicesOfAllNodesInOct(std::array<uint, 8>& nodeIndices, uint baseNodeOfOct,
-                                          const LBMSimulationParameter* parH);
+                                          const LBMSimulationParameter& parH);
     static void calculateRelativeNodeIndexInPart(std::array<uint, 8>& relativePositionInPart,
                                                  const std::array<uint, 8>& indicesOfOct, uint startPositionOfPart);
-    static bool areAllNodesInOctValidForWriting(const std::array<uint, 8>& indicesOfOct, const LBMSimulationParameter* parH,
+    static bool areAllNodesInOctValidForWriting(const std::array<uint, 8>& indicesOfOct, const LBMSimulationParameter& parH,
                                                 uint endPositionOfPart);
 
     static std::string makePartFileNameEnding(uint level, int processID, int part, int timestep);
diff --git a/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp b/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp
index e2aaa2ca7..056022427 100644
--- a/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp
@@ -40,7 +40,7 @@ TEST(WriterUtilitiesTest, calculateNumberOfNodesInPart)
 class WriterUtilitiesPeriodicCellTest : public testing::Test
 {
 protected:
-    std::unique_ptr<LBMSimulationParameter> parH = std::make_unique<LBMSimulationParameter>();
+    LBMSimulationParameter parH = LBMSimulationParameter();
     const uint level = 0;
     const uint baseNodeIndex = 0;
     const uint otherNodeIndex = 1;
@@ -51,90 +51,90 @@ protected:
         // create a domain with only three layers of nodes
         // nodes are at the coordinates 0.0, 1.0 and 2.0
 
-        parH->gridSpacing = 1.0;
+        parH.gridSpacing = 1.0;
 
-        parH->coordinateX = new real[2];
-        parH->coordinateY = new real[2];
-        parH->coordinateZ = new real[2];
+        parH.coordinateX = new real[2];
+        parH.coordinateY = new real[2];
+        parH.coordinateZ = new real[2];
 
-        parH->coordinateX[baseNodeIndex] = coordinates[baseNodeIndex];
-        parH->coordinateY[baseNodeIndex] = coordinates[baseNodeIndex];
-        parH->coordinateZ[baseNodeIndex] = coordinates[baseNodeIndex];
-        parH->coordinateX[otherNodeIndex] = coordinates[otherNodeIndex];
-        parH->coordinateY[otherNodeIndex] = coordinates[otherNodeIndex];
-        parH->coordinateZ[otherNodeIndex] = coordinates[otherNodeIndex];
+        parH.coordinateX[baseNodeIndex] = coordinates[baseNodeIndex];
+        parH.coordinateY[baseNodeIndex] = coordinates[baseNodeIndex];
+        parH.coordinateZ[baseNodeIndex] = coordinates[baseNodeIndex];
+        parH.coordinateX[otherNodeIndex] = coordinates[otherNodeIndex];
+        parH.coordinateY[otherNodeIndex] = coordinates[otherNodeIndex];
+        parH.coordinateZ[otherNodeIndex] = coordinates[otherNodeIndex];
     }
 
     void TearDown() override
     {
-        delete[] parH->coordinateX;
-        delete[] parH->coordinateY;
-        delete[] parH->coordinateZ;
+        delete[] parH.coordinateX;
+        delete[] parH.coordinateY;
+        delete[] parH.coordinateZ;
     }
 };
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsNotPeriodic)
 {
-    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInX)
 {
-    parH->coordinateX[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateX[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInY)
 {
-    parH->coordinateY[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateY[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInZ)
 {
-    parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateZ[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXY)
 {
-    parH->coordinateX[1] = 2.0;
-    parH->coordinateY[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateX[1] = 2.0;
+    parH.coordinateY[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXZ)
 {
-    parH->coordinateX[1] = 2.0;
-    parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateX[1] = 2.0;
+    parH.coordinateZ[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInYZ)
 {
-    parH->coordinateY[1] = 2.0;
-    parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateY[1] = 2.0;
+    parH.coordinateZ[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXYZ)
 {
-    parH->coordinateX[1] = 2.0;
-    parH->coordinateY[1] = 2.0;
-    parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
+    parH.coordinateX[1] = 2.0;
+    parH.coordinateY[1] = 2.0;
+    parH.coordinateZ[1] = 2.0;
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH, otherNodeIndex, baseNodeIndex));
 }
 
 class WriterUtilitiesNeighborOctTest : public testing::Test
 {
-    static void setUpNeighborsNeighborsForOct(LBMSimulationParameter* parH, const std::array<uint, 8>& nodeIndices)
+    static void setUpNeighborsNeighborsForOct(LBMSimulationParameter& parH, const std::array<uint, 8>& nodeIndices)
     {
         // node indices: MMM, PMM, PPM, MPM,
         //               MMP, PMP, PPP, MPP
@@ -142,28 +142,28 @@ class WriterUtilitiesNeighborOctTest : public testing::Test
         for (uint i = 0; i < (uint)nodeIndices.size(); i++) {
             const uint currentNodeIndex = nodeIndices[i];
             if (i < 4)
-                parH->neighborZ[currentNodeIndex] = nodeIndices[i + 4];
+                parH.neighborZ[currentNodeIndex] = nodeIndices[i + 4];
             else
-                parH->neighborZ[currentNodeIndex] = 99;
+                parH.neighborZ[currentNodeIndex] = 99;
 
             if (i == 0 || i == 4)
-                parH->neighborY[currentNodeIndex] = nodeIndices[i + 3];
+                parH.neighborY[currentNodeIndex] = nodeIndices[i + 3];
             else if (i == 1 || i == 5)
-                parH->neighborY[currentNodeIndex] = nodeIndices[i + 1];
+                parH.neighborY[currentNodeIndex] = nodeIndices[i + 1];
             else
-                parH->neighborY[currentNodeIndex] = 999;
+                parH.neighborY[currentNodeIndex] = 999;
 
             if (i == 0 || i == 4)
-                parH->neighborX[currentNodeIndex] = nodeIndices[i + 1];
+                parH.neighborX[currentNodeIndex] = nodeIndices[i + 1];
             else if (i == 3 || i == 7)
-                parH->neighborX[currentNodeIndex] = nodeIndices[i - 1];
+                parH.neighborX[currentNodeIndex] = nodeIndices[i - 1];
             else
-                parH->neighborX[currentNodeIndex] = 9999;
+                parH.neighborX[currentNodeIndex] = 9999;
         }
     }
 
 public:
-    std::unique_ptr<LBMSimulationParameter> parH = std::make_unique<LBMSimulationParameter>();
+    LBMSimulationParameter parH = LBMSimulationParameter();
     std::array<uint, 8> nodeIndices;
 
     void SetUp() override
@@ -172,24 +172,24 @@ public:
         std::iota(nodeIndices.begin(), nodeIndices.end(), 0);
         std::reverse(nodeIndices.begin(), nodeIndices.end());
 
-        parH->neighborX = new uint[8];
-        parH->neighborY = new uint[8];
-        parH->neighborZ = new uint[8];
-        setUpNeighborsNeighborsForOct(parH.get(), nodeIndices);
+        parH.neighborX = new uint[8];
+        parH.neighborY = new uint[8];
+        parH.neighborZ = new uint[8];
+        setUpNeighborsNeighborsForOct(parH, nodeIndices);
     }
 
     void TearDown() override
     {
-        delete[] parH->neighborX;
-        delete[] parH->neighborY;
-        delete[] parH->neighborZ;
+        delete[] parH.neighborX;
+        delete[] parH.neighborY;
+        delete[] parH.neighborZ;
     }
 };
 
 TEST_F(WriterUtilitiesNeighborOctTest, getIndicesOfAllNodesInOct)
 {
     std::array<uint, 8> resultingNodeIndices;
-    WriterUtilities::getIndicesOfAllNodesInOct(resultingNodeIndices, nodeIndices[0], parH.get());
+    WriterUtilities::getIndicesOfAllNodesInOct(resultingNodeIndices, nodeIndices[0], parH);
     for (uint i = 0; i < 8; i++)
         EXPECT_THAT(resultingNodeIndices[i], testing::Eq(nodeIndices[i])) << "for index i = " << i << " in nodeIndices";
 }
@@ -208,7 +208,7 @@ TEST(WriterUtilitiesTest, calculateRelativeNodeIndexInPart)
 class WriterUtilitiesTestNodeValidity : public testing::Test
 {
 protected:
-    std::unique_ptr<LBMSimulationParameter> parH = std::make_unique<LBMSimulationParameter>();
+    LBMSimulationParameter parH = LBMSimulationParameter();
     std::array<uint, 8> nodeIndices;
     std::array<uint, 8> typeOfGridNode;
 
@@ -218,32 +218,32 @@ protected:
         std::iota(nodeIndices.begin(), nodeIndices.end(), 0);
 
         std::fill(typeOfGridNode.begin(), typeOfGridNode.end(), GEO_FLUID);
-        parH->typeOfGridNode = typeOfGridNode.data();
+        parH.typeOfGridNode = typeOfGridNode.data();
     }
 };
 
 TEST_F(WriterUtilitiesTestNodeValidity, allNodesInOctValidForWriting)
 {
     uint endPositionOfPart = 7;
-    EXPECT_TRUE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH.get(), endPositionOfPart));
+    EXPECT_TRUE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH, endPositionOfPart));
 }
 
 TEST_F(WriterUtilitiesTestNodeValidity, areAllNodesInOctValidForWriting_NodeOutOfPart)
 {
     uint endPositionOfPart = 6;
-    EXPECT_FALSE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH.get(), endPositionOfPart));
+    EXPECT_FALSE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH, endPositionOfPart));
 }
 
 TEST_F(WriterUtilitiesTestNodeValidity, areAllNodesInOctValidForWriting_NonFluidNode)
 {
     uint endPositionOfPart = 7;
     typeOfGridNode[0] = GEO_SOLID;
-    EXPECT_FALSE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH.get(), endPositionOfPart));
+    EXPECT_FALSE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH, endPositionOfPart));
 }
 
 TEST_F(WriterUtilitiesTestNodeValidity, areAllNodesInOctValidForWriting_NonFluidNodeAtEnd)
 {
     uint endPositionOfPart = 7;
     typeOfGridNode[7] = GEO_SOLID;
-    EXPECT_FALSE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH.get(), endPositionOfPart));
+    EXPECT_FALSE(WriterUtilities::areAllNodesInOctValidForWriting(nodeIndices, parH, endPositionOfPart));
 }
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
index 2b30f0c29..9f11bfe4b 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
@@ -1738,14 +1738,14 @@ std::shared_ptr<LBMSimulationParameter> Parameter::getParH(int level)
     return parH[level];
 }
 
-std::shared_ptr<const LBMSimulationParameter> Parameter::getParDConst(int level) const
+const LBMSimulationParameter& Parameter::getParDConst(int level) const
 {
-    return parD[level];
+    return *parD[level];
 }
 
-std::shared_ptr<const LBMSimulationParameter> Parameter::getParHConst(int level) const
+const LBMSimulationParameter& Parameter::getParHConst(int level) const
 {
-    return parH[level];
+    return *parH[level];
 }
 
 const std::vector<std::shared_ptr<LBMSimulationParameter>> &Parameter::getParHallLevels()
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index 598c43015..32eca128c 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -470,8 +470,8 @@ public:
     //! \brief Pointer to instance of LBMSimulationParameter - stored on Device (GPU)
     std::shared_ptr<LBMSimulationParameter> getParD(int level);
 
-    std::shared_ptr<const LBMSimulationParameter> getParHConst(int level) const;
-    std::shared_ptr<const LBMSimulationParameter> getParDConst(int level) const;
+    const LBMSimulationParameter& getParHConst(int level) const;
+    const LBMSimulationParameter& getParDConst(int level) const;
 
     const std::vector<std::shared_ptr<LBMSimulationParameter>>& getParHallLevels();
     const std::vector<std::shared_ptr<LBMSimulationParameter>>& getParDallLevels();
-- 
GitLab