/* This file is part of the OpenLB library * * Copyright (C) 2012-2017 Lukas Baron, Mathias J. Krause, * Albert Mink, Adrian Kummeränder * 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_3D_HH #define BLOCK_LATTICE_INTEGRAL_F_3D_HH #include #include #include "blockLatticeIntegralF3D.h" #include "blockLatticeLocalF3D.h" #include "blockGeometryFaces3D.h" #include "blockCalcF3D.h" // for IdentityF #include "core/blockLattice3D.h" #include "core/olbDebug.h" namespace olb { template BlockL1Norm3D::BlockL1Norm3D(BlockLatticeF3D& f, BlockGeometry3D& blockGeometry, int material) : BlockLatticeF3D(f.getBlockLattice(),f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "L1("+_f.getName()+")"; } template bool BlockL1Norm3D::operator() (T output[], const int input[]) { BlockIdentity3D ff(_f); // exists only to prevent f from being deleted T outputTmp[this->getTargetDim()]; for (int i = 0; i < this->getTargetDim(); ++i) { output[i] = T(0); for (int iX = 0; iX < _f.getBlockLattice().getNx(); ++iX) { for (int iY = 0; iY < _f.getBlockLattice().getNy(); ++iY) { for (int iZ = 0; iZ < _f.getBlockLattice().getNz(); ++iZ) { if (this->_blockGeometry.getMaterial(iX, iY, iZ) == _material) { _f(outputTmp,iX, iY, iZ); T tmp = fabs(outputTmp[i]); if (tmp > output[i]) { output[i] = tmp; } } } } } } return true; } template BlockL223D::BlockL223D(BlockLatticeF3D& f, BlockGeometry3D& blockGeometry, int material) : BlockLatticeF3D(f.getBlockLattice(),f.getTargetDim()), _f(f), _blockGeometry(blockGeometry), _material(material) { this->getName() = "L22("+f.getName()+")"; } template bool BlockL223D::operator() (T output[], const int input[]) { // f.getBlockLattice().communicate(); // CuboidGeometry3D& cGeometry = f.getBlockLattice().get_cGeometry(); // loadBalancer& load = f.getBlockLattice().get_load(); output[0]=0; // for (int i=0; in; i++) { // for (int iC=0; iCblockGeometry.getDeltaR(),3); // for (int iX=0; iXblockGeometry.get_material(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 BlockLatticePhysDrag3D::BlockLatticePhysDrag3D( BlockLatticeStructure3D& blockLattice, BlockIndicatorF3D& indicatorF, const UnitConverter& converter) : BlockLatticePhysF3D(blockLattice, converter, 3), _indicatorF(indicatorF), _facesF(indicatorF, converter.getConversionFactorLength()), _pBoundForceF(blockLattice, indicatorF, converter), _sumF(_pBoundForceF, indicatorF), _factor(2./( converter.getPhysDensity()*converter.getCharPhysVelocity()*converter.getCharPhysVelocity() )) { this->getName() = "physDrag"; } template bool BlockLatticePhysDrag3D::operator() (T output[], const int input[]) { T faces[7] = { }; T sum[4] = { }; _sumF(sum, input); _facesF(faces, input); output[0] = _factor * sum[0] / faces[0]; output[1] = _factor * sum[1] / faces[1]; output[2] = _factor * sum[2] / faces[2]; return true; } template BlockLatticePhysCorrDrag3D::BlockLatticePhysCorrDrag3D( BlockLatticeStructure3D& blockLattice, BlockIndicatorF3D& indicatorF, const UnitConverter& converter) : BlockLatticePhysF3D(blockLattice, converter, 3), _indicatorF(indicatorF), _facesF(indicatorF, converter.getConversionFactorLength()), _pBoundForceF(blockLattice, indicatorF, converter), _sumF(_pBoundForceF, indicatorF), _factor(2./( converter.getPhysDensity()*converter.getCharPhysVelocity()*converter.getCharPhysVelocity() )) { this->getName() = "physCorrDrag"; } template bool BlockLatticePhysCorrDrag3D::operator() (T output[], const int input[]) { T faces[7] = { }; T sum[4] = { }; _facesF(faces, input); _sumF(sum, input); output[0] = _factor * sum[0] / faces[0]; output[1] = _factor * sum[1] / faces[1]; output[2] = _factor * sum[2] / faces[2]; return true; } } // end namespace olb #endif