OpenLB 1.7
Loading...
Searching...
No Matches
latticePSMPhysForce2D.hh
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2019 Albert Mink, Mathias J. Krause, Lukas Baron
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 LATTICE_PSM_PHYS_FORCE_2D_HH
25#define LATTICE_PSM_PHYS_FORCE_2D_HH
26
27#include <vector>
28#include "utilities/omath.h"
29#include <limits>
30
32#include "dynamics/lbm.h" // for computation of lattice rho and velocity
35#include "blockBaseF2D.h"
36#include "functors/genericF.h"
40
41
42namespace olb {
43
44template<typename T, typename DESCRIPTOR>
47 const UnitConverter<T,DESCRIPTOR>& converter)
48 : SuperLatticePhysF2D<T, DESCRIPTOR>(sLattice, converter, 2)
49{
50 this->getName() = "PSMPhysForce";
51 for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) {
52 this->_blockF.emplace_back(
54 this->_sLattice.getBlock(iC),
55 this->_converter));
56 }
57}
58
59template <typename T, typename DESCRIPTOR>
61 BlockLattice<T,DESCRIPTOR>& blockLattice,
62 const UnitConverter<T,DESCRIPTOR>& converter)
63 : BlockLatticePhysF2D<T,DESCRIPTOR>(blockLattice, converter, 2)
64{
65 this->getName() = "physPSMForce";
66}
67
68template<typename T, typename DESCRIPTOR>
70{
71 for (int i = 0; i < this->getTargetDim(); ++i) {
72 output[i] = T();
73 }
74
75 T epsilon = 1. - this->_blockLattice.get(input[0], input[1]).template getField<descriptors::POROSITY>();
76
77 //if ((epsilon > 1e-5 && epsilon < 1 - 1e-5))
78 if ((epsilon > 1e-5)) {
79 T rho, u[DESCRIPTOR::d], u_s[DESCRIPTOR::d];
80
81 for (int i = 0; i < DESCRIPTOR::d; i++) {
82 u_s[i] = this->_blockLattice.get(input[0], input[1]).template getFieldComponent<descriptors::VELOCITY_SOLID>(i);
83 }
84 T paramA = this->_converter.getLatticeRelaxationTime() - 0.5;
85 // speed up paramB
86 T paramB = (epsilon * paramA) / ((1. - epsilon) + paramA);
87
88 T omega_s;
89 T omega = 1. / this->_converter.getLatticeRelaxationTime();
90
91 this->_blockLattice.get(input[0], input[1]).computeRhoU(rho, u);
92
93 const T uSqr_s = util::normSqr<T,DESCRIPTOR::d>(u_s);
94 T uSqr = util::normSqr<T,DESCRIPTOR::d>(u);
95 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
96 //switch (mode) {
97 //case M2:
98 omega_s = (lbm< DESCRIPTOR>::equilibrium(iPop, rho, u_s, uSqr_s)
99 - this->_blockLattice.get(input[0], input[1])[iPop])
100 + (1 - omega)
101 * (this->_blockLattice.get(input[0], input[1])[iPop]
102 - lbm< DESCRIPTOR>::equilibrium(iPop, rho, u, uSqr));
103 // break;
104 //case M3:
105 // omega_s =
106 // (this->_blockLattice.get(input[0], input[1])[descriptors::opposite<DESCRIPTOR>(iPop)]
107 // - lbm< DESCRIPTOR>::equilibrium(
108 // descriptors::opposite<DESCRIPTOR>(iPop), rho, u_s, uSqr_s))
109 // - (this->_blockLattice.get(input[0], input[1])[iPop]
110 // - lbm< DESCRIPTOR>::equilibrium(iPop, rho, u_s, uSqr_s));
111 //}
112
113 for (int i = 0; i < this->getTargetDim(); ++i) {
114 output[i] -= descriptors::c<DESCRIPTOR>(iPop,i) * omega_s;
115 }
116 }
117
118 for (int i = 0; i < this->getTargetDim(); ++i) {
119 output[i] = this->_converter.getPhysForce(output[i] * paramB);
120 }
121 }
122 return true;
123}
124
125
126
127//TODO: 200116 preliminary version: proper indicatorcheck to be included
128template<typename T, typename DESCRIPTOR>
131 SuperGeometry<T,2>& superGeometry,
132 const UnitConverter<T,DESCRIPTOR>& converter,
133 IndicatorF2D<T>& shapeIndicator )
134 : SuperLatticePhysF2D<T, DESCRIPTOR>(sLattice, converter, 2)
135{
136 this->getName() = "PSMPhysForce";
137 for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) {
138 this->_blockF.emplace_back(
140 this->_sLattice.getBlock(iC),
141 superGeometry.getBlockGeometry(iC),
142 this->_converter,
143 shapeIndicator));
144 }
145}
146
147
148//TODO: 200116 preliminary version: proper indicatorcheck to be included
149template <typename T, typename DESCRIPTOR>
151 BlockLattice<T,DESCRIPTOR>& blockLattice,
152 BlockGeometry<T,2>& blockGeometry,
153 const UnitConverter<T,DESCRIPTOR>& converter,
154 IndicatorF2D<T>& shapeIndicator )
155 : BlockLatticePhysF2D<T,DESCRIPTOR>(blockLattice, converter, 2), _shapeIndicator(shapeIndicator), _blockGeometry(blockGeometry)
156{
157 this->getName() = "physPSMForce";
158}
159
160//TODO: 200116 preliminary version: proper indicatorcheck to be included
161template<typename T, typename DESCRIPTOR>
163{
164 for (int i = 0; i < this->getTargetDim(); ++i) {
165 output[i] = T();
166 }
167
168 T epsilon = 1. - this->_blockLattice.get(input[0], input[1]).template getField<descriptors::POROSITY>();
169 if ((epsilon > 1e-5)) {
170
171 T posBlockGeo[2] = {0.};
172 bool insideShape[1];
173 _blockGeometry.getPhysR( posBlockGeo, {input[0], input[1]});
174 _shapeIndicator( insideShape, posBlockGeo );
175
176 if ( insideShape[0] == true ) {
177
178 T rho, u[DESCRIPTOR::d], u_s[DESCRIPTOR::d];
179
180 for (int i = 0; i < DESCRIPTOR::d; i++) {
181 u_s[i] = this->_blockLattice.get(input[0], input[1]).template getFieldComponent<descriptors::VELOCITY_SOLID>(i);
182 }
183 T paramA = this->_converter.getLatticeRelaxationTime() - 0.5;
184 // speed up paramB
185 T paramB = (epsilon * paramA) / ((1. - epsilon) + paramA);
186
187 T omega_s;
188 T omega = 1. / this->_converter.getLatticeRelaxationTime();
189
190 this->_blockLattice.get(input[0], input[1]).computeRhoU(rho, u);
191
192 const T uSqr_s = util::normSqr<T,DESCRIPTOR::d>(u_s);
193 T uSqr = util::normSqr<T,DESCRIPTOR::d>(u);
194 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
195 //switch (mode) {
196 // case M2:
197 omega_s = (lbm< DESCRIPTOR>::equilibrium(iPop, rho, u_s, uSqr_s)
198 - this->_blockLattice.get(input[0], input[1])[iPop])
199 + (1 - omega)
200 * (this->_blockLattice.get(input[0], input[1])[iPop]
201 - lbm< DESCRIPTOR>::equilibrium(iPop, rho, u, uSqr));
202 // break;
203 // case M3:
204 // omega_s =
205 // (this->_blockLattice.get(input[0], input[1])[descriptors::opposite<DESCRIPTOR>(iPop)]
206 // - lbm< DESCRIPTOR>::equilibrium(
207 // descriptors::opposite<DESCRIPTOR>(iPop), rho, u_s, uSqr_s))
208 // - (this->_blockLattice.get(input[0], input[1])[iPop]
209 // - lbm< DESCRIPTOR>::equilibrium(iPop, rho, u_s, uSqr_s));
210 //}
211
212 for (int i = 0; i < this->getTargetDim(); ++i) {
213 output[i] -= descriptors::c<DESCRIPTOR>(iPop,i) * omega_s;
214 }
215 }
216
217 for (int i = 0; i < this->getTargetDim(); ++i) {
218 output[i] = this->_converter.getPhysForce(output[i] * paramB);
219 }
220 }
221 return true;
222 }
223}
224
225
226
227}
228#endif
Representation of a block geometry.
functor returns pointwise phys force for PSM dynamics
BlockLatticePSMPhysForce2DMod(BlockLattice< T, DESCRIPTOR > &blockLattice, BlockGeometry< T, 2 > &blockGeometry, const UnitConverter< T, DESCRIPTOR > &converter, IndicatorF2D< T > &shapeIndicator)
bool operator()(T output[], const int input[]) override
has to be implemented for 'every' derived class
functor returns pointwise phys force for PSM dynamics
BlockLatticePSMPhysForce2D(BlockLattice< T, DESCRIPTOR > &blockLattice, const UnitConverter< T, DESCRIPTOR > &converter)
bool operator()(T output[], const int input[]) override
has to be implemented for 'every' derived class
represents all functors that operate on a DESCRIPTOR with output in Phys, e.g. physVelocity(),...
Platform-abstracted block lattice for external access and inter-block interaction.
std::string & getName()
read and write access to name
Definition genericF.hh:51
IndicatorF2D is an application from .
std::vector< std::unique_ptr< BlockF2D< T > > > _blockF
Super functors may consist of several BlockF2D<W> derived functors.
Representation of a statistic for a parallel 2D geometry.
BlockGeometry< T, D > & getBlockGeometry(int locIC)
Read and write access to a single block geometry.
SuperLattice< T, DESCRIPTOR > & _sLattice
SuperLatticePSMPhysForce2DMod(SuperLattice< T, DESCRIPTOR > &sLattice, SuperGeometry< T, 2 > &superGeometry, const UnitConverter< T, DESCRIPTOR > &converter, IndicatorF2D< T > &shapeIndicator)
SuperLatticePSMPhysForce2D(SuperLattice< T, DESCRIPTOR > &sLattice, const UnitConverter< T, DESCRIPTOR > &converter)
represents all functors that operate on a DESCRIPTOR with output in Phys, e.g. physVelocity(),...
Super class maintaining block lattices for a cuboid decomposition.
Conversion between physical and lattice units, as well as discretization.
The description of a generic interface for all functor classes – header file.
This file contains indicator functions.
Wrapper functions that simplify the use of MPI.
Top level namespace for all of OpenLB.
Collection of common computations for LBM.
Definition lbm.h:182
Representation of a parallel 2D geometry – header file.