diff --git a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
index fd931775e1ab5ed9c35588f5b17a0bae45c2cd24..1a8493d21a7e3bf5723935613f450a80a989a3c6 100644
--- a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
+++ b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
@@ -56,6 +56,8 @@
 
 #include "utilities/communication.h"
 
+#include "VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h"
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -243,6 +245,12 @@ void multipleLevel(const std::string& configPath)
             //gridBuilder->writeGridsToVtk(path + "/" + bivalveType + "/" + std::to_string(generatePart) + "/grid/");
             //gridBuilder->writeArrows(path + "/" + bivalveType + "/" + std::to_string(generatePart) + " /arrow");
 
+            std::cout << "number of grids in gridBuilder.................... " << gridBuilder->getGrids().size()
+                      << std::endl;
+
+            SPtr<NodeIndicesMultiGPU> paraMultiGPU = std::make_shared<NodeIndicesMultiGPU>(NodeIndicesMultiGPU(gridBuilder));
+            
+
             SimulationFileWriter::write(gridPath + "/" + std::to_string(generatePart) + "/", gridBuilder, FILEFORMAT::BINARY);
            
         } else {
diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index b04dc643f363f0c61a466a03eec2b771d909460a..bbb3242c92cd97d678bd5c208ba8ccc49c564fc6 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -30,7 +30,7 @@ public:
 
     CUDA_HOST virtual void findMatrixIDsGEO_FLUID(uint *typeOfGridNode) = 0;
     HOSTDEVICE virtual uint getGeoFluidSize() const = 0;
-    HOSTDEVICE virtual const std::vector<uint> &getGeoFluidNodes() const = 0;
+    HOSTDEVICE virtual const std::vector<uint> *getGeoFluidNodes() const = 0;
 
     HOSTDEVICE virtual real getStartX() const = 0;
     HOSTDEVICE virtual real getStartY() const = 0;
diff --git a/src/gpu/GridGenerator/grid/GridImp.cu b/src/gpu/GridGenerator/grid/GridImp.cu
index f265783bec90cca54d7fe3723d8069ec2259203f..7e1aae190ba21784862d4ea59a34ab85bcef8ea3 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -1764,8 +1764,8 @@ HOSTDEVICE uint GridImp::getGeoFluidSize() const {
     return this->geoFluidSize; 
 }
 
-HOSTDEVICE const std::vector<uint> &GridImp::getGeoFluidNodes() const{ 
-    return this->geoFluidNodes; 
+HOSTDEVICE const std::vector<uint> *GridImp::getGeoFluidNodes() const{ 
+    return &this->geoFluidNodes; 
 }
 
 HOSTDEVICE Field GridImp::getField() const
diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h
index 84615e6d6ee44f55a7602050ac795b9179a922b5..169c77fde8f613bd5c5021754257301d4f89f280 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -196,7 +196,7 @@ public:
     HOSTDEVICE uint getSize() const override;
     HOSTDEVICE uint getSparseSize() const override;
     HOSTDEVICE uint getGeoFluidSize() const override;
-    HOSTDEVICE const std::vector<uint> &getGeoFluidNodes() const override;
+    HOSTDEVICE const std::vector<uint> *getGeoFluidNodes() const override;
     HOSTDEVICE int getSparseIndex(uint matrixIndex) const override;
     CUDA_HOST real* getDistribution() const override;
     CUDA_HOST int* getDirection() const override;
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.cpp b/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2440da272891552f57ecfe6804c6252ee423eb5f
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.cpp
@@ -0,0 +1,20 @@
+#include "NodeIndicesMultiGPU.h"
+
+NodeIndicesMultiGPU::NodeIndicesMultiGPU(SPtr<MultipleGridBuilder> gridBuilder)
+{
+    std::vector<std::shared_ptr<Grid>> grids = gridBuilder->getGrids();
+    for (uint i = 0; i < grids.size(); i++) {
+        geoFluidSize.push_back(grids[i]->getGeoFluidSize());
+        geoFluidNodeIndices.push_back(grids[i]->getGeoFluidNodes());
+    }
+}
+
+uint NodeIndicesMultiGPU::getGeoFluidSize(uint gridNumber) 
+{ 
+    return this->geoFluidSize[gridNumber]; 
+}
+
+const std::vector<uint>* NodeIndicesMultiGPU::getGeoFluidNodeIndices(uint gridNumber)
+{
+    return this->geoFluidNodeIndices[gridNumber];
+}
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h b/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h
new file mode 100644
index 0000000000000000000000000000000000000000..abe44273e13396e0d103fdf65d55b964f2f7eaea
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h
@@ -0,0 +1,16 @@
+#include <vector>
+#include <memory>
+
+#include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
+
+class NodeIndicesMultiGPU
+{
+    std::vector<uint> geoFluidSize;
+    std::vector<const std::vector<uint>*> geoFluidNodeIndices; 
+
+public:
+    NodeIndicesMultiGPU(SPtr<MultipleGridBuilder> gridBuilder);
+
+    uint getGeoFluidSize(uint gridNumber);
+    const std::vector<uint>* getGeoFluidNodeIndices(uint gridNumber);
+};
\ No newline at end of file