diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/GridGenerator/grid/GridBuilder/GridBuilder.h index e3b79186193243090f77b6167b740675e9678ed7..b44f5f5fddb8c04c8d07b80e6a39d70af8644404 100644 --- a/src/GridGenerator/grid/GridBuilder/GridBuilder.h +++ b/src/GridGenerator/grid/GridBuilder/GridBuilder.h @@ -32,6 +32,11 @@ class BoundingBox; class GridBuilder { public: + enum class GenerationDevice + { + CPU, GPU + }; + virtual VF_PUBLIC ~GridBuilder() {}; virtual void addGrid(real length, real width, real high, real delta, std::string distribution, std::shared_ptr<Transformator> trans) = 0; @@ -45,7 +50,7 @@ public: virtual void writeArrows(std::string fileName, std::shared_ptr<ArrowTransformator> trans) const = 0; - virtual std::shared_ptr<GridWrapper> getKernel(int level, int box) = 0; + virtual std::shared_ptr<GridWrapper> getGridWrapper(int level, int box) = 0; virtual void createBoundaryConditions() = 0; diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp index b12ad64326fbe37b5c36cdc5183f710746aa9626..656b1d3a46b1df6c7a5d2b1c7d4cede7a51fc043 100644 --- a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp +++ b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp @@ -55,7 +55,8 @@ void deserialize(GeometryMemento &memento, const std::string &filename) #define GEOFLUID 19 #define GEOSOLID 16 -GridBuilderImp::GridBuilderImp() + +GridBuilderImp::GridBuilderImp(GenerationDevice device) : device(device) { this->Qs.resize(QFILES); this->channelBoundaryConditions.resize(6); @@ -67,13 +68,6 @@ GridBuilderImp::GridBuilderImp() channelBoundaryConditions[5] = "periodic"; } -std::shared_ptr<GridBuilder> GridBuilderImp::make(std::string type) -{ - if (type == "cpu") - return std::shared_ptr<GridBuilder>(new GridCpuBuilder()); - else - return std::shared_ptr<GridBuilder>(new GridGpuBuilder()); -} GridBuilderImp::~GridBuilderImp() { @@ -191,7 +185,7 @@ void GridBuilderImp::writeSimulationFiles(std::string output, BoundingBox<int> & //SimulationFileWriter::writeSimulationFiles(output, coords, qs, writeFilesBinary, this->gridKernels[level]->grid, this->transformators[level]); } -std::shared_ptr<GridWrapper> GridBuilderImp::getKernel(int level, int box) +std::shared_ptr<GridWrapper> GridBuilderImp::getGridWrapper(int level, int box) { return this->gridKernels[level][box]; } @@ -221,6 +215,26 @@ void GridBuilderImp::addGrid(real length, real width, real high, real delta, std this->createGridKernels(distribution); } +void GridBuilderImp::createGridKernels(std::string distribution) +{ + for (int i = 0; i < rankTasks.size(); i += 2) + { + int level = rankTasks[i]; + int index = rankTasks[i + 1]; + + switch (this->device) + { + case GenerationDevice::CPU: + this->gridKernels[level][index] = std::shared_ptr<GridWrapperCPU>(new GridWrapperCPU(this->boxes[level][index], distribution)); + break; + case GenerationDevice::GPU: + this->gridKernels[level][index] = std::shared_ptr<GridWrapperGPU>(new GridWrapperGPU(this->boxes[level][index], distribution)); + break; + } + } +} + + void GridBuilderImp::setNumberOfNodes(real length, real width, real high, real delta) { int nx = (int)(length / delta); @@ -354,7 +368,7 @@ void GridBuilderImp::getNodeValues(real *xCoords, real *yCoords, real *zCoords, neighborX[i + 1] = (unsigned int)(grid.neighborIndexX[grid.matrixIndex[i]] + 1); neighborY[i + 1] = (unsigned int)(grid.neighborIndexY[grid.matrixIndex[i]] + 1); neighborZ[i + 1] = (unsigned int)(grid.neighborIndexZ[grid.matrixIndex[i]] + 1); - geo[i + 1] = (unsigned int)grid.field[grid.matrixIndex[i]] == SOLID ? GEOSOLID : GEOFLUID; + geo[i + 1] = (unsigned int)grid.isSolid(grid.matrixIndex[i]) ? GEOSOLID : GEOFLUID; } } diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h index 1a41f211e4d919f2409754193878bf9cf20fa853..39b9d08900babd3c8a2508c5492f189f5b1df23c 100644 --- a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h +++ b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h @@ -23,6 +23,8 @@ class BoundingBox; class GridBuilderImp : public GridBuilder { public: + + VF_PUBLIC GridBuilderImp(GenerationDevice device); VF_PUBLIC static std::shared_ptr<GridBuilder> make(std::string); VF_PUBLIC virtual ~GridBuilderImp(); @@ -37,7 +39,7 @@ public: VF_PUBLIC virtual void writeGridToVTK(std::string output, int level); VF_PUBLIC virtual void writeSimulationFiles(std::string output, BoundingBox<int> &nodesDelete, bool writeFilesBinary, int level); - VF_PUBLIC virtual std::shared_ptr<GridWrapper> getKernel(int level, int box); + VF_PUBLIC virtual std::shared_ptr<GridWrapper> getGridWrapper(int level, int box); VF_PUBLIC virtual void createBoundaryConditions(); @@ -58,7 +60,7 @@ public: VF_PUBLIC void writeArrows(std::string fileName, std::shared_ptr<ArrowTransformator> trans) const; protected: - GridBuilderImp(); + GenerationDevice device; std::vector<std::vector<std::shared_ptr<GridWrapper> > >gridKernels; std::vector<std::shared_ptr<Transformator>> transformators; @@ -73,7 +75,7 @@ protected: void checkLevel(int level); protected: - virtual void createGridKernels(std::string distribution) = 0; + virtual void createGridKernels(std::string distribution); void setNumberOfNodes(real length, real width, real high, real delta); void printMasterInformation(int nx, int ny, int nz); diff --git a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.cpp b/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.cpp deleted file mode 100644 index d1fc909a72015a59d25bff51069d7aa162e6e487..0000000000000000000000000000000000000000 --- a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "GridCpuBuilder.h" - -#include <GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.h> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> - - -GridCpuBuilder::GridCpuBuilder() : GridBuilderImp() -{ - -} - -GridCpuBuilder::~GridCpuBuilder() -{ - -} - -void GridCpuBuilder::createGridKernels(std::string distribution) -{ - for (int i = 0; i < rankTasks.size(); i += 2) - { - int level = rankTasks[i]; - int index = rankTasks[i + 1]; - this->gridKernels[level][index] = std::shared_ptr<GridWrapperCPU>(new GridWrapperCPU(this->boxes[level][index], distribution)); - } -} diff --git a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.h b/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.h deleted file mode 100644 index 50203966ef456a6ced31da2c1b139e147bfe1205..0000000000000000000000000000000000000000 --- a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef GridCpuBuilder_H -#define GridCpuBuilder_H - -#include "GridGenerator/global.h" - - -#include <vector> -#include <string> -#include <memory> - -#include "../GridBuilderImp.h" - - -class GridCpuBuilder : public GridBuilderImp -{ -public: - VF_PUBLIC GridCpuBuilder(); - virtual VF_PUBLIC ~GridCpuBuilder(); - -protected: - void createGridKernels(std::string distribution); - -}; - -#endif - diff --git a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/package.include b/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/package.include deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.cpp b/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.cpp deleted file mode 100644 index f267cdadc823f0689db4efe2ea6e36505675495c..0000000000000000000000000000000000000000 --- a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "GridGpuBuilder.h" - -#include <GridGenerator/grid/GridWrapper/GridWrapperGPU/GridWrapperGPU.h> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> - - -GridGpuBuilder::GridGpuBuilder() : GridBuilderImp() -{ - -} - -GridGpuBuilder::~GridGpuBuilder() -{ - -} - -void GridGpuBuilder::createGridKernels(std::string distribution) -{ - for (int i = 0; i < rankTasks.size(); i += 2) - { - int level = rankTasks[i]; - int index = rankTasks[i + 1]; - this->gridKernels[level][index] = std::shared_ptr<GridWrapperGPU>(new GridWrapperGPU(this->boxes[level][index], distribution)); - } -} diff --git a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.h b/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.h deleted file mode 100644 index 5e6935d9a9db3ba1809444c92c715d156ca93cc8..0000000000000000000000000000000000000000 --- a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef GridGpuBuilder_H -#define GridGpuBuilder_H - -#include "GridGenerator/global.h" - - -#include <vector> -#include <string> -#include <memory> - -#include "../GridBuilderImp.h" - - -class GridGpuBuilder : public GridBuilderImp -{ -public: - VF_PUBLIC GridGpuBuilder(); - virtual VF_PUBLIC ~GridGpuBuilder(); - -protected: - void createGridKernels(std::string distribution); - -}; - -#endif - diff --git a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/package.include b/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/package.include deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp b/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp index b9de5d408ff92b27247e8faad4067268977e5162..1697423206a0b08c5092e1fbdc255e12570ae8af 100644 --- a/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp +++ b/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp @@ -165,9 +165,8 @@ void GridWrapperCPU::findInvalidNodes() } } - void GridWrapperCPU::findNeighborIndices() { for (int index = 0; index < grid.reducedSize; index++) grid.findNeighborIndex(index); -} \ No newline at end of file +} diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp index c6d5e516d8ffb711524d86f789b85c8899d27533..e0661f340d5e1c918474830e599851055061a741 100644 --- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp +++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp @@ -121,7 +121,7 @@ void SimulationFileWriter::writeLevelAndLevelSize(int sizeCoords, std::vector<st void SimulationFileWriter::writeCoordsNeighborsGeo(const int& i, bool binaer, std::shared_ptr<GridBuilder> builder, std::shared_ptr<Transformator> trans) { - Grid grid = builder->getKernel(0, 0)->grid; + Grid grid = builder->getGridWrapper(0, 0)->grid; int index = grid.matrixIndex[i]; int type = grid.field[index] == SOLID ? 16 : 1; diff --git a/src/GridGenerator/utilities/cuda/cudaDefines.h b/src/GridGenerator/utilities/cuda/cudaDefines.h index 25b6c558e6903087a879b3eefefe31466608f5ea..ccfe3de5e4c87904e4e335bdf697444521e98dcc 100644 --- a/src/GridGenerator/utilities/cuda/cudaDefines.h +++ b/src/GridGenerator/utilities/cuda/cudaDefines.h @@ -9,6 +9,7 @@ #define GLOBAL __global__ #define CONSTANT __constant__ + #define HOSTDEVICE HOST DEVICE diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp index ea192e2b9f8c63ff8a03a731287a9663e82303ed..1cc69ebee8ea78e3593e3e5b985928d1f90b97a7 100644 --- a/targets/apps/HULC/main.cpp +++ b/targets/apps/HULC/main.cpp @@ -20,6 +20,7 @@ #include "io/GridVTKWriter/GridVTKWriter.h" #include "grid/GridWrapper/GridWrapper.h" #include "io/SimulationFileWriter/SimulationFileWriter.h" +#include "VirtualFluidsBasics/numerics/geometry3d/GbCuboid3D.h" std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath) @@ -223,11 +224,40 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true}); } + + +void multipleLevel(const std::string& configPath) +{ + + SPtr<GbCuboid3D> level0(new GbCuboid3D(0.0, 0.0, 0.0, 64.0, 12.0, 96.0)); + SPtr<GbCuboid3D> level1(new GbCuboid3D(20.0, 4.0, 40.0, 40.0, 8.0, 60.0)); + + SPtr<GridBuilder> builder(new GridBuilderImp(GridBuilder::CPU)); + builder->addGrid(level0, "D3Q27"); + builder->addGrid(level1, "D3Q27"); + + + SPtr<Parameter> para = Parameter::make(); + SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(builder, para); + + std::ifstream stream; + stream.open(configPath.c_str(), std::ios::in); + if (stream.fail()) + throw "can not open config file!\n"; + + UPtr<input::Input> input = input::Input::makeInput(stream, "config"); + + setParameters(para, input); + + Simulation sim; + sim.init(para, gridGenerator); + sim.run(); +} + void simulate(const std::string& configPath) { SPtr<GridBuilder> builder = GridBuilderImp::make("gpu"); - SPtr<Parameter> para = Parameter::make(); SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(builder, para); //std::shared_ptr<GridProvider> reader = GridProvider::makeGridReader(true, para); @@ -243,9 +273,14 @@ void simulate(const std::string& configPath) SPtr<Transformator> trans(new TransformatorImp()); builder->addGrid(para->getGridX()[0], para->getGridY()[0], para->getGridZ()[0], 1.0, "D3Q27", trans); - builder->getKernel(0, 0)->copyDataFromGPU(); - GridVTKWriter::writeSparseGridToVTK(builder->getKernel(0, 0)->grid, "D:/GRIDGENERATION/couplingVF/periodicTaylor/testFile", trans); + SPtr<Transformator> transRefine1(new TransformatorImp(para->getDistX()[1], para->getDistY()[1], para->getDistZ()[1], 0.5)); + builder->addGrid(para->getGridX()[1], para->getGridY()[1], para->getGridZ()[1], 1.0, "D3Q27", transRefine1); + + builder->getGridWrapper(0, 0)->copyDataFromGPU(); + builder->getGridWrapper(1, 0)->copyDataFromGPU(); + + GridVTKWriter::writeSparseGridToVTK(builder->getGridWrapper(0, 0)->grid, "D:/GRIDGENERATION/couplingVF/periodicTaylor/testFile", trans); SimulationFileWriter::writeSimulationFiles("D:/GRIDGENERATION/couplingVF/periodicTaylor/simuFiles/", builder, false, trans); Simulation sim;