From 0eeaa402bb963e757c3c16bcce46cf771758d82e Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-braunschweig.de> Date: Tue, 15 Aug 2023 15:16:32 +0000 Subject: [PATCH] Fix node types for rotating grids --- apps/gpu/RotatingGrid/RotatingGrid.cpp | 16 ++- .../VerticalCylinder/VerticalCylinder.cpp | 10 ++ .../VerticalCylinder/VerticalCylinder.h | 3 + src/gpu/GridGenerator/grid/Field.cpp | 5 + src/gpu/GridGenerator/grid/Field.h | 1 + .../grid/GridBuilder/MultipleGridBuilder.cpp | 62 ++++++++-- .../grid/GridBuilder/MultipleGridBuilder.h | 4 +- src/gpu/GridGenerator/grid/GridImp.cpp | 28 ++++- src/gpu/GridGenerator/grid/GridInterface.cpp | 114 +++++++++++++++++- src/gpu/GridGenerator/grid/GridInterface.h | 6 + src/gpu/GridGenerator/grid/NodeValues.h | 2 + 11 files changed, 222 insertions(+), 29 deletions(-) diff --git a/apps/gpu/RotatingGrid/RotatingGrid.cpp b/apps/gpu/RotatingGrid/RotatingGrid.cpp index f41874520..7279caf1a 100644 --- a/apps/gpu/RotatingGrid/RotatingGrid.cpp +++ b/apps/gpu/RotatingGrid/RotatingGrid.cpp @@ -76,8 +76,11 @@ int main() ////////////////////////////////////////////////////////////////////////// // Simulation parameters ////////////////////////////////////////////////////////////////////////// - std::string path("./output/RotatingGrid"); - std::string simulationName("RotatingGrid"); + enum RotationOrInterpolation {Rot, Int}; + const RotationOrInterpolation rotOrInt = Rot; + + const std::string path("./output/RotatingGrid"); + const std::string simulationName = rotOrInt == Int ? "RotatingGridInterpolationTest" : "RotatingGrid"; const real L = 1.0; const real Re = 2000.0; @@ -104,7 +107,9 @@ int main() gridBuilder->addCoarseGrid(-0.5 * L, -0.5 * L, -1.5 * L, 0.5 * L, 0.5 * L, 1.5 * L, dx); - gridBuilder->addGridRotatingGrid(std::make_shared<VerticalCylinder>(0.0, 0.0, 0.0, 0.25 * L, 0.5 * L)); + if (rotOrInt == Rot) gridBuilder->addGridRotatingGrid(std::make_shared<VerticalCylinder>(0.0, 0.0, 0.0, 0.3 * L, 1. * L)); + if (rotOrInt == Int) gridBuilder->addGrid(std::make_shared<VerticalCylinder>(0.0, 0.0, 0.0, 0.3 * L, 1. * L), 1); + GridScalingFactory scalingFactory = GridScalingFactory(); scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible); @@ -192,10 +197,11 @@ int main() Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, &scalingFactory); - // gridBuilder->writeGridsToVtk(para->getOutputPath() + "grid"); + const std::string gridName = rotOrInt == Rot ? "rot_grid" : "rot"; + gridBuilder->writeGridsToVtk(para->getOutputPath() + gridName); // NeighborDebugWriter::writeNeighborLinkLinesDebug(para.get()); - sim.run(); + // sim.run(); } catch (const spdlog::spdlog_ex &ex) { std::cout << "Log initialization failed: " << ex.what() << std::endl; diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp index 5019f2a75..102fb258b 100644 --- a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp +++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp @@ -116,3 +116,13 @@ void VerticalCylinder::scale(double delta) this->radius += delta; this->height += delta; } + +double VerticalCylinder::getRadius() const +{ + return radius; +} + +double VerticalCylinder::getHeight() const +{ + return height; +} \ No newline at end of file diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h index 64cdecef5..8e4fae42b 100644 --- a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h +++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h @@ -55,6 +55,9 @@ public: double getX3Minimum() override; double getX3Maximum() override; + double getRadius() const; + double getHeight() const; + bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override; diff --git a/src/gpu/GridGenerator/grid/Field.cpp b/src/gpu/GridGenerator/grid/Field.cpp index 8e68bfdf7..6f622c0bb 100644 --- a/src/gpu/GridGenerator/grid/Field.cpp +++ b/src/gpu/GridGenerator/grid/Field.cpp @@ -76,6 +76,11 @@ bool Field::isCoarseToFineNode(uint index) const return field[index] == FLUID_CFC; } +bool Field::isInterpolationGapNode(uint index) const +{ + return field[index] == INTERPOLATION_GAP; +} + bool Field::isFineToCoarseNode(uint index) const { return field[index] == FLUID_FCC; diff --git a/src/gpu/GridGenerator/grid/Field.h b/src/gpu/GridGenerator/grid/Field.h index bb25b0fc0..b001f1f6e 100644 --- a/src/gpu/GridGenerator/grid/Field.h +++ b/src/gpu/GridGenerator/grid/Field.h @@ -51,6 +51,7 @@ public: bool is(uint index, char type) const; bool isCoarseToFineNode(uint index) const; bool isFineToCoarseNode(uint index) const; + bool isInterpolationGapNode(uint index) const; bool isFluid(uint index) const; bool isInvalidSolid(uint index) const; bool isQ(uint index) const; diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index 101715987..78b879ea8 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -105,7 +105,13 @@ void MultipleGridBuilder::addGridRotatingGrid(SPtr<VerticalCylinder> cylinder) { if (!coarseGridExists()) return emitNoCoarseGridExistsWarning(); - const auto grid = makeRotatingGrid(std::move(cylinder), getNumberOfLevels(), 0); + const uint level = getNumberOfLevels(); + const uint levelFine = 1; + + VF_LOG_WARNING("Make rotating Grid... {}, {}", level, levelFine); + const auto grid = makeRotatingGrid(std::move(cylinder), level, levelFine); + + // grid->setNumberOfLayers(this->numberOfLayersFine); if (!isGridInCoarseGrid(grid)) return emitGridIsNotInCoarseGridWarning(); @@ -118,6 +124,7 @@ void MultipleGridBuilder::addGrid(SPtr<Object> gridShape, uint levelFine) if (!coarseGridExists()) return emitNoCoarseGridExistsWarning(); for (uint level = this->getNumberOfLevels(); level <= levelFine; level++) { + VF_LOG_WARNING("Make Grid... {}, {}", level, levelFine); const auto grid = makeGrid(gridShape, level, levelFine); if (level != levelFine) { @@ -218,6 +225,14 @@ SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uin const auto staggeredCoordinates = getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart); + VF_LOG_WARNING("Object Size x : {}, {} \n z: {}, {}", gridShape->getX1Minimum(), gridShape->getX1Maximum(), gridShape->getX3Minimum(), gridShape->getX3Maximum()); + VF_LOG_WARNING("MakeGrid {}, {}, {}, {}, {}, {}, delta: {}, level: {}", staggeredCoordinates[0], + staggeredCoordinates[1], + staggeredCoordinates[2], + staggeredCoordinates[3], + staggeredCoordinates[4], + staggeredCoordinates[5], delta, level); + SPtr<Grid> newGrid = this->makeGrid(gridShape, staggeredCoordinates[0], staggeredCoordinates[1], staggeredCoordinates[2], @@ -225,12 +240,13 @@ SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uin staggeredCoordinates[4], staggeredCoordinates[5], delta, level); + VF_LOG_WARNING("oddStart, {} {} {}", xOddStart, yOddStart, zOddStart); newGrid->setOddStart(xOddStart, yOddStart, zOddStart); return newGrid; } -SPtr<Grid> MultipleGridBuilder::makeRotatingGrid(SPtr<Object> gridShape, uint level, uint levelFine) +SPtr<Grid> MultipleGridBuilder::makeRotatingGrid(SPtr<VerticalCylinder> cylinder, uint level, uint levelFine) { boundaryConditions.push_back(std::make_shared<BoundaryConditions>()); @@ -238,15 +254,28 @@ SPtr<Grid> MultipleGridBuilder::makeRotatingGrid(SPtr<Object> gridShape, uint le bool xOddStart = false, yOddStart = false, zOddStart = false; - const auto staggeredCoordinates = - getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart, { 0.5, 0.5, 0.5 }); + const std::array<double, 3> staggeringRelative = { 0.5, 0.5, 0.5 }; - SPtr<Grid> newGrid = this->makeGrid(gridShape, staggeredCoordinates[0], - staggeredCoordinates[1], - staggeredCoordinates[2], - staggeredCoordinates[3], - staggeredCoordinates[4], - staggeredCoordinates[5], delta, level); + const auto staggeredCoordinates = + getStaggeredCoordinates(cylinder, level, levelFine, xOddStart, yOddStart, zOddStart, staggeringRelative, true); + + VF_LOG_WARNING("RotGr: Cylinder Size x : {}, {} \n z: {}, {}", cylinder->getX1Minimum(), cylinder->getX1Maximum(), cylinder->getX3Minimum(), cylinder->getX3Maximum()); + VF_LOG_WARNING("RotGr: MakeGrid {}, {}, {}, {}, {}, {}, delta: {}, level: {}", staggeredCoordinates[0], + staggeredCoordinates[1], + staggeredCoordinates[2], + staggeredCoordinates[3], + staggeredCoordinates[4], + staggeredCoordinates[5], delta, level); + + cylinder = std::make_shared<VerticalCylinder>(cylinder->getX1Centroid(), cylinder->getX2Centroid(), cylinder->getX3Centroid(), cylinder->getRadius()+5*delta, cylinder->getHeight()+6*delta); + VF_LOG_WARNING("RotGr: LargerCylinder Size x : {}, {} \n z: {}, {}", cylinder->getX1Minimum(), cylinder->getX1Maximum(), cylinder->getX3Minimum(), cylinder->getX3Maximum()); + + SPtr<Grid> newGrid = this->makeGrid(cylinder, staggeredCoordinates[0], + staggeredCoordinates[1], + staggeredCoordinates[2], + staggeredCoordinates[3], + staggeredCoordinates[4], + staggeredCoordinates[5], delta, level); newGrid->setOddStart(xOddStart, yOddStart, zOddStart); @@ -261,7 +290,10 @@ real MultipleGridBuilder::calculateDelta(uint level) const return delta; } -std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, bool& xOddStart, bool& yOddStart, bool& zOddStart, std::array<double, 3> relativeStagger) const +std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, + bool &xOddStart, bool &yOddStart, bool &zOddStart, + const std::array<double, 3> &relativeStagger, + bool gridIsForRotation) const { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -286,9 +318,12 @@ std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gr // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const real deltaCoarse = this->grids[level-1]->getDelta(); - const real delta = 0.5 * deltaCoarse; + const real deltaCoarse = this->grids[level - 1]->getDelta(); + const real delta = gridIsForRotation ? deltaCoarse : 0.5 * deltaCoarse; + VF_LOG_WARNING("getStaggeredCoordinates: create grid for rotation {}: ", gridIsForRotation); + VF_LOG_WARNING("delta = {}", delta); + VF_LOG_WARNING("level={}, levelFine={}", levelFine, levelFine); std::array<real, 6> staggeredCoordinates; @@ -373,6 +408,7 @@ std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gr while (staggeredCoordinates[4] > this->grids[level - 1]->getEndY() ) staggeredCoordinates[4] -= delta; while (staggeredCoordinates[5] > this->grids[level - 1]->getEndZ() ) staggeredCoordinates[5] -= delta; + VF_LOG_WARNING("end of getStaggeredCoordinates()"); return staggeredCoordinates; } diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h index 839d9b24e..1b496db6d 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h @@ -85,7 +85,7 @@ public: protected: virtual SPtr<Grid> makeGrid(SPtr<Object> gridShape, uint level, uint levelFine); virtual SPtr<Grid> makeGrid(SPtr<Object> gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const; - virtual SPtr<Grid> makeRotatingGrid(SPtr<Object> gridShape, uint level, uint levelFine); + virtual SPtr<Grid> makeRotatingGrid(SPtr<VerticalCylinder> cylinder, uint level, uint levelFine); private: void addGridToList(SPtr<Grid> grid); @@ -100,7 +100,7 @@ private: std::array<real, 6> getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, bool &xOddStart, bool &yOddStart, bool &zOddStart, - std::array<double, 3> relativeStagger = { 0.25, 0.25, 0.25 }) const; + const std::array<double, 3> &relativeStagger = { 0.25, 0.25, 0.25 }, bool gridIsForRotation = false) const; std::array<real, 6> getStaggeredCoordinates(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const; std::array<real, 3> getOffset(real delta) const; std::vector<uint> getSpacingFactors(uint levelDifference) const; diff --git a/src/gpu/GridGenerator/grid/GridImp.cpp b/src/gpu/GridGenerator/grid/GridImp.cpp index 8ece06116..a0f5c3de0 100644 --- a/src/gpu/GridGenerator/grid/GridImp.cpp +++ b/src/gpu/GridGenerator/grid/GridImp.cpp @@ -1105,15 +1105,15 @@ int GridImp::getSparseIndex(const real &x, const real &y, const real &z) const // --------------------------------------------------------- // void GridImp::findGridInterface(SPtr<Grid> finerGrid) { - auto fineGrid = std::static_pointer_cast<GridImp>(finerGrid); + auto fineGridImp = std::static_pointer_cast<GridImp>(finerGrid); const auto coarseLevel = this->getLevel(); - const auto fineLevel = fineGrid->getLevel(); + const auto fineLevel = fineGridImp->getLevel(); VF_LOG_TRACE("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); + const uint sizeCF = 10 * (fineGridImp->nx * fineGridImp->ny + fineGridImp->ny * fineGridImp->nz + fineGridImp->nx * fineGridImp->nz); this->gridInterface->cf.coarse = new uint[sizeCF]; this->gridInterface->cf.fine = new uint[sizeCF]; this->gridInterface->cf.offset = new uint[sizeCF]; @@ -1122,13 +1122,29 @@ void GridImp::findGridInterface(SPtr<Grid> finerGrid) this->gridInterface->fc.offset = new uint[sizeCF]; for (uint index = 0; index < this->getSize(); index++) - this->findGridInterfaceCF(index, *fineGrid); + this->findGridInterfaceCF(index, *fineGridImp); + + for (uint index = 0; index < this->getSize(); index++){ + gridInterface->findInterpolationGapC(index, this, fineGridImp.get()); + } + + for (uint fineIndex; fineIndex < fineGridImp->getSize(); fineIndex++) + gridInterface->findInterpolationGapF(fineIndex, fineGridImp.get()); + + for (uint index = 0; index < this->getSize(); index++){ + gridInterface->findInterfaceFCwithGap(index, this, fineGridImp.get()); + } for (uint index = 0; index < this->getSize(); index++) - this->findGridInterfaceFC(index, *fineGrid); + this->findOverlapStopper(index, *fineGridImp); for (uint index = 0; index < this->getSize(); index++) - this->findOverlapStopper(index, *fineGrid); + if (this->getField().isInterpolationGapNode(index)) + this->getField().setFieldEntry(index, FLUID); + + for (uint fineIndex = 0; fineIndex < fineGridImp->getSize(); fineIndex++) + if (fineGridImp->getField().isInterpolationGapNode(fineIndex)) + fineGridImp->getField().setFieldEntry(fineIndex, FLUID); VF_LOG_TRACE(" ... done."); } diff --git a/src/gpu/GridGenerator/grid/GridInterface.cpp b/src/gpu/GridGenerator/grid/GridInterface.cpp index 4b69cebd1..ce4522f55 100644 --- a/src/gpu/GridGenerator/grid/GridInterface.cpp +++ b/src/gpu/GridGenerator/grid/GridInterface.cpp @@ -84,7 +84,8 @@ void GridInterface::findInterfaceCF(const uint& indexOnCoarseGrid, GridImp* coar cf.numberOfEntries++; coarseGrid->setNonStopperOutOfGridCellTo(indexOnCoarseGrid, FLUID_CFC); - fineGrid->setNonStopperOutOfGridCellTo(indexOnFineGridCF, FLUID_CFF); + // fineGrid->setNonStopperOutOfGridCellTo(indexOnFineGridCF, FLUID_CFF); + fineGrid->getField().setFieldEntry(indexOnFineGridCF, FLUID_CFF); break; } } @@ -119,13 +120,13 @@ void GridInterface::findBoundaryGridInterfaceCF(const uint& indexOnCoarseGrid, G cf.numberOfEntries++; coarseGrid->setNonStopperOutOfGridCellTo(indexOnCoarseGrid, FLUID_CFC); - fineGrid->setNonStopperOutOfGridCellTo(indexOnFineGridCF, FLUID_CFF); + fineGrid->getField().setFieldEntry(indexOnFineGridCF, FLUID_CFF); + break; } } } - void GridInterface::findInterfaceFC(const uint& indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid) { const bool nodeOnCoarseGridIsFluid = coarseGrid->getField().isFluid(indexOnCoarseGrid); @@ -165,6 +166,113 @@ void GridInterface::findInterfaceFC(const uint& indexOnCoarseGrid, GridImp* coar } } +void GridInterface::findInterfaceFCwithGap(uint indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid) +{ + const bool nodeOnCoarseGridIsFluid = coarseGrid->getField().isFluid(indexOnCoarseGrid); + const bool nodeOnCoarseGridIsCoarseToFine = coarseGrid->getField().isCoarseToFineNode(indexOnCoarseGrid); + if (!nodeOnCoarseGridIsFluid || nodeOnCoarseGridIsCoarseToFine) + return; + + const uint indexOnFineGridFC = getFineToCoarseIndexOnFineGrid(indexOnCoarseGrid, coarseGrid, fineGrid); + // if (indexOnFineGridFC == INVALID_INDEX) + // return; + + // const bool fineGridNodeIsFluid = fineGrid->getField().isFluid(indexOnFineGridFC); + // if (!fineGridNodeIsFluid) + // return; + + real x, y, z; + coarseGrid->transIndexToCoords(indexOnCoarseGrid, x, y, z); + + for (const auto dir : coarseGrid->distribution) + { + const uint neighborIndex = coarseGrid->transCoordToIndex( + x + dir[0] * coarseGrid->getDelta(), y + dir[1] * coarseGrid->getDelta(), z + dir[2] * coarseGrid->getDelta()); + if (neighborIndex != INVALID_INDEX) + { + const bool neighborIsInterpolationGapNode = coarseGrid->getField().isInterpolationGapNode(neighborIndex); + if (neighborIsInterpolationGapNode) + { + fc.coarse[fc.numberOfEntries] = indexOnCoarseGrid; + fc.fine[fc.numberOfEntries] = this->findOffsetFC(indexOnFineGridFC, fineGrid, fc.numberOfEntries); + + fc.numberOfEntries++; + + fineGrid->setNonStopperOutOfGridCellTo(indexOnFineGridFC, FLUID_FCF); + coarseGrid->getField().setFieldEntry(indexOnCoarseGrid, FLUID_FCC); + break; + } + } + } +} + +void GridInterface::findInterpolationGapC(const uint& indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid) +{ + const bool nodeOnCoarseGridIsFluid = coarseGrid->getField().isFluid(indexOnCoarseGrid); + const bool nodeOnCoarseGridIsCoarseToFine = coarseGrid->getField().isCoarseToFineNode(indexOnCoarseGrid); + if (!nodeOnCoarseGridIsFluid || nodeOnCoarseGridIsCoarseToFine) + return; + + const uint indexOnFineGridFC = getFineToCoarseIndexOnFineGrid(indexOnCoarseGrid, coarseGrid, fineGrid); + if (indexOnFineGridFC == INVALID_INDEX) + return; + + const bool fineGridNodeIsFluid = fineGrid->getField().isFluid(indexOnFineGridFC); + if (!fineGridNodeIsFluid) + return; + + real x, y, z; + coarseGrid->transIndexToCoords(indexOnCoarseGrid, x, y, z); + + for (const auto dir : coarseGrid->distribution) + { + const uint neighborIndex = coarseGrid->transCoordToIndex( + x + dir[0] * coarseGrid->getDelta(), y + dir[1] * coarseGrid->getDelta(), z + dir[2] * coarseGrid->getDelta()); + if (neighborIndex != INVALID_INDEX) + { + const bool neighborBelongsToCoarseToFineInterpolationCell = coarseGrid->getField().isCoarseToFineNode(neighborIndex); + if (neighborBelongsToCoarseToFineInterpolationCell) + { + // fc.coarse[fc.numberOfEntries] = indexOnCoarseGrid; + // fc.fine[fc.numberOfEntries] = this->findOffsetFC(indexOnFineGridFC, fineGrid, fc.numberOfEntries); + + // fc.numberOfEntries++; + + // fineGrid->setNonStopperOutOfGridCellTo(indexOnFineGridFC, INTERPOLATION_GAP); + // fineGrid->getField().setFieldEntry(indexOnFineGridFC, INTERPOLATION_GAP); + coarseGrid->getField().setFieldEntry(indexOnCoarseGrid, INTERPOLATION_GAP); + break; + } + } + } +} + +void GridInterface::findInterpolationGapF(const uint& indexOnFineGrid, GridImp* fineGrid) +{ + const bool nodeIsFluid = fineGrid->getField().isFluid(indexOnFineGrid); + const bool nodeIsCoarseToFine = fineGrid->getField().is(indexOnFineGrid, FLUID_CFF); + if (!nodeIsFluid || nodeIsCoarseToFine) + return; + + real x, y, z; + fineGrid->transIndexToCoords(indexOnFineGrid, x, y, z); + + for (const auto dir : fineGrid->distribution) + { + const uint neighborIndex = fineGrid->transCoordToIndex( + x + dir[0] * fineGrid->getDelta(), y + dir[1] * fineGrid->getDelta(), z + dir[2] * fineGrid->getDelta()); + if (neighborIndex != INVALID_INDEX) + { + const bool neighborIsToCoarseToFine = fineGrid->getField().is(neighborIndex, FLUID_CFF); + if (neighborIsToCoarseToFine) + { + fineGrid->getField().setFieldEntry(indexOnFineGrid, INTERPOLATION_GAP); + break; + } + } + } +} + void GridInterface::findOverlapStopper(const uint& indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid) { const bool nodeOnCoarseGridIsFluid = coarseGrid->getField().isFluid(indexOnCoarseGrid); diff --git a/src/gpu/GridGenerator/grid/GridInterface.h b/src/gpu/GridGenerator/grid/GridInterface.h index ae90f513d..cbb2215aa 100644 --- a/src/gpu/GridGenerator/grid/GridInterface.h +++ b/src/gpu/GridGenerator/grid/GridInterface.h @@ -49,6 +49,12 @@ public: void GRIDGENERATOR_EXPORT findInterfaceFC(const uint& indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid); void GRIDGENERATOR_EXPORT findOverlapStopper(const uint& indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid); + void GRIDGENERATOR_EXPORT findInterpolationGapC(const uint& indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid); + void GRIDGENERATOR_EXPORT findInterpolationGapF(const uint& indexOnFineGrid, GridImp* fineGrid); + void GRIDGENERATOR_EXPORT findInterfaceFCwithGap(uint indexOnCoarseGrid, GridImp* coarseGrid, GridImp* fineGrid); + + + void GRIDGENERATOR_EXPORT findInvalidBoundaryNodes(const uint& indexOnCoarseGrid, GridImp* coarseGrid); void GRIDGENERATOR_EXPORT findForGridInterfaceSparseIndexCF(GridImp* coarseGrid, GridImp* fineGrid, uint index); diff --git a/src/gpu/GridGenerator/grid/NodeValues.h b/src/gpu/GridGenerator/grid/NodeValues.h index f1a948cd9..9796d657f 100644 --- a/src/gpu/GridGenerator/grid/NodeValues.h +++ b/src/gpu/GridGenerator/grid/NodeValues.h @@ -44,6 +44,8 @@ static constexpr char FLUID_CFF = 2; static constexpr char FLUID_FCC = 3; static constexpr char FLUID_FCF = 4; +static constexpr char INTERPOLATION_GAP = 5; + static constexpr char MULTI_GPU_SEND = 10; static constexpr char MULTI_GPU_RECIEVE = 11; -- GitLab