diff --git a/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu b/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu index 916c4f236ff4c3a74939159e794a18a2536e9e9b..3eb24ffd19b6dc3d5403072d05f56f0ba0ae4fc3 100644 --- a/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu +++ b/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu @@ -67,6 +67,11 @@ return false; } + bool BoundingBox::isInside(const real x, const real y, const real z) const + { + return this->isInside(Vertex(x,y,z)); + } + bool BoundingBox::isInside(const Vertex &v) const { if (v.isXbetween(minX, maxX) && v.isYbetween(minY, maxY) && v.isZbetween(minZ, maxZ)) @@ -162,4 +167,15 @@ && vf::Math::equal(maxZ, box.maxZ); } + void BoundingBox::extend(real delta) + { + this->minX -= delta; + this->minY -= delta; + this->minZ -= delta; + + this->maxX += delta; + this->maxY += delta; + this->maxZ += delta; + } + diff --git a/src/GridGenerator/geometries/BoundingBox/BoundingBox.h b/src/GridGenerator/geometries/BoundingBox/BoundingBox.h index a51722051735c760f842e3de72a83b5ebe5fc5cc..2cf105ebf906e4da8242609909005785a506098e 100644 --- a/src/GridGenerator/geometries/BoundingBox/BoundingBox.h +++ b/src/GridGenerator/geometries/BoundingBox/BoundingBox.h @@ -31,6 +31,7 @@ public: void print() const; bool isInside(const Triangle &t) const; + bool isInside(const real x, const real y, const real z) const; bool intersect(const Triangle &t) const; std::vector<std::vector<Vertex> > getIntersectionPoints(const BoundingBox &b) const; @@ -38,6 +39,7 @@ public: HOST bool operator==(const BoundingBox &box) const; + void extend(real delta); private: bool isInside(const Vertex &v) const; diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h index b0425cb8cd02910256244eaca0fbc0a7cc60e00d..5e3ac90db306b516d5871d5271334652befa4b62 100644 --- a/src/GridGenerator/grid/Grid.h +++ b/src/GridGenerator/grid/Grid.h @@ -14,6 +14,7 @@ struct Triangle; class GridStrategy; class GridInterface; class Object; +class BoundingBox; class VF_PUBLIC Grid { @@ -79,6 +80,8 @@ public: HOST virtual void setOddStart( bool xOddStart, bool yOddStart, bool zOddStart ) = 0; HOST virtual void findGridInterface(SPtr<Grid> grid, LbmOrGks lbmOrGks) = 0; + + HOST virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) = 0; HOST virtual void enableFindSolidBoundaryNodes() = 0; HOST virtual void enableComputeQs() = 0; @@ -119,6 +122,8 @@ public: HOST virtual void setInnerRegionFromFinerGrid( bool innerRegionFromFinerGrid ) = 0; HOST virtual void setNumberOfLayers( uint numberOfLayers ) = 0; + + virtual void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox) = 0; }; #endif diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index c3b28c2c50fe6b95efffec310aede3ea96e32ce0..0e895abb6b0712ba2dd95b4a5bb42fcf4cf68689 100644 --- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -129,6 +129,8 @@ public: VF_PUBLIC void getOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) override; VF_PUBLIC void getOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) override; + VF_PUBLIC void getSendReceiveIndices( uint* sendIndices, uint* receiveIndices, int level ); + }; #endif diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index 9529211fdc0953c9d64ad770dbe7c4003a174810..d4847353911475b9283ec97a9d64083a22b62595 100644 --- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -14,9 +14,10 @@ #include "io/GridVTKWriter/GridVTKWriter.h" #include <grid/BoundaryConditions/BoundaryCondition.h> #include <grid/BoundaryConditions/Side.h> +#include "geometries/BoundingBox/BoundingBox.h" MultipleGridBuilder::MultipleGridBuilder(SPtr<GridFactory> gridFactory, Device device, const std::string &d3qxx) : - LevelGridBuilder(device, d3qxx), gridFactory(gridFactory), solidObject(nullptr), numberOfLayersFine(12), numberOfLayersBetweenLevels(8) + LevelGridBuilder(device, d3qxx), gridFactory(gridFactory), solidObject(nullptr), numberOfLayersFine(12), numberOfLayersBetweenLevels(8), subDomainBox(nullptr) { } @@ -30,6 +31,13 @@ void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, r { boundaryConditions.push_back(SPtr<BoundaryConditions>(new BoundaryConditions)); + startX -= 0.5 * delta; + startY -= 0.5 * delta; + startZ -= 0.5 * delta; + endX += 0.5 * delta; + endY += 0.5 * delta; + endZ += 0.5 * delta; + const auto grid = this->makeGrid(new Cuboid(startX, startY, startZ, endX, endY, endZ), startX, startY, startZ, endX, endY, endZ, delta, 0); addGridToList(grid); } @@ -429,7 +437,7 @@ void MultipleGridBuilder::buildGrids( LbmOrGks lbmOrGks, bool enableThinWalls ) if ( level == 0 ) grids[level]->inital( nullptr, 0 ); - else if( level == 0 || level == grids.size()-1 ) + else if( level == grids.size()-1 ) grids[level]->inital( nullptr, this->numberOfLayersFine ); else grids[level]->inital( grids[level+1], this->numberOfLayersBetweenLevels ); @@ -467,6 +475,10 @@ void MultipleGridBuilder::buildGrids( LbmOrGks lbmOrGks, bool enableThinWalls ) for (size_t i = 0; i < grids.size() - 1; i++) grids[i]->findGridInterface(grids[i + 1], lbmOrGks); + if( this->subDomainBox ) + for (size_t i = 0; i < grids.size(); i++) + grids[i]->limitToSubDomain( this->subDomainBox ); + if (lbmOrGks == LBM) { for (size_t i = 0; i < grids.size() - 1; i++) grids[i]->findSparseIndices(grids[i + 1]); @@ -493,6 +505,13 @@ void MultipleGridBuilder::emitGridIsNotInCoarseGridWarning() *logging::out << logging::Logger::WARNING << "Grid lies not inside of coarse grid. Actual Grid is not added.\n"; } +void MultipleGridBuilder::findCommunicationIndices(int direction) +{ + if( this->subDomainBox ) + for (size_t i = 0; i < grids.size(); i++) + grids[i]->findCommunicationIndices(direction, this->subDomainBox); +} + void MultipleGridBuilder::writeGridsToVtk(const std::string& path) const { for(uint level = 0; level < grids.size(); level++) @@ -507,4 +526,9 @@ void MultipleGridBuilder::writeGridsToVtk(const std::string& path) const // GridVTKWriter::writeInterpolationCellsToVTKXML(grids[level], nullptr , ss.str() + ".InterpolationCells"); //GridVTKWriter::writeSparseGridToVTK(grids[level], ss.str()); } -} \ No newline at end of file +} + +VF_PUBLIC void MultipleGridBuilder::setSubDomainBox(SPtr<BoundingBox> subDomainBox) +{ + this->subDomainBox = subDomainBox; +} diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h index 3267902f35a52ca6ddc8a60804b782d42b431b3a..3bd71331ff3c6a44c5c4d22192de88dbebffdb1a 100644 --- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h +++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h @@ -13,7 +13,7 @@ #include "../GridFactory.h" class Object; - +class BoundingBox; class MultipleGridBuilder : public LevelGridBuilder { @@ -48,6 +48,8 @@ public: VF_PUBLIC void writeGridsToVtk(const std::string& path) const; + VF_PUBLIC void setSubDomainBox(SPtr<BoundingBox> subDomainBox); + private: void addGridToList(SPtr<Grid> grid); real calculateDelta(uint level) const; @@ -77,6 +79,12 @@ private: uint numberOfLayersFine; uint numberOfLayersBetweenLevels; + + SPtr<BoundingBox> subDomainBox; + +public: + + VF_PUBLIC void findCommunicationIndices( int direction ); }; #endif diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu index 293f75c314b8f9704e27a60cc8acba2865bce5b1..738205c598b549846bd297c4eee695bfdaf1e3ad 100644 --- a/src/GridGenerator/grid/GridImp.cu +++ b/src/GridGenerator/grid/GridImp.cu @@ -975,6 +975,22 @@ HOST void GridImp::findGridInterface(SPtr<Grid> finerGrid, LbmOrGks lbmOrGks) gridStrategy->findGridInterface(shared_from_this(), std::static_pointer_cast<GridImp>(finerGrid), lbmOrGks); } +HOST void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox) +{ + for( uint index = 0; index < this->size; index++ ){ + + real x, y, z; + this->transIndexToCoords( index, x, y, z ); + + BoundingBox tmpSubDomainBox = *subDomainBox; + + tmpSubDomainBox.extend(this->delta); + + if( !tmpSubDomainBox.isInside(x,y,z) ) + this->setFieldEntry(index, INVALID_OUT_OF_GRID); + } +} + HOSTDEVICE void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid, LbmOrGks lbmOrGks) { if (lbmOrGks == LBM) @@ -1318,6 +1334,50 @@ HOSTDEVICE bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex return false; } +void GridImp::findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox) +{ + for( uint index = 0; index < this->size; index++ ){ + + real x, y, z; + this->transIndexToCoords(index, x, y, z); + + if( this->getFieldEntry(index) == INVALID_OUT_OF_GRID || + this->getFieldEntry(index) == INVALID_SOLID || + this->getFieldEntry(index) == INVALID_COARSE_UNDER_FINE ) continue; + + if( direction == CommunicationDirections::MX ) findCommunicationIndex( index, x, subDomainBox->minX, direction); + if( direction == CommunicationDirections::PX ) findCommunicationIndex( index, x, subDomainBox->maxX, direction); + if( direction == CommunicationDirections::MY ) findCommunicationIndex( index, y, subDomainBox->minY, direction); + if( direction == CommunicationDirections::PY ) findCommunicationIndex( index, y, subDomainBox->maxY, direction); + if( direction == CommunicationDirections::MZ ) findCommunicationIndex( index, z, subDomainBox->minZ, direction); + if( direction == CommunicationDirections::PZ ) findCommunicationIndex( index, z, subDomainBox->maxZ, direction); + } +} + +void GridImp::findCommunicationIndex( uint index, real coordinate, real limit, int direction ){ + + // negative direction get a negative sign + real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 ); + + //if( vf::Math::equal( coordinate, limit + s * 0.5 * this->delta ) ){ + // this->communicationIndices[direction].receiveIndices.push_back(index); + // this->setFieldEntry(index, MULTI_GPU_RECIEVE); + //} + //if( vf::Math::equal( coordinate, limit - s * 0.5 * this->delta ) ){ + // this->communicationIndices[direction].sendIndices.push_back(index); + // this->setFieldEntry(index, MULTI_GPU_SEND); + //} + + if( vf::Math::equal( coordinate, limit + s * 0.5 * this->delta, 0.01 * this->delta ) ){ + this->communicationIndices[direction].receiveIndices.push_back(index); + this->setFieldEntry(index, MULTI_GPU_RECIEVE); + } + if( vf::Math::equal( coordinate, limit - s * 0.5 * this->delta, 0.01 * this->delta ) ){ + this->communicationIndices[direction].sendIndices.push_back(index); + this->setFieldEntry(index, MULTI_GPU_SEND); + } +} + // --------------------------------------------------------- // // Getter // diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h index a22d21f7c9b25853cadaa63bea847cbe13edadd8..40f66e71500626bc1ef4072d2c4e657b8bdb23cf 100644 --- a/src/GridGenerator/grid/GridImp.h +++ b/src/GridGenerator/grid/GridImp.h @@ -1,6 +1,8 @@ #ifndef GRID_IMP_H #define GRID_IMP_H +#include <array> + #include "GridGenerator/global.h" #include "distributions/Distribution.h" @@ -22,6 +24,17 @@ class TriangularMeshDiscretizationStrategy; extern CONSTANT int DIRECTIONS[DIR_END_MAX][DIMENSION]; +namespace CommunicationDirections { + enum { + MX = 0, + PX = 1, + MY = 2, + PY = 3, + MZ = 4, + PZ = 5 + }; +} + class VF_PUBLIC GridImp : public enableSharedFromThis<GridImp>, public Grid { private: @@ -105,6 +118,9 @@ public: HOSTDEVICE void transIndexToCoords(uint index, real &x, real &y, real &z) const override; HOST virtual void findGridInterface(SPtr<Grid> grid, LbmOrGks lbmOrGks) override; + + HOST virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) override; + HOST void freeMemory() override; HOST uint getLevel(real levelNull) const; @@ -264,10 +280,20 @@ private: HOSTDEVICE void calculateQs(const uint index, const Vertex &point, const Triangle &triangle) const; HOSTDEVICE bool checkIfAtLeastOneValidQ(const uint index, const Vertex &point, const Triangle &triangle) const; +public: + void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox); + void findCommunicationIndex( uint index, real coordinate, real limit, int direction ); private: - //HOSTDEVICE bool isNeighborInside(const int &index) const; + + struct CommunicationIndices + { + std::vector<uint> sendIndices; + std::vector<uint> receiveIndices; + }; + + std::array<CommunicationIndices, 6> communicationIndices; private: diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h index b72e79bd9a4b2caf3390cc21d8ff31f9bcb15445..7668e929512b6207c5990c7c3ff31d8dd429ba26 100644 --- a/src/GridGenerator/grid/GridMocks.h +++ b/src/GridGenerator/grid/GridMocks.h @@ -62,6 +62,8 @@ public: virtual void findGridInterface(SPtr<Grid> grid, LbmOrGks lbmOrGks) override {} + virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) override {} + virtual void enableFindSolidBoundaryNodes() override {} virtual void enableComputeQs() override {} @@ -98,9 +100,12 @@ public: real getQValue(const uint index, const uint dir) const override { return 0.0; } uint getQPatch(const uint index) const override { return 0.0; } - void setInnerRegionFromFinerGrid( bool innerRegionFromFinerGrid ) override {}; + void setInnerRegionFromFinerGrid( bool innerRegionFromFinerGrid ) override {} + + void setNumberOfLayers( uint numberOfLayers ) override {} + + void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox) override {} - void setNumberOfLayers( uint numberOfLayers ) override {}; }; class GridStub : public GridDummy diff --git a/src/GridGenerator/grid/NodeValues.h b/src/GridGenerator/grid/NodeValues.h index dffc004661179c2f81ccc0629147370907b144bb..b393356ae488bfc29ff6bf756e2898846545255f 100644 --- a/src/GridGenerator/grid/NodeValues.h +++ b/src/GridGenerator/grid/NodeValues.h @@ -9,6 +9,9 @@ #define FLUID_FCC 3 #define FLUID_FCF 4 +#define MULTI_GPU_SEND 10 +#define MULTI_GPU_RECIEVE 11 + #define BC_PRESSURE 20 #define BC_VELOCITY 21 #define BC_SOLID 22 diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp index 4226c8715781071c315d449bed1d462f10f44836..ae145505fde4906f6f9cbc66521fe6d41d9c41a8 100644 --- a/targets/apps/HULC/main.cpp +++ b/targets/apps/HULC/main.cpp @@ -278,7 +278,7 @@ void multipleLevel(const std::string& configPath) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool useGridGenerator = false; + bool useGridGenerator = true; if(useGridGenerator){ @@ -321,33 +321,43 @@ void multipleLevel(const std::string& configPath) // DLC - Golf ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real dx = 0.2; - real vx = 0.05; + //real dx = 0.2; + //real vx = 0.05; - real z0 = 0.265+0.5*dx; + //real z0 = 0.265+0.5*dx; - std::vector<uint> ignorePatches = { 152, 153, 154 }; + //std::vector<uint> ignorePatches = { 152, 153, 154 }; - TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/VW370_SERIE.stl", ignorePatches); - - TriangularMesh* DrivAerRefBoxSTL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_REF_BOX_Adrea.stl"); + //TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/VW370_SERIE.stl", ignorePatches); + // + ////TriangularMesh* DrivAerRefBoxSTL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_REF_BOX_Adrea.stl"); - TriangularMesh* DLC_RefBox = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox.stl"); + //TriangularMesh* DLC_RefBox = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox.stl"); - gridBuilder->addCoarseGrid(- 5.0, -5.0, 0.0 - z0, - 15.0, 5.0, 5.0 - z0, dx); + //TriangularMesh* DLC_RefBox_1 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_4m.stl"); + //TriangularMesh* DLC_RefBox_2 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_3m.stl"); + //TriangularMesh* DLC_RefBox_3 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_2m.stl"); + //TriangularMesh* DLC_RefBox_4 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.stl"); - gridBuilder->setNumberOfLayers(10,8); - gridBuilder->addGrid(DrivAerRefBoxSTL, 4); - - Conglomerate* refinement = new Conglomerate(); - refinement->add(DLC_RefBox); - refinement->add(VW370_SERIE_STL); + //gridBuilder->addCoarseGrid(- 5.0, -5.0, 0.0 - z0, + // 15.0, 5.0, 5.0 - z0, dx); - gridBuilder->setNumberOfLayers(10,8); - gridBuilder->addGrid(refinement, 5); + //gridBuilder->setNumberOfLayers(10,8); + ////gridBuilder->addGrid(DLC_RefBox_1, 1); + ////gridBuilder->addGrid(DLC_RefBox_2, 2); + ////gridBuilder->addGrid(DLC_RefBox_3, 3); + ////gridBuilder->addGrid(DLC_RefBox_4, 4); - gridBuilder->addGeometry(VW370_SERIE_STL); + //gridBuilder->addGrid(DLC_RefBox_4, 4); + // + //Conglomerate* refinement = new Conglomerate(); + //refinement->add(DLC_RefBox); + //refinement->add(VW370_SERIE_STL); + + //gridBuilder->setNumberOfLayers(10,8); + //gridBuilder->addGrid(refinement, 5); + + //gridBuilder->addGeometry(VW370_SERIE_STL); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Wall Mounted Cube @@ -467,6 +477,58 @@ void multipleLevel(const std::string& configPath) //gridBuilder->addGrid(new Cuboid( -0.2, -0.6, -0.2, 0.2, 0.6, 0.2 ), 1); + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Testing Multi GPU grids + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + const uint generatePart = 2; + + real dx = 1.0 / 10.0; + real vx = 0.01; + + TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/ShpereNotOptimal.stl"); + + // all + //gridBuilder->addCoarseGrid(-2, -2, -2, + // 4, 2, 2, dx); + + real overlap = 10.0 * dx; + + if( generatePart == 1 ) + gridBuilder->addCoarseGrid(-2.0 , -2.0, -2.0, + 0.5 + overlap, 2.0, 2.0, dx); + + if( generatePart == 2 ) + gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0, + 4.0 , 2.0, 2.0, dx); + + + gridBuilder->setNumberOfLayers(10,8); + gridBuilder->addGrid(triangularMesh, 1); + + gridBuilder->addGeometry(triangularMesh); + + if( generatePart == 1 ) + gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, + -2.0, 2.0, + -2.0, 2.0 ) ); + + if( generatePart == 2 ) + gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( 0.5, 4.0, + -2.0, 2.0, + -2.0, 2.0 ) ); + + + gridBuilder->setPeriodicBoundaryCondition(false, false, false); + + gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!! + + if( generatePart == 1 ) + gridBuilder->findCommunicationIndices(CommunicationDirections::PX); + + if( generatePart == 2 ) + gridBuilder->findCommunicationIndices(CommunicationDirections::MX); + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // other tests ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -488,12 +550,6 @@ void multipleLevel(const std::string& configPath) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - gridBuilder->setPeriodicBoundaryCondition(false, false, false); - //gridBuilder->setPeriodicBoundaryCondition(true, true, true); - - gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!! - - /////////////////////////////////////////////////////////////////////////// //BCs //gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.0, 0.0, 0.0); @@ -503,8 +559,19 @@ void multipleLevel(const std::string& configPath) gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0); gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0); - gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); - gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0); + //gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); + //gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0); + + gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0); + + if (generatePart == 1) { + gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0); + //gridBuilder->setDomainDecompositionBoundaryCondition(SideType::PX); + } + if (generatePart == 2) { + gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); + //gridBuilder->setDomainDecompositionBoundaryCondition(SideType::MX); + } //////////////////////////////////////////////////////////////////////////// @@ -513,9 +580,6 @@ void multipleLevel(const std::string& configPath) // gridBuilder->setNoSlipBoundaryCondition(SideType::MZ); // gridBuilder->setNoSlipBoundaryCondition(SideType::PZ); - - gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0); - { //gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setVelocityForPatch(0, vx, 0.0, 0.0); @@ -531,26 +595,26 @@ void multipleLevel(const std::string& configPath) //gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 3, 2.793 , -2.0, 0.0, // 2.793 , 2.0, 0.0, -vx, 0.318); - real wheelsFrontX = -0.081; - real wheelsRearX = 2.5485; + //real wheelsFrontX = -0.081; + //real wheelsRearX = 2.5485; - real wheelsFrontZ = 0.0515; - real wheelsRearZ = 0.0585; + //real wheelsFrontZ = 0.0515; + //real wheelsRearZ = 0.0585; - real wheelsRadius = 0.318; + //real wheelsRadius = 0.318; - std::vector<uint> frontWheelPatches = { 71, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 159 }; - std::vector<uint> rearWheelPatches = { 82, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 160 }; + //std::vector<uint> frontWheelPatches = { 71, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 159 }; + //std::vector<uint> rearWheelPatches = { 82, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 160 }; - for( uint patch : frontWheelPatches ){ - gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsFrontX, -2.0, wheelsFrontZ, - wheelsFrontX, 2.0, wheelsFrontZ, -vx, wheelsRadius); - } + //for( uint patch : frontWheelPatches ){ + // gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsFrontX, -2.0, wheelsFrontZ, + // wheelsFrontX, 2.0, wheelsFrontZ, -vx, wheelsRadius); + //} - for( uint patch : rearWheelPatches ){ - gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsRearX , -2.0, wheelsRearZ , - wheelsRearX , 2.0, wheelsRearZ , -vx, wheelsRadius); - } + //for( uint patch : rearWheelPatches ){ + // gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsRearX , -2.0, wheelsRearZ , + // wheelsRearX , 2.0, wheelsRearZ , -vx, wheelsRadius); + //} } @@ -563,12 +627,22 @@ void multipleLevel(const std::string& configPath) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + if (generatePart == 1) { + gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_"); + gridBuilder->writeArrows ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_Arrow"); + } + if (generatePart == 2) { + gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_"); + gridBuilder->writeArrows ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow"); + } //gridBuilder->writeGridsToVtk("M:/TestGridGeneration/results/ConcaveTest_"); - gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/Test_"); + //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_"); //gridBuilder->writeGridsToVtk("M:/TestGridGeneration/results/CylinderTest_"); - gridBuilder->writeArrows("C:/Users/lenz/Desktop/Work/gridGenerator/grid/Test_Arrow"); + //gridBuilder->writeArrows("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -665,11 +739,11 @@ void multipleLevel(const std::string& configPath) //} //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII); - SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII); + //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII); - gridGenerator = GridGenerator::make(gridBuilder, para); + //gridGenerator = GridGenerator::make(gridBuilder, para); - //return; + return; } else {