31#ifndef POWER_LAW_BGK_DYNAMICS_H
32#define POWER_LAW_BGK_DYNAMICS_H
55template <
typename COLLISION,
bool HERSCHELBULKLEY=false>
57 using parameters =
typename COLLISION::parameters::template include<
63 return "powerlaw::OmegaFromCell<" + COLLISION::getName() +
">";
66 template <
typename CELL,
typename PARAMETERS,
typename OMEGA,
typename RHO,
typename PI,
typename V=
typename CELL::value_t>
69 using DESCRIPTOR =
typename CELL::descriptor_t;
70 V pre2 = V{0.5} * descriptors::invCs2<V,DESCRIPTOR>() * omega0 / rho;
73 if constexpr (DESCRIPTOR::template provides<descriptors::SHEAR_RATE_MAGNITUDE>()) {
74 gamma = cell.template getField<descriptors::SHEAR_RATE_MAGNITUDE>();
77 if constexpr (DESCRIPTOR::template provides<descriptors::FORCE>()) {
79 const auto force = cell.template getField<descriptors::FORCE>();
86 if constexpr(HERSCHELBULKLEY) {
92 if constexpr(HERSCHELBULKLEY) {
94 nuNew +=
parameters.template get<YIELD_STRESS>() / gamma;
96 V newOmega = V{1} / (nuNew*descriptors::invCs2<V,DESCRIPTOR>() + V{0.5});
97 V omegaMax =
parameters.template get<OMEGA_MAX>();
99 V omegaMin =
parameters.template get<OMEGA_MIN>();
100 newOmega =
util::max(newOmega, omegaMin);
104 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
109 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
113 MomentaF().computeAllMomenta(cell, rho, u, pi);
114 const V oldOmega = cell.template getField<descriptors::OMEGA>();
116 cell.template setField<descriptors::OMEGA>(newOmega);
117 parameters.template set<descriptors::OMEGA>(newOmega);
124template <
int... NORMAL>
128template <
int... NORMAL>
132 return "PeriodicPressureOffset";
135 template <
typename DESCRIPTOR,
typename MOMENTA>
138 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
141 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
143 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
145 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
150 auto statistic =
CollisionO().apply(cell, parameters);
151 const V densityOffset = parameters.template get<
PRESSURE_OFFSET<NORMAL...>>();
152 for (
unsigned iPop : populations) {
153 cell[iPop] += (cell[iPop] + descriptors::t<V,DESCRIPTOR>(iPop)) * densityOffset;
159 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
167template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
176template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
186template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
195template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
205template<
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
214template<
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
224template<
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
Definition of a LB cell – header file.
cpu::simd::Pack< T > sqrt(cpu::simd::Pack< T > value)
cpu::simd::Pack< T > min(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
cpu::simd::Pack< T > max(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
cpu::simd::Pack< T > pow(cpu::simd::Pack< T > base, cpu::simd::Pack< T > exp)
constexpr auto populationsContributingToDirection() any_platform
Return array of population indices where c[iPop][iD] == NORMAL[iD].
Top level namespace for all of OpenLB.
Return value of any collision.
Base of a field whose size is defined by [C,U_1,...,U_N]^T * [1,V_1,...V_N].
Dynamics constructed as a tuple of momenta, equilibrium and collision.
Dynamics combination rule implementing the forcing scheme by Guo et al.
static V computePiNeqNormSqr(CELL &cell, const FORCE &force) any_platform
Computes squared norm of non-equilibrium part of 2nd momentum for forced dynamics.
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
Compute and update cell-wise OMEGA using Oswald-de-waele model.
static V computeOmega(CELL &cell, PARAMETERS ¶meters, OMEGA &omega0, RHO &rho, PI &pi) any_platform
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, OMEGA_MIN, OMEGA_MAX, M, N, YIELD_STRESS, SHEAR_RATE_MIN > parameters
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
Combination rule to realize a pressure drop at a periodic boundary.
typename MOMENTA::template type< DESCRIPTOR > combined_momenta
static std::string getName()
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename COLLISION::parameters ::template include< PRESSURE_OFFSET< NORMAL... > > combined_parameters
Compute number of elements of a symmetric d-dimensional tensor.