Skip to content
Snippets Groups Projects
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