/* This file is part of the OpenLB library
*
* Copyright (C) 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 -- header file.
*/
#ifndef BOUNDARY_CONDITION_3D_H
#define BOUNDARY_CONDITION_3D_H
#include "dynamics/dynamics.h"
#include "core/unitConverter.h"
#include "wallFunctionBoundaryPostProcessors3D.h"
#include "functors/lattice/indicator/blockIndicatorF3D.h"
namespace olb {
template
class OnLatticeBoundaryCondition3D {
public:
virtual ~OnLatticeBoundaryCondition3D() { }
virtual void addVelocityBoundary0N(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addVelocityBoundary0P(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addVelocityBoundary1N(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addVelocityBoundary1P(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addVelocityBoundary2N(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addVelocityBoundary2P(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addPressureBoundary0N(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addPressureBoundary0P(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addPressureBoundary1N(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addPressureBoundary1P(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addPressureBoundary2N(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addPressureBoundary2P(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addConvectionBoundary0N(int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv=NULL) =0;
virtual void addConvectionBoundary0P(int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv=NULL) =0;
virtual void addConvectionBoundary1N(int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv=NULL) =0;
virtual void addConvectionBoundary1P(int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv=NULL) =0;
virtual void addConvectionBoundary2N(int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv=NULL) =0;
virtual void addConvectionBoundary2P(int x0, int x1, int y0, int y1, int z0, int z1, T omega, T* uAv=NULL) =0;
virtual void addExternalVelocityEdge0NN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge0NP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge0PN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge0PP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge1NN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge1NP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge1PN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge1PP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge2NN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge2NP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge2PN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityEdge2PP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge0NN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge0NP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge0PN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge0PP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge1NN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge1NP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge1PN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge1PP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge2NN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge2NP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge2PN(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addInternalVelocityEdge2PP(int x0, int x1, int y0, int y1, int z0, int z1, T omega) =0;
virtual void addExternalVelocityCornerNNN(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerNNP(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerNPN(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerNPP(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerPNN(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerPNP(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerPPN(int x, int y, int z, T omega) =0;
virtual void addExternalVelocityCornerPPP(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerNNN(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerNNP(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerNPN(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerNPP(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerPNN(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerPNP(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerPPN(int x, int y, int z, T omega) =0;
virtual void addInternalVelocityCornerPPP(int x, int y, int z, T omega) =0;
/**
* \anchor BCimplI3D
* \name Indicator-accepting boundary condition interfaces
*
* \param indicator Block indicator defining boundary cells
* \param x0,x1,y0,y1,z0,z1 Range of cells to be traversed
* \{
**/
/// Add velocity boundary for indicated cells
/**
* \param omega Omega value of velocity BC
**/
virtual void addVelocityBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega) =0;
/// Add slip boundary for indicated cells
virtual void addSlipBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1) =0;
/// Add partial slip boundary for indicated cells
/**
* \param tuner Value between 0 (=no slip) and 1(=free slip)
**/
virtual void addPartialSlipBoundary(T tuner, BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1) =0;
/// Add pressure boundary for indicated cells
/**
* \param omega Omega value of pressure BC
**/
virtual void addPressureBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega) =0;
/// Add convection boundary for indicated cells
/**
* \param omega Omega value of convection BC
* \param uAv Optional param for post processor
**/
virtual void addConvectionBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega, T* uAv=NULL) =0;
/// Add wall function boundary for indicated cells
/**
* converter, wallFunctionParam and geoIndicator are post processor parameters.
**/
virtual void addWallFunctionBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
UnitConverter const& converter,
wallFunctionParam const& wallFunctionParam,
IndicatorF3D* geoIndicator=NULL) =0;
virtual void addFreeEnergyWallBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
T addend, int latticeNumber) =0;
virtual void addFreeEnergyInletBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega, std::string type, int latticeNumber) =0;
virtual void addFreeEnergyOutletBoundary(BlockIndicatorF3D& indicator,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega, std::string type, int latticeNumber) =0;
///\}
/**
* \name Convenience wrappers for boundary functions
* In practice it is often preferable to define a boundary on a single material
* number instead of instantiating an appropriate indicator by hand.
*
* These convenience functions are simple wrappers around the actual
* \ref BCimplI3D "boundary condition interfaces".
* \{
**/
/// Add velocity boundary for a single material number
void addVelocityBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega);
/// Add velocity boundary for any indicated cells inside the block domain
void addVelocityBoundary(BlockIndicatorF3D& indicator, T omega, bool includeOuterCells=false);
/// Add velocity boundary for any cells of a material number inside the block domain
void addVelocityBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material, T omega, bool includeOuterCells=false);
/// Add slip boundary for a single material number
void addSlipBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1) ;
/// Add slip boundary for any indicated cells inside the block domain
void addSlipBoundary(BlockIndicatorF3D& indicator, bool includeOuterCells=false);
/// Add slip boundary for all cells of a material number inside the block domain
void addSlipBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material, bool includeOuterCells=false);
/// Add partial slip boundary for a single material number
void addPartialSlipBoundary(T tuner, BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1);
/// Add partial slip boundary for any indicated cells inside the block domain
void addPartialSlipBoundary(T tuner, BlockIndicatorF3D& indicator, bool includeOuterCells=false);
/// Add partial slip boundary for all cells of a material number inside the block domain
void addPartialSlipBoundary(T tuner, BlockGeometryStructure3D& blockGeometryStructure, int material, bool includeOuterCells=false);
/// Add pressure boundary for a single material number
void addPressureBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega);
/// Add pressure boundary for any indicated cells inside the block domain
void addPressureBoundary(BlockIndicatorF3D& indicator, T omega, bool includeOuterCells=false);
/// Add pressure boundary for all cells of a material number inside the block domain
void addPressureBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
T omega, bool includeOuterCells=false);
/// Add convection boundary for a single material number
void addConvectionBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega, T* uAv=NULL);
/// Add convection boundary for any indicated cells inside the block domain
void addConvectionBoundary(BlockIndicatorF3D& indicator, T omega, T* uAv=NULL, bool includeOuterCells=false);
/// Add convection boundary for all cells of a material number inside the block domain
void addConvectionBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
T omega, T* uAv=NULL, bool includeOuterCells=false);
/// Add wall function boundary for a single material number
void 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=NULL);
/// Add wall function boundary for any indicated cells inside the block domain
void addWallFunctionBoundary(BlockIndicatorF3D& indicator,
UnitConverter const& converter,
wallFunctionParam const& wallFunctionParam,
IndicatorF3D* geoIndicator=NULL,
bool includeOuterCells=false);
/// Add wall function boundary for all cells of a material number inside the block domain
void addWallFunctionBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
UnitConverter const& converter,
wallFunctionParam const& wallFunctionParam,
IndicatorF3D* geoIndicator=NULL,
bool includeOuterCells=false);
void addFreeEnergyWallBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1, T addend, int latticeNumber);
void addFreeEnergyWallBoundary(BlockIndicatorF3D& indicator,
T addend, int latticeNumber, bool includeOuterCells=false);
void addFreeEnergyWallBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
T addend, int latticeNumber, bool includeOuterCells=false);
void addFreeEnergyInletBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega, std::string type, int latticeNumber);
void addFreeEnergyInletBoundary(BlockIndicatorF3D& indicator, T omega, std::string type,
int latticeNumber, bool includeOuterCells=false);
void addFreeEnergyInletBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
T omega, std::string type, int latticeNumber, bool includeOuterCells=false);
void addFreeEnergyOutletBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1, int z0, int z1,
T omega, std::string type, int latticeNumber);
void addFreeEnergyOutletBoundary(BlockIndicatorF3D& indicator, T omega, std::string type,
int latticeNumber, bool includeOuterCells=false);
void addFreeEnergyOutletBoundary(BlockGeometryStructure3D& blockGeometryStructure, int material,
T omega, std::string type, int latticeNumber, bool includeOuterCells=false);
///\}
virtual void outputOn() =0;
virtual void outputOff() =0;
};
////////// Factory functions //////////////////////////////////////////////////
template>
OnLatticeBoundaryCondition3D* createLocalBoundaryCondition3D(BlockLatticeStructure3D& block);
template>
OnLatticeBoundaryCondition3D* createInterpBoundaryCondition3D(BlockLatticeStructure3D& block);
}
#endif