/* 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 2D cuboid -- header file.
*/
#ifndef CUBOID_2D_H
#define CUBOID_2D_H
#include
#include
#include "io/ostreamManager.h"
#include "core/vector.h"
#include "core/olbDebug.h"
/// All OpenLB code is contained in this namespace.
namespace olb {
/// A regular single 2D cuboid is the basic component of a 2D cuboid
/// structure which defines the grid.
/** A cuboid is given with its left lower corner, the number of nodes
* in the direction x and y and the distance between two nodes.
* Among other 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 Cuboid2D {
private:
/// Global position of the left lower corner of the cuboid
T _globPosX, _globPosY;
/// Distance to the next node
T _delta;
/// Number of nodes in the direction x and y and the refinement Level
int _nX, _nY;
/// 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 a cuboid
Cuboid2D(T globPosX, T globPosY, T delta, int nX, int nY, int refinementLevel=0);
/// Construction of a cuboid vector version
Cuboid2D(Vector origin, T delta, Vector extend, int refinementLevel=0);
/// Copy constructor
Cuboid2D(Cuboid2D const& rhs, int overlap=0);
/// Copy assignment
Cuboid2D& operator=(Cuboid2D const& rhs);
/// Initializes the cuboid
void init(T globPosX, T globPosY, T delta, int nX, int nY, int refinementLevel=0);
/// Read access to left lower corner coordinates
T get_globPosX() const;
T get_globPosY() const;
/// Read only access to left lower corner coordinates
Vector const getOrigin() const;
/// Read 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 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 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;
/// Prints cuboid details
void print() const;
void getPhysR(T physR[2], const int latticeR[2]) const;
void getPhysR(T physR[2], const int& iX, const int& iY) const;
void getLatticeR(int latticeR[2], const T physR[2]) const;
void getLatticeR(int latticeR[2], const Vector& physR) const;
void getFloorLatticeR(const std::vector& physR, std::vector& latticeR) const
{
getFloorLatticeR(&latticeR[0], &physR[0]);
}
void getFloorLatticeR(int latticeR[2], const T physR[2]) const
{
latticeR[0] = (int)floor( (physR[0] - _globPosX)/_delta);
latticeR[1] = (int)floor( (physR[1] - _globPosY)/_delta);
}
/// Returns the number of full cells
size_t getWeight() const;
/// Sets the number of full cells
void setWeight(size_t fullCells);
/// Checks whether a point (globX/globY) is contained in the cuboid
/// extended with an layer of size overlap*delta
bool checkPoint(T globX, T globY, int overlap = 0) const;
/// Checks whether a point (globX/gloxY) 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, int &locX, int &locY, int overlap = 0) const;
/// 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, 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, 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 of the cuboid extended with an layer of size
/// overlap*delta
bool checkInters(T globX0, T globX1, T globY0, T globY1,
int &locX0, int &locX1, int &locY0, int &locY1,
int overlap = 0) const;
/// Divides the cuboid in p*q cuboids and adds them to the given vector
void divide(int p, int q, std::vector > &childrenC) const;
/// Divides the cuboid in p cuboids 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 nX, int nY);
/// Refines the cuboid with given refinement level
void refineToLevel(unsigned int level);
/// Refines one more level
void refineIncrease();
/// Refines one less level
void refineDecrease();
int get_refinementLevel() const;
};
} // namespace olb
#endif