From c1aa8c8b0680c0f4654569a5805eedf404f1922e Mon Sep 17 00:00:00 2001 From: HenrikAsmuth <henrik.asmuth@geo.uu.se> Date: Fri, 13 Jan 2023 14:17:17 +0100 Subject: [PATCH] Add option for Side with q!=0.5 To be used in StressBC which gets improved results for q<0.5. q=0.5 still set as default argument for all other BCs --- apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp | 3 +- .../bindings/gpu/grid_generator.pyi | 2 +- .../src/gpu/submodules/grid_generator.cpp | 2 +- .../grid/BoundaryConditions/Side.cpp | 36 +++++++++---------- .../grid/BoundaryConditions/Side.h | 20 +++++------ .../grid/GridBuilder/LevelGridBuilder.cpp | 4 +-- .../grid/GridBuilder/LevelGridBuilder.h | 2 +- 7 files changed, 35 insertions(+), 34 deletions(-) diff --git a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp index 5fc319044..55a77a341 100644 --- a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp +++ b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp @@ -350,7 +350,8 @@ void multipleLevel(const std::string& configPath) gridBuilder->setStressBoundaryCondition(SideType::MZ, 0.0, 0.0, 1.0, // wall normals - samplingOffset, z0, dx); // wall model settinng + samplingOffset, z0, dx, // wall model settinng + 0.5f); // q para->setHasWallModelMonitor(true); gridBuilder->setSlipBoundaryCondition(SideType::PZ, 0.0f, 0.0f, -1.0f); diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi index 8d715e4b4..514dc5053 100644 --- a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi @@ -67,7 +67,7 @@ class LevelGridBuilder(GridBuilder): def set_precursor_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, file_collection: pyfluids.bindings.gpu.VelocityFileCollection, n_t_read: int, velocity_x: float = ..., velocity_y: float = ..., velocity_z: float = ..., file_level_to_grid_level_map: List[int] = ...) -> None: ... def set_pressure_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, rho: float) -> None: ... def set_slip_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, normal_x: float, normal_y: float, normal_z: float) -> None: ... - def set_stress_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, normal_x: float, normal_y: float, normal_z: float, sampling_offset: int, z0: float, dx: float) -> None: ... + def set_stress_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, normal_x: float, normal_y: float, normal_z: float, sampling_offset: int, z0: float, dx: float, q: float) -> None: ... def set_velocity_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, vx: float, vy: float, vz: float) -> None: ... class MultipleGridBuilder(LevelGridBuilder): diff --git a/pythonbindings/src/gpu/submodules/grid_generator.cpp b/pythonbindings/src/gpu/submodules/grid_generator.cpp index 3e9fb5655..5c2a4ca04 100644 --- a/pythonbindings/src/gpu/submodules/grid_generator.cpp +++ b/pythonbindings/src/gpu/submodules/grid_generator.cpp @@ -92,7 +92,7 @@ namespace grid_generator .def("set_periodic_boundary_condition", &LevelGridBuilder::setPeriodicBoundaryCondition, py::arg("periodic_x"), py::arg("periodic_y"), py::arg("periodic_z")) .def("set_no_slip_boundary_condition", &LevelGridBuilder::setNoSlipBoundaryCondition, py::arg("side_type")) .def("set_precursor_boundary_condition", &LevelGridBuilder::setPrecursorBoundaryCondition, py::arg("side_type"), py::arg("file_collection"), py::arg("n_t_read"), py::arg("velocity_x")=0.0f, py::arg("velocity_y")=0.0f, py::arg("velocity_z")=0.0f, py::arg("file_level_to_grid_level_map")=std::vector<uint>()) - .def("set_stress_boundary_condition", &LevelGridBuilder::setStressBoundaryCondition, py::arg("side_type"), py::arg("normal_x"), py::arg("normal_y"), py::arg("normal_z"), py::arg("sampling_offset"), py::arg("z0"), py::arg("dx")); + .def("set_stress_boundary_condition", &LevelGridBuilder::setStressBoundaryCondition, py::arg("side_type"), py::arg("normal_x"), py::arg("normal_y"), py::arg("normal_z"), py::arg("sampling_offset"), py::arg("z0"), py::arg("dx"), py::arg("q")); py::class_<MultipleGridBuilder, LevelGridBuilder, std::shared_ptr<MultipleGridBuilder>>(gridGeneratorModule, "MultipleGridBuilder") .def_static("make_shared", &MultipleGridBuilder::makeShared, py::return_value_policy::reference, py::arg("grid_factory")) diff --git a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp index 5b191ee4e..043d8277b 100644 --- a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp +++ b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp @@ -53,7 +53,7 @@ std::vector<real> Side::getNormal() } void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant, - real startInner, real endInner, real startOuter, real endOuter) + real startInner, real endInner, real startOuter, real endOuter, real q) { for (real v2 = startOuter; v2 <= endOuter; v2 += grid->getDelta()) { @@ -80,7 +80,7 @@ void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition setPressureNeighborIndices(boundaryCondition, grid, index); setStressSamplingIndices(boundaryCondition, grid, index); - setQs(grid, boundaryCondition, index); + setQs(grid, boundaryCondition, index, q); boundaryCondition->patches.push_back(0); } @@ -136,7 +136,7 @@ void Side::setStressSamplingIndices(SPtr<BoundaryCondition> boundaryCondition, S } } -void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uint index) +void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uint index, real q) { std::vector<real> qNode(grid->getEndDirection() + 1); @@ -181,7 +181,7 @@ void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uin grid->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID || grid->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_SOLID) && alignedWithNormal ) - qNode[dir] = 0.5; + qNode[dir] = q; else qNode[dir] = -1.0; } @@ -201,7 +201,7 @@ uint Side::getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, } -void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<BoundaryCondition> boundaryCondition) +void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { auto geometryBoundaryCondition = std::dynamic_pointer_cast<GeometryBoundaryCondition>(boundaryCondition); @@ -231,7 +231,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound if( qNode[dir] < -0.5 && ( grids[level]->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID_BOUNDARY || grids[level]->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID || grids[level]->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_SOLID ) ) - qNode[dir] = 0.5; + qNode[dir] = q; } geometryBoundaryCondition->indices.push_back(index); @@ -242,7 +242,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound -void MX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition) +void MX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { real startInner = grid[level]->getStartY(); real endInner = grid[level]->getEndY(); @@ -254,11 +254,11 @@ void MX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond if( coordinateNormal > grid[0]->getStartX() + grid[0]->getDelta() ) return; - Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter); + Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter, q); } -void PX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition) +void PX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { real startInner = grid[level]->getStartY(); real endInner = grid[level]->getEndY(); @@ -270,10 +270,10 @@ void PX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond if( coordinateNormal < grid[0]->getEndX() - grid[0]->getDelta() ) return; - Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter); + Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter, q); } -void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition) +void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { real startInner = grid[level]->getStartX(); real endInner = grid[level]->getEndX(); @@ -285,11 +285,11 @@ void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond if( coordinateNormal > grid[0]->getStartY() + grid[0]->getDelta() ) return; - Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter); + Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter, q); } -void PY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition) +void PY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { real startInner = grid[level]->getStartX(); real endInner = grid[level]->getEndX(); @@ -301,11 +301,11 @@ void PY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond if( coordinateNormal < grid[0]->getEndY() - grid[0]->getDelta() ) return; - Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter); + Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter, q); } -void MZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition) +void MZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { real startInner = grid[level]->getStartX(); real endInner = grid[level]->getEndX(); @@ -317,10 +317,10 @@ void MZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond if( coordinateNormal > grid[0]->getStartZ() + grid[0]->getDelta() ) return; - Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter); + Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter, q); } -void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition) +void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q) { real startInner = grid[level]->getStartX(); real endInner = grid[level]->getEndX(); @@ -332,5 +332,5 @@ void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond if( coordinateNormal < grid[0]->getEndZ() - grid[0]->getDelta() ) return; - Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter); + Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter, q); } diff --git a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h index 53a763bc5..57a7e4ee6 100644 --- a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h +++ b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h @@ -65,7 +65,7 @@ class Side { public: virtual ~Side() = default; - virtual void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) = 0; + virtual void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) = 0; virtual int getCoordinate() const = 0; virtual int getDirection() const = 0; @@ -76,13 +76,13 @@ public: protected: void addIndices(SPtr<Grid> grid, SPtr<gg::BoundaryCondition> boundaryCondition, std::string coord, real constant, - real startInner, real endInner, real startOuter, real endOuter); + real startInner, real endInner, real startOuter, real endOuter, real q); static void setPressureNeighborIndices(SPtr<gg::BoundaryCondition> boundaryCondition, SPtr<Grid> grid, const uint index); static void setStressSamplingIndices(SPtr<gg::BoundaryCondition> boundaryCondition, SPtr<Grid> grid, const uint index); - void setQs(SPtr<Grid> grid, SPtr<gg::BoundaryCondition> boundaryCondition, uint index); + void setQs(SPtr<Grid> grid, SPtr<gg::BoundaryCondition> boundaryCondition, uint index, real q); private: static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2); @@ -91,7 +91,7 @@ private: class Geometry : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { @@ -112,7 +112,7 @@ public: class MX : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { @@ -133,7 +133,7 @@ public: class PX : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { @@ -155,7 +155,7 @@ public: class MY : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { @@ -176,7 +176,7 @@ public: class PY : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { @@ -198,7 +198,7 @@ public: class MZ : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { @@ -219,7 +219,7 @@ public: class PZ : public Side { public: - void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override; + void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override; int getCoordinate() const override { diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 003e6dcd2..78a1ad88d 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -127,7 +127,7 @@ void LevelGridBuilder::setSlipGeometryBoundaryCondition(real normalX, real norma //! void LevelGridBuilder::setStressBoundaryCondition( SideType sideType, real nomalX, real normalY, real normalZ, - uint samplingOffset, real z0, real dx) + uint samplingOffset, real z0, real dx, real q) { for (uint level = 0; level < getNumberOfGridLevels(); level++) { @@ -135,7 +135,7 @@ void LevelGridBuilder::setStressBoundaryCondition( SideType sideType, auto side = SideFactory::make(sideType); stressBoundaryCondition->side = side; - stressBoundaryCondition->side->addIndices(grids, level, stressBoundaryCondition); + stressBoundaryCondition->side->addIndices(grids, level, stressBoundaryCondition, q); stressBoundaryCondition->fillStressNormalLists(); stressBoundaryCondition->fillSamplingOffsetLists(); diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index 2e0eaf130..52908de41 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -81,7 +81,7 @@ public: GRIDGENERATOR_EXPORT ~LevelGridBuilder() override; GRIDGENERATOR_EXPORT void setSlipBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ); - GRIDGENERATOR_EXPORT void setStressBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ, uint samplingOffset, real z0, real dx); + GRIDGENERATOR_EXPORT void setStressBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ, uint samplingOffset, real z0, real dx, real q = 0.5); GRIDGENERATOR_EXPORT void setVelocityBoundaryCondition(SideType sideType, real vx, real vy, real vz); GRIDGENERATOR_EXPORT void setPressureBoundaryCondition(SideType sideType, real rho); GRIDGENERATOR_EXPORT void setPeriodicBoundaryCondition(bool periodic_X, bool periodic_Y, bool periodic_Z); -- GitLab