/* This file is part of the OpenLB library * * Copyright (C) 2018 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 INDIC_CALC_3D_H #define INDIC_CALC_3D_H #include "utilities/arithmetic.h" #include "indicatorBaseF3D.h" namespace olb { /* * arithmetic helper classes for IndicatorF3D, smoothIndicator3D * UNION + * WITHOUT - * INTERSECTION * */ //////////////////////////////// indicCalc3D //////////////////////////////// /// arithmetic helper class for Indicator 3d functors template class F> class IndicCalc3D : public IndicatorF3D { protected: std::shared_ptr> _f; std::shared_ptr> _g; public: IndicCalc3D( std::shared_ptr> f, std::shared_ptr> g ); bool operator() (bool output[], const S input[3]) override; }; /// Addition functor (W==bool: Union) template using IndicPlus3D = IndicCalc3D; template using IndicMinus3D = IndicCalc3D; template using IndicMultiplication3D = IndicCalc3D; /** Free function implements lhs+rhs, only for IndicaotrsF3D types through enable_if and is_base_of * * \tparam S usual type for source dimension of the functor * \tparam F1 lhs has to be derived from IndicatorF3D, otherwise function is disabled * \tparam F2 rhs */ template class F1, template class F2, typename=typename std::enable_if, F1>::value>::type> std::shared_ptr> operator+(std::shared_ptr> lhs, std::shared_ptr> rhs); template class F1, template class F2, typename=typename std::enable_if, F1>::value>::type> std::shared_ptr> operator-(std::shared_ptr> lhs, std::shared_ptr> rhs); template class F1, template class F2, typename=typename std::enable_if, F1>::value>::type> std::shared_ptr> operator*(std::shared_ptr> lhs, std::shared_ptr> rhs); template class F1, template class F2, typename=typename std::enable_if, F1>::value>::type> std::shared_ptr> operator+(F1 & lhs, std::shared_ptr> rhs); template class F1, template class F2, typename=typename std::enable_if, F1>::value>::type> std::shared_ptr> operator-(F1 & lhs, std::shared_ptr> rhs); template class F1, template class F2, typename=typename std::enable_if, F1>::value>::type> std::shared_ptr> operator*(F1 & lhs, std::shared_ptr> rhs); } // end namespace olb #endif