/* This file is part of the OpenLB library * * Copyright (C) 2014 Thomas Henn, 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. */ #ifndef PERIODICBOUNDARY3D_H_ #define PERIODICBOUNDARY3D_H_ #include #include namespace olb { template class PARTICLETYPE> class ParticleSystem3D; /* * Particle boundary based on a cube around the area with material number 1. * Only applicable to rectangles since if a particle leaves the area with * material number 1 it is moved to the opposing side of the area by * newPosition = oldPosition +/- extend(MaterialNumber=1). **/ template class PARTICLETYPE> class PeriodicBoundary3D : public Boundary3D { public: PeriodicBoundary3D(SuperGeometry3D sg, bool x, bool y, bool z); PeriodicBoundary3D(PeriodicBoundary3D& f); virtual ~PeriodicBoundary3D() { }; virtual void applyBoundary(typename std::deque >::iterator& p, ParticleSystem3D& psSys); /// Returns number of particles that moved through the periodic boundary /// Order: x+, x-, y+, y-, z+, z- unsigned int* getJumper(); private: //cube extents with origin (0,0,0) std::vector _minPhys, _maxPhys, _extend; bool _x, _y, _z; unsigned int _jumper[6]; CuboidGeometry3D& _cuboidGeometry; T _overlap; }; template class PARTICLETYPE> PeriodicBoundary3D::PeriodicBoundary3D( SuperGeometry3D sg, bool x, bool y, bool z) : Boundary3D(), _minPhys(3, T()), _maxPhys(3, T()), _extend(3, T()), _x(x), _y(y), _z(z), _cuboidGeometry(sg.getCuboidGeometry()) { _minPhys = sg.getStatistics().getMinPhysR(1); _maxPhys = sg.getStatistics().getMaxPhysR(1); _extend[0] = _maxPhys[0] - _minPhys[0]; _extend[1] = _maxPhys[1] - _minPhys[1]; _extend[2] = _maxPhys[2] - _minPhys[2]; for (int i=0; i<6; ++i) { _jumper[i] = 0; } _overlap = sg.getOverlap(); } template class PARTICLETYPE> void PeriodicBoundary3D::applyBoundary( typename std::deque >::iterator& p, ParticleSystem3D& psSys) { if (_x) { if (p->getPos()[0] > _maxPhys[0]) { p->getPos()[0] -= _extend[0]; ++_jumper[0]; int C = this->_cuboidGeometry.get_iC(p->getPos()[0], p->getPos()[1], p->getPos()[2], _overlap); p->setCuboid(C); } else if (p->getPos()[0] < _minPhys[0]) { p->getPos()[0] += _extend[0]; ++_jumper[1]; int C = this->_cuboidGeometry.get_iC(p->getPos()[0], p->getPos()[1], p->getPos()[2], _overlap); p->setCuboid(C); } } if (_y) { if (p->getPos()[1] > _maxPhys[1]) { p->getPos()[1] -= _extend[1]; ++_jumper[2]; int C = this->_cuboidGeometry.get_iC(p->getPos()[0], p->getPos()[1], p->getPos()[2], _overlap); p->setCuboid(C); } else if (p->getPos()[1] < _minPhys[1]) { p->getPos()[1] += _extend[1]; ++_jumper[3]; int C = this->_cuboidGeometry.get_iC(p->getPos()[0], p->getPos()[1], p->getPos()[2], _overlap); p->setCuboid(C); } } if (_z) { if (p->getPos()[2] > _maxPhys[2]) { p->getPos()[2] -= _extend[2]; ++_jumper[4]; int C = this->_cuboidGeometry.get_iC(p->getPos()[0], p->getPos()[1], p->getPos()[2], _overlap); p->setCuboid(C); } else if (p->getPos()[2] < _minPhys[2]) { p->getPos()[2] += _extend[2]; ++_jumper[5]; int C = this->_cuboidGeometry.get_iC(p->getPos()[0], p->getPos()[1], p->getPos()[2], _overlap); p->setCuboid(C); } } } template class PARTICLETYPE> unsigned int* PeriodicBoundary3D::getJumper() { return _jumper; } } #endif