OpenLB 1.7
Loading...
Searching...
No Matches
Public Types | Public Member Functions | List of all members
olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation > Class Template Reference

Implementation of Zou-He boundary condition following the paper from Zou and He. More...

#include <zouHeDynamics.h>

+ Inheritance diagram for olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >:
+ Collaboration diagram for olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >:

Public Types

using MomentaF = typename MOMENTA::template type<DESCRIPTOR>
 
using parameters = typename CORRECTED_DYNAMICS::parameters
 
template<typename M >
using exchange_momenta = ZouHeDynamics<T,DESCRIPTOR,DYNAMICS,M,direction,orientation>
 
- Public Types inherited from olb::dynamics::CustomCollision< T, DESCRIPTOR, MOMENTA >
using value_t = T
 
using descriptor_t = DESCRIPTOR
 
using MomentaF = typename MOMENTA::template type<DESCRIPTOR>
 
- Public Types inherited from olb::Dynamics< T, DESCRIPTOR >
using value_t = T
 
using descriptor_t = DESCRIPTOR
 

Public Member Functions

std::type_index id () override
 Expose unique type-identifier for RTTI.
 
AbstractParameters< T, DESCRIPTOR > & getParameters (BlockLattice< T, DESCRIPTOR > &block) override
 Parameters access for legacy post processors.
 
template<typename CELL , typename PARAMETERS , typename V = typename CELL::value_t>
CellStatistic< V > apply (CELL &cell, PARAMETERS &parameters) any_platform
 
computeEquilibrium (int iPop, T rho, const T u[DESCRIPTOR::d]) const override any_platform
 Return iPop equilibrium for given first and second momenta.
 
std::string getName () const override
 Return human-readable name.
 
- Public Member Functions inherited from olb::dynamics::CustomCollision< T, DESCRIPTOR, MOMENTA >
void initialize (Cell< T, DESCRIPTOR > &cell) override
 Initialize dynamics-specific data for cell.
 
computeRho (ConstCell< T, DESCRIPTOR > &cell) const override
 Compute particle density.
 
void computeU (ConstCell< T, DESCRIPTOR > &cell, T u[DESCRIPTOR::d]) const override
 Compute fluid velocity.
 
void computeJ (ConstCell< T, DESCRIPTOR > &cell, T j[DESCRIPTOR::d]) const override
 Compute fluid momentum.
 
void computeStress (ConstCell< T, DESCRIPTOR > &cell, T rho, const T u[DESCRIPTOR::d], T pi[util::TensorVal< DESCRIPTOR >::n]) const override
 Compute stress tensor.
 
void computeRhoU (ConstCell< T, DESCRIPTOR > &cell, T &rho, T u[DESCRIPTOR::d]) const override
 Compute fluid velocity and particle density.
 
void computeAllMomenta (ConstCell< T, DESCRIPTOR > &cell, T &rho, T u[DESCRIPTOR::d], T pi[util::TensorVal< DESCRIPTOR >::n]) const override
 Compute all momenta up to second order.
 
void defineRho (Cell< T, DESCRIPTOR > &cell, T rho) override
 Set particle density.
 
void defineU (Cell< T, DESCRIPTOR > &cell, const T u[DESCRIPTOR::d]) override
 Set fluid velocity.
 
void defineRhoU (Cell< T, DESCRIPTOR > &cell, T rho, const T u[DESCRIPTOR::d]) override
 Define fluid velocity and particle density.
 
void defineAllMomenta (Cell< T, DESCRIPTOR > &cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal< DESCRIPTOR >::n]) override
 Define all momenta up to second order.
 
void inverseShiftRhoU (ConstCell< T, DESCRIPTOR > &cell, T &rho, T u[DESCRIPTOR::d]) const override
 Calculate population momenta s.t. the physical momenta are reproduced by the computeRhoU.
 
- Public Member Functions inherited from olb::Dynamics< T, DESCRIPTOR >
virtual ~Dynamics () any_platform
 
