31#ifndef POWER_LAW_BGK_DYNAMICS_H
32#define POWER_LAW_BGK_DYNAMICS_H
47 template <
typename T,
typename DESCRIPTOR,
typename FIELD>
53 template <
typename T,
typename DESCRIPTOR,
typename FIELD>
59 template <
typename T,
typename DESCRIPTOR,
typename FIELD>
65 template <
typename T,
typename DESCRIPTOR,
typename FIELD>
76template <
typename COLLISION,
bool HERSCHELBULKLEY=false>
78 using parameters =
typename COLLISION::parameters::template include<
84 return "powerlaw::OmegaFromCell<" + COLLISION::getName() +
">";
87 template <
typename CELL,
typename PARAMETERS,
typename OMEGA,
typename RHO,
typename PI,
typename V=
typename CELL::value_t>
90 using DESCRIPTOR =
typename CELL::descriptor_t;
94 if constexpr (DESCRIPTOR::template provides<descriptors::SHEAR_RATE_MAGNITUDE>()) {
95 gamma = cell.template getField<descriptors::SHEAR_RATE_MAGNITUDE>();
98 if constexpr (DESCRIPTOR::template provides<descriptors::FORCE>()) {
100 const auto force = cell.template getField<descriptors::FORCE>();
107 if constexpr(HERSCHELBULKLEY) {
113 if constexpr(HERSCHELBULKLEY) {
115 nuNew +=
parameters.template get<YIELD_STRESS>() / gamma;
118 V omegaMax =
parameters.template get<OMEGA_MAX>();
119 newOmega =
util::min(newOmega, omegaMax);
120 V omegaMin =
parameters.template get<OMEGA_MIN>();
121 newOmega =
util::max(newOmega, omegaMin);
125 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
130 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
134 MomentaF().computeAllMomenta(cell, rho, u, pi);
135 const V oldOmega = cell.template getField<descriptors::OMEGA>();
137 cell.template setField<descriptors::OMEGA>(newOmega);
138 parameters.template set<descriptors::OMEGA>(newOmega);
144template <
int... NORMAL>
148template <
int... NORMAL>
152 return "PeriodicPressureOffset";
155 template <
typename DESCRIPTOR,
typename MOMENTA>
158 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
161 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
163 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
165 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
170 auto statistic =
CollisionO().apply(cell, parameters);
171 const V densityOffset = parameters.template get<
PRESSURE_OFFSET<NORMAL...>>();
172 for (
unsigned iPop : populations) {
179 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
187template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
196template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
206template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
215template <
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
225template<
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
234template<
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
244template<
typename T,
typename DESCRIPTOR,
typename MOMENTA=momenta::BulkTuple>
Definition of a LB cell – header file.
constexpr T invCs2() any_platform
constexpr T t(unsigned iPop, tag::CUM) any_platform
Expr pow(Expr base, Expr 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_0,C_1,C_2]^T * [1,D,Q].
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.
static constexpr auto isValid(FieldD< T, DESCRIPTOR, FIELD > value)
static constexpr auto isValid(FieldD< T, DESCRIPTOR, FIELD > value)
static constexpr auto isValid(FieldD< T, DESCRIPTOR, FIELD > value)
static constexpr auto isValid(FieldD< T, DESCRIPTOR, FIELD > value)
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.