From 64a5c84fe0ba6645ebf5d68c121f34c0a545f02a Mon Sep 17 00:00:00 2001 From: Soeren Peters <peters@irmb.tu-bs.de> Date: Wed, 23 May 2018 10:31:36 +0200 Subject: [PATCH] - move side and BC to new files - create sides with enum in main --- .../BoundaryConditions/BoundaryCondition.cpp | 1 + .../BoundaryConditions/BoundaryCondition.h | 53 +++++ .../grid/BoundaryConditions/Side.cpp | 97 ++++++++ .../grid/BoundaryConditions/Side.h | 180 ++++++++++++++ .../grid/BoundaryConditions/package.include | 0 .../grid/GridBuilder/LevelGridBuilder.cpp | 16 +- .../grid/GridBuilder/LevelGridBuilder.h | 224 +----------------- .../grid/GridBuilder/MultipleGridBuilder.cpp | 2 + targets/apps/HULC/main.cpp | 14 +- 9 files changed, 356 insertions(+), 231 deletions(-) create mode 100644 src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp create mode 100644 src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h create mode 100644 src/GridGenerator/grid/BoundaryConditions/Side.cpp create mode 100644 src/GridGenerator/grid/BoundaryConditions/Side.h create mode 100644 src/GridGenerator/grid/BoundaryConditions/package.include diff --git a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp new file mode 100644 index 000000000..5a530af15 --- /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 000000000..2250a4ea7 --- /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 000000000..01147ead2 --- /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 000000000..cbd28dffe --- /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 000000000..e69de29bb diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 4566982fa..66f9f83d8 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 41964c8c6..ce6626012 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 210aeae6e..c9c05c39a 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 78e6bcece..10467ee6d 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); -- GitLab