131 {
132 V u[DESCRIPTOR::d];
134 const auto velDenominator = cell.template getField<descriptors::VELOCITY_DENOMINATOR>();
135 const auto statistic =
CollisionO().apply(cell, parameters);
136 const auto force = cell.template getField<descriptors::FORCE>();
137 V uPlusDeltaU[DESCRIPTOR::d];
138 for (int iVel=0; iVel < DESCRIPTOR::d; ++iVel) {
139 uPlusDeltaU[iVel] = u[iVel] + force[iVel];
140 }
141 if (velDenominator > std::numeric_limits<V>::epsilon()) {
143 if constexpr (!isStatic) {
144
145 cell.template setField<descriptors::POROSITY>(1.);
146 cell.template setField<descriptors::VELOCITY_DENOMINATOR>(0.);
147 cell.template setField<descriptors::VELOCITY_NUMERATOR>({0.,0.,0.});
148 }
149 }
150 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
151 cell[iPop] +=
EquilibriumF().compute(iPop, statistic.rho, uPlusDeltaU)
153 }
154
155
156 if constexpr (DESCRIPTOR::template provides<descriptors::CONTACT_DETECTION>()) {
157 cell.template setField<descriptors::CONTACT_DETECTION>(0);
158 }
159
160 return statistic;
161 };
void calculate(CELL &cell, VELOCITY &u)
typename COLLISION::template type< DESCRIPTOR, MOMENTA, EQUILIBRIUM > CollisionO
combined_equilibrium< DESCRIPTOR, MOMENTA, EQUILIBRIUM > EquilibriumF
typename MOMENTA::template type< DESCRIPTOR > MomentaF