/* This file is part of the OpenLB library * * Copyright (C) 2006, 2007 Jonas Latt * 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 * Implementation of boundary cell dynamics -- generic implementation. */ #ifndef MOMENTA_ON_BOUNDARIES_HH #define MOMENTA_ON_BOUNDARIES_HH #include "momentaOnBoundaries.h" #include "core/util.h" #include "dynamics/lbHelpers.h" namespace olb { ////////////////////// Class EquilibriumBM ////////////////////// template EquilibriumBM::EquilibriumBM() { _rho = (T)1; for (int iD=0; iD EquilibriumBM::EquilibriumBM(T rho, const T u[DESCRIPTOR::d]) { _rho = rho; for (int iD=0; iD T EquilibriumBM::computeRho( Cell const& cell ) const { return _rho; } template void EquilibriumBM::computeU( Cell const& cell, T u[DESCRIPTOR::d]) const { for (int iD=0; iD void EquilibriumBM::computeJ ( Cell const& cell, T j[DESCRIPTOR::d]) const { for (int iD=0; iD void EquilibriumBM::computeStress( Cell const& cell, T rho, const T u[DESCRIPTOR::d], T pi[util::TensorVal::n] ) const { for (int iPi=0; iPi::n; ++iPi) { pi[iPi] = T(); } } template void EquilibriumBM::defineRho( Cell& cell, T rho ) { _rho = rho; } template void EquilibriumBM::defineU( Cell& cell, const T u[DESCRIPTOR::d]) { for (int iD=0; iD void EquilibriumBM::defineAllMomenta( Cell& cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal::n] ) { defineRho(cell, rho); defineU(cell, u); } ////////////////////// Class VelocityBM ////////////////////// template VelocityBM::VelocityBM() { for (int iD=0; iD VelocityBM::VelocityBM(const T u[DESCRIPTOR::d]) { for (int iD=0; iD T VelocityBM::computeRho( Cell const& cell ) const { return velocityBMRho(cell, _u); } template void VelocityBM::computeU ( Cell const& cell, T u[DESCRIPTOR::d]) const { computeU(u); } template void VelocityBM::computeJ ( Cell const& cell, T j[DESCRIPTOR::d]) const { T rho = computeRho(cell); for (int iD=0; iD void VelocityBM::computeU( T u[DESCRIPTOR::d] ) const { for (int iD=0; iD void VelocityBM::defineRho(Cell& cell, T rho ) { } template void VelocityBM::defineU ( Cell& cell, const T u[DESCRIPTOR::d]) { defineU(u); } template void VelocityBM::defineU(const T u[DESCRIPTOR::d]) { for (int iD=0; iD void VelocityBM::defineAllMomenta ( Cell& cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal::n] ) { this->defineRhoU(cell, rho, u); } ////////////////////// Class PressureBM ////////////////////// template PressureBM::PressureBM() { for (int iD=0; iD PressureBM::PressureBM(const T values[DESCRIPTOR::d]) { for (int iD=0; iD T PressureBM::computeRho( Cell const& cell ) const { return computeRho(); } template T PressureBM::computeRho() const { return _values[direction]; } template void PressureBM::computeU ( Cell const& cell, T u[DESCRIPTOR::d]) const { for (int iD=0; iD const& onWallIndices = util::subIndex(); std::vector const& normalIndices = util::subIndex(); T rhoOnWall = T(); for (auto & e : onWallIndices) { rhoOnWall += cell[e]; } T rhoNormal = T(); for (auto & e : normalIndices) { rhoNormal += cell[e]; } u[direction] = (T)orientation*( ((T)2*rhoNormal+rhoOnWall+(T)1 ) / rho-(T)1 ); } template void PressureBM::computeJ ( Cell const& cell, T j[DESCRIPTOR::d]) const { computeU(cell, j); T rho = computeRho(cell); for (int iD=0; iD void PressureBM::defineRho(Cell& cell, T rho) { defineRho(rho); } template void PressureBM::defineRho(T rho ) { _values[direction] = rho; } template void PressureBM::defineU(Cell& cell, const T u[DESCRIPTOR::d]) { for (int iD=0; iD void PressureBM::defineAllMomenta( Cell& cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal::n] ) { this->defineRhoU(cell, rho, u); } //////// FreeStressBM ////////////////////////////////////////////// template void FreeStressBM::computeStress ( Cell const& cell, T rho, const T u[DESCRIPTOR::d], T pi[util::TensorVal::n] ) const { lbHelpers::computeStress(cell, rho, u, pi); } ////////////////////// Class RegularizedBM ////////////////////// template void RegularizedBM::computeStress ( Cell const& cell, T rho, const T u[DESCRIPTOR::d], T pi[util::TensorVal::n] ) const { BoundaryHelpers::computeStress(cell, rho, u, pi); } ////////////////////// Class FixedVelocityBM ////////////////////////// template T FixedVelocityBM::computeRho(Cell const& cell) const { return _basicMomenta.computeRho(cell); } template void FixedVelocityBM::computeU(Cell const& cell, T u[DESCRIPTOR::d]) const { for (int iD=0; iD void FixedVelocityBM::computeJ(Cell const& cell, T j[DESCRIPTOR::d]) const { T rho = computeRho(cell); for (int iD=0; iD void FixedVelocityBM::computeStress ( Cell const& cell, T rho, const T u[DESCRIPTOR::d], T pi[util::TensorVal::n] ) const { _basicMomenta.computeStress(cell, rho, u, pi); } template void FixedVelocityBM::computeRhoU ( Cell const& cell, T& rho, T u[DESCRIPTOR::d] ) const { rho = computeRho(cell); computeU(cell,u); } template void FixedVelocityBM::computeAllMomenta ( Cell const& cell, T& rho, T u[DESCRIPTOR::d], T pi[util::TensorVal::n] ) const { _basicMomenta.computeAllMomenta(cell, rho, u, pi); computeU(cell, u); } template void FixedVelocityBM::defineRho(Cell& cell, T rho) { _basicMomenta.defineRho(cell, rho); } template void FixedVelocityBM::defineU(Cell& cell, const T u[DESCRIPTOR::d]) { for (int iD=0; iD void FixedVelocityBM::defineRhoU(Cell& cell, T rho, const T u[DESCRIPTOR::d]) { defineRho(cell,rho); defineU(cell,u); } template void FixedVelocityBM::defineAllMomenta( Cell& cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal::n] ) { _basicMomenta.defineAllMomenta(cell, rho, u, pi); defineU(cell,u); } ////////////////////// Extracted helper functions ////////////////////////// template T velocityBMRho( Cell const& cell, const T* u ) { std::vector const& onWallIndices = util::subIndex(); std::vector const& normalIndices = util::subIndex(); T rhoOnWall = T(); for (auto & e : onWallIndices) { rhoOnWall += cell[e]; } T rhoNormal = T(); for (auto & e : normalIndices) { rhoNormal += cell[e]; } T rho =((T)2*rhoNormal+rhoOnWall+(T)1) / ((T)1+(T)orientation*u[direction]); return rho; } } // namespace olb #endif