summaryrefslogtreecommitdiff
path: root/src/functors/lattice/blockLatticeIntegralF2D.h
blob: 5e69a2a8ea6f9f73f63a1c63207181f73904b985 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*  This file is part of the OpenLB library
 *
 *  Copyright (C) 2012 Lukas Baron, Mathias J. Krause, Albert Mink
 *  E-mail contact: info@openlb.net
 *  The most recent release of OpenLB can be downloaded at
 *  <http://www.openlb.net/>
 *
 *  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_2D_H
#define BLOCK_LATTICE_INTEGRAL_F_2D_H


#include "functors/genericF.h"
#include "blockBaseF2D.h"
#include "geometry/blockGeometry2D.h"

/** Note: Throughout the whole source code directory genericFunctions, the
 *  template parameters for i/o dimensions are:
 *           F: S^m -> T^n  (S=source, T=target)
 */

namespace olb {


template<typename T, typename DESCRIPTOR> class BlockLattice2D;
template<typename T> class BlockIndicatorF2D;


/// BlockMax2D returns the max in each component of all points of a certain material
template <typename T, typename DESCRIPTOR>
class BlockMax2D final : public BlockLatticeF2D<T,DESCRIPTOR> {
private:
  BlockLatticeF2D<T,DESCRIPTOR>& _f;
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockMax2D(BlockLatticeF2D<T,DESCRIPTOR>& f, BlockGeometry2D<T>& blockGeometry,
             int material);
  bool operator() (T output[], const int input[]) override;
};


/// BlockSum2D sums over all cells of a certain material number
template <typename T, typename DESCRIPTOR>
class BlockSum2D final : public BlockLatticeF2D<T,DESCRIPTOR> {
private:
  BlockLatticeF2D<T,DESCRIPTOR>& _f;
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockSum2D(BlockLatticeF2D<T,DESCRIPTOR>& f, BlockGeometry2D<T>& blockGeometry,
             int material);
  bool operator() (T output[], const int input[]) override;
};


/// BlockIntegral2D
template <typename T, typename DESCRIPTOR>
class BlockIntegral2D final : public BlockLatticeF2D<T,DESCRIPTOR> {
private:
  BlockLatticeF2D<T,DESCRIPTOR>& _f;
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockIntegral2D(BlockLatticeF2D<T,DESCRIPTOR>& f,
                  BlockGeometry2D<T>& blockGeometry, int material);
  bool operator() (T output[], const int input[]) override;
};


/// BlockL1Norm2D returns componentwise the l1 norm
template <typename T, typename DESCRIPTOR>
class BlockL1Norm2D final : public BlockLatticeF2D<T,DESCRIPTOR> {
private:
  BlockLatticeF2D<T,DESCRIPTOR>& _f;
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockL1Norm2D(BlockLatticeF2D<T,DESCRIPTOR>& f,
                BlockGeometry2D<T>& blockGeometry, int material);
  bool operator() (T output[], const int input[]) override;
};


/// BlockL222D returns componentwise the squared l2-norm
template <typename T, typename DESCRIPTOR>
class BlockL222D final : public BlockLatticeF2D<T,DESCRIPTOR> {
private:
  BlockLatticeF2D<T,DESCRIPTOR>& _f;
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockL222D(BlockLatticeF2D<T,DESCRIPTOR>& f, BlockGeometry2D<T>& blockGeometry,
             int material);
  bool operator() (T output[], const int input[]) override;
};


/// functor counts to get the discrete surface for a material no. in direction (1,0,0), (0,1,0), (0,0,1), (-1,0,0), (0,-1,0), (0,0,-1) and total surface, then it converts it into phys units
template <typename T>
class BlockGeometryFaces2D final : public GenericF<T,int> {
private:
  BlockGeometryStructure2D<T>& _blockGeometry;
  int _material;
  T _latticeL;
public:
  template<typename DESCRIPTOR>
  BlockGeometryFaces2D(BlockGeometryStructure2D<T>& blockGeometry, int material, const UnitConverter<T,DESCRIPTOR>& converter);
  BlockGeometryFaces2D(BlockGeometryStructure2D<T>& blockGeometry, int material, T latticeL);
  bool operator() (T output[], const int input[]) override;
};

/// functor counts to get the discrete surface for a smooth indicator circle in direction (1,0,0), (0,1,0), (0,0,1), (-1,0,0), (0,-1,0), (0,0,-1)
/// and total surface, then it converts it into phys units
template <typename T, bool HLBM=false>
class BlockGeometryFacesIndicator2D final : public GenericF<T,int> {
private:
  BlockGeometryStructure2D<T>& _blockGeometry;
  SmoothIndicatorF2D<T,T>& _indicator;
  int _material;
  T _latticeL;
public:
  BlockGeometryFacesIndicator2D(BlockGeometryStructure2D<T>& blockGeometry, SmoothIndicatorF2D<T,T,HLBM>& indicator,
                                int material, T deltaX);
  bool operator() (T output[], const int input[]) override;
};



/** functor to get pointwise phys force acting on a boundary with a given
 *  material on local lattice, if globIC is not on
 *  the local processor, the returned vector is empty
 */
template <typename T, typename DESCRIPTOR>
class BlockLatticePhysDrag2D final : public BlockLatticePhysF2D<T,DESCRIPTOR> {
private:
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockLatticePhysDrag2D(BlockLattice2D<T,DESCRIPTOR>& blockLattice,
                         BlockGeometry2D<T>& blockGeometry, int material,
                         const UnitConverter<T,DESCRIPTOR>& converter);
  bool operator() (T output[], const int input[]) override;
};


/** functor to get pointwise phys force acting on a boundary with a given
 *  material on local lattice, if globIC is not on
 *  the local processor, the returned vector is empty
 *  see: Caiazzo, Junk: Boundary Forces in lattice Boltzmann: Analysis of MEA
 */
template <typename T, typename DESCRIPTOR>
class BlockLatticePhysCorrDrag2D final : public BlockLatticePhysF2D<T,DESCRIPTOR> {
private:
  BlockGeometry2D<T>& _blockGeometry;
  int _material;
public:
  BlockLatticePhysCorrDrag2D(BlockLattice2D<T,DESCRIPTOR>& blockLattice,
                             BlockGeometry2D<T>& blockGeometry, int material,
                             const UnitConverter<T,DESCRIPTOR>& converter);
  bool operator() (T output[], const int input[]) override;
};




} // end namespace olb

#endif