From df25a6d1dce4083ab6cbfed6eb95291a85cb9277 Mon Sep 17 00:00:00 2001 From: Martin Schoenherr <m.schoenherr@tu-braunschweig.de> Date: Mon, 26 Jul 2021 16:26:45 +0200 Subject: [PATCH] delete grid strategie and grid factory --- .../DiluteGravityCurrents_Case1.cpp | 4 +- .../DiluteGravityCurrents_Case2.cpp | 4 +- .../DiluteGravityCurrents_Case3.cpp | 4 +- .../DiluteGravityCurrents_Case4.cpp | 4 +- .../DiluteGravityCurrents_Case5.cpp | 4 +- .../DiluteGravityCurrents_Case6.cpp | 4 +- .../DiluteGravityCurrents_Case7.cpp | 4 +- .../DiluteGravityCurrents_Case8.cpp | 4 +- .../LidDrivenCavityGPU/LidDrivenCavity.cpp | 4 +- src/gpu/GridGenerator/geometries/Object.cu | 3 +- src/gpu/GridGenerator/grid/Field.cu | 17 +- src/gpu/GridGenerator/grid/Field.h | 11 +- src/gpu/GridGenerator/grid/Grid.h | 4 +- .../grid/GridBuilder/LevelGridBuilder.cpp | 17 +- .../grid/GridBuilder/LevelGridBuilder.h | 10 +- .../grid/GridBuilder/MultipleGridBuilder.cpp | 9 +- .../grid/GridBuilder/MultipleGridBuilder.h | 7 +- src/gpu/GridGenerator/grid/GridFactory.cpp | 4 - src/gpu/GridGenerator/grid/GridFactory.h | 39 +- src/gpu/GridGenerator/grid/GridImp.cu | 208 +++++++-- src/gpu/GridGenerator/grid/GridImp.h | 17 +- .../GridCpuStrategy/GridCpuStrategy.cpp | 298 ------------ .../GridCpuStrategy/GridCpuStrategy.h | 85 ---- .../GridGpuStrategy/GridGpuStrategy.cpp | 430 ------------------ .../GridGpuStrategy/GridGpuStrategy.h | 76 ---- .../grid/GridStrategy/GridStrategy.h | 81 ---- 26 files changed, 199 insertions(+), 1153 deletions(-) delete mode 100644 src/gpu/GridGenerator/grid/GridFactory.cpp delete mode 100644 src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp delete mode 100644 src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h delete mode 100644 src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp delete mode 100644 src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h delete mode 100644 src/gpu/GridGenerator/grid/GridStrategy/GridStrategy.h diff --git a/apps/gpu/DiluteGravityCurrents_Case1/DiluteGravityCurrents_Case1.cpp b/apps/gpu/DiluteGravityCurrents_Case1/DiluteGravityCurrents_Case1.cpp index 6473af944..838b2ccd5 100644 --- a/apps/gpu/DiluteGravityCurrents_Case1/DiluteGravityCurrents_Case1.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case1/DiluteGravityCurrents_Case1.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case2/DiluteGravityCurrents_Case2.cpp b/apps/gpu/DiluteGravityCurrents_Case2/DiluteGravityCurrents_Case2.cpp index f0400a718..dcbb47c4b 100644 --- a/apps/gpu/DiluteGravityCurrents_Case2/DiluteGravityCurrents_Case2.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case2/DiluteGravityCurrents_Case2.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case3/DiluteGravityCurrents_Case3.cpp b/apps/gpu/DiluteGravityCurrents_Case3/DiluteGravityCurrents_Case3.cpp index d452efdec..e77d5f6eb 100644 --- a/apps/gpu/DiluteGravityCurrents_Case3/DiluteGravityCurrents_Case3.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case3/DiluteGravityCurrents_Case3.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case4/DiluteGravityCurrents_Case4.cpp b/apps/gpu/DiluteGravityCurrents_Case4/DiluteGravityCurrents_Case4.cpp index 96ea163ea..7427aa9b7 100644 --- a/apps/gpu/DiluteGravityCurrents_Case4/DiluteGravityCurrents_Case4.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case4/DiluteGravityCurrents_Case4.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case5/DiluteGravityCurrents_Case5.cpp b/apps/gpu/DiluteGravityCurrents_Case5/DiluteGravityCurrents_Case5.cpp index 849f1b35b..9df9da287 100644 --- a/apps/gpu/DiluteGravityCurrents_Case5/DiluteGravityCurrents_Case5.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case5/DiluteGravityCurrents_Case5.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case6/DiluteGravityCurrents_Case6.cpp b/apps/gpu/DiluteGravityCurrents_Case6/DiluteGravityCurrents_Case6.cpp index 751928fca..f1c8aa5c2 100644 --- a/apps/gpu/DiluteGravityCurrents_Case6/DiluteGravityCurrents_Case6.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case6/DiluteGravityCurrents_Case6.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case7/DiluteGravityCurrents_Case7.cpp b/apps/gpu/DiluteGravityCurrents_Case7/DiluteGravityCurrents_Case7.cpp index a6ac0ebb4..d6d468436 100644 --- a/apps/gpu/DiluteGravityCurrents_Case7/DiluteGravityCurrents_Case7.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case7/DiluteGravityCurrents_Case7.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/DiluteGravityCurrents_Case8/DiluteGravityCurrents_Case8.cpp b/apps/gpu/DiluteGravityCurrents_Case8/DiluteGravityCurrents_Case8.cpp index 94c0d76ef..09459acd8 100644 --- a/apps/gpu/DiluteGravityCurrents_Case8/DiluteGravityCurrents_Case8.cpp +++ b/apps/gpu/DiluteGravityCurrents_Case8/DiluteGravityCurrents_Case8.cpp @@ -100,9 +100,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/apps/gpu/LidDrivenCavityGPU/LidDrivenCavity.cpp b/apps/gpu/LidDrivenCavityGPU/LidDrivenCavity.cpp index 29da31990..a4fcec0f3 100644 --- a/apps/gpu/LidDrivenCavityGPU/LidDrivenCavity.cpp +++ b/apps/gpu/LidDrivenCavityGPU/LidDrivenCavity.cpp @@ -123,9 +123,7 @@ int main(int argc, char *argv[]) // setup gridGenerator ////////////////////////////////////////////////////////////////////////// - auto gridFactory = GridFactory::make(); - gridFactory->setGridStrategy(Device::CPU); - auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); + auto gridBuilder = MultipleGridBuilder::makeShared(); ////////////////////////////////////////////////////////////////////////// // create grid diff --git a/src/gpu/GridGenerator/geometries/Object.cu b/src/gpu/GridGenerator/geometries/Object.cu index f34aa19aa..7a1fc8d8a 100644 --- a/src/gpu/GridGenerator/geometries/Object.cu +++ b/src/gpu/GridGenerator/geometries/Object.cu @@ -32,11 +32,10 @@ //======================================================================================= #include "Object.h" #include "grid/GridImp.h" -#include "grid/GridStrategy/GridStrategy.h" void Object::findInnerNodes(SPtr<GridImp> grid) { - grid->getGridStrategy()->findInnerNodes( grid ); + grid->findInnerNodes(); } int Object::getIntersection(const Vertex &P, const Vertex &direction, Vertex &pointOnObject, real &qVal) diff --git a/src/gpu/GridGenerator/grid/Field.cu b/src/gpu/GridGenerator/grid/Field.cu index 6e663751b..b330b2fba 100644 --- a/src/gpu/GridGenerator/grid/Field.cu +++ b/src/gpu/GridGenerator/grid/Field.cu @@ -33,33 +33,22 @@ #include "Field.h" #include "grid/NodeValues.h" -#include "grid/GridStrategy/GridStrategy.h" using namespace vf::gpu; -Field::Field(SPtr<GridStrategy> gridStrategy, uint size) : gridStrategy(gridStrategy), size(size) -{ - -} - -Field::Field() -{ - -} - -Field::~Field() +Field::Field(uint size) : size(size) { } void Field::allocateMemory() { - gridStrategy->allocateFieldMemory(this); + this->field = new char[this->size]; } void Field::freeMemory() { - gridStrategy->freeFieldMemory(this); + delete[] this->field; } // --------------------------------------------------------- // diff --git a/src/gpu/GridGenerator/grid/Field.h b/src/gpu/GridGenerator/grid/Field.h index 9dc8e6857..eafa81ec6 100644 --- a/src/gpu/GridGenerator/grid/Field.h +++ b/src/gpu/GridGenerator/grid/Field.h @@ -36,14 +36,12 @@ #include "global.h" struct Vertex; -class GridStrategy; class GRIDGENERATOR_EXPORT Field : public enableSharedFromThis<Field> { public: - Field(SPtr<GridStrategy> gridStrategy, uint size); - Field(); - ~Field(); + Field(uint size); + Field() = default; void allocateMemory(); void freeMemory(); @@ -74,13 +72,8 @@ public: void setFieldEntryToInvalidOutOfGrid(uint index); private: - SPtr<GridStrategy> gridStrategy; - char *field; uint size; - - friend class GridGpuStrategy; - friend class GridCpuStrategy; }; #endif diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h index 1f8a33380..3407b23c1 100644 --- a/src/gpu/GridGenerator/grid/Grid.h +++ b/src/gpu/GridGenerator/grid/Grid.h @@ -44,7 +44,6 @@ class TriangularMesh; struct Vertex; struct Triangle; -class GridStrategy; class GridInterface; class Object; class BoundingBox; @@ -52,7 +51,7 @@ class BoundingBox; class GRIDGENERATOR_EXPORT Grid { public: - virtual ~Grid() {} + virtual ~Grid() = default; virtual const Object* getObject() const = 0; @@ -104,7 +103,6 @@ public: virtual void getNodeValues(real *xCoords, real *yCoords, real *zCoords, uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, uint *geo) const = 0; - virtual SPtr<GridStrategy> getGridStrategy() const = 0; virtual void transIndexToCoords(uint index, real &x, real &y, real &z) const = 0; virtual uint transCoordToIndex(const real &x, const real &y, const real &z) const = 0; diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 2a5f017ad..6137256e9 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -45,8 +45,6 @@ #include "grid/Grid.h" #include "grid/GridFactory.h" #include "grid/GridInterface.h" -#include "grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h" -#include "grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h" #include "grid/NodeValues.h" #include "grid/partition/Partition.h" @@ -64,7 +62,7 @@ using namespace vf::gpu; -LevelGridBuilder::LevelGridBuilder(Device device, const std::string &d3qxx) : device(device), d3qxx(d3qxx) +LevelGridBuilder::LevelGridBuilder() { this->communicationProcesses[CommunicationDirections::MX] = INVALID_INDEX; this->communicationProcesses[CommunicationDirections::PX] = INVALID_INDEX; @@ -74,9 +72,9 @@ LevelGridBuilder::LevelGridBuilder(Device device, const std::string &d3qxx) : de this->communicationProcesses[CommunicationDirections::PZ] = INVALID_INDEX; } -std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(Device device, const std::string& d3qxx) +std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared() { - return SPtr<LevelGridBuilder>(new LevelGridBuilder(device, d3qxx)); + return SPtr<LevelGridBuilder>(new LevelGridBuilder()); } void LevelGridBuilder::setSlipBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ) @@ -184,15 +182,6 @@ GRIDGENERATOR_EXPORT uint LevelGridBuilder::getCommunicationProcess(int directio return this->communicationProcesses[direction]; } -void LevelGridBuilder::copyDataFromGpu() -{ - for (const auto &grid : grids) { - auto gridGpuStrategy = std::dynamic_pointer_cast<GridGpuStrategy>(grid->getGridStrategy()); - if (gridGpuStrategy) - gridGpuStrategy->copyDataFromGPU(std::static_pointer_cast<GridImp>(grid)); - } -} - LevelGridBuilder::~LevelGridBuilder() { for (const auto& grid : grids) diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index c2f6b9da6..0e1e9e25f 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -50,7 +50,6 @@ class Transformator; class ArrowTransformator; class PolyDataWriterWrapper; class BoundingBox; -enum class Device; class Side; class VelocityBoundaryCondition; @@ -64,14 +63,13 @@ enum class SideType; class LevelGridBuilder : public GridBuilder { protected: - GRIDGENERATOR_EXPORT LevelGridBuilder(Device device, const std::string& d3qxx); + GRIDGENERATOR_EXPORT LevelGridBuilder(); public: - GRIDGENERATOR_EXPORT static std::shared_ptr<LevelGridBuilder> makeShared(Device device, const std::string& d3qxx); + GRIDGENERATOR_EXPORT static std::shared_ptr<LevelGridBuilder> makeShared(); GRIDGENERATOR_EXPORT SPtr<Grid> getGrid(uint level) override; - GRIDGENERATOR_EXPORT void copyDataFromGpu(); GRIDGENERATOR_EXPORT virtual ~LevelGridBuilder(); GRIDGENERATOR_EXPORT void setSlipBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ); @@ -156,10 +154,6 @@ protected: Vertex getVertex(const int matrixIndex) const; -private: - Device device; - std::string d3qxx; - public: GRIDGENERATOR_EXPORT void getGridInformations(std::vector<int>& gridX, std::vector<int>& gridY, std::vector<int>& gridZ, std::vector<int>& distX, std::vector<int>& distY, diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index da01099cf..47bea5643 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -49,15 +49,14 @@ #include "io/GridVTKWriter/GridVTKWriter.h" #include "io/STLReaderWriter/STLWriter.h" -MultipleGridBuilder::MultipleGridBuilder(SPtr<GridFactory> gridFactory, Device device, const std::string &d3qxx) : - LevelGridBuilder(device, d3qxx), gridFactory(gridFactory), numberOfLayersFine(12), numberOfLayersBetweenLevels(8), subDomainBox(nullptr) +MultipleGridBuilder::MultipleGridBuilder() : LevelGridBuilder(), numberOfLayersFine(12), numberOfLayersBetweenLevels(8), subDomainBox(nullptr) { } -SPtr<MultipleGridBuilder> MultipleGridBuilder::makeShared(SPtr<GridFactory> gridFactory) +SPtr<MultipleGridBuilder> MultipleGridBuilder::makeShared() { - return SPtr<MultipleGridBuilder>(new MultipleGridBuilder(gridFactory)); + return SPtr<MultipleGridBuilder>(new MultipleGridBuilder()); } void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta) @@ -196,7 +195,7 @@ void MultipleGridBuilder::addGridToListIfValid(SPtr<Grid> grid) SPtr<Grid> MultipleGridBuilder::makeGrid(Object* gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const { - return gridFactory->makeGrid(gridShape, startX, startY, startZ, endX, endY, endZ, delta, level); + return GridImp::makeShared(gridShape, startX, startY, startZ, endX, endY, endZ, delta, "D3Q27", level); } bool MultipleGridBuilder::coarseGridExists() const diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h index 5f2f54353..8c05a61ca 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h @@ -41,7 +41,7 @@ #include "global.h" #include "grid/GridBuilder/LevelGridBuilder.h" -#include "grid/GridFactory.h" +#include "grid/distributions/Distribution.h" class Object; class BoundingBox; @@ -49,10 +49,10 @@ class BoundingBox; class MultipleGridBuilder : public LevelGridBuilder { private: - GRIDGENERATOR_EXPORT MultipleGridBuilder(SPtr<GridFactory> gridFactory, Device device = Device::CPU, const std::string &d3qxx = "D3Q27"); + GRIDGENERATOR_EXPORT MultipleGridBuilder(); public: - GRIDGENERATOR_EXPORT static SPtr<MultipleGridBuilder> makeShared(SPtr<GridFactory> gridFactory); + GRIDGENERATOR_EXPORT static SPtr<MultipleGridBuilder> makeShared(); GRIDGENERATOR_EXPORT void addCoarseGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta); GRIDGENERATOR_EXPORT void addGrid(Object *gridShape); @@ -103,7 +103,6 @@ private: static void emitNoCoarseGridExistsWarning(); static void emitGridIsNotInCoarseGridWarning(); - SPtr<GridFactory> gridFactory; Object *solidObject; uint numberOfLayersFine; diff --git a/src/gpu/GridGenerator/grid/GridFactory.cpp b/src/gpu/GridGenerator/grid/GridFactory.cpp deleted file mode 100644 index 3e2297c21..000000000 --- a/src/gpu/GridGenerator/grid/GridFactory.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "GridFactory.h" - - - diff --git a/src/gpu/GridGenerator/grid/GridFactory.h b/src/gpu/GridGenerator/grid/GridFactory.h index 9ebf1e3a1..dd659cda3 100644 --- a/src/gpu/GridGenerator/grid/GridFactory.h +++ b/src/gpu/GridGenerator/grid/GridFactory.h @@ -37,15 +37,9 @@ #include "geometries/Cuboid/Cuboid.h" -#include "grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h" #include "grid/distributions/Distribution.h" #include "grid/GridImp.h" -enum class Device -{ - CPU, GPU -}; - enum class TriangularMeshDiscretizationMethod { RAYCASTING, POINT_IN_OBJECT, POINT_UNDER_TRIANGLE @@ -59,43 +53,12 @@ public: return SPtr<GridFactory>(new GridFactory()); } -private: - GridFactory() - { - gridStrategy = SPtr<GridStrategy>(new GridCpuStrategy()); - } - -public: SPtr<Grid> makeGrid(Object* gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level, const std::string& d3Qxx = "D3Q27") { Distribution distribution = DistributionHelper::getDistribution(d3Qxx); - SPtr<GridImp> grid; - - grid = GridImp::makeShared(gridShape, startX, startY, startZ, endX, endY, endZ, delta, gridStrategy, distribution, level); - - return grid; + return GridImp::makeShared(gridShape, startX, startY, startZ, endX, endY, endZ, delta, d3Qxx, level); } - - - void setGridStrategy(Device device) - { - switch (device) - { - case Device::CPU: - gridStrategy = SPtr<GridStrategy>(new GridCpuStrategy()); break; - case Device::GPU: - throw std::runtime_error("GPU Device for GridGenerator not supported."); - } - } - - void setGridStrategy(SPtr<GridStrategy> gridStrategy) - { - this->gridStrategy = gridStrategy; - } - -private: - SPtr<GridStrategy> gridStrategy; }; diff --git a/src/gpu/GridGenerator/grid/GridImp.cu b/src/gpu/GridGenerator/grid/GridImp.cu index 27ab17b79..6bb3db8d4 100644 --- a/src/gpu/GridGenerator/grid/GridImp.cu +++ b/src/gpu/GridGenerator/grid/GridImp.cu @@ -47,7 +47,6 @@ #include "geometries/TriangularMesh/TriangularMeshStrategy.h" #include "geometries/BoundingBox/BoundingBox.h" -#include "grid/GridStrategy/GridStrategy.h" #include "grid/distributions/Distribution.h" #include "grid/Field.h" #include "grid/GridInterface.h" @@ -62,7 +61,7 @@ int DIRECTIONS[DIR_END_MAX][DIMENSION]; using namespace vf::gpu; -GridImp::GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, SPtr<GridStrategy> gridStrategy, Distribution distribution, uint level) +GridImp::GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, Distribution distribution, uint level) : object(object), startX(startX), startY(startY), @@ -71,7 +70,6 @@ GridImp::GridImp(Object* object, real startX, real startY, real startZ, real end endY(endY), endZ(endZ), delta(delta), - gridStrategy(gridStrategy), distribution(distribution), level(level), periodicityX(false), @@ -94,9 +92,10 @@ GridImp::GridImp(Object* object, real startX, real startY, real startZ, real end initalNumberOfNodesAndSize(); } -SPtr<GridImp> GridImp::makeShared(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, SPtr<GridStrategy> gridStrategy, Distribution d, uint level) +SPtr<GridImp> GridImp::makeShared(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, std::string d3Qxx, uint level) { - SPtr<GridImp> grid(new GridImp(object, startX, startY, startZ, endX, endY, endZ, delta, gridStrategy, d, level)); + Distribution distribution = DistributionHelper::getDistribution(d3Qxx); + SPtr<GridImp> grid(new GridImp(object, startX, startY, startZ, endX, endY, endZ, delta, distribution, level)); return grid; } @@ -118,12 +117,24 @@ void GridImp::initalNumberOfNodesAndSize() void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers) { - field = Field(gridStrategy, size); + field = Field(size); field.allocateMemory(); - gridStrategy->allocateGridMemory(shared_from_this()); - + + this->neighborIndexX = new int[this->size]; + this->neighborIndexY = new int[this->size]; + this->neighborIndexZ = new int[this->size]; + this->neighborIndexNegative = new int[this->size]; + + this->sparseIndices = new int[this->size]; + + this->qIndices = new uint[this->size]; + for (uint i = 0; i < this->size; i++) + this->qIndices[i] = INVALID_INDEX; + *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start initalNodesToOutOfGrid()\n"; - gridStrategy->initalNodesToOutOfGrid(shared_from_this()); +#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->initalNodeToOutOfGrid(index); if( this->innerRegionFromFinerGrid ){ *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start setInnerBasedOnFinerGrid()\n"; @@ -138,16 +149,42 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers) this->addOverlap(); *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start fixOddCells()\n"; - gridStrategy->fixOddCells( shared_from_this() ); +#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->fixOddCell(index); if( enableFixRefinementIntoTheWall ) { *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start fixRefinementIntoWall()\n"; - gridStrategy->fixRefinementIntoWall(shared_from_this()); +#pragma omp parallel for + for (int xIdx = 0; xIdx < (int)this->nx; xIdx++) { + for (uint yIdx = 0; yIdx < this->ny; yIdx++) { + this->fixRefinementIntoWall(xIdx, yIdx, 0, 3); + this->fixRefinementIntoWall(xIdx, yIdx, this->nz - 1, -3); + } + } + +#pragma omp parallel for + for (int xIdx = 0; xIdx < (int)this->nx; xIdx++) { + for (uint zIdx = 0; zIdx < this->nz; zIdx++) { + this->fixRefinementIntoWall(xIdx, 0, zIdx, 2); + this->fixRefinementIntoWall(xIdx, this->ny - 1, zIdx, -2); + } + } + +#pragma omp parallel for + for (int yIdx = 0; yIdx < (int)this->ny; yIdx++) { + for (uint zIdx = 0; zIdx < this->nz; zIdx++) { + this->fixRefinementIntoWall(0, yIdx, zIdx, 1); + this->fixRefinementIntoWall(this->nx - 1, yIdx, zIdx, -1); + } + } } *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start findEndOfGridStopperNodes()\n"; - gridStrategy->findEndOfGridStopperNodes(shared_from_this()); +#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->findEndOfGridStopperNode(index); *logging::out << logging::Logger::INFO_INTERMEDIATE << "Grid created: " << "from (" << this->startX << ", " << this->startY << ", " << this->startZ << ") to (" << this->endX << ", " << this->endY << ", " << this->endZ << ")\n" @@ -167,17 +204,23 @@ void GridImp::initalNodeToOutOfGrid(uint index) { void GridImp::freeMemory() { - gridStrategy->freeMemory(shared_from_this()); + if( this->neighborIndexX != nullptr ) { delete[] this->neighborIndexX; this->neighborIndexX = nullptr; } + if( this->neighborIndexY != nullptr ) { delete[] this->neighborIndexY; this->neighborIndexY = nullptr; } + if( this->neighborIndexZ != nullptr ) { delete[] this->neighborIndexZ; this->neighborIndexZ = nullptr; } + if( this->neighborIndexNegative != nullptr ) { delete[] this->neighborIndexNegative; this->neighborIndexNegative = nullptr; } + if( this->sparseIndices != nullptr ) { delete[] this->sparseIndices; this->sparseIndices = nullptr; } + if( this->qIndices != nullptr ) { delete[] this->qIndices; this->qIndices = nullptr; } + if( this->qValues != nullptr ) { delete[] this->qValues; this->qValues = nullptr; } + if( this->qPatches != nullptr ) { delete[] this->qPatches; this->qPatches = nullptr; } - gridStrategy->freeFieldMemory(&field); + field.freeMemory(); } -GridImp::GridImp() -{ -} - -GridImp::~GridImp() +void GridImp::findInnerNodes() { +#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->findInnerNode(index); } void GridImp::findInnerNode(uint index) @@ -293,7 +336,13 @@ void GridImp::setInnerBasedOnFinerGrid(const SPtr<Grid> fineGrid) void GridImp::addOverlap() { for( uint layer = 0; layer < this->numberOfLayers; layer++ ){ - this->gridStrategy->addOverlap( shared_from_this() ); +#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->setOverlapTmp(index); + +#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->setOverlapFluid(index); } } @@ -805,9 +854,24 @@ void GridImp::setNumberOfLayers(uint numberOfLayers) // Set Sparse Indices // // --------------------------------------------------------- // -void GridImp::findSparseIndices(SPtr<Grid> fineGrid) +void GridImp::findSparseIndices(SPtr<Grid> finerGrid) { - this->gridStrategy->findSparseIndices(shared_from_this(), std::static_pointer_cast<GridImp>(fineGrid)); + *logging::out << logging::Logger::INFO_INTERMEDIATE << "Find sparse indices..."; + auto fineGrid = std::static_pointer_cast<GridImp>(finerGrid); + + this->updateSparseIndices(); + +#pragma omp parallel for + for (int index = 0; index < (int)this->getSize(); index++) + this->setNeighborIndices(index); + + if (fineGrid) { + fineGrid->updateSparseIndices(); + } + + const uint newGridSize = this->getSparseSize(); + *logging::out << logging::Logger::INFO_INTERMEDIATE << "... done. new size: " << newGridSize + << ", delete nodes:" << this->getSize() - newGridSize << "\n"; } @@ -980,7 +1044,38 @@ int GridImp::getSparseIndex(const real &x, const real &y, const real &z) const // --------------------------------------------------------- // void GridImp::findGridInterface(SPtr<Grid> finerGrid, LbmOrGks lbmOrGks) { - gridStrategy->findGridInterface(shared_from_this(), std::static_pointer_cast<GridImp>(finerGrid), lbmOrGks); + auto fineGrid = std::static_pointer_cast<GridImp>(finerGrid); + const auto coarseLevel = this->getLevel(); + const auto fineLevel = fineGrid->getLevel(); + + *logging::out << logging::Logger::INFO_INTERMEDIATE << "find interface level " << coarseLevel << " -> " + << fineLevel; + + this->gridInterface = new GridInterface(); + // TODO: this is stupid! concave refinements can easily have many more interface cells + const uint sizeCF = 10 * (fineGrid->nx * fineGrid->ny + fineGrid->ny * fineGrid->nz + fineGrid->nx * fineGrid->nz); + this->gridInterface->cf.coarse = new uint[sizeCF]; + this->gridInterface->cf.fine = new uint[sizeCF]; + this->gridInterface->cf.offset = new uint[sizeCF]; + this->gridInterface->fc.coarse = new uint[sizeCF]; + this->gridInterface->fc.fine = new uint[sizeCF]; + this->gridInterface->fc.offset = new uint[sizeCF]; + + for (uint index = 0; index < this->getSize(); index++) + this->findGridInterfaceCF(index, *fineGrid, lbmOrGks); + + for (uint index = 0; index < this->getSize(); index++) + this->findGridInterfaceFC(index, *fineGrid); + + for (uint index = 0; index < this->getSize(); index++) + this->findOverlapStopper(index, *fineGrid); + + if (lbmOrGks == GKS) { + for (uint index = 0; index < this->getSize(); index++) + this->findInvalidBoundaryNodes(index); + } + + *logging::out << logging::Logger::INFO_INTERMEDIATE << " ... done. \n"; } void GridImp::repairGridInterfaceOnMultiGPU(SPtr<Grid> fineGrid) @@ -1027,8 +1122,6 @@ void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox, LbmOrGks lbmOrGks this->setFieldEntry(index, INVALID_OUT_OF_GRID); } } - - //this->gridStrategy->findEndOfGridStopperNodes(shared_from_this()); } void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid, LbmOrGks lbmOrGks) @@ -1066,14 +1159,19 @@ void GridImp::mesh(Object* object) if (triangularMesh) triangularMeshDiscretizationStrategy->discretize(triangularMesh, this, INVALID_SOLID, FLUID); else - //gridStrategy->findInnerNodes(shared_from_this()); //TODO: adds INNERTYPE AND OUTERTYPE to findInnerNodes //new method for geometric primitives (not cell based) to be implemented this->discretize(object, INVALID_SOLID, FLUID); this->closeNeedleCells(); - gridStrategy->findSolidStopperNodes(shared_from_this()); - gridStrategy->findBoundarySolidNodes(shared_from_this()); + #pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) + this->findSolidStopperNode(index); + + //#pragma omp parallel for + for (int index = 0; index < (int)this->size; index++) { + this->findBoundarySolidNode(index); + } } @@ -1081,7 +1179,9 @@ void GridImp::mesh(TriangularMesh &triangularMesh) { const clock_t begin = clock(); - gridStrategy->mesh(shared_from_this(), triangularMesh); +#pragma omp parallel for + for (int i = 0; i < triangularMesh.size; i++) + this->mesh(triangularMesh.triangles[i]); const clock_t end = clock(); const real time = (real)(real(end - begin) / CLOCKS_PER_SEC); @@ -1122,7 +1222,12 @@ void GridImp::closeNeedleCells() uint numberOfClosedNeedleCells = 0; do{ - numberOfClosedNeedleCells = this->gridStrategy->closeNeedleCells( shared_from_this() ); +#pragma omp parallel for reduction(+ : numberOfClosedNeedleCells) + for (int index = 0; index < (int)this->size; index++) { + if (this->closeCellIfNeedle(index)) + numberOfClosedNeedleCells++; + } + *logging::out << logging::Logger::INFO_INTERMEDIATE << numberOfClosedNeedleCells << " cells closed!\n"; } while( numberOfClosedNeedleCells > 0 ); @@ -1157,7 +1262,12 @@ void GridImp::closeNeedleCellsThinWall() uint numberOfClosedNeedleCells = 0; do{ - numberOfClosedNeedleCells = this->gridStrategy->closeNeedleCellsThinWall( shared_from_this() ); +#pragma omp parallel for reduction(+ : numberOfClosedNeedleCells) + for (int index = 0; index < (int)this->size; index++) { + if (this->closeCellIfNeedleThinWall(index)) + numberOfClosedNeedleCells++; + } + *logging::out << logging::Logger::INFO_INTERMEDIATE << numberOfClosedNeedleCells << " cells closed!\n"; } while( numberOfClosedNeedleCells > 0 ); @@ -1189,15 +1299,31 @@ void GridImp::findQs(Object* object) //TODO: enable qs for primitive objects findQsPrimitive(object); } +void GridImp::allocateQs() +{ + this->qPatches = new uint[this->getNumberOfSolidBoundaryNodes()]; + + for (uint i = 0; i < this->getNumberOfSolidBoundaryNodes(); i++) + this->qPatches[i] = INVALID_INDEX; + + const uint numberOfQs = this->getNumberOfSolidBoundaryNodes() * (this->distribution.dir_end + 1); + this->qValues = new real[numberOfQs]; +#pragma omp parallel for + for (int i = 0; i < (int)numberOfQs; i++) + this->qValues[i] = -1.0; +} + void GridImp::findQs(TriangularMesh &triangularMesh) { const clock_t begin = clock(); - if( this->qComputationStage == qComputationStageType::ComputeQs ){ - gridStrategy->allocateQs(shared_from_this()); - } - - gridStrategy->findQs(shared_from_this(), triangularMesh); + if( this->qComputationStage == qComputationStageType::ComputeQs ) + allocateQs(); + + +#pragma omp parallel for + for (int i = 0; i < triangularMesh.size; i++) + this->findQs(triangularMesh.triangles[i]); const clock_t end = clock(); const real time = (real)(real(end - begin) / CLOCKS_PER_SEC); @@ -1251,9 +1377,8 @@ void GridImp::findQs(Triangle &triangle) void GridImp::findQsPrimitive(Object * object) { - if( this->qComputationStage == qComputationStageType::ComputeQs ){ - gridStrategy->allocateQs(shared_from_this()); - } + if( this->qComputationStage == qComputationStageType::ComputeQs ) + allocateQs(); for( int index = 0; index < (int)this->size; index++ ) @@ -1724,11 +1849,6 @@ uint GridImp::getNumberOfNodesZ() const return nz; } -SPtr<GridStrategy> GridImp::getGridStrategy() const -{ - return gridStrategy; -} - int* GridImp::getNeighborsX() const { diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h index 938fa1d80..7d44b0bb5 100644 --- a/src/gpu/GridGenerator/grid/GridImp.h +++ b/src/gpu/GridGenerator/grid/GridImp.h @@ -47,7 +47,6 @@ class TriangularMesh; struct Vertex; struct Triangle; -class GridStrategy; class GridInterface; class Object; class BoundingBox; @@ -72,12 +71,11 @@ extern int DIRECTIONS[DIR_END_MAX][DIMENSION]; class GRIDGENERATOR_EXPORT GridImp : public enableSharedFromThis<GridImp>, public Grid { private: - GridImp(); - GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, SPtr<GridStrategy> gridStrategy, Distribution d, uint level); + GridImp() = default; + GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, Distribution d, uint level); public: - virtual ~GridImp(); - static SPtr<GridImp> makeShared(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, SPtr<GridStrategy> gridStrategy, Distribution d, uint level); + static SPtr<GridImp> makeShared(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, std::string d3Qxx, uint level); private: void initalNumberOfNodesAndSize(); @@ -126,7 +124,6 @@ private: uint numberOfLayers; - SPtr<GridStrategy> gridStrategy; TriangularMeshDiscretizationStrategy *triangularMeshDiscretizationStrategy; uint numberOfSolidBoundaryNodes; @@ -184,6 +181,7 @@ public: void initalNodeToOutOfGrid(uint index); + void findInnerNodes(); void findInnerNode(uint index); void discretize(Object *object, char innerType, char outerType); @@ -263,8 +261,6 @@ public: uint *getFC_fine() const override; uint *getFC_offset() const override; - SPtr<GridStrategy> getGridStrategy() const override; - void print() const; public: @@ -327,6 +323,8 @@ private: bool checkIfAtLeastOneValidQ(const uint index, const Vertex &point, Object *object) const; + void allocateQs(); + public: void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox, LbmOrGks lbmOrGks) override; void findCommunicationIndex(uint index, real coordinate, real limit, int direction); @@ -347,9 +345,6 @@ public: std::array<CommunicationIndices, 6> communicationIndices; -private: - friend class GridGpuStrategy; - friend class GridCpuStrategy; }; #endif diff --git a/src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp deleted file mode 100644 index 79f89b5a1..000000000 --- a/src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp +++ /dev/null @@ -1,298 +0,0 @@ -//======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ -// \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ -// -// This file is part of VirtualFluids. VirtualFluids is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. -// -//! \file GridCpuStrategy.cpp -//! \ingroup grid -//! \author Soeren Peters, Stephan Lenz -//======================================================================================= -#include "GridCpuStrategy.h" - -#include <time.h> -#include <stdio.h> -#include <omp.h> -#include <vector> -#include <iostream> - -#include "geometries/TriangularMesh/TriangularMesh.h" - -#include "grid/GridImp.h" -#include "grid/GridInterface.h" -#include "grid/NodeValues.h" -#include "grid/distributions/Distribution.h" - -using namespace vf::gpu; - -void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid) -{ - grid->neighborIndexX = new int[grid->size]; - grid->neighborIndexY = new int[grid->size]; - grid->neighborIndexZ = new int[grid->size]; - grid->neighborIndexNegative = new int[grid->size]; - - grid->sparseIndices = new int[grid->size]; - - grid->qIndices = new uint[grid->size]; - for (uint i = 0; i < grid->size; i++) - grid->qIndices[i] = INVALID_INDEX; -} - -void GridCpuStrategy::allocateQs(SPtr<GridImp> grid) -{ - grid->qPatches = new uint[grid->getNumberOfSolidBoundaryNodes()]; - - for (uint i = 0; i < grid->getNumberOfSolidBoundaryNodes(); i++) - grid->qPatches[i] = INVALID_INDEX; - - const uint numberOfQs = grid->getNumberOfSolidBoundaryNodes() * (grid->distribution.dir_end + 1); - grid->qValues = new real[numberOfQs]; -#pragma omp parallel for - for (int i = 0; i < (int)numberOfQs; i++) - grid->qValues[i] = -1.0; -} - -void GridCpuStrategy::initalNodesToOutOfGrid(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->initalNodeToOutOfGrid(index); -} - -void GridCpuStrategy::allocateFieldMemory(Field* field) -{ - field->field = new char[field->size]; -} - - -void GridCpuStrategy::findInnerNodes(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->findInnerNode(index); -} - -void GridCpuStrategy::addOverlap(SPtr<GridImp> grid) -{ - -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->setOverlapTmp(index); - -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->setOverlapFluid(index); -} - -void GridCpuStrategy::fixOddCells(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->fixOddCell(index); -} - -void GridCpuStrategy::fixRefinementIntoWall(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int xIdx = 0; xIdx < (int)grid->nx; xIdx++) { - for (uint yIdx = 0; yIdx < grid->ny; yIdx++) { - grid->fixRefinementIntoWall(xIdx, yIdx, 0, 3); - grid->fixRefinementIntoWall(xIdx, yIdx, grid->nz - 1, -3); - } - } - -#pragma omp parallel for - for (int xIdx = 0; xIdx < (int)grid->nx; xIdx++) { - for (uint zIdx = 0; zIdx < grid->nz; zIdx++) { - grid->fixRefinementIntoWall(xIdx, 0, zIdx, 2); - grid->fixRefinementIntoWall(xIdx, grid->ny - 1, zIdx, -2); - } - } - -#pragma omp parallel for - for (int yIdx = 0; yIdx < (int)grid->ny; yIdx++) { - for (uint zIdx = 0; zIdx < grid->nz; zIdx++) { - grid->fixRefinementIntoWall(0, yIdx, zIdx, 1); - grid->fixRefinementIntoWall(grid->nx - 1, yIdx, zIdx, -1); - } - } -} - -void GridCpuStrategy::findStopperNodes(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->findStopperNode(index); -} - -void GridCpuStrategy::findEndOfGridStopperNodes(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->findEndOfGridStopperNode(index); -} - -void GridCpuStrategy::findSolidStopperNodes(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) - grid->findSolidStopperNode(index); -} - -void GridCpuStrategy::findBoundarySolidNodes(SPtr<GridImp> grid) -{ - //#pragma omp parallel for - for (int index = 0; index < (int)grid->size; index++) { - grid->findBoundarySolidNode(index); - } -} - -void GridCpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom) -{ -#pragma omp parallel for - for (int i = 0; i < geom.size; i++) - grid->mesh(geom.triangles[i]); -} - -uint GridCpuStrategy::closeNeedleCells(SPtr<GridImp> grid) -{ - uint numberOfClosedNeedleCells = 0; - -#pragma omp parallel for reduction(+ : numberOfClosedNeedleCells) - for (int index = 0; index < (int)grid->size; index++) { - if (grid->closeCellIfNeedle(index)) - numberOfClosedNeedleCells++; - } - - return numberOfClosedNeedleCells; -} - -uint GridCpuStrategy::closeNeedleCellsThinWall(SPtr<GridImp> grid) -{ - uint numberOfClosedNeedleCells = 0; - -#pragma omp parallel for reduction(+ : numberOfClosedNeedleCells) - for (int index = 0; index < (int)grid->size; index++) { - if (grid->closeCellIfNeedleThinWall(index)) - numberOfClosedNeedleCells++; - } - - return numberOfClosedNeedleCells; -} - -void GridCpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom) -{ -#pragma omp parallel for - for (int i = 0; i < geom.size; i++) - grid->findQs(geom.triangles[i]); -} - -void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid, LbmOrGks lbmOrGks) -{ - const auto coarseLevel = grid->getLevel(); - const auto fineLevel = fineGrid->getLevel(); - - *logging::out << logging::Logger::INFO_INTERMEDIATE << "find interface level " << coarseLevel << " -> " - << fineLevel; - - grid->gridInterface = new GridInterface(); - // TODO: this is stupid! concave refinements can easily have many more interface cells - const uint sizeCF = 10 * (fineGrid->nx * fineGrid->ny + fineGrid->ny * fineGrid->nz + fineGrid->nx * fineGrid->nz); - grid->gridInterface->cf.coarse = new uint[sizeCF]; - grid->gridInterface->cf.fine = new uint[sizeCF]; - grid->gridInterface->cf.offset = new uint[sizeCF]; - grid->gridInterface->fc.coarse = new uint[sizeCF]; - grid->gridInterface->fc.fine = new uint[sizeCF]; - grid->gridInterface->fc.offset = new uint[sizeCF]; - - for (uint index = 0; index < grid->getSize(); index++) - grid->findGridInterfaceCF(index, *fineGrid, lbmOrGks); - - for (uint index = 0; index < grid->getSize(); index++) - grid->findGridInterfaceFC(index, *fineGrid); - - for (uint index = 0; index < grid->getSize(); index++) - grid->findOverlapStopper(index, *fineGrid); - - if (lbmOrGks == GKS) { - for (uint index = 0; index < grid->getSize(); index++) - grid->findInvalidBoundaryNodes(index); - } - - *logging::out << logging::Logger::INFO_INTERMEDIATE << " ... done. \n"; -} - -void GridCpuStrategy::findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) -{ - *logging::out << logging::Logger::INFO_INTERMEDIATE << "Find sparse indices..."; - - coarseGrid->updateSparseIndices(); - findForNeighborsNewIndices(coarseGrid); - if (fineGrid) - { - fineGrid->updateSparseIndices(); - } - - const uint newGridSize = coarseGrid->getSparseSize(); - *logging::out << logging::Logger::INFO_INTERMEDIATE << "... done. new size: " << newGridSize << ", delete nodes:" << coarseGrid->getSize() - newGridSize << "\n"; -} - - -void GridCpuStrategy::findForNeighborsNewIndices(SPtr<GridImp> grid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->getSize(); index++) - grid->setNeighborIndices(index); -} - -void GridCpuStrategy::findForGridInterfaceNewIndices(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) -{ -#pragma omp parallel for - for (int index = 0; index < (int)grid->getNumberOfNodesCF(); index++) - grid->gridInterface->findForGridInterfaceSparseIndexCF(grid.get(), fineGrid.get(), index); - -#pragma omp parallel for - for (int index = 0; index < (int)grid->getNumberOfNodesFC(); index++) - grid->gridInterface->findForGridInterfaceSparseIndexFC(grid.get(), fineGrid.get(), index); -} - -void GridCpuStrategy::freeFieldMemory(Field* field) -{ - delete[] field->field; -} - -void GridCpuStrategy::freeMemory(SPtr<GridImp> grid) -{ - if( grid->neighborIndexX != nullptr ) { delete[] grid->neighborIndexX; grid->neighborIndexX = nullptr; } - if( grid->neighborIndexY != nullptr ) { delete[] grid->neighborIndexY; grid->neighborIndexY = nullptr; } - if( grid->neighborIndexZ != nullptr ) { delete[] grid->neighborIndexZ; grid->neighborIndexZ = nullptr; } - if( grid->neighborIndexNegative != nullptr ) { delete[] grid->neighborIndexNegative; grid->neighborIndexNegative = nullptr; } - if( grid->sparseIndices != nullptr ) { delete[] grid->sparseIndices; grid->sparseIndices = nullptr; } - if( grid->qIndices != nullptr ) { delete[] grid->qIndices; grid->qIndices = nullptr; } - if( grid->qValues != nullptr ) { delete[] grid->qValues; grid->qValues = nullptr; } - if( grid->qPatches != nullptr ) { delete[] grid->qPatches; grid->qPatches = nullptr; } -} - diff --git a/src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h deleted file mode 100644 index c5c52d68a..000000000 --- a/src/gpu/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h +++ /dev/null @@ -1,85 +0,0 @@ -//======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ -// \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ -// -// This file is part of VirtualFluids. VirtualFluids is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. -// -//! \file GridCpuStrategy.h -//! \ingroup grid -//! \author Soeren Peters, Stephan Lenz -//======================================================================================= -#ifndef GRID_CPU_STRATEGY_H -#define GRID_CPU_STRATEGY_H - -#include "global.h" - -#include "grid/GridStrategy/GridStrategy.h" - -class GridImp; -class TriangularMesh; - -class GRIDGENERATOR_EXPORT GridCpuStrategy : public GridStrategy -{ -public: - virtual ~GridCpuStrategy(){}; - - void allocateGridMemory(SPtr<GridImp> grid) override; - - void allocateQs(SPtr<GridImp> grid) override; - - void initalNodesToOutOfGrid(SPtr<GridImp> grid) override; - void fixOddCells(SPtr<GridImp> grid) override; - void findInnerNodes(SPtr<GridImp> grid) override; - void addOverlap(SPtr<GridImp> grid) override; - void fixRefinementIntoWall(SPtr<GridImp> grid) override; - void findStopperNodes(SPtr<GridImp> grid) override; - void findBoundarySolidNodes(SPtr<GridImp> grid) override; - void findEndOfGridStopperNodes(SPtr<GridImp> grid) override; - void findSolidStopperNodes(SPtr<GridImp> grid) override; - - void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override; - - uint closeNeedleCells(SPtr<GridImp> grid) override; - uint closeNeedleCellsThinWall(SPtr<GridImp> grid) override; - - void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override; - - void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid, LbmOrGks lbmOrGks) override; - - void freeMemory(SPtr<GridImp> grid) override; - - virtual void copyDataFromGPU(){}; - -protected: - static void findForNeighborsNewIndices(SPtr<GridImp> grid); - static void findForGridInterfaceNewIndices(SPtr<GridImp> grid, SPtr<GridImp> fineGrid); - -public: - void allocateFieldMemory(Field *field) override; - void freeFieldMemory(Field *field) override; - void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override; -}; - -#endif \ No newline at end of file diff --git a/src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp b/src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp deleted file mode 100644 index a19daf22a..000000000 --- a/src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp +++ /dev/null @@ -1,430 +0,0 @@ -#include "GridGpuStrategy.h" - -#include "Core/Timer/Timer.h" - -#include "geometries/BoundingBox/BoundingBox.h" -#include "geometries/TriangularMesh/TriangularMesh.h" - -#include "grid/kernel/runGridKernelGPU.cuh" -#include "grid/distributions/Distribution.h" -#include "grid/GridImp.h" -#include "grid/GridInterface.h" - -#include "utilities/cuda/CudaErrorCheck.cu" -#include "utilities/cuda/LaunchParameter.cuh" - -void GridGpuStrategy::allocateGridMemory(SPtr<GridImp> grid) -{ - //printCudaInformation(0); - cudaSetDevice(0); - - this->allocDistribution(grid); - this->allocField(grid); - this->allocMatrixIndicesOnGPU(grid); - this->allocNeighborsIndices(grid); -} - -void GridGpuStrategy::allocateQs(SPtr<GridImp> grid) -{ -} - -void GridGpuStrategy::initalNodesToOutOfGrid(SPtr<GridImp> grid) -{ - -} - -void GridGpuStrategy::fixOddCells(SPtr<GridImp> grid) -{ -} - - - -void GridGpuStrategy::findInnerNodes(SPtr<GridImp> grid) -{ - //float time = runKernelInitalUniformGrid3d(LaunchParameter::make_2D1D_launchParameter(grid->size, 256), *grid.get()); -} - -void GridGpuStrategy::addOverlap(SPtr<GridImp> grid) -{ -} - -void GridGpuStrategy::fixRefinementIntoWall(SPtr<GridImp> grid) -{ -} - -void GridGpuStrategy::findStopperNodes(SPtr<GridImp> grid) -{ - -} - -void GridGpuStrategy::findBoundarySolidNodes(SPtr<GridImp> grid) -{ -} - -void GridGpuStrategy::findEndOfGridStopperNodes(SPtr<GridImp> grid) -{ - -} - -void GridGpuStrategy::findSolidStopperNodes(SPtr<GridImp> grid) -{ - -} - -void GridGpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom) -{ - *logging::out << logging::Logger::INFO_INTERMEDIATE << "start meshing on GPU...\n"; - allocAndCopyTrianglesToGPU(geom); - - /*---------------------------------------------------------------------------------*/ - float time = runKernelToMesh(LaunchParameter::make_1D1D_launchParameter(geom.size, 256), *grid.get(), geom); - /*---------------------------------------------------------------------------------*/ - *logging::out << logging::Logger::INFO_INTERMEDIATE << "Time GPU build grid: " << time / 1000 << "sec\n"; - *logging::out << logging::Logger::INFO_INTERMEDIATE << "-------------------------------------------\n"; - - freeTrianglesFromGPU(geom); - -} - -uint GridGpuStrategy::closeNeedleCells(SPtr<GridImp> grid) -{ - return uint(); -} - -uint GridGpuStrategy::closeNeedleCellsThinWall(SPtr<GridImp> grid) -{ - return uint(); -} - - -void GridGpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom) -{ - -} - - -void GridGpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid, LbmOrGks lbmOrGks) -{ - //copyAndFreeFieldFromGPU(grid->getField()); - //copyAndFreeFieldFromGPU(fineGrid->getField()); - //copyAndFreeMatrixIndicesFromGPU(grid, grid->size); - //copyAndFreeMatrixIndicesFromGPU(fineGrid, fineGrid->getSize()); - - //grid->gridInterface = new GridInterface(); - //const uint sizeCF = fineGrid->nx * fineGrid->ny + fineGrid->ny * fineGrid->nz + fineGrid->nx * fineGrid->nz; - //grid->gridInterface->cf.coarse = new uint[sizeCF]; - //grid->gridInterface->cf.fine = new uint[sizeCF]; - //grid->gridInterface->fc.coarse = new uint[sizeCF]; - //grid->gridInterface->fc.fine = new uint[sizeCF]; - - ////for (uint index = 0; index < grid->getSize(); index++) - //// grid->findGridInterface(index, *fineGrid.get()); - - //uint *cfc; - //uint *cff; - //uint *fcc; - //uint *fcf; - - //CudaSafeCall(cudaMalloc(&cfc, sizeCF * sizeof(uint))); - //CudaSafeCall(cudaMalloc(&cff, sizeCF * sizeof(uint))); - //CudaSafeCall(cudaMalloc(&fcc, sizeCF * sizeof(uint))); - //CudaSafeCall(cudaMalloc(&fcf, sizeCF * sizeof(uint))); - - //CudaSafeCall(cudaMemcpy(cfc, grid->gridInterface->cf.coarse, grid->gridInterface->cf.numberOfEntries * sizeof(uint), cudaMemcpyHostToDevice)); - //CudaSafeCall(cudaMemcpy(cff, grid->gridInterface->cf.fine, grid->gridInterface->cf.numberOfEntries * sizeof(uint), cudaMemcpyHostToDevice)); - //CudaSafeCall(cudaMemcpy(fcc, grid->gridInterface->fc.coarse, grid->gridInterface->fc.numberOfEntries * sizeof(uint), cudaMemcpyHostToDevice)); - //CudaSafeCall(cudaMemcpy(fcf, grid->gridInterface->fc.fine, grid->gridInterface->fc.numberOfEntries * sizeof(uint), cudaMemcpyHostToDevice)); - - //grid->gridInterface->cf.coarse = cfc; - //grid->gridInterface->cf.fine = cff; - //grid->gridInterface->fc.coarse = fcc; - //grid->gridInterface->fc.fine = fcf; - - //GridInterface *gridInterface_d; - //CudaSafeCall(cudaMalloc(&gridInterface_d, sizeof(GridInterface))); - //CudaSafeCall(cudaMemcpy(gridInterface_d, grid->gridInterface, sizeof(GridInterface), cudaMemcpyHostToDevice)); - //grid->gridInterface = gridInterface_d; - //CudaCheckError(); - - - //grid->updateSparseIndices(); - - //allocAndCopyFieldToGPU(grid->getField()); - //allocAndCopyFieldToGPU(fineGrid->getField()); - //allocAndCopyMatrixIndicesToGPU(grid, grid->size); - //allocAndCopyMatrixIndicesToGPU(fineGrid, fineGrid->size); - - //float time = runKernelToFindNeighborsNewIndices(LaunchParameter::make_2D1D_launchParameter(grid->size, 256), *grid.get()); - //float time2 = runKernelToFindGridInterfaceNewIndices(LaunchParameter::make_2D1D_launchParameter(grid->size, 256), *grid.get()); - - //copyAndFreeGridInterfaceFromGPU(grid); - - - ////*logging::out << logging::Logger::INTERMEDIATE << "time find indices: " << time / 1000 << "sec\n"; -} - -//void GridGpuStrategy::deleteSolidNodes(SPtr<GridImp> grid) -//{ -// float time1 = runKernelSetToInvalid(LaunchParameter::make_2D1D_launchParameter(grid->size, 512), *grid.get()); -// -// copyAndFreeFieldFromGPU(grid->getField()); -// copyAndFreeMatrixIndicesFromGPU(grid, grid->size); -// -// grid->updateSparseIndices(); -// -// allocAndCopyFieldToGPU(grid->getField()); -// allocAndCopyMatrixIndicesToGPU(grid, grid->size); -// -// float time2 = runKernelFindIndices(LaunchParameter::make_2D1D_launchParameter(grid->size, 256), *grid.get()); -// *logging::out << logging::Logger::INFO_INTERMEDIATE << "time delete solid nodes: " << (time1 + time2) / 1000 << "sec\n"; -//} - - - -void GridGpuStrategy::freeMemory(SPtr<GridImp> grid) -{ - //delete[] grid->gridInterface->cf.coarse; - //delete[] grid->gridInterface->cf.fine; - - //delete[] grid->gridInterface->fc.coarse; - //delete[] grid->gridInterface->fc.fine; - - //delete grid->gridInterface; - - delete[] grid->neighborIndexX; - delete[] grid->neighborIndexY; - delete[] grid->neighborIndexZ; - delete[] grid->neighborIndexNegative; - delete[] grid->sparseIndices; - - delete[] grid->distribution.f; -} - - - -void GridGpuStrategy::copyDataFromGPU(SPtr<GridImp> grid) -{ - //copyAndFreeFieldFromGPU(grid->getField()); - //copyAndFreeNeighborsToCPU(grid); - //copyAndFreeMatrixIndicesFromGPU(grid, grid->size); - //copyAndFreeDistributiondFromGPU(grid); -} - -void GridGpuStrategy::allocField(SPtr<GridImp> grid) -{ - //int size_in_bytes = grid->size * sizeof(char); - //CudaSafeCall(cudaMalloc(grid->getField().field, size_in_bytes)); -} - - -void GridGpuStrategy::allocateFieldMemory(Field* field) -{ - long size = field->size * sizeof(char) / 1000 / 1000; - *logging::out << logging::Logger::INFO_INTERMEDIATE << "alloc on device for grid field: " << int(size) << " MB\n"; - - char *field_d; - CudaSafeCall(cudaMalloc(&field_d, field->size * sizeof(char))); - field->field = field_d; -} - -void GridGpuStrategy::freeFieldMemory(Field* field) -{ -} - -void GridGpuStrategy::findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) -{ -} - -// -//void GridWrapperGPU::markNodesToDeleteOutsideOfGeometry() -//{ -// int numberOfEdgeNodes = grid.ny * grid.nz; -// -// /*---------------------------------------------------------------------------------*/ -// float time = runKernelToMarkNodesToDeleteOutsideOfGeometry(LaunchParameter::make_1D1D_launchParameter(numberOfEdgeNodes, 256), grid); -// /*---------------------------------------------------------------------------------*/ -// -// *logging::out << logging::Logger::INTERMEDIATE << "mark nodes to delete: " << time / 1000 << "sec\n"; -// *logging::out << logging::Logger::INTERMEDIATE << "-------------------------------------------\n"; -//} - -/*#################################################################################*/ -/*--------------------------------private methods----------------------------------*/ -/*---------------------------------------------------------------------------------*/ - -void GridGpuStrategy::allocDistribution(SPtr<GridImp> grid) -{ - CudaSafeCall(cudaMemcpyToSymbol(DIRECTIONS, grid->distribution.dirs, grid->distribution.dir_end * DIMENSION * sizeof(int))); - CudaCheckError(); - - unsigned long long distributionSize = grid->size * (grid->distribution.dir_end + 1); - unsigned long long size_in_bytes = distributionSize * sizeof(real); - real sizeInMB = size_in_bytes / (1024.f*1024.f); - *logging::out << logging::Logger::INFO_INTERMEDIATE << "Allocating " << sizeInMB << " [MB] device memory for distributions.\n\n"; - - CudaSafeCall(cudaMalloc(&grid->distribution.f, size_in_bytes)); - CudaCheckError(); -} - -void GridGpuStrategy::allocNeighborsIndices(SPtr<GridImp> grid) -{ - int size_in_bytes_neighbors = grid->size * sizeof(int); - int *neighborIndexX, *neighborIndexY, *neighborIndexZ, *neighborIndexNegative;; - - CudaSafeCall(cudaMalloc(&neighborIndexX, size_in_bytes_neighbors)); - CudaSafeCall(cudaMalloc(&neighborIndexY, size_in_bytes_neighbors)); - CudaSafeCall(cudaMalloc(&neighborIndexZ, size_in_bytes_neighbors)); - CudaSafeCall(cudaMalloc(&neighborIndexNegative, size_in_bytes_neighbors)); - - grid->neighborIndexX = neighborIndexX; - grid->neighborIndexY = neighborIndexY; - grid->neighborIndexZ = neighborIndexZ; - grid->neighborIndexNegative = neighborIndexNegative; - - CudaCheckError(); -} - -void GridGpuStrategy::allocMatrixIndicesOnGPU(SPtr<GridImp> grid) -{ - int size_in_bytes_nodes_reduced = grid->size * sizeof(int); - int* indices_reduced_d; - CudaSafeCall(cudaMalloc(&indices_reduced_d, size_in_bytes_nodes_reduced)); - grid->sparseIndices = indices_reduced_d; - CudaCheckError(); -} - - -void GridGpuStrategy::allocAndCopyTrianglesToGPU(TriangularMesh &geom) -{ - *logging::out << logging::Logger::INFO_INTERMEDIATE << "start copying triangles ...\n"; - //clock_t begin = clock(); - int size_in_bytes_triangles = sizeof(Triangle)*geom.size; - real sizeInMB = size_in_bytes_triangles / (1024.f*1024.f); - - *logging::out << logging::Logger::INFO_INTERMEDIATE << "Allocating " << sizeInMB << " [MB] device memory for triangles.\n\n"; - - Triangle *triangles_d; - CudaSafeCall(cudaMalloc(&triangles_d, size_in_bytes_triangles)); - CudaSafeCall(cudaMemcpy(triangles_d, geom.triangles, size_in_bytes_triangles, cudaMemcpyHostToDevice)); - geom.triangles = triangles_d; - CudaCheckError(); - //clock_t end = clock(); - //real time = real(end - begin) / CLOCKS_PER_SEC; - //*logging::out << logging::Logger::INFO_INTERMEDIATE << "time copying triangles: " << time << "s\n"; - *logging::out << logging::Logger::INFO_INTERMEDIATE << "...copying triangles finish!\n\n"; -} - -void GridGpuStrategy::freeTrianglesFromGPU(const TriangularMesh &geom) -{ - CudaSafeCall(cudaFree(geom.triangles)); - CudaCheckError(); -} - -void GridGpuStrategy::allocAndCopyMatrixIndicesToGPU(SPtr<GridImp> grid, const uint& size) -{ - int size_in_bytes_nodes_reduced = size * sizeof(int); - int* indices_reduced_d; - CudaSafeCall(cudaMalloc(&indices_reduced_d, size_in_bytes_nodes_reduced)); - CudaSafeCall(cudaMemcpy(indices_reduced_d, grid->sparseIndices, size_in_bytes_nodes_reduced, cudaMemcpyHostToDevice)); - delete[] grid->sparseIndices; - grid->sparseIndices = indices_reduced_d; - CudaCheckError(); -} - -void GridGpuStrategy::allocAndCopyFieldToGPU(Field& field) -{ - int size_in_bytes_grid = field.getSize() * sizeof(char); - char* field_d; - CudaSafeCall(cudaMalloc(&field_d, size_in_bytes_grid)); - CudaSafeCall(cudaMemcpy(field_d, field.field, size_in_bytes_grid, cudaMemcpyHostToDevice)); - delete[] field.field; - field.field = field_d; - CudaCheckError(); -} - -void GridGpuStrategy::copyAndFreeFieldFromGPU(Field& field) -{ - char *field_h = new char[field.size]; - CudaSafeCall(cudaMemcpy(field_h, field.field, field.size * sizeof(char), cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaFree(field.field)); - CudaCheckError(); - field.field = field_h; -} - -void GridGpuStrategy::copyAndFreeDistributiondFromGPU(SPtr<GridImp> grid) -{ - unsigned long long distributionSize = grid->size * (grid->distribution.dir_end + 1); - real *f_host = new real[distributionSize]; - CudaSafeCall(cudaMemcpy(f_host, grid->distribution.f, distributionSize * sizeof(real), cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaFree(grid->distribution.f)); - CudaCheckError(); - grid->distribution.f = f_host; -} - - - -void GridGpuStrategy::copyAndFreeNeighborsToCPU(SPtr<GridImp> grid) -{ - int size_in_bytes_neighbors = grid->size * sizeof(int); - int *neighborIndexX_h, *neighborIndexY_h, *neighborIndexZ_h, *neighborIndexNegative_h; - neighborIndexX_h = new int[grid->size]; - neighborIndexY_h = new int[grid->size]; - neighborIndexZ_h = new int[grid->size]; - neighborIndexNegative_h = new int[grid->size]; - - CudaSafeCall(cudaMemcpy(neighborIndexX_h, grid->neighborIndexX, size_in_bytes_neighbors, cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaMemcpy(neighborIndexY_h, grid->neighborIndexY, size_in_bytes_neighbors, cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaMemcpy(neighborIndexZ_h, grid->neighborIndexZ, size_in_bytes_neighbors, cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaMemcpy(neighborIndexNegative_h, grid->neighborIndexNegative, size_in_bytes_neighbors, cudaMemcpyDeviceToHost)); - - CudaSafeCall(cudaFree(grid->neighborIndexX)); - CudaSafeCall(cudaFree(grid->neighborIndexY)); - CudaSafeCall(cudaFree(grid->neighborIndexZ)); - CudaSafeCall(cudaFree(grid->neighborIndexNegative)); - - grid->neighborIndexX = neighborIndexX_h; - grid->neighborIndexY = neighborIndexY_h; - grid->neighborIndexZ = neighborIndexZ_h; - grid->neighborIndexNegative = neighborIndexNegative_h; - CudaCheckError(); -} - -void GridGpuStrategy::copyAndFreeMatrixIndicesFromGPU(SPtr<GridImp> grid, int size) -{ - int size_in_bytes_nodes_reduced = size * sizeof(int); - int *indices_reduced_h = new int[size]; - CudaSafeCall(cudaMemcpy(indices_reduced_h, grid->sparseIndices, size_in_bytes_nodes_reduced, cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaFree(grid->sparseIndices)); - grid->sparseIndices = indices_reduced_h; - CudaCheckError(); -} - - -void GridGpuStrategy::copyAndFreeGridInterfaceFromGPU(SPtr<GridImp> grid) -{ - GridInterface *gridInterface = new GridInterface(); - CudaSafeCall(cudaMemcpy(gridInterface, grid->gridInterface, sizeof(GridInterface), cudaMemcpyDeviceToHost)); - - uint *cfc = new uint[gridInterface->cf.numberOfEntries]; - uint *cff = new uint[gridInterface->cf.numberOfEntries]; - uint *fcc = new uint[gridInterface->fc.numberOfEntries]; - uint *fcf = new uint[gridInterface->fc.numberOfEntries]; - - - CudaSafeCall(cudaMemcpy(cfc, gridInterface->cf.coarse, gridInterface->cf.numberOfEntries * sizeof(uint), cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaMemcpy(cff, gridInterface->cf.fine, gridInterface->cf.numberOfEntries * sizeof(uint), cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaMemcpy(fcc, gridInterface->fc.coarse, gridInterface->fc.numberOfEntries * sizeof(uint), cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaMemcpy(fcf, gridInterface->fc.fine, gridInterface->fc.numberOfEntries * sizeof(uint), cudaMemcpyDeviceToHost)); - CudaSafeCall(cudaFree(gridInterface->cf.coarse)); - CudaSafeCall(cudaFree(gridInterface->cf.fine)); - CudaSafeCall(cudaFree(gridInterface->fc.coarse)); - CudaSafeCall(cudaFree(gridInterface->fc.fine)); - CudaSafeCall(cudaFree(grid->gridInterface)); - - grid->gridInterface = gridInterface; - grid->gridInterface->cf.coarse = cfc; - grid->gridInterface->cf.fine = cff; - grid->gridInterface->fc.coarse = fcc; - grid->gridInterface->fc.fine = fcf; - CudaCheckError(); -} diff --git a/src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h b/src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h deleted file mode 100644 index fb886824a..000000000 --- a/src/gpu/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef GRID_GPU_STRATEGY_H -#define GRID_GPU_STRATEGY_H - -#include "global.h" - -#include "grid/GridStrategy/GridStrategy.h" - -class BoundingBox; -class TriangularMesh; - -class GRIDGENERATOR_EXPORT GridGpuStrategy : public GridStrategy -{ -public: - virtual ~GridGpuStrategy() {}; - - void allocateGridMemory(SPtr<GridImp> grid) override; - - void allocateQs(SPtr<GridImp> grid) override; - - void initalNodesToOutOfGrid(SPtr<GridImp> grid) override; - void fixOddCells(SPtr<GridImp> grid) override; - void findInnerNodes(SPtr<GridImp> grid) override; - void addOverlap(SPtr<GridImp> grid) override; - void fixRefinementIntoWall(SPtr<GridImp> grid) override; - void findStopperNodes(SPtr<GridImp> grid) override; - void findBoundarySolidNodes(SPtr<GridImp> grid) override; - void findEndOfGridStopperNodes(SPtr<GridImp> grid) override; - void findSolidStopperNodes(SPtr<GridImp> grid) override; - - void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override; - - uint closeNeedleCells(SPtr<GridImp> grid) override; - uint closeNeedleCellsThinWall(SPtr<GridImp> grid) override; - - void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override; - - - void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid, LbmOrGks lbmOrGks) override; - - void freeMemory(SPtr<GridImp> grid) override; - - - - void copyAndFreeGridInterfaceFromGPU(SPtr<GridImp> grid); - virtual void copyDataFromGPU(SPtr<GridImp> grid); - - //void markNodesToDeleteOutsideOfGeometry(); - -private: - void allocField(SPtr<GridImp> grid); - void allocDistribution(SPtr<GridImp> grid); - void allocNeighborsIndices(SPtr<GridImp> grid); - void allocMatrixIndicesOnGPU(SPtr<GridImp> grid); - - void allocAndCopyTrianglesToGPU(TriangularMesh &geom); - void freeTrianglesFromGPU(const TriangularMesh &geom); - - - void allocAndCopyMatrixIndicesToGPU(SPtr<GridImp> grid, const uint& size); - - void allocAndCopyFieldToGPU(Field& field); - void copyAndFreeFieldFromGPU(Field& field); - - void copyAndFreeDistributiondFromGPU(SPtr<GridImp> grid); - - void copyAndFreeNeighborsToCPU(SPtr<GridImp> grid); - void copyAndFreeMatrixIndicesFromGPU(SPtr<GridImp> grid, int size); - -public: - void allocateFieldMemory(Field* field) override; - void freeFieldMemory(Field* field) override; - void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override; - -}; - -#endif diff --git a/src/gpu/GridGenerator/grid/GridStrategy/GridStrategy.h b/src/gpu/GridGenerator/grid/GridStrategy/GridStrategy.h deleted file mode 100644 index f1cf20f25..000000000 --- a/src/gpu/GridGenerator/grid/GridStrategy/GridStrategy.h +++ /dev/null @@ -1,81 +0,0 @@ -//======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ -// \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ -// -// This file is part of VirtualFluids. VirtualFluids is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. -// -//! \file GridStrategy.h -//! \ingroup grid -//! \author Soeren Peters, Stephan Lenz -//======================================================================================= -#ifndef GRID_STRATEGY_H -#define GRID_STRATEGY_H - -#include "Core/LbmOrGks.h" - -#include "global.h" - -#include "grid/Field.h" - -struct Vertex; -class TriangularMesh; -class GridImp; - -class GRIDGENERATOR_EXPORT GridStrategy -{ -public: - virtual void allocateFieldMemory(Field *field) = 0; - virtual void freeFieldMemory(Field *field) = 0; - - virtual void allocateGridMemory(SPtr<GridImp> grid) = 0; - - virtual void allocateQs(SPtr<GridImp> grid) = 0; - - virtual void initalNodesToOutOfGrid(SPtr<GridImp> grid) = 0; - virtual void fixOddCells(SPtr<GridImp> grid) = 0; - virtual void findInnerNodes(SPtr<GridImp> grid) = 0; - virtual void addOverlap(SPtr<GridImp> grid) = 0; - - virtual void fixRefinementIntoWall(SPtr<GridImp> grid) = 0; - virtual void findStopperNodes(SPtr<GridImp> grid) = 0; - virtual void findBoundarySolidNodes(SPtr<GridImp> grid) = 0; - virtual void findEndOfGridStopperNodes(SPtr<GridImp> grid) = 0; - virtual void findSolidStopperNodes(SPtr<GridImp> grid) = 0; - - virtual void mesh(SPtr<GridImp> grid, TriangularMesh &geom) = 0; - - virtual uint closeNeedleCells(SPtr<GridImp> grid) = 0; - virtual uint closeNeedleCellsThinWall(SPtr<GridImp> grid) = 0; - - virtual void findQs(SPtr<GridImp> grid, TriangularMesh &geom) = 0; - - virtual void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid, LbmOrGks lbmOrGks) = 0; - - virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) = 0; - - virtual void freeMemory(SPtr<GridImp> grid) = 0; -}; - -#endif -- GitLab