virtual CellStatistic< T > collide (Cell< T, DESCRIPTOR > &cell)
 Perform purely-local collision step on Cell interface (legacy, to be deprecated)
 
void iniEquilibrium (Cell< T, DESCRIPTOR > &cell, T rho, const T u[DESCRIPTOR::d])
 Initialize to equilibrium distribution.
 
void iniRegularized (Cell< T, DESCRIPTOR > &cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal< DESCRIPTOR >::n])
 Initialize cell to equilibrium and non-equilibrum part.
 

Detailed Description

template<typename T, typename DESCRIPTOR, typename DYNAMICS, typename MOMENTA, int direction, int orientation>
class olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >

Implementation of Zou-He boundary condition following the paper from Zou and He.

This implementation is lattice independent. The implementation follow the idea proposed int the paper Qisu Zou, Xiaoyi He, "On pressure and velocity boundary conditions for the lattice Boltzmann BGK model", Phys. Fluids , (1997), Volume 9, Issue 6, pp. 1591-1598

Definition at line 40 of file zouHeDynamics.h.

Member Typedef Documentation

◆ exchange_momenta

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
template<typename M >
using olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::exchange_momenta = ZouHeDynamics<T,DESCRIPTOR,DYNAMICS,M,direction,orientation>

Definition at line 51 of file zouHeDynamics.h.

◆ MomentaF

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
using olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::MomentaF = typename MOMENTA::template type<DESCRIPTOR>

Definition at line 46 of file zouHeDynamics.h.

◆ parameters

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
using olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::parameters = typename CORRECTED_DYNAMICS::parameters

Definition at line 48 of file zouHeDynamics.h.

Member Function Documentation

◆ apply()

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
template<typename CELL , typename PARAMETERS , typename V = typename CELL::value_t>
CellStatistic< V > olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::apply ( CELL & cell,
PARAMETERS & parameters )
inline

Definition at line 62 of file zouHeDynamics.h.

62 {
63 // Along all the commented parts of this code there will be an example based
64 // on the situation where the wall's normal vector if (0,1) and the
65 // numerotation of the velocites are done according to the D2Q9
66 // lattice of the OpenLB library.
67
68 // Find all the missing populations
69 // (directions 3,4,5)
70 constexpr auto missingIndexesTmp = util::subIndexOutgoing<DESCRIPTOR,direction,orientation>();
71 std::vector<int> missingIndexes(missingIndexesTmp.cbegin(), missingIndexesTmp.cend());
72
73 // Will contain the missing poputations that are not normal to the wall.
74 // (directions 3,5)
75 std::vector<int> missingDiagonalIndexes = missingIndexes;
76 for (unsigned iPop = 0; iPop < missingIndexes.size(); ++iPop) {
77 int numOfNonNullComp = 0;
78 for (int iDim = 0; iDim < DESCRIPTOR::d; ++iDim) {
79 numOfNonNullComp += util::abs(descriptors::c<DESCRIPTOR>(missingIndexes[iPop],iDim));
80 }
81
82 if (numOfNonNullComp == 1) {
83 missingDiagonalIndexes.erase(missingDiagonalIndexes.begin()+iPop);
84 break;
85 }
86 }
87
88 V rho, u[DESCRIPTOR::d];
89 V falseRho, falseU[DESCRIPTOR::d];
90 MomentaF().computeRhoU(cell, rho, u);
91 V uSqr = util::normSqr<V,DESCRIPTOR::d>(u);
92
93 // The unknown non equilibrium populations are bounced back
94 // (f[3] = feq[3] + fneq[7], f[4] = feq[4] + fneq[8],
95 // f[5] = feq[5] + fneq[1])
96 for (unsigned iPop = 0; iPop < missingIndexes.size(); ++iPop) {
97 cell[missingIndexes[iPop]] = cell[descriptors::opposite<DESCRIPTOR>(missingIndexes[iPop])]
98 - computeEquilibrium(descriptors::opposite<DESCRIPTOR>(missingIndexes[iPop]), rho, u)
99 + computeEquilibrium(missingIndexes[iPop], rho, u);
100 }
101
102 // We recompute rho and u in order to have the new momentum and density. Since
103 // the momentum is not conserved from this scheme, we will corect it. By adding
104 // a contribution to the missingDiagonalVelocities.
105 lbm<DESCRIPTOR>::computeRhoU(cell,falseRho,falseU);
106
107 V diff[DESCRIPTOR::d] {};
108 for (int iDim = 0; iDim < DESCRIPTOR::d; ++iDim) {
109 diff[iDim] = (rho*u[iDim] - falseRho*falseU[iDim])/ V(missingDiagonalIndexes.size());
110 }
111
112 for (unsigned iPop = 0; iPop < missingDiagonalIndexes.size(); ++iPop) {
113 for (int iDim = 1; iDim < DESCRIPTOR::d; ++iDim) {
114 cell[missingDiagonalIndexes[iPop]] +=
115 descriptors::c<DESCRIPTOR>(missingDiagonalIndexes[iPop],(direction+iDim)%DESCRIPTOR::d) * diff[(direction+iDim)%DESCRIPTOR::d];
116 }
117 }
118
119 typename CORRECTED_DYNAMICS::CollisionO().apply(cell, parameters);
120
121 return {rho, uSqr};
122 }
typename MOMENTA::template type< DESCRIPTOR > MomentaF
T computeEquilibrium(int iPop, T rho, const T u[DESCRIPTOR::d]) const override any_platform
Return iPop equilibrium for given first and second momenta.
typename CORRECTED_DYNAMICS::parameters parameters
ADf< T, DIM > abs(const ADf< T, DIM > &a)
Definition aDiff.h:1019
static void computeRhoU(CELL &cell, RHO &rho, U &u) any_platform
Computation of hydrodynamic variables.
Definition lbm.h:219

