diff --git a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5a530af154ae8a2b4ea794936d67d9eaa4ba7511 --- /dev/null +++ b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp @@ -0,0 +1 @@ +#include "BoundaryCondition.h" \ No newline at end of file diff --git a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h new file mode 100644 index 0000000000000000000000000000000000000000..2250a4ea7848607d65d62ba95744304daac0d374 --- /dev/null +++ b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h @@ -0,0 +1,53 @@ +#ifndef BoundaryCondition_H +#define BoundaryCondition_H + +#include <vector> + +#include <core/PointerDefinitions.h> +#include <core/DataTypes.h> + +class Side; + +class BoundaryCondition +{ +public: + std::vector<uint> indices; + +}; + +class PressureBoundaryCondition : public BoundaryCondition +{ +public: + static SPtr<PressureBoundaryCondition> make(real rho) + { + return SPtr<PressureBoundaryCondition>(new PressureBoundaryCondition(rho)); + } + + SPtr<Side> side; + real rho; +private: + PressureBoundaryCondition(real rho) : rho(rho) + { + + } +}; + +class VelocityBoundaryCondition : public BoundaryCondition +{ +public: + static SPtr<VelocityBoundaryCondition> make(real vx, real vy, real vz) + { + return SPtr<VelocityBoundaryCondition>(new VelocityBoundaryCondition(vx, vy, vz)); + } + + SPtr<Side> side; + real vx, vy, vz; +private: + VelocityBoundaryCondition(real vx, real vy, real vz) : vx(vx), vy(vy), vz(vz) + { + + } +}; + + +#endif \ No newline at end of file diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp new file mode 100644 index 0000000000000000000000000000000000000000..01147ead2c33b92211e465fd4a0f7e1ffbc59d82 --- /dev/null +++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp @@ -0,0 +1,97 @@ +#include "Side.h" + +#include "../Grid.h" +#include "../NodeValues.h" + +#include "BoundaryCondition.h" + +void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant, + real startInner, real endInner, real startOuter, real endOuter) +{ + for (real v1 = startInner; v1 < endInner; v1 += grid->getDelta()) + { + for (real v2 = startOuter; v2 < endOuter; v2 += grid->getDelta()) + { + uint index = getIndex(grid, coord, constant, v1, v2); + if (grid->getFieldEntry(index) == FLUID) + boundaryCondition->indices.push_back(index); + } + } +} + +uint Side::getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2) +{ + if (coord == "x") + return grid->transCoordToIndex(constant, v1, v2); + if (coord == "y") + return grid->transCoordToIndex(v1, constant, v2); + if (coord == "z") + return grid->transCoordToIndex(v1, v2, constant); + return -1; +} + +void MX::setPeriodicy(SPtr<Grid> grid) +{ + grid->setPeriodicityX(false); +} + +void MX::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) +{ + Side::addIndices(grid, boundaryCondition, "x", grid->getStartX() + grid->getDelta(), grid->getStartY(), + grid->getEndY(), grid->getStartZ(), grid->getEndZ()); +} + +void PX::setPeriodicy(SPtr<Grid> grid) +{ + grid->setPeriodicityX(false); +} + +void PX::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) +{ + Side::addIndices(grid, boundaryCondition, "x", grid->getEndX() - grid->getDelta(), grid->getStartY(), + grid->getEndY(), grid->getStartZ(), grid->getEndZ()); +} + +void MY::setPeriodicy(SPtr<Grid> grid) +{ + grid->setPeriodicityY(false); +} + +void MY::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) +{ + Side::addIndices(grid, boundaryCondition, "y", grid->getStartY() + grid->getDelta(), grid->getStartX(), + grid->getEndX(), grid->getStartZ(), grid->getEndZ()); +} + +void PY::setPeriodicy(SPtr<Grid> grid) +{ + grid->setPeriodicityY(false); +} + +void PY::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) +{ + Side::addIndices(grid, boundaryCondition, "y", grid->getEndY() - grid->getDelta(), grid->getStartX(), + grid->getEndX(), grid->getStartZ(), grid->getEndZ()); +} + +void MZ::setPeriodicy(SPtr<Grid> grid) +{ + grid->setPeriodicityZ(false); +} + +void MZ::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) +{ + Side::addIndices(grid, boundaryCondition, "z", grid->getStartZ() + grid->getDelta(), grid->getStartX(), + grid->getEndX(), grid->getStartY(), grid->getEndY()); +} + +void PZ::setPeriodicy(SPtr<Grid> grid) +{ + grid->setPeriodicityZ(false); +} + +void PZ::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) +{ + Side::addIndices(grid, boundaryCondition, "z", grid->getEndZ() - grid->getDelta(), grid->getStartX(), + grid->getEndX(), grid->getStartY(), grid->getEndY()); +} diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.h b/src/GridGenerator/grid/BoundaryConditions/Side.h new file mode 100644 index 0000000000000000000000000000000000000000..cbd28dffe2dcd2de74dc0db19c2c9e5c8615c697 --- /dev/null +++ b/src/GridGenerator/grid/BoundaryConditions/Side.h @@ -0,0 +1,180 @@ +#ifndef SIDE_H +#define SIDE_H + +#include <string> + +#include <VirtualFluidsDefinitions.h> + +#include <core/PointerDefinitions.h> +#include <core/DataTypes.h> + +#define X_INDEX 0 +#define Y_INDEX 1 +#define Z_INDEX 2 + +#define POSITIVE_DIR 1 +#define NEGATIVE_DIR -1 + +class Grid; +class BoundaryCondition; + +class Side; + +enum class SideType +{ + MX, PX, MY, PY, MZ, PZ +}; + + + +class Side +{ +public: + virtual void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) = 0; + virtual void setPeriodicy(SPtr<Grid> grid) = 0; + + virtual int getCoordinate() const = 0; + virtual int getDirection() const = 0; + +protected: + static void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant, + real startInner, real endInner, real startOuter, real endOuter); + +private: + static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2); +}; + +class MX : public Side +{ +public: + void setPeriodicy(SPtr<Grid> grid) override; + void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override; + + int getCoordinate() const override + { + return X_INDEX; + } + + int getDirection() const override + { + return NEGATIVE_DIR; + } +}; + +class PX : public Side +{ +public: + void setPeriodicy(SPtr<Grid> grid) override; + + void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override; + + int getCoordinate() const override + { + return X_INDEX; + } + + int getDirection() const override + { + return POSITIVE_DIR; + } +}; + + +class MY : public Side +{ +public: + void setPeriodicy(SPtr<Grid> grid) override; + + void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override; + + int getCoordinate() const override + { + return Y_INDEX; + } + + int getDirection() const override + { + return NEGATIVE_DIR; + } +}; + +class PY : public Side +{ +public: + void setPeriodicy(SPtr<Grid> grid) override; + + void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override; + + int getCoordinate() const override + { + return Y_INDEX; + } + + int getDirection() const override + { + return POSITIVE_DIR; + } +}; + + +class MZ : public Side +{ +public: + void setPeriodicy(SPtr<Grid> grid) override; + + void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override; + + int getCoordinate() const override + { + return Z_INDEX; + } + + int getDirection() const override + { + return NEGATIVE_DIR; + } +}; + +class PZ : public Side +{ +public: + void setPeriodicy(SPtr<Grid> grid) override; + + void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override; + + int getCoordinate() const override + { + return Z_INDEX; + } + + int getDirection() const override + { + return POSITIVE_DIR; + } +}; + + +class SideFactory +{ +public: + static SPtr<Side> make(SideType sideType) + { + switch (sideType) + { + case SideType::MX: + return SPtr<Side>(new MX()); + case SideType::PX: + return SPtr<Side>(new PX()); + case SideType::MY: + return SPtr<Side>(new MY()); + case SideType::PY: + return SPtr<Side>(new PY()); + case SideType::MZ: + return SPtr<Side>(new MZ()); + case SideType::PZ: + return SPtr<Side>(new PZ()); + } + } +}; + +#endif diff --git a/src/GridGenerator/grid/BoundaryConditions/package.include b/src/GridGenerator/grid/BoundaryConditions/package.include new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 4566982fa14eec1c9479688846be359630a4f801..66f9f83d85c890a52c535d0cf2f6e939a969853f 100644 --- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -25,9 +25,12 @@ #include <GridGenerator/grid/GridFactory.h> #include "grid/GridInterface.h" -//#include "grid/GridMocks.h" #include "grid/Grid.h" +#include "grid/BoundaryConditions/BoundaryCondition.h" +#include "grid/BoundaryConditions/Side.h" + + #define GEOFLUID 19 #define GEOSOLID 16 @@ -48,18 +51,21 @@ std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(Device device, co return SPtr<LevelGridBuilder>(new LevelGridBuilder(device, d3qxx)); } -void LevelGridBuilder::setVelocityBoundaryCondition(SPtr<Side> side, real vx, real vy, real vz) +void LevelGridBuilder::setVelocityBoundaryCondition(SideType sideType, real vx, real vy, real vz) { SPtr<VelocityBoundaryCondition> velocityBoundaryCondition = VelocityBoundaryCondition::make(vx, vy, vz); + auto side = SideFactory::make(sideType); + side->setPeriodicy(grids[0]); velocityBoundaryConditions.push_back(velocityBoundaryCondition); velocityBoundaryCondition->side = side; } -void LevelGridBuilder::setPressureBoundaryCondition(SPtr<Side> side, real rho) +void LevelGridBuilder::setPressureBoundaryCondition(SideType sideType, real rho) { SPtr<PressureBoundaryCondition> pressureBoundaryCondition = PressureBoundaryCondition::make(rho); + auto side = SideFactory::make(sideType); side->setPeriodicy(grids[0]); pressureBoundaryConditions.push_back(pressureBoundaryCondition); @@ -221,7 +227,7 @@ uint LevelGridBuilder::getVelocitySize(int level) const uint size = 0; for (auto boundaryCondition : this->velocityBoundaryConditions) { - size += boundaryCondition->indices.size(); + size += uint(boundaryCondition->indices.size()); } return size; } @@ -247,7 +253,7 @@ uint LevelGridBuilder::getPressureSize(int level) const uint size = 0; for (auto boundaryCondition : this->pressureBoundaryConditions) { - size += boundaryCondition->indices.size(); + size += uint(boundaryCondition->indices.size()); } return size; } diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index 41964c8c6431716e1ba6c011d326ecf4232e63bc..ce662601297db3e87e046d3d1d6168b859fd3c48 100644 --- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -19,227 +19,13 @@ class Grid; class Transformator; class ArrowTransformator; class PolyDataWriterWrapper; -class BoundaryCondition; class BoundingBox; enum class Device; class Side; - -class BoundaryCondition -{ -public: - std::vector<uint> indices; - -}; - -class PressureBoundaryCondition : public BoundaryCondition -{ -public: - static SPtr<PressureBoundaryCondition> make(real rho) - { - return SPtr<PressureBoundaryCondition>(new PressureBoundaryCondition(rho)); - } - - SPtr<Side> side; - real rho; -private: - PressureBoundaryCondition(real rho) : rho(rho) - { - - } -}; - -class VelocityBoundaryCondition : public BoundaryCondition -{ -public: - static SPtr<VelocityBoundaryCondition> make(real vx, real vy, real vz) - { - return SPtr<VelocityBoundaryCondition>(new VelocityBoundaryCondition(vx, vy, vz)); - } - - SPtr<Side> side; - real vx, vy, vz; -private: - VelocityBoundaryCondition(real vx, real vy, real vz) : vx(vx), vy(vy), vz(vz) - { - - } -}; - -#define X_INDEX 0 -#define Y_INDEX 1 -#define Z_INDEX 2 - -#define POSITIVE_DIR 1 -#define NEGATIVE_DIR -1 - -class Side -{ -public: - virtual void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) = 0; - virtual void setPeriodicy(SPtr<Grid> grid) = 0; - - virtual int getCoordinate() const = 0; - virtual int getDirection() const = 0; - -protected: - static void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant, real startInner, real endInner, real startOuter, real endOuter) { - for (int v1 = startInner; v1 < endInner; v1 += grid->getDelta()) - { - for (int v2 = startOuter; v2 < endOuter; v2 += grid->getDelta()) - { - uint index = getIndex(grid, coord, constant, v1, v2); - if (grid->getFieldEntry(index) == FLUID) - boundaryCondition->indices.push_back(index); - } - } - } - - static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2) - { - if (coord == "x") - return grid->transCoordToIndex(constant, v1, v2); - if (coord == "y") - return grid->transCoordToIndex(v1, constant, v2); - if (coord == "z") - return grid->transCoordToIndex(v1, v2, constant); - } -}; - -class MX : public Side -{ -public: - void setPeriodicy(SPtr<Grid> grid) override { - grid->setPeriodicityX(false); - } - - void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override { - Side::addIndices(grid, boundaryCondition, "x", grid->getStartX() + grid->getDelta(), grid->getStartY(), grid->getEndY(),grid->getStartZ(), grid->getEndZ()); - } - - int getCoordinate() const override - { - return X_INDEX; - } - - int getDirection() const override - { - return NEGATIVE_DIR; - } -}; - -class PX : public Side -{ -public: - void setPeriodicy(SPtr<Grid> grid) override { - grid->setPeriodicityX(false); - } - - void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override { - Side::addIndices(grid, boundaryCondition, "x", grid->getEndX() - grid->getDelta(), grid->getStartY(), grid->getEndY(), grid->getStartZ(), grid->getEndZ()); - } - - int getCoordinate() const override - { - return X_INDEX; - } - - int getDirection() const override - { - return POSITIVE_DIR; - } -}; - - -class MY : public Side -{ -public: - void setPeriodicy(SPtr<Grid> grid) override { - grid->setPeriodicityY(false); - } - - void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override { - Side::addIndices(grid, boundaryCondition, "y", grid->getStartY() + grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartZ(), grid->getEndZ()); - } - - int getCoordinate() const override - { - return Y_INDEX; - } - - int getDirection() const override - { - return NEGATIVE_DIR; - } -}; - -class PY : public Side -{ -public: - void setPeriodicy(SPtr<Grid> grid) override { - grid->setPeriodicityY(false); - } - - void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override { - Side::addIndices(grid, boundaryCondition, "y", grid->getEndY() - grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartZ(), grid->getEndZ()); - } - - int getCoordinate() const override - { - return Y_INDEX; - } - - int getDirection() const override - { - return POSITIVE_DIR; - } -}; - - -class MZ : public Side -{ -public: - void setPeriodicy(SPtr<Grid> grid) override { - grid->setPeriodicityZ(false); - } - - void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override { - Side::addIndices(grid, boundaryCondition, "z", grid->getStartZ() + grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartY(), grid->getEndY()); - } - - int getCoordinate() const override - { - return Z_INDEX; - } - - int getDirection() const override - { - return NEGATIVE_DIR; - } -}; - -class PZ : public Side -{ -public: - void setPeriodicy(SPtr<Grid> grid) override { - grid->setPeriodicityZ(false); - } - - void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override { - Side::addIndices(grid, boundaryCondition, "z", grid->getEndZ() - grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartY(), grid->getEndY()); - } - - int getCoordinate() const override - { - return Z_INDEX; - } - - int getDirection() const override - { - return POSITIVE_DIR; - } -}; - +class VelocityBoundaryCondition; +class PressureBoundaryCondition; +enum class SideType; class LevelGridBuilder : public GridBuilder { @@ -254,8 +40,8 @@ public: VF_PUBLIC void copyDataFromGpu(); VF_PUBLIC virtual ~LevelGridBuilder(); - VF_PUBLIC void setVelocityBoundaryCondition(SPtr<Side> side, real vx, real vy, real vz); - VF_PUBLIC void setPressureBoundaryCondition(SPtr<Side> side, real rho); + VF_PUBLIC void setVelocityBoundaryCondition(SideType sideType, real vx, real vy, real vz); + VF_PUBLIC void setPressureBoundaryCondition(SideType sideType, real rho); VF_PUBLIC virtual std::shared_ptr<Grid> getGrid(int level, int box); diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index 210aeae6e350a8b0552df0d2541ad88314e99d49..c9c05c39a0868e3abb91da30b9c6db5c0b263da7 100644 --- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -9,6 +9,8 @@ #include <VirtualFluidsBasics/utilities/logger/Logger.h> #include "io/STLReaderWriter/STLWriter.h" #include "io/GridVTKWriter/GridVTKWriter.h" +#include <grid/BoundaryConditions/BoundaryCondition.h> +#include <grid/BoundaryConditions/Side.h> MultipleGridBuilder::MultipleGridBuilder(SPtr<GridFactory> gridFactory, Device device, const std::string &d3qxx) : LevelGridBuilder(device, d3qxx), gridFactory(gridFactory) diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp index 78e6bcece3f636242f51adda901663489d3aedf7..10467ee6d4a5993a290af33e4dbc87b4e2edb1e3 100644 --- a/targets/apps/HULC/main.cpp +++ b/targets/apps/HULC/main.cpp @@ -38,6 +38,7 @@ #include "Output/FileWriter.h" //#include "DataStructureInitializer/GridReaderFiles/GridReader.h" +#include "grid/BoundaryConditions/Side.h" std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath) { @@ -278,13 +279,12 @@ void multipleLevel(const std::string& configPath) gridBuilder->addGeometry(triangularMesh); - - gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new MX()), 0.01, 0.0, 0.0); - gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new PX()), 0.01, 0.0, 0.0); - gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new MY()), 0.01, 0.0, 0.0); - gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new PY()), 0.01, 0.0, 0.0); - gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new MZ()), 0.01, 0.0, 0.0); - gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new PZ()), 0.01, 0.0, 0.0); + gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.01, 0.0, 0.0); + gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.01, 0.0, 0.0); + gridBuilder->setVelocityBoundaryCondition(SideType::MY, 0.01, 0.0, 0.0); + gridBuilder->setVelocityBoundaryCondition(SideType::PY, 0.01, 0.0, 0.0); + gridBuilder->setVelocityBoundaryCondition(SideType::MZ, 0.01, 0.0, 0.0); + gridBuilder->setVelocityBoundaryCondition(SideType::PZ, 0.01, 0.0, 0.0); //gridBuilder->setBoundaryCondition("geometry", BoundaryCondition::VELOCITY);