/* 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 * A helper for initialising 3D boundaries -- generic implementation. */ #ifndef BOUNDARY_CONDITION_3D_HH #define BOUNDARY_CONDITION_3D_HH #include "boundaryCondition3D.h" #include "boundaryInstantiator3D.h" #include "momentaOnBoundaries3D.h" namespace olb { template class RegularizedBoundaryManager3D { public: template static Momenta* getVelocityBoundaryMomenta(); template static Dynamics* getVelocityBoundaryDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getVelocityBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static Momenta* getPressureBoundaryMomenta(); template static Dynamics* getPressureBoundaryDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getPressureBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static PostProcessorGenerator3D* getConvectionBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1, T* uAv=NULL); template static Momenta* getExternalVelocityEdgeMomenta(); template static Dynamics* getExternalVelocityEdgeDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getExternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static Momenta* getInternalVelocityEdgeMomenta(); template static Dynamics* getInternalVelocityEdgeDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getInternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static Momenta* getExternalVelocityCornerMomenta(); template static Dynamics* getExternalVelocityCornerDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getExternalVelocityCornerProcessor(int x, int y, int z); template static Momenta* getInternalVelocityCornerMomenta(); template static Dynamics* getInternalVelocityCornerDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getInternalVelocityCornerProcessor(int x, int y, int z); }; template class InterpolationBoundaryManager3D { public: template static Momenta* getVelocityBoundaryMomenta(); template static Dynamics* getVelocityBoundaryDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getVelocityBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static Momenta* getPressureBoundaryMomenta(); template static Dynamics* getPressureBoundaryDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getPressureBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static PostProcessorGenerator3D* getConvectionBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1, T* uAv=NULL); template static Momenta* getExternalVelocityEdgeMomenta(); template static Dynamics* getExternalVelocityEdgeDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getExternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static Momenta* getInternalVelocityEdgeMomenta(); template static Dynamics* getInternalVelocityEdgeDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getInternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1); template static Momenta* getExternalVelocityCornerMomenta(); template static Dynamics* getExternalVelocityCornerDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getExternalVelocityCornerProcessor(int x, int y, int z); template static Momenta* getInternalVelocityCornerMomenta(); template static Dynamics* getInternalVelocityCornerDynamics(T omega, Momenta& momenta); template static PostProcessorGenerator3D* getInternalVelocityCornerProcessor(int x, int y, int z); }; ////////// RegularizedBoundaryManager3D ///////////////////////////////////////// template template Momenta* RegularizedBoundaryManager3D::getVelocityBoundaryMomenta() { return new RegularizedVelocityBM; } template template Dynamics* RegularizedBoundaryManager3D:: getVelocityBoundaryDynamics(T omega, Momenta& momenta) { return new CombinedRLBdynamics(omega, momenta); } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getVelocityBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return nullptr; } template template Momenta* RegularizedBoundaryManager3D::getPressureBoundaryMomenta() { return new RegularizedPressureBM; } template template Dynamics* RegularizedBoundaryManager3D:: getPressureBoundaryDynamics(T omega, Momenta& momenta) { return new CombinedRLBdynamics(omega, momenta); } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getPressureBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return nullptr; } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getConvectionBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1, T* uAv) { return nullptr; } template template Momenta* RegularizedBoundaryManager3D::getExternalVelocityEdgeMomenta() { return new FixedVelocityBM; } template template Dynamics* RegularizedBoundaryManager3D:: getExternalVelocityEdgeDynamics(T omega, Momenta& momenta) { return new MixinDynamics(omega, momenta); } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getExternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return new OuterVelocityEdgeProcessorGenerator3D(x0,x1, y0,y1, z0,z1); } template template Momenta* RegularizedBoundaryManager3D::getInternalVelocityEdgeMomenta() { return new InnerEdgeVelBM3D; } template template Dynamics* RegularizedBoundaryManager3D:: getInternalVelocityEdgeDynamics(T omega, Momenta& momenta) { return new CombinedRLBdynamics(omega, momenta); } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getInternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return nullptr; } template template Momenta* RegularizedBoundaryManager3D::getExternalVelocityCornerMomenta() { return new FixedVelocityBM; } template template Dynamics* RegularizedBoundaryManager3D:: getExternalVelocityCornerDynamics(T omega, Momenta& momenta) { return new MixinDynamics(omega, momenta); } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getExternalVelocityCornerProcessor(int x, int y, int z) { return new OuterVelocityCornerProcessorGenerator3D (x,y,z); } template template Momenta* RegularizedBoundaryManager3D::getInternalVelocityCornerMomenta() { return new InnerCornerVelBM3D; } template template Dynamics* RegularizedBoundaryManager3D:: getInternalVelocityCornerDynamics(T omega, Momenta& momenta) { return new CombinedRLBdynamics(omega, momenta); } template template PostProcessorGenerator3D* RegularizedBoundaryManager3D:: getInternalVelocityCornerProcessor(int x, int y, int z) { return nullptr; } ////////// InterpolationBoundaryManager3D ///////////////////////////////////////// template template Momenta* InterpolationBoundaryManager3D::getVelocityBoundaryMomenta() { return new BasicDirichletBM; } template template Dynamics* InterpolationBoundaryManager3D:: getVelocityBoundaryDynamics(T omega, Momenta& momenta) { return new MixinDynamics(omega, momenta); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getVelocityBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return new PlaneFdBoundaryProcessorGenerator3D (x0,x1, y0,y1, z0,z1); } template template Momenta* InterpolationBoundaryManager3D::getPressureBoundaryMomenta() { return new BasicDirichletBM; } template template Dynamics* InterpolationBoundaryManager3D:: getPressureBoundaryDynamics(T omega, Momenta& momenta) { return new MixinDynamics(omega, momenta); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getPressureBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return new PlaneFdBoundaryProcessorGenerator3D (x0, x1, y0, y1, z0, z1); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getConvectionBoundaryProcessor(int x0, int x1, int y0, int y1, int z0, int z1, T* uAv) { return new StraightConvectionBoundaryProcessorGenerator3D (x0, x1, y0, y1, z0, z1, uAv); } template template Momenta* InterpolationBoundaryManager3D::getExternalVelocityEdgeMomenta() { return new FixedVelocityBM; } template template Dynamics* InterpolationBoundaryManager3D:: getExternalVelocityEdgeDynamics(T omega, Momenta& momenta) { return new MixinDynamics(omega, momenta); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getExternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return new OuterVelocityEdgeProcessorGenerator3D(x0,x1, y0,y1, z0,z1); } template template Momenta* InterpolationBoundaryManager3D::getInternalVelocityEdgeMomenta() { return new InnerEdgeVelBM3D; } template template Dynamics* InterpolationBoundaryManager3D:: getInternalVelocityEdgeDynamics(T omega, Momenta& momenta) { return new CombinedRLBdynamics(omega, momenta); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getInternalVelocityEdgeProcessor(int x0, int x1, int y0, int y1, int z0, int z1) { return nullptr; } template template Momenta* InterpolationBoundaryManager3D::getExternalVelocityCornerMomenta() { return new FixedVelocityBM; } template template Dynamics* InterpolationBoundaryManager3D:: getExternalVelocityCornerDynamics(T omega, Momenta& momenta) { return new MixinDynamics(omega, momenta); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getExternalVelocityCornerProcessor(int x, int y, int z) { return new OuterVelocityCornerProcessorGenerator3D (x,y,z); } template template Momenta* InterpolationBoundaryManager3D::getInternalVelocityCornerMomenta() { return new InnerCornerVelBM3D; } template template Dynamics* InterpolationBoundaryManager3D:: getInternalVelocityCornerDynamics(T omega, Momenta& momenta) { return new CombinedRLBdynamics(omega, momenta); } template template PostProcessorGenerator3D* InterpolationBoundaryManager3D:: getInternalVelocityCornerProcessor(int x, int y, int z) { return nullptr; } ////////// Convenience wrappers for boundary functions //////////////////////// template void OnLatticeBoundaryCondition3D::addVelocityBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, T omega) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addVelocityBoundary(indicator, x0, x1, y0, y1, z0, z1, omega); } template void OnLatticeBoundaryCondition3D::addVelocityBoundary( BlockIndicatorF3D& indicator, T omega, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addVelocityBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, omega); } template void OnLatticeBoundaryCondition3D::addVelocityBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, T omega, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addVelocityBoundary(indicator, omega, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addSlipBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addSlipBoundary(indicator, x0, x1, y0, y1, z0, z1); } template void OnLatticeBoundaryCondition3D::addSlipBoundary( BlockIndicatorF3D& indicator, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addSlipBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin); } template void OnLatticeBoundaryCondition3D::addSlipBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addSlipBoundary(indicator, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addPartialSlipBoundary( T tuner, BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addPartialSlipBoundary(tuner, indicator, x0, x1, y0, y1, z0, z1); } template void OnLatticeBoundaryCondition3D::addPartialSlipBoundary( T tuner, BlockIndicatorF3D& indicator, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addPartialSlipBoundary(tuner, indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin); } template void OnLatticeBoundaryCondition3D::addPartialSlipBoundary( T tuner, BlockGeometryStructure3D& blockGeometryStructure, int material, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addPartialSlipBoundary(tuner, indicator, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addWallFunctionBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, UnitConverter const& converter, wallFunctionParam const& wallFunctionParam, IndicatorF3D* geoIndicator) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addWallFunctionBoundary(indicator, x0, y1, y0, y1, z0, z1, converter, wallFunctionParam, geoIndicator); } template void OnLatticeBoundaryCondition3D::addWallFunctionBoundary( BlockIndicatorF3D& indicator, UnitConverter const& converter, wallFunctionParam const& wallFunctionParam, IndicatorF3D* geoIndicator, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addWallFunctionBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, converter, wallFunctionParam, geoIndicator); } template void OnLatticeBoundaryCondition3D::addWallFunctionBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, UnitConverter const& converter, wallFunctionParam const& wallFunctionParam, IndicatorF3D* geoIndicator, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addWallFunctionBoundary(indicator, converter, wallFunctionParam, geoIndicator, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addPressureBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, T omega) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addPressureBoundary(indicator, x0, x1, y0, y1, z0, z1, omega); } template void OnLatticeBoundaryCondition3D::addPressureBoundary( BlockIndicatorF3D& indicator, T omega, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addPressureBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, omega); } template void OnLatticeBoundaryCondition3D::addPressureBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, T omega, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addPressureBoundary(indicator, omega, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addConvectionBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addConvectionBoundary(indicator, x0, x1, y0, y1, z0, z1, omega, uAv); } template void OnLatticeBoundaryCondition3D::addConvectionBoundary( BlockIndicatorF3D& indicator, T omega, T* uAv, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addConvectionBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, omega, uAv); } template void OnLatticeBoundaryCondition3D::addConvectionBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, T omega, T* uAv, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addConvectionBoundary(indicator, omega, uAv, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addFreeEnergyWallBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, T addend, int latticeNumber) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addFreeEnergyWallBoundary(indicator, x0, x1, y0, y1, z0, z1, addend, latticeNumber); } template void OnLatticeBoundaryCondition3D::addFreeEnergyWallBoundary( BlockIndicatorF3D& indicator, T addend, int latticeNumber, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addFreeEnergyWallBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, addend, latticeNumber); } template void OnLatticeBoundaryCondition3D::addFreeEnergyWallBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, T addend, int latticeNumber, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addFreeEnergyWallBoundary(indicator, addend, latticeNumber, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addFreeEnergyInletBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, T omega, std::string type, int latticeNumber) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addFreeEnergyInletBoundary(indicator, x0, x1, y0, y1, z0, z1, omega, type, latticeNumber); } template void OnLatticeBoundaryCondition3D::addFreeEnergyInletBoundary( BlockIndicatorF3D& indicator, T omega, std::string type, int latticeNumber, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addFreeEnergyInletBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, omega, type, latticeNumber); } template void OnLatticeBoundaryCondition3D::addFreeEnergyInletBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, T omega, std::string type, int latticeNumber, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addFreeEnergyInletBoundary(indicator, omega, type, latticeNumber, includeOuterCells); } template void OnLatticeBoundaryCondition3D::addFreeEnergyOutletBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, int z0, int z1, T omega, std::string type, int latticeNumber) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addFreeEnergyOutletBoundary(indicator, x0, x1, y0, y1, z0, z1, omega, type, latticeNumber); } template void OnLatticeBoundaryCondition3D::addFreeEnergyOutletBoundary( BlockIndicatorF3D& indicator, T omega, std::string type, int latticeNumber, bool includeOuterCells) { auto& blockGeometryStructure = indicator.getBlockGeometryStructure(); const int margin = includeOuterCells ? 0 : 1; addFreeEnergyOutletBoundary(indicator, margin, blockGeometryStructure.getNx()-1 -margin, margin, blockGeometryStructure.getNy()-1 -margin, margin, blockGeometryStructure.getNz()-1 -margin, omega, type, latticeNumber); } template void OnLatticeBoundaryCondition3D::addFreeEnergyOutletBoundary( BlockGeometryStructure3D& blockGeometryStructure, int material, T omega, std::string type, int latticeNumber, bool includeOuterCells) { BlockIndicatorMaterial3D indicator(blockGeometryStructure, material); addFreeEnergyOutletBoundary(indicator, omega, type, latticeNumber, includeOuterCells); } ////////// Factory functions ////////////////////////////////////////////////// template OnLatticeBoundaryCondition3D* createLocalBoundaryCondition3D(BlockLatticeStructure3D& block) { return new BoundaryConditionInstantiator3D < T, DESCRIPTOR, RegularizedBoundaryManager3D > (block); } template OnLatticeBoundaryCondition3D* createInterpBoundaryCondition3D(BlockLatticeStructure3D& block) { return new BoundaryConditionInstantiator3D < T, DESCRIPTOR, InterpolationBoundaryManager3D > (block); } } // namespace olb #endif