/* This file is part of the OpenLB library
*
* Copyright (C) 2016-2018 Benjamin Förster, 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 SUPER_INDICATOR_F_3D_HH
#define SUPER_INDICATOR_F_3D_HH
#include
#include "superIndicatorF3D.h"
#include "blockIndicatorF3D.h"
#include "core/util.h"
namespace olb {
template
SuperIndicatorFfromIndicatorF3D::SuperIndicatorFfromIndicatorF3D(
FunctorPtr>&& indicatorF, SuperGeometry3D& geometry)
: SuperIndicatorF3D(geometry),
_indicatorF(std::move(indicatorF))
{
this->getName() = "SuperIndicator_from_" + _indicatorF->getName();
LoadBalancer& load = this->getSuperStructure().getLoadBalancer();
for (int iC = 0; iC < load.size(); ++iC) {
this->_blockF.emplace_back(
new BlockIndicatorFfromIndicatorF3D(
*_indicatorF, geometry.getBlockGeometry(iC))
);
this->_extendedBlockF.emplace_back(
new BlockIndicatorFfromIndicatorF3D(
*_indicatorF, geometry.getExtendedBlockGeometry(iC))
);
}
}
template
bool SuperIndicatorFfromIndicatorF3D::operator() (bool output[], const int input[])
{
T physR[3];
this->_superStructure.getCuboidGeometry().getPhysR(physR, input);
return _indicatorF(output, physR);
}
template
SuperIndicatorFfromSmoothIndicatorF3D::SuperIndicatorFfromSmoothIndicatorF3D(
FunctorPtr>&& indicatorF,
SuperGeometry3D& geometry)
: SuperIndicatorF3D(geometry),
_indicatorF(std::move(indicatorF))
{
this->getName() = "SuperIndicator_from_" + _indicatorF->getName();
LoadBalancer& load = this->getSuperStructure().getLoadBalancer();
for (int iC = 0; iC < load.size(); ++iC) {
this->_blockF.emplace_back(
new BlockIndicatorFfromSmoothIndicatorF3D(
*_indicatorF, geometry.getBlockGeometry(iC))
);
this->_extendedBlockF.emplace_back(
new BlockIndicatorFfromSmoothIndicatorF3D(
*_indicatorF, geometry.getExtendedBlockGeometry(iC))
);
}
}
template
bool SuperIndicatorFfromSmoothIndicatorF3D::operator() (bool output[], const int input[])
{
T physR[3];
T inside[1];
this->_superStructure.getCuboidGeometry().getPhysR(physR, input);
_indicatorF(inside, physR);
return !util::nearZero(inside[0]);
}
template
SuperIndicatorMaterial3D::SuperIndicatorMaterial3D(
SuperGeometry3D& geometry, std::vector materials)
: SuperIndicatorF3D(geometry)
{
const std::string matString = std::accumulate(
materials.begin()+1,
materials.end(),
std::to_string(materials[0]),
[](const std::string& a, int b) {
return a + '_' + std::to_string(b);
});
this->getName() = "SuperIndicator_on_Material_" + matString;
for (int iC = 0; iC < this->_superGeometry.getLoadBalancer().size(); ++iC) {
this->_blockF.emplace_back(
new BlockIndicatorMaterial3D(this->_superGeometry.getBlockGeometry(iC),
materials)
);
this->_extendedBlockF.emplace_back(
new BlockIndicatorMaterial3D(this->_superGeometry.getExtendedBlockGeometry(iC),
materials)
);
}
}
template
SuperIndicatorMaterial3D::SuperIndicatorMaterial3D(
SuperGeometry3D& geometry, std::list materials)
: SuperIndicatorMaterial3D(geometry,
std::vector(materials.begin(), materials.end()))
{ }
template
bool SuperIndicatorMaterial3D::operator() (bool output[], const int input[])
{
output[0] = false;
LoadBalancer& load = this->_superGeometry.getLoadBalancer();
if (!this->_blockF.empty() && load.isLocal(input[0])) {
// query material number of appropriate block indicator
return this->getBlockF(load.loc(input[0]))(output,&input[1]);
}
else {
return false;
}
}
template
SuperIndicatorIdentity3D::SuperIndicatorIdentity3D(FunctorPtr>&& indicatorF)
: SuperIndicatorF3D(indicatorF->getSuperGeometry()),
_indicatorF(std::move(indicatorF))
{
this->getName() = _indicatorF->getName();
for (int iC = 0; iC < _indicatorF->getBlockFSize(); ++iC) {
this->_blockF.emplace_back(
new BlockIndicatorIdentity3D(_indicatorF->getBlockIndicatorF(iC)));
this->_extendedBlockF.emplace_back(
new BlockIndicatorIdentity3D(_indicatorF->getExtendedBlockIndicatorF(iC)));
}
}
template
bool SuperIndicatorIdentity3D::operator()(bool output[], const int input[])
{
return _indicatorF(output, input);
}
} // namespace olb
#endif