OpenLB 1.7
Loading...
Searching...
No Matches
latticePhysBoundaryForce3D.hh
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2012 Lukas Baron, Tim Dornieden, Mathias J. Krause,
4 * Albert Mink
5 * E-mail contact: info@openlb.net
6 * The most recent release of OpenLB can be downloaded at
7 * <http://www.openlb.net/>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program; if not, write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, USA.
23*/
24
25#ifndef LATTICE_PHYS_BOUNDARY_FORCE_3D_HH
26#define LATTICE_PHYS_BOUNDARY_FORCE_3D_HH
27
28#include<vector> // for generic i/o
29#include<cmath> // for lpnorm
30#include<math.h>
31
33#include "superBaseF3D.h"
36#include "dynamics/lbm.h" // for computation of lattice rho and velocity
38#include "blockBaseF3D.h"
41
42namespace olb {
43
44template<typename T, typename DESCRIPTOR>
47 FunctorPtr<SuperIndicatorF3D<T>>&& indicatorF,
48 const UnitConverter<T,DESCRIPTOR>& converter)
49 : SuperLatticePhysF3D<T, DESCRIPTOR>(sLattice, converter, 3),
50 _indicatorF(std::move(indicatorF))
51{
52 this->getName() = "physBoundaryForce";
53 for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) {
54 this->_blockF.emplace_back(
56 this->_sLattice.getBlock(iC),
57 _indicatorF->getBlockIndicatorF(iC),
58 this->_converter));
59 }
60}
61
62template<typename T, typename DESCRIPTOR>
65 SuperGeometry<T,3>& superGeometry, const int material,
66 const UnitConverter<T,DESCRIPTOR>& converter)
68 superGeometry.getMaterialIndicator(material),
69 converter)
70{ }
71
72template <typename T, typename DESCRIPTOR>
74 BlockLattice<T,DESCRIPTOR>& blockLattice,
75 BlockIndicatorF3D<T>& indicatorF,
76 const UnitConverter<T,DESCRIPTOR>& converter)
77 : BlockLatticePhysF3D<T,DESCRIPTOR>(blockLattice, converter, 3),
78 _indicatorF(indicatorF),
79 _blockGeometry(indicatorF.getBlockGeometry())
80{
81 this->getName() = "physBoundaryForce";
82}
83
84template<typename T, typename DESCRIPTOR>
86{
87 for (int i = 0; i < this->getTargetDim(); ++i) {
88 output[i] = T();
89 }
90
91 if (_indicatorF(input)) {
92 for (int iPop = 1; iPop < DESCRIPTOR::q; ++iPop) {
93 // Get direction
95 // Get next cell located in the current direction
96 // Check if the next cell is a fluid node
97 if (_blockGeometry.get({input[0] + c[0], input[1] + c[1], input[2] + c[2]}) == 1) {
98 // Get f_q of next fluid cell where l = opposite(q)
99 T f = this->_blockLattice.get(input[0] + c[0], input[1] + c[1], input[2] + c[2])[iPop];
100 // Get f_l of the boundary cell
101 // Add f_q and f_opp
102 f += this->_blockLattice.get(input)[descriptors::opposite<DESCRIPTOR>(iPop)];
103 // Update force
104 for (int i = 0; i < this->getTargetDim(); ++i) {
105 output[i] -= c[i] * f;
106 }
107 }
108 }
109 for (int i = 0; i < this->getTargetDim(); ++i) {
110 output[i] = this->_converter.getPhysForce(output[i]);
111 }
112 }
113 return true;
114}
115
116}
117#endif
Base block indicator functor.
Definition aliases.h:204
functor returns pointwise phys force acting on a boundary with a given material on local lattice
bool operator()(T output[], const int input[]) override
has to be implemented for 'every' derived class
BlockLatticePhysBoundaryForce3D(BlockLattice< T, DESCRIPTOR > &blockLattice, BlockIndicatorF3D< T > &indicatorF, const UnitConverter< T, DESCRIPTOR > &converter)
represents all functors that operate on a DESCRIPTOR with output in Phys, e.g. physVelocity(),...
Definition aliases.h:325
Smart pointer for managing the various ways of passing functors around.
Definition functorPtr.h:60
std::string & getName()
Definition genericF.hh:51
std::vector< std::unique_ptr< BlockF3D< W > > > _blockF
Representation of a statistic for a parallel 2D geometry.
Base indicator functor (discrete)
Definition aliases.h:194
SuperLattice< T, DESCRIPTOR > & _sLattice
functor to get pointwise phys force acting on a boundary with a given material on local lattice
SuperLatticePhysBoundaryForce3D(SuperLattice< T, DESCRIPTOR > &sLattice, FunctorPtr< SuperIndicatorF3D< T > > &&indicatorF, const UnitConverter< T, DESCRIPTOR > &converter)
represents all functors that operate on a DESCRIPTOR with output in Phys, e.g. physVelocity(),...
Definition aliases.h:315
Super class maintaining block lattices for a cuboid decomposition.
Conversion between physical and lattice units, as well as discretization.
Plain old scalar vector.
Wrapper functions that simplify the use of MPI.
constexpr int c(unsigned iPop, unsigned iDim) any_platform
Definition functions.h:83
constexpr int opposite(unsigned iPop) any_platform
Definition functions.h:95
Top level namespace for all of OpenLB.
Representation of a parallel 2D geometry – header file.