From 94d3e79a8617f88dc0219cfdeedfa3147833719d Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 24 Jun 2019 14:43:36 +0200 Subject: Initialize at openlb-1-3 --- .../lattice/indicator/blockIndicatorF2D.hh | 215 +++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 src/functors/lattice/indicator/blockIndicatorF2D.hh (limited to 'src/functors/lattice/indicator/blockIndicatorF2D.hh') diff --git a/src/functors/lattice/indicator/blockIndicatorF2D.hh b/src/functors/lattice/indicator/blockIndicatorF2D.hh new file mode 100644 index 0000000..8d01a6b --- /dev/null +++ b/src/functors/lattice/indicator/blockIndicatorF2D.hh @@ -0,0 +1,215 @@ +/* This file is part of the OpenLB library + * + * Copyright (C) 2017 Adrian Kummerlaender + * 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_INDICATOR_F_2D_HH +#define BLOCK_INDICATOR_F_2D_HH + +#include + +#include "blockIndicatorF2D.h" +#include "core/util.h" + +namespace olb { + +template +BlockIndicatorFfromIndicatorF2D::BlockIndicatorFfromIndicatorF2D( + IndicatorF2D& indicatorF, BlockGeometryStructure2D& blockGeometry) + : BlockIndicatorF2D(blockGeometry), + _indicatorF(indicatorF) +{ } + +template +bool BlockIndicatorFfromIndicatorF2D::operator() (bool output[], const int input[]) +{ + T physR[2]; + this->_blockGeometryStructure.getPhysR(physR,input); + return _indicatorF(output,physR); +} + +template +Vector BlockIndicatorFfromIndicatorF2D::getMin() +{ + const Vector min = _indicatorF.getMin(); + return Vector { + static_cast(floor(min[0])), + static_cast(floor(min[1])) + }; +} + +template +Vector BlockIndicatorFfromIndicatorF2D::getMax() +{ + const Vector max = _indicatorF.getMax(); + return Vector { + static_cast(ceil(max[0])), + static_cast(ceil(max[1])) + }; +} + + +template +BlockIndicatorFfromSmoothIndicatorF2D::BlockIndicatorFfromSmoothIndicatorF2D( + SmoothIndicatorF2D& indicatorF, BlockGeometryStructure2D& blockGeometry) + : BlockIndicatorF2D(blockGeometry), + _indicatorF(indicatorF) +{ } + +template +bool BlockIndicatorFfromSmoothIndicatorF2D::operator() (bool output[], const int input[]) +{ + T physR[2]; + T inside[1]; + this->_blockGeometryStructure.getPhysR(physR,input); + _indicatorF(inside, physR); + return !util::nearZero(inside[0]); +} + +template +Vector BlockIndicatorFfromSmoothIndicatorF2D::getMin() +{ + return Vector{0,0}; +} + +template +Vector BlockIndicatorFfromSmoothIndicatorF2D::getMax() +{ + return this->_blockGeometryStructure.getExtend() - Vector{1,1}; +} + + +template +BlockIndicatorMaterial2D::BlockIndicatorMaterial2D( + BlockGeometryStructure2D& blockGeometry, std::vector materials) + : BlockIndicatorF2D(blockGeometry), + _materials(materials) +{ } + +template +BlockIndicatorMaterial2D::BlockIndicatorMaterial2D( + BlockGeometryStructure2D& blockGeometry, std::list materials) + : BlockIndicatorMaterial2D(blockGeometry, + std::vector(materials.begin(), materials.end())) +{ } + +template +BlockIndicatorMaterial2D::BlockIndicatorMaterial2D( + BlockGeometryStructure2D& blockGeometry, int material) + : BlockIndicatorMaterial2D(blockGeometry, std::vector(1,material)) +{ } + +template +bool BlockIndicatorMaterial2D::operator() (bool output[], const int input[]) +{ + // read material number explicitly using the const version + // of BlockGeometry2D::get to avoid resetting geometry + // statistics: + const BlockGeometryStructure2D& blockGeometry = this->_blockGeometryStructure; + const int current = blockGeometry.get(input[0], input[1]); + output[0] = std::any_of(_materials.cbegin(), + _materials.cend(), + [current](int material) { return current == material; }); + + return true; +} + +template +bool BlockIndicatorMaterial2D::isEmpty() +{ + auto& statistics = this->getBlockGeometryStructure().getStatistics(); + + return std::none_of(_materials.cbegin(), _materials.cend(), + [&statistics](int material) -> bool { + return statistics.getNvoxel(material) > 0; + }); +} + +template +Vector BlockIndicatorMaterial2D::getMin() +{ + auto& blockGeometry = this->getBlockGeometryStructure(); + auto& statistics = blockGeometry.getStatistics(); + + Vector globalMin{ + blockGeometry.getNx()-1, + blockGeometry.getNy()-1 + }; + + for ( int material : _materials ) { + if ( statistics.getNvoxel(material) > 0 ) { + const Vector localMin = statistics.getMinLatticeR(material); + for ( int d = 0; d < 2; ++d ) { + globalMin[d] = localMin[d] < globalMin[d] ? localMin[d] : globalMin[d]; + } + } + } + + return globalMin; +} + +template +Vector BlockIndicatorMaterial2D::getMax() +{ + auto& statistics = this->getBlockGeometryStructure().getStatistics(); + + Vector globalMax{ 0, 0 }; + + for ( int material : _materials ) { + if ( statistics.getNvoxel(material) > 0 ) { + const Vector localMax = statistics.getMaxLatticeR(material); + for ( int d = 0; d < 2; ++d ) { + globalMax[d] = localMax[d] > globalMax[d] ? localMax[d] : globalMax[d]; + } + } + } + + return globalMax; +} + + +template +BlockIndicatorIdentity2D::BlockIndicatorIdentity2D(BlockIndicatorF2D& indicatorF) + : BlockIndicatorF2D(indicatorF.getBlockGeometryStructure()), + _indicatorF(indicatorF) +{ } + +template +bool BlockIndicatorIdentity2D::operator() (bool output[], const int input[]) +{ + return _indicatorF(output, input); +} + +template +Vector BlockIndicatorIdentity2D::getMin() +{ + return _indicatorF.getMin(); +} + +template +Vector BlockIndicatorIdentity2D::getMax() +{ + return _indicatorF.getMax(); +} + +} // namespace olb + +#endif -- cgit v1.2.3