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