From 733e2ad1b8f914aa362f6aa4a2a8d56f40aa7bcf Mon Sep 17 00:00:00 2001
From: Martin Bauer <martin.bauer@fau.de>
Date: Tue, 26 Sep 2017 14:31:44 +0200
Subject: [PATCH] Field data getters used by code generation

---
 src/cuda/GPUField.h      |  3 +++
 src/cuda/GPUField.impl.h | 20 ++++++++++++++++++++
 src/field/Field.h        |  2 ++
 3 files changed, 25 insertions(+)

diff --git a/src/cuda/GPUField.h b/src/cuda/GPUField.h
index 437fe1c95..116071a65 100755
--- a/src/cuda/GPUField.h
+++ b/src/cuda/GPUField.h
@@ -133,6 +133,9 @@ namespace cuda {
             void * data()            { return pitchedPtr_.ptr; }
       const void * data() const      { return pitchedPtr_.ptr; }
 
+      T       * dataAt(cell_idx_t x, cell_idx_t y, cell_idx_t z, cell_idx_t f);
+      const T * dataAt(cell_idx_t x, cell_idx_t y, cell_idx_t z, cell_idx_t f) const;
+
    protected:
       cudaPitchedPtr pitchedPtr_;
       uint_t         nrOfGhostLayers_;
diff --git a/src/cuda/GPUField.impl.h b/src/cuda/GPUField.impl.h
index b6fe3f8a8..946afd7ae 100644
--- a/src/cuda/GPUField.impl.h
+++ b/src/cuda/GPUField.impl.h
@@ -67,6 +67,26 @@ GPUField<T>::~GPUField()
    cudaFree( pitchedPtr_.ptr );
 }
 
+template<typename T>
+T * GPUField<T>::dataAt(cell_idx_t x, cell_idx_t y, cell_idx_t z, cell_idx_t f)
+{
+   auto offset = (x + nrOfGhostLayers_) * xStride() +
+                 (y + nrOfGhostLayers_) * yStride() +
+                 (z + nrOfGhostLayers_) * zStride() +
+                 f * fStride();
+   return static_cast<T*>(pitchedPtr_.ptr) + offset;
+}
+
+template<typename T>
+const T * GPUField<T>::dataAt(cell_idx_t x, cell_idx_t y, cell_idx_t z, cell_idx_t f) const
+{
+   auto offset = (x + nrOfGhostLayers_) * xStride() +
+                 (y + nrOfGhostLayers_) * yStride() +
+                 (z + nrOfGhostLayers_) * zStride() +
+                 f * fStride();
+   return static_cast<T*>(pitchedPtr_.ptr) + offset;
+}
+
 
 template<typename T>
 void GPUField<T>::getGhostRegion(stencil::Direction d, CellInterval & ci,
diff --git a/src/field/Field.h b/src/field/Field.h
index c7785e80e..b6e517ec3 100644
--- a/src/field/Field.h
+++ b/src/field/Field.h
@@ -291,6 +291,8 @@ namespace field {
       //@{
             T * data()            { return values_; }
       const T * data() const      { return values_; }
+            T * dataAt(cell_idx_t x, cell_idx_t y, cell_idx_t z, cell_idx_t f)       { return &get(x,y,z,f); }
+      const T * dataAt(cell_idx_t x, cell_idx_t y, cell_idx_t z, cell_idx_t f) const { return &get(x,y,z,f); }
             T * dataInner()       { return valuesWithOffset_; }
       const T * dataInner() const { return valuesWithOffset_; }
 
-- 
GitLab