84 for (
int iPop = 0; iPop < DESCRIPTOR::q; ++iPop) {
85 rt[iPop] = DESCRIPTOR::S[iPop];
87 for (
int iPop = 0; iPop < DESCRIPTOR::shearIndexes; ++iPop) {
88 rt[DESCRIPTOR::shearViscIndexes[iPop]] = omega_;
91 T tmp[DESCRIPTOR::q][DESCRIPTOR::q];
93 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
94 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
95 Mt_S_M[iPop][jPop] = T();
96 Mt_S_invMt[iPop][jPop] = T();
97 invM_invMt[iPop][jPop] = T();
98 tmp[iPop][jPop] = T();
102 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
103 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
104 for (
int kPop=0; kPop < DESCRIPTOR::q; ++kPop) {
106 tmp[iPop][jPop] += DESCRIPTOR::M[kPop][iPop]*rt[kPop];
111 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
112 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
113 for (
int kPop=0; kPop < DESCRIPTOR::q; ++kPop) {
114 Mt_S_M[iPop][jPop] += tmp[iPop][kPop]**DESCRIPTOR::M[kPop][jPop];
115 Mt_S_invMt[iPop][jPop] += tmp[iPop][kPop]**DESCRIPTOR::invM[jPop][kPop];
116 invM_invMt[iPop][jPop] += DESCRIPTOR::invM[iPop][kPop]**DESCRIPTOR::invM[jPop][kPop];
121 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
122 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
158 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
159 rho_phi_x += cell[iPop];
163 T* ct = cell[DESCRIPTOR::q+3];
172 auto pop_f = cell.template getFieldPointer<descriptors::F>();
173 auto dJdF = cell.template getFieldPointer<descriptors::DJDF>();
178 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
181 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
182 rho_f += pop_f[iPop];
183 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
184 u_f[iD] += pop_f[iPop]*descriptors::c<DESCRIPTOR>(iPop,iD);
187 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
192 T Meq_phi[DESCRIPTOR::q][DESCRIPTOR::q];
193 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
195 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
196 u_c += u_f[iD]*descriptors::c<DESCRIPTOR>(iPop,iD);
198 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
200 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
201 sum += (u_f[iD]*u_f[iD] + 2.*descriptors::c<DESCRIPTOR>(jPop,iD)*(descriptors::c<DESCRIPTOR>(iPop,iD)-u_f[iD]))*descriptors::invCs2<T,DESCRIPTOR>()*0.5+(u_c*descriptors::c<DESCRIPTOR>(iPop,iD)*(2.*descriptors::c<DESCRIPTOR>(jPop,iD)-u_f[iD]))*descriptors::invCs2<T,DESCRIPTOR>()*descriptors::invCs2<T,DESCRIPTOR>()*0.5;
203 Meq_phi[iPop][jPop] = descriptors::t<T,DESCRIPTOR>(iPop)*(1.+sum);
208 auto force = cell.template getFieldPointer<descriptors::FORCE>();
209 T F1_phi[DESCRIPTOR::q][DESCRIPTOR::q];
210 T F2_phi[DESCRIPTOR::q][DESCRIPTOR::q];
211 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
213 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
214 f_c += force[iD]*descriptors::c<DESCRIPTOR>(iPop,iD);
216 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
218 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
219 sum += (f_c*descriptors::c<DESCRIPTOR>(iPop,iD)-force[iD]/(T)descriptors::invCs2<T,DESCRIPTOR>())*descriptors::c<DESCRIPTOR>(jPop,iD);
221 F1_phi[iPop][jPop] = descriptors::t<T,DESCRIPTOR>(iPop)*descriptors::invCs2<T,DESCRIPTOR>()*f_c;
222 F2_phi[iPop][jPop] = descriptors::t<T,DESCRIPTOR>(iPop)*descriptors::invCs2<T,DESCRIPTOR>()*descriptors::invCs2<T,DESCRIPTOR>()*sum;
228 T dualMRTcollision[DESCRIPTOR::q];
229 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
230 dualMRTcollision[iPop] = T();
231 for (
int jPop=0; jPop < DESCRIPTOR::q; ++jPop) {
236 dualMRTcollision[iPop] += (I - (I - Meq_phi[jPop][iPop])*Mt_S_invMt[iPop][iPop] + F1_phi[jPop][iPop] + F2_phi[jPop][iPop]*(1. - 0.5*Mt_S_invMt[iPop][iPop]))*cell[jPop];
242 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
243 cell[iPop] = dualMRTcollision[iPop] + dJdF[iPop];
248 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
249 phi2 += cell[iPop]*cell[iPop];