515 {
516 using V = typename CELL::template value_t<names::NavierStokes>::value_t;
517 using DESCRIPTOR = typename CELL::template value_t<names::NavierStokes>::descriptor_t;
518
519 auto& cellNS = cells.template get<names::NavierStokes>();
520 auto& cellAC = cells.template get<names::Component1>();
521
522 V phi = cellAC.template getFieldComponent<descriptors::STATISTIC>(0);
524 V laplacePhi = 0;
525
526 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
530 laplacePhi += 2*(phi_i - phi) * tcs2;
531 }
532
533 auto scale = cellNS.template getField<descriptors::SCALAR>();
536 auto rho_v =
parameters.template get<RHOS>()[0];
537 auto rho_l =
parameters.template get<RHOS>()[1];
538 V rho = rho_v + (rho_l-rho_v)*phi;
539 auto tau_v =
parameters.template get<TAUS>()[0];
540 auto tau_l =
parameters.template get<TAUS>()[1];
541 V tau = (tau_v + (tau_l-tau_v)*phi)*scale + (1-scale)*5.;
542
543
545 V u[DESCRIPTOR::d] {};
546 V k = 1.5*sigma*w;
547 V beta = 12*sigma/w;
548 V mu = 4*beta*phi*(phi-1.)*(phi-0.5)-k*laplacePhi;
549 forceNS += mu*gradPhi;
550 auto externalForce = cellNS.template getField<descriptors::EXTERNAL_FORCE>();
551 cellNS.template setField<descriptors::FORCE>(externalForce + forceNS/rho);
552 cellNS.template setField<descriptors::NABLARHO>((rho_l-rho_v)*gradPhi);
553 cellNS.template setField<descriptors::TAU_EFF>(tau);
554 cellNS.template setField<descriptors::RHO>(rho);
555 cellNS.computeU(u);
556
561 auto velo_switch =
parameters.template get<SWITCH>();
562 V gradPhiSqr = 0;
563 for (int iD=0; iD < DESCRIPTOR::d; ++iD) {
564 gradPhiSqr += gradPhi[iD]*gradPhi[iD];
565 u[iD] *= velo_switch;
566 phiU[iD] = phi*u[iD];
567 }
568 if (gradPhiSqr >= 1e-28) {
570 }
571 old_phiU = cellAC.template getField<descriptors::OLD_PHIU>();
572 cellAC.template setField<descriptors::OLD_PHIU>(phiU);
573 V lambda = 4*phi*(1.-phi)/w;
575 cellAC.template setField<descriptors::FORCE>(forceAC);
576 cellAC.template setField<descriptors::VELOCITY>(u);
577 }
constexpr T invCs2() any_platform
constexpr T t(unsigned iPop, tag::CUM) any_platform
constexpr int c(unsigned iPop, unsigned iDim) any_platform
T scale(std::function< T(const Vector< T, D > &)> sdf, const Vector< T, D > &p, T s, const Vector< T, D > ¢er=(T(0))) any_platform
Function to scale a geometry The object has to be placed in the origin of the coodinate system.
Vector(T &&t, Ts &&... ts) -> Vector< std::remove_cvref_t< T >, 1+sizeof...(Ts)>
meta::list< SIGMA, W, TAUS, RHOS, SWITCH > parameters