/* This file is part of the OpenLB library * * Copyright (C) 2012 Lukas Baron, Mathias J. Krause, Albert Mink * 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 BLOCK_LATTICE_INTEGRAL_F_2D_HH #define BLOCK_LATTICE_INTEGRAL_F_2D_HH #include #include #include "blockLatticeIntegralF2D.h" #include "blockLatticeLocalF2D.h" #include "blockCalcF2D.h" // for IdentityF #include "utilities/vectorHelpers.h" #include "indicator/blockIndicatorBaseF2D.h" namespace olb { template BlockMax2D::BlockMax2D(BlockLatticeF2D& f, BlockGeometry2D& blockGeometry, int material) : BlockLatticeF2D(f.getBlockLattice(), f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "Max("+_f.getName()+")"; } template bool BlockMax2D::operator() (T output[], const int input[]) { // f.getBlockLattice2D().communicate(); // CuboidGeometry2D& cGeometry = f.getBlockLattice2D().get_cGeometry(); // loadBalancer& load = f.getBlockLattice2D().get_load(); for (int i=0; igetTargetDim(); ++i) { output[i]=T(); // for (int iC=0; iC tmp[i]) { // tmp[i]=fabs(f(load.glob(iC),iX,iY,iZ)[i]); // } // } // } // } // } // } //#ifdef PARALLEL_MODE_MPI // singleton::mpi().reduceAndBcast(tmp[i], MPI_MAX); //#endif } return true; } template BlockSum2D::BlockSum2D(BlockLatticeF2D& f, BlockGeometry2D& blockGeometry, int material) : BlockLatticeF2D(f.getBlockLattice(),f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "Sum("+_f.getName()+")"; } template bool BlockSum2D::operator() (T output[], const int input[]) { BlockIdentity2D ff(_f); // exists only to prevent f from being deleted for (int i=0; igetTargetDim(); ++i) { output[i]=T(); // int nX = f.getBlockLattice2D().getNx(); // int nY = f.getBlockLattice2D().getNy(); // int nZ = f.getBlockLattice2D().getNz(); // for (int iX=0; iXBlockGeometry.getMaterial(iX, iY, iZ) == material) { // tmp[i]+=f(iX,iY,iZ)[i]; // } // } // } // } } return true; } template BlockIntegral2D::BlockIntegral2D(BlockLatticeF2D& f, BlockGeometry2D& blockGeometry, int material) : BlockLatticeF2D(f.getBlockLattice(),f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "Integral("+_f.getName()+")"; } template bool BlockIntegral2D::operator() (T output[], const int input[]) { // f.getBlockLattice2D().communicate(); // CuboidGeometry2D& cGeometry = f.getBlockLattice2D().get_cGeometry(); // loadBalancer& load = f.getBlockLattice2D().get_load(); output[0]=T(); // for (int i=0; in; i++) { // for (int iC=0; iCBlockGeometry.getDeltaR(),3); // for (int iX=0; iXBlockGeometry.getMaterial(globX, globY, globZ) == material) { // tmp[i]+=f(load.glob(iC),iX,iY,iZ)[i]*weight; // } // } // } // } // } //#ifdef PARALLEL_MODE_MPI // singleton::mpi().reduceAndBcast(tmp[i], MPI_SUM); //#endif // } return true; } template BlockL1Norm2D::BlockL1Norm2D(BlockLatticeF2D& f, BlockGeometry2D& blockGeometry, int material) : BlockLatticeF2D(f.getBlockLattice(),f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "L1("+_f.getName()+")"; } template bool BlockL1Norm2D::operator() (T output[], const int input[]) { // f.getBlockLattice2D().communicate(); // CuboidGeometry2D& cGeometry = f.getBlockLattice2D().get_cGeometry(); // loadBalancer& load = f.getBlockLattice2D().get_load(); // int numVoxels(0); output[0]=T(); // for (int i=0; in; i++) { // for (int iC=0; iCBlockGeometry.getMaterial(globX, globY, globZ) == material) { // tmp[i]+=fabs(f(load.glob(iC),iX,iY,iZ)[i]); // numVoxels++; // } // } // } // } // } //#ifdef PARALLEL_MODE_MPI // singleton::mpi().reduceAndBcast(tmp[i], MPI_SUM); //#endif // } //#ifdef PARALLEL_MODE_MPI // singleton::mpi().reduceAndBcast(numVoxels, MPI_SUM); //#endif return true; } template BlockL222D::BlockL222D(BlockLatticeF2D& f, BlockGeometry2D& blockGeometry, int material) : BlockLatticeF2D(f.getBlockLattice(),f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "L22("+_f.getName()+")"; } template bool BlockL222D::operator() (T output[], const int input[]) { // f.getBlockLattice2D().communicate(); // CuboidGeometry2D& cGeometry = f.getBlockLattice2D().get_cGeometry(); // loadBalancer& load = f.getBlockLattice2D().get_load(); output[0]=T(); // for (int i=0; in; i++) { // for (int iC=0; iCBlockGeometry.getDeltaR(),3); // for (int iX=0; iXBlockGeometry.getMaterial(globX, globY, globZ) == material) { // tmp[i]+=f(load.glob(iC),iX,iY,iZ)[i]*f(load.glob(iC),iX,iY,iZ)[i]*weight; // } // } // } // } // } //#ifdef PARALLEL_MODE_MPI // singleton::mpi().reduceAndBcast(tmp[i], MPI_SUM); //#endif // } return true; } template template BlockGeometryFaces2D::BlockGeometryFaces2D(BlockGeometryStructure2D& blockGeometry, int material, const UnitConverter& converter) : GenericF(7,4), _blockGeometry(blockGeometry), _material(material), _latticeL(converter.getConversionFactorLength()) { this->getName() = "blockGeometryFaces"; } template BlockGeometryFaces2D::BlockGeometryFaces2D(BlockGeometryStructure2D& blockGeometry, int material, T latticeL) : GenericF(7,4), _blockGeometry(blockGeometry), _material(material), _latticeL(latticeL) { this->getName() = "blockGeometryFaces"; } template bool BlockGeometryFaces2D::operator() (T output[], const int input[]) { int counter[7] = {0,0,0,0,0,0,0}; if (_blockGeometry.getStatistics().getNvoxel(_material)!=0) { const int x0 = _blockGeometry.getStatistics().getMinLatticeR(_material)[0]; const int y0 = _blockGeometry.getStatistics().getMinLatticeR(_material)[1]; const int x1 = _blockGeometry.getStatistics().getMaxLatticeR(_material)[0]; const int y1 = _blockGeometry.getStatistics().getMaxLatticeR(_material)[1]; // Iterate over all cells and count the cells of the face for (int iX = x0; iX <= x1; ++iX) { for (int iY = y0; iY <= y1; ++iY) { // Lock at solid nodes only if (_blockGeometry.getMaterial(iX, iY) == _material) { if (_blockGeometry.getMaterial(iX-1, iY) == 1) { counter[0]++; } if (_blockGeometry.getMaterial(iX, iY-1) == 1) { counter[1]++; } if (_blockGeometry.getMaterial(iX+1, iY) == 1) { counter[3]++; } if (_blockGeometry.getMaterial(iX, iY+1) == 1) { counter[4]++; } } } } T dx2 = _latticeL*_latticeL; T total = T(); for (int i=0; i<6; ++i) { output[i]=(T) counter[i] * dx2; total+=(T) counter[i] * dx2; } output[6]=total; return true; } else { for (int i=0; i<7; ++i) { output[i]=T(); } return true; } return false; } template BlockGeometryFacesIndicator2D::BlockGeometryFacesIndicator2D(BlockGeometryStructure2D& blockGeometry, SmoothIndicatorF2D& indicator, int material, T latticeL) : GenericF(7,0), _blockGeometry(blockGeometry), _indicator(indicator), _material(material), _latticeL(latticeL) { this->getName() = "facesInd"; } template bool BlockGeometryFacesIndicator2D::operator() (T output[], const int input[]) { int counter[7] = {0,0,0,0,0,0,0}; T inside[1]; T physR[2]; if (_blockGeometry.getStatistics().getNvoxel(_material)!=0) { const int x0 = _blockGeometry.getStatistics().getMinLatticeR(_material)[0]; const int y0 = _blockGeometry.getStatistics().getMinLatticeR(_material)[1]; const int x1 = _blockGeometry.getStatistics().getMaxLatticeR(_material)[0]; const int y1 = _blockGeometry.getStatistics().getMaxLatticeR(_material)[1]; // Iterate over all cells and count the cells of the face for (int iX = x0; iX <= x1; ++iX) { for (int iY = y0; iY <= y1; ++iY) { // Look at solid nodes only _blockGeometry.getPhysR(physR, iX, iY); _indicator(inside, physR); if ( !util::nearZero(inside[0]) ) { _blockGeometry.getPhysR(physR, iX-1, iY); _indicator(inside, physR); if ( !util::nearZero(inside[0]) ) { counter[0]++; } _blockGeometry.getPhysR(physR, iX, iY-1); _indicator(inside, physR); if ( !util::nearZero(inside[0]) ) { counter[1]++; } _blockGeometry.getPhysR(physR, iX+1, iY); _indicator(inside, physR); if ( !util::nearZero(inside[0]) ) { counter[3]++; } _blockGeometry.getPhysR(physR, iX, iY+1); _indicator(inside, physR); if ( !util::nearZero(inside[0]) ) { counter[4]++; } } } } T total = T(); for (int i=0; i<6; ++i) { output[i]=(T) counter[i] * _latticeL; total+=(T) counter[i] * _latticeL; } output[6]=total; return true; } else { for (int i=0; i<7; ++i) { output[i]=T(); } return true; } return false; } template BlockLatticePhysDrag2D::BlockLatticePhysDrag2D (BlockLattice2D& blockLattice, BlockGeometry2D& blockGeometry, int material, const UnitConverter& converter) : BlockLatticePhysF2D(blockLattice,converter,2), _blockGeometry(blockGeometry), _material(material) { this->getName() = "physDrag"; } template bool BlockLatticePhysDrag2D::operator() (T output[], const int input[]) { BlockGeometryFaces2D faces(_blockGeometry, _material, this->_converter); BlockIndicatorMaterial2D indicator(_blockGeometry, _material); BlockLatticePhysBoundaryForce2D fTemp(this->_blockLattice, indicator, this->_converter); BlockSum2D sumF(fTemp, _blockGeometry, _material); T factor = 2. / (this->_converter.getPhysDensity() * this->_converter.getCharPhysVelocity() * this->_converter.getCharPhysVelocity()); T outputSumF[2] = { T() }; sumF(outputSumF,input); T outputFaces[2] = { T() }; faces(outputFaces,input); output[0] = factor * outputSumF[0] / outputFaces[0]; output[1] = factor * outputSumF[1] / outputFaces[1]; return true; } template BlockLatticePhysCorrDrag2D::BlockLatticePhysCorrDrag2D (BlockLattice2D& blockLattice, BlockGeometry2D& blockGeometry, int material, const UnitConverter& converter) : BlockLatticePhysF2D(blockLattice,converter,2), _blockGeometry(blockGeometry), _material(material) { this->getName() = "physCorrDrag"; } template bool BlockLatticePhysCorrDrag2D::operator() (T output[], const int input[]) { BlockGeometryFaces2D faces(_blockGeometry, _material, this->_converter); BlockLatticePhysCorrBoundaryForce2D tTemp(this->_blockLattice, _blockGeometry, _material, this->_converter); BlockSum2D sumF(tTemp, _blockGeometry, _material); T factor = 2. / (this->_converter.getPhysDensity() * this->_converter.getCharPhysVelocity() * this->_converter.getCharPhysVelocity()); T outputSumF[2] = { T() }; sumF(outputSumF,input); T outputFaces[2] = { T() }; faces(outputFaces,input); output[0] = factor * outputSumF[0] / outputFaces[0]; output[1] = factor * outputSumF[1] / outputFaces[1]; return true; } } // end namespace olb #endif