/* This file is part of the OpenLB library * * Copyright (C) 2007, 2014 Mathias J. Krause * E-mail contact: info@openlb.net * The most recent release of OpenLB can be downloaded at * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** \file * The description of a single 3D cuboid -- header file. */ #ifndef CUBOID_3D_H #define CUBOID_3D_H #include #include #include "core/serializer.h" #include "io/ostreamManager.h" #include "functors/analytical/indicator/indicatorF3D.h" /// All OpenLB code is contained in this namespace. namespace olb { template class IndicatorF3D; /// A regular single 3D cuboid is the basic component of a 3D cuboid /// structure which defines the grid. /** A cuboid is given with its left lower corner, the number of nodes * in the direction x, y and z and the distance between two nodes. * Among after useful methods a cuboid can divide itself in a given * number of disjoint subcuboids. The number of nodes at the boundary * is minimized. * * This class is not intended to be derived from. */ template class Cuboid3D final : public Serializable { private: /// Global position of the left lower corner of the cuboid T _globPosX, _globPosY, _globPosZ; /// Distance to the next node T _delta; /// Number of nodes in the direction x and y int _nX, _nY, _nZ; /// Number of full cells size_t _weight; /// refinement level, _delta = _delta0^_refinementLevel int _refinementLevel; /// Specific ostream for the classname in each line mutable OstreamManager clout; public: /// Construction of an empty cuboid at position 0, 0, 0 with delta 0 and nX = nY = nZ = 0 Cuboid3D(); /// Construction of a cuboid Cuboid3D(T globPosX, T globPosY, T globPosZ, T delta, int nX, int nY, int nZ, int refinementLevel=0); /// Construction of a cuboid vector version Cuboid3D(std::vector origin, T delta, std::vector extend, int refinementLevel=0); /// Construction of a cuboid using indicator Cuboid3D(IndicatorF3D& indicatorF, T voxelSize, int refinementLevel=0); /// Copy constructor Cuboid3D(Cuboid3D const& rhs, int overlap=0); /// Copy assignment Cuboid3D& operator=(Cuboid3D const& rhs); /// Initializes the cuboid void init(T globPosX, T globPosY, T globPosZ, T delta, int nX, int nY, int nZ, int refinementLevel=0); //TODO: remove or private /// Read only access to left lower corner coordinates Vector const getOrigin() const; /// Read only access to the distance of cuboid nodes T getDeltaR() const; /// Read access to cuboid width int getNx() const; /// Read access to cuboid height int getNy() const; /// Read access to cuboid depth int getNz() const; /// Read only access to the number of voxels in every dimension Vector const getExtend() const; /// Returns the volume of the cuboid T getPhysVolume() const; /// Returns the actual value of weight (-1 for getLatticeVolume()) int getWeightValue() const; /// Returns the number of full cells size_t getWeight() const; /// Sets the number of full cells void setWeight(size_t fullCells); /// Returns the refinementLevel int getRefinementLevel() const; /// Sets the refinementLevel void setRefinementLevel(int refLevel); /// Returns the number of Nodes in the volume size_t getLatticeVolume() const; /// Returns the perimeter of the cuboid T getPhysPerimeter() const; /// Returns the number of Nodes at the perimeter int getLatticePerimeter() const; /// equal operator bool operator==(const Cuboid3D& rhs) const; /// Number of data blocks for the serializable interface std::size_t getNblock() const override; /// Binary size for the serializer interface std::size_t getSerializableSize() const override; /// \return a pointer to the memory of the current block and its size for the serializable interface bool* getBlock(std::size_t iBlock, std::size_t& sizeBlock, bool loadingMode) override; /// Prints cuboid details void print() const; void getPhysR(T physR[3], const int latticeR[3]) const; void getPhysR(T physR[3], const int& iX, const int& iY, const int& iZ) const; void getLatticeR(int latticeR[3], const T physR[3]) const; void getLatticeR(int latticeR[3], const Vector& physR) const; void getFloorLatticeR(const std::vector& physR, std::vector& latticeR) const; void getFloorLatticeR(int latticeR[3], const T physR[3]) const; /// Checks whether a point (globX/gloxY/globZ) is contained in the cuboid /// extended with an layer of size overlap*delta bool checkPoint(T globX, T globY, T globZ, int overlap = 0) const; //TODO globX-> x + additional interface: with (std::vector physR, int overlap=0) /// Same for physical overlap bool physCheckPoint(T globX, T globY, T globZ, double overlap = 0) const; /// Checks whether a point (globX/gloxY/globZ) is contained and is a node /// in the cuboid extended with an layer of size overlap*delta and /// returns the local active node bool checkPoint(T globX, T globY, T globZ, int &locX, int &locY, int &locZ, int overlap = 0) const; //TODO globX-> x + additional interface: with (std::vector physR, std::vector& latticeR, int overlap=0) /// Checks whether there is an intersection with the cuboid extended /// with an layer of size overlap*delta bool checkInters(T globX0, T globX1, T globY0, T globY1, T globZ0, T globZ1, int overlap = 0) const; /// Checks whether a given point intersects the cuboid extended /// by a layer of size overlap*delta bool checkInters(T globX, T globY, T globZ, int overlap = 0) const; /// Checks whether there is an intersection and returns the local /// active node range which can be empty by means of locX0=1, locX1=0, /// locY0=1, locY1=0, locZ0=1; locZ1=0 of the cuboid extended with an /// layer of size overlap*delta bool checkInters(T globX0, T globX1, T globY0, T globY1, T globZ0, T globZ1, int &locX0, int &locX1, int &locY0, int &locY1, int &locZ0, int &locZ1, int overlap = 0) const; /// Divides the cuboid in p*q*r cuboids of equal volume and add them to the given vector void divide(int p, int q, int r, std::vector > &childrenC) const; /// Divides the cuboid in p cuboids of equal volume and add them to the given vector void divide(int p, std::vector > &childrenC) const; /// resize the cuboid to the passed size void resize(int X, int Y, int Z, int nX, int nY, int nZ); }; } // namespace olb #endif