/* This file is part of the OpenLB library
*
* Copyright (C) 2008 Orestis Malaspinas, Andrea Parmigiani
* 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 2D boundaries -- header file.
*/
#ifndef ADVECTION_DIFFUSION_BOUNDARY_CONDITION_2D_H
#define ADVECTION_DIFFUSION_BOUNDARY_CONDITION_2D_H
#include "momentaOnBoundaries2D.h"
#include "advectionDiffusionMomentaOnBoundaries.h"
#include "dynamics/dynamics.h"
#include "dynamics/advectionDiffusionDynamics.h"
#include "functors/lattice/indicator/blockIndicatorBaseF2D.h"
#include
#include
namespace olb {
template
class sOnLatticeBoundaryCondition2D;
template
class OnLatticeAdvectionDiffusionBoundaryCondition2D {
public:
virtual ~OnLatticeAdvectionDiffusionBoundaryCondition2D() { }
virtual void addTemperatureBoundary0N(int x0, int x1, int y0, int y1,T omega) =0;
virtual void addTemperatureBoundary0P(int x0, int x1, int y0, int y1,T omega) =0;
virtual void addTemperatureBoundary1N(int x0, int x1, int y0, int y1,T omega) =0;
virtual void addTemperatureBoundary1P(int x0, int x1, int y0, int y1,T omega) =0;
virtual void addTemperatureCornerNN(int x, int y, T omega) =0;
virtual void addTemperatureCornerNP(int x, int y, T omega) =0;
virtual void addTemperatureCornerPN(int x, int y, T omega) =0;
virtual void addTemperatureCornerPP(int x, int y, T omega) =0;
BlockLatticeStructure2D& getBlock();
BlockLatticeStructure2D const& getBlock() const;
/// Add temperature boundary for indicated cells in range
virtual void addTemperatureBoundary(BlockIndicatorF2D& indicator,
int x0, int x1, int y0, int y1,
T omega) =0;
/**
* \name Convenience wrappers for temperature boundary functions
* \{
**/
void addTemperatureBoundary(BlockGeometryStructure2D& blockGeometryStructure, int material,
int x0, int x1, int y0, int y1,
T omega);
void addTemperatureBoundary(BlockIndicatorF2D& indicator,
T omega, bool includeOuterCells=false);
void addTemperatureBoundary(BlockGeometryStructure2D& blockGeometryStructure, int material,
T omega, bool includeOuterCells=false);
///\}
/// adds a temperature boundary for one material or a range (x0-x1, y0-y1, z0-z1)
virtual void addRegularizedTemperatureBoundary(BlockIndicatorF2D& indicator, int x0, int x1, int y0, int y1, T omega) =0;
virtual void addRegularizedTemperatureBoundary(BlockGeometryStructure2D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, T omega) =0;
virtual void addRegularizedTemperatureBoundary(BlockIndicatorF2D& indicator, T omega) =0;
virtual void addRegularizedTemperatureBoundary(BlockGeometryStructure2D& blockGeometryStructure, int material, T omega) =0;
virtual void addRegularizedHeatFluxBoundary(BlockIndicatorF2D& indicator, int x0, int x1, int y0, int y1, T omega, T *heatFlux) =0;
virtual void addRegularizedHeatFluxBoundary(BlockGeometryStructure2D& blockGeometryStructure, int material, int x0, int x1, int y0, int y1, T omega, T *heatFlux) =0;
virtual void addRegularizedHeatFluxBoundary(BlockIndicatorF2D& indicator, T omega, T *heatFlux) =0;
virtual void addRegularizedHeatFluxBoundary(BlockGeometryStructure2D& blockGeometryStructure, int material, T omega, T *heatFlux) =0;
};
template
class AdvectionDiffusionBoundaryManager2D {
public:
template static Momenta*
getTemperatureBoundaryMomenta();
template static Dynamics*
getTemperatureBoundaryDynamics(T omega, Momenta& momenta);
template static PostProcessorGenerator2D*
getTemperatureBoundaryProcessor(int x0, int x1, int y0, int y1);
template static Momenta*
getTemperatureCornerMomenta();
template static Dynamics*
getTemperatureCornerDynamics(T omega, Momenta& momenta);
template static PostProcessorGenerator2D*
getTemperatureCornerProcessor(int x, int y);
template static Momenta*
getRegularizedTemperatureBoundaryMomenta();
template static Dynamics*
getRegularizedTemperatureBoundaryDynamics(T omega, Momenta& momenta);
template static PostProcessorGenerator2D*
getRegularizedTemperatureBoundaryProcessor(int x0, int x1, int y0, int y1);
template static Momenta*
getRegularizedTemperatureCornerMomenta();
template static Dynamics*
getRegularizedTemperatureCornerDynamics(T omega, Momenta& momenta);
template static PostProcessorGenerator2D*
getRegularizedTemperatureCornerProcessor(int x, int y);
template static Momenta*
getRegularizedHeatFluxBoundaryMomenta(T *heatFlux);
template static Dynamics*
getRegularizedHeatFluxBoundaryDynamics(T omega, Momenta& momenta);
template static PostProcessorGenerator2D*
getRegularizedHeatFluxBoundaryProcessor(int x0, int x1, int y0, int y1);
template static Momenta*
getRegularizedHeatFluxCornerMomenta();
template static Dynamics*
getRegularizedHeatFluxCornerDynamics(T omega, Momenta& momenta);
template static PostProcessorGenerator2D*
getRegularizedHeatFluxCornerProcessor(int x, int y);
};
////// Factory function for Regularized Thermal BC
/// blockLattice creator
template >
OnLatticeAdvectionDiffusionBoundaryCondition2D*
createAdvectionDiffusionBoundaryCondition2D(BlockLatticeStructure2D& block);
/// superLattice creator, calls createAdvectionDiffusionBoundaryCondidtion3D from above.
template >
void createAdvectionDiffusionBoundaryCondition2D(sOnLatticeBoundaryCondition2D& sBC);
} //namespace olb
#endif