References olb::util::abs(), olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::computeEquilibrium(), and olb::lbm< DESCRIPTOR >::computeRhoU().

+ Here is the call graph for this function:

◆ computeEquilibrium()

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
T olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::computeEquilibrium ( int iPop,
T rho,
const T u[DESCRIPTOR::d] ) const
inlineoverridevirtual

Return iPop equilibrium for given first and second momenta.

Implements olb::Dynamics< T, DESCRIPTOR >.

Definition at line 124 of file zouHeDynamics.h.

124 {
125 return typename CORRECTED_DYNAMICS::EquilibriumF().compute(iPop, rho, u);
126 };
+ Here is the caller graph for this function:

◆ getName()

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
std::string olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::getName ( ) const
inlineoverridevirtual

Return human-readable name.

Reimplemented from olb::Dynamics< T, DESCRIPTOR >.

Definition at line 128 of file zouHeDynamics.h.

128 {
129 return "ZouHeDynamics<" + CORRECTED_DYNAMICS().getName() + ">";
130 };

◆ getParameters()

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
AbstractParameters< T, DESCRIPTOR > & olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::getParameters ( BlockLattice< T, DESCRIPTOR > & block)
inlineoverridevirtual

Parameters access for legacy post processors.

Implements olb::Dynamics< T, DESCRIPTOR >.

Definition at line 57 of file zouHeDynamics.h.

57 {
58 return block.template getData<OperatorParameters<ZouHeDynamics>>();
59 }

◆ id()

template<typename T , typename DESCRIPTOR , typename DYNAMICS , typename MOMENTA , int direction, int orientation>
std::type_index olb::ZouHeDynamics< T, DESCRIPTOR, DYNAMICS, MOMENTA, direction, orientation >::id ( )
inlineoverridevirtual

Expose unique type-identifier for RTTI.

Implements olb::Dynamics< T, DESCRIPTOR >.

Definition at line 53 of file zouHeDynamics.h.

53 {
54 return typeid(ZouHeDynamics);
55 }

The documentation for this class was generated from the following file: