24#ifndef DYNAMICS_FORCING_H
25#define DYNAMICS_FORCING_H
37template <
template <
typename>
typename Forced = momenta::Forced>
43 template <
typename DESCRIPTOR,
typename MOMENTA>
46 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
49 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
51 using MomentaF =
typename Forced<MOMENTA>::template type<DESCRIPTOR>;
52 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,Forced<MOMENTA>,EQUILIBRIUM>;
56 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
57 "COLLISION must be parametrized using relaxation frequency OMEGA");
59 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
61 V rho, u[DESCRIPTOR::d];
62 MomentaF().computeRhoU(cell, rho, u);
65 const V omega = parameters.template get<descriptors::OMEGA>();
66 const auto force = cell.template getField<descriptors::FORCE>();
72 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
80 return "AdeGuoForcing";
83 template <
typename DESCRIPTOR,
typename MOMENTA>
86 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
89 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
91 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
92 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
94 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
95 "COLLISION must be parametrized using relaxation frequency OMEGA");
97 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
99 const auto u = cell.template getField<descriptors::VELOCITY>();
100 const V rho =
MomentaF().computeRho(cell);
102 const V omega = parameters.template get<descriptors::OMEGA>();
103 const auto source = cell.template getField<descriptors::SOURCE>();
104 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
108 sourceTerm *= (V{1} - omega * V{0.5});
109 cell[iPop] += sourceTerm;
115 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
123 return "MultiComponentGuoForcing";
125 template <
typename DESCRIPTOR,
typename MOMENTA>
127 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
129 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
131 using MomentaF =
typename Forced<MOMENTA>::template type<DESCRIPTOR>;
132 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,Forced<MOMENTA>,EQUILIBRIUM>;
133 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
134 "COLLISION must be parametrized using relaxation frequency OMEGA");
135 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
137 V rho, u[DESCRIPTOR::d];
138 MomentaF().computeRhoU(cell, rho, u);
140 const V omega = parameters.template get<descriptors::OMEGA>();
141 const auto force = cell.template getField<descriptors::FORCE>();
146 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
153 return "LiangForcing";
156 template <
typename DESCRIPTOR,
typename MOMENTA>
159 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
162 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
164 using MomentaF =
typename Forced<MOMENTA>::template type<DESCRIPTOR>;
165 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,Forced<MOMENTA>,EQUILIBRIUM>;
169 && !std::is_same_v<MOMENTA, momenta::IncBulkTuple<momenta::ForcedMomentum<momenta::IncompressibleBulkMomentum>>>;
171 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
172 "COLLISION must be parametrized using relaxation frequency OMEGA");
174 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
179 const V omega = parameters.template get<descriptors::OMEGA>();
180 const auto force = cell.template getField<descriptors::FORCE>();
181 const auto rho = cell.template getField<descriptors::RHO>();
182 const auto gradRho = cell.template getField<descriptors::NABLARHO>();
188 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
195 return "LiangTRTForcing";
198 template <
typename DESCRIPTOR,
typename MOMENTA>
201 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
204 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
206 using MomentaF =
typename Forced<MOMENTA>::template type<DESCRIPTOR>;
207 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,Forced<MOMENTA>,EQUILIBRIUM>;
209 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
210 "COLLISION must be parametrized using relaxation frequency OMEGA");
214 && !std::is_same_v<MOMENTA, momenta::IncBulkTuple<momenta::ForcedMomentum<momenta::IncompressibleBulkMomentum>>>;
216 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
221 const V omega = parameters.template get<descriptors::OMEGA>();
222 const auto force = cell.template getField<descriptors::FORCE>();
223 const auto rho = cell.template getField<descriptors::RHO>();
224 const auto gradRho = cell.template getField<descriptors::NABLARHO>();
226 V fTerm[DESCRIPTOR::q], fTermPlus[DESCRIPTOR::q], fTermMinus[DESCRIPTOR::q];
228 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
230 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
234 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
240 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
245 V tau = V{1} / omega;
246 const V tau2 = parameters.template get<collision::ITRT::TAU_MINUS>();
247 const auto nablaRho = cell.template getField<descriptors::NABLARHO>();
249 const V omega2 = V{1} / (tau + ratio * (tau2 - tau));
251 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
252 cell[iPop] += ( V{1} - omega * V{0.5} ) * fTermPlus[iPop]
253 + ( V{1} - omega2 * V{0.5} ) * fTermMinus[iPop];
260 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
266 return "AllenCahnForcing";
269 template <
typename DESCRIPTOR,
typename MOMENTA>
272 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
275 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
277 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
278 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
280 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
281 "COLLISION must be parametrized using relaxation frequency OMEGA");
283 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
285 V phi =
MomentaF().computeRho(cell);
287 const V omega = parameters.template get<descriptors::OMEGA>();
288 const auto force = cell.template getField<descriptors::FORCE>();
289 const auto u = cell.template getField<descriptors::VELOCITY>();
290 const auto source = cell.template getField<descriptors::SOURCE>();
297 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
304 return "WellBalancedCahnHilliardForcing";
307 template <
typename DESCRIPTOR,
typename MOMENTA>
310 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
313 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
315 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
316 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
318 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
319 "COLLISION must be parametrized using relaxation frequency OMEGA");
321 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
323 V phi =
MomentaF().computeRho(cell);
325 const auto source = cell.template getField<descriptors::SOURCE>();
326 const auto u = cell.template getField<descriptors::VELOCITY>();
327 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
329 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
335 cell[iPop] += sourceTerm;
341 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
348 return "KupershtokhForcing";
351 template <
typename DESCRIPTOR,
typename MOMENTA>
354 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
357 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
359 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
361 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
363 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
367 const auto statistic =
CollisionO().apply(cell, parameters);
368 const auto force = cell.template getField<descriptors::FORCE>();
369 V uPlusDeltaU[DESCRIPTOR::d];
370 for (
int iVel=0; iVel < DESCRIPTOR::d; ++iVel) {
371 uPlusDeltaU[iVel] = u[iVel] + force[iVel];
373 V fEq[DESCRIPTOR::q] { };
374 V fEq2[DESCRIPTOR::q] { };
376 EquilibriumF().compute(cell, statistic.rho, uPlusDeltaU, fEq2);
377 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
378 cell[iPop] += fEq2[iPop] - fEq[iPop];
384 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
391 return "WagnerForcing";
394 template <
typename DESCRIPTOR,
typename MOMENTA>
397 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
400 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
402 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
403 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
405 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
406 "COLLISION must be parametrized using relaxation frequency OMEGA");
408 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
410 V rho, u[DESCRIPTOR::d];
411 MomentaF().computeRhoU(cell, rho, u);
413 const V omega = cell.template getField<descriptors::OMEGA>();
414 const auto force = cell.template getField<descriptors::FORCE>();
415 const V d2_rho = cell.template getField<descriptors::SCALAR>();
419 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
421 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
426 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
434 for (
int n = 0; n < DESCRIPTOR::d; ++n) {
435 for (
int m = 0; m < DESCRIPTOR::d; ++m) {
436 int ind = n*DESCRIPTOR::d + m;
438 delta_ij = (n == m) ? 1 : 0;
440 psi_w[ind] = (V(1.)-omega/V(4.))*force[n]*force[m] + omega/V(12.)*( d2_rho )/rho*delta_ij;
451 cell[iPop] += forceTerm;
457 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
464 template <
typename EQUILIBRIUM>
465 struct VelocityShiftedEquilibrium {
466 static std::string getName() {
467 return "ShanChen<" + EQUILIBRIUM::getName() +
">";
470 template <
typename DESCRIPTOR,
typename MOMENTA>
475 template <
typename CELL,
typename RHO,
typename U,
typename FEQ,
typename V=
typename CELL::value_t>
478 for (
int iVel=0; iVel<DESCRIPTOR::d; ++iVel) {
479 uSqr += u[iVel] * u[iVel];
485 template <
typename CELL,
typename PARAMETERS,
typename FEQ,
typename V=
typename CELL::value_t>
487 V rho, u[DESCRIPTOR::d];
488 MomentaF().computeRhoU(cell, rho, u);
489 const auto force = cell.template getFieldPointer<descriptors::FORCE>();
490 for (
int iVel=0; iVel<DESCRIPTOR::d; ++iVel) {
491 u[iVel] += force[iVel] / parameters.template get<descriptors::OMEGA>();
493 return compute(cell, rho, u, fEq);
500 return "ShanChenForcing";
503 template <
typename DESCRIPTOR,
typename MOMENTA>
506 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
507 using combined_equilibrium =
typename VelocityShiftedEquilibrium<EQUILIBRIUM>::template type<DESCRIPTOR,MOMENTA>;
509 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
512 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,VelocityShiftedEquilibrium<EQUILIBRIUM>>;
514 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
516 V rho, u[DESCRIPTOR::d] { };
517 MomentaF().computeRhoU(cell, rho, u);
523 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
529 return "LinearVelocityForcing";
532 template <
typename DESCRIPTOR,
typename MOMENTA>
535 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
538 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
540 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
541 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
543 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
546 MomentaF().computeAllMomenta(cell, rho, u, pi);
547 auto force = cell.template getFieldPointer<descriptors::FORCE>();
548 constexpr int nDim = DESCRIPTOR::d;
553 auto v = cell.template getFieldPointer<descriptors::V12>();
554 for (
int iDim=0; iDim<nDim; ++iDim) {
555 forceSave[iDim] = force[iDim];
556 force[iDim] += v[iDim];
557 for (
int jDim=0; jDim<nDim; ++jDim) {
558 force[iDim] += v[jDim + iDim*nDim + nDim]*u[jDim];
561 for (
int iVel=0; iVel<nDim; ++iVel) {
562 u[iVel] += force[iVel] / V{2.};
565 auto statistics =
CollisionO().apply(cell, parameters);
566 V newOmega = parameters.template get<descriptors::OMEGA>();
569 for (
int iVel=0; iVel<nDim; ++iVel) {
570 force[iVel] = forceSave[iVel];
576 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
583 return "HLBM<Kupershtokh>";
586 template <
typename DESCRIPTOR,
typename MOMENTA>
589 >::template type<DESCRIPTOR>;
591 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
594 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
596 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
598 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
600 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
604 MomentaF().computeRhoU(cell, rho, u);
606 const V porosity = cell.template getField<descriptors::POROSITY>();
607 auto statistic =
CollisionO().apply(cell, parameters);
612 uPlus += (V{1} - porosity)
613 * (cell.template getField<descriptors::VELOCITY>() - u);
615 V fEq[DESCRIPTOR::q] { };
616 V fEq2[DESCRIPTOR::q] { };
618 EquilibriumF().compute(cell, statistic.rho, uPlus, fEq2);
619 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
620 cell[iPop] += fEq2[iPop] - fEq[iPop];
629 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
635 return "ForcedHLBM<Kupershtokh>";
638 template <
typename DESCRIPTOR,
typename MOMENTA>
640 typename MOMENTA::template wrap_momentum<
643 >::template type<DESCRIPTOR>;
645 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
648 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
650 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
652 using CollisionO =
typename COLLISION::template type<DESCRIPTOR,MOMENTA,EQUILIBRIUM>;
654 template <
typename CELL,
typename PARAMETERS,
typename V=
typename CELL::value_t>
659 auto statistic =
CollisionO().apply(cell, parameters);
661 const V porosity = cell.template getField<descriptors::POROSITY>();
662 const auto force = cell.template getField<descriptors::FORCE>();
664 auto fHLBM = (1 - porosity) * (cell.template getField<descriptors::VELOCITY>() - u);
669 V fEq[DESCRIPTOR::q] { };
670 V fEq2[DESCRIPTOR::q] { };
672 EquilibriumF().compute(cell, statistic.rho, uPlus, fEq2);
673 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
674 cell[iPop] += fEq2[iPop] - fEq[iPop];
681 MomentaF().computeRhoU(cell, rho, u);
687 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM,
typename COLLISION>
Dynamics combination rule implementing the forcing scheme by Shan and Chen.
static std::string getName()
typename VelocityShiftedEquilibrium< EQUILIBRIUM >::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename COLLISION::parameters combined_parameters
typename momenta::Forced< MOMENTA >::template type< DESCRIPTOR > combined_momenta
Interface for post-processing steps – header file.
constexpr T invCs2() any_platform
constexpr T t(unsigned iPop, tag::CUM) any_platform
constexpr int c(unsigned iPop, unsigned iDim) any_platform
constexpr int opposite(unsigned iPop) any_platform
auto normSqr(const ARRAY_LIKE &u) any_platform
Compute norm square of a d-dimensional vector.
T norm(const std::vector< T > &a)
l2 norm of a vector of arbitrary length
Top level namespace for all of OpenLB.
Return value of any collision.
typename MOMENTA::template type< DESCRIPTOR > MomentaF
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
Dynamics combination rule implementing the forcing scheme by Guo et al.
static std::string getName()
typename MOMENTA::template type< DESCRIPTOR > combined_momenta
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename COLLISION::parameters combined_parameters
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > combined_momenta
static std::string getName()
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename COLLISION::parameters combined_parameters
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
combined_equilibrium< DESCRIPTOR, MOMENTA, EQUILIBRIUM > EquilibriumF
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
static std::string getName()
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename momenta::Forced< typename MOMENTA::template wrap_momentum< momenta::MovingPorousMomentum > >::template type< DESCRIPTOR > combined_momenta
typename COLLISION::parameters combined_parameters
static constexpr bool is_vectorizable
typename Forced< MOMENTA >::template type< DESCRIPTOR > MomentaF
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, Forced< MOMENTA >, EQUILIBRIUM > CollisionO
Dynamics combination rule implementing the forcing scheme by Guo et al.
static std::string getName()
typename Forced< MOMENTA >::template type< DESCRIPTOR > combined_momenta
typename EQUILIBRIUM::template type< DESCRIPTOR, Forced< MOMENTA > > combined_equilibrium
typename COLLISION::parameters combined_parameters
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
combined_equilibrium< DESCRIPTOR, MOMENTA, EQUILIBRIUM > EquilibriumF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
Homogenized LBM modelling moving porous media.
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename MOMENTA::template wrap_momentum< momenta::MovingPorousMomentum >::template type< DESCRIPTOR > combined_momenta
typename COLLISION::parameters combined_parameters
static std::string getName()
combined_equilibrium< DESCRIPTOR, MOMENTA, EQUILIBRIUM > EquilibriumF
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
Dynamics combination rule implementing the forcing scheme by Kupershtokh et al.
typename momenta::Forced< MOMENTA >::template type< DESCRIPTOR > combined_momenta
typename COLLISION::parameters combined_parameters
static std::string getName()
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename Forced< MOMENTA >::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, Forced< MOMENTA >, EQUILIBRIUM > CollisionO
static constexpr bool is_vectorizable
typename COLLISION::parameters combined_parameters
typename EQUILIBRIUM::template type< DESCRIPTOR, Forced< MOMENTA > > combined_equilibrium
static std::string getName()
typename Forced< MOMENTA >::template type< DESCRIPTOR > combined_momenta
typename Forced< MOMENTA >::template type< DESCRIPTOR > MomentaF
static constexpr bool is_vectorizable
typename COLLISION::template type< DESCRIPTOR, Forced< MOMENTA >, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename Forced< MOMENTA >::template type< DESCRIPTOR > combined_momenta
typename COLLISION::parameters combined_parameters
static std::string getName()
typename EQUILIBRIUM::template type< DESCRIPTOR, Forced< MOMENTA > > combined_equilibrium
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters)
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
static std::string getName()
typename MOMENTA::template type< DESCRIPTOR > combined_momenta
typename COLLISION::parameters combined_parameters
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, Forced< MOMENTA >, EQUILIBRIUM > CollisionO
typename Forced< MOMENTA >::template type< DESCRIPTOR > MomentaF
Dynamics combination rule implementing the forcing scheme by Guo et al. with barycentric velocity.
typename EQUILIBRIUM::template type< DESCRIPTOR, Forced< MOMENTA > > combined_equilibrium
typename COLLISION::parameters combined_parameters
static std::string getName()
typename Forced< MOMENTA >::template type< DESCRIPTOR > combined_momenta
typename MOMENTA::template type< DESCRIPTOR > MomentaF
CellStatistic< V > compute(CELL &cell, PARAMETERS ¶meters, FEQ &fEq) any_platform
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > EquilibriumF
CellStatistic< V > compute(CELL &cell, RHO &rho, U &u, FEQ &fEq) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, VelocityShiftedEquilibrium< EQUILIBRIUM > > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
combined_momenta< DESCRIPTOR, MOMENTA > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
Dynamics combination rule implementing the forcing scheme by A.J. Wagner, Phys. Rev....
typename COLLISION::parameters combined_parameters
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
typename MOMENTA::template type< DESCRIPTOR > combined_momenta
static std::string getName()
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
static std::string getName()
typename COLLISION::parameters combined_parameters
typename MOMENTA::template type< DESCRIPTOR > combined_momenta
typename EQUILIBRIUM::template type< DESCRIPTOR, MOMENTA > combined_equilibrium
static void addAllenCahnForce(CELL &cell, const OMEGA &omega, const FORCE &force) any_platform
Add a force term after BGK collision for constructing local Allen-Cahn-equation from Liang et al....
static void addLiangForce(CELL &cell, const RHO &rho, const NABLARHO &nablarho, const U &u, const OMEGA &omega, const FORCE &force) any_platform
Add a force term after BGK collision for incompressible binary fluid model (Allen-Cahn phase-field) f...
static void addAllenCahnSource(CELL &cell, const OMEGA &omega, const SOURCE &source) any_platform
Add a source term after BGK collision for constructing non-local Allen-Cahn-equation from Liu et al....
static void addExternalForce(CELL &cell, const RHO &rho, const U &u, const OMEGA &omega, const FORCE &force) any_platform
Add a force term after BGK collision.
Momentum of a moving porous medium.
Compute number of elements of a symmetric d-dimensional tensor.