OpenLB 1.7
Loading...
Searching...
No Matches
blockIntegralF3D.hh
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2018 Adrian Kummerlaender
4 * E-mail contact: info@openlb.net
5 * The most recent release of OpenLB can be downloaded at
6 * <http://www.openlb.net/>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22*/
23
24#ifndef BLOCK_INTEGRAL_F_3D_HH
25#define BLOCK_INTEGRAL_F_3D_HH
26
27#include "blockIntegralF3D.h"
28#include "core/olbDebug.h"
30
31namespace olb {
32
33
34template <typename T, typename W>
36 BlockIndicatorF3D<T>& indicatorF)
37 : BlockF3D<W>(f.getBlockStructure(), f.getTargetDim()+1),
38 _f(f),
39 _indicatorF(indicatorF)
40{
41 this->getName() = "BlockSum("+_f.getName()+")";
42}
43
44template <typename T, typename W>
45bool BlockSum3D<T,W>::operator() (W output[], const int input[])
46{
47 OLB_ASSERT(_f.getSourceDim() == _indicatorF.getSourceDim(),
48 "functor source dimension equals indicator source dimension");
49
50 W outputTmp[_f.getTargetDim()];
51 int inputTmp[_f.getSourceDim()];
52 std::size_t voxels(0);
53
54 const auto& blockStructure = this->getBlockStructure();
55
56 for (inputTmp[0] = 0; inputTmp[0] < blockStructure.getNx(); ++inputTmp[0]) {
57 for (inputTmp[1] = 0; inputTmp[1] < blockStructure.getNy(); ++inputTmp[1]) {
58 for (inputTmp[2] = 0; inputTmp[2] < blockStructure.getNz(); ++inputTmp[2]) {
59 if (_indicatorF(inputTmp)) {
60 _f(outputTmp,inputTmp);
61 for (int i = 0; i < _f.getTargetDim(); ++i) {
62 output[i] += outputTmp[i];
63 }
64 voxels += 1;
65 }
66 }
67 }
68 }
69 output[_f.getTargetDim()] += voxels;
70
71 return true;
72}
73
74
75template <typename T, typename W>
77 BlockIndicatorF3D<T>& indicatorF)
78 : BlockF3D<W>(f.getBlockStructure(), f.getTargetDim()),
79 _f(f),
80 _indicatorF(indicatorF)
81{
82 this->getName() = "BlockIntegral("+_f.getName()+")";
83}
84
85template <typename T, typename W>
86bool BlockIntegral3D<T,W>::operator() (W output[], const int input[])
87{
88 OLB_ASSERT(_f.getSourceDim() == _indicatorF.getSourceDim(),
89 "functor source dimension equals indicator source dimension");
90
91 const W weight = util::pow(_indicatorF.getBlockGeometry().getDeltaR(), 3);
92
93 W outputTmp[_f.getTargetDim()];
94 int inputTmp[_f.getSourceDim()];
95
96 const auto& blockStructure = this->getBlockStructure();
97
98 for (inputTmp[0] = 0; inputTmp[0] < blockStructure.getNx(); ++inputTmp[0]) {
99 for (inputTmp[1] = 0; inputTmp[1] < blockStructure.getNy(); ++inputTmp[1]) {
100 for (inputTmp[2] = 0; inputTmp[2] < blockStructure.getNz(); ++inputTmp[2]) {
101 if (_indicatorF(inputTmp)) {
102 _f(outputTmp,inputTmp);
103 for (int i = 0; i < this->getTargetDim(); ++i) {
104 output[i] += outputTmp[i] * weight;
105 }
106 }
107 }
108 }
109 }
110
111 return true;
112}
113
114
115}
116
117#endif
represents all functors that operate on a cuboid in general, mother class of BlockLatticeF,...
Base block indicator functor.
BlockIntegral3D(BlockF3D< W > &f, BlockIndicatorF3D< T > &indicatorF)
bool operator()(W output[], const int input[]) override
bool operator()(W output[], const int input[]) override
BlockSum3D(BlockF3D< W > &f, BlockIndicatorF3D< T > &indicatorF)
std::string & getName()
read and write access to name
Definition genericF.hh:51
cpu::simd::Pack< T > pow(cpu::simd::Pack< T > base, cpu::simd::Pack< T > exp)
Definition pack.h:112
Top level namespace for all of OpenLB.
#define OLB_ASSERT(COND, MESSAGE)
Definition olbDebug.h:45