25#ifndef DYNAMICS_COLLISION_LES_H
26#define DYNAMICS_COLLISION_LES_H
38 template <
typename T,
typename DESCRIPTOR>
43 template <
typename T,
typename DESCRIPTOR,
typename FIELD>
58template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
60 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
61 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
63 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
66 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
67 const V rho =
MomentaF().computeRho(cell);
68 const V omega = parameters.template get<descriptors::OMEGA>();
69 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
71 V preFactor = smagorinsky*smagorinsky
75 V tauMol = V{1} / omega;
77 V tauTurb = V{0.5} * (
util::sqrt(tauMol*tauMol + preFactor / rho * piNeqNorm) - tauMol);
79 V tauEff = tauMol + tauTurb;
83 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
85 parameters.template set<descriptors::OMEGA>(
91template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
93 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
94 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
96 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
99 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
103 const V rho = cell.template getField<descriptors::RHO>();
104 const auto nablaRho = cell.template getField<descriptors::NABLARHO>();
106 V nablaRhoU = nablaRho[0]*u[0]+nablaRho[1]*u[1];
107 const V omega = parameters.template get<descriptors::OMEGA>();
108 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
110 V preFactor = smagorinsky*smagorinsky
114 V tauMol = V{1} / omega;
116 V tauTurb = V{0.5} * (
util::sqrt(tauMol*tauMol + preFactor / rho * piNeqNorm) - tauMol);
118 V tauEff = tauMol + tauTurb;
119 return V{1} / tauEff;
122 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
124 parameters.template set<descriptors::OMEGA>(
130template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
132 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
133 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
135 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
138 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
139 const V rho =
MomentaF().computeRho(cell);
140 const V omega = parameters.template get<descriptors::OMEGA>();
141 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
143 V preFactor = smagorinsky*smagorinsky
147 V tauMol = V{1} / omega;
149 V tauTurb = V{0.5} * (
util::sqrt(tauMol*tauMol + preFactor / rho * piNeqNorm) - tauMol);
151 V tauEff = tauMol + tauTurb;
152 cell.template setField<descriptors::OMEGA>(V{1} / tauEff);
153 return V{1} / tauEff;
156 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
158 parameters.template set<descriptors::OMEGA>(
164template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
166 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
167 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
171 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
174 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
175 const V rho =
MomentaF().computeRho(cell);
176 const V omega = parameters.template get<descriptors::OMEGA>();
178 V nuT = cell.template getField<descriptors::VISCOSITY>();
182 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
184 V preFactor = smagorinsky*smagorinsky
188 V tauMol = V{1} / omega;
190 V tauTurb = V{0.5} * (
util::sqrt(tauMol*tauMol + preFactor / rho * piNeqNorm) - tauMol);
192 tauEff = tauMol + tauTurb;
194 cell.template setField<descriptors::OMEGA>(V{1} / tauEff);
195 return V{1} / tauEff;
198 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
200 parameters.template set<descriptors::OMEGA>(
206template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
208 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
209 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
211 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
214 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
215 const V rho =
MomentaF().computeRho(cell);
216 const auto iT = parameters.template get<descriptors::LATTICE_TIME>();
217 const V omega = parameters.template get<descriptors::OMEGA>();
218 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
219 V avShear = cell.template getField<descriptors::AV_SHEAR>();
221 V preFactor = smagorinsky*smagorinsky
224 avShear = (avShear*iT + piNeqNorm) / (iT+1);
225 V tauMol = V{1} / omega;
226 V piNeqNormSISM = piNeqNorm - avShear;
227 V tauTurb = V{0.5} * (
util::sqrt(tauMol*tauMol+(preFactor*piNeqNormSISM/rho))-tauMol);
228 V tauEff = tauMol + tauTurb;
229 return V{1} / tauEff;
232 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
234 parameters.template set<descriptors::OMEGA>(
236 const auto iT = parameters.template get<descriptors::LATTICE_TIME>();
238 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
239 V avShear = cell.template getField<descriptors::AV_SHEAR>();
240 avShear = (avShear*iT +
util::sqrt(piNeqNormSqr)) / (iT+1);
241 cell.template setField<descriptors::AV_SHEAR>(avShear);
246template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
248 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
249 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
251 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
256 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
257 const V rho =
MomentaF().computeRho(cell);
258 const V omega = parameters.template get<descriptors::OMEGA>();
259 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
263 V tauMol = V{1} / omega;
265 V Phi = (-0.5*(-rho*tauMol*cs2+
util::sqrt(rho*rho*tauMol*tauMol*cs2*cs2+V{2}*(smagorinsky*smagorinsky)*rho*piNeqNorm))/(smagorinsky*smagorinsky*rho*piNeqNorm));
266 for (
int n=0; n < util::TensorVal<DESCRIPTOR>::n; ++n) {
270 V SNormSqr = S[0]*S[0] + 2.0*S[1]*S[1] + S[2]*S[2];
272 SNormSqr += S[2]*S[2] + S[3]*S[3] + 2.0*S[4]*S[4] + S[5]*S[5];
276 V tauTurb = smagorinsky*smagorinsky*SNorm/cs2;
278 V tauEff = tauMol + tauTurb;
279 return V{1} / tauEff;
282 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
284 parameters.template set<descriptors::OMEGA>(
291template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
293 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
294 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
296 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
301 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
302 const V rho =
MomentaF().computeRho(cell);
303 const V omega = parameters.template get<descriptors::OMEGA>();
304 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
306 V conSmagoR[DESCRIPTOR::q];
308 V tauMol = V{1} / omega;
311 V Phi = (-0.5*(-rho*tauMol*cs2+
util::sqrt(rho*rho*tauMol*tauMol*cs2*cs2+V{2}*(smagorinsky*smagorinsky)*rho*piNeqNorm))/(smagorinsky*smagorinsky*rho*piNeqNorm));
312 for (
int n=0; n < util::TensorVal<DESCRIPTOR>::n; ++n) {
316 V SNormSqr = S[0]*S[0] + 2.0*S[1]*S[1] + S[2]*S[2];
318 SNormSqr += S[2]*S[2] + S[3]*S[3] + 2.0*S[4]*S[4] + S[5]*S[5];
321 V preFactor = smagorinsky*smagorinsky
340 V contractHS = H[0]*S[0] + 2.0*H[1]*S[1] + H[2]*S[2];
342 contractHS += H[2]*S[2] + H[3]*S[3] + 2.0*H[4]*S[4] + H[5]*S[5];
345 conSmagoR[q] = t*preFactor*SNorm*contractHS;
350 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
352 parameters.template set<descriptors::OMEGA>(
358template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
360 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
361 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
363 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
366 MomentaF().computePiNeqNormSqr(cell, piNeqNormSqr);
367 const V omega = parameters.template get<descriptors::OMEGA>();
368 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
369 const auto velocityGradient = cell.template getField<descriptors::VELO_GRAD>();
370 V preFactor = smagorinsky*smagorinsky;
373 for (
unsigned i=0; i < 3; i++) {
374 for (
unsigned j=0; j < 3; j++) {
375 g[i][j] = velocityGradient[i*3 + j];
380 for (
unsigned i = 0; i < 3; i++) {
381 for (
unsigned j = 0; j < 3; j++) {
382 s[i][j] = (g[i][j] + g[j][i]) / V{2};
387 for (
unsigned i = 0; i < 3; i++) {
388 for (
unsigned j = 0; j < 3; j++) {
392 for (
unsigned i = 0; i < 3; i++) {
393 for (
unsigned j = 0; j < 3; j++) {
394 for (
unsigned k = 0; k < 3; k++) {
395 G[i][j] += (g[i][k]*g[k][j] + g[j][k]*g[k][i]) / V{2};
400 for (
unsigned i = 0; i < 3; i++) {
401 trace += V{1}/V{3} * g[i][i] * g[i][i];
403 for (
unsigned i = 0; i < 3; i++) {
408 for (
unsigned i = 0; i < 3; i++) {
409 for (
unsigned j = 0; j < 3; j++) {
410 G_ip = G[i][j] * G[i][j];
415 for (
unsigned i = 0; i < 3; i++) {
416 for (
unsigned j = 0; j < 3; j++) {
417 s_ip = s[i][j] * s[i][j];
430 V tauMol = V{1} / omega;
432 V tauEff = tauMol + tauTurb;
433 return V{1} / tauEff;
436 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
438 parameters.template set<descriptors::OMEGA>(
444template <
typename COLLISION,
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
446 using MomentaF =
typename MOMENTA::template type<DESCRIPTOR>;
447 using CollisionO =
typename COLLISION::template type<DESCRIPTOR, MOMENTA, EQUILIBRIUM>;
449 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
451 V rho, u[DESCRIPTOR::d], fNeq[DESCRIPTOR::q] { };
452 MomentaF().computeRhoU(cell, rho, u);
454 const V omega = parameters.template get<descriptors::OMEGA>();
455 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
456 const V preFactor = smagorinsky*smagorinsky
460 const V tauMol = V{1} / omega;
461 for (
unsigned iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
462 V tauTurb = V{0.5}*(
util::sqrt(tauMol*tauMol + preFactor/rho *
util::fabs(fNeq[iPop])) - tauMol);
463 omegaEff[iPop] = V{1} / (tauMol + tauTurb);
466 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
467 avgOmegaEff += omegaEff[iPop];
469 avgOmegaEff /= DESCRIPTOR::q;
473 template <concepts::Cell CELL, concepts::Parameters PARAMETERS,
typename V=
typename CELL::value_t>
475 V rho, u[DESCRIPTOR::d], fNeq[DESCRIPTOR::q] { };
476 MomentaF().computeRhoU(cell, rho, u);
478 const V omega = parameters.template get<descriptors::OMEGA>();
479 const V smagorinsky = parameters.template get<collision::LES::SMAGORINSKY>();
480 const V preFactor = smagorinsky*smagorinsky
484 const V tauMol = V{1} / omega;
485 for (
unsigned iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
486 V tauTurb = V{0.5}*(
util::sqrt(tauMol*tauMol + preFactor/rho *
util::fabs(fNeq[iPop])) - tauMol);
487 omegaEff[iPop] = V{1} / (tauMol + tauTurb);
489 parameters.template set<typename COLLISION::OMEGA>(omegaEff);
498template <
typename COLLISION>
500 using parameters =
typename COLLISION::parameters::template include<
504 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
505 "COLLISION must be parametrized using relaxation frequency OMEGA");
508 return "SmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
511 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
516template <
typename COLLISION>
518 using parameters =
typename COLLISION::parameters::template include<
522 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
523 "COLLISION must be parametrized using relaxation frequency OMEGA");
526 return "SmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
529 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
533template <
typename COLLISION>
535 using parameters =
typename COLLISION::parameters::template include<
539 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
540 "COLLISION must be parametrized using relaxation frequency OMEGA");
543 return "LocalSmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
546 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
550template <
typename COLLISION>
552 using parameters =
typename COLLISION::parameters::template include<
556 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
557 "COLLISION must be parametrized using relaxation frequency OMEGA");
560 return "LocalVanDriestSmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
563 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
568template <
typename COLLISION>
570 using parameters =
typename COLLISION::parameters::template include<
574 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
575 "COLLISION must be parametrized using relaxation frequency OMEGA");
578 return "ShearSmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
581 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
586template <
typename COLLISION>
588 using parameters =
typename COLLISION::parameters::template include<
592 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
593 "COLLISION must be parametrized using relaxation frequency OMEGA");
596 return "ConStrainSmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
599 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
604template <
typename COLLISION>
606 using parameters =
typename COLLISION::parameters::template include<
610 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
611 "COLLISION must be parametrized using relaxation frequency OMEGA");
614 return "ConSmagorinskyEffectiveOmega<" + COLLISION::getName() +
">";
617 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
622template <
typename COLLISION>
624 using parameters =
typename COLLISION::parameters::template include<
628 static_assert(COLLISION::parameters::template contains<descriptors::OMEGA>(),
629 "COLLISION must be parametrized using relaxation frequency OMEGA");
632 return "WaleEffectiveOmega<" + COLLISION::getName() +
">";
635 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
640template <
typename COLLISION>
642 using parameters =
typename COLLISION::parameters::template include<
647 return "KrauseEffectiveOmega<" + COLLISION::getName() +
">";
650 template <
typename DESCRIPTOR,
typename MOMENTA,
typename EQUILIBRIUM>
constexpr T invCs2() any_platform
constexpr T t(unsigned iPop, tag::CUM) any_platform
constexpr int c(unsigned iPop, unsigned iDim) any_platform
auto normSqr(const ARRAY_LIKE &u) any_platform
Compute norm square of a d-dimensional vector.
Expr pow(Expr base, Expr exp)
Top level namespace for all of OpenLB.
Vector< typename FIELD::template value_type< T >, DESCRIPTOR::template size< FIELD >() > FieldD
Vector storing a single field instance.
Return value of any collision.
Compute dynamics parameter OMEGA locally using Consistent Smagorinsky LES model.
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
Compute dynamics parameter OMEGA locally using Consistent Strain Smagorinsky LES model.
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
Compute dynamics parameter OMEGA locally using Smagorinsky LES model.
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
static std::string getName()
Compute dynamics parameter OMEGA locally using Krause LES model.
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
static constexpr auto isValid(FieldD< T, DESCRIPTOR, FIELD > value)
static constexpr auto getInitialValue()
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
Compute dynamics parameter OMEGA locally using Shear Smagorinsky LES model.
static std::string getName()
typename COLLISION::parameters::template include< descriptors::LATTICE_TIME, descriptors::OMEGA, LES::SMAGORINSKY > parameters
Compute dynamics parameter OMEGA locally using Smagorinsky LES model.
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
Compute dynamics parameter OMEGA locally using WALE.
static std::string getName()
typename COLLISION::parameters::template include< descriptors::OMEGA, LES::SMAGORINSKY > parameters
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
static constexpr bool is_vectorizable
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename MOMENTA::template type< DESCRIPTOR > MomentaF
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
CellStatistic< V > apply(CELL &cell, PARAMETERS ¶meters) any_platform
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
typename MOMENTA::template type< DESCRIPTOR > MomentaF
V computeEffectiveOmega(CELL &cell, PARAMETERS ¶meters) any_platform
Base of a field whose size is defined by [C_0,C_1,C_2]^T * [1,D,Q].
static void computeFneq(CELL &cell, FNEQ &fNeq, const RHO &rho, const U &u) any_platform
Computation of non-equilibrium distribution.
Compute number of elements of a symmetric d-dimensional tensor.