-
Anna Wellmann authored
bulkOnly --> split domain
Anna Wellmann authoredbulkOnly --> split domain
MultipleGridBuilder.h 3.43 KiB
#ifndef MULTIPLE_GRID_BUILDER_H
#define MULTIPLE_GRID_BUILDER_H
#include <vector>
#include <array>
#include "GridGenerator_export.h"
#include "Core/LbmOrGks.h"
#include "global.h"
#include "grid/GridBuilder/LevelGridBuilder.h"
#include "grid/GridFactory.h"
class Object;
class BoundingBox;
class MultipleGridBuilder : public LevelGridBuilder
{
private:
GRIDGENERATOR_EXPORT MultipleGridBuilder(SPtr<GridFactory> gridFactory, Device device = Device::CPU, const std::string &d3qxx = "D3Q27");
public:
GRIDGENERATOR_EXPORT static SPtr<MultipleGridBuilder> makeShared(SPtr<GridFactory> gridFactory);
GRIDGENERATOR_EXPORT void addCoarseGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta);
GRIDGENERATOR_EXPORT void addGrid(Object* gridShape);
GRIDGENERATOR_EXPORT void addGrid(Object* gridShape, uint levelFine);
GRIDGENERATOR_EXPORT void addGeometry(Object* gridShape);
GRIDGENERATOR_EXPORT void addGeometry(Object* solidObject, uint level);
GRIDGENERATOR_EXPORT uint getNumberOfLevels() const;
GRIDGENERATOR_EXPORT real getDelta(uint level) const;
GRIDGENERATOR_EXPORT real getStartX(uint level) const;
GRIDGENERATOR_EXPORT real getStartY(uint level) const;
GRIDGENERATOR_EXPORT real getStartZ(uint level) const;
GRIDGENERATOR_EXPORT real getEndX(uint level) const;
GRIDGENERATOR_EXPORT real getEndY(uint level) const;
GRIDGENERATOR_EXPORT real getEndZ(uint level) const;
GRIDGENERATOR_EXPORT std::vector<SPtr<Grid> > getGrids() const;
GRIDGENERATOR_EXPORT void buildGrids(LbmOrGks lbmOrGks, bool enableThinWalls = false);
GRIDGENERATOR_EXPORT void setNumberOfLayers( uint numberOfLayersFine, uint numberOfLayersBetweenLevels );
GRIDGENERATOR_EXPORT void writeGridsToVtk(const std::string& path) const;
GRIDGENERATOR_EXPORT void setSubDomainBox(SPtr<BoundingBox> subDomainBox);
private:
void addGridToList(SPtr<Grid> grid);
real calculateDelta(uint level) const;
bool coarseGridExists() const;
bool isGridInCoarseGrid(SPtr<Grid> grid) const;
void addFineGridToList(uint level, Object* gridShape);
void addIntermediateGridsToList(uint levelDifference, uint levelFine, uint nodesBetweenGrids, Object* gridShape);
void eraseGridsFromListIfInvalid(uint oldSize);
void addGridToListIfValid(SPtr<Grid> grid);
std::array<real, 6> getStaggeredCoordinates(Object* gridShape, uint level, uint levelFine, bool& xOddStart, bool& yOddStart, bool& zOddStart) 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;
SPtr<Grid> makeGrid(Object* gridShape, uint level, uint levelFine);
SPtr<Grid> makeGrid(Object* gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const;
static void emitNoCoarseGridExistsWarning();
static void emitGridIsNotInCoarseGridWarning();
//std::vector<SPtr<Grid> > grids;
SPtr<GridFactory> gridFactory;
Object* solidObject;
uint numberOfLayersFine;
uint numberOfLayersBetweenLevels;
SPtr<BoundingBox> subDomainBox;
public:
GRIDGENERATOR_EXPORT void findCommunicationIndices( int direction, LbmOrGks lbmOrGks );
// needed for CUDA Streams MultiGPU
void findFluidNodes(bool splitDomain);
};
#endif