179 using V =
typename CELLS::template value_t<names::Component1>::value_t;
180 using DESCRIPTOR =
typename CELLS::template value_t<names::Component1>::descriptor_t;
183 auto t =
parameters.template get<TEMPERATURE>();
186 auto eps =
parameters.template get<EPSILON>();
193 auto alpha =
parameters.template get<ALPHA>();
200 auto& cell1 = cells.template get<names::Component1>();
201 rhoField[0] = cell1.template getFieldComponent<descriptors::STATISTIC>(0);
206 auto& cell2 = cells.template get<names::Component2>();
207 rhoField[1] = cell2.template getFieldComponent<descriptors::STATISTIC>(0);
212#ifdef THIRD_COMPONENT
213 auto& cell3 = cells.template get<names::Component3>();
214 rhoField[2] = cell3.template getFieldComponent<descriptors::STATISTIC>(0);
219#ifdef FOURTH_COMPONENT
220 auto& cell4 = cells.template get<names::Component4>();
221 rhoField[3] = cell4.template getFieldComponent<descriptors::STATISTIC>(0);
226 for (
unsigned n = 0; n < N_COMPONENTS; ++n) {
227 rhoTot += rhoField[n];
234 V p = POTENTIAL().computeP(rhoField, t, a, b, T_c, m, alpha, g_I, g_II, M);
238 for (
int iPop = 0; iPop < DESCRIPTOR::q; ++iPop) {
240 auto nextCell1 = cell1.neighbor(descriptors::c<DESCRIPTOR>(iPop));
241 rhoField_i[0] = nextCell1.template getFieldComponent<descriptors::STATISTIC>(0);
242 auto nextCell2 = cell2.neighbor(descriptors::c<DESCRIPTOR>(iPop));
243 rhoField_i[1] = nextCell2.template getFieldComponent<descriptors::STATISTIC>(0);
244#ifdef THIRD_COMPONENT
245 auto nextCell3 = cell3.neighbor(descriptors::c<DESCRIPTOR>(iPop));
246 rhoField_i[2] = nextCell3.template getFieldComponent<descriptors::STATISTIC>(0);
248#ifdef FOURTH_COMPONENT
249 auto nextCell4 = cell4.neighbor(descriptors::c<DESCRIPTOR>(iPop));
250 rhoField_i[3] = nextCell4.template getFieldComponent<descriptors::STATISTIC>(0);
253 for (
unsigned n = 0; n < N_COMPONENTS; ++n) {
254 rhoTot_i += rhoField_i[n];
256 V p_i = POTENTIAL().computeP(rhoField_i, t, a, b, T_c, m, alpha, g_I, g_II, M);
258 V phi_i = 6.*(k*p_i - rhoTot_i/3.)/g;
267 totalForce += -g * psi * psi_i * descriptors::c<DESCRIPTOR>(iPop) * descriptors::t<V,DESCRIPTOR>(iPop);
268 for (
int jPop = 0; jPop < DESCRIPTOR::q; ++jPop) {
270 auto nextCell1 = cell1.neighbor(descriptors::c<DESCRIPTOR>(jPop));
271 rhoField_j[0] = nextCell1.template getFieldComponent<descriptors::STATISTIC>(0);
272 auto nextCell2 = cell2.neighbor(descriptors::c<DESCRIPTOR>(jPop));
273 rhoField_j[1] = nextCell2.template getFieldComponent<descriptors::STATISTIC>(0);
274#ifdef THIRD_COMPONENT
275 auto nextCell3 = cell3.neighbor(descriptors::c<DESCRIPTOR>(jPop));
276 rhoField_j[2] = nextCell3.template getFieldComponent<descriptors::STATISTIC>(0);
278#ifdef FOURTH_COMPONENT
279 auto nextCell4 = cell4.neighbor(descriptors::c<DESCRIPTOR>(jPop));
280 rhoField_j[3] = nextCell4.template getFieldComponent<descriptors::STATISTIC>(0);
283 for (
unsigned n = 0; n < N_COMPONENTS; ++n) {
284 rhoTot_j += rhoField_j[n];
286 V p_j = POTENTIAL().computeP(rhoField_j, t, a, b, T_c, m, alpha, g_I, g_II, M);
288 V phi_j = 6.*(k*p_j - (rhoTot_j)/3.)/g;
299 for (
int m = 0; m < DESCRIPTOR::d; ++m) {
302 for (
int n = 0; n < DESCRIPTOR::d; ++n) {
303 C1[n] += descriptors::c<DESCRIPTOR>(jPop)[m] * descriptors::c<DESCRIPTOR>(jPop)[n];
304 C2 += descriptors::c<DESCRIPTOR>(jPop)[n] * descriptors::c<DESCRIPTOR>(jPop)[n] - 1./descriptors::invCs2<V,DESCRIPTOR>();
306 C1[n] -= 1./descriptors::invCs2<V,DESCRIPTOR>();
309 for (
int n = 0; n < DESCRIPTOR::d; ++n) {
310 c1[m] += descriptors::c<DESCRIPTOR>(iPop)[n] * C1[n];
312 c2[m] += descriptors::c<DESCRIPTOR>(iPop)[m] * C2;
314 A_ij = 0.5*g*descriptors::t<V,DESCRIPTOR>(iPop)*descriptors::t<V,DESCRIPTOR>(jPop)*descriptors::invCs2<V,DESCRIPTOR>()*
315 ((3./2.*eps-(sig-1))*c1 + (sig-1)*c2);
316 totalForce += A_ij * psi_i * psi_j;
322 auto externalForce1 = cell1.template getField<descriptors::EXTERNAL_FORCE>();
324 cell1.template setField<descriptors::FORCE>(externalForce1 + chi[0]*totalForce/rhoField[0]);
325 cell1.template setField<descriptors::VELOCITY>(uTot);
327 auto externalForce2 = cell2.template getField<descriptors::EXTERNAL_FORCE>();
328 cell2.template setField<descriptors::FORCE>(externalForce2 + chi[1]*totalForce/rhoField[1]);
329 cell2.template setField<descriptors::VELOCITY>(uTot);
331#ifdef THIRD_COMPONENT
332 auto externalForce3 = cell3.template getField<descriptors::EXTERNAL_FORCE>();
333 cell3.template setField<descriptors::FORCE>(externalForce3 + chi[2]*totalForce/rhoField[2]);
334 cell3.template setField<descriptors::VELOCITY>(uTot);
336#ifdef FOURTH_COMPONENT
337 auto externalForce4 = cell4.template getField<descriptors::EXTERNAL_FORCE>();
338 cell4.template setField<descriptors::FORCE>(externalForce4 + chi[3]*totalForce/rhoField[3]);
339 cell4.template setField<descriptors::VELOCITY>(uTot);
342 cell1.template setField<descriptors::SCALAR>(p);
343 cell2.template setField<descriptors::SCALAR>(psi);